From d34596d3e853e306962d103a748523132fbaecac Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 25 Sep 2025 11:38:04 +0700 Subject: [PATCH] fix (encounter): add open orders guard --- .../use-case/main-use-case/encounter/case.go | 6 +- .../main-use-case/encounter/helper.go | 101 ++++++++++++++++++ .../use-case/main-use-case/encounter/lib.go | 2 +- 3 files changed, 107 insertions(+), 2 deletions(-) diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index c63579cf..3a95e1d0 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -375,7 +375,11 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { return err } - if err := UpdateDischargeData(input, data, &event, tx); err != nil { + if err := updateDischargeData(input, data, &event, tx); err != nil { + return err + } + + if err := checkNewOrdersExist(data.Id, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 5bf73d14..035577df 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -6,9 +6,15 @@ package encounter import ( "errors" + "fmt" + "strings" + e "simrs-vx/internal/domain/main-entities/encounter" es "simrs-vx/internal/domain/main-entities/soapi" + edo "simrs-vx/internal/domain/main-entities/device-order" + emo "simrs-vx/internal/domain/main-entities/material-order" + emco "simrs-vx/internal/domain/main-entities/mcu-order" em "simrs-vx/internal/domain/main-entities/medication" emei "simrs-vx/internal/domain/main-entities/medication-item" emi "simrs-vx/internal/domain/main-entities/medicine-mix" @@ -16,6 +22,7 @@ import ( ep "simrs-vx/internal/domain/main-entities/prescription" epi "simrs-vx/internal/domain/main-entities/prescription-item" + // udo "simrs-vx/internal/use-case/main-use-case/device-order" um "simrs-vx/internal/use-case/main-use-case/medication" umei "simrs-vx/internal/use-case/main-use-case/medication-item" umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" @@ -205,3 +212,97 @@ func createMedicationItem(medication_id uint, input epi.PrescriptionItem, event return nil } + +func checkNewOrdersExist(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "CheckNewOrdersExist") + var errs []string + if err := getDeviceOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if err := getMaterialOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if err := getMcuOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if len(errs) > 0 { + return fmt.Errorf("encounter has open orders: %s", strings.Join(errs, "; ")) + } + + return nil +} + +func getDeviceOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getDeviceOrders") + var orders []edo.DeviceOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get device order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d device orders", len(orders)) + } + + return nil +} + +func getMaterialOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getMaterialOrders") + var orders []emo.MaterialOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get material order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d material orders", len(orders)) + } + + return nil +} + +func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getMcuOrders") + var orders []emco.McuOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get mcu order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d mcu orders", len(orders)) + } + + return nil +} diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index 8653cdbf..108b298a 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -154,7 +154,7 @@ func DeleteData(data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { return nil } -func UpdateDischargeData(input e.DischargeDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { +func updateDischargeData(input e.DischargeDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdateDischarge") setDataDischarge(input, data)