From 9592c00565a89e53e8b8268e5fa91f1f8dd33b04 Mon Sep 17 00:00:00 2001 From: aminhashemi92 Date: Tue, 9 Sep 2025 15:59:41 +0330 Subject: [PATCH] fix final payment step. --- db.sqlite3 | Bin 2940928 -> 3088384 bytes .../invoices/final_invoice_print.html | 251 ++++++++++++++---- .../invoices/final_invoice_step.html | 31 ++- .../invoices/final_settlement_step.html | 30 ++- invoices/urls.py | 1 - invoices/views.py | 72 ++++- 6 files changed, 305 insertions(+), 80 deletions(-) diff --git a/db.sqlite3 b/db.sqlite3 index 2f70da4f778ed3d7877c0fde5d64adb2f7aaebbc..1bba24daf5d5ee25fb7162099b11379bebd678bd 100644 GIT binary patch delta 99666 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 delta 12752 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 + + + + + فاکتور نهایی {{ invoice.name }} - {{ instance.code }} + + {% load static %} + {% load humanize %} -{% block content %} -
-
-
-

فاکتور نهایی

- کد درخواست: {{ instance.code }} + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+
+ {% if instance.broker.company and instance.broker.company.logo %} + لوگو + {% else %} + + {% endif %} +
+
+ {% if instance.broker.company %} + {{ instance.broker.company.name }} + {% endif %} + {% if instance.broker.company %} +
+ {% if instance.broker.company.address %} +
{{ instance.broker.company.address }}
+ {% endif %} + {% if instance.broker.affairs.county.city.name %} +
{{ instance.broker.affairs.county.city.name }}، ایران
+ {% endif %} + {% if instance.broker.company.phone %} +
تلفن: {{ instance.broker.company.phone }}
+ {% endif %} +
+ {% endif %} +
+
+
+
+
#فاکتور نهایی {{ instance.code }}
+
تاریخ صدور: {{ invoice.jcreated_date }}
+
+
+
-
- -
لوگو
+ + +
+
+
اطلاعات مشترک
+
نام: {{ invoice.customer.get_full_name|default:instance.representative.get_full_name }}
+ {% if instance.representative.profile and instance.representative.profile.national_code %} +
کد ملی: {{ instance.representative.profile.national_code }}
+ {% endif %} + {% if instance.representative.profile and instance.representative.profile.phone_number_1 %} +
تلفن: {{ instance.representative.profile.phone_number_1 }}
+ {% endif %} + {% if instance.representative.profile and instance.representative.profile.address %} +
آدرس: {{ instance.representative.profile.address }}
+ {% endif %} +
+
+
اطلاعات چاه
+
شماره اشتراک آب: {{ instance.well.water_subscription_number }}
+
شماره اشتراک برق: {{ instance.well.electricity_subscription_number|default:"-" }}
+
سریال کنتور: {{ instance.well.water_meter_serial_number|default:"-" }}
+
قدرت چاه: {{ instance.well.well_power|default:"-" }}
+
-
-
- - - - - - - - - - - {% for it in items %} - - - - - - - {% empty %} - - {% endfor %} - - - - - - - - -
آیتمتعدادقیمت واحدقیمت کل
{{ it.item.name }}{{ it.quantity }}{{ it.unit_price|floatformat:0|intcomma:False }}{{ it.total_price|floatformat:0|intcomma:False }}
آیتمی ندارد
مبلغ کل{{ invoice.total_amount|floatformat:0|intcomma:False }}
تخفیف{{ invoice.discount_amount|floatformat:0|intcomma:False }}
مبلغ نهایی{{ invoice.final_amount|floatformat:0|intcomma:False }}
پرداختی‌ها{{ invoice.paid_amount|floatformat:0|intcomma:False }}
مانده{{ invoice.remaining_amount|floatformat:0|intcomma:False }}
-
-
-
امضا مشتری
-
امضا شرکت
-
-
- -{% endblock %} + +
+ + + + + + + + + + + + + {% for it in items %} + + + + + + + + + {% empty %} + + {% endfor %} + + + + + + + {% if invoice.discount_amount > 0 %} + + + + + {% endif %} + + + + + + + + + + + + + +
ردیفشرح کالا/خدماتتوضیحاتتعدادقیمت واحد(تومان)قیمت کل(تومان)
{{ forloop.counter }}{{ it.item.name }}{{ it.item.description|default:"-" }}{{ it.quantity }}{{ it.unit_price|floatformat:0|intcomma:False }}{{ it.total_price|floatformat:0|intcomma:False }}
آیتمی ندارد
جمع کل(تومان):{{ invoice.total_amount|floatformat:0|intcomma:False }}
تخفیف(تومان):{{ invoice.discount_amount|floatformat:0|intcomma:False }}
مبلغ نهایی(تومان):{{ invoice.final_amount|floatformat:0|intcomma:False }}
پرداختی‌ها(تومان):{{ invoice.paid_amount|floatformat:0|intcomma:False }}
مانده(تومان):{{ invoice.remaining_amount|floatformat:0|intcomma:False }}
+
+ +
+
+
مهر و امضا:
+
    + {% if instance.broker.company and instance.broker.company.signature %} +
  • امضا
  • + {% endif %} +
+
+ {% if instance.broker.company %} +
+
اطلاعات پرداخت
+ {% if instance.broker.company.card_number %} +
شماره کارت: {{ instance.broker.company.card_number }}
+ {% endif %} + {% if instance.broker.company.account_number %} +
شماره حساب: {{ instance.broker.company.account_number }}
+ {% endif %} + {% if instance.broker.company.sheba_number %} +
شماره شبا: {{ instance.broker.company.sheba_number }}
+ {% endif %} + {% if instance.broker.company.bank_name %} +
بانک: {{ instance.broker.company.get_bank_name_display }}
+ {% endif %} +
+ {% endif %} +
+ +
+ + + + diff --git a/invoices/templates/invoices/final_invoice_step.html b/invoices/templates/invoices/final_invoice_step.html index dfee339..5fe05e4 100644 --- a/invoices/templates/invoices/final_invoice_step.html +++ b/invoices/templates/invoices/final_invoice_step.html @@ -24,6 +24,10 @@ {% block content %} {% include '_toasts.html' %} + + +{% instance_info_modal instance %} + {% csrf_token %}
@@ -32,14 +36,18 @@

{{ step.name }}: {{ instance.process.name }}

- اشتراک آب: {{ instance.well.water_subscription_number|default:"-" }} - | نماینده: {{ instance.representative.profile.national_code|default:"-" }} + {% instance_info instance %}
@@ -163,15 +171,24 @@
diff --git a/invoices/templates/invoices/final_settlement_step.html b/invoices/templates/invoices/final_settlement_step.html index 2335298..350d5b7 100644 --- a/invoices/templates/invoices/final_settlement_step.html +++ b/invoices/templates/invoices/final_settlement_step.html @@ -23,6 +23,10 @@ {% block content %} {% include '_toasts.html' %} + + +{% instance_info_modal instance %} + {% csrf_token %}
@@ -31,14 +35,18 @@

{{ step.name }}: {{ instance.process.name }}

- اشتراک آب: {{ instance.well.water_subscription_number|default:"-" }} - | نماینده: {{ instance.representative.profile.national_code|default:"-" }} + {% instance_info instance %}
@@ -88,7 +96,7 @@
- +
@@ -182,7 +190,7 @@
وضعیت تاییدها
{% if can_approve_reject %}
- +
{% endif %} @@ -214,13 +222,19 @@ {% endif %}
{% if previous_step %} - قبلی + + + قبلی + {% else %} {% endif %} {% if step_instance.status == 'completed' %} {% if next_step %} - بعدی + + بعدی + + {% else %} اتمام {% endif %} diff --git a/invoices/urls.py b/invoices/urls.py index f959799..f40df30 100644 --- a/invoices/urls.py +++ b/invoices/urls.py @@ -31,5 +31,4 @@ urlpatterns = [ path('instance//step//final-settlement/', views.final_settlement_step, name='final_settlement_step'), path('instance//step//final-settlement/add/', views.add_final_payment, name='add_final_payment'), path('instance//step//final-settlement//delete/', views.delete_final_payment, name='delete_final_payment'), - path('instance//step//final-settlement/approve/', views.approve_final_settlement, name='approve_final_settlement'), ] diff --git a/invoices/views.py b/invoices/views.py index ea99eb7..b8a1eb2 100644 --- a/invoices/views.py +++ b/invoices/views.py @@ -12,7 +12,7 @@ import json from processes.models import ProcessInstance, ProcessStep, StepInstance, StepRejection, StepApproval from accounts.models import Role from common.consts import UserRoles -from .models import Item, Quote, QuoteItem, Payment, Invoice +from .models import Item, Quote, QuoteItem, Payment, Invoice, InvoiceItem from installations.models import InstallationReport, InstallationItemChange @@ -792,14 +792,7 @@ def approve_final_invoice(request, instance_id, step_id): return JsonResponse({'success': False, 'message': 'شما مجوز تایید این مرحله را ندارید'}, status=403) except Exception: return JsonResponse({'success': False, 'message': 'شما مجوز تایید این مرحله را ندارید'}, status=403) - # Block approval when there is any remaining (positive or negative) - invoice.calculate_totals() - # if invoice.remaining_amount != 0: - # return JsonResponse({ - # 'success': False, - # 'message': f"تا زمانی که مانده فاکتور صفر نشده امکان تایید نیست (مانده فعلی: {invoice.remaining_amount})" - # }) - # mark step completed + step_instance, _ = StepInstance.objects.get_or_create(process_instance=instance, step=step) step_instance.status = 'completed' step_instance.completed_at = timezone.now() @@ -826,7 +819,7 @@ def add_special_charge(request, instance_id, step_id): return JsonResponse({'success': False, 'message': 'شما مجوز افزودن هزینه ویژه را ندارید'}, status=403) except Exception: return JsonResponse({'success': False, 'message': 'شما مجوز افزودن هزینه ویژه را ندارید'}, status=403) - # charge_type was removed from UI; we no longer require it + item_id = request.POST.get('item_id') amount = (request.POST.get('amount') or '').strip() if not item_id: @@ -841,7 +834,7 @@ def add_special_charge(request, instance_id, step_id): # Fetch existing special item from DB special_item = get_object_or_404(Item, id=item_id, is_special=True) - from .models import InvoiceItem + InvoiceItem.objects.create( invoice=invoice, item=special_item, @@ -863,7 +856,6 @@ def delete_special_charge(request, instance_id, step_id, item_id): return JsonResponse({'success': False, 'message': 'شما مجوز حذف هزینه ویژه را ندارید'}, status=403) except Exception: return JsonResponse({'success': False, 'message': 'شما مجوز حذف هزینه ویژه را ندارید'}, status=403) - from .models import InvoiceItem inv_item = get_object_or_404(InvoiceItem, id=item_id, invoice=invoice) # allow deletion only for special items try: @@ -880,6 +872,7 @@ def delete_special_charge(request, instance_id, step_id, item_id): def final_settlement_step(request, instance_id, step_id): instance = get_object_or_404(ProcessInstance, id=instance_id) step = get_object_or_404(instance.process.steps, id=step_id) + if not instance.can_access_step(step): messages.error(request, 'شما به این مرحله دسترسی ندارید. ابتدا مراحل قبلی را تکمیل کنید.') return redirect('processes:request_list') @@ -890,6 +883,7 @@ def final_settlement_step(request, instance_id, step_id): # Ensure step instance exists step_instance, _ = StepInstance.objects.get_or_create(process_instance=instance, step=step, defaults={'status': 'in_progress'}) + # Build approver statuses for template reqs = list(step.approver_requirements.select_related('role').all()) approvals_map = {a.role_id: a.decision for a in step_instance.approvals.select_related('role').all()} @@ -947,6 +941,13 @@ def final_settlement_step(request, instance_id, step_id): defaults={'approved_by': request.user, 'decision': 'rejected', 'reason': reason} ) StepRejection.objects.create(step_instance=step_instance, rejected_by=request.user, reason=reason) + # If current step is ahead of this step, reset it back to this step (align behavior with other steps) + try: + if instance.current_step and instance.current_step.order > step.order: + instance.current_step = step + instance.save(update_fields=['current_step']) + except Exception: + pass messages.success(request, 'مرحله تسویه نهایی رد شد و برای اصلاح بازگشت.') return redirect('invoices:final_settlement_step', instance_id=instance.id, step_id=step.id) @@ -984,6 +985,7 @@ def add_final_payment(request, instance_id, step_id): return JsonResponse({'success': False, 'message': 'شما مجوز افزودن تراکنش تسویه را ندارید'}, status=403) except Exception: return JsonResponse({'success': False, 'message': 'شما مجوز افزودن تراکنش تسویه را ندارید'}, status=403) + amount = (request.POST.get('amount') or '').strip() payment_date = (request.POST.get('payment_date') or '').strip() payment_method = (request.POST.get('payment_method') or '').strip() @@ -1038,12 +1040,14 @@ def add_final_payment(request, instance_id, step_id): ) # After creation, totals auto-updated by model save. Respond with redirect and new totals for UX. invoice.refresh_from_db() - # After payment change, set step back to in_progress + + # On delete, return to awaiting approval try: si, _ = StepInstance.objects.get_or_create(process_instance=instance, step=step) si.status = 'in_progress' si.completed_at = None si.save() + si.approvals.all().delete() except Exception: pass @@ -1065,6 +1069,16 @@ def add_final_payment(request, instance_id, step_id): pass except Exception: pass + + # If current step is ahead of this step, reset it back to this step + try: + if instance.current_step and instance.current_step.order > step.order: + instance.current_step = step + instance.save(update_fields=['current_step']) + except Exception: + pass + + return JsonResponse({ 'success': True, 'redirect': reverse('invoices:final_settlement_step', args=[instance.id, step_id]), @@ -1091,14 +1105,44 @@ def delete_final_payment(request, instance_id, step_id, payment_id): return JsonResponse({'success': False, 'message': 'شما مجوز حذف تراکنش تسویه را ندارید'}, status=403) payment.delete() invoice.refresh_from_db() - # After payment change, set step back to in_progress + + # On delete, return to awaiting approval try: si, _ = StepInstance.objects.get_or_create(process_instance=instance, step=step) si.status = 'in_progress' si.completed_at = None si.save() + si.approvals.all().delete() except Exception: pass + + # Reset ALL subsequent completed steps to in_progress + try: + subsequent_steps = instance.process.steps.filter(order__gt=step.order) + for subsequent_step in subsequent_steps: + subsequent_step_instance = instance.step_instances.filter(step=subsequent_step).first() + if subsequent_step_instance and subsequent_step_instance.status == 'completed': + # Bypass validation by using update() instead of save() + instance.step_instances.filter(step=subsequent_step).update( + status='in_progress', + completed_at=None + ) + # Clear previous approvals if the step requires re-approval + try: + subsequent_step_instance.approvals.all().delete() + except Exception: + pass + except Exception: + pass + + # If current step is ahead of this step, reset it back to this step + try: + if instance.current_step and instance.current_step.order > step.order: + instance.current_step = step + instance.save(update_fields=['current_step']) + except Exception: + pass + return JsonResponse({'success': True, 'redirect': reverse('invoices:final_settlement_step', args=[instance.id, step_id]), 'totals': { 'final_amount': str(invoice.final_amount), 'paid_amount': str(invoice.paid_amount),