Skip to content

Commit

Permalink
Merge pull request #81 from openimis/feature/CM-812
Browse files Browse the repository at this point in the history
CM-812: Added enrollment for group
  • Loading branch information
jdolkowski committed May 24, 2024
2 parents b040884 + 013a844 commit 6bbfb65
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 2 deletions.
2 changes: 2 additions & 0 deletions social_protection/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"validation_import_valid_items_workflow": "beneficiary-import-valid-items.beneficiary-import-valid-items",
"validation_upload_valid_items_workflow": "beneficiary-upload-valid-items.beneficiary-upload-valid-items",
"validation_enrollment": "validation-enrollment",
"validation_group_enrollment": "validation-group-enrollment",

"enable_maker_checker_logic_enrollment": True,

Expand Down Expand Up @@ -69,6 +70,7 @@ class SocialProtectionConfig(AppConfig):
validation_import_valid_items_workflow = None
validation_upload_valid_items_workflow = None
validation_enrollment = None
validation_group_enrollment = None

enable_maker_checker_for_beneficiary_upload = None
enable_maker_checker_for_beneficiary_update = None
Expand Down
6 changes: 6 additions & 0 deletions social_protection/signals/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
on_task_resolve

from social_protection.signals.on_confirm_enrollment_of_individual import on_confirm_enrollment_of_individual
from social_protection.signals.on_confirm_enrollment_of_group import on_confirm_enrollment_of_group
from social_protection.signals.on_validation_import_valid_items import on_task_complete_import_validated, \
on_task_resolve

Expand Down Expand Up @@ -47,3 +48,8 @@ def bind_service_signals():
on_confirm_enrollment_of_individual,
bind_type=ServiceSignalBindType.AFTER
)
bind_service_signal(
'group_service.select_groups_to_benefit_plan',
on_confirm_enrollment_of_group,
bind_type=ServiceSignalBindType.AFTER
)
96 changes: 96 additions & 0 deletions social_protection/signals/on_confirm_enrollment_of_group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import logging

from django.core.exceptions import ValidationError
from individual.models import (
IndividualDataSourceUpload,
IndividualDataSource,
GroupIndividual
)
from social_protection.apps import SocialProtectionConfig
from social_protection.models import (
BenefitPlanDataUploadRecords,
BenefitPlan,
GroupBeneficiary
)
from social_protection.utils import calculate_percentage_of_invalid_items
from tasks_management.models import Task
from tasks_management.apps import TasksManagementConfig
from tasks_management.services import (
UpdateCheckerLogicServiceMixin,
CreateCheckerLogicServiceMixin,
crud_business_data_builder,
TaskService,
_get_std_task_data_payload
)

logger = logging.getLogger(__name__)


def on_confirm_enrollment_of_group(**kwargs):
from core import datetime
result = kwargs.get('result', None)
benefit_plan_id = result['benefit_plan_id']
status = result['status']
user = result['user']
groups_to_upload = result['groups_not_assigned_to_selected_programme']
group_ids = groups_to_upload.values_list('id', flat=True)
if SocialProtectionConfig.enable_maker_checker_logic_enrollment:
benefit_plan = BenefitPlan.objects.get(id=benefit_plan_id)
upload = IndividualDataSourceUpload(
source_name=f"Enrollment into {benefit_plan.code} {datetime.date.today()}",
source_type='beneficiary group import'
)
upload.save(username=user.login_name)
upload_record = BenefitPlanDataUploadRecords(
data_upload=upload,
benefit_plan_id=benefit_plan_id,
workflow="Enrollment"
)
upload_record.save(username=user.username)

group_individuals = GroupIndividual.objects.filter(
is_deleted=False,
group_id__in=group_ids,
role=GroupIndividual.Role.HEAD
).distinct()
for group_individual in group_individuals:
source = IndividualDataSource(
upload=upload,
individual=group_individual.individual,
json_ext=group_individual.individual.json_ext,
validations={}
)
source.save(username=user.login_name)
json_ext = {
'source_name': upload_record.data_upload.source_name,
'workflow': upload_record.workflow,
'percentage_of_invalid_items': calculate_percentage_of_invalid_items(upload_record.id),
'data_upload_id': str(upload.id),
'benefit_plan_id': benefit_plan_id,
'beneficiary_status': status
}
TaskService(user).create({
'source': 'import_valid_items',
'entity': upload_record,
'status': Task.Status.RECEIVED,
'executor_action_event': TasksManagementConfig.default_executor_event,
'business_event': SocialProtectionConfig.validation_group_enrollment,
'json_ext': json_ext
})
else:
for group in groups_to_upload:
head_group_individual = GroupIndividual.objects.filter(
is_deleted=False,
group=group,
role=GroupIndividual.Role.HEAD
).first()
group_beneficiary = GroupBeneficiary(
group=group,
benefit_plan_id=benefit_plan_id,
status=status,
json_ext=head_group_individual.individual.json_ext
)
try:
group_beneficiary.save(username=user.username)
except ValidationError as e:
logger.error(f"Validation error occurred: {e}")
34 changes: 32 additions & 2 deletions social_protection/signals/on_validation_import_valid_items.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,18 @@
from typing import List

from core.models import User
from individual.models import IndividualDataSourceUpload, IndividualDataSource, Individual
from social_protection.models import Beneficiary, BenefitPlanDataUploadRecords, BenefitPlan
from individual.models import (
IndividualDataSourceUpload,
IndividualDataSource,
Individual,
GroupIndividual
)
from social_protection.models import (
Beneficiary,
BenefitPlanDataUploadRecords,
BenefitPlan,
GroupBeneficiary
)
from tasks_management.models import Task
from workflow.services import WorkflowService

Expand Down Expand Up @@ -99,6 +109,25 @@ def on_task_complete_action(business_event, **kwargs):
except ValidationError as e:
logger.error(f"Validation error occurred: {e}")
return
elif business_event == SocialProtectionConfig.validation_group_enrollment:
head_groups_to_enroll = Individual.objects.filter(
individualdatasource__upload_id=data['task']['json_ext']['data_upload_id']
)
user = User.objects.get(id=data['user']['id'])
for head_individual in head_groups_to_enroll:
# Create a new Beneficiary instance
group_individual_head = GroupIndividual.objects.filter(individual=head_individual).first()
group_beneficiary = GroupBeneficiary(
group=group_individual_head.group,
benefit_plan_id=data['task']['json_ext']['benefit_plan_id'],
status=data['task']['json_ext']['beneficiary_status'],
json_ext=head_individual.json_ext
)
try:
group_beneficiary.save(username=user.username)
except ValidationError as e:
logger.error(f"Validation error occurred: {e}")
return
else:
raise ValueError(f"Business event {business_event} doesn't have assigned workflow.")
ItemsUploadTaskCompletionEvent(
Expand All @@ -123,6 +152,7 @@ def on_task_complete_import_validated(**kwargs):
on_task_complete_action(SocialProtectionConfig.validation_import_valid_items, **kwargs)
on_task_complete_action(SocialProtectionConfig.validation_upload_valid_items, **kwargs)
on_task_complete_action(SocialProtectionConfig.validation_enrollment, **kwargs)
on_task_complete_action(SocialProtectionConfig.validation_group_enrollment, **kwargs)


def _delete_rejected(uuids_list):
Expand Down

0 comments on commit 6bbfb65

Please sign in to comment.