442 lines
9.7 KiB
Go
442 lines
9.7 KiB
Go
/*
|
|
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
|
|
}
|