diff --git a/admin_panel/views.py b/admin_panel/views.py index f5af640..2ac2cda 100644 --- a/admin_panel/views.py +++ b/admin_panel/views.py @@ -9,11 +9,11 @@ from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponse from django.urls import reverse from django.http import Http404, HttpResponseRedirect -from django.db.models import Count, Sum +from django.db.models import Count, Sum, Subquery, OuterRef, Value from django.contrib.auth.models import Permission, User from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required, permission_required - +from django.db.models.functions import Coalesce from django.shortcuts import get_object_or_404 from django.db.models import Q @@ -581,16 +581,33 @@ def store(request, s_id): searchQS = request.POST.get('searchQS', '') mojodi = request.POST.get('mojodi', '') #return HttpResponse(mojodi 2) + + # تعریف ساب‌کوئری کاملاً مستقل برای واکشی فیلد لحظه‌ای از آخرین تراکنش انبار + latest_stock_subquery = ProductInStore.objects.filter( + Product=OuterRef('pk'), + StoreRoom=storeO, + year=1400 + ).order_by('-createdDT', '-id').values('current_stock_at_time')[:1] + if searchQS !='': - productSum = Product.objects.filter(productinstore__StoreRoom=storeO ,productinstore__year=1400,product_name__contains=searchQS).annotate(mojodi=( Sum('productinstore__s_in') - Sum('productinstore__s_out') )) + # محاسبات Sum شما دقیقاً حفظ شده و فیلد جدید به انتهای annotate اضافه شده است + productSum = Product.objects.filter(productinstore__StoreRoom=storeO ,productinstore__year=1400,product_name__contains=searchQS).annotate( + mojodi=( Sum('productinstore__s_in') - Sum('productinstore__s_out') ), + current_stock_at_time=Coalesce(Subquery(latest_stock_subquery), Value(0)) # فیلد مستقل جدید + ) if mojodi == "0": productSum = productSum.filter(mojodi__lte=0) searchStatus = True else: - productSum = Product.objects.filter(productinstore__StoreRoom=storeO ,productinstore__year=1400).annotate(mojodi=( Sum('productinstore__s_in') - Sum('productinstore__s_out') )) + # محاسبات Sum شما دقیقاً حفظ شده و فیلد جدید به انتهای annotate اضافه شده است + productSum = Product.objects.filter(productinstore__StoreRoom=storeO ,productinstore__year=1400).annotate( + mojodi=( Sum('productinstore__s_in') - Sum('productinstore__s_out') ), + current_stock_at_time=Coalesce(Subquery(latest_stock_subquery), Value(0)) # فیلد مستقل جدید + ) if mojodi == "0": searchStatus = True productSum = productSum.filter(mojodi__lte=0) + data = {'storeO': storeO,'productSum': productSum, 's_id': s_id, 'searchStatus': searchStatus, "mojodi": mojodi, 'djsearchQS':searchQS, 'productCategory': productCategory} return render(request, 'admin_panel/store.html', data)