This commit is contained in:
dpurbosakti
2025-09-16 17:59:33 +07:00
parent d1a587f603
commit cb5b743bee
25 changed files with 579 additions and 7 deletions
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
// }
@@ -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
}
@@ -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
}
@@ -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
}