From 721b549e59ee772da472f75a1a7ad4fb9c24a2c7 Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 1 Dec 2025 12:33:13 +0700 Subject: [PATCH] update entity encounter and apply sync from old source --- .../domain/main-entities/encounter/dto.go | 55 +++++++----- internal/domain/main-entities/patient/dto.go | 1 + .../interface/main-handler/patient/handler.go | 16 ++++ .../use-case/main-use-case/encounter/case.go | 47 ++-------- .../main-use-case/encounter/helper.go | 89 ++++++++++++------- .../use-case/main-use-case/encounter/lib.go | 9 +- .../encounter/middleware-runner.go | 9 +- .../use-case/main-use-case/patient/case.go | 35 +------- .../patient/middleware-runner.go | 9 +- 9 files changed, 141 insertions(+), 129 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 8dd9a0a1..a2551ab7 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -34,28 +34,39 @@ import ( ) type CreateDto struct { - Patient_Id *uint `json:"patient_id"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` - SubClass_Code *string `json:"subClass_code" validate:"maxLength=10"` // for sub - Infra_Code *string `json:"infra_code"` // for inpatient - Unit_Code *string `json:"unit_code"` - Specialist_Code *string `json:"specialist_code"` - Subspecialist_Code *string `json:"subspecialist_code"` - VisitDate time.Time `json:"visitDate"` - PaymentMethod_Code ere.AllPaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` - InsuranceCompany_Code *string `json:"insuranceCompany_code"` - Member_Number *string `json:"member_number" validate:"maxLength=20"` - Ref_Number *string `json:"ref_number" validate:"maxLength=20"` - Trx_Number *string `json:"trx_number" validate:"maxLength=20"` - Appointment_Doctor_Code *string `json:"appointment_doctor_code"` - Adm_Employee_Id *uint `json:"-"` - Responsible_Doctor_Code *string `json:"responsible_doctor_code"` - RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` - Appointment_Id *uint `json:"appointment_id"` - RefTypeCode ere.RefTypeCode `json:"refTypeCode"` - NewStatus bool `json:"newStatus"` - VclaimReference *TRujukan `json:"vclaimReference"` + Patient_Id *uint `json:"patient_id"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` + SubClass_Code *string `json:"subClass_code" validate:"maxLength=10"` // for sub + Infra_Code *string `json:"infra_code"` // for inpatient + Unit_Code *string `json:"unit_code"` + Specialist_Code *string `json:"specialist_code"` + Subspecialist_Code *string `json:"subspecialist_code"` + VisitDate time.Time `json:"visitDate"` + StartedAt *time.Time `json:"startedAt"` + FinishedAt *time.Time `json:"finishedAt"` + PaymentMethod_Code ere.AllPaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` + InsuranceCompany_Code *string `json:"insuranceCompany_code"` + Member_Number *string `json:"member_number" validate:"maxLength=20"` + RefTypeCode ere.RefTypeCode `json:"refTypeCode"` + Ref_Number *string `json:"ref_number" validate:"maxLength=20"` + Trx_Number *string `json:"trx_number" validate:"maxLength=20"` + Appointment_Doctor_Code *string `json:"appointment_doctor_code"` + Adm_Employee_Id *uint `json:"-"` + Responsible_Doctor_Code *string `json:"responsible_doctor_code"` + Responsible_Nurse_Code *string `json:"responsible_nurse_code"` + Discharge_Method_Code *ere.DischargeMethodCode `json:"discharge_method_code" gorm:"size:16"` + RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` + Appointment_Id *uint `json:"appointment_id"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:10"` + Discharge_Date *time.Time `json:"discharge_date"` + DeathCause *edc.DeathCause `json:"deathCause"` + NewStatus bool `json:"newStatus"` + VclaimReference *TRujukan `json:"vclaimReference"` Id uint `json:"-"` RecentEncounterAdm *Encounter `json:"-"` // if subClass_Code is rehab diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index 6418c6ac..248a7164 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -60,6 +60,7 @@ type UpdateDto struct { type DeleteDto struct { Id uint `json:"id"` + pa.AuthInfo } type SearchDto struct { diff --git a/internal/interface/main-handler/patient/handler.go b/internal/interface/main-handler/patient/handler.go index 41fca562..653a06cc 100644 --- a/internal/interface/main-handler/patient/handler.go +++ b/internal/interface/main-handler/patient/handler.go @@ -63,7 +63,15 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.Id = uint(id) + dto.AuthInfo = *authInfo + res, err := u.Update(dto) rw.DataResponse(w, res, err) } @@ -75,7 +83,15 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { } dto := e.DeleteDto{} + + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.Id = uint(id) + dto.AuthInfo = *authInfo + res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index bc4ba1ba..19c9da70 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -94,7 +94,7 @@ func Create(input e.CreateDto) (*d.Data, error) { input.NewStatus, err = identifyPatientStatus(input) input.Adm_Employee_Id = input.AuthInfo.Employee_Id - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { // create encounter @@ -158,7 +158,6 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.Encounter var dataList []e.Encounter var metaList *e.MetaDto var err error @@ -172,23 +171,9 @@ 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) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { - return err - } - if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -223,23 +208,9 @@ 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) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { - return err - } - if data, err = ReadDetailData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -277,7 +248,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } input.Adm_Employee_Id = input.AuthInfo.Employee_Id - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -352,7 +323,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -436,7 +407,7 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -561,7 +532,7 @@ func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -664,7 +635,7 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { input.StartedAt = &now } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -767,7 +738,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { } input.Src_Nurse_Code = input.AuthInfo.Nurse_Code - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -861,7 +832,7 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -976,7 +947,7 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { return nil, err } - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 02ade837..f606eb7c 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -65,44 +65,71 @@ import ( us "simrs-vx/internal/use-case/main-use-case/soapi" ) -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { - var inputSrc *e.CreateDto - if inputT, ok := any(input).(*e.CreateDto); ok { - inputSrc = inputT - data.Status_Code = erc.DSCNew - } else { - inputTemp := any(input).(*e.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - data.Patient_Id = inputSrc.Patient_Id - data.RegisteredAt = inputSrc.RegisteredAt - data.Class_Code = inputSrc.Class_Code - data.Unit_Code = inputSrc.Unit_Code - data.Specialist_Code = inputSrc.Specialist_Code - data.Subspecialist_Code = inputSrc.Subspecialist_Code - data.VisitDate = inputSrc.VisitDate - data.PaymentMethod_Code = inputSrc.PaymentMethod_Code - data.InsuranceCompany_Code = inputSrc.InsuranceCompany_Code - data.Member_Number = inputSrc.Member_Number - data.Ref_Number = inputSrc.Ref_Number - data.Trx_Number = inputSrc.Trx_Number - data.Appointment_Doctor_Code = inputSrc.Appointment_Doctor_Code - data.Adm_Employee_Id = inputSrc.Adm_Employee_Id - data.Responsible_Doctor_Code = inputSrc.Responsible_Doctor_Code - data.RefSource_Name = inputSrc.RefSource_Name - data.Appointment_Id = inputSrc.Appointment_Id - data.RefType_Code = &inputSrc.RefTypeCode - data.NewStatus = inputSrc.NewStatus +func setDataCreate(input *e.CreateDto, data *e.Encounter) { + data.Patient_Id = input.Patient_Id + data.RegisteredAt = input.RegisteredAt + data.Class_Code = input.Class_Code + data.Unit_Code = input.Unit_Code + data.Specialist_Code = input.Specialist_Code + data.Subspecialist_Code = input.Subspecialist_Code + data.VisitDate = input.VisitDate + data.PaymentMethod_Code = input.PaymentMethod_Code + data.InsuranceCompany_Code = input.InsuranceCompany_Code + data.Member_Number = input.Member_Number + data.RefType_Code = &input.RefTypeCode + data.Ref_Number = input.Ref_Number + data.Trx_Number = input.Trx_Number + data.Appointment_Doctor_Code = input.Appointment_Doctor_Code + data.Adm_Employee_Id = input.Adm_Employee_Id + data.RefSource_Name = input.RefSource_Name + data.Appointment_Id = input.Appointment_Id + data.Status_Code = erc.DSCNew + data.NewStatus = input.NewStatus } func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { - dst.Appointment_Doctor_Code = src.Appointment_Doctor_Code - dst.Responsible_Doctor_Code = src.Responsible_Doctor_Code dst.Unit_Code = src.Unit_Code dst.Specialist_Code = src.Specialist_Code dst.Subspecialist_Code = src.Subspecialist_Code dst.VisitDate = src.VisitDate + dst.Appointment_Doctor_Code = src.Appointment_Doctor_Code + dst.Adm_Employee_Id = src.Adm_Employee_Id + dst.Appointment_Id = src.Appointment_Id + dst.RefSource_Name = src.RefSource_Name + dst.Trx_Number = src.Trx_Number + dst.Ref_Number = src.Ref_Number + dst.Member_Number = src.Member_Number +} + +func setDataUpdateFromSource(input *e.UpdateDto, data *e.Encounter) { + data.Patient_Id = input.Patient_Id + data.RegisteredAt = input.RegisteredAt + data.Unit_Code = input.Unit_Code + data.Specialist_Code = input.Specialist_Code + data.Subspecialist_Code = input.Subspecialist_Code + data.VisitDate = input.VisitDate + data.StartedAt = input.StartedAt + data.FinishedAt = input.FinishedAt + data.PaymentMethod_Code = input.PaymentMethod_Code + data.InsuranceCompany_Code = input.InsuranceCompany_Code + data.Member_Number = input.Member_Number + data.RefType_Code = &input.RefTypeCode + data.Ref_Number = input.Ref_Number + data.Trx_Number = input.Trx_Number + data.Appointment_Doctor_Code = input.Appointment_Doctor_Code + data.Adm_Employee_Id = input.Adm_Employee_Id + data.Responsible_Doctor_Code = input.Responsible_Doctor_Code + data.Discharge_Method_Code = input.Discharge_Method_Code + data.RefSource_Name = input.RefSource_Name + data.Appointment_Id = input.Appointment_Id + data.EarlyEducation = input.EarlyEducation + data.MedicalDischargeEducation = input.MedicalDischargeEducation + data.AdmDischargeEducation = input.AdmDischargeEducation + data.DischargeReason = input.DischargeReason + data.Status_Code = input.Status_Code + data.Discharge_Date = input.Discharge_Date + data.NewStatus = input.NewStatus + data.Responsible_Nurse_Code = input.Responsible_Nurse_Code } func setDataDischarge(src e.DischargeDto, dst *e.Encounter) { diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index 0b14b925..4a02973a 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -25,7 +25,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Encount pl.SetLogInfo(event, nil, "started", "DBCreate") data := e.Encounter{} - setData(&input, &data) + setDataCreate(&input, &data) var tx *gorm.DB if len(dbx) > 0 { @@ -109,7 +109,12 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e func UpdateData(input e.UpdateDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - setDataUpdate(input, data) + + if input.Sync { + setDataUpdateFromSource(&input, data) + } else { + setDataUpdate(input, data) + } var tx *gorm.DB if len(dbx) > 0 { 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 4481443b..da62fdb6 100644 --- a/internal/use-case/main-use-case/encounter/middleware-runner.go +++ b/internal/use-case/main-use-case/encounter/middleware-runner.go @@ -20,10 +20,15 @@ type middlewareRunner struct { } // NewMiddlewareExecutor creates a new middleware executor -func newMiddlewareRunner(event *pl.Event) *middlewareRunner { +func newMiddlewareRunner(event *pl.Event, syncFromOldSource bool) *middlewareRunner { + activateSync := sync.O.Enable + if syncFromOldSource { + activateSync = false + } + return &middlewareRunner{ Event: event, - SyncOn: sync.O.Enable, + SyncOn: activateSync, } } diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 24aa4394..7362bf7a 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -37,7 +37,7 @@ func Create(input e.CreateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "create") - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) // check if user has employee position if !input.AuthInfo.HasEmployeePosition() { @@ -143,7 +143,6 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.Patient var dataList []e.Patient var metaList *e.MetaDto var err error @@ -157,23 +156,9 @@ 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) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { - return err - } - if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -208,23 +193,9 @@ 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) - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { - return err - } - if data, err = ReadDetailData(input, &event, tx); err != nil { return err } - - mwRunner.setMwType(pu.MWTPost) - // Run post-middleware - if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { - return err - } - return nil }) @@ -254,7 +225,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "update") - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") @@ -343,7 +314,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "delete") - mwRunner := newMiddlewareRunner(&event) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") diff --git a/internal/use-case/main-use-case/patient/middleware-runner.go b/internal/use-case/main-use-case/patient/middleware-runner.go index 0e085514..0cc10e27 100644 --- a/internal/use-case/main-use-case/patient/middleware-runner.go +++ b/internal/use-case/main-use-case/patient/middleware-runner.go @@ -20,10 +20,15 @@ type middlewareRunner struct { } // NewMiddlewareExecutor creates a new middleware executor -func newMiddlewareRunner(event *pl.Event) *middlewareRunner { +func newMiddlewareRunner(event *pl.Event, syncFromOldSource bool) *middlewareRunner { + activateSync := sync.O.Enable + if syncFromOldSource { + activateSync = false + } + return &middlewareRunner{ Event: event, - SyncOn: sync.O.Enable, + SyncOn: activateSync, } }