Files
simrsx-be/internal/use-case/simgos-sync-use-case/encounter/helper.go
T
2025-11-21 20:21:28 +07:00

270 lines
5.8 KiB
Go

/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package encounter
import (
"encoding/json"
epr "simrs-vx/internal/domain/main-entities/person-relative"
erp "simrs-vx/internal/domain/references/person"
"strconv"
erc "simrs-vx/internal/domain/references/common"
ere "simrs-vx/internal/domain/references/encounter"
e "simrs-vx/internal/domain/main-entities/encounter"
esimgos "simrs-vx/internal/domain/simgos-entities/encounter"
esync "simrs-vx/internal/domain/sync-entities/encounter"
esyncLog "simrs-vx/internal/domain/sync-entities/log"
dg "github.com/karincake/apem/db-gorm-pg"
"gorm.io/gorm/clause"
)
func setDataCreate(input *e.Encounter) (data esimgos.TPendaftaran, err error) {
data.Nomr = *input.Patient.Number
data.Tglreg = input.RegisteredAt
// set kddokter
kddokter, _ := strconv.Atoi(*input.Appointment_Doctor_Code)
data.Kddokter = uint(kddokter)
// set kdpoly
kdpoly, _ := strconv.Atoi(*input.Unit_Code)
data.Kdpoly = uint(kdpoly)
// set kdrujuk
setKdrujuk(input.RefType_Code, data)
// set kdcarabayar
setKdcarabayar(input.PaymentMethod_Code, data)
// TODO: shift
// set pasienbaru
if input.NewStatus {
data.Pasienbaru = 1
}
// set nip
if emp := input.Adm_Employee; emp != nil {
if user := emp.User; user != nil {
data.Nip = user.Name
}
}
if ref := input.VclaimReference; ref != nil {
data.Ketrujuk = *ref.SrcCode
data.Norujukan = *ref.Number
data.Tglrujukan = ref.Date
data.Strujukan = 1
} else {
data.Ketrujuk = "TR"
data.Strujukan = 0
}
if p := input.Patient.Person; p != nil {
mapRelative(p.Relatives, data)
if bpjs := p.VclaimMember; bpjs != nil {
data.Nokartu = *bpjs.CardNumber
}
}
data.Jamreg = input.RegisteredAt
// default kelas daftar
data.KelasDaftar = 3
// TODO: st_asal_masuk
// set noAntrian
defaultFromSimx := "rehab"
data.NoAntrian = &defaultFromSimx
// set no_kunjung
noKunjung, err := generateNoKunjung()
if err != nil {
return esimgos.TPendaftaran{}, err
}
data.NoKunjung = uint(noKunjung)
return
}
func setDataUpdate(input *e.Encounter, data esimgos.TPendaftaran) {
// set kddokter
kddokter, _ := strconv.Atoi(*input.Responsible_Doctor_Code)
data.Kddokter = uint(kddokter)
// set kdpoly
kdpoly, _ := strconv.Atoi(*input.Unit_Code)
data.Kdpoly = uint(kdpoly)
// set status
setStatus(input.Discharge_Method_Code, data)
if input.Status_Code == erc.DSCCancel {
data.Status = 11
}
data.Masukpoly = input.StartedAt
data.Keluarpoly = input.FinishedAt
if p := input.Patient.Person; p != nil {
mapRelative(p.Relatives, data)
}
// set petugas_klinik
if emp := input.Adm_Employee; emp != nil {
if user := emp.User; user != nil {
data.PetugasKlinik = user.Name
}
}
return
}
func setKdrujuk(input *ere.RefTypeCode, data esimgos.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 esimgos.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 esimgos.TPendaftaran) {
switch *code {
case ere.DMCHome:
data.Status = 1
case ere.DMCInpatient:
data.Status = 2
case ere.DMCDeathOnArrival:
data.Status = 3
case ere.DMCDeath:
data.Status = 8
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 esimgos.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("COALESCE(MAX(no_kunjung),0)").
Where("tglreg = CURRENT_DATE").
Order("no_kunjung DESC").
Clauses(clause.Locking{Strength: "UPDATE"}).
Scan(&lastNumber).Error; err != nil {
return 0, err
}
return lastNumber + 1, nil
}