diff --git a/care/facility/api/serializers/patient_consultation.py b/care/facility/api/serializers/patient_consultation.py index 38d5908a8a..4178ab75cd 100644 --- a/care/facility/api/serializers/patient_consultation.py +++ b/care/facility/api/serializers/patient_consultation.py @@ -402,6 +402,15 @@ class PatientConsultationDischargeSerializer(serializers.ModelSerializer): death_datetime = serializers.DateTimeField(required=False, allow_null=True) death_confirmed_doctor = serializers.CharField(required=False, allow_null=True) + referred_to = ExternalIdSerializerField( + queryset=Facility.objects.all(), + required=False, + allow_null=True, + ) + referred_to_external = serializers.CharField( + required=False, allow_blank=True, allow_null=True + ) + def get_discharge_prescription(self, consultation): return Prescription.objects.filter( consultation=consultation, @@ -420,6 +429,7 @@ class Meta: model = PatientConsultation fields = ( "discharge_reason", + "referred_to", "referred_to_external", "discharge_notes", "discharge_date", @@ -430,6 +440,17 @@ class Meta: ) def validate(self, attrs): + if attrs.get("referred_to") and attrs.get("referred_to_external"): + raise ValidationError( + { + "referred_to": [ + "Only one of referred_to and referred_to_external can be set" + ], + "referred_to_external": [ + "Only one of referred_to and referred_to_external can be set" + ], + } + ) if attrs.get("discharge_reason") != "EXP": attrs.pop("death_datetime", None) attrs.pop("death_confirmed_doctor", None) diff --git a/care/facility/tests/test_patient_consultation_api.py b/care/facility/tests/test_patient_consultation_api.py index fc5f21c945..acf2e5d50e 100644 --- a/care/facility/tests/test_patient_consultation_api.py +++ b/care/facility/tests/test_patient_consultation_api.py @@ -235,6 +235,49 @@ def test_referred_to_external_empty_string(self): ) self.assertEqual(res.status_code, status.HTTP_200_OK) + def test_referred_to_empty_facility(self): + consultation = self.create_admission_consultation( + suggestion="A", + admission_date=make_aware(datetime.datetime(2020, 4, 1, 15, 30, 00)), + ) + res = self.discharge( + consultation, + discharge_reason="REF", + discharge_date="2023-07-01T12:00:00Z", + discharge_notes="Discharged with empty referred_to_external", + referred_to=None, + ) + self.assertEqual(res.status_code, status.HTTP_200_OK) + + def test_referred_to_and_external_together(self): + consultation = self.create_admission_consultation( + suggestion="A", + admission_date=make_aware(datetime.datetime(2020, 4, 1, 15, 30, 00)), + ) + res = self.discharge( + consultation, + discharge_reason="REF", + discharge_date="2023-07-01T12:00:00Z", + discharge_notes="Discharged with null referred_to_external", + referred_to_external="External Facility", + referred_to=self.facility.external_id, + ) + self.assertEqual(res.status_code, status.HTTP_400_BAD_REQUEST) + + def test_referred_to_valid_value(self): + consultation = self.create_admission_consultation( + suggestion="A", + admission_date=make_aware(datetime.datetime(2020, 4, 1, 15, 30, 00)), + ) + referred_to_external = "Test Hospital" + res = self.discharge( + consultation, + discharge_reason="REF", + discharge_date="2023-07-01T12:00:00Z", + referred_to_external=referred_to_external, + ) + self.assertEqual(res.status_code, status.HTTP_200_OK) + def test_referred_to_external_valid_value(self): consultation = self.create_admission_consultation( suggestion="A",