/* DESCRIPTION: Any functions that are used internally by the use-case */ package encounter import ( "encoding/json" pl "simrs-vx/pkg/logger" "strconv" dg "github.com/karincake/apem/db-gorm-pg" "gorm.io/gorm" "gorm.io/gorm/clause" erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" erp "simrs-vx/internal/domain/references/person" e "simrs-vx/internal/domain/main-entities/encounter" epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" epr "simrs-vx/internal/domain/main-entities/person-relative" ep "simrs-vx/internal/domain/simgos-entities/m-pasien" etdt "simrs-vx/internal/domain/simgos-entities/t-diagnosadanterapi" etp "simrs-vx/internal/domain/simgos-entities/t-pendaftaran" etrm "simrs-vx/internal/domain/simgos-entities/t-rekammedik" esync "simrs-vx/internal/domain/sync-entities/encounter" esyncLog "simrs-vx/internal/domain/sync-entities/log" ) func setDataCreateTPendaftaran(input *e.Encounter) (data etp.TPendaftaran, err error) { data.Nomr = *input.Patient.Number // set pasienbaru if input.NewStatus { data.Pasienbaru = 1 } // default kelas daftar data.KelasDaftar = 3 // set noAntrian defaultFromSimx := "rehab" data.NoAntrian = &defaultFromSimx // set no_kunjung noKunjung, err := generateNoKunjung() if err != nil { return etp.TPendaftaran{}, err } data.NoKunjung = uint(noKunjung) if p := input.Patient.Person; p != nil { mapRelative(p.Relatives, &data) if data.PenanggungjawabNama == "" { data.PenanggungjawabHubungan = "DIRI SENDIRI" data.PenanggungjawabNama = p.Name mapContact(p.Contacts, &data) mapAddress(p.Addresses, &data) } if bpjs := p.VclaimMember; bpjs != nil { data.Nokartu = *bpjs.CardNumber } } setDataTPendaftaran(input, &data) return } func setDataTPendaftaran(input *e.Encounter, data *etp.TPendaftaran) { data.Tglreg = input.RegisteredAt // set kdpoly if p := input.Specialist_Code; p != nil { kdpoly, _ := strconv.Atoi(*input.Specialist_Code) data.Kdpoly = uint(kdpoly) } // set kdrujuk setKdrujuk(input.RefType_Code, data) // set kdcarabayar setKdcarabayar(input.PaymentMethod_Code, data) // TODO: shift // set nip if emp := input.Adm_Employee; emp != nil { if user := emp.User; user != nil { data.Nip = user.Name } } // set data if payment_method bpjs if input.RefSource_Name != nil { data.Ketrujuk = *input.RefSource_Name data.Strujukan = 1 } else { data.Ketrujuk = "TR" data.Strujukan = 0 } if ref := input.VclaimReference; ref != nil { data.Norujukan = *ref.Number data.Tglrujukan = ref.Date } data.Jamreg = input.RegisteredAt // TODO: st_asal_masuk return } func setDataUpdateStatus(input e.Encounter, data *etp.TPendaftaran) { switch input.Status_Code { case erc.DSCProcess: data.Masukpoly = &now } if input.Status_Code == erc.DSCCancel { data.Status = 11 return } if input.Discharge_Method_Code != nil { setStatus(input.Discharge_Method_Code, data) } } func setDataCheckIn(input e.Encounter, data *etp.TPendaftaran) { // set kddokter kddokter, _ := strconv.Atoi(*input.Responsible_Doctor_Code) data.Kddokter = uint(kddokter) // set petugas_klinik // only update once if data.PetugasKlinik == "" { if n := input.Responsible_Nurse; n != nil { if emp := n.Employee; emp != nil { if u := emp.User; u != nil { data.PetugasKlinik = u.Name } } } } data.Masukpoly = input.StartedAt return } func setDataCheckOut(input e.Encounter, data *etp.TPendaftaran) { data.Keluarpoly = input.FinishedAt // set status setStatus(input.Discharge_Method_Code, data) if data.Status == 8 || data.Status == 3 { if dc := input.DeathCause; dc != nil { var dcSrc []DeathCauseSrc _ = json.Unmarshal([]byte(*dc.Value), &dcSrc) for i, v := range dcSrc { switch i { case 0: data.SebabMati1 = &v.Name data.IcdMati1 = &v.Code case 1: data.SebabMati2 = &v.Name data.IcdMati2 = &v.Code case 2: data.SebabMati3 = &v.Name data.IcdMati3 = &v.Code default: break } } } death := uint(1) data.StMeninggal = &death data.DtMeninggal = data.Keluarpoly } setPelayanan := uint(1) data.StPelayanan = &setPelayanan return } func setKdrujuk(input *ere.RefTypeCode, data *etp.TPendaftaran) { switch *input { case ere.RTCGov: data.Kdrujuk = 1 case ere.RTCPrivate: data.Kdrujuk = 2 case ere.RTCBpjs: data.Kdrujuk = 3 default: data.Kdrujuk = 0 } } func setKdcarabayar(input ere.AllPaymentMethodCode, data *etp.TPendaftaran) { switch input { case ere.APMCPks: data.Kdcarabayar = 12 case ere.APMCJkn: data.Kdcarabayar = 5 case ere.APMCJkmm: data.Kdcarabayar = 9 case ere.APMCSpm: data.Kdcarabayar = 10 default: data.Kdcarabayar = 1 } } func setStatus(code *ere.DischargeMethodCode, data *etp.TPendaftaran) { switch *code { case ere.DMCHome: data.Status = 1 case ere.DMCInpatient: data.Status = 2 case ere.DMCDeathOnArrival: data.Status = 3 data.StMeninggal = func(u uint) *uint { return &u }(1) data.DtMeninggal = &now case ere.DMCDeath: data.Status = 8 data.StMeninggal = func(u uint) *uint { return &u }(1) data.DtMeninggal = &now case ere.DMCHomeReq: data.Status = 7 case ere.DMCConsulPoly: data.Status = 5 case ere.DMCExtRef: data.Status = 6 case ere.DMCConsulChDay: data.Status = 12 case ere.DMCEmergency: data.Status = 10 case ere.DMCEmergencyCovid: data.Status = 13 case ere.DMCConsulExecutive: data.Status = 15 case ere.DMCConsulBack: data.Status = 100 default: data.Status = 0 } } func mapRelative(relative *[]epr.PersonRelative, data *etp.TPendaftaran) { if relative == nil || len(*relative) == 0 { return } for _, r := range *relative { if r.Responsible { data.PenanggungjawabNama = *r.Name switch r.Relationship_Code { case erp.RCMother, erp.RCFather: data.PenanggungjawabHubungan = "ORANG TUA" case erp.RCChild: data.PenanggungjawabHubungan = "ANAK" case erp.RCSibling: data.PenanggungjawabHubungan = "SAUDARA" case erp.RCUncle, erp.RCAunt, erp.RCGdMother, erp.RCGdFather, erp.RCNephew, erp.RCGdChild: data.PenanggungjawabHubungan = "KELUARGA LAIN" case erp.RCFriend: data.PenanggungjawabHubungan = "TEMAN" case erp.RCSpouse: data.PenanggungjawabHubungan = "SUAMI/ISTRI" case erp.RCSelf: data.PenanggungjawabHubungan = "DIRI SENDIRI" default: data.PenanggungjawabHubungan = "LAINNYA ..." } data.PenanggungjawabAlamat = *r.Address data.PenanggungjawabPhone = *r.PhoneNumber break } } } func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.EncounterSimxLog) { // encode to JSON jsonData, _ := json.MarshalIndent(input.Payload, "", " ") jsonString := string(jsonData) var status erc.ProcessStatusCode if input.IsSuccess { status = erc.PSCSuccess } else { status = erc.PSCFailed if input.ErrMessage != nil { data.ErrMessage = input.ErrMessage } } data.Value = &jsonString data.Date = &now data.Status = status return } func setDataSimxLink(simxId, simgosId uint) (data esync.EncounterLink) { data.Simx_Id = simxId data.Simgos_Id = simgosId return } func generateNoKunjung() (int, error) { var lastNumber int // Lock rows for this prefix → prevents race condition if err := dg.IS["simrs"]. Table("t_pendaftaran"). Select("no_kunjung"). Where("tglreg = CURRENT_DATE"). Order("no_kunjung DESC"). Clauses(clause.Locking{Strength: "UPDATE"}). Limit(1). Scan(&lastNumber).Error; err != nil { return 0, err } return lastNumber + 1, nil } func updatePatientCaraBayar(input etp.TPendaftaran, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "started", "DBUpdate") var tx *gorm.DB if len(dbx) > 0 { tx = dbx[0] } else { tx = dg.IS["simrs"] } if err := tx.Model(&ep.MPasien{}). Where("\"nomr\" = ?", input.Nomr). Update("kdcarabayar", input.Kdcarabayar).Error; err != nil { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "update-fail", Detail: "Failed to update patient", Raw: err, } return pl.SetLogError(event, input) } pl.SetLogInfo(event, input, "complete") return nil } func mapContact(contact *[]epc.PersonContact, data *etp.TPendaftaran) { if contact == nil || len(*contact) == 0 { return } for _, c := range *contact { if c.Type_Code == erp.CTPhone || c.Type_Code == erp.CTMPhone { data.PenanggungjawabPhone = c.Value break } } } func mapAddress(addresses *[]epa.PersonAddress, data *etp.TPendaftaran) { if addresses == nil || len(*addresses) == 0 { return } a := (*addresses)[0] data.PenanggungjawabAlamat = a.Address } func setDataTRekammedik(input e.Encounter, tdaftar *etp.TPendaftaran) (data etrm.TRekammedik) { data.TglKirim = tdaftar.Tglreg data.Idxdaftar = tdaftar.Idxdaftar data.Kdpoly = tdaftar.Kdpoly data.JamKirimRm = tdaftar.Tglreg if emp := input.Adm_Employee; emp != nil { if p := emp.Person; p != nil { data.Pengirim = p.Name } } return } func updateCancelTDiagnosaTherapy(idxdaftar uint, enc e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "started", "DBUpdate") var ( tx *gorm.DB userBatal string ) if len(dbx) > 0 { tx = dbx[0] } else { tx = dg.IS["simrs"] } if a := enc.Adm_Employee; a != nil { if u := a.User; u != nil { userBatal = u.Name } } if err := tx.Model(&etdt.TDiagnosaDanTerapi{}). Where("idxdaftar = ?", idxdaftar). Updates(map[string]interface{}{ "status": "BATAL", "user_batal": userBatal, "tgl_batal": &now, }).Error; err != nil { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "update-fail", Detail: "Failed to update patient", Raw: err, } return pl.SetLogError(event, idxdaftar) } pl.SetLogInfo(event, idxdaftar, "complete") return nil }