691 lines
35 KiB
Python
691 lines
35 KiB
Python
|
|
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)
|