From 0aa2ed730ca857c1226824f7ff530ccbbf95945d Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 27 Oct 2025 14:34:52 +0700 Subject: [PATCH] add checkin --- .../domain/main-entities/encounter/dto.go | 13 ++-- .../main-handler/encounter/handler.go | 8 ++ .../use-case/main-use-case/encounter/case.go | 44 ++++++----- .../main-use-case/encounter/helper.go | 9 ++- .../use-case/main-use-case/encounter/lib.go | 73 +++++++++++++++++++ 5 files changed, 119 insertions(+), 28 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index d07665f0..b552ba86 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -114,14 +114,11 @@ type DischargeDto struct { } type CheckinDto struct { - Id uint `json:"id"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - Responsible_Doctor_StartedAt *time.Time `json:"responsible_doctor_startedAt"` - Responsible_Doctor_FinishedAt *time.Time `json:"responsible_doctor_finishedAt"` - - Adm_Employee_Id *uint `json:"adm_employee_id"` - Adm_Employee_StartedAt *time.Time `json:"adm_employee_startedAt"` - Adm_Employee_FinishedAt *time.Time `json:"adm_employee_finishedAt"` + Id uint `json:"id"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + Adm_Employee_Id *uint `json:"adm_employee_id"` + StartedAt *time.Time `json:"startedAt"` + FinishedAt *time.Time `json:"finishedAt"` } type ResponseDto struct { diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index ed8b1fbc..a5e74855 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -2,6 +2,7 @@ package encounter import ( "net/http" + "time" rw "github.com/karincake/risoles" sf "github.com/karincake/semprit" @@ -124,6 +125,13 @@ func (obj myBase) CheckIn(w http.ResponseWriter, r *http.Request) { } dto.Id = uint(id) + + // validate startedAt + if dto.StartedAt == nil { + now := time.Now() + dto.StartedAt = &now + } + res, err := u.CheckIn(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 4e41954e..6786eb51 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -2,9 +2,12 @@ package encounter import ( "errors" + eaeh "simrs-vx/internal/domain/main-entities/adm-employee-hist" + erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" + uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist" + urdh "simrs-vx/internal/use-case/main-use-case/responsible-doctor-hist" "strconv" - 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" edc "simrs-vx/internal/domain/main-entities/death-cause" @@ -13,9 +16,8 @@ import ( eem "simrs-vx/internal/domain/main-entities/employee" e "simrs-vx/internal/domain/main-entities/encounter" ei "simrs-vx/internal/domain/main-entities/inpatient" - erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" - - uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist" + erc "simrs-vx/internal/domain/references/common" + ere "simrs-vx/internal/domain/references/encounter" ua "simrs-vx/internal/use-case/main-use-case/ambulatory" uc "simrs-vx/internal/use-case/main-use-case/chemo" udc "simrs-vx/internal/use-case/main-use-case/death-cause" @@ -23,10 +25,6 @@ import ( ue "simrs-vx/internal/use-case/main-use-case/emergency" uem "simrs-vx/internal/use-case/main-use-case/employee" ui "simrs-vx/internal/use-case/main-use-case/inpatient" - urdh "simrs-vx/internal/use-case/main-use-case/responsible-doctor-hist" - - erc "simrs-vx/internal/domain/references/common" - ere "simrs-vx/internal/domain/references/encounter" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -552,34 +550,44 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - if err := updateCheckInData(input, data, &event, tx); err != nil { - return err - } + // Insert responsible_doctor_hist if responsible_doctor_id has changed && update latest history + if input.Responsible_Doctor_Id != nil && *input.Responsible_Doctor_Id != *data.Responsible_Doctor_Id { + // update finishedAt in latest responsible_doctor_hist + if err = updateLatestResponsibleDoctorHist(input, &event, tx); err != nil { + return err + } - if input.Responsible_Doctor_Id != nil { - // insert responsible_doctor_hist + //insert responsible_doctor_hist if _, err = urdh.Create(erdh.CreateDto{ Encounter_Id: &input.Id, Doctor_Id: input.Responsible_Doctor_Id, - StartedAt: input.Responsible_Doctor_StartedAt, - FinishedAt: input.Responsible_Doctor_FinishedAt, + StartedAt: input.StartedAt, }); err != nil { return err } } - if input.Adm_Employee_Id != nil { + // Insert adm_employee_hist if adm_employee_id has changed && update latest history + if input.Adm_Employee_Id != nil && *input.Adm_Employee_Id != *data.Adm_Employee_Id { + // update finishedAt in latest adm_employee_hist + if err = updateLatestAdmEmployeeHist(input, &event, tx); err != nil { + return err + } + // insert responsible_doctor_hist if _, err = uaeh.Create(eaeh.CreateDto{ Encounter_Id: &input.Id, Employee_Id: input.Adm_Employee_Id, - StartedAt: input.Adm_Employee_StartedAt, - FinishedAt: input.Adm_Employee_FinishedAt, + StartedAt: input.StartedAt, }); err != nil { return err } } + if err := updateCheckInData(input, data, &event, tx); err != nil { + return err + } + pl.SetLogInfo(&event, nil, "complete") return nil diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 878a472f..2e74eff6 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -328,8 +328,13 @@ func setDataUpdateStatus(src e.UpdateStatusDto, dst *e.Encounter) { } func setDataCheckIn(src e.CheckinDto, dst *e.Encounter) { - dst.Responsible_Doctor_Id = src.Responsible_Doctor_Id - dst.Adm_Employee_Id = src.Adm_Employee_Id + if src.Responsible_Doctor_Id != nil { + dst.Responsible_Doctor_Id = src.Responsible_Doctor_Id + } + + if src.Adm_Employee_Id != nil { + dst.Adm_Employee_Id = src.Adm_Employee_Id + } } func createInternalReferences(input e.DischargeDto, event *pl.Event, tx *gorm.DB) error { diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index f8bee755..6e960e49 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -3,6 +3,7 @@ package encounter import ( // std "errors" + "fmt" // external dg "github.com/karincake/apem/db-gorm-pg" @@ -15,7 +16,9 @@ import ( pu "simrs-vx/pkg/use-case-helper" // internal + eaeh "simrs-vx/internal/domain/main-entities/adm-employee-hist" e "simrs-vx/internal/domain/main-entities/encounter" + erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" ) func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Encounter, error) { @@ -250,3 +253,73 @@ func updateCheckInData(input e.CheckinDto, data *e.Encounter, event *pl.Event, d pl.SetLogInfo(event, nil, "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) + + fmt.Println(subQuery) + + if err := tx. + Model(&erdh.ResponsibleDoctorHist{}). + Where("\"Id\" = (?)", subQuery). + Update("\"FinishedAt\"", input.StartedAt).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + 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) + + if err := tx. + Model(&eaeh.AdmEmployeeHist{}). + Where("\"Id\" = (?)", subQuery). + Update("\"FinishedAt\"", input.StartedAt).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "Database update failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +}