From 45d883e0b748dcc0809417899135e52e187609d1 Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 9 Dec 2025 12:11:05 +0700 Subject: [PATCH] fail chemo ongoing --- .../domain/main-entities/chemo-plan/dto.go | 8 +- internal/domain/main-entities/chemo/dto.go | 3 + .../domain/main-entities/encounter/dto.go | 2 +- .../use-case/main-use-case/chemo-plan/case.go | 4 +- .../main-use-case/chemo-plan/helper.go | 4 +- .../use-case/main-use-case/chemo-plan/lib.go | 2 +- .../main-use-case/encounter/helper.go | 231 +++--------------- .../use-case/main-use-case/encounter/lib.go | 8 +- internal/use-case/main-use-case/soapi/case.go | 3 +- .../use-case/main-use-case/soapi/helper.go | 2 +- 10 files changed, 62 insertions(+), 205 deletions(-) diff --git a/internal/domain/main-entities/chemo-plan/dto.go b/internal/domain/main-entities/chemo-plan/dto.go index 04be0ebc..d83af082 100644 --- a/internal/domain/main-entities/chemo-plan/dto.go +++ b/internal/domain/main-entities/chemo-plan/dto.go @@ -18,6 +18,7 @@ type CreateDto struct { RealizationDate *time.Time `json:"realizationDate"` Notes *string `json:"notes"` Status ere.StatusProtocolChemo `json:"status"` + Encounter_Id *uint `json:"encounter_id"` } type ReadListDto struct { @@ -45,6 +46,11 @@ type DeleteDto struct { Id uint `json:"id"` } +type FailDto struct { + Id uint `json:"id"` + Reasons *string `json:"reason"` +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` @@ -71,7 +77,7 @@ func (d ChemoPlan) ToResponse() ResponseDto { PlanDate: d.PlanDate, RealizationDate: d.RealizationDate, Notes: d.Notes, - Status: *d.Status, + Status: d.Status, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index 695c1ca7..a6cab3d7 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -2,6 +2,8 @@ package chemo import ( ed "simrs-vx/internal/domain/main-entities/doctor" + ere "simrs-vx/internal/domain/references/encounter" + // std "time" @@ -22,6 +24,7 @@ type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataVerifiedCode `json:"status_code"` SrcUnit_Code *string `json:"srcUnit_code"` + Class_Code ere.ChemoClassCode `json:"class_code"` } type ReadListDto struct { diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 1a9aa2e6..35dc50dc 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -118,7 +118,7 @@ type FilterDto struct { MedicalDischargeEducation *string `json:"medicalDischargeEducation"` AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` - SubProcess *string `json:"subProcess"` + ChemoClass *ere.ChemoClassCode `json:"chemo-class"` } type ReadDetailDto struct { diff --git a/internal/use-case/main-use-case/chemo-plan/case.go b/internal/use-case/main-use-case/chemo-plan/case.go index f58f19ca..99ef3a63 100644 --- a/internal/use-case/main-use-case/chemo-plan/case.go +++ b/internal/use-case/main-use-case/chemo-plan/case.go @@ -176,7 +176,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } - if err := UpdateData(&input, data, &event, tx); err != nil { + if err := UpdateData(data, &event, tx); err != nil { return err } @@ -252,3 +252,5 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Fail(i) diff --git a/internal/use-case/main-use-case/chemo-plan/helper.go b/internal/use-case/main-use-case/chemo-plan/helper.go index 6a072ea3..dedacfd8 100644 --- a/internal/use-case/main-use-case/chemo-plan/helper.go +++ b/internal/use-case/main-use-case/chemo-plan/helper.go @@ -23,7 +23,7 @@ func setDataCreate(input *ep.CreateDto) (data []e.ChemoPlan) { } status := ere.SPCPlanned - data[0].Status = &status + data[0].Status = status return } @@ -32,5 +32,5 @@ func setDataUpdate(data *e.ChemoPlan) { data.RealizationDate = &now status := ere.SPCComplete - data.Status = &status + data.Status = status } diff --git a/internal/use-case/main-use-case/chemo-plan/lib.go b/internal/use-case/main-use-case/chemo-plan/lib.go index 3dee0130..b90430cd 100644 --- a/internal/use-case/main-use-case/chemo-plan/lib.go +++ b/internal/use-case/main-use-case/chemo-plan/lib.go @@ -116,7 +116,7 @@ func UpdateData(data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { Detail: "Database update failed", Raw: err, } - return pl.SetLogError(event, input) + return pl.SetLogError(event, data) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 7f263bfe..6fc28632 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -7,7 +7,7 @@ package encounter import ( "errors" "fmt" - un "simrs-vx/internal/use-case/main-use-case/nurse" + "strings" "time" @@ -24,9 +24,9 @@ import ( ere "simrs-vx/internal/domain/references/encounter" erg "simrs-vx/internal/domain/references/organization" - eaeh "simrs-vx/internal/domain/main-entities/adm-employee-hist" ea "simrs-vx/internal/domain/main-entities/ambulatory" ec "simrs-vx/internal/domain/main-entities/chemo" + ecpl "simrs-vx/internal/domain/main-entities/chemo-plan" edo "simrs-vx/internal/domain/main-entities/device-order" ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/emergency" @@ -42,12 +42,9 @@ import ( ep "simrs-vx/internal/domain/main-entities/prescription" epi "simrs-vx/internal/domain/main-entities/prescription-item" er "simrs-vx/internal/domain/main-entities/rehab" - erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" es "simrs-vx/internal/domain/main-entities/soapi" eu "simrs-vx/internal/domain/main-entities/unit" - // udo "simrs-vx/internal/use-case/main-use-case/device-order" - uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist" ua "simrs-vx/internal/use-case/main-use-case/ambulatory" uc "simrs-vx/internal/use-case/main-use-case/chemo" ud "simrs-vx/internal/use-case/main-use-case/doctor" @@ -58,10 +55,10 @@ import ( umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item" _ "simrs-vx/internal/use-case/main-use-case/nurse" + un "simrs-vx/internal/use-case/main-use-case/nurse" up "simrs-vx/internal/use-case/main-use-case/prescription" upi "simrs-vx/internal/use-case/main-use-case/prescription-item" ur "simrs-vx/internal/use-case/main-use-case/rehab" - urdh "simrs-vx/internal/use-case/main-use-case/responsible-doctor-hist" us "simrs-vx/internal/use-case/main-use-case/soapi" ) @@ -396,192 +393,6 @@ func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { return nil } -func upsertResponsibleDoctorHist(input erdh.CreateDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - var latest erdh.ResponsibleDoctorHist - err := tx. - Where("\"Encounter_Id\" = ?", input.Encounter_Id). - Order("\"CreatedAt\" DESC"). - Limit(1). - First(&latest).Error - - switch { - case errors.Is(err, gorm.ErrRecordNotFound): - // Insert - if _, err = urdh.CreateData(input, event, tx); err != nil { - return err - } - case err != nil: - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "read-fail", - Detail: "Failed to read responsible doctor history", - Raw: err, - } - return pl.SetLogError(event, input) - default: - // Update - if err := tx.Model(&latest).Updates(map[string]interface{}{ - "Doctor_Code": input.Doctor_Code, - "StartedAt": input.StartedAt, - "UpdatedAt": time.Now(), - }).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "update-fail", - Detail: "Failed to update responsible doctor history", - Raw: err, - } - return pl.SetLogError(event, input) - } - } - pl.SetLogInfo(event, input, "complete") - return nil -} - -func upsertAdmEmployeeHist(input eaeh.CreateDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - var latest eaeh.AdmEmployeeHist - err := tx. - Where("\"Encounter_Id\" = ?", input.Encounter_Id). - Order("\"CreatedAt\" DESC"). - Limit(1). - First(&latest).Error - - switch { - case errors.Is(err, gorm.ErrRecordNotFound): - // Insert - if _, err = uaeh.CreateData(input, event, tx); err != nil { - return err - } - case err != nil: - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "read-fail", - Detail: "Failed to read responsible doctor history", - Raw: err, - } - return pl.SetLogError(event, input) - - default: - // Update - if err := tx.Model(&latest).Updates(map[string]interface{}{ - "Employee_Id": input.Employee_Id, - "StartedAt": input.StartedAt, - "UpdatedAt": time.Now(), - }).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "update-fail", - Detail: "Failed to update responsible doctor history", - Raw: err, - } - return pl.SetLogError(event, input) - } - } - pl.SetLogInfo(event, input, "complete") - - return nil -} - -func updateLatestResponsibleDoctorHist(input e.CheckinDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, "started", "DBUpdate") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - subQuery := tx. - Select("\"Id\""). - Model(&erdh.ResponsibleDoctorHist{}). - Where("\"Encounter_Id\" = ?", input.Id). - Order("\"CreatedAt\" DESC"). - Limit(1) - - result := tx. - Model(&erdh.ResponsibleDoctorHist{}). - Where("\"Id\" = (?)", subQuery). - Update("\"FinishedAt\"", input.FinishedAt) - - if result.Error != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-update-fail", - Detail: "Database update failed", - Raw: result.Error, - } - return pl.SetLogError(event, input) - } - - if result.RowsAffected == 0 { - pl.SetLogInfo(event, input, "no previous data found to update") - return nil - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} - -func updateLatestAdmEmployeeHist(input e.CheckinDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, "started", "DBUpdate") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - subQuery := tx. - Select("\"Id\""). - Model(&eaeh.AdmEmployeeHist{}). - Where("\"Encounter_Id\" = ?", input.Id). - Order("\"CreatedAt\" DESC"). - Limit(1) - - result := tx. - Model(&eaeh.AdmEmployeeHist{}). - Where("\"Id\" = (?)", subQuery). - Update("\"FinishedAt\"", input.FinishedAt) - - if result.Error != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-update-fail", - Detail: "Database update failed", - Raw: result.Error, - } - return pl.SetLogError(event, input) - } - - if result.RowsAffected == 0 { - pl.SetLogInfo(event, input, "no previous data found to update") - return nil - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} - func getSoapiByResponsibleDoctor(enc e.Encounter, event *pl.Event) (data []es.Soapi, err error) { pl.SetLogInfo(event, enc, "started", "DBReadList") @@ -856,6 +667,7 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e Encounter_Id: &input.Id, Status_Code: erc.DVCVerified, SrcUnit_Code: input.Unit_Code, + Class_Code: ere.CCCAct, } // create data chemo @@ -864,6 +676,12 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e return err } + // set chemo-plan to planned + _, err = updateChemoPlan(*input.Patient_Id, event, tx) + if err != nil { + return err + } + case subCode == ere.ACCRehab: rehabData := er.CreateDto{ Encounter_Id: &input.Id, @@ -1056,3 +874,32 @@ func validateDoctorCodes(doctorCodes map[string]struct{}, event *pl.Event) error return nil } + +func updateChemoPlan(patientId uint, event *pl.Event, dbx ...*gorm.DB) (*ecpl.ChemoPlan, error) { + pl.SetLogInfo(event, nil, "started", "getChemoFromEncounter") + data := ecpl.ChemoPlan{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx.Model(&ecpl.ChemoPlan{}). + Joins(`"ChemoProtocol" cp ON cp."Id" = "ChemoPlan"."Protocol_Id"`). + Where(`cp."Patient_Id" = ? AND ("ChemoPlan"."Status" IS NULL OR "ChemoPlan"."Status" = ?)`, patientId, ere.SPCSchedule). + Order(`"Id" ASC`). + Limit(1).First(&data) + + if err := tx.Error; err != nil { + return nil, err + } + + if err := tx.Model(&data).Update(`"Status"`, ere.SPCPlanned).Error; err != nil { + return nil, err + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index 674a84a4..a54c2f03 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -93,11 +93,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En tx = tx.Where("\"Encounter\".\"PaymentMethod_Code\" = ?", *input.PaymentMethod_Code) } - if input.SubProcess != nil { - switch *input.SubProcess { - case "chemo": - tx = tx.Joins(`RIGHT JOIN "Chemo" "c" ON "c"."Encounter_Id" = "Encounter"."Id"`) - } + if input.ChemoClass != nil { + tx = tx.Joins(`RIGHT JOIN "Chemo" "c" ON "c"."Encounter_Id" = "Encounter"."Id"`). + Where(`"c"."Class_Code" = ?`, *input.ChemoClass) } // count diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index 3bf68d7c..6b93fd8a 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -56,11 +56,12 @@ func Create(input e.CreateDto) (*d.Data, error) { // update chemoPlan if chemoPlan != nil { + chemoPlan.Encounter_Id = input.Encounter_Id if err = ucp.UpdateData(chemoPlan, &event, tx); err != nil { return err } } - + // get detail for sync soapiData, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, diff --git a/internal/use-case/main-use-case/soapi/helper.go b/internal/use-case/main-use-case/soapi/helper.go index dc251882..7d5e7825 100644 --- a/internal/use-case/main-use-case/soapi/helper.go +++ b/internal/use-case/main-use-case/soapi/helper.go @@ -134,7 +134,7 @@ func getChemo(patientId uint, event *pl.Event) (*ecp.ChemoProtocol, error) { tx = tx.Model(&ecp.ChemoProtocol{}). Joins(`"ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`). - Where(`"Patient.Id" = ? AND (cp.Status = ? OR cp.Status IS NULL)`, patientId, ere.SPCPlanned). + Where(`"Patient.Id" = ? AND cp."Status" = ?`, patientId, ere.SPCPlanned). Preload("ChemoPlans", func(db *gorm.DB) *gorm.DB { return tx.Order(`"Id" ASC`).Limit(1) }).