fix final invoice and certificatre
This commit is contained in:
		
							parent
							
								
									0cfa86bde3
								
							
						
					
					
						commit
						dd37ac3720
					
				
					 11 changed files with 120 additions and 66 deletions
				
			
		| 
						 | 
				
			
			@ -942,8 +942,8 @@ def final_settlement_step(request, instance_id, step_id):
 | 
			
		|||
    
 | 
			
		||||
    # Build approver statuses for template (include reason to display in UI)
 | 
			
		||||
    reqs = list(step.approver_requirements.select_related('role').all())
 | 
			
		||||
    approvals = list(step_instance.approvals.select_related('role').all())
 | 
			
		||||
    rejections = list(step_instance.rejections.select_related('role').all())
 | 
			
		||||
    approvals = list(step_instance.approvals.select_related('role', 'approved_by').filter(is_deleted=False))
 | 
			
		||||
    rejections = list(step_instance.rejections.select_related('role', 'rejected_by').filter(is_deleted=False))
 | 
			
		||||
    approvals_by_role = {a.role_id: a for a in approvals}
 | 
			
		||||
    rejections_by_role = {r.role_id: r for r in rejections}
 | 
			
		||||
    approver_statuses = []
 | 
			
		||||
| 
						 | 
				
			
			@ -978,8 +978,8 @@ def final_settlement_step(request, instance_id, step_id):
 | 
			
		|||
    # Compute whether current user has already decided (approved/rejected)
 | 
			
		||||
    current_user_has_decided = False
 | 
			
		||||
    try:
 | 
			
		||||
        user_has_approval = step_instance.approvals.filter(approved_by=request.user).exists()
 | 
			
		||||
        user_has_rejection = step_instance.rejections.filter(rejected_by=request.user).exists()
 | 
			
		||||
        user_has_approval = step_instance.approvals.filter(approved_by=request.user, is_deleted=False).exists()
 | 
			
		||||
        user_has_rejection = step_instance.rejections.filter(rejected_by=request.user, is_deleted=False).exists()
 | 
			
		||||
        current_user_has_decided = bool(user_has_approval or user_has_rejection)
 | 
			
		||||
    except Exception:
 | 
			
		||||
        current_user_has_decided = False
 | 
			
		||||
| 
						 | 
				
			
			@ -997,8 +997,8 @@ def final_settlement_step(request, instance_id, step_id):
 | 
			
		|||
        if action == 'approve':
 | 
			
		||||
            # enforce zero remaining
 | 
			
		||||
            invoice.calculate_totals()
 | 
			
		||||
            if invoice.remaining_amount != 0:
 | 
			
		||||
                messages.error(request, f"تا زمانی که مانده فاکتور صفر نشده امکان تایید نیست (مانده فعلی: {invoice.remaining_amount})")
 | 
			
		||||
            if invoice.get_remaining_amount() != 0:
 | 
			
		||||
                messages.error(request, f"تا زمانی که مانده فاکتور صفر نشده امکان تایید نیست (مانده فعلی: {invoice.get_remaining_amount()})")
 | 
			
		||||
                return redirect('invoices:final_settlement_step', instance_id=instance.id, step_id=step.id)
 | 
			
		||||
            StepApproval.objects.create(
 | 
			
		||||
                step_instance=step_instance,
 | 
			
		||||
| 
						 | 
				
			
			@ -1203,8 +1203,8 @@ def add_final_payment(request, instance_id, step_id):
 | 
			
		|||
        'redirect': reverse('invoices:final_settlement_step', args=[instance.id, step_id]),
 | 
			
		||||
        'totals': {
 | 
			
		||||
            'final_amount': str(invoice.final_amount),
 | 
			
		||||
            'paid_amount': str(invoice.paid_amount),
 | 
			
		||||
            'remaining_amount': str(invoice.remaining_amount),
 | 
			
		||||
            'paid_amount': str(invoice.get_paid_amount()),
 | 
			
		||||
            'remaining_amount': str(invoice.get_remaining_amount()),
 | 
			
		||||
        }
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1216,14 +1216,17 @@ def delete_final_payment(request, instance_id, step_id, payment_id):
 | 
			
		|||
    step = get_object_or_404(instance.process.steps, id=step_id)
 | 
			
		||||
    invoice = get_object_or_404(Invoice, process_instance=instance)
 | 
			
		||||
    payment = get_object_or_404(Payment, id=payment_id, invoice=invoice)
 | 
			
		||||
    
 | 
			
		||||
    # Only BROKER can delete final settlement payments
 | 
			
		||||
    try:
 | 
			
		||||
        if not (hasattr(request.user, 'profile') and request.user.profile.has_role(UserRoles.BROKER)):
 | 
			
		||||
            return JsonResponse({'success': False, 'message': 'شما مجوز حذف تراکنش تسویه را ندارید'}, status=403)
 | 
			
		||||
    except Exception:
 | 
			
		||||
        return JsonResponse({'success': False, 'message': 'شما مجوز حذف تراکنش تسویه را ندارید'}, status=403)
 | 
			
		||||
    
 | 
			
		||||
    # Delete payment and recalculate invoice totals
 | 
			
		||||
    payment.hard_delete()
 | 
			
		||||
    invoice.refresh_from_db()
 | 
			
		||||
    invoice.calculate_totals()  # This is what was missing!
 | 
			
		||||
 | 
			
		||||
    # On delete, return to awaiting approval
 | 
			
		||||
    try:
 | 
			
		||||
| 
						 | 
				
			
			@ -1231,16 +1234,11 @@ def delete_final_payment(request, instance_id, step_id, payment_id):
 | 
			
		|||
        si.status = 'in_progress'
 | 
			
		||||
        si.completed_at = None
 | 
			
		||||
        si.save()
 | 
			
		||||
        try:
 | 
			
		||||
            for appr in list(si.approvals.all()):
 | 
			
		||||
                appr.delete()
 | 
			
		||||
        except Exception:
 | 
			
		||||
            pass
 | 
			
		||||
        try:
 | 
			
		||||
            for rej in list(si.rejections.all()):
 | 
			
		||||
                rej.delete()
 | 
			
		||||
        except Exception:
 | 
			
		||||
            pass
 | 
			
		||||
        # Clear approvals and rejections (like in quote_payment)
 | 
			
		||||
        for appr in list(si.approvals.all()):
 | 
			
		||||
            appr.delete()
 | 
			
		||||
        for rej in list(si.rejections.all()):
 | 
			
		||||
            rej.delete()
 | 
			
		||||
    except Exception:
 | 
			
		||||
        pass
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1274,7 +1272,7 @@ def delete_final_payment(request, instance_id, step_id, payment_id):
 | 
			
		|||
 | 
			
		||||
    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),
 | 
			
		||||
        'remaining_amount': str(invoice.remaining_amount),
 | 
			
		||||
        'paid_amount': str(invoice.get_paid_amount()),
 | 
			
		||||
        'remaining_amount': str(invoice.get_remaining_amount()),
 | 
			
		||||
    }})
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue