wip encounter + medication

This commit is contained in:
dpurbosakti
2025-09-17 11:47:03 +07:00
parent c8e32e8239
commit 86a073164d
14 changed files with 164 additions and 57 deletions
@@ -17,6 +17,8 @@ type CreateDto struct {
Interval uint8 `json:"interval"`
IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"`
IsRedeemed bool `json:"isRedeemed"`
Quantity float64 `json:"quantity"`
Note *string `json:"note" gorm:"size:1024"`
}
type ReadListDto struct {
@@ -34,6 +36,8 @@ type FilterDto struct {
Interval uint8 `json:"interval"`
IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"`
IsRedeemed bool `json:"isRedeemed"`
Quantity float64 `json:"quantity"`
Note *string `json:"note" gorm:"size:1024"`
Page int `json:"page"`
PageSize int `json:"page_size"`
@@ -71,6 +75,8 @@ type ResponseDto struct {
Interval uint8 `json:"interval"`
IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"`
IsRedeemed bool `json:"isRedeemed"`
Quantity float64 `json:"quantity"`
Note *string `json:"note" gorm:"size:1024"`
}
func (d MedicationItem) ToResponse() ResponseDto {
@@ -86,6 +92,8 @@ func (d MedicationItem) ToResponse() ResponseDto {
Interval: d.Interval,
IntervalUnit_Code: d.IntervalUnit_Code,
IsRedeemed: d.IsRedeemed,
Quantity: d.Quantity,
Note: d.Note,
}
resp.Main = d.Main
return resp
@@ -35,18 +35,19 @@ type FilterDto struct {
NoPagination int `json:"no_pagination"`
}
type ReadDetailDto struct {
Id uint16 `json:"id"`
Id uint `json:"id"`
Encounter_Id *uint `json:"encounter_id"`
pa.AuthInfo
}
type UpdateDto struct {
Id uint16 `json:"id"`
Id uint `json:"id"`
CreateDto
}
type DeleteDto struct {
Id uint16 `json:"id"`
Id uint `json:"id"`
}
type MetaDto struct {
@@ -16,6 +16,7 @@ type CreateDto struct {
Usage float64 `json:"usage"`
Interval uint8 `json:"interval"`
IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"`
Quantity float64 `json:"quantity"`
}
type ReadListDto struct {
@@ -32,6 +33,7 @@ type FilterDto struct {
Usage float64 `json:"usage"`
Interval uint8 `json:"interval"`
IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"`
Quantity float64 `json:"quantity"`
Page int `json:"page"`
PageSize int `json:"page_size"`
@@ -68,6 +70,7 @@ type ResponseDto struct {
Usage float64 `json:"usage"`
Interval uint8 `json:"interval"`
IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"`
Quantity float64 `json:"quantity"`
}
func (d PrescriptionItem) ToResponse() ResponseDto {
@@ -82,6 +85,7 @@ func (d PrescriptionItem) ToResponse() ResponseDto {
Usage: d.Usage,
Interval: d.Interval,
IntervalUnit_Code: d.IntervalUnit_Code,
Quantity: d.Quantity,
}
resp.Main = d.Main
return resp
@@ -4,13 +4,17 @@ import (
ecore "simrs-vx/internal/domain/base-entities/core"
ed "simrs-vx/internal/domain/main-entities/doctor"
ee "simrs-vx/internal/domain/main-entities/encounter"
"time"
erc "simrs-vx/internal/domain/references/common"
)
type CreateDto struct {
Encounter_Id *uint `json:"encounter_id"`
Doctor_Id *uint `json:"doctor_id"`
IssuedAt *time.Time `json:"issuedAt"`
Encounter_Id *uint `json:"encounter_id"`
Doctor_Id *uint `json:"doctor_id"`
IssuedAt *time.Time `json:"issuedAt"`
Status_Code *erc.DataStatusCode `json:"status_code"`
}
type ReadListDto struct {
@@ -20,25 +24,27 @@ type ReadListDto struct {
}
type FilterDto struct {
Encounter_Id *uint `json:"encounter_id"`
Doctor_Id *uint `json:"doctor_id"`
IssuedAt *time.Time `json:"issuedAt"`
Encounter_Id *uint `json:"encounter_id"`
Doctor_Id *uint `json:"doctor_id"`
IssuedAt *time.Time `json:"issuedAt"`
Status_Code *erc.DataStatusCode `json:"status_code"`
Page int `json:"page"`
PageSize int `json:"page_size"`
NoPagination int `json:"no_pagination"`
}
type ReadDetailDto struct {
Id uint16 `json:"id"`
Id uint `json:"id"`
Encounter_Id *uint `json:"encounter_id"`
}
type UpdateDto struct {
Id uint16 `json:"id"`
Id uint `json:"id"`
CreateDto
}
type DeleteDto struct {
Id uint16 `json:"id"`
Id uint `json:"id"`
}
type MetaDto struct {
@@ -49,11 +55,12 @@ type MetaDto struct {
type ResponseDto struct {
ecore.Main
Encounter_Id *uint `json:"encounter_id"`
Encounter *ee.Encounter `json:"encounter,omitempty"`
Doctor_Id *uint `json:"doctor_id"`
Doctor *ed.Doctor `json:"doctor,omitempty"`
IssuedAt *time.Time `json:"issuedAt"`
Encounter_Id *uint `json:"encounter_id"`
Encounter *ee.Encounter `json:"encounter,omitempty"`
Doctor_Id *uint `json:"doctor_id"`
Doctor *ed.Doctor `json:"doctor,omitempty"`
IssuedAt *time.Time `json:"issuedAt"`
Status_Code *erc.DataStatusCode `json:"status_code"`
}
func (d Prescription) ToResponse() ResponseDto {
@@ -63,6 +70,7 @@ func (d Prescription) ToResponse() ResponseDto {
Doctor_Id: d.Doctor_Id,
Doctor: d.Doctor,
IssuedAt: d.IssuedAt,
Status_Code: d.Status_Code,
}
resp.Main = d.Main
return resp
@@ -40,7 +40,7 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
return
}
dto := e.ReadDetailDto{}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.ReadDetail(dto)
rw.DataResponse(w, res, err)
}
@@ -55,7 +55,7 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.Update(dto)
rw.DataResponse(w, res, err)
}
@@ -67,7 +67,7 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
}
dto := e.DeleteDto{}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -88,7 +88,7 @@ func (obj myBase) Complete(w http.ResponseWriter, r *http.Request) {
return
}
dto.AuthInfo = *authInfo
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.Complete(dto)
rw.DataResponse(w, res, err)
}
@@ -38,7 +38,7 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) {
return
}
dto := e.ReadDetailDto{}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.ReadDetail(dto)
rw.DataResponse(w, res, err)
}
@@ -53,7 +53,7 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) {
if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res {
return
}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.Update(dto)
rw.DataResponse(w, res, err)
}
@@ -65,7 +65,7 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) {
}
dto := e.DeleteDto{}
dto.Id = uint16(id)
dto.Id = uint(id)
res, err := u.Delete(dto)
rw.DataResponse(w, res, err)
}
@@ -8,7 +8,17 @@ import (
"errors"
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"
// 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"
pl "simrs-vx/pkg/logger"
// pu "simrs-vx/pkg/use-case-helper"
erc "simrs-vx/internal/domain/references/common"
ero "simrs-vx/internal/domain/references/organization"
@@ -98,3 +108,44 @@ 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")
// prescription, err := up.ReadDetailData(ep.ReadDetailDto{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
// }
// 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
// }
// 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)
// }
// }
@@ -332,6 +332,10 @@ func Complete(input e.ReadDetailDto) (*d.Data, error) {
return pl.SetLogError(&event, input)
}
if err := createMedicationItemDist(&data.Id, &event, tx); err != nil {
return err
}
pl.SetLogInfo(&event, nil, "complete")
return nil
})
@@ -6,10 +6,17 @@ package medication
import (
e "simrs-vx/internal/domain/main-entities/medication"
// emi "simrs-vx/internal/domain/main-entities/medication-item"
// emid "simrs-vx/internal/domain/main-entities/medication-item-dist"
// umi "simrs-vx/internal/use-case/main-use-case/medication-item"
// umid "simrs-vx/internal/use-case/main-use-case/medication-item-dist"
emi "simrs-vx/internal/domain/main-entities/medication-item"
emid "simrs-vx/internal/domain/main-entities/medication-item-dist"
umi "simrs-vx/internal/use-case/main-use-case/medication-item"
umid "simrs-vx/internal/use-case/main-use-case/medication-item-dist"
pl "simrs-vx/pkg/logger"
pu "simrs-vx/pkg/use-case-helper"
dg "github.com/karincake/apem/db-gorm-pg"
"gorm.io/gorm"
)
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Medication) {
@@ -27,32 +34,32 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Medication) {
data.Status_Code = inputSrc.Status_Code
}
// func createMedicationItemDist(medication_id *uint, event *pl.Event, dbx ...*gorm.DB) error {
// pl.SetLogInfo(event, nil, "started", "createMedicationItemDist")
// var tx *gorm.DB
// if len(dbx) > 0 {
// tx = dbx[0]
// } else {
// tx = dg.I
// }
func createMedicationItemDist(medication_id *uint, event *pl.Event, dbx ...*gorm.DB) error {
pl.SetLogInfo(event, nil, "started", "createMedicationItemDist")
var tx *gorm.DB
if len(dbx) > 0 {
tx = dbx[0]
} else {
tx = dg.I
}
// filterMI := emi.ReadListDto{FilterDto: emi.FilterDto{Medication_Id: medication_id, IsRedeemed: true}}
// medicationItemList, _, err := umi.ReadListData(filterMI, event, tx)
// if err != nil {
// return err
// }
// for _, medicationItem := range medicationItemList {
// midCreate := emid.CreateDto{
// MedicationItem_Id: &medicationItem.Id,
// DateTime: medicationItem.MedicationItem.DateTime,
// Remain: medicationItem.MedicationItem.Remain,
// Nurse_Id: medicationItem.MedicationItem.Nurse_Id,
// }
// if err := umid.Create(midCreate); err != nil {
// return err
// }
// }
filterMI := emi.ReadListDto{FilterDto: emi.FilterDto{Medication_Id: medication_id, IsRedeemed: true}}
medicationItemList, _, err := umi.ReadListData(filterMI, event, tx)
if err != nil {
return err
}
// Nurse id isn't set here because it will be set when medItemDist is consumed by the nurse who is logged in and performing the consume action, so it isn't needed here.
for _, medicationItem := range medicationItemList {
midCreate := emid.CreateDto{
MedicationItem_Id: &medicationItem.Id,
DateTime: pu.GetTimeNow(),
Remain: medicationItem.Quantity,
}
if _, err := umid.CreateData(midCreate, event, tx); err != nil {
return err
}
}
// pl.SetLogInfo(event, nil, "complete")
// return nil
// }
pl.SetLogInfo(event, nil, "complete")
return nil
}
@@ -96,7 +96,15 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e
tx = dg.I
}
if err := tx.First(&data, input.Id).Error; err != nil {
if input.Encounter_Id != nil {
tx = tx.Where("\"Encounter_Id\" = ?", *input.Encounter_Id)
}
if input.Id != 0 {
tx = tx.Where("\"Id\" = ?", input.Id)
}
if err := tx.First(&data).Error; err != nil {
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
return nil, processedErr
}
@@ -24,4 +24,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PrescriptionItem) {
data.Usage = inputSrc.Usage
data.Interval = inputSrc.Interval
data.IntervalUnit_Code = inputSrc.IntervalUnit_Code
data.Quantity = inputSrc.Quantity
}
@@ -20,4 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Prescription) {
data.Encounter_Id = inputSrc.Encounter_Id
data.Doctor_Id = inputSrc.Doctor_Id
data.IssuedAt = inputSrc.IssuedAt
data.Status_Code = inputSrc.Status_Code
}
@@ -96,7 +96,15 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e
tx = dg.I
}
if err := tx.First(&data, input.Id).Error; err != nil {
if input.Encounter_Id != nil {
tx = tx.Where("\"Encounter_Id\" = ?", *input.Encounter_Id)
}
if input.Id != 0 {
tx = tx.Where("\"Id\" = ?", input.Id)
}
if err := tx.First(&data).Error; err != nil {
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
return nil, processedErr
}
+6
View File
@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"strings"
"time"
pl "simrs-vx/pkg/logger"
@@ -126,3 +127,8 @@ func kebabToPascal(input string) string {
}
return strings.Join(parts, "")
}
func GetTimeNow() *time.Time {
tmp := time.Now()
return &tmp
}