update All feture and service

This commit is contained in:
meninjar
2026-06-03 02:54:26 +00:00
parent af32d9cfdd
commit ce0fa1a291
98 changed files with 272469 additions and 1606 deletions

No files matched your search

@@ -1,7 +1,6 @@
package questionnaireresponse
import (
"os"
"time"
"service/internal/interfaces/satusehat"
@@ -10,15 +9,9 @@ import (
func MapRequestToFHIR(req QuestionnaireResponseRequest) satusehat.FHIRPayload {
payload := satusehat.NewFHIRPayload("QuestionnaireResponse")
orgID := os.Getenv("SATUSEHAT_ORG_ID")
if orgID == "" {
orgID = req.OrganizationID
}
if orgID != "" && req.QuestionnaireResponseID != "" {
// Catatan: Identifier QuestionnaireResponse adalah single object, bukan array
if req.OrganizationID != "" && req.QuestionnaireResponseID != "" {
payload.Set("identifier", map[string]interface{}{
"system": "http://sys-ids.kemkes.go.id/QuestionnaireResponse/" + orgID,
"system": "http://sys-ids.kemkes.go.id/QuestionnaireResponse/" + req.OrganizationID,
"value": req.QuestionnaireResponseID,
})
}
@@ -30,18 +23,18 @@ func MapRequestToFHIR(req QuestionnaireResponseRequest) satusehat.FHIRPayload {
payload.Set("status", req.Status)
}
if req.Subject != nil {
subject := map[string]interface{}{"reference": req.Subject.Reference}
if req.Subject.Display != "" {
subject["display"] = req.Subject.Display
if req.PatientID != "" {
subject := map[string]interface{}{"reference": "Patient/" + req.PatientID}
if req.PatientName != "" {
subject["display"] = req.PatientName
}
payload.Set("subject", subject)
}
if req.Encounter != nil {
encounter := map[string]interface{}{"reference": req.Encounter.Reference}
if req.Encounter.Display != "" {
encounter["display"] = req.Encounter.Display
if req.EncounterID != "" {
encounter := map[string]interface{}{"reference": "Encounter/" + req.EncounterID}
if req.EncounterDisplay != "" {
encounter["display"] = req.EncounterDisplay
}
payload.Set("encounter", encounter)
}
@@ -50,25 +43,90 @@ func MapRequestToFHIR(req QuestionnaireResponseRequest) satusehat.FHIRPayload {
payload.Set("authored", req.Authored.Format(time.RFC3339))
}
if req.Author != nil {
author := map[string]interface{}{"reference": req.Author.Reference}
if req.Author.Display != "" {
author["display"] = req.Author.Display
if req.AuthorID != "" {
authorType := req.AuthorType
if authorType == "" {
authorType = "Practitioner"
}
author := map[string]interface{}{"reference": authorType + "/" + req.AuthorID}
if req.AuthorName != "" {
author["display"] = req.AuthorName
}
payload.Set("author", author)
}
if req.Source != nil {
source := map[string]interface{}{"reference": req.Source.Reference}
if req.Source.Display != "" {
source["display"] = req.Source.Display
if req.SourceID != "" {
sourceType := req.SourceType
if sourceType == "" {
sourceType = "Patient"
}
source := map[string]interface{}{"reference": sourceType + "/" + req.SourceID}
if req.SourceName != "" {
source["display"] = req.SourceName
}
payload.Set("source", source)
}
if len(req.Items) > 0 {
payload.Set("item", req.Items)
items := make([]map[string]interface{}, 0, len(req.Items))
for _, it := range req.Items {
items = append(items, mapItem(it))
}
payload.Set("item", items)
}
return payload
}
func mapItem(it ItemDTO) map[string]interface{} {
out := map[string]interface{}{"linkId": it.LinkID}
if it.Text != "" {
out["text"] = it.Text
}
if answer := mapAnswer(it); answer != nil {
out["answer"] = []map[string]interface{}{answer}
}
return out
}
func mapAnswer(it ItemDTO) map[string]interface{} {
switch {
case it.AnswerBoolean != nil:
return map[string]interface{}{"valueBoolean": *it.AnswerBoolean}
case it.AnswerString != "":
return map[string]interface{}{"valueString": it.AnswerString}
case it.AnswerInteger != nil:
return map[string]interface{}{"valueInteger": *it.AnswerInteger}
case it.AnswerDecimal != nil:
return map[string]interface{}{"valueDecimal": *it.AnswerDecimal}
case it.AnswerDate != nil && !it.AnswerDate.IsZero():
return map[string]interface{}{"valueDate": it.AnswerDate.Format("2006-01-02")}
case it.AnswerDateTime != nil && !it.AnswerDateTime.IsZero():
return map[string]interface{}{"valueDateTime": it.AnswerDateTime.Format(time.RFC3339)}
case it.AnswerQuantityValue != nil:
q := map[string]interface{}{"value": *it.AnswerQuantityValue}
if it.AnswerQuantityUnit != "" {
q["unit"] = it.AnswerQuantityUnit
}
if it.AnswerQuantitySystem != "" {
q["system"] = it.AnswerQuantitySystem
}
if it.AnswerQuantityCode != "" {
q["code"] = it.AnswerQuantityCode
}
return map[string]interface{}{"valueQuantity": q}
case it.AnswerCodingCode != "" || it.AnswerCodingDisplay != "":
coding := map[string]interface{}{}
if it.AnswerCodingSystem != "" {
coding["system"] = it.AnswerCodingSystem
}
if it.AnswerCodingCode != "" {
coding["code"] = it.AnswerCodingCode
}
if it.AnswerCodingDisplay != "" {
coding["display"] = it.AnswerCodingDisplay
}
return map[string]interface{}{"valueCoding": coding}
}
return nil
}