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
@@ -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
}
@@ -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
}
@@ -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"`
@@ -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 {
@@ -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
}
@@ -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)
}
@@ -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)
@@ -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)
}
@@ -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)
}
@@ -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)
}
@@ -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)
}
@@ -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
}