diff --git a/commcare_connect/opportunity/tasks.py b/commcare_connect/opportunity/tasks.py index fe68b749..b5450cc1 100644 --- a/commcare_connect/opportunity/tasks.py +++ b/commcare_connect/opportunity/tasks.py @@ -36,9 +36,9 @@ UserInvite, UserInviteStatus, UserVisit, - VisitReviewStatus, VisitValidationStatus, ) +from commcare_connect.opportunity.utils.completed_work import update_status from commcare_connect.users.models import User from commcare_connect.utils.datetime import is_date_before from commcare_connect.utils.sms import send_sms @@ -329,25 +329,7 @@ def bulk_approve_completed_work(): completed_works = access.completedwork_set.exclude( status__in=[CompletedWorkStatus.rejected, CompletedWorkStatus.over_limit] ) - access.payment_accrued = 0 - for completed_work in completed_works: - if completed_work.completed_count > 0: - approved_count = completed_work.approved_count - if access.opportunity.managed: - visits = completed_work.uservisit_set.filter(review_status=VisitReviewStatus.agree).values_list( - "status", "reason" - ) - else: - visits = completed_work.uservisit_set.values_list("status", "reason") - if any(status == "rejected" for status, _ in visits): - completed_work.update_status(CompletedWorkStatus.rejected) - completed_work.reason = "\n".join(reason for _, reason in visits if reason) - elif all(status == "approved" for status, _ in visits): - completed_work.update_status(CompletedWorkStatus.approved) - if approved_count > 0 and completed_work.status == CompletedWorkStatus.approved: - access.payment_accrued += approved_count * completed_work.payment_unit.amount - completed_work.save() - access.save() + update_status(completed_works, access, True) @celery_app.task() diff --git a/commcare_connect/opportunity/utils/completed_work.py b/commcare_connect/opportunity/utils/completed_work.py index b346745f..e450409a 100644 --- a/commcare_connect/opportunity/utils/completed_work.py +++ b/commcare_connect/opportunity/utils/completed_work.py @@ -1,4 +1,4 @@ -from commcare_connect.opportunity.models import CompletedWorkStatus +from commcare_connect.opportunity.models import CompletedWorkStatus, VisitReviewStatus def update_status(completed_works, opportunity_access, compute_payment=True): @@ -11,7 +11,18 @@ def update_status(completed_works, opportunity_access, compute_payment=True): continue if opportunity_access.opportunity.auto_approve_payments: - update_completed_work_status(completed_work) + if opportunity_access.opportunity.managed: + visits = completed_work.uservisit_set.filter(review_status=VisitReviewStatus.agree).values_list( + "status", "reason" + ) + else: + visits = completed_work.uservisit_set.values_list("status", "reason") + if any(status == "rejected" for status, _ in visits): + completed_work.status = CompletedWorkStatus.rejected + completed_work.reason = "\n".join(reason for _, reason in visits if reason) + elif all(status == "approved" for status, _ in visits): + completed_work.status = CompletedWorkStatus.approved + completed_work.save() if compute_payment: approved_count = completed_work.approved_count @@ -21,14 +32,3 @@ def update_status(completed_works, opportunity_access, compute_payment=True): if compute_payment: opportunity_access.payment_accrued = payment_accrued opportunity_access.save() - - -def update_completed_work_status(completed_work): - visits = completed_work.uservisit_set.values_list("status", "reason") - if any(status == "rejected" for status, _ in visits): - completed_work.status = CompletedWorkStatus.rejected - completed_work.reason = "\n".join(reason for _, reason in visits if reason) - elif all(status == "approved" for status, _ in visits): - completed_work.status = CompletedWorkStatus.approved - - completed_work.save() diff --git a/commcare_connect/opportunity/visit_import.py b/commcare_connect/opportunity/visit_import.py index c59607fd..469ed737 100644 --- a/commcare_connect/opportunity/visit_import.py +++ b/commcare_connect/opportunity/visit_import.py @@ -16,10 +16,10 @@ OpportunityAccess, Payment, UserVisit, - VisitReviewStatus, VisitValidationStatus, ) from commcare_connect.opportunity.tasks import send_payment_notification +from commcare_connect.opportunity.utils.completed_work import update_status from commcare_connect.utils.file import get_file_extension from commcare_connect.utils.itertools import batched @@ -160,27 +160,7 @@ def update_payment_accrued(opportunity: Opportunity, users): completed_works = access.completedwork_set.exclude( status__in=[CompletedWorkStatus.rejected, CompletedWorkStatus.over_limit] ).select_related("payment_unit") - access.payment_accrued = 0 - for completed_work in completed_works: - # Auto Approve Payment conditions - if completed_work.completed_count > 0: - if opportunity.auto_approve_payments: - if opportunity.managed: - visits = completed_work.uservisit_set.filter( - review_status=VisitReviewStatus.agree - ).values_list("status", "reason") - else: - visits = completed_work.uservisit_set.values_list("status", "reason") - if any(status == "rejected" for status, _ in visits): - completed_work.update_status(CompletedWorkStatus.rejected) - completed_work.reason = "\n".join(reason for _, reason in visits if reason) - elif all(status == "approved" for status, _ in visits): - completed_work.update_status(CompletedWorkStatus.approved) - approved_count = completed_work.approved_count - if approved_count > 0 and completed_work.status == CompletedWorkStatus.approved: - access.payment_accrued += approved_count * completed_work.payment_unit.amount - completed_work.save() - access.save() + update_status(completed_works, access, True) def get_status_by_visit_id(dataset) -> dict[int, VisitValidationStatus]: