From 9eb1a9ef9b3ff2f29c37cdc113fe4f119dd78ed6 Mon Sep 17 00:00:00 2001 From: javad Date: Wed, 10 Jun 2026 21:16:30 +0330 Subject: [PATCH] add: akharin mojodi --- admin_panel/templates/admin_panel/store.html | 168 +++++++++---------- admin_panel/views.py | 63 +++++-- 2 files changed, 129 insertions(+), 102 deletions(-) diff --git a/admin_panel/templates/admin_panel/store.html b/admin_panel/templates/admin_panel/store.html index c280e23..aee84d4 100644 --- a/admin_panel/templates/admin_panel/store.html +++ b/admin_panel/templates/admin_panel/store.html @@ -3,46 +3,45 @@ {% load static %} {% block storeBody %} -

{{ storeO.store_name }}

+

{{ storeO.store_name }}

+
{% csrf_token %} -
-
- -
-
- -
-
-
- +
+
+
-
-
-
-
- +
+
+
+ +
+
-
- +
+
+ +
+
+ - + لغو جستجو و مشاهده همه
- +
- + @@ -56,33 +55,28 @@ {% for prd in productSum %} - + + + - - - - - {% endfor %} @@ -97,25 +91,21 @@ - +
+ + +
- {% endblock %} \ No newline at end of file diff --git a/admin_panel/views.py b/admin_panel/views.py index 221cece..59ecc2a 100644 --- a/admin_panel/views.py +++ b/admin_panel/views.py @@ -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/')
نام محصول قیمت موجودیعملیاتعملیات
+ {{ prd.product_name }} - + + {{ prd.product_price }}{{ prd.mojodi }} + {% if perms.admin_panel.ViewStore %} + + ویرایش + + + + حذف + + + + تراکنش جدید + + {% endif %} {{ prd.product_price }} {{ prd.mojodi }} - - {% if perms.admin_panel.ViewStore %} - - - - - - - - - - {% endif %} - - - - -