main flow checked

This commit is contained in:
aminhashemi92 2025-10-03 21:56:25 +03:30
parent b5bf3a5dbe
commit f853ad9784
21 changed files with 365 additions and 89 deletions

View file

@ -320,15 +320,29 @@ def installation_report_step(request, instance_id, step_id):
can_approve_reject = False
user_can_approve = can_approve_reject
approvals_list = list(step_instance.approvals.select_related('role', 'approved_by').filter(is_deleted=False))
rejections_list = list(step_instance.rejections.select_related('role', 'rejected_by').filter(is_deleted=False))
approvals_by_role = {a.role_id: a for a in approvals_list}
approver_statuses = [
{
rejections_by_role = {r.role_id: r for r in rejections_list}
approver_statuses = []
for r in reqs:
appr = approvals_by_role.get(r.role_id)
rejection = rejections_by_role.get(r.role_id)
if appr:
status = 'approved'
reason = appr.reason
elif rejection:
status = 'rejected'
reason = rejection.reason
else:
status = None
reason = ''
approver_statuses.append({
'role': r.role,
'status': (approvals_by_role.get(r.role_id).decision if approvals_by_role.get(r.role_id) else None),
'reason': (approvals_by_role.get(r.role_id).reason if approvals_by_role.get(r.role_id) else ''),
}
for r in reqs
]
'status': status,
'reason': reason,
})
# Determine if current user has already approved/rejected (to disable buttons)
current_user_has_decided = False
@ -356,10 +370,11 @@ def installation_report_step(request, instance_id, step_id):
if action == 'approve':
# Record this user's approval for their role
StepApproval.objects.update_or_create(
StepApproval.objects.create(
step_instance=step_instance,
role=matching_role,
defaults={'approved_by': request.user, 'decision': 'approved', 'reason': ''}
approved_by=request.user,
reason=''
)
# Only mark report approved when ALL required roles have approved
if step_instance.is_fully_approved():
@ -386,12 +401,8 @@ def installation_report_step(request, instance_id, step_id):
if not reason:
messages.error(request, 'لطفاً علت رد شدن را وارد کنید.')
return redirect('processes:step_detail', instance_id=instance.id, step_id=step.id)
StepApproval.objects.update_or_create(
step_instance=step_instance,
role=matching_role,
defaults={'approved_by': request.user, 'decision': 'rejected', 'reason': reason}
)
StepRejection.objects.create(step_instance=step_instance, rejected_by=request.user, reason=reason)
# Only create StepRejection for rejections, not StepApproval
StepRejection.objects.create(step_instance=step_instance, role=matching_role, rejected_by=request.user, reason=reason)
existing_report.approved = False
existing_report.save()
# If current step moved ahead of this step, reset it back for correction (align with invoices)