diff --git a/internal/domain/main-entities/device-order/entity.go b/internal/domain/main-entities/device-order/entity.go index 79af88c2..3b37669f 100644 --- a/internal/domain/main-entities/device-order/entity.go +++ b/internal/domain/main-entities/device-order/entity.go @@ -13,3 +13,7 @@ type DeviceOrder struct { Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` Status_Code erc.DataStatusCode `json:"status_code"` } + +func (d DeviceOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/material-order/entity.go b/internal/domain/main-entities/material-order/entity.go index e306d372..b8a3b238 100644 --- a/internal/domain/main-entities/material-order/entity.go +++ b/internal/domain/main-entities/material-order/entity.go @@ -13,3 +13,7 @@ type MaterialOrder struct { Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` Status_Code erc.DataStatusCode `json:"status_code"` } + +func (d MaterialOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/medication-item-dist/dto.go b/internal/domain/main-entities/medication-item-dist/dto.go index cf44fb50..8d5c43e1 100644 --- a/internal/domain/main-entities/medication-item-dist/dto.go +++ b/internal/domain/main-entities/medication-item-dist/dto.go @@ -3,6 +3,9 @@ package medicationitem import ( ecore "simrs-vx/internal/domain/base-entities/core" emi "simrs-vx/internal/domain/main-entities/medication-item" + + pa "simrs-vx/pkg/auth-helper" + "time" ) @@ -42,6 +45,13 @@ type DeleteDto struct { Id uint16 `json:"id"` } +type ConsumeDto struct { + Id uint16 `json:"id"` + Usage float64 `json:"usage"` + + pa.AuthInfo +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` diff --git a/internal/domain/main-entities/medication/dto.go b/internal/domain/main-entities/medication/dto.go index ec158df8..7242b9d5 100644 --- a/internal/domain/main-entities/medication/dto.go +++ b/internal/domain/main-entities/medication/dto.go @@ -5,7 +5,10 @@ import ( ee "simrs-vx/internal/domain/main-entities/encounter" ep "simrs-vx/internal/domain/main-entities/pharmacist" erc "simrs-vx/internal/domain/references/common" + "time" + + pa "simrs-vx/pkg/auth-helper" ) type CreateDto struct { @@ -33,6 +36,8 @@ type FilterDto struct { } type ReadDetailDto struct { Id uint16 `json:"id"` + + pa.AuthInfo } type UpdateDto struct { diff --git a/internal/domain/main-entities/medication/entity.go b/internal/domain/main-entities/medication/entity.go index cc126de7..0a59c27b 100644 --- a/internal/domain/main-entities/medication/entity.go +++ b/internal/domain/main-entities/medication/entity.go @@ -19,3 +19,7 @@ type Medication struct { Pharmacist *ep.Pharmacist `json:"pharmacist,omitempty" gorm:"foreignKey:Pharmacist_Id;references:Id"` Status_Code erc.DataStatusCode `json:"status_code"` } + +func (d Medication) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/interface/main-handler/device-order/handler.go b/internal/interface/main-handler/device-order/handler.go index d9b55d6a..ca11ff90 100644 --- a/internal/interface/main-handler/device-order/handler.go +++ b/internal/interface/main-handler/device-order/handler.go @@ -69,3 +69,15 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Complete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.ReadDetailDto{} + dto.Id = uint16(id) + res, err := u.Complete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index db155f73..cc14eaf1 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -138,6 +138,50 @@ func SetRoutes() http.Handler { "DELETE /{id}": encounter.O.Delete, "PATCH /{id}/checkout": encounter.O.CheckOut, }) + hk.GroupRoutes("/v1/medication", r, auth.GuardMW, hk.MapHandlerFunc{ + "GET /": medication.O.GetList, + "GET /{id}": medication.O.GetDetail, + "POST /": medication.O.Create, + "PATCH /{id}": medication.O.Update, + "DELETE /{id}": medication.O.Delete, + "PATCH /{id}/complete": medication.O.Complete, + }) + + hk.GroupRoutes("/v1/medication-item", r, hk.MapHandlerFunc{ + "GET /": medicationitem.O.GetList, + "GET /{id}": medicationitem.O.GetDetail, + "POST /": medicationitem.O.Create, + "PATCH /{id}": medicationitem.O.Update, + "DELETE /{id}": medicationitem.O.Delete, + "PATCH /{id}/redeem": medicationitem.O.Redeem, + }) + + hk.GroupRoutes("/v1/medication-item-dist", r, auth.GuardMW, hk.MapHandlerFunc{ + "GET /": medicationitemdist.O.GetList, + "GET /{id}": medicationitemdist.O.GetDetail, + "POST /": medicationitemdist.O.Create, + "PATCH /{id}": medicationitemdist.O.Update, + "DELETE /{id}": medicationitemdist.O.Delete, + "PATCH /{id}/consume": medicationitemdist.O.Consume, + }) + + hk.GroupRoutes("/v1/device-order", r, hk.MapHandlerFunc{ + "GET /": deviceorder.O.GetList, + "GET /{id}": deviceorder.O.GetDetail, + "POST /": deviceorder.O.Create, + "PATCH /{id}": deviceorder.O.Update, + "DELETE /{id}": deviceorder.O.Delete, + "PATCH /{id}/complete": deviceorder.O.Complete, + }) + + hk.GroupRoutes("/v1/material-order", r, hk.MapHandlerFunc{ + "GET /": materialorder.O.GetList, + "GET /{id}": materialorder.O.GetDetail, + "POST /": materialorder.O.Create, + "PATCH /{id}": materialorder.O.Update, + "DELETE /{id}": materialorder.O.Delete, + "PATCH /{id}/complete": materialorder.O.Complete, + }) hc.RegCrud(r, "/v1/soapi", auth.GuardMW, soapi.O) hc.RegCrud(r, "/v1/adime", auth.GuardMW, adime.O) @@ -152,12 +196,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/pharmacist", pharmacist.O) hc.RegCrud(r, "/v1/prescription", prescription.O) hc.RegCrud(r, "/v1/prescription-item", prescriptionitem.O) - hc.RegCrud(r, "/v1/medication", medication.O) - hc.RegCrud(r, "/v1/medication-item", medicationitem.O) - hc.RegCrud(r, "/v1/medication-item-dist", medicationitemdist.O) - hc.RegCrud(r, "/v1/device-order", deviceorder.O) hc.RegCrud(r, "/v1/device-order-item", deviceorderitem.O) - hc.RegCrud(r, "/v1/material-order", materialorder.O) hc.RegCrud(r, "/v1/material-order-item", materialorderitem.O) hc.RegCrud(r, "/v1/mcu-order", mcuorder.O) hc.RegCrud(r, "/v1/mcu-order-item", mcuorderitem.O) diff --git a/internal/interface/main-handler/material-order/handler.go b/internal/interface/main-handler/material-order/handler.go index cfea48f7..eb717973 100644 --- a/internal/interface/main-handler/material-order/handler.go +++ b/internal/interface/main-handler/material-order/handler.go @@ -69,3 +69,15 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Complete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.ReadDetailDto{} + dto.Id = uint16(id) + res, err := u.Complete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/medication-item-dist/handler.go b/internal/interface/main-handler/medication-item-dist/handler.go index 956a98ae..6c4b659f 100644 --- a/internal/interface/main-handler/medication-item-dist/handler.go +++ b/internal/interface/main-handler/medication-item-dist/handler.go @@ -6,10 +6,12 @@ import ( rw "github.com/karincake/risoles" sf "github.com/karincake/semprit" - // ua "github.com/karincake/tumpeng/auth/svc" + pa "simrs-vx/pkg/auth-helper" e "simrs-vx/internal/domain/main-entities/medication-item-dist" u "simrs-vx/internal/use-case/main-use-case/medication-item-dist" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -69,3 +71,24 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Consume(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + + dto := e.ConsumeDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.AuthInfo = *authInfo + dto.Id = uint16(id) + res, err := u.Consume(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/medication-item/handler.go b/internal/interface/main-handler/medication-item/handler.go index b5a5e6ae..bccb9f4f 100644 --- a/internal/interface/main-handler/medication-item/handler.go +++ b/internal/interface/main-handler/medication-item/handler.go @@ -69,3 +69,15 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Redeem(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.ReadDetailDto{} + dto.Id = uint16(id) + res, err := u.Redeem(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 269c2e6f..b847eb5b 100644 --- a/internal/interface/main-handler/medication/handler.go +++ b/internal/interface/main-handler/medication/handler.go @@ -6,10 +6,12 @@ import ( rw "github.com/karincake/risoles" sf "github.com/karincake/semprit" - // ua "github.com/karincake/tumpeng/auth/svc" + pa "simrs-vx/pkg/auth-helper" e "simrs-vx/internal/domain/main-entities/medication" u "simrs-vx/internal/use-case/main-use-case/medication" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -69,3 +71,24 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Complete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + + dto := e.ReadDetailDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.AuthInfo = *authInfo + dto.Id = uint16(id) + res, err := u.Complete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/device-order-item/helper.go b/internal/use-case/main-use-case/device-order-item/helper.go index d618afae..5c6a0e68 100644 --- a/internal/use-case/main-use-case/device-order-item/helper.go +++ b/internal/use-case/main-use-case/device-order-item/helper.go @@ -19,4 +19,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DeviceOrderItem) { data.DeviceOrder_Id = inputSrc.DeviceOrder_Id data.Device_Id = inputSrc.Device_Id + data.Count = inputSrc.Count } diff --git a/internal/use-case/main-use-case/device-order/case.go b/internal/use-case/main-use-case/device-order/case.go index c4f1ebe5..96c510c0 100644 --- a/internal/use-case/main-use-case/device-order/case.go +++ b/internal/use-case/main-use-case/device-order/case.go @@ -1,10 +1,13 @@ package deviceorder import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/device-order" + erc "simrs-vx/internal/domain/references/common" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -187,6 +190,9 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } + if data.IsCompleted() { + return errors.New("data already completed") + } mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) // Run pre-middleware @@ -243,6 +249,9 @@ func Delete(input e.DeleteDto) (*d.Data, error) { return err } + if data.IsCompleted() { + return errors.New("data already completed") + } mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) // Run pre-middleware @@ -277,3 +286,54 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Complete(input e.ReadDetailDto) (*d.Data, error) { + var data *e.DeviceOrder + var err error + + event := pl.Event{ + Feature: "Complete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "complete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + data, err = ReadDetailData(input, &event, tx) + if err != nil { + return err + } + + if data.IsCompleted() { + return errors.New("data already completed") + } + + data.Status_Code = erc.DSCDone + if err := tx.Save(&data).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 + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/device-order/helper.go b/internal/use-case/main-use-case/device-order/helper.go index 975ef50b..84a49fa2 100644 --- a/internal/use-case/main-use-case/device-order/helper.go +++ b/internal/use-case/main-use-case/device-order/helper.go @@ -18,4 +18,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DeviceOrder) { } data.Encounter_Id = inputSrc.Encounter_Id + data.Status_Code = inputSrc.Status_Code } diff --git a/internal/use-case/main-use-case/material-order/case.go b/internal/use-case/main-use-case/material-order/case.go index f566015f..28f41704 100644 --- a/internal/use-case/main-use-case/material-order/case.go +++ b/internal/use-case/main-use-case/material-order/case.go @@ -1,10 +1,13 @@ package materialorder import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/material-order" + erc "simrs-vx/internal/domain/references/common" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -187,6 +190,10 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } + if data.IsCompleted() { + return errors.New("data already completed") + } + mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) // Run pre-middleware @@ -243,6 +250,10 @@ func Delete(input e.DeleteDto) (*d.Data, error) { return err } + if data.IsCompleted() { + return errors.New("data already completed") + } + mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) // Run pre-middleware @@ -277,3 +288,54 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Complete(input e.ReadDetailDto) (*d.Data, error) { + var data *e.MaterialOrder + var err error + + event := pl.Event{ + Feature: "Complete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "complete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + data, err = ReadDetailData(input, &event, tx) + if err != nil { + return err + } + + if data.IsCompleted() { + return errors.New("data already completed") + } + + data.Status_Code = erc.DSCDone + if err := tx.Save(&data).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 + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/material-order/helper.go b/internal/use-case/main-use-case/material-order/helper.go index 565d2487..f5f67b1a 100644 --- a/internal/use-case/main-use-case/material-order/helper.go +++ b/internal/use-case/main-use-case/material-order/helper.go @@ -18,4 +18,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MaterialOrder) { } data.Encounter_Id = inputSrc.Encounter_Id + data.Status_Code = inputSrc.Status_Code } diff --git a/internal/use-case/main-use-case/medication-item-dist/case.go b/internal/use-case/main-use-case/medication-item-dist/case.go index c2b87993..3c79b6a7 100644 --- a/internal/use-case/main-use-case/medication-item-dist/case.go +++ b/internal/use-case/main-use-case/medication-item-dist/case.go @@ -1,10 +1,13 @@ package medicationitemdist import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/medication-item-dist" + un "simrs-vx/internal/use-case/main-use-case/nurse" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -277,3 +280,74 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Consume(input e.ConsumeDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MedicationItemDist + var err error + + event := pl.Event{ + Feature: "Consume", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "consume") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + if !input.AuthInfo.IsNurse() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "auth-forbidden", + Detail: "user position is not allowed", + Raw: errors.New("authentication failed"), + } + return pl.SetLogError(&event, input) + } + + nurse_id, err := un.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if data.Remain <= 0 { + return errors.New("data already consumed") + } else if data.Remain < input.Usage { + return errors.New("data remain less than usage") + } + + data.Remain -= input.Usage + data.Nurse_Id = nurse_id + + if err := tx.Save(&data).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 + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "updated", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/medication-item-dist/helper.go b/internal/use-case/main-use-case/medication-item-dist/helper.go index eadc8958..5b1b1d35 100644 --- a/internal/use-case/main-use-case/medication-item-dist/helper.go +++ b/internal/use-case/main-use-case/medication-item-dist/helper.go @@ -20,4 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicationItemDist) data.MedicationItem_Id = inputSrc.MedicationItem_Id data.DateTime = inputSrc.DateTime data.Remain = inputSrc.Remain + data.Nurse_Id = inputSrc.Nurse_Id } diff --git a/internal/use-case/main-use-case/medication-item/case.go b/internal/use-case/main-use-case/medication-item/case.go index 1573a5a7..b5c3a015 100644 --- a/internal/use-case/main-use-case/medication-item/case.go +++ b/internal/use-case/main-use-case/medication-item/case.go @@ -1,6 +1,7 @@ package medicationitem import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/medication-item" @@ -277,3 +278,54 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Redeem(input e.ReadDetailDto) (*d.Data, error) { + var data *e.MedicationItem + var err error + + event := pl.Event{ + Feature: "Redeem", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "redeem") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + data, err = ReadDetailData(input, &event, tx) + if err != nil { + return err + } + + if data.IsRedeemed { + return errors.New("data already redeemed") + } + + data.IsRedeemed = true + if err := tx.Save(&data).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 + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/medication-item/helper.go b/internal/use-case/main-use-case/medication-item/helper.go index 67b8a204..c3c07b36 100644 --- a/internal/use-case/main-use-case/medication-item/helper.go +++ b/internal/use-case/main-use-case/medication-item/helper.go @@ -23,4 +23,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicationItem) { data.MedicineMix_Id = inputSrc.MedicineMix_Id data.Usage = inputSrc.Usage data.Interval = inputSrc.Interval + data.IntervalUnit_Code = inputSrc.IntervalUnit_Code + data.IsRedeemed = inputSrc.IsRedeemed } diff --git a/internal/use-case/main-use-case/medication/case.go b/internal/use-case/main-use-case/medication/case.go index df23a586..ec096f29 100644 --- a/internal/use-case/main-use-case/medication/case.go +++ b/internal/use-case/main-use-case/medication/case.go @@ -1,10 +1,15 @@ package medication import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/medication" + erc "simrs-vx/internal/domain/references/common" + + up "simrs-vx/internal/use-case/main-use-case/pharmacist" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -277,3 +282,70 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Complete(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Medication + var err error + + event := pl.Event{ + Feature: "Complete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "complete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + data, err = ReadDetailData(input, &event, tx) + if err != nil { + return err + } + + if data.IsCompleted() { + return errors.New("data already completed") + } + + if !input.AuthInfo.IsPharmacist() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "auth-forbidden", + Detail: "user position is not allowed", + Raw: errors.New("authentication failed"), + } + return pl.SetLogError(&event, input) + } + + pharmacist_id, err := up.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + + data.Status_Code = erc.DSCDone + data.Pharmacist_Id = pharmacist_id + if err := tx.Save(&data).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 + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "fetched", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/medication/helper.go b/internal/use-case/main-use-case/medication/helper.go index f2d545ac..52676431 100644 --- a/internal/use-case/main-use-case/medication/helper.go +++ b/internal/use-case/main-use-case/medication/helper.go @@ -6,6 +6,10 @@ 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" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Medication) { @@ -20,4 +24,35 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Medication) { data.Encounter_Id = inputSrc.Encounter_Id data.IssuedAt = inputSrc.IssuedAt data.Pharmacist_Id = inputSrc.Pharmacist_Id + 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 +// } + +// 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 +// } +// } + +// pl.SetLogInfo(event, nil, "complete") +// return nil +// } diff --git a/internal/use-case/main-use-case/nurse/lib.go b/internal/use-case/main-use-case/nurse/lib.go index d3c48f60..468b41c2 100644 --- a/internal/use-case/main-use-case/nurse/lib.go +++ b/internal/use-case/main-use-case/nurse/lib.go @@ -159,3 +159,34 @@ func DeleteData(data *e.Nurse, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func GetIdByUserId(user_id *uint, event *pl.Event, dbx ...*gorm.DB) (*uint, error) { + pl.SetLogInfo(event, nil, "started", "DBGetIdByUserId") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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). + Scan(&nurse_id).Error + + if err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, pl.SetLogError(event, user_id) + } + + pl.SetLogInfo(event, nil, "complete") + return &nurse_id, nil +} diff --git a/internal/use-case/main-use-case/pharmacist/lib.go b/internal/use-case/main-use-case/pharmacist/lib.go index 5559be6c..e9478d70 100644 --- a/internal/use-case/main-use-case/pharmacist/lib.go +++ b/internal/use-case/main-use-case/pharmacist/lib.go @@ -159,3 +159,34 @@ func DeleteData(data *e.Pharmacist, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func GetIdByUserId(user_id *uint, event *pl.Event, dbx ...*gorm.DB) (*uint, error) { + pl.SetLogInfo(event, nil, "started", "DBGetIdByUserId") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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). + Scan(&pharmacist_id).Error + + if err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, pl.SetLogError(event, user_id) + } + + pl.SetLogInfo(event, nil, "complete") + return &pharmacist_id, nil +} diff --git a/internal/use-case/main-use-case/prescription-item/helper.go b/internal/use-case/main-use-case/prescription-item/helper.go index e63ca8c7..000522d5 100644 --- a/internal/use-case/main-use-case/prescription-item/helper.go +++ b/internal/use-case/main-use-case/prescription-item/helper.go @@ -23,4 +23,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PrescriptionItem) { data.MedicineMix_Id = inputSrc.MedicineMix_Id data.Usage = inputSrc.Usage data.Interval = inputSrc.Interval + data.IntervalUnit_Code = inputSrc.IntervalUnit_Code }