270 lines
5.8 KiB
Go
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
|
|
}
|