fix reset to final invoice when add or delete special item
This commit is contained in:
parent
129500bc1d
commit
7c2a1ebc7a
2 changed files with 71 additions and 24 deletions
BIN
db.sqlite3
BIN
db.sqlite3
Binary file not shown.
|
|
@ -885,6 +885,8 @@ def add_special_charge(request, instance_id, step_id):
|
||||||
"""افزودن هزینه ویژه تعمیر/تعویض به فاکتور نهایی بهصورت آیتم جداگانه"""
|
"""افزودن هزینه ویژه تعمیر/تعویض به فاکتور نهایی بهصورت آیتم جداگانه"""
|
||||||
instance = get_scoped_instance_or_404(request, instance_id)
|
instance = get_scoped_instance_or_404(request, instance_id)
|
||||||
invoice = get_object_or_404(Invoice, process_instance=instance)
|
invoice = get_object_or_404(Invoice, process_instance=instance)
|
||||||
|
step = get_object_or_404(instance.process.steps, id=step_id)
|
||||||
|
|
||||||
# only MANAGER can add special charges
|
# only MANAGER can add special charges
|
||||||
try:
|
try:
|
||||||
if not (hasattr(request.user, 'profile') and request.user.profile.has_role(UserRoles.MANAGER)):
|
if not (hasattr(request.user, 'profile') and request.user.profile.has_role(UserRoles.MANAGER)):
|
||||||
|
|
@ -914,29 +916,50 @@ def add_special_charge(request, instance_id, step_id):
|
||||||
unit_price=amount_dec,
|
unit_price=amount_dec,
|
||||||
)
|
)
|
||||||
invoice.calculate_totals()
|
invoice.calculate_totals()
|
||||||
# If the next step was completed, reopen it (set to in_progress) due to invoice change
|
|
||||||
|
|
||||||
|
# After modifying payments, set step back to in_progress
|
||||||
try:
|
try:
|
||||||
step = get_object_or_404(instance.process.steps, id=step_id)
|
si, _ = StepInstance.objects.get_or_create(process_instance=instance, step=step)
|
||||||
next_step = instance.process.steps.filter(order__gt=step.order).first()
|
si.status = 'in_progress'
|
||||||
if next_step:
|
si.completed_at = None
|
||||||
si, _ = StepInstance.objects.get_or_create(process_instance=instance, step=next_step)
|
si.save()
|
||||||
if si.status in ['completed', 'approved']:
|
except Exception:
|
||||||
si.status = 'in_progress'
|
pass
|
||||||
si.completed_at = None
|
|
||||||
si.save(update_fields=['status', 'completed_at'])
|
# Reset ALL subsequent completed steps to in_progress
|
||||||
# Clear prior approvals/rejections as the underlying totals changed
|
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:
|
||||||
|
# Bypass validation by using update() instead of save()
|
||||||
|
instance.step_instances.filter(step=subsequent_step).update(
|
||||||
|
status='in_progress',
|
||||||
|
completed_at=None
|
||||||
|
)
|
||||||
|
# Clear prior approvals/rejections as the underlying totals changed
|
||||||
try:
|
try:
|
||||||
for appr in list(si.approvals.all()):
|
for appr in list(subsequent_step_instance.approvals.all()):
|
||||||
appr.delete()
|
appr.delete()
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
for rej in list(si.rejections.all()):
|
for rej in list(subsequent_step_instance.rejections.all()):
|
||||||
rej.delete()
|
rej.delete()
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
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_invoice_step', args=[instance.id, step_id])})
|
return JsonResponse({'success': True, 'redirect': reverse('invoices:final_invoice_step', args=[instance.id, step_id])})
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -945,6 +968,8 @@ def add_special_charge(request, instance_id, step_id):
|
||||||
def delete_special_charge(request, instance_id, step_id, item_id):
|
def delete_special_charge(request, instance_id, step_id, item_id):
|
||||||
instance = get_scoped_instance_or_404(request, instance_id)
|
instance = get_scoped_instance_or_404(request, instance_id)
|
||||||
invoice = get_object_or_404(Invoice, process_instance=instance)
|
invoice = get_object_or_404(Invoice, process_instance=instance)
|
||||||
|
step = get_object_or_404(instance.process.steps, id=step_id)
|
||||||
|
|
||||||
# only MANAGER can delete special charges
|
# only MANAGER can delete special charges
|
||||||
try:
|
try:
|
||||||
if not (hasattr(request.user, 'profile') and request.user.profile.has_role(UserRoles.MANAGER)):
|
if not (hasattr(request.user, 'profile') and request.user.profile.has_role(UserRoles.MANAGER)):
|
||||||
|
|
@ -960,29 +985,51 @@ def delete_special_charge(request, instance_id, step_id, item_id):
|
||||||
return JsonResponse({'success': False, 'message': 'امکان حذف این مورد وجود ندارد'})
|
return JsonResponse({'success': False, 'message': 'امکان حذف این مورد وجود ندارد'})
|
||||||
inv_item.hard_delete()
|
inv_item.hard_delete()
|
||||||
invoice.calculate_totals()
|
invoice.calculate_totals()
|
||||||
# If the next step was completed, reopen it (set to in_progress) due to invoice change
|
|
||||||
|
|
||||||
|
# After modifying payments, set step back to in_progress
|
||||||
try:
|
try:
|
||||||
step = get_object_or_404(instance.process.steps, id=step_id)
|
si, _ = StepInstance.objects.get_or_create(process_instance=instance, step=step)
|
||||||
next_step = instance.process.steps.filter(order__gt=step.order).first()
|
si.status = 'in_progress'
|
||||||
if next_step:
|
si.completed_at = None
|
||||||
si, _ = StepInstance.objects.get_or_create(process_instance=instance, step=next_step)
|
si.save()
|
||||||
if si.status in ['completed', 'approved']:
|
except Exception:
|
||||||
si.status = 'in_progress'
|
pass
|
||||||
si.completed_at = None
|
|
||||||
si.save(update_fields=['status', 'completed_at'])
|
# Reset ALL subsequent completed steps to in_progress
|
||||||
# Clear prior approvals/rejections as the underlying totals changed
|
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:
|
||||||
|
# Bypass validation by using update() instead of save()
|
||||||
|
instance.step_instances.filter(step=subsequent_step).update(
|
||||||
|
status='in_progress',
|
||||||
|
completed_at=None
|
||||||
|
)
|
||||||
|
# Clear prior approvals/rejections as the underlying totals changed
|
||||||
try:
|
try:
|
||||||
for appr in list(si.approvals.all()):
|
for appr in list(subsequent_step_instance.approvals.all()):
|
||||||
appr.delete()
|
appr.delete()
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
for rej in list(si.rejections.all()):
|
for rej in list(subsequent_step_instance.rejections.all()):
|
||||||
rej.delete()
|
rej.delete()
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
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_invoice_step', args=[instance.id, step_id])})
|
return JsonResponse({'success': True, 'redirect': reverse('invoices:final_invoice_step', args=[instance.id, step_id])})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue