add: akharin mojodi

This commit is contained in:
javad committed 2026-06-10 21:16:30 +03:30
1 parent 3b26ee3f93
commit 9eb1a9ef9b
2 files changed
+129 -102

No files matched your search

+48 -15
View File
@@ -1,4 +1,4 @@
from django.shortcuts import redirect, render
from django.shortcuts import redirect, render, get_object_or_404
from django.urls.base import reverse
from persiantools.jdatetime import JalaliDate
from persiantools import characters, digits
@@ -13,9 +13,8 @@ from django.db.models import Count, Sum
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.shortcuts import get_object_or_404
from django.db.models import Q
from django.db.models.functions import Coalesce
from django.db.models import Q, OuterRef, Subquery, Exists
from .models import *
@@ -578,20 +577,54 @@ def store(request, s_id):
productCategory = ProductCategory.objects.all()
storeO = StoreRoom.objects.get(id=s_id)
searchStatus = False
searchQS = request.POST.get('searchQS', '')
# استفاده از .strip() برای پاک‌سازی فضاهای خالی احتمالی
searchQS = request.POST.get('searchQS', '').strip()
mojodi = request.POST.get('mojodi', '')
#return HttpResponse(mojodi)
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') ))
if mojodi == "0":
productSum = productSum.filter(mojodi__lte=0)
# ۱. ساب‌کوئری برای دریافت آخرین موجودی در لحظه تراکنش
# اضافه کردن '-id' به عنوان کلید دوم برای مواقعی که زمان‌ها دقیقاً برابرند
latest_stock_subquery = ProductInStore.objects.filter(
StoreRoom=storeO,
Product=OuterRef('pk'),
year=1400
).order_by('-createdDT', '-id').values('current_stock_at_time')[:1]
# ۲. کوئری اصلی بهینه‌سازی شده با Exists (بدون JOIN سنگین و بدون نیاز به distinct)
products_qs = Product.objects.filter(
Exists(
ProductInStore.objects.filter(
StoreRoom=storeO,
Product=OuterRef('pk'),
year=1400
)
)
).annotate(
# اگر ساب‌کوئری NULL بود، به صورت پیش‌فرض مقدار 0 قرار داده می‌شود
mojodi=Coalesce(Subquery(latest_stock_subquery), 0)
)
# ۳. اعمال فیلتر جستجوی نام محصول
if searchQS != '':
productSum = products_qs.filter(product_name__contains=searchQS)
searchStatus = True
else:
productSum = Product.objects.filter(productinstore__StoreRoom=storeO ,productinstore__year=1400).annotate(mojodi=( Sum('productinstore__s_in') - Sum('productinstore__s_out') ))
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}
productSum = products_qs
# ۴. فیلتر وضعیت موجودی (حالا با خیال راحت روی عدد 0 فیلتر می‌شود)
if mojodi == "0":
productSum = productSum.filter(mojodi__lte=0)
searchStatus = True
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)
@login_required(login_url='/panel/p_login/')