Skip to content

Commit

Permalink
Merge pull request #2327 from coronasafe/staging
Browse files Browse the repository at this point in the history
Production release v24.31.0
  • Loading branch information
gigincg authored Jul 29, 2024
2 parents 776a8fc + c9a6e30 commit ecb353c
Show file tree
Hide file tree
Showing 10 changed files with 240 additions and 43 deletions.
21 changes: 21 additions & 0 deletions care/facility/api/serializers/file_upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from care.facility.api.serializers.shifting import has_facility_permission
from care.facility.models.facility import Facility
from care.facility.models.file_upload import FileUpload
from care.facility.models.notification import Notification
from care.facility.models.patient import PatientRegistration
from care.facility.models.patient_consultation import (
PatientConsent,
Expand All @@ -14,6 +15,7 @@
from care.facility.models.patient_sample import PatientSample
from care.users.api.serializers.user import UserBaseMinimumSerializer
from care.users.models import User
from care.utils.notification_handler import NotificationGenerator
from config.serializers import ChoiceField


Expand Down Expand Up @@ -156,12 +158,31 @@ def create(self, validated_data):
internal_id = check_permissions(
validated_data["file_type"], validated_data["associating_id"], user
)
associating_id = validated_data["associating_id"]
validated_data["associating_id"] = internal_id
validated_data["uploaded_by"] = user
validated_data["internal_name"] = validated_data["original_name"]
del validated_data["original_name"]
file_upload: FileUpload = super().create(validated_data)
file_upload.signed_url = file_upload.signed_url(mime_type=mime_type)
if validated_data["file_type"] == FileUpload.FileType.CONSULTATION.value:
consultation = PatientConsultation.objects.get(external_id=associating_id)
NotificationGenerator(
event=Notification.Event.CONSULTATION_FILE_UPLOAD_CREATED,
caused_by=user,
caused_object=consultation,
facility=consultation.facility,
generate_for_facility=True,
).generate()
if validated_data["file_type"] == FileUpload.FileType.PATIENT.value:
patient = PatientRegistration.objects.get(external_id=associating_id)
NotificationGenerator(
event=Notification.Event.PATIENT_FILE_UPLOAD_CREATED,
caused_by=user,
caused_object=patient,
facility=patient.facility,
generate_for_facility=True,
).generate()
return file_upload


Expand Down
17 changes: 17 additions & 0 deletions care/facility/api/viewsets/prescription.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,11 @@
PrescriptionType,
generate_choices,
)
from care.facility.models.notification import Notification
from care.facility.static_data.medibase import MedibaseMedicine
from care.utils.filters.choicefilter import CareChoiceFilter
from care.utils.filters.multiselect import MultiSelectFilter
from care.utils.notification_handler import NotificationGenerator
from care.utils.queryset.consultation import get_consultation_queryset
from care.utils.static_data.helpers import query_builder, token_escaper

Expand Down Expand Up @@ -120,6 +122,13 @@ def get_queryset(self):

def perform_create(self, serializer):
consultation_obj = self.get_consultation_obj()
NotificationGenerator(
event=Notification.Event.PATIENT_PRESCRIPTION_CREATED,
caused_by=self.request.user,
caused_object=consultation_obj,
facility=consultation_obj.facility,
generate_for_facility=True,
).generate()
serializer.save(prescribed_by=self.request.user, consultation=consultation_obj)

@extend_schema(tags=["prescriptions"])
Expand All @@ -133,6 +142,14 @@ def discontinue(self, request, *args, **kwargs):
prescription_obj.discontinued_reason = request.data.get(
"discontinued_reason", None
)
consultation_obj = self.get_consultation_obj()
NotificationGenerator(
event=Notification.Event.PATIENT_PRESCRIPTION_UPDATED,
caused_by=self.request.user,
caused_object=consultation_obj,
facility=consultation_obj.facility,
generate_for_facility=True,
).generate()
prescription_obj.save()
return Response({}, status=status.HTTP_200_OK)

Expand Down
41 changes: 41 additions & 0 deletions care/facility/migrations/0446_alter_notification_event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Generated by Django 4.2.10 on 2024-07-18 10:19

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("facility", "0445_merge_20240715_0301"),
]

operations = [
migrations.AlterField(
model_name="notification",
name="event",
field=models.IntegerField(
choices=[
(0, "MESSAGE"),
(20, "PATIENT_CREATED"),
(30, "PATIENT_UPDATED"),
(40, "PATIENT_DELETED"),
(50, "PATIENT_CONSULTATION_CREATED"),
(60, "PATIENT_CONSULTATION_UPDATED"),
(70, "PATIENT_CONSULTATION_DELETED"),
(80, "INVESTIGATION_SESSION_CREATED"),
(90, "INVESTIGATION_UPDATED"),
(100, "PATIENT_FILE_UPLOAD_CREATED"),
(110, "CONSULTATION_FILE_UPLOAD_CREATED"),
(120, "PATIENT_CONSULTATION_UPDATE_CREATED"),
(130, "PATIENT_CONSULTATION_UPDATE_UPDATED"),
(140, "PATIENT_CONSULTATION_ASSIGNMENT"),
(200, "SHIFTING_UPDATED"),
(210, "PATIENT_NOTE_ADDED"),
(220, "PUSH_MESSAGE"),
(230, "PATIENT_PRESCRIPTION_CREATED"),
(240, "PATIENT_PRESCRIPTION_UPDATED"),
],
default=0,
),
),
]
2 changes: 2 additions & 0 deletions care/facility/models/notification.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ class Event(enum.Enum):
SHIFTING_UPDATED = 200
PATIENT_NOTE_ADDED = 210
PUSH_MESSAGE = 220
PATIENT_PRESCRIPTION_CREATED = 230
PATIENT_PRESCRIPTION_UPDATED = 240

EventChoices = [(e.value, e.name) for e in Event]

Expand Down
76 changes: 51 additions & 25 deletions care/hcx/api/viewsets/gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,16 +74,19 @@ def check_eligibility(self, request):
"7894561232",
policy["patient_object"]["id"],
policy["patient_object"]["name"],
"male"
if policy["patient_object"]["gender"] == 1
else "female"
if policy["patient_object"]["gender"] == 2
else "other",
(
"male"
if policy["patient_object"]["gender"] == 1
else (
"female" if policy["patient_object"]["gender"] == 2 else "other"
)
),
policy["subscriber_id"],
policy["policy_id"],
policy["id"],
policy["id"],
policy["id"],
policy["patient_object"]["phone_number"],
REVERSE_STATUS_CHOICES[policy["status"]],
REVERSE_PRIORITY_CHOICES[policy["priority"]],
REVERSE_PURPOSE_CHOICES[policy["purpose"]],
Expand Down Expand Up @@ -125,17 +128,23 @@ def make_claim(self, request):
lambda procedure: {
"id": str(uuid()),
"name": procedure["procedure"],
"performed": procedure["time"]
if "time" in procedure
else procedure["frequency"],
"performed": (
procedure["time"]
if "time" in procedure
else procedure["frequency"]
),
"status": (
"completed"
if datetime.strptime(procedure["time"], "%Y-%m-%dT%H:%M")
< datetime.now()
else "preparation"
)
if "time" in procedure
else "in-progress",
(
"completed"
if datetime.strptime(
procedure["time"], "%Y-%m-%dT%H:%M"
)
< datetime.now()
else "preparation"
)
if "time" in procedure
else "in-progress"
),
},
consultation.procedure,
)
Expand Down Expand Up @@ -208,17 +217,22 @@ def make_claim(self, request):
"GICOFINDIA",
claim["policy_object"]["patient_object"]["id"],
claim["policy_object"]["patient_object"]["name"],
"male"
if claim["policy_object"]["patient_object"]["gender"] == 1
else "female"
if claim["policy_object"]["patient_object"]["gender"] == 2
else "other",
(
"male"
if claim["policy_object"]["patient_object"]["gender"] == 1
else (
"female"
if claim["policy_object"]["patient_object"]["gender"] == 2
else "other"
)
),
claim["policy_object"]["subscriber_id"],
claim["policy_object"]["policy_id"],
claim["policy_object"]["id"],
claim["id"],
claim["id"],
claim["items"],
claim["policy_object"]["patient_object"]["phone_number"],
REVERSE_USE_CHOICES[claim["use"]],
REVERSE_STATUS_CHOICES[claim["status"]],
REVERSE_CLAIM_TYPE_CHOICES[claim["type"]],
Expand All @@ -237,9 +251,11 @@ def make_claim(self, request):

response = Hcx().generateOutgoingHcxCall(
fhirPayload=json.loads(claim_fhir_bundle.json()),
operation=HcxOperations.CLAIM_SUBMIT
if REVERSE_USE_CHOICES[claim["use"]] == "claim"
else HcxOperations.PRE_AUTH_SUBMIT,
operation=(
HcxOperations.CLAIM_SUBMIT
if REVERSE_USE_CHOICES[claim["use"]] == "claim"
else HcxOperations.PRE_AUTH_SUBMIT
),
recipientCode=claim["policy_object"]["insurer_id"],
)

Expand Down Expand Up @@ -306,15 +322,25 @@ def send_communication(self, request):
def payors(self, request):
payors = Hcx().searchRegistry("roles", "payor")["participants"]

active_payors = list(filter(lambda payor: payor["status"] == "Active", payors))
result = filter(lambda payor: payor["status"] == "Active", payors)

if query := request.query_params.get("query"):
query = query.lower()
result = filter(
lambda payor: (
query in payor["participant_name"].lower()
or query in payor["participant_code"].lower()
),
result,
)

response = list(
map(
lambda payor: {
"name": payor["participant_name"],
"code": payor["participant_code"],
},
active_payors,
result,
)
)

Expand Down
41 changes: 25 additions & 16 deletions care/hcx/utils/fhir.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,9 @@ class SYSTEM:
claim_bundle_identifier = "https://www.tmh.in/bundle"
coverage_eligibility_request_bundle_identifier = "https://www.tmh.in/bundle"
practitioner_speciality = "http://snomed.info/sct"
claim_supporting_info_category = "https://ig.hcxprotocol.io/v0.7.1/ValueSet-claim-supporting-info-categories.html"
claim_supporting_info_category = (
"http://hcxprotocol.io/codes/claim-supporting-info-categories"
)
related_claim_relationship = (
"http://terminology.hl7.org/CodeSystem/ex-relatedclaimrelationship"
)
Expand Down Expand Up @@ -258,7 +260,7 @@ def get_reference_url(self, resource: domainresource.DomainResource):
return f"{resource.resource_type}/{resource.id}"

def create_patient_profile(
self, id: str, name: str, gender: str, identifier_value: str
self, id: str, name: str, gender: str, phone: str, identifier_value: str
):
return patient.Patient(
id=id,
Expand All @@ -280,6 +282,7 @@ def create_patient_profile(
],
name=[{"text": name}],
gender=gender,
telecom=[{"system": "phone", "use": "mobile", "value": phone}],
)

def create_provider_profile(self, id: str, name: str, identifier_value: str):
Expand Down Expand Up @@ -558,9 +561,11 @@ def create_claim_profile(
category=codeableconcept.CodeableConcept(
coding=[
coding.Coding(
system=SYSTEM.claim_item_category_pmjy
if item["category"] == "HBP"
else SYSTEM.claim_item_category,
system=(
SYSTEM.claim_item_category_pmjy
if item["category"] == "HBP"
else SYSTEM.claim_item_category
),
code=item["category"],
)
]
Expand Down Expand Up @@ -695,6 +700,7 @@ def create_coverage_eligibility_request_bundle(
coverage_id: str,
eligibility_request_id: str,
eligibility_request_identifier_value: str,
patient_phone: str,
status="active",
priority="normal",
purpose="validation",
Expand All @@ -709,7 +715,7 @@ def create_coverage_eligibility_request_bundle(
insurer_id, insurer_name, insurer_identifier_value
)
patient = self.create_patient_profile(
patient_id, pateint_name, patient_gender, subscriber_id
patient_id, pateint_name, patient_gender, patient_phone, subscriber_id
)
enterer = self.create_practitioner_role_profile(
enterer_id, enterer_identifier_value, enterer_speciality, enterer_phone
Expand Down Expand Up @@ -792,6 +798,7 @@ def create_claim_bundle(
claim_id: str,
claim_identifier_value: str,
items: list[IClaimItem],
patient_phone: str,
use="claim",
status="active",
type="institutional",
Expand All @@ -810,7 +817,7 @@ def create_claim_bundle(
insurer_id, insurer_name, insurer_identifier_value
)
patient = self.create_patient_profile(
patient_id, pateint_name, patient_gender, subscriber_id
patient_id, pateint_name, patient_gender, patient_phone, subscriber_id
)
coverage = self.create_coverage_profile(
coverage_id,
Expand Down Expand Up @@ -947,15 +954,17 @@ def create_communication_profile(
map(
lambda content: (
communication.CommunicationPayload(
contentString=content["data"]
if content["type"] == "text"
else None,
contentAttachment=attachment.Attachment(
url=content["data"],
title=content["name"] if content["name"] else None,
)
if content["type"] == "url"
else None,
contentString=(
content["data"] if content["type"] == "text" else None
),
contentAttachment=(
attachment.Attachment(
url=content["data"],
title=content["name"] if content["name"] else None,
)
if content["type"] == "url"
else None
),
)
),
payload,
Expand Down
Loading

0 comments on commit ecb353c

Please sign in to comment.