add cud sync encounter

This commit is contained in:
vanilia
2025-11-21 10:21:21 +07:00
parent 46d0c17669
commit dd5f6f78e3
10 changed files with 364 additions and 135 deletions
@@ -40,7 +40,7 @@ type Encounter struct {
VisitDate time.Time `json:"visitDate"`
StartedAt *time.Time `json:"startedAt"`
FinishedAt *time.Time `json:"finishedAt"`
PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"`
PaymentMethod_Code ere.AllPaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"`
InsuranceCompany_Code *string `json:"insuranceCompany_code"`
InsuranceCompany *ei.InsuranceCompany `json:"insuranceCompany,omitempty" gorm:"foreignKey:InsuranceCompany_Code;references:Code"`
Member_Number *string `json:"memberNumber" gorm:"unique;size:20"`
@@ -99,6 +99,7 @@ const (
APMCJkmm AllPaymentMethodCode = "jkmm" // JKMM
APMCSpm AllPaymentMethodCode = "spm" // SPM
APMCPks AllPaymentMethodCode = "pks" // PKS
APMCUmum AllPaymentMethodCode = "umum"
SRTCInternal SEPRefTypeCode = "internal" // Rujukan Internal
SRTCExternal SEPRefTypeCode = "external" // Faskes Lain
@@ -16,7 +16,7 @@ type TPendaftaran struct {
KeteranganStatus *uint `json:"keterangan_status" gorm:"column:keterangan_status"`
Pasienbaru uint `json:"pasienbaru" gorm:"column:pasienbaru"`
Nip string `json:"nip" gorm:"column:nip"`
Idxdaftar uint `json:"idxdaftar" gorm:"column:idxdaftar"`
Idxdaftar uint `json:"idxdaftar" gorm:"primaryKey;autoIncrement;column:idxdaftar"`
Masukpoly *time.Time `json:"masukpoly" gorm:"column:masukpoly"`
Keluarpoly *time.Time `json:"keluarpoly" gorm:"column:keluarpoly"`
Ketrujuk string `json:"ketrujuk" gorm:"column:ketrujuk"`
+117 -81
View File
@@ -3,7 +3,6 @@ package encounter
import (
"errors"
"fmt"
us "simrs-vx/internal/use-case/main-use-case/soapi"
"strconv"
"time"
@@ -24,11 +23,13 @@ import (
eir "simrs-vx/internal/domain/main-entities/internal-reference"
erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist"
es "simrs-vx/internal/domain/main-entities/soapi"
esync "simrs-vx/internal/domain/sync-entities/log"
uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist"
udc "simrs-vx/internal/use-case/main-use-case/death-cause"
uir "simrs-vx/internal/use-case/main-use-case/internal-reference"
urdh "simrs-vx/internal/use-case/main-use-case/responsible-doctor-hist"
us "simrs-vx/internal/use-case/main-use-case/soapi"
)
const source = "encounter"
@@ -50,34 +51,6 @@ func Create(input e.CreateDto) (*d.Data, error) {
// Start log
pl.SetLogInfo(&event, input, "started", "create")
// validate rehab bpjs
if input.RefTypeCode == ere.RTCBpjs && input.Class_Code == ere.ECAmbulatory && ere.AmbulatoryClassCode(*input.SubClass_Code) == ere.ACCRehab {
// get latest rehab data
recentRehabData, err := getLatestRehabData(input, &event)
if err != nil {
return nil, err
}
if recentRehabData != nil {
// determine VisitModeCode
input.VisitMode_Code, input.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input, &event)
if err != nil {
return nil, err
}
} else {
input.VisitMode_Code = ere.VMCAdm
}
// if visitMode_Code is series, then get data soapi for copy
if input.VisitMode_Code == ere.VMCSeries {
// get data soapi
recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.RecentEncounterAdm, &event)
if err != nil {
return nil, err
}
}
}
// check if user has employee position
if !input.AuthInfo.HasEmployeePosition() {
event.Status = "failed"
@@ -102,17 +75,44 @@ func Create(input e.CreateDto) (*d.Data, error) {
input.Adm_Employee_Id = input.AuthInfo.Employee_Id
}
// check if patient is new in the hospital
input.NewStatus, err = identifyPatientStatus(input)
err = dg.I.Transaction(func(tx *gorm.DB) error {
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil {
return err
// validate rehab by bpjs
if input.RefTypeCode == ere.RTCBpjs &&
input.Class_Code == ere.ECAmbulatory &&
ere.AmbulatoryClassCode(*input.SubClass_Code) == ere.ACCRehab {
// get latest rehab data
recentRehabData, err := getLatestRehabData(input, &event)
if err != nil {
return nil, err
}
// If recentRehabData is nil, then visitMode_Code = "adm"
if recentRehabData != nil {
// If recentRehabData is not nil, determine the visitMode_Code:
// If the mode is "series", verify whether the visit count still remains
// and whether the series has not expired.
input.VisitMode_Code, input.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input, &event)
if err != nil {
return nil, err
}
} else {
input.VisitMode_Code = ere.VMCAdm
}
// When visitMode_Code is "series", load the associated SOAPI record to copy its values.
if input.VisitMode_Code == ere.VMCSeries {
// get data soapi
recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.RecentEncounterAdm, &event)
if err != nil {
return nil, err
}
}
}
// check if patient is new in the hospital
input.NewStatus, err = identifyPatientStatus(input)
mwRunner := newMiddlewareRunner(&event)
err = dg.I.Transaction(func(tx *gorm.DB) error {
// create encounter
if resData, err := CreateData(input, &event, tx); err != nil {
return err
@@ -128,28 +128,36 @@ func Create(input e.CreateDto) (*d.Data, error) {
}
// insert adm_employee_hist
if _, err := uaeh.CreateData(eaeh.CreateDto{
if _, err = uaeh.CreateData(eaeh.CreateDto{
Encounter_Id: &data.Id,
Employee_Id: data.Adm_Employee_Id,
StartedAt: &now}, &event, tx); err != nil {
return err
}
mwRunner.setMwType(pu.MWTPost)
// Run post-middleware
if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil {
dataEncounter, err := ReadDetailData(e.ReadDetailDto{
Id: uint16(data.Id),
Includes: "Adm_Employee.User,Patient.Person.Relatives,Patient.Person.VclaimMember"},
&event, tx)
if err != nil {
return err
}
pl.SetLogInfo(&event, nil, "complete")
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunCreateMiddleware(createPreMw, dataEncounter); err != nil {
return err
}
return nil
})
if err != nil {
if err = runLogMiddleware(err, input, mwRunner); err != nil {
return nil, err
}
pl.SetLogInfo(&event, nil, "complete")
return &d.Data{
Meta: d.II{
"source": source,
@@ -175,7 +183,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) {
pl.SetLogInfo(&event, input, "started", "readList")
err = dg.I.Transaction(func(tx *gorm.DB) error {
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner := newMiddlewareRunner(&event)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil {
@@ -226,7 +234,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
pl.SetLogInfo(&event, input, "started", "readDetail")
err = dg.I.Transaction(func(tx *gorm.DB) error {
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner := newMiddlewareRunner(&event)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil {
@@ -261,7 +269,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
}
func Update(input e.UpdateDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: uint16(input.Id)}
rdDto := e.ReadDetailDto{Id: input.Id}
var data *e.Encounter
var err error
@@ -272,6 +280,7 @@ func Update(input e.UpdateDto) (*d.Data, error) {
// Start log
pl.SetLogInfo(&event, input, "started", "update")
mwRunner := newMiddlewareRunner(&event)
err = dg.I.Transaction(func(tx *gorm.DB) error {
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
@@ -289,32 +298,33 @@ func Update(input e.UpdateDto) (*d.Data, error) {
return pl.SetLogError(&event, input)
}
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil {
return err
}
if err := UpdateData(input, data, &event, tx); err != nil {
return err
}
pl.SetLogInfo(&event, nil, "complete")
dataEncounter, err := ReadDetailData(e.ReadDetailDto{
Id: uint16(data.Id),
Includes: "Adm_Employee.User,Patient.Person.Relatives,Patient.Person.VclaimMember"},
&event, tx)
if err != nil {
return err
}
mwRunner.setMwType(pu.MWTPost)
mwRunner.setMwType(pu.MWTPre)
// Run post-middleware
if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil {
if err := mwRunner.RunUpdateMiddleware(updatePreMw, dataEncounter); err != nil {
return err
}
return nil
})
if err != nil {
if err = runLogMiddleware(err, input, mwRunner); err != nil {
return nil, err
}
pl.SetLogInfo(&event, nil, "complete")
return &d.Data{
Meta: d.IS{
"source": source,
@@ -327,7 +337,7 @@ func Update(input e.UpdateDto) (*d.Data, error) {
}
func Delete(input e.DeleteDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: uint16(input.Id)}
rdDto := e.ReadDetailDto{Id: input.Id}
var data *e.Encounter
var err error
@@ -361,36 +371,33 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
return nil, pl.SetLogError(&event, input)
}
mwRunner := newMiddlewareRunner(&event)
err = dg.I.Transaction(func(tx *gorm.DB) error {
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
return err
}
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil {
return err
}
if err := DeleteData(data, &event, tx); err != nil {
return err
}
mwRunner.setMwType(pu.MWTPost)
// Run post-middleware
if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil {
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunDeleteMiddleware(deletePreMw, &input); err != nil {
return err
}
return nil
})
if err != nil {
if err = runLogMiddleware(err, input, mwRunner); err != nil {
return nil, err
}
pl.SetLogInfo(&event, nil, "complete")
return &d.Data{
Meta: d.IS{
"source": source,
@@ -581,12 +588,12 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) {
}
}
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil {
return err
}
//mwRunner := newMiddlewareRunner(&event)
//mwRunner.setMwType(pu.MWTPre)
//// Run pre-middleware
//if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil {
// return err
//}
if err := UpdateStatusData(input, data, &event, tx); err != nil {
return err
@@ -594,11 +601,11 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) {
pl.SetLogInfo(&event, nil, "complete")
mwRunner.setMwType(pu.MWTPost)
// Run post-middleware
if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil {
return err
}
//mwRunner.setMwType(pu.MWTPost)
//// Run post-middleware
//if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil {
// return err
//}
return nil
})
@@ -915,3 +922,32 @@ func ApproveSwitchUnit(input e.ApproveUnitDto) (*d.Data, error) {
}, nil
}
func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error {
var errMsg string
inputLog := esync.SimxLogDto{
Payload: input,
Method: erc.CCCreate,
}
if err != nil {
// Run log-middleware
errMsg = err.Error()
inputLog.ErrMessage = &errMsg
inputLog.IsSuccess = false
// create log failed
if errMiddleware := mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); errMiddleware != nil {
return errMiddleware
}
return err
}
// create log success
inputLog.IsSuccess = true
if err = mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); err != nil {
return err
}
return nil
}
@@ -1,35 +1,64 @@
package encounter
import (
e "simrs-vx/internal/domain/main-entities/encounter"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
"gorm.io/gorm"
sync "simrs-vx/internal/infra/sync-cfg"
e "simrs-vx/internal/domain/main-entities/encounter"
esync "simrs-vx/internal/domain/sync-entities/log"
)
type middlewareRunner struct {
Event *pl.Event
Tx *gorm.DB
MwType pu.MWType
SyncOn bool
}
// NewMiddlewareExecutor creates a new middleware executor
func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner {
func newMiddlewareRunner(event *pl.Event) *middlewareRunner {
return &middlewareRunner{
Event: event,
Tx: tx,
Event: event,
SyncOn: sync.O.Enable,
}
}
// ExecuteCreateMiddleware executes create middleware
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Encounter) error {
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.Encounter) error {
if !me.SyncOn {
return nil
}
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
logData := pu.GetLogData(input, nil)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
if err := middleware.Func(input); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
pl.SetLogInfo(me.Event, nil, "complete")
}
return nil
}
// ExecuteCreateMiddleware executes create middleware
func (me *middlewareRunner) RunCreateLogMiddleware(middlewares []createLogMw, input *esync.SimxLogDto) error {
if !me.SyncOn {
return nil
}
for _, middleware := range middlewares {
logData := pu.GetLogData(input, nil)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
@@ -39,6 +68,10 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e
}
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Encounter) error {
if !me.SyncOn {
return nil
}
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
@@ -54,6 +87,10 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu
}
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Encounter) error {
if !me.SyncOn {
return nil
}
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
@@ -68,13 +105,17 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw,
return nil
}
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Encounter) error {
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []updateMw, input *e.Encounter) error {
if !me.SyncOn {
return nil
}
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
logData := pu.GetLogData(input, nil)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
if err := middleware.Func(input); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
@@ -83,13 +124,17 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu
return nil
}
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Encounter) error {
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []deleteMw, input *e.DeleteDto) error {
if !me.SyncOn {
return nil
}
for _, middleware := range middlewares {
logData := pu.GetLogData(input, data)
logData := pu.GetLogData(input, nil)
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
if err := middleware.Func(input, data, me.Tx); err != nil {
if err := middleware.Func(input); err != nil {
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
}
@@ -12,13 +12,28 @@ import (
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/encounter"
elog "simrs-vx/internal/domain/sync-entities/log"
)
type createMw struct {
Name string
Func func(input *e.CreateDto, data *e.Encounter, tx *gorm.DB) error
Func func(input *e.Encounter) error
}
type createLogMw struct {
Name string
Func func(input *elog.SimxLogDto) error
}
type updateMw struct {
Name string
Func func(input *e.Encounter) error
}
type deleteMw struct {
Name string
Func func(input *e.DeleteDto) error
}
type readListMw struct {
Name string
Func func(input *e.ReadListDto, data *e.Encounter, tx *gorm.DB) error
@@ -29,16 +44,17 @@ type readDetailMw struct {
Func func(input *e.ReadDetailDto, data *e.Encounter, tx *gorm.DB) error
}
type UpdateMw = readDetailMw
type DeleteMw = readDetailMw
type UpdateMw = updateMw
type DeleteMw = deleteMw
var createPreMw []createMw // preprocess middleware
var createPostMw []createMw // postprocess middleware
var createPreMw []createMw // preprocess middleware
var createPostMw []createMw // postprocess middleware
var createSimxLogMw []createLogMw
var readListPreMw []readListMw // ..
var readListPostMw []readListMw // ..
var readDetailPreMw []readDetailMw
var readDetailPostMw []readDetailMw
var updatePreMw []readDetailMw
var updatePreMw []updateMw
var updatePostMw []readDetailMw
var deletePreMw []readDetailMw
var deletePreMw []deleteMw
var deletePostMw []readDetailMw
@@ -351,8 +351,6 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
return err
}
input.Id = data.Id
// Delete Patient
if err := DeleteData(data, &event, tx); err != nil {
return err
@@ -8,18 +8,18 @@ import (
db "simrs-vx/pkg/dualtrx-helper"
e "simrs-vx/internal/domain/main-entities/division"
esimgos "simrs-vx/internal/domain/simgos-entities/division"
esync "simrs-vx/internal/domain/sync-entities/division"
e "simrs-vx/internal/domain/main-entities/encounter"
esimgos "simrs-vx/internal/domain/simgos-entities/encounter"
esync "simrs-vx/internal/domain/sync-entities/encounter"
elog "simrs-vx/internal/domain/sync-entities/log"
)
const source = "division"
const source = "encounter"
func Create(input e.CreateDto) (*d.Data, error) {
func Create(input e.Encounter) (*d.Data, error) {
var (
sgData *esimgos.MUnit
syncLink *esync.DivisionLink
sgData *esimgos.TPendaftaran
syncLink *esync.EncounterLink
err error
)
@@ -39,7 +39,7 @@ func Create(input e.CreateDto) (*d.Data, error) {
}
// STEP 2: Insert to Link
syncLink, err = CreateLinkData(*input.Id, sgData.KodeUnit, &event, tx.Sync)
syncLink, err = CreateLinkData(input.Id, sgData.Idxdaftar, &event, tx.Sync)
if err != nil {
return err
}
@@ -99,7 +99,7 @@ func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) {
}, nil
}
func Update(input e.UpdateDto) (*d.Data, error) {
func Update(input e.Encounter) (*d.Data, error) {
event := pl.Event{
Feature: "Update",
Source: source,
@@ -109,7 +109,7 @@ func Update(input e.UpdateDto) (*d.Data, error) {
pl.SetLogInfo(&event, input, "started", "update")
// STEP 1: Get Link
syncLink, err := ReadDetailLinkData(*input.Id, &event)
syncLink, err := ReadDetailLinkData(uint16(input.Id), &event)
if err != nil {
return nil, err
}
@@ -147,7 +147,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
pl.SetLogInfo(&event, input, "started", "delete")
// STEP 1: Get Link
syncLink, err := ReadDetailLinkData(*input.Id, &event)
syncLink, err := ReadDetailLinkData(input.Id, &event)
if err != nil {
return nil, err
}
@@ -178,7 +178,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
if err != nil {
if isLinkDeleted {
go func() {
_, _ = CreateLinkData(uint(*input.Id), sgData.KodeUnit, &event)
_, _ = CreateLinkData(uint(input.Id), sgData.Idxdaftar, &event)
}()
}
return nil, err
@@ -6,6 +6,8 @@ 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"
@@ -14,21 +16,68 @@ import (
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/encounter"
esyncLog "simrs-vx/internal/domain/sync-entities/log"
)
func setDataSimgos(input *e.Encounter) (data esimgos.TPendaftaran) {
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 status
setStatus(input.Discharge_Method_Code, data)
if input.Status_Code == erc.DSCCancel {
data.Status = 11
}
// set pasienbaru
if input.NewStatus {
data.Pasienbaru = 1
}
if emp := input.Adm_Employee; emp != nil {
if user := emp.User; user != nil {
data.Nip = user.Name
}
}
data.Masukpoly = input.StartedAt
data.Keluarpoly = input.FinishedAt
if input.RefSource_Name != nil {
data.Ketrujuk = *input.RefSource_Name
} else {
data.Ketrujuk = "TR"
}
// TODO: preload person.relative, person.vclaimMember
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
// TODO: norujukan, tglrujukan, dokumen_pendukung sep_file
return
}
@@ -45,7 +94,91 @@ func setKdrujuk(input *ere.RefTypeCode, data esimgos.TPendaftaran) {
}
}
func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.DivisionSimxLog) {
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)
@@ -67,7 +200,7 @@ func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.DivisionSimxLog) {
return
}
func setDataSimxLink(simxId, simgosId uint) (data esync.DivisionLink) {
func setDataSimxLink(simxId, simgosId uint) (data esync.EncounterLink) {
data.Simx_Id = simxId
data.Simgos_Id = simgosId
return
@@ -9,15 +9,15 @@ import (
dg "github.com/karincake/apem/db-gorm-pg"
"gorm.io/gorm"
e "simrs-vx/internal/domain/main-entities/division"
esimgos "simrs-vx/internal/domain/simgos-entities/division"
esync "simrs-vx/internal/domain/sync-entities/division"
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"
)
var now = time.Now()
func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esimgos.MUnit, error) {
func CreateSimgosData(input e.Encounter, event *pl.Event, dbx ...*gorm.DB) (*esimgos.TPendaftaran, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
data := setDataSimgos(&input)
@@ -37,14 +37,14 @@ func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esi
return &data, nil
}
func ReadDetailSimgosData(simgosId uint16, event *pl.Event) (*esimgos.MUnit, error) {
func ReadDetailSimgosData(simgosId uint16, event *pl.Event) (*esimgos.TPendaftaran, error) {
pl.SetLogInfo(event, simgosId, "started", "DBReadDetail")
data := esimgos.MUnit{}
data := esimgos.TPendaftaran{}
var tx = dg.IS["simrs"]
if err := tx.
Where("\"kode_unit\" = ?", simgosId).
Where("\"idxdaftar\" = ?", simgosId).
First(&data).Error; err != nil {
if processedErr := pu.HandleReadError(err, event, source, simgosId, data); processedErr != nil {
return nil, processedErr
@@ -55,11 +55,11 @@ func ReadDetailSimgosData(simgosId uint16, event *pl.Event) (*esimgos.MUnit, err
return &data, nil
}
func UpdateSimgosData(input e.UpdateDto, dataSimgos *esync.DivisionLink, event *pl.Event, dbx ...*gorm.DB) error {
func UpdateSimgosData(input e.Encounter, dataSimgos *esync.EncounterLink, event *pl.Event, dbx ...*gorm.DB) error {
pl.SetLogInfo(event, input, "started", "DBUpdate")
data := setDataSimgos(&input)
data.KodeUnit = dataSimgos.Simgos_Id
data.Idxdaftar = dataSimgos.Simgos_Id
var tx *gorm.DB
if len(dbx) > 0 {
@@ -82,7 +82,7 @@ func UpdateSimgosData(input e.UpdateDto, dataSimgos *esync.DivisionLink, event *
return nil
}
func HardDeleteSimgosData(data *esimgos.MUnit, event *pl.Event, dbx ...*gorm.DB) error {
func HardDeleteSimgosData(data *esimgos.TPendaftaran, event *pl.Event, dbx ...*gorm.DB) error {
pl.SetLogInfo(event, data, "started", "DBDelete")
var tx *gorm.DB
@@ -107,7 +107,7 @@ func HardDeleteSimgosData(data *esimgos.MUnit, event *pl.Event, dbx ...*gorm.DB)
return nil
}
func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.DivisionLink, error) {
func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.EncounterLink, error) {
pl.SetLogInfo(event, nil, "started", "DBCreate")
data := setDataSimxLink(simxId, simgosId)
@@ -126,9 +126,9 @@ func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*e
return &data, nil
}
func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.DivisionLink, error) {
func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.EncounterLink, error) {
pl.SetLogInfo(event, simxId, "started", "DBReadDetail")
data := esync.DivisionLink{}
data := esync.EncounterLink{}
var tx = dg.I
@@ -144,7 +144,7 @@ func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.DivisionLink, er
return &data, nil
}
func DeleteLinkData(data *esync.DivisionLink, event *pl.Event, dbx ...*gorm.DB) error {
func DeleteLinkData(data *esync.EncounterLink, event *pl.Event, dbx ...*gorm.DB) error {
pl.SetLogInfo(event, data, "started", "DBDelete")
var tx *gorm.DB