diff --git a/admin_panel/templates/admin_panel/customerBaseNew.html b/admin_panel/templates/admin_panel/customerBaseNew.html index 3791d18..d3999ac 100644 --- a/admin_panel/templates/admin_panel/customerBaseNew.html +++ b/admin_panel/templates/admin_panel/customerBaseNew.html @@ -246,10 +246,14 @@ - //دکمه ثبت فاکتور +//دکمه ثبت فاکتور $("#submitFactor").click(function(){ - //$("#disablePage").addClass("is-active"); + // اگر دکمه قبلاً غیرفعال شده باشد، دیگر کاری انجام ندهد + if ($(this).hasClass("is-loading")) { + return false; + } + $("#prdsList").val(JSON.stringify(orderList)); $("#sarResidDate").val( $("#sarResidDateSL").val() ) $("#payType").val( $("#FpayType").val() ) @@ -296,33 +300,34 @@ } }) - //console.log(sumPardakhti) - - - - //sumPardakhti += int(paylist['l_naghd']) - //sumPardakhti += int(paylist['l_kartKhan']) - //sumPardakhti += int(paylist['l_kartbekart']) - //sumPardakhti += int(paylist['l_checkPrice']) - //sumPardakhti += int(paylist['l_nesiye']) - - if(nesiyeOk && checkOk && !Object.values(paylist).every(o => o === null) ){ if(sumPardakhti==sumALL_factor){ - //alert("ok") + + // --- تغییرات اصلی برای جلوگیری از کلیک مجدد اینجاست --- + + var $btn = $("#submitFactor"); + + // 1. اضافه کردن کلاس لودینگ Bulma و غیرفعال کردن دکمه + $btn.addClass("is-loading").prop("disabled", true).css("pointer-events", "none"); + + // 2. فعال کردن لایه تاریک روی صفحه که خودتان ساخته بودید (از کامنت خارج شد) + $("#disablePage").addClass("is-active"); + + // 3. ارسال فرم $("#subFactor").submit(); + + // -------------------------------------------------------- + }else{ console.log(sumPardakhti, " ", sumALL_factor) alert("جمع فاکتور با مبالغ پرداختی همخوانی ندارد") } - // }else{ alert("لطفا فرم را کنترل کنید") } }); //پایان دکمه ثبت فاکتور - $("#categoryS").change(function(){ var cat_id = $(this).val(); diff --git a/admin_panel/templates/admin_panel/customerIDFactor.html b/admin_panel/templates/admin_panel/customerIDFactor.html index 7f942f0..7f7e9f3 100644 --- a/admin_panel/templates/admin_panel/customerIDFactor.html +++ b/admin_panel/templates/admin_panel/customerIDFactor.html @@ -3,30 +3,251 @@ {% load static %} {% block BodyCustomer1 %} -
- +
+ +
+

مدیریت فاکتورهای مشتری

+ + + ایجاد فاکتور جدید + +
- {% for factor in factorha %} - -
+
+
+ +
+
+
+ +
+
+
-
- {{ factor.create_date | toJalali }} +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
-
- {{ factor.user.first_name }} {{ factor.user.last_name }} + + + {% if search_query or az_tarikh or ta_tarikh or filter_status != 'all' or filter_type != 'all' %} + + {% endif %} + +
+ + + + + + + + + + + + + + + + + {% if factorha %} + {% for factor in factorha %} + + + + + + + + + + + + + + + + + + + + + + + + {% endfor %} + {% else %} + + + + {% endif %} + +
شمارهنوع فاکتورتاریخ ثبتسررسیدمبلغ (تومان)نوع پرداختتوضیحات / بابتکاربر ثبت کنندهوضعیتعملیات
{{ factor.id }} + {% if factor.FactorType == 'Nasb' %}نصب + {% elif factor.FactorType == 'Khadamat' %}خدمات + {% elif factor.FactorType == 'Garranty' %}گارانتی + {% else %}{{ factor.FactorType }}{% endif %} + {{ factor.create_date | toJalali }} + {% if factor.deadline %} + {{ factor.deadline | toJalali }} + {% else %} + — + {% endif %} + {{ factor.amount }} + {% if factor.PayType == 'naghd' %}نقدی + {% elif factor.PayType == 'cardToCard' %}کارت به کارت + {% elif factor.PayType == 'kartKhan' %}کارت‌خوان + {% elif factor.PayType == 'nesiye' %}نسیه + {% elif factor.PayType == 'check' %}چک + {% else %}{{ factor.PayType }}{% endif %} + + {{ factor.desc | default:"—" }} + {{ factor.user.first_name }} {{ factor.user.last_name }} + {% if not factor.is_active %} + باطل شده + {% else %} + {% if factor.pay_status == 'paid' %} + پرداخت شده + {% elif factor.pay_status == 'unpaid' %} + معوق / مانده + {% elif factor.pay_status == 'cancell' %} + لغو شده + {% else %} + {{ factor.pay_status }} + {% endif %} + {% endif %} + + + مشاهده + +
+ هیچ فاکتوری با فیلترهای مشخص شده یافت نشد. +
- - {% endfor %}
+ + {% endblock %} - {% block BodyCustomer2 %} +{% endblock %} +{% block jsEnd %} +{{ block.super }} + {% endblock %} \ No newline at end of file diff --git a/admin_panel/views.py b/admin_panel/views.py index ea39851..95e9834 100644 --- a/admin_panel/views.py +++ b/admin_panel/views.py @@ -693,14 +693,68 @@ def customerNew2(request ,c_id): @login_required(login_url='/panel/p_login/') -def customerFactors(request ,c_id): - customer = Customer.objects.get(id=c_id) +def customerFactors(request, c_id): + customer = get_object_or_404(Customer, id=c_id) categorys = ProductCategory.objects.all() - factorha = Factor.objects.filter(customer__id = c_id).order_by('-create_date') - #all_prd = serializers.serialize("json", all_prda) - #return JsonResponse(all_prd,safe = False) + + # کوئری پایه برای دریافت همه فاکتورهای این مشتری + factor_qs = Factor.objects.filter(customer=customer) + + # دریافت پارامترهای فیلتر و جستجو از آدرس URL + search_query = request.GET.get('search_factor', '').strip() + filter_status = request.GET.get('status', 'all') + filter_type = request.GET.get('type', 'all') + az_tarikh = request.GET.get('az_tarikh', '').strip() + ta_tarikh = request.GET.get('ta_tarikh', '').strip() + + # ۱. اعمال فیلتر جستجو (شناسه فاکتور یا متن توضیحات) + if search_query: + if search_query.isdigit(): + factor_qs = factor_qs.filter(models.Q(id=int(search_query)) | models.Q(desc__icontains=search_query)) + else: + factor_qs = factor_qs.filter(models.Q(desc__icontains=search_query)) + + # ۲. اعمال فیلتر وضعیت پرداخت و حذف نرم + if filter_status != 'all': + if filter_status == 'deleted': + factor_qs = factor_qs.filter(is_active=False) + else: + factor_qs = factor_qs.filter(pay_status=filter_status, is_active=True) + + # ۳. اعمال فیلتر نوع فاکتور (نصب، خدمات، گارانتی) + if filter_type != 'all': + factor_qs = factor_qs.filter(FactorType=filter_type) + + # ۴. اعمال فیلتر تاریخ شروع (از تاریخ) + if az_tarikh: + az_gregorian = _parse_jalali_date(az_tarikh) + if az_gregorian: + az_datetime = datetime.datetime.combine(az_gregorian, datetime.time.min) + factor_qs = factor_qs.filter(create_date__gte=az_datetime) + + # ۵. اعمال فیلتر تاریخ پایان (تا تاریخ) + if ta_tarikh: + ta_gregorian = _parse_jalali_date(ta_tarikh) + if ta_gregorian: + ta_datetime = datetime.datetime.combine(ta_gregorian, datetime.time.max) + factor_qs = factor_qs.filter(create_date__lte=ta_datetime) + + # مرتب‌سازی بر اساس آخرین تاریخ ایجاد + factorha = factor_qs.order_by('-create_date') + dateNow = datetime.datetime.now().date - data = {'customer': customer, 'categorys': categorys, 'dateNow': dateNow, 'factorha': factorha} + + data = { + 'customer': customer, + 'categorys': categorys, + 'dateNow': dateNow, + 'factorha': factorha, + 'search_query': search_query, + 'filter_status': filter_status, + 'filter_type': filter_type, + 'az_tarikh': az_tarikh, + 'ta_tarikh': ta_tarikh + } return render(request, 'admin_panel/customerIDFactor.html', data) @login_required(login_url='/panel/p_login/')