fix date in payment and imporove contract page.
This commit is contained in:
		
							parent
							
								
									af40e169ae
								
							
						
					
					
						commit
						204b0aa48e
					
				
					 14 changed files with 295 additions and 74 deletions
				
			
		| 
						 | 
				
			
			@ -2,29 +2,51 @@ from django.shortcuts import render, get_object_or_404, redirect
 | 
			
		|||
from django.contrib.auth.decorators import login_required
 | 
			
		||||
from django.urls import reverse
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
from decimal import Decimal
 | 
			
		||||
from django.template import Template, Context
 | 
			
		||||
from django.utils.safestring import mark_safe
 | 
			
		||||
from processes.models import ProcessInstance, StepInstance
 | 
			
		||||
from common.consts import UserRoles
 | 
			
		||||
from .models import ContractTemplate, ContractInstance
 | 
			
		||||
from invoices.models import Invoice, Quote
 | 
			
		||||
from _helpers.utils import jalali_converter2
 | 
			
		||||
from django.http import JsonResponse
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def build_contract_context(instance: ProcessInstance) -> dict:
 | 
			
		||||
    representative = instance.representative
 | 
			
		||||
    profile = getattr(representative, 'profile', None)
 | 
			
		||||
    well = instance.well
 | 
			
		||||
    # Compute prepayment from Quote-linked invoice payments
 | 
			
		||||
    quote = Quote.objects.filter(process_instance=instance).first()
 | 
			
		||||
    invoice = Invoice.objects.filter(quote=quote).first() if quote else None
 | 
			
		||||
    payments_qs = invoice.payments.filter(is_deleted=False, direction='in').all() if invoice else []
 | 
			
		||||
    total_paid = sum((p.amount for p in payments_qs), Decimal('0'))
 | 
			
		||||
    try:
 | 
			
		||||
        latest_payment_date = max((p.payment_date for p in payments_qs)) if payments_qs else None
 | 
			
		||||
    except Exception:
 | 
			
		||||
        latest_payment_date = None
 | 
			
		||||
    
 | 
			
		||||
    return {
 | 
			
		||||
        'customer_full_name': representative.get_full_name() if representative else '',
 | 
			
		||||
        'national_code': profile.national_code if profile else '',
 | 
			
		||||
        'address': profile.address if profile else '',
 | 
			
		||||
        'phone': profile.phone_number_1 if profile else '',
 | 
			
		||||
        'phone2': profile.phone_number_2 if profile else '',
 | 
			
		||||
        'water_subscription_number': well.water_subscription_number if well else '',
 | 
			
		||||
        'electricity_subscription_number': well.electricity_subscription_number if well else '',
 | 
			
		||||
        'water_meter_serial_number': well.water_meter_serial_number if well else '',
 | 
			
		||||
        'well_power': well.well_power if well else '',
 | 
			
		||||
        'request_code': instance.code,
 | 
			
		||||
        'today': jalali_converter2(timezone.now()),
 | 
			
		||||
        'customer_full_name': mark_safe(f"<span class=\"fw-bold\">{representative.get_full_name() if representative else ''}</span>"),
 | 
			
		||||
        'registration_number': mark_safe(f"<span class=\"fw-bold\">{instance.broker.company.registration_number if instance.broker and instance.broker.company else ''}</span>"),
 | 
			
		||||
        'national_code': mark_safe(f"<span class=\"fw-bold\">{profile.national_code if profile else ''}</span>"),
 | 
			
		||||
        'address': mark_safe(f"<span class=\"fw-bold\">{profile.address if profile else ''}</span>"),
 | 
			
		||||
        'phone': mark_safe(f"<span class=\"fw-bold\">{profile.phone_number_1 if profile else ''}</span>"),
 | 
			
		||||
        'phone2': mark_safe(f"<span class=\"fw-bold\">{profile.phone_number_2 if profile else ''}</span>"),
 | 
			
		||||
        'water_subscription_number': mark_safe(f"<span class=\"fw-bold\">{well.water_subscription_number if well else ''}</span>"),
 | 
			
		||||
        'electricity_subscription_number': mark_safe(f"<span class=\"fw-bold\">{well.electricity_subscription_number if well else ''}</span>"),
 | 
			
		||||
        'water_meter_serial_number': mark_safe(f"<span class=\"fw-bold\">{well.water_meter_serial_number if well else ''}</span>"),
 | 
			
		||||
        'well_power': mark_safe(f"<span class=\"fw-bold\">{well.well_power if well else ''}</span>"),
 | 
			
		||||
        'request_code': mark_safe(f"<span class=\"fw-bold\">{instance.code}</span>"),
 | 
			
		||||
        'today': mark_safe(f"<span class=\"fw-bold\">{jalali_converter2(timezone.now())}</span>"),
 | 
			
		||||
        'company_name': mark_safe(f"<span class=\"fw-bold\">{instance.broker.company.name if instance.broker and instance.broker.company else ''}</span>"),
 | 
			
		||||
        'city_name': mark_safe(f"<span class=\"fw-bold\">{instance.broker.affairs.county.city.name if instance.broker and instance.broker.affairs and instance.broker.affairs.county and instance.broker.affairs.county.city else ''}</span>"),
 | 
			
		||||
        'card_number': mark_safe(f"<span class=\"fw-bold\">{instance.representative.profile.card_number if instance.representative else ''}</span>"),
 | 
			
		||||
        'account_number': mark_safe(f"<span class=\"fw-bold\">{instance.representative.profile.account_number if instance.representative else ''}</span>"),
 | 
			
		||||
        'bank_name': mark_safe(f"<span class=\"fw-bold\">{instance.representative.profile.get_bank_name_display() if instance.representative else ''}</span>"),
 | 
			
		||||
        'prepayment_amount': mark_safe(f"<span class=\"fw-bold\">{int(total_paid):,}</span>"),
 | 
			
		||||
        'prepayment_date': mark_safe(f"<span class=\"fw-bold\">{jalali_converter2(latest_payment_date)}</span>") if latest_payment_date else '',
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -35,10 +57,7 @@ def contract_step(request, instance_id, step_id):
 | 
			
		|||
    step = get_object_or_404(instance.process.steps, id=step_id)
 | 
			
		||||
    previous_step = instance.process.steps.filter(order__lt=step.order).last()
 | 
			
		||||
    next_step = instance.process.steps.filter(order__gt=step.order).first()
 | 
			
		||||
    # Access control:
 | 
			
		||||
    # - INSTALLER: can open step but cannot view contract body (show inline message)
 | 
			
		||||
    # - Others: can view
 | 
			
		||||
    # - Only BROKER can submit/complete this step
 | 
			
		||||
 | 
			
		||||
    profile = getattr(request.user, 'profile', None)
 | 
			
		||||
    is_broker = False
 | 
			
		||||
    can_view_contract_body = True
 | 
			
		||||
| 
						 | 
				
			
			@ -72,7 +91,6 @@ def contract_step(request, instance_id, step_id):
 | 
			
		|||
    # If user submits to go next, only broker can complete and go to next
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        if not is_broker:
 | 
			
		||||
            from django.http import JsonResponse
 | 
			
		||||
            return JsonResponse({'success': False, 'message': 'شما مجوز تایید این مرحله را ندارید'}, status=403)
 | 
			
		||||
        StepInstance.objects.update_or_create(
 | 
			
		||||
            process_instance=instance,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue