From e827f3d1a90f17c40b70cb295afa60cff35025f7 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 28 Aug 2025 14:43:39 +0700 Subject: [PATCH] feat (medicine): wip --- internal/domain/main-entities/medicine/dto.go | 19 ++--- .../interface/main-handler/main-handler.go | 2 + .../main-handler/medicine/handler.go | 71 +++++++++++++++++++ .../use-case/main-use-case/medicine/case.go | 3 + .../use-case/main-use-case/medicine/helper.go | 51 +++++++++++++ .../main-use-case/medicine/middleware.go | 14 ---- pkg/use-case-helper/use-case-helper.go | 4 ++ 7 files changed, 141 insertions(+), 23 deletions(-) create mode 100644 internal/interface/main-handler/medicine/handler.go diff --git a/internal/domain/main-entities/medicine/dto.go b/internal/domain/main-entities/medicine/dto.go index 9e505b8b..a0ed5d1b 100644 --- a/internal/domain/main-entities/medicine/dto.go +++ b/internal/domain/main-entities/medicine/dto.go @@ -10,15 +10,16 @@ import ( ) type CreateDto struct { - Code string `json:"code"` - Name string `json:"name"` - MedicineGroup_Code *string `json:"medicineGroup_code"` - MedicineMethod_Code *string `json:"medicineMethod_code"` - Uom_Code *string `json:"uom_code"` - Dose uint8 `json:"dose"` - Infra_Id *uint16 `json:"infra_id"` - Stock *int `json:"stock"` - Item_Id *uint `json:"item_id"` + Code string `json:"code"` + Name string `json:"name"` + MedicineGroup_Code *string `json:"medicineGroup_code"` + MedicineMethod_Code *string `json:"medicineMethod_code"` + Uom_Code *string `json:"uom_code"` + Dose uint8 `json:"dose"` + Infra_Id *uint16 `json:"infra_id"` + Stock *int `json:"stock"` + Item_Id *uint `json:"item_id"` + InsuranceCompany_Code *string `json:"insuranceCompany_code"` } type ReadListDto struct { diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 91b36af8..3044f79c 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -48,6 +48,7 @@ import ( itemprice "simrs-vx/internal/interface/main-handler/item-price" mcusrc "simrs-vx/internal/interface/main-handler/mcu-src" mcusrccategory "simrs-vx/internal/interface/main-handler/mcu-src-category" + medicine "simrs-vx/internal/interface/main-handler/medicine" medicinegroup "simrs-vx/internal/interface/main-handler/medicine-group" medicinemethod "simrs-vx/internal/interface/main-handler/medicine-method" pharmacycompany "simrs-vx/internal/interface/main-handler/pharmacy-company" @@ -122,6 +123,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/mcu-src", mcusrc.O) hc.RegCrud(r, "/v1/ethnic", ethnic.O) hc.RegCrud(r, "/v1/insurance-company", insurancecompany.O) + hc.RegCrud(r, "/v1/medicine", medicine.O) hc.RegCrud(r, "/v1/village", village.O) hc.RegCrud(r, "/v1/district", district.O) diff --git a/internal/interface/main-handler/medicine/handler.go b/internal/interface/main-handler/medicine/handler.go new file mode 100644 index 00000000..5a5b28e0 --- /dev/null +++ b/internal/interface/main-handler/medicine/handler.go @@ -0,0 +1,71 @@ +package medicine + +import ( + "net/http" + + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" + + // ua "github.com/karincake/tumpeng/auth/svc" + + e "simrs-vx/internal/domain/main-entities/medicine" + u "simrs-vx/internal/use-case/main-use-case/medicine" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := e.CreateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.Create(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + sf.UrlQueryParam(&dto, *r.URL) + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) GetDetail(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.ReadDetail(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint(id) + res, err := u.Update(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.DeleteDto{} + dto.Id = uint(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/medicine/case.go b/internal/use-case/main-use-case/medicine/case.go index 20955134..3775751e 100644 --- a/internal/use-case/main-use-case/medicine/case.go +++ b/internal/use-case/main-use-case/medicine/case.go @@ -34,6 +34,9 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if err := createItemWithDefaultPrice(&input, &event, tx); err != nil { + return err + } if resData, err := CreateData(input, &event, tx); err != nil { return err } else { diff --git a/internal/use-case/main-use-case/medicine/helper.go b/internal/use-case/main-use-case/medicine/helper.go index 2bd7ab7e..29a2f9ad 100644 --- a/internal/use-case/main-use-case/medicine/helper.go +++ b/internal/use-case/main-use-case/medicine/helper.go @@ -5,7 +5,17 @@ Any functions that are used internally by the use-case package medicine import ( + ei "simrs-vx/internal/domain/main-entities/item" + eip "simrs-vx/internal/domain/main-entities/item-price" e "simrs-vx/internal/domain/main-entities/medicine" + + ui "simrs-vx/internal/use-case/main-use-case/item" + uip "simrs-vx/internal/use-case/main-use-case/item-price" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Medicine) { @@ -26,3 +36,44 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Medicine) { data.Infra_Id = inputSrc.Infra_Id data.Stock = inputSrc.Stock } + +func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { + igcMed := "Medicine" + itemCreate := ei.CreateDto{ + Code: pu.AddPrefix("med-", input.Code), + Name: input.Name, + ItemGroup_Code: &igcMed, + Uom_Code: input.Uom_Code, + Infra_Id: input.Infra_Id, + Stock: input.Stock, + } + item, err := ui.CreateData(itemCreate, event, tx) + if err != nil { + return err + } + + input.Item_Id = &item.Id + return nil +} + +func createItemPrice(input *e.CreateDto, event *pl.Event, tx *gorm.DB, item_id *uint) error { + itemPriceCreate := eip.CreateDto{ + Item_Id: item_id, + Price: 0, + InsuranceCompany_Code: input.InsuranceCompany_Code, + } + _, err := uip.CreateData(itemPriceCreate, event, tx) + return err +} + +func createItemWithDefaultPrice(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { + if err := createItem(input, event, tx); err != nil { + return err + } + + if err := createItemPrice(input, event, tx, input.Item_Id); err != nil { + return err + } + + return nil +} diff --git a/internal/use-case/main-use-case/medicine/middleware.go b/internal/use-case/main-use-case/medicine/middleware.go index 29a280cb..4c429bff 100644 --- a/internal/use-case/main-use-case/medicine/middleware.go +++ b/internal/use-case/main-use-case/medicine/middleware.go @@ -7,17 +7,3 @@ package medicine // CreateMw{Name: "check-data", Func: pm.CheckData}, // ) // } - -// func createItemAndItemPrice(input *e.CreateDto, data *e.Medicine, tx *gorm.DB) error { -// if input != nil { -// itemCreate := ei.CreateDto{ -// Code: input.Code, -// Name: input.Name, -// ItemGroup_Code: "Medicine", -// Uom_Code: input.Uom_Code, -// Infra_Id: input.Infra_Id, -// Stock: input.Stock, -// } -// } -// return nil -// } diff --git a/pkg/use-case-helper/use-case-helper.go b/pkg/use-case-helper/use-case-helper.go index b88db3b4..fadfa373 100644 --- a/pkg/use-case-helper/use-case-helper.go +++ b/pkg/use-case-helper/use-case-helper.go @@ -76,3 +76,7 @@ func HandleMiddlewareError(event *pl.Event, mwType, mwName string, logData inter } return pl.SetLogError(event, logData) } + +func AddPrefix(prefix string, str string) string { + return prefix + str +}