fix force approve and vat show
This commit is contained in:
parent
65cc48769d
commit
169a9bd624
10 changed files with 133 additions and 5 deletions
|
|
@ -898,6 +898,29 @@ def add_special_charge(request, instance_id, step_id):
|
|||
unit_price=amount_dec,
|
||||
)
|
||||
invoice.calculate_totals()
|
||||
# If the next step was completed, reopen it (set to in_progress) due to invoice change
|
||||
try:
|
||||
step = get_object_or_404(instance.process.steps, id=step_id)
|
||||
next_step = instance.process.steps.filter(order__gt=step.order).first()
|
||||
if next_step:
|
||||
si, _ = StepInstance.objects.get_or_create(process_instance=instance, step=next_step)
|
||||
if si.status in ['completed', 'approved']:
|
||||
si.status = 'in_progress'
|
||||
si.completed_at = None
|
||||
si.save(update_fields=['status', 'completed_at'])
|
||||
# Clear prior approvals/rejections as the underlying totals changed
|
||||
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
|
||||
except Exception:
|
||||
pass
|
||||
return JsonResponse({'success': True, 'redirect': reverse('invoices:final_invoice_step', args=[instance.id, step_id])})
|
||||
|
||||
|
||||
|
|
@ -921,6 +944,29 @@ def delete_special_charge(request, instance_id, step_id, item_id):
|
|||
return JsonResponse({'success': False, 'message': 'امکان حذف این مورد وجود ندارد'})
|
||||
inv_item.hard_delete()
|
||||
invoice.calculate_totals()
|
||||
# If the next step was completed, reopen it (set to in_progress) due to invoice change
|
||||
try:
|
||||
step = get_object_or_404(instance.process.steps, id=step_id)
|
||||
next_step = instance.process.steps.filter(order__gt=step.order).first()
|
||||
if next_step:
|
||||
si, _ = StepInstance.objects.get_or_create(process_instance=instance, step=next_step)
|
||||
if si.status in ['completed', 'approved']:
|
||||
si.status = 'in_progress'
|
||||
si.completed_at = None
|
||||
si.save(update_fields=['status', 'completed_at'])
|
||||
# Clear prior approvals/rejections as the underlying totals changed
|
||||
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
|
||||
except Exception:
|
||||
pass
|
||||
return JsonResponse({'success': True, 'redirect': reverse('invoices:final_invoice_step', args=[instance.id, step_id])})
|
||||
|
||||
|
||||
|
|
@ -939,6 +985,23 @@ 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'})
|
||||
|
||||
# Auto-complete step when invoice is fully settled (no approvals needed)
|
||||
try:
|
||||
invoice.calculate_totals()
|
||||
if invoice.get_remaining_amount() == 0:
|
||||
if step_instance.status != 'completed':
|
||||
step_instance.status = 'completed'
|
||||
step_instance.completed_at = timezone.now()
|
||||
step_instance.save()
|
||||
# if next_step:
|
||||
# instance.current_step = next_step
|
||||
# instance.save(update_fields=['current_step'])
|
||||
# return redirect('processes:step_detail', instance_id=instance.id, step_id=next_step.id)
|
||||
# return redirect('processes:request_list')
|
||||
except Exception:
|
||||
# If totals calculation fails, continue with normal flow
|
||||
pass
|
||||
|
||||
# Build approver statuses for template (include reason to display in UI)
|
||||
reqs = list(step.approver_requirements.select_related('role').all())
|
||||
|
|
@ -1048,6 +1111,14 @@ def final_settlement_step(request, instance_id, step_id):
|
|||
except Exception:
|
||||
messages.error(request, 'فقط مدیر مجاز به تایید اضطراری است.')
|
||||
return redirect('invoices:final_settlement_step', instance_id=instance.id, step_id=step.id)
|
||||
# Allow emergency approval only when invoice has a remaining (non-zero)
|
||||
try:
|
||||
invoice.calculate_totals()
|
||||
if invoice.get_remaining_amount() == 0:
|
||||
messages.error(request, 'فاکتور تسویه شده است؛ تایید اضطراری لازم نیست.')
|
||||
return redirect('invoices:final_settlement_step', instance_id=instance.id, step_id=step.id)
|
||||
except Exception:
|
||||
pass
|
||||
# Mark step completed regardless of remaining amount/approvals
|
||||
step_instance.status = 'approved'
|
||||
step_instance.save()
|
||||
|
|
@ -1094,6 +1165,14 @@ def add_final_payment(request, instance_id, step_id):
|
|||
except Exception:
|
||||
return JsonResponse({'success': False, 'message': 'شما مجوز افزودن تراکنش تسویه را ندارید'}, status=403)
|
||||
|
||||
# Prevent adding payments if invoice already settled
|
||||
try:
|
||||
invoice.calculate_totals()
|
||||
if invoice.get_remaining_amount() == 0:
|
||||
return JsonResponse({'success': False, 'message': 'فاکتور تسویه شده است؛ افزودن تراکنش مجاز نیست'})
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue