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

+21 -22
View File
@@ -2,35 +2,34 @@ package episodeofcare
import (
"time"
"service/internal/satusehat/common"
)
type EpisodeOfCareRequest struct {
OrganizationID string `json:"organization_id,omitempty"`
EpisodeOfCareID string `json:"episode_of_care_id,omitempty"` // cth: "EOC12345"
Status string `json:"status" binding:"required,oneof=planned waitlist active onhold finished cancelled entered-in-error"`
StatusHistory []StatusHistoryDTO `json:"status_history,omitempty"`
Type []*common.CodeableConceptDTO `json:"type,omitempty"`
Diagnosis []DiagnosisDTO `json:"diagnosis,omitempty"`
PatientID string `json:"patient_id" binding:"required"`
PatientName string `json:"patient_name,omitempty"`
ManagingOrganization string `json:"managing_organization,omitempty"`
PeriodStart *time.Time `json:"period_start,omitempty"`
PeriodEnd *time.Time `json:"period_end,omitempty"`
CareManager *common.ReferenceDTO `json:"care_manager,omitempty"`
}
OrganizationID string `json:"organization_id,omitempty"`
EpisodeOfCareID string `json:"episode_of_care_id,omitempty"`
Status string `json:"status" binding:"required,oneof=planned waitlist active onhold finished cancelled entered-in-error"`
TypeSystem string `json:"type_system,omitempty"`
TypeCode string `json:"type_code,omitempty"`
TypeDisplay string `json:"type_display,omitempty"`
PatientID string `json:"patient_id" binding:"required"`
PatientName string `json:"patient_name,omitempty"`
ManagingOrganizationID string `json:"managing_organization_id,omitempty"`
type StatusHistoryDTO struct {
Status string `json:"status,omitempty"`
PeriodStart *time.Time `json:"period_start,omitempty"`
PeriodEnd *time.Time `json:"period_end,omitempty"`
}
type DiagnosisDTO struct {
Condition *common.ReferenceDTO `json:"condition,omitempty"`
Role *common.CodeableConceptDTO `json:"role,omitempty"`
Rank int `json:"rank,omitempty"`
CareManagerID string `json:"care_manager_id,omitempty"`
CareManagerName string `json:"care_manager_name,omitempty"`
DiagnosisConditionID string `json:"diagnosis_condition_id,omitempty"`
DiagnosisRoleSystem string `json:"diagnosis_role_system,omitempty"`
DiagnosisRoleCode string `json:"diagnosis_role_code,omitempty"`
DiagnosisRoleDisplay string `json:"diagnosis_role_display,omitempty"`
DiagnosisRank int `json:"diagnosis_rank,omitempty"`
}
type EpisodeOfCarePatchRequest []map[string]interface{}
@@ -1,7 +1,6 @@
package episodeofcare
import (
"os"
"time"
"service/internal/interfaces/satusehat"
@@ -10,10 +9,7 @@ import (
func MapRequestToFHIR(req EpisodeOfCareRequest) satusehat.FHIRPayload {
payload := satusehat.NewFHIRPayload("EpisodeOfCare")
orgID := os.Getenv("SATUSEHAT_ORG_ID")
if orgID == "" {
orgID = req.OrganizationID
}
orgID := req.OrganizationID
if orgID != "" && req.EpisodeOfCareID != "" {
payload.Set("identifier", []map[string]interface{}{
@@ -28,79 +24,39 @@ func MapRequestToFHIR(req EpisodeOfCareRequest) satusehat.FHIRPayload {
payload.Set("status", req.Status)
}
if len(req.StatusHistory) > 0 {
var statusHistory []map[string]interface{}
for _, sh := range req.StatusHistory {
historyItem := map[string]interface{}{"status": sh.Status}
period := map[string]interface{}{}
if sh.PeriodStart != nil && !sh.PeriodStart.IsZero() {
period["start"] = sh.PeriodStart.Format(time.RFC3339)
}
if sh.PeriodEnd != nil && !sh.PeriodEnd.IsZero() {
period["end"] = sh.PeriodEnd.Format(time.RFC3339)
}
if len(period) > 0 {
historyItem["period"] = period
}
statusHistory = append(statusHistory, historyItem)
if req.TypeCode != "" {
sys := req.TypeSystem
if sys == "" {
sys = "http://terminology.kemkes.go.id/CodeSystem/episodeofcare-type"
}
payload.Set("statusHistory", statusHistory)
coding := map[string]interface{}{"system": sys, "code": req.TypeCode}
if req.TypeDisplay != "" {
coding["display"] = req.TypeDisplay
}
payload.Set("type", []map[string]interface{}{
{"coding": []map[string]interface{}{coding}},
})
}
if len(req.Type) > 0 {
var types []map[string]interface{}
for _, t := range req.Type {
if t != nil {
sys := t.System
if sys == "" {
sys = "http://terminology.kemkes.go.id/CodeSystem/episodeofcare-type"
}
coding := map[string]interface{}{"system": sys, "code": t.Code}
if t.Display != "" {
coding["display"] = t.Display
}
typeConcept := map[string]interface{}{"coding": []map[string]interface{}{coding}}
if t.Text != "" {
typeConcept["text"] = t.Text
}
types = append(types, typeConcept)
}
if req.DiagnosisConditionID != "" {
diag := map[string]interface{}{
"condition": map[string]interface{}{"reference": "Condition/" + req.DiagnosisConditionID},
}
payload.Set("type", types)
}
if len(req.Diagnosis) > 0 {
var diagnoses []map[string]interface{}
for _, d := range req.Diagnosis {
diagnosisItem := map[string]interface{}{}
if d.Condition != nil {
condition := map[string]interface{}{"reference": d.Condition.Reference}
if d.Condition.Display != "" {
condition["display"] = d.Condition.Display
}
diagnosisItem["condition"] = condition
if req.DiagnosisRoleCode != "" {
sys := req.DiagnosisRoleSystem
if sys == "" {
sys = "http://terminology.hl7.org/CodeSystem/diagnosis-role"
}
if d.Role != nil {
sys := d.Role.System
if sys == "" {
sys = "http://terminology.hl7.org/CodeSystem/diagnosis-role"
}
coding := map[string]interface{}{"system": sys, "code": d.Role.Code}
if d.Role.Display != "" {
coding["display"] = d.Role.Display
}
diagnosisItem["role"] = map[string]interface{}{"coding": []map[string]interface{}{coding}}
coding := map[string]interface{}{"system": sys, "code": req.DiagnosisRoleCode}
if req.DiagnosisRoleDisplay != "" {
coding["display"] = req.DiagnosisRoleDisplay
}
if d.Rank > 0 {
diagnosisItem["rank"] = d.Rank
}
diagnoses = append(diagnoses, diagnosisItem)
diag["role"] = map[string]interface{}{"coding": []map[string]interface{}{coding}}
}
payload.Set("diagnosis", diagnoses)
if req.DiagnosisRank > 0 {
diag["rank"] = req.DiagnosisRank
}
payload.Set("diagnosis", []map[string]interface{}{diag})
}
if req.PatientID != "" {
@@ -112,8 +68,8 @@ func MapRequestToFHIR(req EpisodeOfCareRequest) satusehat.FHIRPayload {
}
manageOrg := orgID
if req.ManagingOrganization != "" {
manageOrg = req.ManagingOrganization
if req.ManagingOrganizationID != "" {
manageOrg = req.ManagingOrganizationID
}
if manageOrg != "" {
payload.Set("managingOrganization", map[string]interface{}{
@@ -129,10 +85,10 @@ func MapRequestToFHIR(req EpisodeOfCareRequest) satusehat.FHIRPayload {
payload.Set("period", period)
}
if req.CareManager != nil {
cm := map[string]interface{}{"reference": req.CareManager.Reference}
if req.CareManager.Display != "" {
cm["display"] = req.CareManager.Display
if req.CareManagerID != "" {
cm := map[string]interface{}{"reference": "Practitioner/" + req.CareManagerID}
if req.CareManagerName != "" {
cm["display"] = req.CareManagerName
}
payload.Set("careManager", cm)
}
@@ -27,12 +27,8 @@ func NewRepository(client satusehat.SatuSehatClient) Repository {
return &repository{client: client}
}
type hiddenCtx struct {
context.Context
}
func (r *repository) executeRequest(ctx context.Context, method, endpoint string, req interface{}) (*satusehat.FHIRResponse, error) {
resp, err := r.client.DoRequest(hiddenCtx{ctx}, method, endpoint, req)
resp, err := r.client.DoRequest(ctx, method, endpoint, req)
if err != nil {
return nil, errors.InternalError().Message("Failed to execute request to SatuSehat").Cause(err).Build()
}
@@ -17,15 +17,19 @@ type Service interface {
}
type service struct {
repo Repository
repo Repository
orgID string
}
// NewService membuat service EpisodeOfCare baru.
func NewService(repo Repository) Service {
return &service{repo: repo}
func NewService(repo Repository, orgID string) Service {
return &service{repo: repo, orgID: orgID}
}
func (s *service) Create(ctx context.Context, req EpisodeOfCareRequest) (*satusehat.FHIRResponse, error) {
if req.OrganizationID == "" {
req.OrganizationID = s.orgID
}
return s.repo.Create(ctx, MapRequestToFHIR(req))
}
@@ -33,6 +37,9 @@ func (s *service) Update(ctx context.Context, id string, req EpisodeOfCareReques
if id == "" {
return nil, errors.NewValidationError().Message("EpisodeOfCare ID is required").Build()
}
if req.OrganizationID == "" {
req.OrganizationID = s.orgID
}
payload := MapRequestToFHIR(req)
payload.Set("id", id)
return s.repo.Update(ctx, id, payload)