fail chemo ongoing

This commit is contained in:
vanilia
2025-12-09 12:11:05 +07:00
parent cef816ecb6
commit 45d883e0b7
10 changed files with 62 additions and 205 deletions
@@ -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
@@ -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 {
@@ -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 {
@@ -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)
@@ -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
}
@@ -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")
@@ -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
}
@@ -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
@@ -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,
@@ -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)
}).