package diagnosticreport import ( "os" "time" "service/internal/interfaces/satusehat" ) func MapRequestToFHIR(req DiagnosticReportRequest) satusehat.FHIRPayload { payload := satusehat.NewFHIRPayload("DiagnosticReport") orgID := os.Getenv("SATUSEHAT_ORG_ID") if orgID == "" { orgID = req.OrganizationID } if orgID != "" && req.DiagnosticID != "" { payload.Set("identifier", []map[string]interface{}{ { "system": "http://sys-ids.kemkes.go.id/diagnostic/" + orgID + "/lab", "use": "official", "value": req.DiagnosticID, }, }) } if req.Status != "" { payload.Set("status", req.Status) } if len(req.Category) > 0 { var categories []map[string]interface{} for _, c := range req.Category { if c != nil { sys := c.System if sys == "" { sys = "http://terminology.hl7.org/CodeSystem/v2-0074" } coding := map[string]interface{}{"system": sys, "code": c.Code} if c.Display != "" { coding["display"] = c.Display } categories = append(categories, map[string]interface{}{"coding": []map[string]interface{}{coding}}) } } payload.Set("category", categories) } if req.Code != nil { sys := req.Code.System if sys == "" { sys = "http://loinc.org" } coding := map[string]interface{}{"system": sys, "code": req.Code.Code} if req.Code.Display != "" { coding["display"] = req.Code.Display } codeConcept := map[string]interface{}{"coding": []map[string]interface{}{coding}} if req.Code.Text != "" { codeConcept["text"] = req.Code.Text } payload.Set("code", codeConcept) } if req.PatientID != "" { payload.Set("subject", map[string]interface{}{ "reference": "Patient/" + req.PatientID, }) } if req.EncounterID != "" { payload.Set("encounter", map[string]interface{}{ "reference": "Encounter/" + req.EncounterID, }) } if req.EffectiveDateTime != nil && !req.EffectiveDateTime.IsZero() { payload.Set("effectiveDateTime", req.EffectiveDateTime.Format(time.RFC3339)) } if req.Issued != nil && !req.Issued.IsZero() { payload.Set("issued", req.Issued.Format(time.RFC3339)) } if len(req.Performer) > 0 { var performers []map[string]interface{} for _, p := range req.Performer { perf := map[string]interface{}{"reference": p.Reference} if p.Display != "" { perf["display"] = p.Display } performers = append(performers, perf) } payload.Set("performer", performers) } if len(req.Result) > 0 { var results []map[string]interface{} for _, r := range req.Result { res := map[string]interface{}{"reference": r.Reference} if r.Display != "" { res["display"] = r.Display } results = append(results, res) } payload.Set("result", results) } if len(req.Specimen) > 0 { var specimens []map[string]interface{} for _, s := range req.Specimen { spec := map[string]interface{}{"reference": s.Reference} if s.Display != "" { spec["display"] = s.Display } specimens = append(specimens, spec) } payload.Set("specimen", specimens) } if len(req.BasedOn) > 0 { var basedOns []map[string]interface{} for _, b := range req.BasedOn { bo := map[string]interface{}{"reference": b.Reference} if b.Display != "" { bo["display"] = b.Display } basedOns = append(basedOns, bo) } payload.Set("basedOn", basedOns) } if len(req.ImagingStudy) > 0 { var imagingStudies []map[string]interface{} for _, i := range req.ImagingStudy { is := map[string]interface{}{"reference": i.Reference} if i.Display != "" { is["display"] = i.Display } imagingStudies = append(imagingStudies, is) } payload.Set("imagingStudy", imagingStudies) } if len(req.ConclusionCode) > 0 { var concCodes []map[string]interface{} for _, c := range req.ConclusionCode { if c != nil { sys := c.System if sys == "" { sys = "http://snomed.info/sct" } coding := map[string]interface{}{"system": sys, "code": c.Code} if c.Display != "" { coding["display"] = c.Display } concCodes = append(concCodes, map[string]interface{}{"coding": []map[string]interface{}{coding}}) } } payload.Set("conclusionCode", concCodes) } if req.Conclusion != "" { payload.Set("conclusion", req.Conclusion) } return payload }