From 5a5856ccb960c00eb004e216ee06990cc708e519 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 17 Sep 2025 16:35:07 +0700 Subject: [PATCH] waiting for migration --- .../main-handler/encounter/handler.go | 5 + .../main-handler/medication/handler.go | 3 - .../use-case/main-use-case/encounter/case.go | 4 + .../main-use-case/encounter/helper.go | 140 ++++++++++++------ .../main-use-case/medication/helper.go | 3 +- .../main-use-case/medicine-mix/lib.go | 4 + internal/use-case/main-use-case/nurse/lib.go | 6 +- .../use-case/main-use-case/pharmacist/lib.go | 6 +- .../main-use-case/prescription-item/lib.go | 4 + 9 files changed, 123 insertions(+), 52 deletions(-) diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index c2634a91..7484b302 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -72,9 +72,14 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { func (obj myBase) CheckOut(w http.ResponseWriter, r *http.Request) { dto := e.DischargeDto{} + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + dto.Id = uint(id) res, err := u.CheckOut(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/medication/handler.go b/internal/interface/main-handler/medication/handler.go index 5037f2eb..272eae56 100644 --- a/internal/interface/main-handler/medication/handler.go +++ b/internal/interface/main-handler/medication/handler.go @@ -84,9 +84,6 @@ func (obj myBase) Complete(w http.ResponseWriter, r *http.Request) { } dto := e.ReadDetailDto{} - if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { - return - } dto.AuthInfo = *authInfo dto.Id = uint(id) res, err := u.Complete(dto) diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index ed8fa816..437e6b55 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -379,6 +379,10 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { return err } + if err := createMedication(data.Id, &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 94f196bb..5bf73d14 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -9,16 +9,22 @@ import ( e "simrs-vx/internal/domain/main-entities/encounter" es "simrs-vx/internal/domain/main-entities/soapi" - // ep "simrs-vx/internal/domain/main-entities/prescription" - // epi "simrs-vx/internal/domain/main-entities/prescription-item" - // em "simrs-vx/internal/domain/main-entities/medication" + 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" + emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" + ep "simrs-vx/internal/domain/main-entities/prescription" + epi "simrs-vx/internal/domain/main-entities/prescription-item" - // up "simrs-vx/internal/use-case/main-use-case/prescription" - // upi "simrs-vx/internal/use-case/main-use-case/prescription-item" - // um "simrs-vx/internal/use-case/main-use-case/medication" + 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" + ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item" + up "simrs-vx/internal/use-case/main-use-case/prescription" + upi "simrs-vx/internal/use-case/main-use-case/prescription-item" pl "simrs-vx/pkg/logger" - // pu "simrs-vx/pkg/use-case-helper" + pu "simrs-vx/pkg/use-case-helper" erc "simrs-vx/internal/domain/references/common" ero "simrs-vx/internal/domain/references/organization" @@ -109,43 +115,93 @@ func checkSoapiByDocExists(encounter_id uint, event *pl.Event, tx *gorm.DB) erro return pl.SetLogError(event, nil) } -// func createMedication(encounter_id uint, event *pl.Event, tx *gorm.DB) error { -// pl.SetLogInfo(event, nil, "started", "createMedication") +func createMedication(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "createMedication") -// prescription, err := up.ReadDetailData(ep.ReadDetailDto{Id: encounter_id}, event, tx) -// if err != nil { -// return err -// } + prescription, err := up.ReadDetailData(ep.ReadDetailDto{Encounter_Id: &encounter_id}, event, tx) + if err != nil { + return err + } -// prescriptionItem, _, err := upi.ReadListData(epi.ReadListDto{FilterDto: epi.FilterDto{Prescription_Id: &prescription.Id}}, event, tx) -// if err != nil { -// return err -// } + prescriptionItem, _, err := upi.ReadListData(epi.ReadListDto{FilterDto: epi.FilterDto{Prescription_Id: &prescription.Id}}, event, tx) + if err != nil { + return err + } -// if len(prescriptionItem) == 0 { -// return nil -// } + if len(prescriptionItem) == 0 { + return nil + } -// medicationCreate := em.CreateDto{ -// Encounter_Id: &encounter_id, -// IssuedAt: pu.GetTimeNow(), -// } -// medication, err := um.CreateData(medicationCreate, event, tx) -// if err != nil { -// return err -// } + medicationCreate := em.CreateDto{ + Encounter_Id: &encounter_id, + IssuedAt: pu.GetTimeNow(), + } + medication, err := um.CreateData(medicationCreate, event, tx) + if err != nil { + return err + } -// for _, prescriptionItem := range prescriptionItem { -// if prescriptionItem.IsMix { -// continue -// } -// // medication, err := um.ReadDetailData(e.ReadDetailDto{Id: prescriptionItem.Medication_Id}, event, tx) -// // if err != nil { -// // return err -// // } -// // if medication.IsCompleted() { -// // continue -// // } -// // createMedicationItemDist(medication.Id, event, tx) -// } -// } + for _, prescriptionItem := range prescriptionItem { + if prescriptionItem.IsMix { + medMix_id, err := createMedicineMixAndItem(*prescriptionItem.MedicineMix, event, tx) + if err != nil { + return err + } + prescriptionItem.MedicineMix_Id = medMix_id + } + err := createMedicationItem(medication.Id, prescriptionItem, event, tx) + if err != nil { + return err + } + } + return nil +} + +func createMedicineMixAndItem(input emi.MedicineMix, event *pl.Event, tx *gorm.DB) (*uint, error) { + pl.SetLogInfo(event, nil, "started", "createMedicineMix") + + medicineMixCreate := emi.CreateDto{ + Name: input.Name, + } + medicineMix, err := umi.CreateData(medicineMixCreate, event, tx) + if err != nil { + return nil, err + } + + // recreate medicineMixItem with new medicineMix_id to keep medMixItem remain the same for prescriptionItem that is created + for _, medicineMixItem := range input.MixItems { + medicineMixItemCreate := emmi.CreateDto{ + MedicineMix_Id: &medicineMix.Id, + Medicine_Id: medicineMixItem.Medicine_Id, + Dose: medicineMixItem.Dose, + } + _, err := ummi.CreateData(medicineMixItemCreate, event, tx) + if err != nil { + return nil, err + } + + } + return &medicineMix.Id, nil +} + +func createMedicationItem(medication_id uint, input epi.PrescriptionItem, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "createMedicationItem") + + medicationItemCreate := emei.CreateDto{ + Medication_Id: &medication_id, + IsMix: input.IsMix, + Medicine_Id: input.Medicine_Id, + MedicineMix_Id: input.MedicineMix_Id, + Usage: input.Usage, + Interval: input.Interval, + IntervalUnit_Code: input.IntervalUnit_Code, + Quantity: input.Quantity, + } + + _, err := umei.CreateData(medicationItemCreate, event, tx) + if err != nil { + return err + } + + return nil +} diff --git a/internal/use-case/main-use-case/medication/helper.go b/internal/use-case/main-use-case/medication/helper.go index 374eaf1f..63290cb1 100644 --- a/internal/use-case/main-use-case/medication/helper.go +++ b/internal/use-case/main-use-case/medication/helper.go @@ -43,7 +43,7 @@ func createMedicationItemDist(medication_id *uint, event *pl.Event, dbx ...*gorm tx = dg.I } - filterMI := emi.ReadListDto{FilterDto: emi.FilterDto{Medication_Id: medication_id, IsRedeemed: true}} + filterMI := emi.ReadListDto{FilterDto: emi.FilterDto{Medication_Id: medication_id, IsRedeemed: true}, Preloads: []string{"MedicineMix"}} medicationItemList, _, err := umi.ReadListData(filterMI, event, tx) if err != nil { return err @@ -58,6 +58,7 @@ func createMedicationItemDist(medication_id *uint, event *pl.Event, dbx ...*gorm if _, err := umid.CreateData(midCreate, event, tx); err != nil { return err } + } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medicine-mix/lib.go b/internal/use-case/main-use-case/medicine-mix/lib.go index 6a2cf257..162399db 100644 --- a/internal/use-case/main-use-case/medicine-mix/lib.go +++ b/internal/use-case/main-use-case/medicine-mix/lib.go @@ -51,6 +51,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } + tx = tx.Preload("MixItems") + tx = tx. Model(&e.MedicineMix{}). Scopes(gh.Filter(input)). @@ -90,6 +92,8 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = dg.I } + tx = tx.Preload("MixItems") + if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr diff --git a/internal/use-case/main-use-case/nurse/lib.go b/internal/use-case/main-use-case/nurse/lib.go index 468b41c2..adbd1b76 100644 --- a/internal/use-case/main-use-case/nurse/lib.go +++ b/internal/use-case/main-use-case/nurse/lib.go @@ -172,9 +172,9 @@ func GetIdByUserId(user_id *uint, event *pl.Event, dbx ...*gorm.DB) (*uint, erro var nurse_id uint err := tx.Model(&e.Nurse{}). - Select("Nurse.Id as nurse_id"). - Joins("JOIN Employee e ON e.Id = Nurse.Employee_Id"). - Where("e.User_Id = ?", user_id). + Select("\"Nurse\".\"Id\" as nurse_id"). + Joins("JOIN \"Employee\" AS e ON e.\"Id\" = \"Nurse\".\"Employee_Id\""). + Where("e.\"User_Id\" = ?", user_id). Scan(&nurse_id).Error if err != nil { diff --git a/internal/use-case/main-use-case/pharmacist/lib.go b/internal/use-case/main-use-case/pharmacist/lib.go index e9478d70..0038591a 100644 --- a/internal/use-case/main-use-case/pharmacist/lib.go +++ b/internal/use-case/main-use-case/pharmacist/lib.go @@ -172,9 +172,9 @@ func GetIdByUserId(user_id *uint, event *pl.Event, dbx ...*gorm.DB) (*uint, erro var pharmacist_id uint err := tx.Model(&e.Pharmacist{}). - Select("Pharmacist.Id as pharmacist_id"). - Joins("JOIN Employee e ON e.Id = Pharmacist.Employee_Id"). - Where("e.User_Id = ?", user_id). + Select("\"Pharmacist\".\"Id\" as pharmacist_id"). + Joins("JOIN \"Employee\" as e ON e.\"Id\" = \"Pharmacist\".\"Employee_Id\""). + Where("e.\"User_Id\" = ?", user_id). Scan(&pharmacist_id).Error if err != nil { diff --git a/internal/use-case/main-use-case/prescription-item/lib.go b/internal/use-case/main-use-case/prescription-item/lib.go index 800096fd..70913046 100644 --- a/internal/use-case/main-use-case/prescription-item/lib.go +++ b/internal/use-case/main-use-case/prescription-item/lib.go @@ -51,6 +51,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } + tx = tx.Preload("MedicineMix").Preload("MedicineMix.MixItems") + if len(input.Preloads) > 0 { for _, preload := range input.Preloads { tx = tx.Preload(preload) @@ -96,6 +98,8 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = dg.I } + tx = tx.Preload("MedicineMix").Preload("MedicineMix.MixItems") + if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr