diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index c188bb1a..4d814ed0 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -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"` diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 532e1625..66025373 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -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 diff --git a/internal/domain/simgos-entities/encounter/entity.go b/internal/domain/simgos-entities/encounter/entity.go index 16ba873e..cd8f538d 100644 --- a/internal/domain/simgos-entities/encounter/entity.go +++ b/internal/domain/simgos-entities/encounter/entity.go @@ -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"` diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index e3d564ff..37e08bc5 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -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 +} diff --git a/internal/use-case/main-use-case/encounter/middleware-runner.go b/internal/use-case/main-use-case/encounter/middleware-runner.go index 1448a7af..b030d286 100644 --- a/internal/use-case/main-use-case/encounter/middleware-runner.go +++ b/internal/use-case/main-use-case/encounter/middleware-runner.go @@ -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) } diff --git a/internal/use-case/main-use-case/encounter/tycovar.go b/internal/use-case/main-use-case/encounter/tycovar.go index 17890a1b..f618bd19 100644 --- a/internal/use-case/main-use-case/encounter/tycovar.go +++ b/internal/use-case/main-use-case/encounter/tycovar.go @@ -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 diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 0ed93bbe..24aa4394 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -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 diff --git a/internal/use-case/simgos-sync-use-case/encounter/case.go b/internal/use-case/simgos-sync-use-case/encounter/case.go index 57650594..591dae36 100644 --- a/internal/use-case/simgos-sync-use-case/encounter/case.go +++ b/internal/use-case/simgos-sync-use-case/encounter/case.go @@ -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 diff --git a/internal/use-case/simgos-sync-use-case/encounter/helper.go b/internal/use-case/simgos-sync-use-case/encounter/helper.go index 6fb47ac9..b9daa7de 100644 --- a/internal/use-case/simgos-sync-use-case/encounter/helper.go +++ b/internal/use-case/simgos-sync-use-case/encounter/helper.go @@ -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 diff --git a/internal/use-case/simgos-sync-use-case/encounter/lib.go b/internal/use-case/simgos-sync-use-case/encounter/lib.go index f713ca6c..9ccf433c 100644 --- a/internal/use-case/simgos-sync-use-case/encounter/lib.go +++ b/internal/use-case/simgos-sync-use-case/encounter/lib.go @@ -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