add name kala anbar
This commit is contained in:
1 parent
7a305b8e19
commit
767e84cbcf
2 files changed
+24
-16
No files matched your search
@@ -8,6 +8,13 @@
|
||||
|
||||
<form method="GET" class="columns is-multiline is-centered is-vcentered">
|
||||
|
||||
<div class="column is-2-desktop is-12-mobile">
|
||||
<label class="label is-small">نام کالا (بخشی از نام)</label>
|
||||
<div class="control">
|
||||
<input type="text" name="product_name" class="input is-small" placeholder="مثلاً: لوله، فیلتر..." value="{{ filters.product_name }}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-2-desktop is-12-mobile">
|
||||
<label class="label is-small">نوع تراکنش کالا</label>
|
||||
<div class="select is-fullwidth is-small">
|
||||
@@ -50,13 +57,13 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="column is-2-desktop is-6-mobile">
|
||||
<div class="column is-1-desktop is-6-mobile">
|
||||
<label class="label is-small">از تاریخ</label>
|
||||
<input type="text" class="input is-small date-picker-az pwt-datepicker-input-element" placeholder="انتخاب کنید">
|
||||
<input type="hidden" name="azTarikh" id="azTarikhAlt" value="{{ filters.azTarikh }}">
|
||||
</div>
|
||||
|
||||
<div class="column is-2-desktop is-6-mobile">
|
||||
<div class="column is-1-desktop is-6-mobile">
|
||||
<label class="label is-small">تا تاریخ</label>
|
||||
<input type="text" class="input is-small date-picker-ta pwt-datepicker-input-element" placeholder="انتخاب کنید">
|
||||
<input type="hidden" name="taTarikh" id="taTarikhAlt" value="{{ filters.taTarikh }}">
|
||||
@@ -153,11 +160,11 @@
|
||||
{% if page_obj.has_other_pages %}
|
||||
<nav class="pagination is-centered is-small my-4" role="navigation" aria-label="pagination">
|
||||
{% if page_obj.has_previous %}
|
||||
<a class="pagination-previous" href="?page={{ page_obj.previous_page_number }}&movement_type={{ filters.movement_type }}&user_id={{ filters.user_id }}&store_id={{ filters.store_id }}&azTarikh={{ filters.azTarikh }}&taTarikh={{ filters.taTarikh }}">صفحه قبل</a>
|
||||
<a class="pagination-previous" href="?page={{ page_obj.previous_page_number }}&product_name={{ filters.product_name }}&movement_type={{ filters.movement_type }}&user_id={{ filters.user_id }}&store_id={{ filters.store_id }}&azTarikh={{ filters.azTarikh }}&taTarikh={{ filters.taTarikh }}">صفحه قبل</a>
|
||||
{% endif %}
|
||||
|
||||
{% if page_obj.has_next %}
|
||||
<a class="pagination-next" href="?page={{ page_obj.next_page_number }}&movement_type={{ filters.movement_type }}&user_id={{ filters.user_id }}&store_id={{ filters.store_id }}&azTarikh={{ filters.azTarikh }}&taTarikh={{ filters.taTarikh }}">صفحه بعد</a>
|
||||
<a class="pagination-next" href="?page={{ page_obj.next_page_number }}&product_name={{ filters.product_name }}&movement_type={{ filters.movement_type }}&user_id={{ filters.user_id }}&store_id={{ filters.store_id }}&azTarikh={{ filters.azTarikh }}&taTarikh={{ filters.taTarikh }}">صفحه بعد</a>
|
||||
{% endif %}
|
||||
|
||||
<ul class="pagination-list">
|
||||
@@ -172,7 +179,6 @@
|
||||
{% block jsEnd %}
|
||||
<script>
|
||||
$(document).ready(function() {
|
||||
// تنظیم تقویم شمسی برای تاریخ شروع
|
||||
var pickerAz = $(".date-picker-az").pDatepicker({
|
||||
altField: '#azTarikhAlt',
|
||||
initialValue: false,
|
||||
@@ -181,7 +187,6 @@
|
||||
calendar: { persian: { locale: 'fa' } }
|
||||
});
|
||||
|
||||
// تنظیم تقویم شمسی برای تاریخ پایان
|
||||
var pickerTa = $(".date-picker-ta").pDatepicker({
|
||||
altField: '#taTarikhAlt',
|
||||
initialValue: false,
|
||||
@@ -190,7 +195,6 @@
|
||||
calendar: { persian: { locale: 'fa' } }
|
||||
});
|
||||
|
||||
// لود کردن تاریخهای قبلی در صورت فیلتر بودن صفحه
|
||||
{% if filters.azTarikh %}
|
||||
pickerAz.setDate({{ filters.azTarikh }});
|
||||
{% endif %}
|
||||
|
||||
+13
-9
@@ -188,10 +188,9 @@ def report(request):
|
||||
@permission_required('admin_panel.ViewReportMali', raise_exception=True)
|
||||
def inventory_movements_report(request):
|
||||
"""
|
||||
گزارش جامع گردش و خروج کالا از انبار به تفکیک نوع تراکنش (گارانتی، اشانتیون، فروش و...)،
|
||||
کاربر ثبتکننده، انبار و بازه زمانی شمسی.
|
||||
گزارش جامع گردش و خروج کالا از انبار به همراه فیلتر متنی نام کالا،
|
||||
نوع تراکنش، کاربر، انبار و بازه زمانی شمسی.
|
||||
"""
|
||||
# واکشی اطلاعات اولیه برای 드롭داونهای فیلتر در قالب
|
||||
all_users = User.objects.all().order_by('first_name')
|
||||
all_stores = StoreRoom.objects.all()
|
||||
movement_choices = ProductInStore.MovementType.choices
|
||||
@@ -200,26 +199,30 @@ def inventory_movements_report(request):
|
||||
selected_type = request.GET.get('movement_type', '')
|
||||
selected_user = request.GET.get('user_id', '')
|
||||
selected_store = request.GET.get('store_id', '')
|
||||
selected_product_name = request.GET.get('product_name', '').strip() # فیلد جدید جستجوی نام کالا
|
||||
az_tarikh = request.GET.get('azTarikh', '')
|
||||
ta_tarikh = request.GET.get('taTarikh', '')
|
||||
|
||||
# ۱. کوئری پایه: اعمال select_related جهت جلوگیری از فاجعه N+1 در پایگاه داده
|
||||
# ۱. کوئری پایه بهینه
|
||||
movements_list = ProductInStore.objects.select_related(
|
||||
'Product', 'StoreRoom', 'factor__customer', 'factor__user'
|
||||
).filter(year=1400).order_by('-createdDT')
|
||||
|
||||
# ۲. اعمال فیلترهای پویای کاربر
|
||||
# ۲. اعمال فیلترهای پویا
|
||||
if selected_type:
|
||||
movements_list = movements_list.filter(movement_type=selected_type)
|
||||
|
||||
if selected_user:
|
||||
# فیلتر بر اساس کاربری که فاکتور خروج کالا را در سیستم ثبت کرده است
|
||||
movements_list = movements_list.filter(factor__user__id=_safe_int(selected_user))
|
||||
|
||||
if selected_store:
|
||||
movements_list = movements_list.filter(StoreRoom__id=_safe_int(selected_store))
|
||||
|
||||
# ۳. پردازش بازه زمانی (تبدیل تایماستمپ جاوااسکریپت به تاریخ میلادی)
|
||||
if selected_product_name:
|
||||
# فیلتر متنی حساس نبودن به حروف بزرگ و کوچک (Case-Insensitive Contains)
|
||||
movements_list = movements_list.filter(Product__product_name__icontains=selected_product_name)
|
||||
|
||||
# ۳. پردازش بازه زمانی
|
||||
if az_tarikh:
|
||||
try:
|
||||
az_dt = datetime.datetime.fromtimestamp(int(az_tarikh) / 1000.0)
|
||||
@@ -234,13 +237,13 @@ def inventory_movements_report(request):
|
||||
except (ValueError, TypeError):
|
||||
pass
|
||||
|
||||
# ۴. محاسبه آماری سریع روی نتایج فیلتر شده (بدون نیاز به پایش دستی در پایتون)
|
||||
# ۴. محاسبه آماری سریع دیتابیس روی نتایج فیلتر شده
|
||||
summary_stats = movements_list.aggregate(
|
||||
total_out_qty=Sum('s_out'),
|
||||
total_in_qty=Sum('s_in')
|
||||
)
|
||||
|
||||
# ۵. صفحهبندی نتایج (۵۰ رکورد در هر صفحه جهت حفظ سرعت لود مرورگر)
|
||||
# ۵. صفحهبندی نتایج
|
||||
paginator = Paginator(movements_list, 50)
|
||||
page_number = request.GET.get('page')
|
||||
page_obj = paginator.get_page(page_number)
|
||||
@@ -255,6 +258,7 @@ def inventory_movements_report(request):
|
||||
'movement_type': selected_type,
|
||||
'user_id': _safe_int(selected_user) if selected_user else '',
|
||||
'store_id': _safe_int(selected_store) if selected_store else '',
|
||||
'product_name': selected_product_name, # ارسال فیلد جدید به قالب برای حفظ مقدار ورودی
|
||||
'azTarikh': az_tarikh,
|
||||
'taTarikh': ta_tarikh,
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user