From 4f6a781341af81e32e131966daf61d6e9d947fe7 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 4 Sep 2025 11:32:11 +0700 Subject: [PATCH 001/190] feat (patient): add search --- internal/domain/main-entities/patient/dto.go | 4 +++ .../interface/main-handler/main-handler.go | 10 +++++- .../interface/main-handler/patient/handler.go | 7 ++++ .../use-case/main-use-case/patient/case.go | 25 ++++++++++++++ .../use-case/main-use-case/patient/lib.go | 34 +++++++++++++++++++ pkg/use-case-helper/use-case-helper.go | 25 ++++++++++++++ 6 files changed, 104 insertions(+), 1 deletion(-) diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index c0eee96a..e3f5a622 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -55,6 +55,10 @@ type DeleteDto struct { Id uint `json:"id"` } +type SearchDto struct { + Search string `json:"search"` +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 3b6c0c47..80aa4df4 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -105,6 +105,15 @@ func SetRoutes() http.Handler { "PATCH /{id}/block": user.O.Block, "PATCH /{id}/active": user.O.Active, }) + hk.GroupRoutes("/v1/patient", r, hk.MapHandlerFunc{ + "GET /": patient.O.GetList, + "GET /{id}": patient.O.GetDetail, + "POST /": patient.O.Create, + "PATCH /{id}": patient.O.Update, + "DELETE /{id}": patient.O.Delete, + "GET /by-identifier": patient.O.Search, + }) + hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) hc.RegCrud(r, "/v1/person-contact", personcontact.O) @@ -113,7 +122,6 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/nurse", nurse.O) hc.RegCrud(r, "/v1/nutritionist", nutritionist.O) hc.RegCrud(r, "/v1/pharmacist", pharmacist.O) - hc.RegCrud(r, "/v1/patient", patient.O) /******************** sources ********************/ hc.RegCrud(r, "/v1/division", division.O) diff --git a/internal/interface/main-handler/patient/handler.go b/internal/interface/main-handler/patient/handler.go index 57771b56..c392ee4c 100644 --- a/internal/interface/main-handler/patient/handler.go +++ b/internal/interface/main-handler/patient/handler.go @@ -69,3 +69,10 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Search(w http.ResponseWriter, r *http.Request) { + dto := e.SearchDto{} + sf.UrlQueryParam(&dto, *r.URL) + res, err := u.Search(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index e942536b..b17c756a 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -334,3 +334,28 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Search(input e.SearchDto) (*d.Data, error) { + var data *e.Patient + var err error + + event := pl.Event{ + Feature: "Search", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "search") + if data, err = SearchData(input, &event); 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/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index 2a5d70e6..539f6843 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -163,3 +163,37 @@ func DeleteData(data *e.Patient, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func SearchData(input e.SearchDto, event *pl.Event, dbx ...*gorm.DB) (*e.Patient, error) { + pl.SetLogInfo(event, input, "started", "DBSearch") + + var patient e.Patient + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + // Preload associations for complete data + tx = tx.Preload(clause.Associations) + tx = tx.Preload("Person.Addresses") + tx = tx.Preload("Person.Contacts") + tx = tx.Preload("Person.Relatives") + + // Search by patient number OR person's resident identity number (exact match) + err := tx.Joins("JOIN \"Person\" ON \"Patient\".\"Person_Id\" = \"Person\".\"Id\""). + Where("\"Patient\".\"Number\" = ? OR \"Person\".\"ResidentIdentityNumber\" = ?", + input.Search, input.Search). + First(&patient).Error + + if err != nil { + if processedErr := pu.HandleSearchError(err, event, source, input.Search, patient); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &patient, nil +} diff --git a/pkg/use-case-helper/use-case-helper.go b/pkg/use-case-helper/use-case-helper.go index beb369c1..a16a9ba2 100644 --- a/pkg/use-case-helper/use-case-helper.go +++ b/pkg/use-case-helper/use-case-helper.go @@ -52,6 +52,31 @@ func HandleReadError(err error, event *pl.Event, itemType string, id interface{} return pl.SetLogError(event, nil) } +func HandleSearchError(err error, event *pl.Event, itemType string, query interface{}, data any) error { + if err == nil { + pl.SetLogInfo(event, data, "complete") + return nil + } + + if errors.Is(err, gorm.ErrRecordNotFound) { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-notFound", + Detail: fmt.Sprintf("%s with query '%v' not found", itemType, query), + Raw: err, + } + } else { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-search-fail", + Detail: fmt.Sprintf("%s search failed", itemType), + Raw: err, + } + } + + return pl.SetLogError(event, nil) +} + func GetMiddlewareErrorCode(mwType MWType) string { if strings.Contains(string(mwType), "Pre") { return "MW_PRE_FAILED" From eda0454ad6c6c9e44ac03bc0a5c547ab84bd6a97 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 4 Sep 2025 11:53:15 +0700 Subject: [PATCH 002/190] add laborant, set patient number as unique --- cmd/migration/migrations/20250904045113.sql | 12 ++++ cmd/migration/migrations/20250904045250.sql | 2 + cmd/migration/migrations/atlas.sum | 6 +- internal/domain/main-entities/laborant/dto.go | 68 +++++++++++++++++++ .../domain/main-entities/laborant/entity.go | 12 ++++ .../domain/main-entities/patient/entity.go | 2 +- internal/interface/migration/migration.go | 2 + 7 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 cmd/migration/migrations/20250904045113.sql create mode 100644 cmd/migration/migrations/20250904045250.sql create mode 100644 internal/domain/main-entities/laborant/dto.go create mode 100644 internal/domain/main-entities/laborant/entity.go diff --git a/cmd/migration/migrations/20250904045113.sql b/cmd/migration/migrations/20250904045113.sql new file mode 100644 index 00000000..cbdcca65 --- /dev/null +++ b/cmd/migration/migrations/20250904045113.sql @@ -0,0 +1,12 @@ +-- Create "Laborant" table +CREATE TABLE "public"."Laborant" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(10) NULL, + "Name" character varying(50) NULL, + "Parent_Id" smallint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Laborant_Code" UNIQUE ("Code") +); diff --git a/cmd/migration/migrations/20250904045250.sql b/cmd/migration/migrations/20250904045250.sql new file mode 100644 index 00000000..ce493659 --- /dev/null +++ b/cmd/migration/migrations/20250904045250.sql @@ -0,0 +1,2 @@ +-- Modify "Patient" table +ALTER TABLE "public"."Patient" ADD CONSTRAINT "uni_Patient_Number" UNIQUE ("Number"); diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index 8b56b6fa..bd1fd480 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:179RYs36FGTJB7o/kUCO3K612TUM4fbHOaI3UBdlmlU= +h1:SEKp4pTgTBf9j9WlbMblM56D9bo7EgXZbCgN5aCmycE= 20250829081952.sql h1:YMsYq3uPsx70EjWSGfYnVRR5GV0q1fRGIszYZAWzXNo= 20250901073356.sql h1:jjd5TLs+Pyi0u3SrOM+aNTbHxSJboXgcOz/L4bkYx+c= 20250901080035.sql h1:LWa3X0NWjalVcxNbk5HaHj1Oqu60/AQabi0jBmCeQBI= @@ -7,4 +7,6 @@ h1:179RYs36FGTJB7o/kUCO3K612TUM4fbHOaI3UBdlmlU= 20250902063217.sql h1:wYFIrAIp1RczNvzlmu8jP8P1J7xEXqgDLKDUNBbkt84= 20250902105300.sql h1:6N2SDYK3a6djaO6u468E/DrDR9kM+uYoJvNlTFon6bY= 20250903041718.sql h1:ZiaacurDuBwWaI348Sjo7VZ6rSsj9TLTkudiRv05C/w= -20250903073200.sql h1:Tnxfz/3JjvrwPie2FYuhmfo5xFNeQV1lH+qbBJjpm5g= +20250903073200.sql h1:4i/3uJdYiAuKZ6upRK+xXUHBN7xHSK8G5QjaDkQt8E8= +20250904045113.sql h1:Ak/LiCz/prpIBkufkJkJIrx1/MJUdrryAAhoF2d+6Zg= +20250904045250.sql h1:UhHhYtF1CdKa29LuYb8ZNduVmXQEg9tu0pY0aHe/Njg= diff --git a/internal/domain/main-entities/laborant/dto.go b/internal/domain/main-entities/laborant/dto.go new file mode 100644 index 00000000..47860e7c --- /dev/null +++ b/internal/domain/main-entities/laborant/dto.go @@ -0,0 +1,68 @@ +package laborant + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Code string `json:"code"` + Name string `json:"name"` + Parent_Id *int16 `json:"parent_id"` +} + +type ReadListDto struct { + Code string `json:"code"` + Name string `json:"name"` + Parent_Id *int16 `json:"parent_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + Code string `json:"code"` + Name string `json:"name"` + Parent_Id *int16 `json:"parent_id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.SmallMain + Code string `json:"code"` + Name string `json:"name"` + Parent_Id *int16 `json:"parent_id"` +} + +func (d Laborant) ToResponse() ResponseDto { + resp := ResponseDto{ + Code: d.Code, + Name: d.Name, + Parent_Id: d.Parent_Id, + } + resp.SmallMain = d.SmallMain + return resp +} + +func ToResponseList(data []Laborant) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/laborant/entity.go b/internal/domain/main-entities/laborant/entity.go new file mode 100644 index 00000000..76879825 --- /dev/null +++ b/internal/domain/main-entities/laborant/entity.go @@ -0,0 +1,12 @@ +package laborant + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type Laborant struct { + ecore.SmallMain // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:10"` + Name string `json:"name" gorm:"size:50"` + Parent_Id *int16 `json:"parent_id"` +} diff --git a/internal/domain/main-entities/patient/entity.go b/internal/domain/main-entities/patient/entity.go index fbe4647a..ada67f3b 100644 --- a/internal/domain/main-entities/patient/entity.go +++ b/internal/domain/main-entities/patient/entity.go @@ -13,5 +13,5 @@ type Patient struct { Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id;references:Id"` RegisteredAt *time.Time `json:"registeredAt"` Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` - Number *string `json:"number" gorm:"size:15"` + Number *string `json:"number" gorm:"unique;size:15"` } diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go index 2f6f0d50..3c33be2c 100644 --- a/internal/interface/migration/migration.go +++ b/internal/interface/migration/migration.go @@ -21,6 +21,7 @@ import ( insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" item "simrs-vx/internal/domain/main-entities/item" itemprice "simrs-vx/internal/domain/main-entities/item-price" + laborant "simrs-vx/internal/domain/main-entities/laborant" language "simrs-vx/internal/domain/main-entities/language" material "simrs-vx/internal/domain/main-entities/material" mcusrc "simrs-vx/internal/domain/main-entities/mcu-src" @@ -127,6 +128,7 @@ func GetEntities() []any { &personrelative.PersonRelative{}, &patient.Patient{}, &encounter.Encounter{}, + &laborant.Laborant{}, } } From 4a0b9f5713b191bb034b49a75260b4153d903e53 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 4 Sep 2025 11:58:35 +0700 Subject: [PATCH 003/190] wip --- internal/domain/main-entities/laborant/dto.go | 39 +-- .../use-case/main-use-case/laborant/case.go | 278 ++++++++++++++++++ .../use-case/main-use-case/laborant/helper.go | 22 ++ .../use-case/main-use-case/laborant/lib.go | 161 ++++++++++ .../laborant/middleware-runner.go | 103 +++++++ .../main-use-case/laborant/middleware.go | 9 + .../main-use-case/laborant/tycovar.go | 44 +++ 7 files changed, 639 insertions(+), 17 deletions(-) create mode 100644 internal/use-case/main-use-case/laborant/case.go create mode 100644 internal/use-case/main-use-case/laborant/helper.go create mode 100644 internal/use-case/main-use-case/laborant/lib.go create mode 100644 internal/use-case/main-use-case/laborant/middleware-runner.go create mode 100644 internal/use-case/main-use-case/laborant/middleware.go create mode 100644 internal/use-case/main-use-case/laborant/tycovar.go diff --git a/internal/domain/main-entities/laborant/dto.go b/internal/domain/main-entities/laborant/dto.go index 47860e7c..2ab427bd 100644 --- a/internal/domain/main-entities/laborant/dto.go +++ b/internal/domain/main-entities/laborant/dto.go @@ -2,6 +2,7 @@ package laborant import ( ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/employee" ) type CreateDto struct { @@ -11,9 +12,14 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -21,19 +27,18 @@ type ReadListDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + Id uint16 `json:"id"` + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number"` } 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 { @@ -43,19 +48,19 @@ type MetaDto struct { } type ResponseDto struct { - ecore.SmallMain - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + ecore.Main + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty"` + IHS_Number *string `json:"ihs_number"` } func (d Laborant) ToResponse() ResponseDto { resp := ResponseDto{ - Code: d.Code, - Name: d.Name, - Parent_Id: d.Parent_Id, + // Employee_Id: d.Employee_Id, + // Employee: d.Employee, + // IHS_Number: d.IHS_Number, } - resp.SmallMain = d.SmallMain + // resp.Main = d.Main return resp } diff --git a/internal/use-case/main-use-case/laborant/case.go b/internal/use-case/main-use-case/laborant/case.go new file mode 100644 index 00000000..4049ff53 --- /dev/null +++ b/internal/use-case/main-use-case/laborant/case.go @@ -0,0 +1,278 @@ +package laborant + +import ( + e "simrs-vx/internal/domain/main-entities/laborant" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "nutritionist" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Laborant{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Laborant + var dataList []e.Laborant + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Laborant + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Laborant + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Laborant + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/laborant/helper.go b/internal/use-case/main-use-case/laborant/helper.go new file mode 100644 index 00000000..8619f7e6 --- /dev/null +++ b/internal/use-case/main-use-case/laborant/helper.go @@ -0,0 +1,22 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package laborant + +import ( + e "simrs-vx/internal/domain/main-entities/laborant" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Laborant) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Employee_Id = inputSrc.Employee_Id + data.IHS_Number = inputSrc.IHS_Number +} diff --git a/internal/use-case/main-use-case/laborant/lib.go b/internal/use-case/main-use-case/laborant/lib.go new file mode 100644 index 00000000..9c1ee441 --- /dev/null +++ b/internal/use-case/main-use-case/laborant/lib.go @@ -0,0 +1,161 @@ +package laborant + +import ( + e "simrs-vx/internal/domain/main-entities/laborant" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Laborant, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Laborant{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Laborant, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Laborant{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Laborant{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Laborant, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Laborant{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if input.Employee_Id != nil { + tx = tx.Where("\"Employee_Id\" = ?", *input.Employee_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 + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Laborant, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Laborant, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/laborant/middleware-runner.go b/internal/use-case/main-use-case/laborant/middleware-runner.go new file mode 100644 index 00000000..e037afc7 --- /dev/null +++ b/internal/use-case/main-use-case/laborant/middleware-runner.go @@ -0,0 +1,103 @@ +package laborant + +import ( + e "simrs-vx/internal/domain/main-entities/laborant" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Laborant) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Laborant) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Laborant) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Laborant) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Laborant) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/laborant/middleware.go b/internal/use-case/main-use-case/laborant/middleware.go new file mode 100644 index 00000000..b0eb6830 --- /dev/null +++ b/internal/use-case/main-use-case/laborant/middleware.go @@ -0,0 +1,9 @@ +package laborant + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/laborant/tycovar.go b/internal/use-case/main-use-case/laborant/tycovar.go new file mode 100644 index 00000000..41768ca7 --- /dev/null +++ b/internal/use-case/main-use-case/laborant/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package laborant + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/laborant" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Laborant, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Laborant, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Laborant, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From 850ff7615cc37df1520dd5219d349971fa2d1f51 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 4 Sep 2025 12:01:54 +0700 Subject: [PATCH 004/190] fix laborant table --- cmd/migration/migrations/20250904050121.sql | 2 ++ cmd/migration/migrations/atlas.sum | 7 ++++--- internal/domain/main-entities/laborant/dto.go | 8 ++++---- internal/domain/main-entities/laborant/entity.go | 9 +++++---- 4 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 cmd/migration/migrations/20250904050121.sql diff --git a/cmd/migration/migrations/20250904050121.sql b/cmd/migration/migrations/20250904050121.sql new file mode 100644 index 00000000..40202be4 --- /dev/null +++ b/cmd/migration/migrations/20250904050121.sql @@ -0,0 +1,2 @@ +-- Modify "Laborant" table +ALTER TABLE "public"."Laborant" ALTER COLUMN "Id" TYPE bigint, DROP COLUMN "Code", DROP COLUMN "Name", DROP COLUMN "Parent_Id", ADD COLUMN "Employee_Id" bigint NULL, ADD COLUMN "IHS_Number" character varying(20) NULL, ADD CONSTRAINT "fk_Laborant_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index bd1fd480..97320192 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:SEKp4pTgTBf9j9WlbMblM56D9bo7EgXZbCgN5aCmycE= +h1:6MHXV9+frKLPEcCO0gFFKAXHpOQ9N2XozZ+BKsjEyPk= 20250829081952.sql h1:YMsYq3uPsx70EjWSGfYnVRR5GV0q1fRGIszYZAWzXNo= 20250901073356.sql h1:jjd5TLs+Pyi0u3SrOM+aNTbHxSJboXgcOz/L4bkYx+c= 20250901080035.sql h1:LWa3X0NWjalVcxNbk5HaHj1Oqu60/AQabi0jBmCeQBI= @@ -8,5 +8,6 @@ h1:SEKp4pTgTBf9j9WlbMblM56D9bo7EgXZbCgN5aCmycE= 20250902105300.sql h1:6N2SDYK3a6djaO6u468E/DrDR9kM+uYoJvNlTFon6bY= 20250903041718.sql h1:ZiaacurDuBwWaI348Sjo7VZ6rSsj9TLTkudiRv05C/w= 20250903073200.sql h1:4i/3uJdYiAuKZ6upRK+xXUHBN7xHSK8G5QjaDkQt8E8= -20250904045113.sql h1:Ak/LiCz/prpIBkufkJkJIrx1/MJUdrryAAhoF2d+6Zg= -20250904045250.sql h1:UhHhYtF1CdKa29LuYb8ZNduVmXQEg9tu0pY0aHe/Njg= +20250904045113.sql h1:/LPs3tJWaQgK2HHdFHjSE/65GQ17rXgQ9NhTlgCiDVo= +20250904045250.sql h1:drbQ0H80dgxnQ26AMfPBwV8wwAOuzSBnoodHwdwV7cI= +20250904050121.sql h1:5AcfudjmiD3Z7wtRcw8i74ryUsMsMfcssnk0CyABvAE= diff --git a/internal/domain/main-entities/laborant/dto.go b/internal/domain/main-entities/laborant/dto.go index 47860e7c..31df3a9e 100644 --- a/internal/domain/main-entities/laborant/dto.go +++ b/internal/domain/main-entities/laborant/dto.go @@ -51,11 +51,11 @@ type ResponseDto struct { func (d Laborant) ToResponse() ResponseDto { resp := ResponseDto{ - Code: d.Code, - Name: d.Name, - Parent_Id: d.Parent_Id, + // Code: d.Code, + // Name: d.Name, + // Parent_Id: d.Parent_Id, } - resp.SmallMain = d.SmallMain + // resp.SmallMain = d.SmallMain return resp } diff --git a/internal/domain/main-entities/laborant/entity.go b/internal/domain/main-entities/laborant/entity.go index 76879825..82870b06 100644 --- a/internal/domain/main-entities/laborant/entity.go +++ b/internal/domain/main-entities/laborant/entity.go @@ -2,11 +2,12 @@ package laborant import ( ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/employee" ) type Laborant struct { - ecore.SmallMain // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` - Parent_Id *int16 `json:"parent_id"` + ecore.Main // adjust this according to the needs + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + IHS_Number *string `json:"ihs_number" gorm:"size:20"` } From e34e810e5192aa4077c072288200c60ae0221eb6 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 4 Sep 2025 12:07:47 +0700 Subject: [PATCH 005/190] feat (employee): add laborant on create and update --- internal/domain/main-entities/laborant/dto.go | 13 ++++--- .../use-case/main-use-case/employee/case.go | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/internal/domain/main-entities/laborant/dto.go b/internal/domain/main-entities/laborant/dto.go index 5bf6ee9b..85c0176e 100644 --- a/internal/domain/main-entities/laborant/dto.go +++ b/internal/domain/main-entities/laborant/dto.go @@ -6,9 +6,8 @@ import ( ) type CreateDto struct { - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` } type ReadListDto struct { @@ -56,11 +55,11 @@ type ResponseDto struct { func (d Laborant) ToResponse() ResponseDto { resp := ResponseDto{ - // Code: d.Code, - // Name: d.Name, - // Parent_Id: d.Parent_Id, + Employee_Id: d.Employee_Id, + Employee: d.Employee, + IHS_Number: d.IHS_Number, } - // resp.SmallMain = d.SmallMain + resp.Main = d.Main return resp } diff --git a/internal/use-case/main-use-case/employee/case.go b/internal/use-case/main-use-case/employee/case.go index 7a489ec8..a6c16652 100644 --- a/internal/use-case/main-use-case/employee/case.go +++ b/internal/use-case/main-use-case/employee/case.go @@ -1,15 +1,18 @@ package employee import ( + "errors" "strconv" ed "simrs-vx/internal/domain/main-entities/doctor" e "simrs-vx/internal/domain/main-entities/employee" + el "simrs-vx/internal/domain/main-entities/laborant" en "simrs-vx/internal/domain/main-entities/nurse" et "simrs-vx/internal/domain/main-entities/nutritionist" ep "simrs-vx/internal/domain/main-entities/pharmacist" ud "simrs-vx/internal/use-case/main-use-case/doctor" + ul "simrs-vx/internal/use-case/main-use-case/laborant" un "simrs-vx/internal/use-case/main-use-case/nurse" ut "simrs-vx/internal/use-case/main-use-case/nutritionist" upe "simrs-vx/internal/use-case/main-use-case/person" @@ -114,6 +117,16 @@ func Create(input e.CreateDto) (*d.Data, error) { if _, err := up.CreateData(createPharmacist, &event, tx); err != nil { return err } + case ero.EPCLab: + createLaborant := el.CreateDto{ + Employee_Id: &data.Id, + IHS_Number: input.IHS_Number, + } + if _, err := ul.CreateData(createLaborant, &event, tx); err != nil { + return err + } + default: + return errors.New("invalid employee position") } mwRunner.setMwType(pu.MWTPost) @@ -376,6 +389,28 @@ func Update(input e.UpdateDto) (*d.Data, error) { if _, err := up.CreateData(createPha, &event, tx); err != nil { return err } + case ero.EPCLab: + readLab := el.ReadDetailDto{Employee_Id: &data.Id} + readLabData, err := ul.ReadDetailData(readLab, &event, tx) + if err != nil { + return err + } + createLab := el.CreateDto{ + Employee_Id: &data.Id, + IHS_Number: input.IHS_Number, + } + if readLabData != nil { + if err := ul.UpdateData(el.UpdateDto{CreateDto: createLab}, readLabData, &event, tx); err != nil { + return err + } + return nil + } + + if _, err := ul.CreateData(createLab, &event, tx); err != nil { + return err + } + default: + return errors.New("invalid employee position") } pl.SetLogInfo(&event, nil, "complete") From 56d9513dd72418bfbb0783239e70030233f2a300 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 4 Sep 2025 19:43:33 +0700 Subject: [PATCH 006/190] wip --- cmd/migration/migrations/20250901073356.sql | 6 - cmd/migration/migrations/20250901080035.sql | 2 - cmd/migration/migrations/20250901105703.sql | 2 - cmd/migration/migrations/20250902052320.sql | 13 - cmd/migration/migrations/20250902063217.sql | 20 - cmd/migration/migrations/20250902105300.sql | 13 - cmd/migration/migrations/20250903041718.sql | 6 - cmd/migration/migrations/20250903073200.sql | 25 -- cmd/migration/migrations/20250904045113.sql | 12 - cmd/migration/migrations/20250904045250.sql | 2 - cmd/migration/migrations/20250904050121.sql | 2 - ...{20250829081952.sql => 20250904105930.sql} | 381 +++++++++++++----- cmd/migration/migrations/atlas.sum | 15 +- internal/domain/main-entities/doctor/dto.go | 54 ++- .../domain/main-entities/doctor/entity.go | 20 +- internal/domain/main-entities/employee/dto.go | 56 +-- .../domain/main-entities/employee/entity.go | 20 +- .../domain/main-entities/encounter/dto.go | 33 +- .../domain/main-entities/encounter/entity.go | 6 + internal/domain/main-entities/infra/dto.go | 14 +- internal/domain/main-entities/nurse/dto.go | 7 + internal/domain/main-entities/nurse/entity.go | 3 + internal/domain/main-entities/patient/dto.go | 11 +- internal/domain/main-entities/room/dto.go | 87 ++++ internal/domain/main-entities/room/entity.go | 21 + .../main-entities/specialist-intern/dto.go | 88 ++++ .../main-entities/specialist-intern/entity.go | 21 + .../domain/main-entities/specialist/dto.go | 72 ++++ .../domain/main-entities/specialist/entity.go | 14 + .../domain/main-entities/subspecialist/dto.go | 72 ++++ .../main-entities/subspecialist/entity.go | 14 + internal/domain/main-entities/unit/entity.go | 12 +- internal/domain/main-entities/user/dto.go | 31 +- internal/domain/main-entities/user/entity.go | 18 +- .../references/organization/organization.go | 27 +- internal/domain/references/person/person.go | 316 +++++++-------- .../interface/main-handler/main-handler.go | 4 + .../main-handler/specialist/handler.go | 71 ++++ .../main-handler/subspecialist/handler.go | 71 ++++ internal/interface/migration/migration.go | 8 + .../use-case/main-use-case/doctor/helper.go | 2 + .../use-case/main-use-case/employee/case.go | 223 +--------- .../use-case/main-use-case/employee/helper.go | 43 +- .../use-case/main-use-case/employee/lib.go | 52 +++ internal/use-case/main-use-case/infra/case.go | 7 + .../use-case/main-use-case/infra/helper.go | 22 +- .../use-case/main-use-case/nurse/helper.go | 1 + .../use-case/main-use-case/person/helper.go | 2 + internal/use-case/main-use-case/room/case.go | 278 +++++++++++++ .../use-case/main-use-case/room/helper.go | 24 ++ internal/use-case/main-use-case/room/lib.go | 155 +++++++ .../main-use-case/room/middleware-runner.go | 103 +++++ .../use-case/main-use-case/room/middleware.go | 9 + .../use-case/main-use-case/room/tycovar.go | 44 ++ .../main-use-case/specialist-intern/case.go | 278 +++++++++++++ .../main-use-case/specialist-intern/helper.go | 24 ++ .../main-use-case/specialist-intern/lib.go | 155 +++++++ .../specialist-intern/middleware-runner.go | 103 +++++ .../specialist-intern/middleware.go | 9 + .../specialist-intern/tycovar.go | 44 ++ .../use-case/main-use-case/specialist/case.go | 278 +++++++++++++ .../main-use-case/specialist/helper.go | 23 ++ .../use-case/main-use-case/specialist/lib.go | 155 +++++++ .../specialist/middleware-runner.go | 103 +++++ .../main-use-case/specialist/middleware.go | 9 + .../main-use-case/specialist/tycovar.go | 44 ++ .../main-use-case/subspecialist/case.go | 278 +++++++++++++ .../main-use-case/subspecialist/helper.go | 23 ++ .../main-use-case/subspecialist/lib.go | 155 +++++++ .../subspecialist/middleware-runner.go | 103 +++++ .../main-use-case/subspecialist/middleware.go | 9 + .../main-use-case/subspecialist/tycovar.go | 44 ++ internal/use-case/main-use-case/user/case.go | 277 +++++++++++++ .../use-case/main-use-case/user/helper.go | 45 ++- 74 files changed, 4041 insertions(+), 753 deletions(-) delete mode 100644 cmd/migration/migrations/20250901073356.sql delete mode 100644 cmd/migration/migrations/20250901080035.sql delete mode 100644 cmd/migration/migrations/20250901105703.sql delete mode 100644 cmd/migration/migrations/20250902052320.sql delete mode 100644 cmd/migration/migrations/20250902063217.sql delete mode 100644 cmd/migration/migrations/20250902105300.sql delete mode 100644 cmd/migration/migrations/20250903041718.sql delete mode 100644 cmd/migration/migrations/20250903073200.sql delete mode 100644 cmd/migration/migrations/20250904045113.sql delete mode 100644 cmd/migration/migrations/20250904045250.sql delete mode 100644 cmd/migration/migrations/20250904050121.sql rename cmd/migration/migrations/{20250829081952.sql => 20250904105930.sql} (70%) create mode 100644 internal/domain/main-entities/room/dto.go create mode 100644 internal/domain/main-entities/room/entity.go create mode 100644 internal/domain/main-entities/specialist-intern/dto.go create mode 100644 internal/domain/main-entities/specialist-intern/entity.go create mode 100644 internal/domain/main-entities/specialist/dto.go create mode 100644 internal/domain/main-entities/specialist/entity.go create mode 100644 internal/domain/main-entities/subspecialist/dto.go create mode 100644 internal/domain/main-entities/subspecialist/entity.go create mode 100644 internal/interface/main-handler/specialist/handler.go create mode 100644 internal/interface/main-handler/subspecialist/handler.go create mode 100644 internal/use-case/main-use-case/room/case.go create mode 100644 internal/use-case/main-use-case/room/helper.go create mode 100644 internal/use-case/main-use-case/room/lib.go create mode 100644 internal/use-case/main-use-case/room/middleware-runner.go create mode 100644 internal/use-case/main-use-case/room/middleware.go create mode 100644 internal/use-case/main-use-case/room/tycovar.go create mode 100644 internal/use-case/main-use-case/specialist-intern/case.go create mode 100644 internal/use-case/main-use-case/specialist-intern/helper.go create mode 100644 internal/use-case/main-use-case/specialist-intern/lib.go create mode 100644 internal/use-case/main-use-case/specialist-intern/middleware-runner.go create mode 100644 internal/use-case/main-use-case/specialist-intern/middleware.go create mode 100644 internal/use-case/main-use-case/specialist-intern/tycovar.go create mode 100644 internal/use-case/main-use-case/specialist/case.go create mode 100644 internal/use-case/main-use-case/specialist/helper.go create mode 100644 internal/use-case/main-use-case/specialist/lib.go create mode 100644 internal/use-case/main-use-case/specialist/middleware-runner.go create mode 100644 internal/use-case/main-use-case/specialist/middleware.go create mode 100644 internal/use-case/main-use-case/specialist/tycovar.go create mode 100644 internal/use-case/main-use-case/subspecialist/case.go create mode 100644 internal/use-case/main-use-case/subspecialist/helper.go create mode 100644 internal/use-case/main-use-case/subspecialist/lib.go create mode 100644 internal/use-case/main-use-case/subspecialist/middleware-runner.go create mode 100644 internal/use-case/main-use-case/subspecialist/middleware.go create mode 100644 internal/use-case/main-use-case/subspecialist/tycovar.go diff --git a/cmd/migration/migrations/20250901073356.sql b/cmd/migration/migrations/20250901073356.sql deleted file mode 100644 index 4ffe005f..00000000 --- a/cmd/migration/migrations/20250901073356.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Modify "Infra" table -ALTER TABLE "public"."Infra" ALTER COLUMN "Parent_Id" TYPE integer; --- Modify "User" table -ALTER TABLE "public"."User" ADD CONSTRAINT "uni_User_Name" UNIQUE ("Name"); --- Modify "Employee" table -ALTER TABLE "public"."Employee" ADD CONSTRAINT "fk_Employee_Person" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_Employee_User" FOREIGN KEY ("User_Id") REFERENCES "public"."User" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/migration/migrations/20250901080035.sql b/cmd/migration/migrations/20250901080035.sql deleted file mode 100644 index 8b41cd0d..00000000 --- a/cmd/migration/migrations/20250901080035.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Modify "McuSrc" table -ALTER TABLE "public"."McuSrc" ADD CONSTRAINT "fk_McuSrc_CheckupCategory" FOREIGN KEY ("CheckupCategory_Code") REFERENCES "public"."McuSrcCategory" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/migration/migrations/20250901105703.sql b/cmd/migration/migrations/20250901105703.sql deleted file mode 100644 index e9c47a1a..00000000 --- a/cmd/migration/migrations/20250901105703.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Modify "Person" table -ALTER TABLE "public"."Person" ADD COLUMN "FrontTitle" character varying(50) NULL, ADD COLUMN "EndTitle" character varying(50) NULL; diff --git a/cmd/migration/migrations/20250902052320.sql b/cmd/migration/migrations/20250902052320.sql deleted file mode 100644 index 44605a16..00000000 --- a/cmd/migration/migrations/20250902052320.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Create "Language" table -CREATE TABLE "public"."Language" ( - "Id" bigserial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Code" character varying(10) NULL, - "Name" character varying(50) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "uni_Language_Code" UNIQUE ("Code") -); --- Modify "Person" table -ALTER TABLE "public"."Person" ADD COLUMN "PassportNumber" character varying(20) NULL, ADD COLUMN "DrivingLicenseNumber" character varying(20) NULL, ADD COLUMN "Language_Code" character varying(10) NULL, ADD CONSTRAINT "fk_Person_Language" FOREIGN KEY ("Language_Code") REFERENCES "public"."Language" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/migration/migrations/20250902063217.sql b/cmd/migration/migrations/20250902063217.sql deleted file mode 100644 index 9231a697..00000000 --- a/cmd/migration/migrations/20250902063217.sql +++ /dev/null @@ -1,20 +0,0 @@ --- Create "PersonRelative" table -CREATE TABLE "public"."PersonRelative" ( - "Id" bigserial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Person_Id" bigint NULL, - "Relationship_Code" character varying(100) NOT NULL, - "Name" character varying(100) NULL, - "Address" character varying(100) NULL, - "Village_Code" character varying(10) NULL, - "Gender_Code" character varying(10) NULL, - "PhoneNumber" character varying(30) NULL, - "Education_Code" character varying(10) NULL, - "Occupation_Code" character varying(10) NULL, - "Occupation_Name" character varying(50) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "fk_PersonRelative_Village" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, - CONSTRAINT "fk_Person_Relatives" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION -); diff --git a/cmd/migration/migrations/20250902105300.sql b/cmd/migration/migrations/20250902105300.sql deleted file mode 100644 index 8401f8ba..00000000 --- a/cmd/migration/migrations/20250902105300.sql +++ /dev/null @@ -1,13 +0,0 @@ --- Create "Patient" table -CREATE TABLE "public"."Patient" ( - "Id" bigserial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Person_Id" bigint NULL, - "RegisteredAt" timestamptz NULL, - "Status_Code" character varying(10) NOT NULL, - "Number" character varying(15) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "fk_Patient_Person" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION -); diff --git a/cmd/migration/migrations/20250903041718.sql b/cmd/migration/migrations/20250903041718.sql deleted file mode 100644 index 53986785..00000000 --- a/cmd/migration/migrations/20250903041718.sql +++ /dev/null @@ -1,6 +0,0 @@ --- Modify "Device" table -ALTER TABLE "public"."Device" ALTER COLUMN "Name" SET NOT NULL; --- Modify "Person" table -ALTER TABLE "public"."Person" ADD CONSTRAINT "uni_Person_DrivingLicenseNumber" UNIQUE ("DrivingLicenseNumber"), ADD CONSTRAINT "uni_Person_PassportNumber" UNIQUE ("PassportNumber"), ADD CONSTRAINT "uni_Person_ResidentIdentityNumber" UNIQUE ("ResidentIdentityNumber"); --- Modify "Nurse" table -ALTER TABLE "public"."Nurse" ADD COLUMN "Unit_Id" integer NULL, ADD CONSTRAINT "fk_Nurse_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/migration/migrations/20250903073200.sql b/cmd/migration/migrations/20250903073200.sql deleted file mode 100644 index 9d6923a7..00000000 --- a/cmd/migration/migrations/20250903073200.sql +++ /dev/null @@ -1,25 +0,0 @@ --- Modify "MedicineGroup" table -ALTER TABLE "public"."MedicineGroup" ALTER COLUMN "Code" TYPE character varying(10), ALTER COLUMN "Name" TYPE character varying(50); --- Modify "MedicineMethod" table -ALTER TABLE "public"."MedicineMethod" ALTER COLUMN "Code" TYPE character varying(10), ALTER COLUMN "Name" TYPE character varying(50); --- Create "Encounter" table -CREATE TABLE "public"."Encounter" ( - "Id" bigserial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Patient_Id" bigint NULL, - "RegisteredAt" timestamptz NULL, - "Class_Code" character varying(10) NOT NULL, - "Unit_Id" bigint NULL, - "VisitDate" timestamptz NULL, - "Assignment_Doctor_Id" bigint NULL, - "Responsible_Doctor_Id" bigint NULL, - "DischardeMethod_Code" character varying(10) NULL, - "RefSource_Name" character varying(100) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "fk_Encounter_Assignment_Doctor" FOREIGN KEY ("Assignment_Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, - CONSTRAINT "fk_Encounter_Patient" FOREIGN KEY ("Patient_Id") REFERENCES "public"."Patient" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, - CONSTRAINT "fk_Encounter_Responsible_Doctor" FOREIGN KEY ("Responsible_Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, - CONSTRAINT "fk_Encounter_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION -); diff --git a/cmd/migration/migrations/20250904045113.sql b/cmd/migration/migrations/20250904045113.sql deleted file mode 100644 index cbdcca65..00000000 --- a/cmd/migration/migrations/20250904045113.sql +++ /dev/null @@ -1,12 +0,0 @@ --- Create "Laborant" table -CREATE TABLE "public"."Laborant" ( - "Id" serial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Code" character varying(10) NULL, - "Name" character varying(50) NULL, - "Parent_Id" smallint NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "uni_Laborant_Code" UNIQUE ("Code") -); diff --git a/cmd/migration/migrations/20250904045250.sql b/cmd/migration/migrations/20250904045250.sql deleted file mode 100644 index ce493659..00000000 --- a/cmd/migration/migrations/20250904045250.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Modify "Patient" table -ALTER TABLE "public"."Patient" ADD CONSTRAINT "uni_Patient_Number" UNIQUE ("Number"); diff --git a/cmd/migration/migrations/20250904050121.sql b/cmd/migration/migrations/20250904050121.sql deleted file mode 100644 index 40202be4..00000000 --- a/cmd/migration/migrations/20250904050121.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Modify "Laborant" table -ALTER TABLE "public"."Laborant" ALTER COLUMN "Id" TYPE bigint, DROP COLUMN "Code", DROP COLUMN "Name", DROP COLUMN "Parent_Id", ADD COLUMN "Employee_Id" bigint NULL, ADD COLUMN "IHS_Number" character varying(20) NULL, ADD CONSTRAINT "fk_Laborant_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/migration/migrations/20250829081952.sql b/cmd/migration/migrations/20250904105930.sql similarity index 70% rename from cmd/migration/migrations/20250829081952.sql rename to cmd/migration/migrations/20250904105930.sql index c74cb017..39175bfb 100644 --- a/cmd/migration/migrations/20250829081952.sql +++ b/cmd/migration/migrations/20250904105930.sql @@ -10,6 +10,29 @@ CREATE TABLE "public"."DiagnoseSrc" ( PRIMARY KEY ("Id"), CONSTRAINT "uni_DiagnoseSrc_Code" UNIQUE ("Code") ); +-- Create "PharmacyCompany" table +CREATE TABLE "public"."PharmacyCompany" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(20) NULL, + "Name" character varying(100) NULL, + "Regency_Code" character varying(4) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_PharmacyCompany_Code" UNIQUE ("Code") +); +-- Create "Uom" table +CREATE TABLE "public"."Uom" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(10) NULL, + "Name" character varying(50) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Uom_Code" UNIQUE ("Code") +); -- Create "Counter" table CREATE TABLE "public"."Counter" ( "Id" serial NOT NULL, @@ -25,68 +48,6 @@ CREATE TABLE "public"."Counter" ( PRIMARY KEY ("Id"), CONSTRAINT "uni_Counter_Code" UNIQUE ("Code") ); --- Create "McuSrcCategory" table -CREATE TABLE "public"."McuSrcCategory" ( - "Id" serial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Code" character varying(20) NULL, - "Name" character varying(50) NULL, - "Scope_Code" character varying(10) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "uni_McuSrcCategory_Code" UNIQUE ("Code") -); --- Create "McuSrc" table -CREATE TABLE "public"."McuSrc" ( - "Id" serial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Code" character varying(20) NULL, - "Name" character varying(50) NULL, - "CheckupCategory_Code" character varying(20) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "uni_McuSrc_Code" UNIQUE ("Code") -); --- Create "Uom" table -CREATE TABLE "public"."Uom" ( - "Id" serial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Code" character varying(10) NULL, - "Name" character varying(50) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "uni_Uom_Code" UNIQUE ("Code") -); --- Create "PharmacyCompany" table -CREATE TABLE "public"."PharmacyCompany" ( - "Id" bigserial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Code" character varying(20) NULL, - "Name" character varying(100) NULL, - "Regency_Code" character varying(4) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "uni_PharmacyCompany_Code" UNIQUE ("Code") -); --- Create "User" table -CREATE TABLE "public"."User" ( - "Id" bigserial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Name" character varying(25) NOT NULL, - "Password" character varying(255) NOT NULL, - "Status_Code" character varying(10) NOT NULL, - "FailedLoginCount" smallint NULL, - "LoginAttemptCount" bigint NULL, - "LastSuccessLogin" timestamptz NULL, - "LastAllowdLogin" timestamptz NULL, - PRIMARY KEY ("Id") -); -- Create "Item" table CREATE TABLE "public"."Item" ( "Id" bigserial NOT NULL, @@ -112,7 +73,7 @@ CREATE TABLE "public"."Infra" ( "Code" character varying(10) NULL, "Name" character varying(50) NULL, "InfraGroup_Code" character varying(10) NULL, - "Parent_Id" smallint NULL, + "Parent_Id" integer NULL, "Item_Id" bigint NULL, PRIMARY KEY ("Id"), CONSTRAINT "uni_Infra_Code" UNIQUE ("Code"), @@ -125,7 +86,7 @@ CREATE TABLE "public"."Device" ( "UpdatedAt" timestamptz NULL, "DeletedAt" timestamptz NULL, "Code" character varying(10) NULL, - "Name" character varying(50) NULL, + "Name" character varying(50) NOT NULL, "Uom_Code" character varying(10) NULL, "Infra_Id" integer NULL, "Item_Id" bigint NULL, @@ -188,6 +149,73 @@ CREATE TABLE "public"."DivisionPosition" ( CONSTRAINT "uni_DivisionPosition_Code" UNIQUE ("Code"), CONSTRAINT "fk_DivisionPosition_Division" FOREIGN KEY ("Division_Id") REFERENCES "public"."Division" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); +-- Create "Ethnic" table +CREATE TABLE "public"."Ethnic" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(20) NULL, + "Name" character varying(50) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Ethnic_Code" UNIQUE ("Code") +); +-- Create "Language" table +CREATE TABLE "public"."Language" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(10) NULL, + "Name" character varying(50) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Language_Code" UNIQUE ("Code") +); +-- Create "Person" table +CREATE TABLE "public"."Person" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Name" character varying(150) NOT NULL, + "FrontTitle" character varying(50) NULL, + "EndTitle" character varying(50) NULL, + "BirthDate" timestamptz NULL, + "BirthRegency_Code" character varying(4) NULL, + "Gender_Code" character varying(10) NULL, + "ResidentIdentityNumber" character varying(16) NULL, + "PassportNumber" character varying(20) NULL, + "DrivingLicenseNumber" character varying(20) NULL, + "Religion_Code" character varying(10) NULL, + "Education_Code" character varying(10) NULL, + "Ocupation_Code" character varying(15) NULL, + "Ocupation_Name" character varying(50) NULL, + "Ethnic_Code" character varying(20) NULL, + "Language_Code" character varying(10) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Person_DrivingLicenseNumber" UNIQUE ("DrivingLicenseNumber"), + CONSTRAINT "uni_Person_PassportNumber" UNIQUE ("PassportNumber"), + CONSTRAINT "uni_Person_ResidentIdentityNumber" UNIQUE ("ResidentIdentityNumber"), + CONSTRAINT "fk_Person_Ethnic" FOREIGN KEY ("Ethnic_Code") REFERENCES "public"."Ethnic" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Person_Language" FOREIGN KEY ("Language_Code") REFERENCES "public"."Language" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "User" table +CREATE TABLE "public"."User" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Name" character varying(25) NOT NULL, + "Password" character varying(255) NOT NULL, + "Status_Code" character varying(10) NOT NULL, + "FailedLoginCount" smallint NULL, + "Position_Code" character varying(20) NOT NULL, + "LoginAttemptCount" bigint NULL, + "LastSuccessLogin" timestamptz NULL, + "LastAllowdLogin" timestamptz NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_User_Name" UNIQUE ("Name") +); -- Create "Employee" table CREATE TABLE "public"."Employee" ( "Id" bigserial NOT NULL, @@ -196,12 +224,13 @@ CREATE TABLE "public"."Employee" ( "DeletedAt" timestamptz NULL, "User_Id" bigint NULL, "Person_Id" bigint NULL, - "Position_Code" character varying(20) NOT NULL, "Division_Code" character varying(10) NULL, "Number" character varying(20) NULL, "Status_Code" character varying(10) NOT NULL, PRIMARY KEY ("Id"), - CONSTRAINT "fk_Employee_Division" FOREIGN KEY ("Division_Code") REFERENCES "public"."Division" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION + CONSTRAINT "fk_Employee_Division" FOREIGN KEY ("Division_Code") REFERENCES "public"."Division" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Employee_Person" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Employee_User" FOREIGN KEY ("User_Id") REFERENCES "public"."User" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); -- Create "Installation" table CREATE TABLE "public"."Installation" ( @@ -224,10 +253,37 @@ CREATE TABLE "public"."Unit" ( "Installation_Id" integer NULL, "Code" character varying(10) NULL, "Name" character varying(50) NULL, + "Type_Code" text NULL, PRIMARY KEY ("Id"), CONSTRAINT "uni_Unit_Code" UNIQUE ("Code"), CONSTRAINT "fk_Unit_Installation" FOREIGN KEY ("Installation_Id") REFERENCES "public"."Installation" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); +-- Create "Specialist" table +CREATE TABLE "public"."Specialist" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(10) NULL, + "Name" character varying(50) NULL, + "Unit_Id" integer NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Specialist_Code" UNIQUE ("Code"), + CONSTRAINT "fk_Specialist_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Subspecialist" table +CREATE TABLE "public"."Subspecialist" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(10) NULL, + "Name" character varying(50) NULL, + "Specialist_Id" integer NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Subspecialist_Code" UNIQUE ("Code"), + CONSTRAINT "fk_Subspecialist_Specialist" FOREIGN KEY ("Specialist_Id") REFERENCES "public"."Specialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); -- Create "Doctor" table CREATE TABLE "public"."Doctor" ( "Id" bigserial NOT NULL, @@ -237,9 +293,13 @@ CREATE TABLE "public"."Doctor" ( "Employee_Id" bigint NULL, "IHS_Number" character varying(20) NULL, "SIP_Number" character varying(20) NULL, - "Unit_Id" bigint NULL, + "Unit_Id" integer NULL, + "Specialist_Id" integer NULL, + "Subspecialist_Id" integer NULL, PRIMARY KEY ("Id"), CONSTRAINT "fk_Doctor_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Doctor_Specialist" FOREIGN KEY ("Specialist_Id") REFERENCES "public"."Specialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Doctor_Subspecialist" FOREIGN KEY ("Subspecialist_Id") REFERENCES "public"."Subspecialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT "fk_Doctor_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); -- Create "DoctorFee" table @@ -256,6 +316,45 @@ CREATE TABLE "public"."DoctorFee" ( CONSTRAINT "fk_DoctorFee_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT "fk_DoctorFee_Item" FOREIGN KEY ("Item_Id") REFERENCES "public"."Item" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); +-- Create "Patient" table +CREATE TABLE "public"."Patient" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Person_Id" bigint NULL, + "RegisteredAt" timestamptz NULL, + "Status_Code" character varying(10) NOT NULL, + "Number" character varying(15) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Patient_Number" UNIQUE ("Number"), + CONSTRAINT "fk_Patient_Person" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Encounter" table +CREATE TABLE "public"."Encounter" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Patient_Id" bigint NULL, + "RegisteredAt" timestamptz NULL, + "Class_Code" character varying(10) NOT NULL, + "Unit_Id" bigint NULL, + "Specialist_Id" integer NULL, + "Subspecialist_Id" integer NULL, + "VisitDate" timestamptz NULL, + "Assignment_Doctor_Id" bigint NULL, + "Responsible_Doctor_Id" bigint NULL, + "DischardeMethod_Code" character varying(10) NULL, + "RefSource_Name" character varying(100) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Encounter_Assignment_Doctor" FOREIGN KEY ("Assignment_Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Encounter_Patient" FOREIGN KEY ("Patient_Id") REFERENCES "public"."Patient" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Encounter_Responsible_Doctor" FOREIGN KEY ("Responsible_Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Encounter_Specialist" FOREIGN KEY ("Specialist_Id") REFERENCES "public"."Specialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Encounter_Subspecialist" FOREIGN KEY ("Subspecialist_Id") REFERENCES "public"."Subspecialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Encounter_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); -- Create "InsuranceCompany" table CREATE TABLE "public"."InsuranceCompany" ( "Id" serial NOT NULL, @@ -284,6 +383,17 @@ CREATE TABLE "public"."ItemPrice" ( CONSTRAINT "fk_ItemPrice_InsuranceCompany" FOREIGN KEY ("InsuranceCompany_Code") REFERENCES "public"."InsuranceCompany" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT "fk_ItemPrice_Item" FOREIGN KEY ("Item_Id") REFERENCES "public"."Item" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); +-- Create "Laborant" table +CREATE TABLE "public"."Laborant" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Employee_Id" bigint NULL, + "IHS_Number" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Laborant_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); -- Create "Material" table CREATE TABLE "public"."Material" ( "Id" bigserial NOT NULL, @@ -302,6 +412,31 @@ CREATE TABLE "public"."Material" ( CONSTRAINT "fk_Material_Item" FOREIGN KEY ("Item_Id") REFERENCES "public"."Item" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT "fk_Material_Uom" FOREIGN KEY ("Uom_Code") REFERENCES "public"."Uom" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION ); +-- Create "McuSrcCategory" table +CREATE TABLE "public"."McuSrcCategory" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(20) NULL, + "Name" character varying(50) NULL, + "Scope_Code" character varying(10) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_McuSrcCategory_Code" UNIQUE ("Code") +); +-- Create "McuSrc" table +CREATE TABLE "public"."McuSrc" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(20) NULL, + "Name" character varying(50) NULL, + "CheckupCategory_Code" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_McuSrc_Code" UNIQUE ("Code"), + CONSTRAINT "fk_McuSrc_CheckupCategory" FOREIGN KEY ("CheckupCategory_Code") REFERENCES "public"."McuSrcCategory" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); -- Create "MedicalActionSrc" table CREATE TABLE "public"."MedicalActionSrc" ( "Id" bigserial NOT NULL, @@ -347,8 +482,8 @@ CREATE TABLE "public"."MedicineGroup" ( "CreatedAt" timestamptz NULL, "UpdatedAt" timestamptz NULL, "DeletedAt" timestamptz NULL, - "Code" character varying(50) NULL, - "Name" character varying(100) NULL, + "Code" character varying(10) NULL, + "Name" character varying(50) NULL, PRIMARY KEY ("Id"), CONSTRAINT "uni_MedicineGroup_Code" UNIQUE ("Code") ); @@ -358,8 +493,8 @@ CREATE TABLE "public"."MedicineMethod" ( "CreatedAt" timestamptz NULL, "UpdatedAt" timestamptz NULL, "DeletedAt" timestamptz NULL, - "Code" character varying(50) NULL, - "Name" character varying(100) NULL, + "Code" character varying(10) NULL, + "Name" character varying(50) NULL, PRIMARY KEY ("Id"), CONSTRAINT "uni_MedicineMethod_Code" UNIQUE ("Code") ); @@ -416,8 +551,12 @@ CREATE TABLE "public"."Nurse" ( "DeletedAt" timestamptz NULL, "Employee_Id" bigint NULL, "IHS_Number" character varying(20) NULL, + "Unit_Id" integer NULL, + "Infra_Id" integer NULL, PRIMARY KEY ("Id"), - CONSTRAINT "fk_Nurse_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION + CONSTRAINT "fk_Nurse_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Nurse_Infra" FOREIGN KEY ("Infra_Id") REFERENCES "public"."Infra" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Nurse_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); -- Create "Nutritionist" table CREATE TABLE "public"."Nutritionist" ( @@ -430,36 +569,6 @@ CREATE TABLE "public"."Nutritionist" ( PRIMARY KEY ("Id"), CONSTRAINT "fk_Nutritionist_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); --- Create "Ethnic" table -CREATE TABLE "public"."Ethnic" ( - "Id" serial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Code" character varying(20) NULL, - "Name" character varying(50) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "uni_Ethnic_Code" UNIQUE ("Code") -); --- Create "Person" table -CREATE TABLE "public"."Person" ( - "Id" bigserial NOT NULL, - "CreatedAt" timestamptz NULL, - "UpdatedAt" timestamptz NULL, - "DeletedAt" timestamptz NULL, - "Name" character varying(150) NOT NULL, - "BirthDate" timestamptz NULL, - "BirthRegency_Code" character varying(4) NULL, - "Gender_Code" character varying(10) NULL, - "ResidentIdentityNumber" character varying(16) NULL, - "Religion_Code" character varying(10) NULL, - "Education_Code" character varying(10) NULL, - "Ocupation_Code" character varying(15) NULL, - "Ocupation_Name" character varying(50) NULL, - "Ethnic_Code" character varying(20) NULL, - PRIMARY KEY ("Id"), - CONSTRAINT "fk_Person_Ethnic" FOREIGN KEY ("Ethnic_Code") REFERENCES "public"."Ethnic" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION -); -- Create "PersonAddress" table CREATE TABLE "public"."PersonAddress" ( "Id" bigserial NOT NULL, @@ -486,6 +595,36 @@ CREATE TABLE "public"."PersonContact" ( PRIMARY KEY ("Id"), CONSTRAINT "fk_Person_Contacts" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); +-- Create "Village" table +CREATE TABLE "public"."Village" ( + "Id" bigserial NOT NULL, + "District_Code" character varying(6) NULL, + "Code" character varying(10) NULL, + "Name" character varying(50) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Village_Code" UNIQUE ("Code"), + CONSTRAINT "fk_District_Villages" FOREIGN KEY ("District_Code") REFERENCES "public"."District" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "PersonRelative" table +CREATE TABLE "public"."PersonRelative" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Person_Id" bigint NULL, + "Relationship_Code" character varying(100) NOT NULL, + "Name" character varying(100) NULL, + "Address" character varying(100) NULL, + "Village_Code" character varying(10) NULL, + "Gender_Code" character varying(10) NULL, + "PhoneNumber" character varying(30) NULL, + "Education_Code" character varying(10) NULL, + "Occupation_Code" character varying(10) NULL, + "Occupation_Name" character varying(50) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_PersonRelative_Village" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Person_Relatives" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); -- Create "Pharmacist" table CREATE TABLE "public"."Pharmacist" ( "Id" bigserial NOT NULL, @@ -512,13 +651,35 @@ CREATE TABLE "public"."PracticeSchedule" ( CONSTRAINT "fk_PracticeSchedule_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT "fk_PracticeSchedule_Unit" FOREIGN KEY ("Unit_Code") REFERENCES "public"."Unit" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION ); --- Create "Village" table -CREATE TABLE "public"."Village" ( - "Id" bigserial NOT NULL, - "District_Code" character varying(6) NULL, - "Code" character varying(10) NULL, - "Name" character varying(50) NULL, +-- Create "Room" table +CREATE TABLE "public"."Room" ( + "Id" serial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Infra_Id" integer NULL, + "Unit_Id" integer NULL, + "Specialist_Id" integer NULL, + "Subspecialist_Id" integer NULL, PRIMARY KEY ("Id"), - CONSTRAINT "uni_Village_Code" UNIQUE ("Code"), - CONSTRAINT "fk_District_Villages" FOREIGN KEY ("District_Code") REFERENCES "public"."District" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION + CONSTRAINT "fk_Room_Infra" FOREIGN KEY ("Infra_Id") REFERENCES "public"."Infra" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Room_Specialist" FOREIGN KEY ("Specialist_Id") REFERENCES "public"."Specialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Room_Subspecialist" FOREIGN KEY ("Subspecialist_Id") REFERENCES "public"."Subspecialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Room_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "SpecialistIntern" table +CREATE TABLE "public"."SpecialistIntern" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Person_Id" bigint NULL, + "Specialist_Id" integer NULL, + "Subspecialist_Id" integer NULL, + "User_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_SpecialistIntern_Person" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_SpecialistIntern_Specialist" FOREIGN KEY ("Specialist_Id") REFERENCES "public"."Specialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_SpecialistIntern_Subspecialist" FOREIGN KEY ("Subspecialist_Id") REFERENCES "public"."Subspecialist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_SpecialistIntern_User" FOREIGN KEY ("User_Id") REFERENCES "public"."User" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION ); diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index 97320192..fe2b15b0 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,13 +1,2 @@ -h1:6MHXV9+frKLPEcCO0gFFKAXHpOQ9N2XozZ+BKsjEyPk= -20250829081952.sql h1:YMsYq3uPsx70EjWSGfYnVRR5GV0q1fRGIszYZAWzXNo= -20250901073356.sql h1:jjd5TLs+Pyi0u3SrOM+aNTbHxSJboXgcOz/L4bkYx+c= -20250901080035.sql h1:LWa3X0NWjalVcxNbk5HaHj1Oqu60/AQabi0jBmCeQBI= -20250901105703.sql h1:2h2B/wOFM0826sBXQutTtq24C+5duLqi4zEFOdbPsCI= -20250902052320.sql h1:+tWdeS4NorPj5WdKHMirBfP4EeS01wyyfdT03DBMmcI= -20250902063217.sql h1:wYFIrAIp1RczNvzlmu8jP8P1J7xEXqgDLKDUNBbkt84= -20250902105300.sql h1:6N2SDYK3a6djaO6u468E/DrDR9kM+uYoJvNlTFon6bY= -20250903041718.sql h1:ZiaacurDuBwWaI348Sjo7VZ6rSsj9TLTkudiRv05C/w= -20250903073200.sql h1:4i/3uJdYiAuKZ6upRK+xXUHBN7xHSK8G5QjaDkQt8E8= -20250904045113.sql h1:/LPs3tJWaQgK2HHdFHjSE/65GQ17rXgQ9NhTlgCiDVo= -20250904045250.sql h1:drbQ0H80dgxnQ26AMfPBwV8wwAOuzSBnoodHwdwV7cI= -20250904050121.sql h1:5AcfudjmiD3Z7wtRcw8i74ryUsMsMfcssnk0CyABvAE= +h1:5CRUsZFEhBmTlYz30l5g/ilZWIUjrfTf7K0qa5ffXQg= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= diff --git a/internal/domain/main-entities/doctor/dto.go b/internal/domain/main-entities/doctor/dto.go index f016cc1f..3d744a32 100644 --- a/internal/domain/main-entities/doctor/dto.go +++ b/internal/domain/main-entities/doctor/dto.go @@ -3,14 +3,18 @@ package doctor import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/employee" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" ) type CreateDto struct { - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number"` - SIP_Number *string `json:"sip_number"` - Unit_Id *uint `json:"unit_id"` + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number"` + SIP_Number *string `json:"sip_number"` + Unit_Id *uint16 `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` } type ReadListDto struct { @@ -20,10 +24,12 @@ type ReadListDto struct { } type FilterDto struct { - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` - SIP_Number *string `json:"sip_number" validate:"maxLength=20"` - Unit_Id *uint `json:"unit_id"` + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` + SIP_Number *string `json:"sip_number" validate:"maxLength=20"` + Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -54,22 +60,30 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty"` - IHS_Number *string `json:"ihs_number"` - SIP_Number *string `json:"sip_number"` - Unit_Id *uint `json:"unit_id"` - Unit *eu.Unit `json:"unit,omitempty"` + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty"` + IHS_Number *string `json:"ihs_number"` + SIP_Number *string `json:"sip_number"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" ` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` } func (d Doctor) ToResponse() ResponseDto { resp := ResponseDto{ - Employee_Id: d.Employee_Id, - Employee: d.Employee, - IHS_Number: d.IHS_Number, - SIP_Number: d.SIP_Number, - Unit_Id: d.Unit_Id, - Unit: d.Unit, + Employee_Id: d.Employee_Id, + Employee: d.Employee, + IHS_Number: d.IHS_Number, + SIP_Number: d.SIP_Number, + Unit_Id: d.Unit_Id, + Unit: d.Unit, + Specialist_Id: d.Specialist_Id, + Specialist: d.Specialist, + Subspecialist_Id: d.Subspecialist_Id, + Subspecialist: d.Subspecialist, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/doctor/entity.go b/internal/domain/main-entities/doctor/entity.go index f73356ea..55d45354 100644 --- a/internal/domain/main-entities/doctor/entity.go +++ b/internal/domain/main-entities/doctor/entity.go @@ -3,15 +3,21 @@ package doctor import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/employee" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" ) type Doctor struct { - ecore.Main // adjust this according to the needs - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` - SIP_Number *string `json:"sip_number" gorm:"size:20"` - Unit_Id *uint `json:"unit_id"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` + ecore.Main // adjust this according to the needs + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + IHS_Number *string `json:"ihs_number" gorm:"size:20"` + SIP_Number *string `json:"sip_number" gorm:"size:20"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` } diff --git a/internal/domain/main-entities/employee/dto.go b/internal/domain/main-entities/employee/dto.go index 371d82a1..762e72a4 100644 --- a/internal/domain/main-entities/employee/dto.go +++ b/internal/domain/main-entities/employee/dto.go @@ -4,27 +4,16 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/division" ep "simrs-vx/internal/domain/main-entities/person" - epa "simrs-vx/internal/domain/main-entities/person-address" - epc "simrs-vx/internal/domain/main-entities/person-contact" eu "simrs-vx/internal/domain/main-entities/user" erc "simrs-vx/internal/domain/references/common" - ero "simrs-vx/internal/domain/references/organization" ) type CreateDto struct { - User_Id *uint `json:"user_id"` - User *eu.CreateDto `json:"user"` - Person_Id *uint `json:"-"` - Person *ep.UpdateDto `json:"person"` - PersonAddresses []epa.UpdateDto `json:"personAddresses"` - PersonContacts []epc.UpdateDto `json:"personContacts"` - Position_Code ero.EmployeePosisitionCode `json:"position_code" validate:"maxLength=20"` - Division_Code *string `json:"division_code"` - Number *string `json:"number" validate:"maxLength=20"` - Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` - IHS_Number *string `json:"ihs_number"` - SIP_Number *string `json:"sip_number"` - Unit_Id *uint `json:"unit_id"` + User_Id *uint `json:"user_id"` + Person_Id *uint `json:"person_id"` + Division_Code *string `json:"division_code"` + Number *string `json:"number" validate:"maxLength=20"` + Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` } type ReadListDto struct { @@ -34,12 +23,11 @@ type ReadListDto struct { } type FilterDto struct { - User_Id *uint `json:"user_id"` - Person_Id *uint `json:"person_id"` - Position_Code ero.EmployeePosisitionCode `json:"position_code"` - Division_Code *string `json:"division_code"` - Number *string `json:"number"` - Status_Code erc.ActiveStatusCode `json:"status_code"` + User_Id *uint `json:"user_id"` + Person_Id *uint `json:"person_id"` + Division_Code *string `json:"division_code"` + Number *string `json:"number"` + Status_Code erc.ActiveStatusCode `json:"status_code"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -70,15 +58,14 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - User_Id *uint `json:"user_id"` - User *eu.User `json:"user,omitempty"` - Person_Id *uint `json:"person_id"` - Person *ep.Person `json:"person,omitempty"` - Position_Code ero.EmployeePosisitionCode `json:"position_code"` - Division_Code *string `json:"division_code"` - Division *ed.Division `json:"division,omitempty"` - Number *string `json:"number"` - Status_Code erc.ActiveStatusCode `json:"status_code"` + User_Id *uint `json:"user_id"` + User *eu.User `json:"user,omitempty"` + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty"` + Division_Code *string `json:"division_code"` + Division *ed.Division `json:"division,omitempty"` + Number *string `json:"number"` + Status_Code erc.ActiveStatusCode `json:"status_code"` } func (d Employee) ToResponse() ResponseDto { @@ -87,7 +74,6 @@ func (d Employee) ToResponse() ResponseDto { User: d.User, Person_Id: d.Person_Id, Person: d.Person, - Position_Code: d.Position_Code, Division_Code: d.Division_Code, Division: d.Division, Number: d.Number, @@ -104,9 +90,3 @@ func ToResponseList(data []Employee) []ResponseDto { } return resp } - -func (c CreateDto) Sanitize() CreateDto { - sanitized := c - sanitized.User.Password = "[REDACTED]" - return sanitized -} diff --git a/internal/domain/main-entities/employee/entity.go b/internal/domain/main-entities/employee/entity.go index 24687262..8113fc96 100644 --- a/internal/domain/main-entities/employee/entity.go +++ b/internal/domain/main-entities/employee/entity.go @@ -6,18 +6,16 @@ import ( ep "simrs-vx/internal/domain/main-entities/person" eu "simrs-vx/internal/domain/main-entities/user" erc "simrs-vx/internal/domain/references/common" - ero "simrs-vx/internal/domain/references/organization" ) type Employee struct { - ecore.Main // adjust this according to the needs - User_Id *uint `json:"user_id"` - User *eu.User `json:"user,omitempty" gorm:"foreignKey:User_Id;references:Id"` - Person_Id *uint `json:"person_id"` - Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id;references:Id"` - Position_Code ero.EmployeePosisitionCode `json:"position_code" gorm:"not null;size:20"` - Division_Code *string `json:"division_code"` - Division *ed.Division `json:"division,omitempty" gorm:"foreignKey:Division_Code;references:Code"` - Number *string `json:"number" gorm:"size:20"` - Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` + ecore.Main // adjust this according to the needs + User_Id *uint `json:"user_id"` + User *eu.User `json:"user,omitempty" gorm:"foreignKey:User_Id;references:Id"` + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id;references:Id"` + Division_Code *string `json:"division_code"` + Division *ed.Division `json:"division,omitempty" gorm:"foreignKey:Division_Code;references:Code"` + Number *string `json:"number" gorm:"size:20"` + Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` } diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index b959fb38..49a3b987 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -4,6 +4,8 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" ep "simrs-vx/internal/domain/main-entities/patient" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" ere "simrs-vx/internal/domain/references/encounter" "time" @@ -15,6 +17,8 @@ type CreateDto struct { RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` VisitDate time.Time `json:"visitDate"` Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` @@ -23,9 +27,24 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` + Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + VisitDate time.Time `json:"visitDate"` + Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` + RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -61,6 +80,10 @@ type ResponseDto struct { RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class_code"` Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` Unit *eu.Unit `json:"unit,omitempty"` VisitDate time.Time `json:"visitDate"` Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` @@ -79,6 +102,10 @@ func (d Encounter) ToResponse() ResponseDto { Class_Code: d.Class_Code, Unit_Id: d.Unit_Id, Unit: d.Unit, + Specialist_Id: d.Specialist_Id, + Specialist: d.Specialist, + Subspecialist_Id: d.Subspecialist_Id, + Subspecialist: d.Subspecialist, VisitDate: d.VisitDate, Assignment_Doctor_Id: d.Assignment_Doctor_Id, Assignment_Doctor: d.Assignment_Doctor, diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 258c6354..95d2cac7 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -4,6 +4,8 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" ep "simrs-vx/internal/domain/main-entities/patient" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" ere "simrs-vx/internal/domain/references/encounter" "time" @@ -17,6 +19,10 @@ type Encounter struct { Class_Code ere.EncounterClassCode `json:"class_code" gorm:"not null;size:10"` Unit_Id *uint `json:"unit_id"` Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id;references:Id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id;references:Id"` VisitDate time.Time `json:"visitDate"` Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` Assignment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty" gorm:"foreignKey:Assignment_Doctor_Id;references:Id"` diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index 07dae72a..69531f5f 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -8,11 +8,15 @@ import ( ) type CreateDto struct { - Code string `json:"code" validate:"maxLength=10"` - Name string `json:"name" validate:"maxLength=50"` - InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" validate:"maxLength=10"` - Parent_Id *uint16 `json:"parent_id"` - Item_Id *uint `json:"item_id"` + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` + InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" validate:"maxLength=10"` + Parent_Id *uint16 `json:"parent_id"` + Item_Id *uint `json:"item_id"` + Unit_Id *uint16 `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Infra_Id *uint16 `json:"-"` // for room } type ReadListDto struct { diff --git a/internal/domain/main-entities/nurse/dto.go b/internal/domain/main-entities/nurse/dto.go index 224cb0d5..f59d2ee5 100644 --- a/internal/domain/main-entities/nurse/dto.go +++ b/internal/domain/main-entities/nurse/dto.go @@ -3,6 +3,7 @@ package nurse import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/employee" + ei "simrs-vx/internal/domain/main-entities/infra" eu "simrs-vx/internal/domain/main-entities/unit" ) @@ -10,6 +11,7 @@ type CreateDto struct { Employee_Id *uint `json:"employee_id"` IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` Unit_Id *uint16 `json:"unit_id"` + Infra_Id *uint16 `json:"infra_id"` } type ReadListDto struct { @@ -22,6 +24,7 @@ type FilterDto struct { Employee_Id *uint `json:"employee_id"` IHS_Number *string `json:"ihs_number"` Unit_Id *uint16 `json:"unit_id"` + Infra_Id *uint16 `json:"infra_id"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -55,6 +58,8 @@ type ResponseDto struct { IHS_Number *string `json:"ihs_number"` Unit_Id *uint16 `json:"unit_id"` Unit *eu.Unit `json:"unit,omitempty"` + Infra_Id *uint16 `json:"infra_id"` + Infra *ei.Infra `json:"infra,omitempty"` } func (d Nurse) ToResponse() ResponseDto { @@ -64,6 +69,8 @@ func (d Nurse) ToResponse() ResponseDto { IHS_Number: d.IHS_Number, Unit_Id: d.Unit_Id, Unit: d.Unit, + Infra_Id: d.Infra_Id, + Infra: d.Infra, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/nurse/entity.go b/internal/domain/main-entities/nurse/entity.go index dc39ae9f..732a58ec 100644 --- a/internal/domain/main-entities/nurse/entity.go +++ b/internal/domain/main-entities/nurse/entity.go @@ -3,6 +3,7 @@ package nurse import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/employee" + ei "simrs-vx/internal/domain/main-entities/infra" eu "simrs-vx/internal/domain/main-entities/unit" ) @@ -13,4 +14,6 @@ type Nurse struct { IHS_Number *string `json:"ihs_number" gorm:"size:20"` Unit_Id *uint16 `json:"unit_id"` Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` + Infra_Id *uint16 `json:"infra_id"` + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id;references:Id"` } diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index e3f5a622..02e9b0e7 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -7,7 +7,6 @@ import ( epc "simrs-vx/internal/domain/main-entities/person-contact" epr "simrs-vx/internal/domain/main-entities/person-relative" erc "simrs-vx/internal/domain/references/common" - ero "simrs-vx/internal/domain/references/organization" "time" ) @@ -28,12 +27,10 @@ type ReadListDto struct { } type FilterDto struct { - Person_Id *uint `json:"person_id"` - Position_Code ero.EmployeePosisitionCode `json:"position_code"` - Division_Code *string `json:"division_code"` - RegisteredAt *time.Time `json:"registeredAt"` - Status_Code erc.ActiveStatusCode `json:"status_code"` - Number *string `json:"number"` + Person_Id *uint `json:"person_id"` + RegisteredAt *time.Time `json:"registeredAt"` + Status_Code erc.ActiveStatusCode `json:"status_code"` + Number *string `json:"number"` Page int `json:"page"` PageSize int `json:"page_size"` diff --git a/internal/domain/main-entities/room/dto.go b/internal/domain/main-entities/room/dto.go new file mode 100644 index 00000000..eff76d0a --- /dev/null +++ b/internal/domain/main-entities/room/dto.go @@ -0,0 +1,87 @@ +package room + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/infra" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" + eu "simrs-vx/internal/domain/main-entities/unit" +) + +type CreateDto struct { + Infra_Id *uint16 `json:"infra_id"` + Unit_Id *uint16 `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Infra_Id *uint16 `json:"infra_id"` + Unit_Id *uint16 `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.SmallMain + Infra_Id *uint16 `json:"infra_id"` + Infra *ei.Infra `json:"infra,omitempty"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` +} + +func (d Room) ToResponse() ResponseDto { + resp := ResponseDto{ + Infra_Id: d.Infra_Id, + Infra: d.Infra, + Unit_Id: d.Unit_Id, + Unit: d.Unit, + Specialist_Id: d.Specialist_Id, + Specialist: d.Specialist, + Subspecialist_Id: d.Subspecialist_Id, + Subspecialist: d.Subspecialist, + } + resp.SmallMain = d.SmallMain + return resp +} + +func ToResponseList(data []Room) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/room/entity.go b/internal/domain/main-entities/room/entity.go new file mode 100644 index 00000000..bcc02aeb --- /dev/null +++ b/internal/domain/main-entities/room/entity.go @@ -0,0 +1,21 @@ +package room + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/infra" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" + eu "simrs-vx/internal/domain/main-entities/unit" +) + +type Room struct { + ecore.SmallMain // adjust this according to the needs + Infra_Id *uint16 `json:"infra_id"` + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` +} diff --git a/internal/domain/main-entities/specialist-intern/dto.go b/internal/domain/main-entities/specialist-intern/dto.go new file mode 100644 index 00000000..87044ba7 --- /dev/null +++ b/internal/domain/main-entities/specialist-intern/dto.go @@ -0,0 +1,88 @@ +package specialistintern + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ep "simrs-vx/internal/domain/main-entities/person" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" + eu "simrs-vx/internal/domain/main-entities/user" +) + +type CreateDto struct { + Person_Id *uint `json:"person_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + User_Id *uint `json:"user_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Person_Id *uint `json:"person_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + User_Id *uint `json:"user_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + User_Id *uint `json:"user_id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` + User_Id *uint `json:"user_id"` + User *eu.User `json:"user,omitempty"` +} + +func (d SpecialistIntern) ToResponse() ResponseDto { + resp := ResponseDto{ + Person_Id: d.Person_Id, + Person: d.Person, + Specialist_Id: d.Specialist_Id, + Specialist: d.Specialist, + Subspecialist_Id: d.Subspecialist_Id, + Subspecialist: d.Subspecialist, + User_Id: d.User_Id, + User: d.User, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []SpecialistIntern) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/specialist-intern/entity.go b/internal/domain/main-entities/specialist-intern/entity.go new file mode 100644 index 00000000..9df0ed53 --- /dev/null +++ b/internal/domain/main-entities/specialist-intern/entity.go @@ -0,0 +1,21 @@ +package specialistintern + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ep "simrs-vx/internal/domain/main-entities/person" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" + eu "simrs-vx/internal/domain/main-entities/user" +) + +type SpecialistIntern struct { + ecore.Main // adjust this according to the needs + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` + User_Id *uint `json:"user_id"` + User *eu.User `json:"user,omitempty" gorm:"foreignKey:User_Id"` +} diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go new file mode 100644 index 00000000..ac10b720 --- /dev/null +++ b/internal/domain/main-entities/specialist/dto.go @@ -0,0 +1,72 @@ +package specialist + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` + Unit_Id *uint16 `json:"unit_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` + Unit_Id *uint16 `json:"unit_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + Code *string `json:"code"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.SmallMain + Code string `json:"code"` + Name string `json:"name"` + Unit_Id *uint16 `json:"unit_id"` +} + +func (d Specialist) ToResponse() ResponseDto { + resp := ResponseDto{ + Code: d.Code, + Name: d.Name, + Unit_Id: d.Unit_Id, + } + resp.SmallMain = d.SmallMain + return resp +} + +func ToResponseList(data []Specialist) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/specialist/entity.go b/internal/domain/main-entities/specialist/entity.go new file mode 100644 index 00000000..3cea2ebd --- /dev/null +++ b/internal/domain/main-entities/specialist/entity.go @@ -0,0 +1,14 @@ +package specialist + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eu "simrs-vx/internal/domain/main-entities/unit" +) + +type Specialist struct { + ecore.SmallMain // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:10"` + Name string `json:"name" gorm:"size:50"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id"` +} diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go new file mode 100644 index 00000000..cf387146 --- /dev/null +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -0,0 +1,72 @@ +package subspecialist + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` + Specialist_Id *uint16 `json:"specialist_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Code *string `json:"code"` + Name *string `json:"name"` + Specialist_Id *uint16 `json:"specialist_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + Code *string `json:"code"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.SmallMain + Code string `json:"code"` + Name string `json:"name"` + Specialist_Id *uint16 `json:"specialist_id"` +} + +func (d Subspecialist) ToResponse() ResponseDto { + resp := ResponseDto{ + Code: d.Code, + Name: d.Name, + Specialist_Id: d.Specialist_Id, + } + resp.SmallMain = d.SmallMain + return resp +} + +func ToResponseList(data []Subspecialist) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/subspecialist/entity.go b/internal/domain/main-entities/subspecialist/entity.go new file mode 100644 index 00000000..5de27442 --- /dev/null +++ b/internal/domain/main-entities/subspecialist/entity.go @@ -0,0 +1,14 @@ +package subspecialist + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + es "simrs-vx/internal/domain/main-entities/specialist" +) + +type Subspecialist struct { + ecore.SmallMain // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:10"` + Name string `json:"name" gorm:"size:50"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` +} diff --git a/internal/domain/main-entities/unit/entity.go b/internal/domain/main-entities/unit/entity.go index 3b93475f..c86ad822 100644 --- a/internal/domain/main-entities/unit/entity.go +++ b/internal/domain/main-entities/unit/entity.go @@ -3,12 +3,14 @@ package unit import ( ecore "simrs-vx/internal/domain/base-entities/core" ei "simrs-vx/internal/domain/main-entities/installation" + ero "simrs-vx/internal/domain/references/organization" ) type Unit struct { - ecore.SmallMain // adjust this according to the needs - Installation_Id *uint16 `json:"installation_id"` - Installation *ei.Installation `json:"installation" gorm:"foreignKey:Installation_Id"` - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` + ecore.SmallMain // adjust this according to the needs + Installation_Id *uint16 `json:"installation_id"` + Installation *ei.Installation `json:"installation" gorm:"foreignKey:Installation_Id"` + Code string `json:"code" gorm:"unique;size:10"` + Name string `json:"name" gorm:"size:50"` + Type_Code *ero.UnitTypeCode `json:"type_code"` } diff --git a/internal/domain/main-entities/user/dto.go b/internal/domain/main-entities/user/dto.go index 26233c81..47b50dca 100644 --- a/internal/domain/main-entities/user/dto.go +++ b/internal/domain/main-entities/user/dto.go @@ -2,14 +2,30 @@ package user import ( ecore "simrs-vx/internal/domain/base-entities/core" + ep "simrs-vx/internal/domain/main-entities/person" + epa "simrs-vx/internal/domain/main-entities/person-address" + epc "simrs-vx/internal/domain/main-entities/person-contact" erc "simrs-vx/internal/domain/references/common" + ero "simrs-vx/internal/domain/references/organization" "time" ) type CreateDto struct { - Name string `json:"name" validate:"maxLength=25"` - Password string `json:"password" validate:"maxLength=255"` - Status_Code erc.UserStatusCode `json:"status_code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=25"` + Password string `json:"password" validate:"maxLength=255"` + Status_Code erc.UserStatusCode `json:"status_code" validate:"maxLength=10"` + Position_Code ero.UserPosisitionCode `json:"position_code" validate:"maxLength=20"` + Person_Id *uint `json:"-"` + Person *ep.UpdateDto `json:"person"` + PersonAddresses []epa.UpdateDto `json:"personAddresses"` + PersonContacts []epc.UpdateDto `json:"personContacts"` + Employee *EmployeUpdateDto `json:"employee"` + IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` + SIP_Number *string `json:"sip_number" validate:"maxLength=20"` + Unit_Id *uint16 `json:"unit_id"` + Infra_Id *uint16 `json:"infra_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` } type ReadListDto struct { @@ -68,6 +84,15 @@ func (d *User) ToResponse() ResponseDto { return resp } +type EmployeUpdateDto struct { + Id uint `json:"id"` + User_Id *uint `json:"-"` + Person_Id *uint `json:"-"` + Division_Code *string `json:"division_code"` + Number *string `json:"number" validate:"maxLength=20"` + Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` +} + func ToResponseList(data []User) []ResponseDto { resp := make([]ResponseDto, len(data)) for i, u := range data { diff --git a/internal/domain/main-entities/user/entity.go b/internal/domain/main-entities/user/entity.go index 3ad46b9d..43669663 100644 --- a/internal/domain/main-entities/user/entity.go +++ b/internal/domain/main-entities/user/entity.go @@ -3,16 +3,18 @@ package user import ( ecore "simrs-vx/internal/domain/base-entities/core" erc "simrs-vx/internal/domain/references/common" + ero "simrs-vx/internal/domain/references/organization" "time" ) type User struct { - ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"unique;not null;size:25"` - Password string `json:"password" gorm:"not null;size:255"` - Status_Code erc.UserStatusCode `json:"status_code" gorm:"not null;size:10"` - FailedLoginCount uint8 `json:"failedLoginCount" gorm:"type:smallint"` - LoginAttemptCount int `json:"-"` - LastSuccessLogin *time.Time `json:"lastSuccessLogin,omitempty"` - LastAllowdLogin *time.Time `json:"lastAllowdLogin,omitempty"` + ecore.Main // adjust this according to the needs + Name string `json:"name" gorm:"unique;not null;size:25"` + Password string `json:"password" gorm:"not null;size:255"` + Status_Code erc.UserStatusCode `json:"status_code" gorm:"not null;size:10"` + FailedLoginCount uint8 `json:"failedLoginCount" gorm:"type:smallint"` + Position_Code ero.UserPosisitionCode `json:"position_code" gorm:"not null;size:20"` + LoginAttemptCount int `json:"-"` + LastSuccessLogin *time.Time `json:"lastSuccessLogin,omitempty"` + LastAllowdLogin *time.Time `json:"lastAllowdLogin,omitempty"` } diff --git a/internal/domain/references/organization/organization.go b/internal/domain/references/organization/organization.go index 5c86ba51..30aa25b5 100644 --- a/internal/domain/references/organization/organization.go +++ b/internal/domain/references/organization/organization.go @@ -1,22 +1,23 @@ package organization type ( - EmployeePosisitionCode string - ItemGroupCode string - InfraGroupCode string - UnitTypeCode string - DoctorFeeTypeCode string + UserPosisitionCode string + ItemGroupCode string + InfraGroupCode string + UnitTypeCode string + DoctorFeeTypeCode string ) const ( - EPCDoc EmployeePosisitionCode = "doctor" // Dokter - EPCNur EmployeePosisitionCode = "nurse" // Perawat - EPCNut EmployeePosisitionCode = "nutritionist" // Ahli gizi - EPCLab EmployeePosisitionCode = "laborant" // Laboran - EPCPha EmployeePosisitionCode = "pharmacy" // Farmasi - EPCPay EmployeePosisitionCode = "payment" // Pembayaran - EPCPav EmployeePosisitionCode = "payment-verificator" // Konfirmasi pembayaran - EPCMan EmployeePosisitionCode = "management" // Manajemen + UPCDoc UserPosisitionCode = "doctor" // Dokter + UPCNur UserPosisitionCode = "nurse" // Perawat + UPCNut UserPosisitionCode = "nutritionist" // Ahli gizi + UPCLab UserPosisitionCode = "laborant" // Laboran + UPCPha UserPosisitionCode = "pharmacy" // Farmasi + UPCPay UserPosisitionCode = "payment" // Pembayaran + UPCPav UserPosisitionCode = "payment-verificator" // Konfirmasi pembayaran + UPCMan UserPosisitionCode = "management" // Manajemen + UPCInt UserPosisitionCode = "specialist-intern" // PPDS ITGCInfra ItemGroupCode = "infra" ITGCMedicine ItemGroupCode = "medicine" diff --git a/internal/domain/references/person/person.go b/internal/domain/references/person/person.go index dd41bd25..d21399d2 100644 --- a/internal/domain/references/person/person.go +++ b/internal/domain/references/person/person.go @@ -111,180 +111,180 @@ const ( RCOther RelationshipCode = "other" // Lainnya ) -func GetGenderCodes() map[GenderCode]string { - return map[GenderCode]string{ - GCMale: "Laki-laki", - GCFemale: "Perempuan", - GCNotStated: "Tidak disebutkan", - GCUnknown: "Tidak diketahui", - } -} +// func GetGenderCodes() map[GenderCode]string { +// return map[GenderCode]string{ +// GCMale: "Laki-laki", +// GCFemale: "Perempuan", +// GCNotStated: "Tidak disebutkan", +// GCUnknown: "Tidak diketahui", +// } +// } -func GetBloodTypeCodes() map[BloodTypeCode]string { - return map[BloodTypeCode]string{ - BTCAPositive: "A Positive", - BTCANegative: "A Negative", - BTCABPositive: "AB Positive", - BTCABNegative: "AB Negative", - BTCBPositive: "B Positive", - BTCBNegative: "B Negative", - BTCOPositive: "O Positive", - BTCONegative: "O Negative", - } -} +// func GetBloodTypeCodes() map[BloodTypeCode]string { +// return map[BloodTypeCode]string{ +// BTCAPositive: "A Positive", +// BTCANegative: "A Negative", +// BTCABPositive: "AB Positive", +// BTCABNegative: "AB Negative", +// BTCBPositive: "B Positive", +// BTCBNegative: "B Negative", +// BTCOPositive: "O Positive", +// BTCONegative: "O Negative", +// } +// } -func GetMaritalStatusCodes() map[MaritalStatusCode]string { - return map[MaritalStatusCode]string{ - MSCBelumKawin: "Belum Kawin", - MSCKawin: "Kawin", - MSCCeraiHidup: "Cerai Hidup", - MSCCeraiMati: "Cerai Mati", - } -} +// func GetMaritalStatusCodes() map[MaritalStatusCode]string { +// return map[MaritalStatusCode]string{ +// MSCBelumKawin: "Belum Kawin", +// MSCKawin: "Kawin", +// MSCCeraiHidup: "Cerai Hidup", +// MSCCeraiMati: "Cerai Mati", +// } +// } -func GetReligionCodes() map[ReligionCode]string { - return map[ReligionCode]string{ - RCIslam: "Islam", - RCProtestan: "Kristen (Protestan)", - RCKatolik: "Katolik", - RCHindu: "Hindu", - RCBudha: "Budha", - RCKonghucu: "Konghucu", - } -} +// func GetReligionCodes() map[ReligionCode]string { +// return map[ReligionCode]string{ +// RCIslam: "Islam", +// RCProtestan: "Kristen (Protestan)", +// RCKatolik: "Katolik", +// RCHindu: "Hindu", +// RCBudha: "Budha", +// RCKonghucu: "Konghucu", +// } +// } -func GetEducationCodes() map[EducationCode]string { - return map[EducationCode]string{ - ECTS: "Tidak Sekolah", - ECTK: "TK", - ECSD: "SD", - ECSLTP: "SMP sederajat", - ECSLTA: "SMP sederajat", - ECD1: "D1 sederajat", - ECD2: "D2 sederajat", - ECD3: "D3 sederajat", - ECD4: "D4 sederajat", - ECS1: "S1", - ECS2: "S3", - ECS3: "S3", - } -} +// func GetEducationCodes() map[EducationCode]string { +// return map[EducationCode]string{ +// ECTS: "Tidak Sekolah", +// ECTK: "TK", +// ECSD: "SD", +// ECSLTP: "SMP sederajat", +// ECSLTA: "SMP sederajat", +// ECD1: "D1 sederajat", +// ECD2: "D2 sederajat", +// ECD3: "D3 sederajat", +// ECD4: "D4 sederajat", +// ECS1: "S1", +// ECS2: "S3", +// ECS3: "S3", +// } +// } -func GetOcupationCodes() map[OcupationCode]string { - return map[OcupationCode]string{ - OCTidakBekerja: "Tidak Bekerja", - OCPns: "PNS", - OCTniPolisi: "Polisi", - OCTni: "TNI", - OCGuru: "Guru", - OCWiraswasta: "Wiraswasta", - OCKarySwasta: "Kary Swasta", - OCLainlain: "Lain-lain", - } -} +// func GetOcupationCodes() map[OcupationCode]string { +// return map[OcupationCode]string{ +// OCTidakBekerja: "Tidak Bekerja", +// OCPns: "PNS", +// OCTniPolisi: "Polisi", +// OCTni: "TNI", +// OCGuru: "Guru", +// OCWiraswasta: "Wiraswasta", +// OCKarySwasta: "Kary Swasta", +// OCLainlain: "Lain-lain", +// } +// } -func GetAgeGroupCodes() map[AgeGroupCode]string { - return map[AgeGroupCode]string{ - AGCEUnknown: "unknown", - AGCLTE5: "<=5", - AGCEU19: "6-19", - AGCEU29: "20-29", - AGCEU39: "30-39", - AGCEU49: "40-49", - AGCEU59: "50-59", - AGCGE60: ">=60", - } -} +// func GetAgeGroupCodes() map[AgeGroupCode]string { +// return map[AgeGroupCode]string{ +// AGCEUnknown: "unknown", +// AGCLTE5: "<=5", +// AGCEU19: "6-19", +// AGCEU29: "20-29", +// AGCEU39: "30-39", +// AGCEU49: "40-49", +// AGCEU59: "50-59", +// AGCGE60: ">=60", +// } +// } -func GetAgeGroupForMedicineCodes() map[AgeGroupForMedicineCode]string { - return map[AgeGroupForMedicineCode]string{ - AGMCNew: "new-born", - AGMCInfant: "infant", - AGMCToddler: "toddler", - AGMCKid: "kid", - AGMCAdult: "adult", - } -} +// func GetAgeGroupForMedicineCodes() map[AgeGroupForMedicineCode]string { +// return map[AgeGroupForMedicineCode]string{ +// AGMCNew: "new-born", +// AGMCInfant: "infant", +// AGMCToddler: "toddler", +// AGMCKid: "kid", +// AGMCAdult: "adult", +// } +// } -func GetRelativeCodes() map[RelativeCode]string { - return map[RelativeCode]string{ - RCMSuami: "Suami", - RCMIstri: "Istri", - RCMAnak: "Anak", - RCMMenantu: "Menantu", - RCMCucu: "Cucu", - RCMOrangTua: "Orang Tua", - RCMMertua: "Mertua", - RCMAdik: "Adik", - RCMKeponakan: "Keponakan", - RCMKakak: "Kakak", - RCMPaman: "Paman", - RCMBibi: "Bibi", - RCMPamanKakek: "Kakek", - RCMPamanNenek: "Nenek", - } -} +// func GetRelativeCodes() map[RelativeCode]string { +// return map[RelativeCode]string{ +// RCMSuami: "Suami", +// RCMIstri: "Istri", +// RCMAnak: "Anak", +// RCMMenantu: "Menantu", +// RCMCucu: "Cucu", +// RCMOrangTua: "Orang Tua", +// RCMMertua: "Mertua", +// RCMAdik: "Adik", +// RCMKeponakan: "Keponakan", +// RCMKakak: "Kakak", +// RCMPaman: "Paman", +// RCMBibi: "Bibi", +// RCMPamanKakek: "Kakek", +// RCMPamanNenek: "Nenek", +// } +// } -func GetContactTypeCodes() map[ContactTypeCode]string { - return map[ContactTypeCode]string{ - CTPhone: "Telepon", - CTMPhone: "Telepon Seluler", - CTEmail: "Email", - CTFax: "Fax", - } -} +// func GetContactTypeCodes() map[ContactTypeCode]string { +// return map[ContactTypeCode]string{ +// CTPhone: "Telepon", +// CTMPhone: "Telepon Seluler", +// CTEmail: "Email", +// CTFax: "Fax", +// } +// } -func GetRelationshipCodes() map[RelationshipCode]string { - return map[RelationshipCode]string{ - RCMother: "Ibu", - RCFather: "Ayah", - RCUncle: "Paman", - RCAunt: "Bibi", - RCSibling: "Saudara", - RCGdMother: "Nenek", - RCGdFather: "Kakek", - RCChild: "Anak", - RCNephew: "Keponakan", - RCGdChild: "Cucu", - RCOther: "Lainnya", - } -} +// func GetRelationshipCodes() map[RelationshipCode]string { +// return map[RelationshipCode]string{ +// RCMother: "Ibu", +// RCFather: "Ayah", +// RCUncle: "Paman", +// RCAunt: "Bibi", +// RCSibling: "Saudara", +// RCGdMother: "Nenek", +// RCGdFather: "Kakek", +// RCChild: "Anak", +// RCNephew: "Keponakan", +// RCGdChild: "Cucu", +// RCOther: "Lainnya", +// } +// } -func (obj GenderCode) String() string { - return GetGenderCodes()[obj] -} +// func (obj GenderCode) String() string { +// return GetGenderCodes()[obj] +// } -func (obj BloodTypeCode) String() string { - return GetBloodTypeCodes()[obj] -} +// func (obj BloodTypeCode) String() string { +// return GetBloodTypeCodes()[obj] +// } -func (obj MaritalStatusCode) String() string { - return GetMaritalStatusCodes()[obj] -} +// func (obj MaritalStatusCode) String() string { +// return GetMaritalStatusCodes()[obj] +// } -func (obj ReligionCode) String() string { - return GetReligionCodes()[obj] -} -func (obj EducationCode) String() string { - return GetEducationCodes()[obj] -} +// func (obj ReligionCode) String() string { +// return GetReligionCodes()[obj] +// } +// func (obj EducationCode) String() string { +// return GetEducationCodes()[obj] +// } -func (obj OcupationCode) String() string { - return GetOcupationCodes()[obj] -} +// func (obj OcupationCode) String() string { +// return GetOcupationCodes()[obj] +// } -func (obj AgeGroupCode) String() string { - return GetAgeGroupCodes()[obj] -} +// func (obj AgeGroupCode) String() string { +// return GetAgeGroupCodes()[obj] +// } -func (obj RelativeCode) String() string { - return GetRelativeCodes()[obj] -} +// func (obj RelativeCode) String() string { +// return GetRelativeCodes()[obj] +// } -func (obj ContactTypeCode) String() string { - return GetContactTypeCodes()[obj] -} +// func (obj ContactTypeCode) String() string { +// return GetContactTypeCodes()[obj] +// } -func (obj RelationshipCode) String() string { - return GetRelationshipCodes()[obj] -} +// func (obj RelationshipCode) String() string { +// return GetRelationshipCodes()[obj] +// } diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 80aa4df4..476dacc7 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -60,6 +60,8 @@ import ( medicinemethod "simrs-vx/internal/interface/main-handler/medicine-method" pharmacycompany "simrs-vx/internal/interface/main-handler/pharmacy-company" proceduresrc "simrs-vx/internal/interface/main-handler/procedure-src" + specialist "simrs-vx/internal/interface/main-handler/specialist" + subspecialist "simrs-vx/internal/interface/main-handler/subspecialist" unit "simrs-vx/internal/interface/main-handler/unit" uom "simrs-vx/internal/interface/main-handler/uom" @@ -148,6 +150,8 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/medical-action-src", medicalactionsrc.O) hc.RegCrud(r, "/v1/medical-action-src-item", medicalactionsrcitem.O) hc.RegCrud(r, "/v1/language", language.O) + hc.RegCrud(r, "/v1/specialist", specialist.O) + hc.RegCrud(r, "/v1/subspecialist", subspecialist.O) hc.RegCrud(r, "/v1/village", village.O) hc.RegCrud(r, "/v1/district", district.O) diff --git a/internal/interface/main-handler/specialist/handler.go b/internal/interface/main-handler/specialist/handler.go new file mode 100644 index 00000000..561d07d0 --- /dev/null +++ b/internal/interface/main-handler/specialist/handler.go @@ -0,0 +1,71 @@ +package specialist + +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/specialist" + u "simrs-vx/internal/use-case/main-use-case/specialist" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/subspecialist/handler.go b/internal/interface/main-handler/subspecialist/handler.go new file mode 100644 index 00000000..d639c115 --- /dev/null +++ b/internal/interface/main-handler/subspecialist/handler.go @@ -0,0 +1,71 @@ +package subspecialist + +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/subspecialist" + u "simrs-vx/internal/use-case/main-use-case/subspecialist" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go index 3c33be2c..ee3cf1fc 100644 --- a/internal/interface/migration/migration.go +++ b/internal/interface/migration/migration.go @@ -46,6 +46,10 @@ import ( proceduresrc "simrs-vx/internal/domain/main-entities/procedure-src" province "simrs-vx/internal/domain/main-entities/province" regency "simrs-vx/internal/domain/main-entities/regency" + room "simrs-vx/internal/domain/main-entities/room" + specialist "simrs-vx/internal/domain/main-entities/specialist" + specialistintern "simrs-vx/internal/domain/main-entities/specialist-intern" + subspecialist "simrs-vx/internal/domain/main-entities/subspecialist" unit "simrs-vx/internal/domain/main-entities/unit" uom "simrs-vx/internal/domain/main-entities/uom" user "simrs-vx/internal/domain/main-entities/user" @@ -129,6 +133,10 @@ func GetEntities() []any { &patient.Patient{}, &encounter.Encounter{}, &laborant.Laborant{}, + &specialist.Specialist{}, + &subspecialist.Subspecialist{}, + &specialistintern.SpecialistIntern{}, + &room.Room{}, } } diff --git a/internal/use-case/main-use-case/doctor/helper.go b/internal/use-case/main-use-case/doctor/helper.go index c6898db6..8077b92f 100644 --- a/internal/use-case/main-use-case/doctor/helper.go +++ b/internal/use-case/main-use-case/doctor/helper.go @@ -21,4 +21,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Doctor) { data.IHS_Number = inputSrc.IHS_Number data.SIP_Number = inputSrc.SIP_Number data.Unit_Id = inputSrc.Unit_Id + data.Specialist_Id = inputSrc.Specialist_Id + data.Subspecialist_Id = inputSrc.Subspecialist_Id } diff --git a/internal/use-case/main-use-case/employee/case.go b/internal/use-case/main-use-case/employee/case.go index a6c16652..030374f0 100644 --- a/internal/use-case/main-use-case/employee/case.go +++ b/internal/use-case/main-use-case/employee/case.go @@ -1,26 +1,9 @@ package employee import ( - "errors" "strconv" - ed "simrs-vx/internal/domain/main-entities/doctor" e "simrs-vx/internal/domain/main-entities/employee" - el "simrs-vx/internal/domain/main-entities/laborant" - en "simrs-vx/internal/domain/main-entities/nurse" - et "simrs-vx/internal/domain/main-entities/nutritionist" - ep "simrs-vx/internal/domain/main-entities/pharmacist" - - ud "simrs-vx/internal/use-case/main-use-case/doctor" - ul "simrs-vx/internal/use-case/main-use-case/laborant" - un "simrs-vx/internal/use-case/main-use-case/nurse" - ut "simrs-vx/internal/use-case/main-use-case/nutritionist" - upe "simrs-vx/internal/use-case/main-use-case/person" - upa "simrs-vx/internal/use-case/main-use-case/person-address" - upc "simrs-vx/internal/use-case/main-use-case/person-contact" - up "simrs-vx/internal/use-case/main-use-case/pharmacist" - - ero "simrs-vx/internal/domain/references/organization" dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -42,7 +25,7 @@ func Create(input e.CreateDto) (*d.Data, error) { } // Start log - pl.SetLogInfo(&event, input.Sanitize(), "started", "create") + pl.SetLogInfo(&event, input, "started", "create") err := dg.I.Transaction(func(tx *gorm.DB) error { mwRunner := newMiddlewareRunner(&event, tx) @@ -52,83 +35,6 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } - if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx); err != nil { - return err - } else { - input.Person_Id = person_id - } - - for idx := range input.PersonAddresses { - input.PersonAddresses[idx].Person_Id = *input.Person_Id - } - if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx); err != nil { - return err - } - - for idx := range input.PersonContacts { - input.PersonContacts[idx].Person_Id = *input.Person_Id - } - if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx); err != nil { - return err - } - - if err := createUser(&input, &event, tx); err != nil { - return err - } - - if resData, err := CreateData(input, &event, tx); err != nil { - return err - } else { - data = *resData - } - - switch input.Position_Code { - case ero.EPCDoc: - createDoc := ed.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - SIP_Number: input.SIP_Number, - Unit_Id: input.Unit_Id, - } - if _, err := ud.CreateData(createDoc, &event, tx); err != nil { - return err - } - case ero.EPCNur: - createNurse := en.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - } - if _, err := un.CreateData(createNurse, &event, tx); err != nil { - return err - } - case ero.EPCNut: - createNutritionist := et.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - } - if _, err := ut.CreateData(createNutritionist, &event, tx); err != nil { - return err - } - case ero.EPCPha: - createPharmacist := ep.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - } - if _, err := up.CreateData(createPharmacist, &event, tx); err != nil { - return err - } - case ero.EPCLab: - createLaborant := el.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - } - if _, err := ul.CreateData(createLaborant, &event, tx); err != nil { - return err - } - default: - return errors.New("invalid employee position") - } - mwRunner.setMwType(pu.MWTPost) // Run post-middleware if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { @@ -282,137 +188,10 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } - if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx); err != nil { - return err - } else { - input.Person_Id = person_id - } - - for idx := range input.PersonAddresses { - input.PersonAddresses[idx].Person_Id = *input.Person_Id - } - if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx); err != nil { - return err - } - - for idx := range input.PersonContacts { - input.PersonContacts[idx].Person_Id = *input.Person_Id - } - if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx); err != nil { - return err - } - if err := UpdateData(input, data, &event, tx); err != nil { return err } - switch input.Position_Code { - case ero.EPCDoc: - readDoc := ed.ReadDetailDto{Employee_Id: &data.Id} - readDocData, err := ud.ReadDetailData(readDoc, &event, tx) - if err != nil { - return err - } - createDoc := ed.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - SIP_Number: input.SIP_Number, - Unit_Id: input.Unit_Id, - } - if readDocData != nil { - if err := ud.UpdateData(ed.UpdateDto{CreateDto: createDoc}, readDocData, &event, tx); err != nil { - return err - } - return nil - } - - if _, err := ud.CreateData(createDoc, &event, tx); err != nil { - return err - } - case ero.EPCNur: - readNur := en.ReadDetailDto{Employee_Id: &data.Id} - readNurData, err := un.ReadDetailData(readNur, &event, tx) - if err != nil { - return err - } - createNur := en.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - } - if readNurData != nil { - if err := un.UpdateData(en.UpdateDto{CreateDto: createNur}, readNurData, &event, tx); err != nil { - return err - } - return nil - } - - if _, err := un.CreateData(createNur, &event, tx); err != nil { - return err - } - case ero.EPCNut: - readNut := et.ReadDetailDto{Employee_Id: &data.Id} - readNutData, err := ut.ReadDetailData(readNut, &event, tx) - if err != nil { - return err - } - createNut := et.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - } - if readNutData != nil { - if err := ut.UpdateData(et.UpdateDto{CreateDto: createNut}, readNutData, &event, tx); err != nil { - return err - } - return nil - } - - if _, err := ut.CreateData(createNut, &event, tx); err != nil { - return err - } - case ero.EPCPha: - readPha := ep.ReadDetailDto{Employee_Id: &data.Id} - readPhaData, err := up.ReadDetailData(readPha, &event, tx) - if err != nil { - return err - } - createPha := ep.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - } - if readPhaData != nil { - if err := up.UpdateData(ep.UpdateDto{CreateDto: createPha}, readPhaData, &event, tx); err != nil { - return err - } - return nil - } - - if _, err := up.CreateData(createPha, &event, tx); err != nil { - return err - } - case ero.EPCLab: - readLab := el.ReadDetailDto{Employee_Id: &data.Id} - readLabData, err := ul.ReadDetailData(readLab, &event, tx) - if err != nil { - return err - } - createLab := el.CreateDto{ - Employee_Id: &data.Id, - IHS_Number: input.IHS_Number, - } - if readLabData != nil { - if err := ul.UpdateData(el.UpdateDto{CreateDto: createLab}, readLabData, &event, tx); err != nil { - return err - } - return nil - } - - if _, err := ul.CreateData(createLab, &event, tx); err != nil { - return err - } - default: - return errors.New("invalid employee position") - } - pl.SetLogInfo(&event, nil, "complete") mwRunner.setMwType(pu.MWTPost) diff --git a/internal/use-case/main-use-case/employee/helper.go b/internal/use-case/main-use-case/employee/helper.go index 949a4729..252d35eb 100644 --- a/internal/use-case/main-use-case/employee/helper.go +++ b/internal/use-case/main-use-case/employee/helper.go @@ -5,46 +5,39 @@ Any functions that are used internally by the use-case package employee import ( - "errors" e "simrs-vx/internal/domain/main-entities/employee" - - uu "simrs-vx/internal/use-case/main-use-case/user" - pl "simrs-vx/pkg/logger" - - "gorm.io/gorm" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Employee) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT - data.User_Id = inputSrc.User_Id } else { inputTemp := any(input).(*e.UpdateDto) inputSrc = &inputTemp.CreateDto } + data.User_Id = inputSrc.User_Id data.Person_Id = inputSrc.Person_Id - data.Position_Code = inputSrc.Position_Code data.Division_Code = inputSrc.Division_Code data.Number = inputSrc.Number data.Status_Code = inputSrc.Status_Code } -func createUser(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { - if input.User == nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "user request is required", - Raw: errors.New("user request is required"), - } - return pl.SetLogError(event, input) - } - user, err := uu.CreateData(*input.User, event, tx) - if err != nil { - return err - } - input.User_Id = &user.Id - return nil -} +// func createUser(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { +// if input.User == nil { +// event.Status = "failed" +// event.ErrInfo = pl.ErrorInfo{ +// Code: "data-create-fail", +// Detail: "user request is required", +// Raw: errors.New("user request is required"), +// } +// return pl.SetLogError(event, input) +// } +// user, err := uu.CreateData(*input.User, event, tx) +// if err != nil { +// return err +// } +// input.User_Id = &user.Id +// return nil +// } diff --git a/internal/use-case/main-use-case/employee/lib.go b/internal/use-case/main-use-case/employee/lib.go index 857c7d87..ed58bed7 100644 --- a/internal/use-case/main-use-case/employee/lib.go +++ b/internal/use-case/main-use-case/employee/lib.go @@ -159,3 +159,55 @@ func DeleteData(data *e.Employee, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func CreateOrUpdate(input e.UpdateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Employee, error) { + pl.SetLogInfo(event, nil, "started", "DBCreateOrUpdate") + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + data := e.Employee{} + + if input.Id > 0 { + if err := tx.Where("\"Id\" = ? AND \"User_Id\" = ?", input.Id, input.User_Id).First(&data).Error; err == nil { + setData(&input, &data) + 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 nil, pl.SetLogError(event, input) + } + return &data, nil + } else if err != gorm.ErrRecordNotFound { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + return nil, nil + } + + setData(&input, &data) + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/main-use-case/infra/case.go b/internal/use-case/main-use-case/infra/case.go index e95e09d3..26f9d319 100644 --- a/internal/use-case/main-use-case/infra/case.go +++ b/internal/use-case/main-use-case/infra/case.go @@ -58,6 +58,13 @@ func Create(input e.CreateDto) (*d.Data, error) { data = *resData } + if input.InfraGroup_Code == ero.IFGCRoom { + input.Infra_Id = &data.Id + if err := createRoom(&input, &event, tx); err != nil { + return err + } + } + mwRunner.setMwType(pu.MWTPost) // Run post-middleware if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { diff --git a/internal/use-case/main-use-case/infra/helper.go b/internal/use-case/main-use-case/infra/helper.go index 00057eee..35388c85 100644 --- a/internal/use-case/main-use-case/infra/helper.go +++ b/internal/use-case/main-use-case/infra/helper.go @@ -7,8 +7,10 @@ package infra import ( e "simrs-vx/internal/domain/main-entities/infra" ei "simrs-vx/internal/domain/main-entities/item" + er "simrs-vx/internal/domain/main-entities/room" ero "simrs-vx/internal/domain/references/organization" ui "simrs-vx/internal/use-case/main-use-case/item" + ur "simrs-vx/internal/use-case/main-use-case/room" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -36,7 +38,11 @@ func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { Code: pu.AddPrefix("inf-", input.Code), Name: input.Name, ItemGroup_Code: ero.ITGCInfra, - Infra_Id: input.Parent_Id, + Uom_Code: func() *string { + tmp := "unit" + return &tmp + }(), + Infra_Id: input.Parent_Id, } item, err := ui.CreateData(itemCreate, event, tx) if err != nil { @@ -46,3 +52,17 @@ func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { input.Item_Id = &item.Id return nil } + +func createRoom(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { + roomCreate := er.CreateDto{ + Infra_Id: input.Infra_Id, + Unit_Id: input.Unit_Id, + Specialist_Id: input.Specialist_Id, + Subspecialist_Id: input.Subspecialist_Id, + } + _, err := ur.CreateData(roomCreate, event, tx) + if err != nil { + return err + } + return nil +} diff --git a/internal/use-case/main-use-case/nurse/helper.go b/internal/use-case/main-use-case/nurse/helper.go index d746e18e..5ecb6f20 100644 --- a/internal/use-case/main-use-case/nurse/helper.go +++ b/internal/use-case/main-use-case/nurse/helper.go @@ -20,4 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Nurse) { data.Employee_Id = inputSrc.Employee_Id data.IHS_Number = inputSrc.IHS_Number data.Unit_Id = inputSrc.Unit_Id + data.Infra_Id = inputSrc.Infra_Id } diff --git a/internal/use-case/main-use-case/person/helper.go b/internal/use-case/main-use-case/person/helper.go index 65f6bdb8..a2588c0e 100644 --- a/internal/use-case/main-use-case/person/helper.go +++ b/internal/use-case/main-use-case/person/helper.go @@ -24,10 +24,12 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Person) { data.BirthRegency_Code = inputSrc.BirthRegency_Code data.Gender_Code = inputSrc.Gender_Code data.ResidentIdentityNumber = inputSrc.ResidentIdentityNumber + data.DrivingLicenseNumber = inputSrc.DrivingLicenseNumber data.PassportNumber = inputSrc.PassportNumber data.Religion_Code = inputSrc.Religion_Code data.Education_Code = inputSrc.Education_Code data.Ocupation_Code = inputSrc.Ocupation_Code data.Ocupation_Name = inputSrc.Ocupation_Name data.Ethnic_Code = inputSrc.Ethnic_Code + data.Language_Code = inputSrc.Language_Code } diff --git a/internal/use-case/main-use-case/room/case.go b/internal/use-case/main-use-case/room/case.go new file mode 100644 index 00000000..c14fbbe9 --- /dev/null +++ b/internal/use-case/main-use-case/room/case.go @@ -0,0 +1,278 @@ +package room + +import ( + e "simrs-vx/internal/domain/main-entities/room" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "specialist" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Room{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Room + var dataList []e.Room + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Room + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Room + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Room + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/room/helper.go b/internal/use-case/main-use-case/room/helper.go new file mode 100644 index 00000000..cc64e8c5 --- /dev/null +++ b/internal/use-case/main-use-case/room/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package room + +import ( + e "simrs-vx/internal/domain/main-entities/room" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Room) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Infra_Id = inputSrc.Infra_Id + data.Unit_Id = inputSrc.Unit_Id + data.Specialist_Id = inputSrc.Specialist_Id + data.Subspecialist_Id = inputSrc.Subspecialist_Id +} diff --git a/internal/use-case/main-use-case/room/lib.go b/internal/use-case/main-use-case/room/lib.go new file mode 100644 index 00000000..f8943263 --- /dev/null +++ b/internal/use-case/main-use-case/room/lib.go @@ -0,0 +1,155 @@ +package room + +import ( + e "simrs-vx/internal/domain/main-entities/room" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Room, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Room{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Room, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Room{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Room{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Room, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Room{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Room, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Room, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/room/middleware-runner.go b/internal/use-case/main-use-case/room/middleware-runner.go new file mode 100644 index 00000000..eaeb46fd --- /dev/null +++ b/internal/use-case/main-use-case/room/middleware-runner.go @@ -0,0 +1,103 @@ +package room + +import ( + e "simrs-vx/internal/domain/main-entities/room" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Room) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Room) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Room) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Room) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Room) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/room/middleware.go b/internal/use-case/main-use-case/room/middleware.go new file mode 100644 index 00000000..668f18e2 --- /dev/null +++ b/internal/use-case/main-use-case/room/middleware.go @@ -0,0 +1,9 @@ +package room + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/room/tycovar.go b/internal/use-case/main-use-case/room/tycovar.go new file mode 100644 index 00000000..789e3f6f --- /dev/null +++ b/internal/use-case/main-use-case/room/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package room + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/room" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Room, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Room, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Room, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/specialist-intern/case.go b/internal/use-case/main-use-case/specialist-intern/case.go new file mode 100644 index 00000000..ad71627b --- /dev/null +++ b/internal/use-case/main-use-case/specialist-intern/case.go @@ -0,0 +1,278 @@ +package specialistintern + +import ( + e "simrs-vx/internal/domain/main-entities/specialist-intern" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "specialist-intern" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.SpecialistIntern{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.SpecialistIntern + var dataList []e.SpecialistIntern + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.SpecialistIntern + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.SpecialistIntern + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.SpecialistIntern + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/specialist-intern/helper.go b/internal/use-case/main-use-case/specialist-intern/helper.go new file mode 100644 index 00000000..36b989d8 --- /dev/null +++ b/internal/use-case/main-use-case/specialist-intern/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package specialistintern + +import ( + e "simrs-vx/internal/domain/main-entities/specialist-intern" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.SpecialistIntern) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Person_Id = inputSrc.Person_Id + data.Specialist_Id = inputSrc.Specialist_Id + data.Subspecialist_Id = inputSrc.Subspecialist_Id + data.User_Id = inputSrc.User_Id +} diff --git a/internal/use-case/main-use-case/specialist-intern/lib.go b/internal/use-case/main-use-case/specialist-intern/lib.go new file mode 100644 index 00000000..aaa07acb --- /dev/null +++ b/internal/use-case/main-use-case/specialist-intern/lib.go @@ -0,0 +1,155 @@ +package specialistintern + +import ( + e "simrs-vx/internal/domain/main-entities/specialist-intern" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.SpecialistIntern, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.SpecialistIntern{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.SpecialistIntern, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.SpecialistIntern{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.SpecialistIntern{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.SpecialistIntern, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.SpecialistIntern{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.SpecialistIntern, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.SpecialistIntern, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/specialist-intern/middleware-runner.go b/internal/use-case/main-use-case/specialist-intern/middleware-runner.go new file mode 100644 index 00000000..1852f4aa --- /dev/null +++ b/internal/use-case/main-use-case/specialist-intern/middleware-runner.go @@ -0,0 +1,103 @@ +package specialistintern + +import ( + e "simrs-vx/internal/domain/main-entities/specialist-intern" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.SpecialistIntern) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.SpecialistIntern) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.SpecialistIntern) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.SpecialistIntern) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.SpecialistIntern) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/specialist-intern/middleware.go b/internal/use-case/main-use-case/specialist-intern/middleware.go new file mode 100644 index 00000000..4e36b0be --- /dev/null +++ b/internal/use-case/main-use-case/specialist-intern/middleware.go @@ -0,0 +1,9 @@ +package specialistintern + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/specialist-intern/tycovar.go b/internal/use-case/main-use-case/specialist-intern/tycovar.go new file mode 100644 index 00000000..8edef033 --- /dev/null +++ b/internal/use-case/main-use-case/specialist-intern/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package specialistintern + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/specialist-intern" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.SpecialistIntern, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.SpecialistIntern, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.SpecialistIntern, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/specialist/case.go b/internal/use-case/main-use-case/specialist/case.go new file mode 100644 index 00000000..1ede6556 --- /dev/null +++ b/internal/use-case/main-use-case/specialist/case.go @@ -0,0 +1,278 @@ +package specialist + +import ( + e "simrs-vx/internal/domain/main-entities/specialist" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "specialist" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Specialist{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Specialist + var dataList []e.Specialist + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Specialist + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Specialist + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Specialist + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/specialist/helper.go b/internal/use-case/main-use-case/specialist/helper.go new file mode 100644 index 00000000..9c1e42fc --- /dev/null +++ b/internal/use-case/main-use-case/specialist/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package specialist + +import ( + e "simrs-vx/internal/domain/main-entities/specialist" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Code = inputSrc.Code + data.Name = inputSrc.Name + data.Unit_Id = inputSrc.Unit_Id +} diff --git a/internal/use-case/main-use-case/specialist/lib.go b/internal/use-case/main-use-case/specialist/lib.go new file mode 100644 index 00000000..5d31ea56 --- /dev/null +++ b/internal/use-case/main-use-case/specialist/lib.go @@ -0,0 +1,155 @@ +package specialist + +import ( + e "simrs-vx/internal/domain/main-entities/specialist" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Specialist, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Specialist{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Specialist, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Specialist{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Specialist{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Specialist, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Specialist{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Specialist, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Specialist, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/specialist/middleware-runner.go b/internal/use-case/main-use-case/specialist/middleware-runner.go new file mode 100644 index 00000000..4aa6cdd4 --- /dev/null +++ b/internal/use-case/main-use-case/specialist/middleware-runner.go @@ -0,0 +1,103 @@ +package specialist + +import ( + e "simrs-vx/internal/domain/main-entities/specialist" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Specialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Specialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Specialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Specialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Specialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/specialist/middleware.go b/internal/use-case/main-use-case/specialist/middleware.go new file mode 100644 index 00000000..298e51a8 --- /dev/null +++ b/internal/use-case/main-use-case/specialist/middleware.go @@ -0,0 +1,9 @@ +package specialist + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/specialist/tycovar.go b/internal/use-case/main-use-case/specialist/tycovar.go new file mode 100644 index 00000000..16fa50b0 --- /dev/null +++ b/internal/use-case/main-use-case/specialist/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package specialist + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/specialist" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Specialist, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Specialist, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Specialist, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/subspecialist/case.go b/internal/use-case/main-use-case/subspecialist/case.go new file mode 100644 index 00000000..66df538b --- /dev/null +++ b/internal/use-case/main-use-case/subspecialist/case.go @@ -0,0 +1,278 @@ +package subspecialist + +import ( + e "simrs-vx/internal/domain/main-entities/subspecialist" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "specialist" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Subspecialist{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Subspecialist + var dataList []e.Subspecialist + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Subspecialist + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Subspecialist + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Subspecialist + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/subspecialist/helper.go b/internal/use-case/main-use-case/subspecialist/helper.go new file mode 100644 index 00000000..5d04093f --- /dev/null +++ b/internal/use-case/main-use-case/subspecialist/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package subspecialist + +import ( + e "simrs-vx/internal/domain/main-entities/subspecialist" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Subspecialist) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Code = inputSrc.Code + data.Name = inputSrc.Name + data.Specialist_Id = inputSrc.Specialist_Id +} diff --git a/internal/use-case/main-use-case/subspecialist/lib.go b/internal/use-case/main-use-case/subspecialist/lib.go new file mode 100644 index 00000000..49c87685 --- /dev/null +++ b/internal/use-case/main-use-case/subspecialist/lib.go @@ -0,0 +1,155 @@ +package subspecialist + +import ( + e "simrs-vx/internal/domain/main-entities/subspecialist" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Subspecialist, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Subspecialist{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Subspecialist, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Subspecialist{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Subspecialist{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Subspecialist, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Subspecialist{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Subspecialist, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Subspecialist, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/subspecialist/middleware-runner.go b/internal/use-case/main-use-case/subspecialist/middleware-runner.go new file mode 100644 index 00000000..c7e5f285 --- /dev/null +++ b/internal/use-case/main-use-case/subspecialist/middleware-runner.go @@ -0,0 +1,103 @@ +package subspecialist + +import ( + e "simrs-vx/internal/domain/main-entities/subspecialist" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Subspecialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Subspecialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Subspecialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Subspecialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Subspecialist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/subspecialist/middleware.go b/internal/use-case/main-use-case/subspecialist/middleware.go new file mode 100644 index 00000000..ad2ba452 --- /dev/null +++ b/internal/use-case/main-use-case/subspecialist/middleware.go @@ -0,0 +1,9 @@ +package subspecialist + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/subspecialist/tycovar.go b/internal/use-case/main-use-case/subspecialist/tycovar.go new file mode 100644 index 00000000..ed4540b8 --- /dev/null +++ b/internal/use-case/main-use-case/subspecialist/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package subspecialist + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/subspecialist" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Subspecialist, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Subspecialist, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Subspecialist, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index c4f55985..177a62b2 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -1,12 +1,33 @@ package user import ( + "errors" "strconv" "gorm.io/gorm" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/employee" + el "simrs-vx/internal/domain/main-entities/laborant" + en "simrs-vx/internal/domain/main-entities/nurse" + et "simrs-vx/internal/domain/main-entities/nutritionist" + ep "simrs-vx/internal/domain/main-entities/pharmacist" + esi "simrs-vx/internal/domain/main-entities/specialist-intern" e "simrs-vx/internal/domain/main-entities/user" + + ud "simrs-vx/internal/use-case/main-use-case/doctor" + ue "simrs-vx/internal/use-case/main-use-case/employee" + ul "simrs-vx/internal/use-case/main-use-case/laborant" + un "simrs-vx/internal/use-case/main-use-case/nurse" + ut "simrs-vx/internal/use-case/main-use-case/nutritionist" + upe "simrs-vx/internal/use-case/main-use-case/person" + upa "simrs-vx/internal/use-case/main-use-case/person-address" + upc "simrs-vx/internal/use-case/main-use-case/person-contact" + up "simrs-vx/internal/use-case/main-use-case/pharmacist" + usi "simrs-vx/internal/use-case/main-use-case/specialist-intern" + erc "simrs-vx/internal/domain/references/common" + ero "simrs-vx/internal/domain/references/organization" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -36,12 +57,103 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx); err != nil { + return err + } else { + input.Person_Id = person_id + } + + for idx := range input.PersonAddresses { + input.PersonAddresses[idx].Person_Id = *input.Person_Id + } + if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx); err != nil { + return err + } + + for idx := range input.PersonContacts { + input.PersonContacts[idx].Person_Id = *input.Person_Id + } + if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx); err != nil { + return err + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { data = *resData } + if input.Position_Code == ero.UPCInt { + createInt := esi.CreateDto{ + Person_Id: input.Person_Id, + Specialist_Id: input.Specialist_Id, + Subspecialist_Id: input.Subspecialist_Id, + User_Id: &data.Id, + } + if _, err := usi.CreateData(createInt, &event, tx); err != nil { + return err + } + return nil + } + + input.Employee.User_Id = &data.Id + input.Employee.Person_Id = input.Person_Id + employeeData, err := ue.CreateOrUpdate(setDataEmployeeUpdate(*input.Employee), &event, tx) + if err != nil { + return err + } + + switch input.Position_Code { + case ero.UPCDoc: + createDoc := ed.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + SIP_Number: input.SIP_Number, + Unit_Id: input.Unit_Id, + Specialist_Id: input.Specialist_Id, + Subspecialist_Id: input.Subspecialist_Id, + } + if _, err := ud.CreateData(createDoc, &event, tx); err != nil { + return err + } + case ero.UPCNur: + createNurse := en.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + Unit_Id: input.Unit_Id, + Infra_Id: input.Infra_Id, + } + if _, err := un.CreateData(createNurse, &event, tx); err != nil { + return err + } + case ero.UPCNut: + createNutritionist := et.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if _, err := ut.CreateData(createNutritionist, &event, tx); err != nil { + return err + } + case ero.UPCPha: + createPharmacist := ep.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if _, err := up.CreateData(createPharmacist, &event, tx); err != nil { + return err + } + case ero.UPCLab: + createLaborant := el.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if _, err := ul.CreateData(createLaborant, &event, tx); err != nil { + return err + } + default: + return errors.New("invalid employee position") + } + mwRunner.setMwType(pu.MWTPost) // Run post-middleware if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { @@ -192,10 +304,175 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } + person_id, err := getPersonIdByUserId(data.Id, input.Position_Code, &event, tx) + if err != nil { + return err + } else { + input.Person.Id = *person_id + } + + if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx); err != nil { + return err + } else { + input.Person_Id = person_id + } + + for idx := range input.PersonAddresses { + input.PersonAddresses[idx].Person_Id = *input.Person_Id + } + if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx); err != nil { + return err + } + + for idx := range input.PersonContacts { + input.PersonContacts[idx].Person_Id = *input.Person_Id + } + if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx); err != nil { + return err + } + if err := UpdateData(input, data, &event, tx); err != nil { return err } + if input.Position_Code == ero.UPCInt { + readInt := esi.ReadDetailDto{User_Id: &data.Id} + readIntData, err := usi.ReadDetailData(readInt, &event, tx) + if err != nil { + return err + } + createInt := esi.CreateDto{} + if readIntData != nil { + if err := usi.UpdateData(esi.UpdateDto{CreateDto: createInt}, readIntData, &event, tx); err != nil { + return err + } + return nil + } + + if _, err := usi.CreateData(createInt, &event, tx); err != nil { + return err + } + } + + input.Employee.User_Id = &data.Id + input.Employee.Person_Id = input.Person_Id + employeeData, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &data.Id}, &event, tx) + if err != nil { + return err + } + + err = ue.UpdateData(setDataEmployeeUpdate(*input.Employee), employeeData, &event, tx) + if err != nil { + return err + } + + switch input.Position_Code { + case ero.UPCDoc: + readDoc := ed.ReadDetailDto{Employee_Id: &data.Id} + readDocData, err := ud.ReadDetailData(readDoc, &event, tx) + if err != nil { + return err + } + createDoc := ed.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + SIP_Number: input.SIP_Number, + Unit_Id: input.Unit_Id, + } + if readDocData != nil { + if err := ud.UpdateData(ed.UpdateDto{CreateDto: createDoc}, readDocData, &event, tx); err != nil { + return err + } + return nil + } + + if _, err := ud.CreateData(createDoc, &event, tx); err != nil { + return err + } + case ero.UPCNur: + readNur := en.ReadDetailDto{Employee_Id: &data.Id} + readNurData, err := un.ReadDetailData(readNur, &event, tx) + if err != nil { + return err + } + createNur := en.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if readNurData != nil { + if err := un.UpdateData(en.UpdateDto{CreateDto: createNur}, readNurData, &event, tx); err != nil { + return err + } + return nil + } + + if _, err := un.CreateData(createNur, &event, tx); err != nil { + return err + } + case ero.UPCNut: + readNut := et.ReadDetailDto{Employee_Id: &data.Id} + readNutData, err := ut.ReadDetailData(readNut, &event, tx) + if err != nil { + return err + } + createNut := et.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if readNutData != nil { + if err := ut.UpdateData(et.UpdateDto{CreateDto: createNut}, readNutData, &event, tx); err != nil { + return err + } + return nil + } + + if _, err := ut.CreateData(createNut, &event, tx); err != nil { + return err + } + case ero.UPCPha: + readPha := ep.ReadDetailDto{Employee_Id: &data.Id} + readPhaData, err := up.ReadDetailData(readPha, &event, tx) + if err != nil { + return err + } + createPha := ep.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if readPhaData != nil { + if err := up.UpdateData(ep.UpdateDto{CreateDto: createPha}, readPhaData, &event, tx); err != nil { + return err + } + return nil + } + + if _, err := up.CreateData(createPha, &event, tx); err != nil { + return err + } + case ero.UPCLab: + readLab := el.ReadDetailDto{Employee_Id: &data.Id} + readLabData, err := ul.ReadDetailData(readLab, &event, tx) + if err != nil { + return err + } + createLab := el.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if readLabData != nil { + if err := ul.UpdateData(el.UpdateDto{CreateDto: createLab}, readLabData, &event, tx); err != nil { + return err + } + return nil + } + + if _, err := ul.CreateData(createLab, &event, tx); err != nil { + return err + } + default: + return errors.New("invalid employee position") + } + pl.SetLogInfo(&event, nil, "complete") mwRunner.setMwType(pu.MWTPost) diff --git a/internal/use-case/main-use-case/user/helper.go b/internal/use-case/main-use-case/user/helper.go index 37815b51..bdb1c75c 100644 --- a/internal/use-case/main-use-case/user/helper.go +++ b/internal/use-case/main-use-case/user/helper.go @@ -5,9 +5,19 @@ Any functions that are used internally by the use-case package user import ( + ee "simrs-vx/internal/domain/main-entities/employee" + esi "simrs-vx/internal/domain/main-entities/specialist-intern" e "simrs-vx/internal/domain/main-entities/user" + ue "simrs-vx/internal/use-case/main-use-case/employee" + usi "simrs-vx/internal/use-case/main-use-case/specialist-intern" + + ero "simrs-vx/internal/domain/references/organization" + + pl "simrs-vx/pkg/logger" p "simrs-vx/pkg/password" + + "gorm.io/gorm" ) func setCreate(src e.CreateDto, dst *e.User) error { @@ -19,12 +29,45 @@ func setCreate(src e.CreateDto, dst *e.User) error { dst.Name = src.Name dst.Password = pass dst.Status_Code = src.Status_Code + dst.Position_Code = src.Position_Code return nil } func setUpdate(src e.UpdateDto, dst *e.User) { - dst.Name = src.Name dst.Status_Code = src.Status_Code + dst.Position_Code = src.Position_Code } + +func setDataEmployeeUpdate(src e.EmployeUpdateDto) ee.UpdateDto { + return ee.UpdateDto{ + Id: src.Id, + CreateDto: ee.CreateDto{ + User_Id: src.User_Id, + Person_Id: src.Person_Id, + Division_Code: src.Division_Code, + Number: src.Number, + Status_Code: src.Status_Code, + }, + } +} + +func getPersonIdByUserId(userId uint, positionCode ero.UserPosisitionCode, event *pl.Event, tx *gorm.DB) (*uint, error) { + pl.SetLogInfo(event, nil, "started", "DBGetPersonIdByUserId") + if positionCode == ero.UPCInt { + person, err := usi.ReadDetailData(esi.ReadDetailDto{User_Id: &userId}, event, tx) + if err != nil { + return nil, err + } + + return &person.Id, nil + } + + person, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &userId}, event, tx) + if err != nil { + return nil, err + } + + return &person.Id, nil +} From dd409e5c5e1b41674db2125b887bf674bcda84f0 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 4 Sep 2025 21:15:11 +0700 Subject: [PATCH 007/190] refactor --- cmd/migration/migrations/20250904141448.sql | 10 ++++++++++ cmd/migration/migrations/atlas.sum | 3 ++- internal/domain/main-entities/doctor/entity.go | 4 ++-- .../domain/main-entities/laborant/entity.go | 2 +- internal/domain/main-entities/nurse/entity.go | 2 +- .../domain/main-entities/nutritionist/entity.go | 2 +- .../domain/main-entities/pharmacist/entity.go | 2 +- internal/use-case/main-use-case/employee/lib.go | 15 ++++++++++++++- .../main-use-case/specialist-intern/lib.go | 9 ++++++++- internal/use-case/main-use-case/user/case.go | 17 +++++++++++------ internal/use-case/main-use-case/user/helper.go | 13 ++++++++----- 11 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 cmd/migration/migrations/20250904141448.sql diff --git a/cmd/migration/migrations/20250904141448.sql b/cmd/migration/migrations/20250904141448.sql new file mode 100644 index 00000000..56a113ca --- /dev/null +++ b/cmd/migration/migrations/20250904141448.sql @@ -0,0 +1,10 @@ +-- Modify "Doctor" table +ALTER TABLE "public"."Doctor" ADD CONSTRAINT "uni_Doctor_IHS_Number" UNIQUE ("IHS_Number"), ADD CONSTRAINT "uni_Doctor_SIP_Number" UNIQUE ("SIP_Number"); +-- Modify "Laborant" table +ALTER TABLE "public"."Laborant" ADD CONSTRAINT "uni_Laborant_IHS_Number" UNIQUE ("IHS_Number"); +-- Modify "Nurse" table +ALTER TABLE "public"."Nurse" ADD CONSTRAINT "uni_Nurse_IHS_Number" UNIQUE ("IHS_Number"); +-- Modify "Nutritionist" table +ALTER TABLE "public"."Nutritionist" ADD CONSTRAINT "uni_Nutritionist_IHS_Number" UNIQUE ("IHS_Number"); +-- Modify "Pharmacist" table +ALTER TABLE "public"."Pharmacist" ADD CONSTRAINT "uni_Pharmacist_IHS_Number" UNIQUE ("IHS_Number"); diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index fe2b15b0..10859e9b 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,2 +1,3 @@ -h1:5CRUsZFEhBmTlYz30l5g/ilZWIUjrfTf7K0qa5ffXQg= +h1:G2T3Gv3jMXqZDaBw/lSU8IhowMI3z//r+ZtHxndsLc4= 20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= diff --git a/internal/domain/main-entities/doctor/entity.go b/internal/domain/main-entities/doctor/entity.go index 55d45354..cf952380 100644 --- a/internal/domain/main-entities/doctor/entity.go +++ b/internal/domain/main-entities/doctor/entity.go @@ -12,8 +12,8 @@ type Doctor struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` - SIP_Number *string `json:"sip_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` + SIP_Number *string `json:"sip_number" gorm:"unique;size:20"` Unit_Id *uint16 `json:"unit_id"` Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` Specialist_Id *uint16 `json:"specialist_id"` diff --git a/internal/domain/main-entities/laborant/entity.go b/internal/domain/main-entities/laborant/entity.go index 82870b06..eeb63bef 100644 --- a/internal/domain/main-entities/laborant/entity.go +++ b/internal/domain/main-entities/laborant/entity.go @@ -9,5 +9,5 @@ type Laborant struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` } diff --git a/internal/domain/main-entities/nurse/entity.go b/internal/domain/main-entities/nurse/entity.go index 732a58ec..c3332c45 100644 --- a/internal/domain/main-entities/nurse/entity.go +++ b/internal/domain/main-entities/nurse/entity.go @@ -11,7 +11,7 @@ type Nurse struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` Unit_Id *uint16 `json:"unit_id"` Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` Infra_Id *uint16 `json:"infra_id"` diff --git a/internal/domain/main-entities/nutritionist/entity.go b/internal/domain/main-entities/nutritionist/entity.go index 8956b8b4..be431f66 100644 --- a/internal/domain/main-entities/nutritionist/entity.go +++ b/internal/domain/main-entities/nutritionist/entity.go @@ -9,5 +9,5 @@ type Nutritionist struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` } diff --git a/internal/domain/main-entities/pharmacist/entity.go b/internal/domain/main-entities/pharmacist/entity.go index 352fa9ba..318cc97e 100644 --- a/internal/domain/main-entities/pharmacist/entity.go +++ b/internal/domain/main-entities/pharmacist/entity.go @@ -9,5 +9,5 @@ type Pharmacist struct { ecore.Main // adjust this according to the needs Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - IHS_Number *string `json:"ihs_number" gorm:"size:20"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` } diff --git a/internal/use-case/main-use-case/employee/lib.go b/internal/use-case/main-use-case/employee/lib.go index ed58bed7..377fdfb8 100644 --- a/internal/use-case/main-use-case/employee/lib.go +++ b/internal/use-case/main-use-case/employee/lib.go @@ -102,7 +102,20 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = tx.Preload("Person.Contacts") tx = tx.Preload("Person.Relatives") - if err := tx.First(&data, input.Id).Error; err != nil { + if input.User_Id != nil { + tx = tx.Where("\"User_Id\" = ?", *input.User_Id) + } + if input.Person_Id != nil { + tx = tx.Where("\"Person_Id\" = ?", *input.Person_Id) + } + if input.Number != nil { + tx = tx.Where("\"Number\" = ?", *input.Number) + } + 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 } diff --git a/internal/use-case/main-use-case/specialist-intern/lib.go b/internal/use-case/main-use-case/specialist-intern/lib.go index aaa07acb..81c0f0a9 100644 --- a/internal/use-case/main-use-case/specialist-intern/lib.go +++ b/internal/use-case/main-use-case/specialist-intern/lib.go @@ -96,7 +96,14 @@ 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.User_Id != nil { + tx = tx.Where("\"User_Id\" = ?", *input.User_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 } diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index 177a62b2..ae1e8464 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -341,7 +341,12 @@ func Update(input e.UpdateDto) (*d.Data, error) { if err != nil { return err } - createInt := esi.CreateDto{} + createInt := esi.CreateDto{ + User_Id: &data.Id, + Person_Id: input.Person_Id, + Specialist_Id: input.Specialist_Id, + Subspecialist_Id: input.Subspecialist_Id, + } if readIntData != nil { if err := usi.UpdateData(esi.UpdateDto{CreateDto: createInt}, readIntData, &event, tx); err != nil { return err @@ -368,7 +373,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { switch input.Position_Code { case ero.UPCDoc: - readDoc := ed.ReadDetailDto{Employee_Id: &data.Id} + readDoc := ed.ReadDetailDto{Employee_Id: &employeeData.Id} readDocData, err := ud.ReadDetailData(readDoc, &event, tx) if err != nil { return err @@ -390,7 +395,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } case ero.UPCNur: - readNur := en.ReadDetailDto{Employee_Id: &data.Id} + readNur := en.ReadDetailDto{Employee_Id: &employeeData.Id} readNurData, err := un.ReadDetailData(readNur, &event, tx) if err != nil { return err @@ -410,7 +415,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } case ero.UPCNut: - readNut := et.ReadDetailDto{Employee_Id: &data.Id} + readNut := et.ReadDetailDto{Employee_Id: &employeeData.Id} readNutData, err := ut.ReadDetailData(readNut, &event, tx) if err != nil { return err @@ -430,7 +435,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } case ero.UPCPha: - readPha := ep.ReadDetailDto{Employee_Id: &data.Id} + readPha := ep.ReadDetailDto{Employee_Id: &employeeData.Id} readPhaData, err := up.ReadDetailData(readPha, &event, tx) if err != nil { return err @@ -450,7 +455,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } case ero.UPCLab: - readLab := el.ReadDetailDto{Employee_Id: &data.Id} + readLab := el.ReadDetailDto{Employee_Id: &employeeData.Id} readLabData, err := ul.ReadDetailData(readLab, &event, tx) if err != nil { return err diff --git a/internal/use-case/main-use-case/user/helper.go b/internal/use-case/main-use-case/user/helper.go index bdb1c75c..111d333f 100644 --- a/internal/use-case/main-use-case/user/helper.go +++ b/internal/use-case/main-use-case/user/helper.go @@ -5,6 +5,7 @@ Any functions that are used internally by the use-case package user import ( + "errors" ee "simrs-vx/internal/domain/main-entities/employee" esi "simrs-vx/internal/domain/main-entities/specialist-intern" e "simrs-vx/internal/domain/main-entities/user" @@ -56,18 +57,20 @@ func setDataEmployeeUpdate(src e.EmployeUpdateDto) ee.UpdateDto { func getPersonIdByUserId(userId uint, positionCode ero.UserPosisitionCode, event *pl.Event, tx *gorm.DB) (*uint, error) { pl.SetLogInfo(event, nil, "started", "DBGetPersonIdByUserId") if positionCode == ero.UPCInt { - person, err := usi.ReadDetailData(esi.ReadDetailDto{User_Id: &userId}, event, tx) + specInt, err := usi.ReadDetailData(esi.ReadDetailDto{User_Id: &userId}, event, tx) if err != nil { return nil, err } - - return &person.Id, nil + if specInt.Person_Id == nil { + return nil, errors.New("person id not found") + } + return specInt.Person_Id, nil } - person, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &userId}, event, tx) + emp, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &userId}, event, tx) if err != nil { return nil, err } - return &person.Id, nil + return emp.Person_Id, nil } From d497b024dc84b0544dae04fed39fadf67dc98446 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 8 Sep 2025 13:26:36 +0700 Subject: [PATCH 008/190] add soapi, sbar, adime, ambulatory, inpatient, emergency, appointment and edit encounter --- cmd/migration/migrations/20250908062237.sql | 96 ++++++++++++ cmd/migration/migrations/20250908062323.sql | 2 + cmd/migration/migrations/atlas.sum | 4 +- internal/domain/main-entities/adime/dto.go | 76 +++++++++ internal/domain/main-entities/adime/entity.go | 18 +++ .../domain/main-entities/ambulatory/dto.go | 61 ++++++++ .../domain/main-entities/ambulatory/entity.go | 15 ++ .../domain/main-entities/appointment/dto.go | 88 +++++++++++ .../main-entities/appointment/entity.go | 21 +++ .../domain/main-entities/emergency/dto.go | 61 ++++++++ .../domain/main-entities/emergency/entity.go | 15 ++ .../domain/main-entities/encounter/dto.go | 144 ++++++++++-------- .../domain/main-entities/encounter/entity.go | 43 +++--- .../domain/main-entities/inpatient/dto.go | 72 +++++++++ .../domain/main-entities/inpatient/entity.go | 18 +++ internal/domain/main-entities/sbar/dto.go | 76 +++++++++ internal/domain/main-entities/sbar/entity.go | 18 +++ internal/domain/main-entities/soapi/dto.go | 76 +++++++++ internal/domain/main-entities/soapi/entity.go | 18 +++ .../domain/references/clinical/clinical.go | 4 + .../domain/references/encounter/encounter.go | 25 ++- internal/interface/migration/migration.go | 14 ++ 22 files changed, 876 insertions(+), 89 deletions(-) create mode 100644 cmd/migration/migrations/20250908062237.sql create mode 100644 cmd/migration/migrations/20250908062323.sql create mode 100644 internal/domain/main-entities/adime/dto.go create mode 100644 internal/domain/main-entities/adime/entity.go create mode 100644 internal/domain/main-entities/ambulatory/dto.go create mode 100644 internal/domain/main-entities/ambulatory/entity.go create mode 100644 internal/domain/main-entities/appointment/dto.go create mode 100644 internal/domain/main-entities/appointment/entity.go create mode 100644 internal/domain/main-entities/emergency/dto.go create mode 100644 internal/domain/main-entities/emergency/entity.go create mode 100644 internal/domain/main-entities/inpatient/dto.go create mode 100644 internal/domain/main-entities/inpatient/entity.go create mode 100644 internal/domain/main-entities/sbar/dto.go create mode 100644 internal/domain/main-entities/sbar/entity.go create mode 100644 internal/domain/main-entities/soapi/dto.go create mode 100644 internal/domain/main-entities/soapi/entity.go diff --git a/cmd/migration/migrations/20250908062237.sql b/cmd/migration/migrations/20250908062237.sql new file mode 100644 index 00000000..cc509de4 --- /dev/null +++ b/cmd/migration/migrations/20250908062237.sql @@ -0,0 +1,96 @@ +-- Create "Appointment" table +CREATE TABLE "public"."Appointment" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "PracticeSchedule_Id" bigint NULL, + "Patient_Id" bigint NULL, + "Person_ResidentIdentityNumber" character varying(16) NULL, + "Person_Name" character varying(100) NULL, + "Person_PhoneNumber" character varying(30) NULL, + "PaymentMethod_Code" character varying(10) NULL, + "RefNumber" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Appointment_Patient" FOREIGN KEY ("Patient_Id") REFERENCES "public"."Patient" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Appointment_PracticeSchedule" FOREIGN KEY ("PracticeSchedule_Id") REFERENCES "public"."PracticeSchedule" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" ADD COLUMN "Appointment_Doctor_Id" bigint NULL, ADD COLUMN "Appointment_Id" bigint NULL, ADD COLUMN "EarlyEducation" text NULL, ADD COLUMN "MedicalDischargeEducation" text NULL, ADD COLUMN "AdmDischargeEducation" text NULL, ADD COLUMN "DischargeReason" text NULL, ADD CONSTRAINT "fk_Encounter_Appointment" FOREIGN KEY ("Appointment_Id") REFERENCES "public"."Appointment" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_Encounter_Appointment_Doctor" FOREIGN KEY ("Appointment_Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Create "Adime" table +CREATE TABLE "public"."Adime" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Employee_Id" bigint NULL, + "Time" timestamptz NULL, + "Value" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Adime_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Adime_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Ambulatory" table +CREATE TABLE "public"."Ambulatory" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Class_Code" character varying(10) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Ambulatory_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Emergency" table +CREATE TABLE "public"."Emergency" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Class_Code" character varying(10) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Emergency_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Inpatient" table +CREATE TABLE "public"."Inpatient" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Class_Code" character varying(10) NULL, + "Infra_Id" integer NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Inpatient_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Inpatient_Infra" FOREIGN KEY ("Infra_Id") REFERENCES "public"."Infra" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Sbar" table +CREATE TABLE "public"."Sbar" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Employee_Id" bigint NULL, + "Time" timestamptz NULL, + "Value" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Sbar_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Sbar_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Soapi" table +CREATE TABLE "public"."Soapi" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Employee_Id" bigint NULL, + "Time" timestamptz NULL, + "Value" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Soapi_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Soapi_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/migration/migrations/20250908062323.sql b/cmd/migration/migrations/20250908062323.sql new file mode 100644 index 00000000..cc63543f --- /dev/null +++ b/cmd/migration/migrations/20250908062323.sql @@ -0,0 +1,2 @@ +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" DROP COLUMN "Assignment_Doctor_Id"; diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index 10859e9b..91349cd8 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,3 +1,5 @@ -h1:G2T3Gv3jMXqZDaBw/lSU8IhowMI3z//r+ZtHxndsLc4= +h1:qEdw2cOowYcLvkC4fcOTQr2KqQIaZa6YYIgj2CgYbkM= 20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= 20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= diff --git a/internal/domain/main-entities/adime/dto.go b/internal/domain/main-entities/adime/dto.go new file mode 100644 index 00000000..7cbe3608 --- /dev/null +++ b/internal/domain/main-entities/adime/dto.go @@ -0,0 +1,76 @@ +package adime + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eem "simrs-vx/internal/domain/main-entities/employee" + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Employee_Id *uint `json:"employee_id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} + +type ReadListDto struct { + Encounter_Id *uint `json:"encounter_id"` + Employee_Id *uint `json:"employee_id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Employee_Id *uint `json:"employee_id"` + Employee *eem.Employee `json:"employee,omitempty"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} + +func (d Adime) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Employee_Id: d.Employee_Id, + Employee: d.Employee, + Time: d.Time, + Value: d.Value, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Adime) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/adime/entity.go b/internal/domain/main-entities/adime/entity.go new file mode 100644 index 00000000..35fa7276 --- /dev/null +++ b/internal/domain/main-entities/adime/entity.go @@ -0,0 +1,18 @@ +package adime + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eem "simrs-vx/internal/domain/main-entities/employee" + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" +) + +type Adime struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Employee_Id *uint `json:"employee_id"` + Employee *eem.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} diff --git a/internal/domain/main-entities/ambulatory/dto.go b/internal/domain/main-entities/ambulatory/dto.go new file mode 100644 index 00000000..cc1eebdd --- /dev/null +++ b/internal/domain/main-entities/ambulatory/dto.go @@ -0,0 +1,61 @@ +package ambulatory + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + ere "simrs-vx/internal/domain/references/encounter" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Class_Code ere.AmbulatoryClassCode `json:"class_code" validate:"maxLength=10"` +} + +type ReadListDto struct { + Encounter_Id *uint `json:"encounter_id"` + Class_Code ere.AmbulatoryClassCode `json:"class_code"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Class_Code ere.AmbulatoryClassCode `json:"class_code"` +} + +func (d Ambulatory) ToResponse() ResponseDto { + resp := ResponseDto{} + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Ambulatory) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/ambulatory/entity.go b/internal/domain/main-entities/ambulatory/entity.go new file mode 100644 index 00000000..58a9810e --- /dev/null +++ b/internal/domain/main-entities/ambulatory/entity.go @@ -0,0 +1,15 @@ +package ambulatory + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + + ere "simrs-vx/internal/domain/references/encounter" +) + +type Ambulatory struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Class_Code ere.AmbulatoryClassCode `json:"class_code" gorm:"size:10"` +} diff --git a/internal/domain/main-entities/appointment/dto.go b/internal/domain/main-entities/appointment/dto.go new file mode 100644 index 00000000..ff91ae92 --- /dev/null +++ b/internal/domain/main-entities/appointment/dto.go @@ -0,0 +1,88 @@ +package appointment + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ep "simrs-vx/internal/domain/main-entities/patient" + eps "simrs-vx/internal/domain/main-entities/practice-schedule" + erc "simrs-vx/internal/domain/references/common" +) + +type CreateDto struct { + PracticeSchedule_Id *uint `json:"practiceSchedule_id"` + Patient_Id *uint `json:"patient_id"` + Person_ResidentIdentityNumber string `json:"person_residentIdentityNumber"` + Person_Name string `json:"person_name"` + Person_PhoneNumber string `json:"person_phoneNumber"` + PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code"` + RefNumber string `json:"refNumber"` +} + +type ReadListDto struct { + PracticeSchedule_Id *uint `json:"practiceSchedule_id"` + Patient_Id *uint `json:"patient_id"` + Person_ResidentIdentityNumber string `json:"person_residentIdentityNumber"` + Person_Name string `json:"person_name"` + Person_PhoneNumber string `json:"person_phoneNumber"` + PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code"` + RefNumber string `json:"refNumber"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + PracticeSchedule_Id *uint `json:"practiceSchedule_id"` + PracticeSchedule *eps.PracticeSchedule `json:"practiceSchedule,omitempty"` + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty"` + Person_ResidentIdentityNumber string `json:"person_residentIdentityNumber"` + Person_Name string `json:"person_name"` + Person_PhoneNumber string `json:"person_phoneNumber"` + PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code"` + RefNumber string `json:"refNumber"` +} + +func (d Appointment) ToResponse() ResponseDto { + resp := ResponseDto{ + PracticeSchedule_Id: d.PracticeSchedule_Id, + PracticeSchedule: d.PracticeSchedule, + Patient_Id: d.Patient_Id, + Patient: d.Patient, + Person_ResidentIdentityNumber: d.Person_ResidentIdentityNumber, + Person_Name: d.Person_Name, + Person_PhoneNumber: d.Person_PhoneNumber, + PaymentMethod_Code: d.PaymentMethod_Code, + RefNumber: d.RefNumber, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Appointment) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/appointment/entity.go b/internal/domain/main-entities/appointment/entity.go new file mode 100644 index 00000000..fada15ac --- /dev/null +++ b/internal/domain/main-entities/appointment/entity.go @@ -0,0 +1,21 @@ +package appointment + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ep "simrs-vx/internal/domain/main-entities/patient" + eps "simrs-vx/internal/domain/main-entities/practice-schedule" + erc "simrs-vx/internal/domain/references/common" +) + +type Appointment struct { + ecore.Main // adjust this according to the needs + PracticeSchedule_Id *uint `json:"practiceSchedule_id"` + PracticeSchedule *eps.PracticeSchedule `json:"practiceSchedule,omitempty" gorm:"foreignKey:PracticeSchedule_Id;references:Id"` + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty" gorm:"foreignKey:Patient_Id;references:Id"` + Person_ResidentIdentityNumber string `json:"person_residentIdentityNumber" gorm:"size:16"` + Person_Name string `json:"person_name" gorm:"size:100"` + Person_PhoneNumber string `json:"person_phoneNumber" gorm:"size:30"` + PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` + RefNumber string `json:"refNumber" gorm:"size:20"` +} diff --git a/internal/domain/main-entities/emergency/dto.go b/internal/domain/main-entities/emergency/dto.go new file mode 100644 index 00000000..6f8d658b --- /dev/null +++ b/internal/domain/main-entities/emergency/dto.go @@ -0,0 +1,61 @@ +package emergency + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + ere "simrs-vx/internal/domain/references/encounter" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Class_Code ere.EmergencyClassCode `json:"class_code" validate:"maxLength=10"` +} + +type ReadListDto struct { + Encounter_Id *uint `json:"encounter_id"` + Class_Code ere.EmergencyClassCode `json:"class_code"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Class_Code ere.EmergencyClassCode `json:"class_code"` +} + +func (d Emergency) ToResponse() ResponseDto { + resp := ResponseDto{} + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Emergency) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/emergency/entity.go b/internal/domain/main-entities/emergency/entity.go new file mode 100644 index 00000000..1e6fb078 --- /dev/null +++ b/internal/domain/main-entities/emergency/entity.go @@ -0,0 +1,15 @@ +package emergency + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + + ere "simrs-vx/internal/domain/references/encounter" +) + +type Emergency struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Class_Code ere.EmergencyClassCode `json:"class_code" gorm:"size:10"` +} diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 49a3b987..d128ac51 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -2,6 +2,7 @@ package encounter import ( ecore "simrs-vx/internal/domain/base-entities/core" + ea "simrs-vx/internal/domain/main-entities/appointment" ed "simrs-vx/internal/domain/main-entities/doctor" ep "simrs-vx/internal/domain/main-entities/patient" es "simrs-vx/internal/domain/main-entities/specialist" @@ -12,18 +13,23 @@ import ( ) type CreateDto struct { - Patient_Id *uint `json:"patient_id"` - Patient *ep.Patient `json:"patient,omitempty"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` - Unit_Id *uint `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - VisitDate time.Time `json:"visitDate"` - Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` - RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` + Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + VisitDate time.Time `json:"visitDate"` + Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` + RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` + Appointment_Id *uint `json:"appointment_id"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` } type ReadListDto struct { @@ -33,18 +39,23 @@ type ReadListDto struct { } type FilterDto struct { - Patient_Id *uint `json:"patient_id"` - Patient *ep.Patient `json:"patient,omitempty"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` - Unit_Id *uint `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - VisitDate time.Time `json:"visitDate"` - Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` - RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` + Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + VisitDate time.Time `json:"visitDate"` + Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` + RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` + Appointment_Id *uint `json:"appointment_id"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -52,10 +63,7 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + Id uint16 `json:"id"` } type UpdateDto struct { @@ -75,44 +83,56 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Patient_Id *uint `json:"patient_id"` - Patient *ep.Patient `json:"patient,omitempty"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code"` - Unit_Id *uint `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Specialist *es.Specialist `json:"specialist,omitempty"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` - Unit *eu.Unit `json:"unit,omitempty"` - VisitDate time.Time `json:"visitDate"` - Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` - Assignment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty"` - DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code` - RefSource_Name *string `json:"refSource_name"` + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code"` + Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` + Unit *eu.Unit `json:"unit,omitempty"` + VisitDate time.Time `json:"visitDate"` + Appointment_Doctor_Id *uint `json:"assignment_doctor_id"` + Appointment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty"` + DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code"` + RefSource_Name *string `json:"refSource_name"` + Appointment_Id *uint `json:"appointment_id"` + Appointment *ea.Appointment `json:"appointment,omitempty"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` } func (d Encounter) ToResponse() ResponseDto { resp := ResponseDto{ - Patient_Id: d.Patient_Id, - Patient: d.Patient, - RegisteredAt: d.RegisteredAt, - Class_Code: d.Class_Code, - Unit_Id: d.Unit_Id, - Unit: d.Unit, - Specialist_Id: d.Specialist_Id, - Specialist: d.Specialist, - Subspecialist_Id: d.Subspecialist_Id, - Subspecialist: d.Subspecialist, - VisitDate: d.VisitDate, - Assignment_Doctor_Id: d.Assignment_Doctor_Id, - Assignment_Doctor: d.Assignment_Doctor, - Responsible_Doctor_Id: d.Responsible_Doctor_Id, - Responsible_Doctor: d.Responsible_Doctor, - DischardeMethod_Code: d.DischardeMethod_Code, - RefSource_Name: d.RefSource_Name, + Patient_Id: d.Patient_Id, + Patient: d.Patient, + RegisteredAt: d.RegisteredAt, + Class_Code: d.Class_Code, + Unit_Id: d.Unit_Id, + Unit: d.Unit, + Specialist_Id: d.Specialist_Id, + Specialist: d.Specialist, + Subspecialist_Id: d.Subspecialist_Id, + Subspecialist: d.Subspecialist, + VisitDate: d.VisitDate, + Appointment_Doctor_Id: d.Appointment_Doctor_Id, + Appointment_Doctor: d.Appointment_Doctor, + Responsible_Doctor_Id: d.Responsible_Doctor_Id, + Responsible_Doctor: d.Responsible_Doctor, + DischardeMethod_Code: d.DischardeMethod_Code, + RefSource_Name: d.RefSource_Name, + Appointment_Id: d.Appointment_Id, + Appointment: d.Appointment, + EarlyEducation: d.EarlyEducation, + MedicalDischargeEducation: d.MedicalDischargeEducation, + AdmDischargeEducation: d.AdmDischargeEducation, + DischargeReason: d.DischargeReason, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 95d2cac7..91df9883 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -2,6 +2,7 @@ package encounter import ( ecore "simrs-vx/internal/domain/base-entities/core" + ea "simrs-vx/internal/domain/main-entities/appointment" ed "simrs-vx/internal/domain/main-entities/doctor" ep "simrs-vx/internal/domain/main-entities/patient" es "simrs-vx/internal/domain/main-entities/specialist" @@ -12,22 +13,28 @@ import ( ) type Encounter struct { - ecore.Main // adjust this according to the needs - Patient_Id *uint `json:"patient_id"` - Patient *ep.Patient `json:"patient,omitempty" gorm:"foreignKey:Patient_Id;references:Id"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code" gorm:"not null;size:10"` - Unit_Id *uint `json:"unit_id"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` - Specialist_Id *uint16 `json:"specialist_id"` - Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id;references:Id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id;references:Id"` - VisitDate time.Time `json:"visitDate"` - Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` - Assignment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty" gorm:"foreignKey:Assignment_Doctor_Id;references:Id"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty" gorm:"foreignKey:Responsible_Doctor_Id;references:Id"` - DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" gorm:"size:10"` - RefSource_Name *string `json:"refSource_name" gorm:"size:100"` + ecore.Main // adjust this according to the needs + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty" gorm:"foreignKey:Patient_Id;references:Id"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code" gorm:"not null;size:10"` + Unit_Id *uint `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id;references:Id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id;references:Id"` + VisitDate time.Time `json:"visitDate"` + Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` + Appointment_Doctor *ed.Doctor `json:"appointment_doctor,omitempty" gorm:"foreignKey:Appointment_Doctor_Id;references:Id"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty" gorm:"foreignKey:Responsible_Doctor_Id;references:Id"` + DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" gorm:"size:10"` + RefSource_Name *string `json:"refSource_name" gorm:"size:100"` + Appointment_Id *uint `json:"appointment_id"` + Appointment *ea.Appointment `json:"appointment,omitempty" gorm:"foreignKey:Appointment_Id;references:Id"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` } diff --git a/internal/domain/main-entities/inpatient/dto.go b/internal/domain/main-entities/inpatient/dto.go new file mode 100644 index 00000000..ec3bc229 --- /dev/null +++ b/internal/domain/main-entities/inpatient/dto.go @@ -0,0 +1,72 @@ +package inpatient + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + ei "simrs-vx/internal/domain/main-entities/infra" + ere "simrs-vx/internal/domain/references/encounter" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Class_Code ere.InpatientClassCode `json:"class_code" validate:"maxLength=10"` + Infra_Id *uint16 `json:"infra_id"` +} + +type ReadListDto struct { + Encounter_Id *uint `json:"encounter_id"` + Class_Code ere.InpatientClassCode `json:"class_code"` + Infra_Id *uint16 `json:"infra_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Class_Code ere.InpatientClassCode `json:"class_code"` + Infra_Id *uint16 `json:"infra_id"` + Infra *ei.Infra `json:"infra,omitempty"` +} + +func (d Inpatient) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Class_Code: d.Class_Code, + Infra_Id: d.Infra_Id, + Infra: d.Infra, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Inpatient) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/inpatient/entity.go b/internal/domain/main-entities/inpatient/entity.go new file mode 100644 index 00000000..328f5d12 --- /dev/null +++ b/internal/domain/main-entities/inpatient/entity.go @@ -0,0 +1,18 @@ +package inpatient + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + ei "simrs-vx/internal/domain/main-entities/infra" + + ere "simrs-vx/internal/domain/references/encounter" +) + +type Inpatient struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Class_Code ere.InpatientClassCode `json:"class_code" gorm:"size:10"` + Infra_Id *uint16 `json:"infra_id"` + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id;references:Id"` +} diff --git a/internal/domain/main-entities/sbar/dto.go b/internal/domain/main-entities/sbar/dto.go new file mode 100644 index 00000000..3030b6d6 --- /dev/null +++ b/internal/domain/main-entities/sbar/dto.go @@ -0,0 +1,76 @@ +package sbar + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eem "simrs-vx/internal/domain/main-entities/employee" + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Employee_Id *uint `json:"employee_id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} + +type ReadListDto struct { + Encounter_Id *uint `json:"encounter_id"` + Employee_Id *uint `json:"employee_id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Employee_Id *uint `json:"employee_id"` + Employee *eem.Employee `json:"employee,omitempty"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} + +func (d Sbar) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Employee_Id: d.Employee_Id, + Employee: d.Employee, + Time: d.Time, + Value: d.Value, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Sbar) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/sbar/entity.go b/internal/domain/main-entities/sbar/entity.go new file mode 100644 index 00000000..62303f05 --- /dev/null +++ b/internal/domain/main-entities/sbar/entity.go @@ -0,0 +1,18 @@ +package sbar + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eem "simrs-vx/internal/domain/main-entities/employee" + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" +) + +type Sbar struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Employee_Id *uint `json:"employee_id"` + Employee *eem.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} diff --git a/internal/domain/main-entities/soapi/dto.go b/internal/domain/main-entities/soapi/dto.go new file mode 100644 index 00000000..3e160cb2 --- /dev/null +++ b/internal/domain/main-entities/soapi/dto.go @@ -0,0 +1,76 @@ +package soapi + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eem "simrs-vx/internal/domain/main-entities/employee" + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Employee_Id *uint `json:"employee_id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} + +type ReadListDto struct { + Encounter_Id *uint `json:"encounter_id"` + Employee_Id *uint `json:"employee_id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Employee_Id *uint `json:"employee_id"` + Employee *eem.Employee `json:"employee,omitempty"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} + +func (d Soapi) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Employee_Id: d.Employee_Id, + Employee: d.Employee, + Time: d.Time, + Value: d.Value, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Soapi) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/soapi/entity.go b/internal/domain/main-entities/soapi/entity.go new file mode 100644 index 00000000..f6c6b5e9 --- /dev/null +++ b/internal/domain/main-entities/soapi/entity.go @@ -0,0 +1,18 @@ +package soapi + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eem "simrs-vx/internal/domain/main-entities/employee" + ee "simrs-vx/internal/domain/main-entities/encounter" + "time" +) + +type Soapi struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Employee_Id *uint `json:"employee_id"` + Employee *eem.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + Time *time.Time `json:"time"` + Value *string `json:"value"` +} diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index 3998811b..e5c85682 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -1,9 +1,11 @@ +// Package clinical mostly about SOAPI package clinical type ( SubjectCode string ObjectCode string AssessmentCode string + PlanCode string InstructionCode string ) @@ -31,6 +33,8 @@ const ( ACLateDiag AssessmentCode = "late-diag" // Diagnosis Akhir ACSecDiag AssessmentCode = "sec-diag" // Diagnosis Sekunder + PCPlan PlanCode = "plan" // Rencana + ICDetail InstructionCode = "detail" // Detail instruksi ICMedAct InstructionCode = "med-act" // Tindakan medis ICMedication InstructionCode = "medication" // Obat diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 00b01236..68585f9e 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -9,17 +9,14 @@ type ( EmergencyClassCode string OutpatientClassCode string CheckupScopeCode string + AmbulatoryClassCode string + InpatientClassCode string ) const ( - ECOutpatient EncounterClassCode = "outpatient" ECAmbulatory EncounterClassCode = "ambulatory" ECEmergency EncounterClassCode = "emergency" ECInpatient EncounterClassCode = "inpatient" - ECDraft EncounterClassCode = "draft" - ECDone EncounterClassCode = "done" - ECCancel EncounterClassCode = "cancel" - ECSkip EncounterClassCode = "skip" QSCWait QueueStatusCode = "wait" // Tunggu QSCProc QueueStatusCode = "proc" // Proses @@ -27,8 +24,13 @@ const ( QSCCancel QueueStatusCode = "cancel" // Dibatalkan QSCSkip QueueStatusCode = "skip" // Dilewati - DMCHome DischargeMethodCode = "home" // Rumah - DMCHomeReq DischargeMethodCode = "home-request" // Rumah (Dibutuhkan) + DMCHome DischargeMethodCode = "home" // Rumah + DMCHomeReq DischargeMethodCode = "home-request" // Rumah (Dibutuhkan) + DMCConsulation DischargeMethodCode = "consulation" // Konsultasi Lanjutan + DMCInpatient DischargeMethodCode = "inpatient" // Inpatient + DMCExtRef DischargeMethodCode = "external-ref" // Rujuk Eksternal + DMCIntRef DischargeMethodCode = "internal-ref" // Rujuk Internal + DMCDeath DischargeMethodCode = "death" // Meninggal TCAmbulance TransportationCode = "ambulance" TCCar TransportationCode = "car" @@ -55,11 +57,18 @@ const ( CSCPLab CheckupScopeCode = "pa-lab" // Patology Anatomy Laboratorium CSCRad CheckupScopeCode = "radiology" // Radiology + ACCReg AmbulatoryClassCode = "reg" // Regular + ACCRme AmbulatoryClassCode = "rme" // Rehab Medik + + ICCIp InpatientClassCode = "ip" // Regular Rawat Inap + ICCICU InpatientClassCode = "icu" // ICU + ICCHCU InpatientClassCode = "hcu" // HCU + ICCVK InpatientClassCode = "vk" // Verlos kamer ) func (ec EncounterClassCode) Code() string { switch ec { - case ECAmbulatory, ECOutpatient: + case ECAmbulatory: return "AMB" case ECInpatient: return "IMP" diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go index ee3cf1fc..990ca134 100644 --- a/internal/interface/migration/migration.go +++ b/internal/interface/migration/migration.go @@ -5,6 +5,9 @@ import ( "io" "os" "os/exec" + adime "simrs-vx/internal/domain/main-entities/adime" + ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" + appointment "simrs-vx/internal/domain/main-entities/appointment" counter "simrs-vx/internal/domain/main-entities/counter" device "simrs-vx/internal/domain/main-entities/device" diagnosesrc "simrs-vx/internal/domain/main-entities/diagnose-src" @@ -13,10 +16,12 @@ import ( divisionposition "simrs-vx/internal/domain/main-entities/division-position" doctor "simrs-vx/internal/domain/main-entities/doctor" doctorfee "simrs-vx/internal/domain/main-entities/doctor-fee" + emergency "simrs-vx/internal/domain/main-entities/emergency" employee "simrs-vx/internal/domain/main-entities/employee" encounter "simrs-vx/internal/domain/main-entities/encounter" ethnic "simrs-vx/internal/domain/main-entities/ethnic" infra "simrs-vx/internal/domain/main-entities/infra" + inpatient "simrs-vx/internal/domain/main-entities/inpatient" installation "simrs-vx/internal/domain/main-entities/installation" insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" item "simrs-vx/internal/domain/main-entities/item" @@ -47,6 +52,8 @@ import ( province "simrs-vx/internal/domain/main-entities/province" regency "simrs-vx/internal/domain/main-entities/regency" room "simrs-vx/internal/domain/main-entities/room" + sbar "simrs-vx/internal/domain/main-entities/sbar" + soapi "simrs-vx/internal/domain/main-entities/soapi" specialist "simrs-vx/internal/domain/main-entities/specialist" specialistintern "simrs-vx/internal/domain/main-entities/specialist-intern" subspecialist "simrs-vx/internal/domain/main-entities/subspecialist" @@ -131,12 +138,19 @@ func GetEntities() []any { &language.Language{}, &personrelative.PersonRelative{}, &patient.Patient{}, + &appointment.Appointment{}, &encounter.Encounter{}, &laborant.Laborant{}, &specialist.Specialist{}, &subspecialist.Subspecialist{}, &specialistintern.SpecialistIntern{}, &room.Room{}, + &soapi.Soapi{}, + &sbar.Sbar{}, + &adime.Adime{}, + &emergency.Emergency{}, + &inpatient.Inpatient{}, + &ambulatory.Ambulatory{}, } } From 255484c52078e5a66e41fc99445487da3824f8a4 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 8 Sep 2025 14:08:25 +0700 Subject: [PATCH 009/190] wip --- .../domain/main-entities/ambulatory/dto.go | 6 + .../domain/main-entities/emergency/dto.go | 6 + .../domain/main-entities/encounter/dto.go | 4 +- .../domain/main-entities/inpatient/dto.go | 6 + .../use-case/main-use-case/ambulatory/case.go | 278 ++++++++++++++++++ .../main-use-case/ambulatory/helper.go | 22 ++ .../use-case/main-use-case/ambulatory/lib.go | 155 ++++++++++ .../ambulatory/middleware-runner.go | 103 +++++++ .../main-use-case/ambulatory/middleware.go | 9 + .../main-use-case/ambulatory/tycovar.go | 44 +++ .../use-case/main-use-case/emergency/case.go | 278 ++++++++++++++++++ .../main-use-case/emergency/helper.go | 22 ++ .../use-case/main-use-case/emergency/lib.go | 155 ++++++++++ .../emergency/middleware-runner.go | 103 +++++++ .../main-use-case/emergency/middleware.go | 9 + .../main-use-case/emergency/tycovar.go | 44 +++ .../use-case/main-use-case/encounter/case.go | 278 ++++++++++++++++++ .../main-use-case/encounter/helper.go | 35 +++ .../use-case/main-use-case/encounter/lib.go | 155 ++++++++++ .../encounter/middleware-runner.go | 103 +++++++ .../main-use-case/encounter/middleware.go | 9 + .../main-use-case/encounter/tycovar.go | 44 +++ .../use-case/main-use-case/inpatient/case.go | 278 ++++++++++++++++++ .../main-use-case/inpatient/helper.go | 22 ++ .../use-case/main-use-case/inpatient/lib.go | 155 ++++++++++ .../inpatient/middleware-runner.go | 103 +++++++ .../main-use-case/inpatient/middleware.go | 9 + .../main-use-case/inpatient/tycovar.go | 44 +++ 28 files changed, 2477 insertions(+), 2 deletions(-) create mode 100644 internal/use-case/main-use-case/ambulatory/case.go create mode 100644 internal/use-case/main-use-case/ambulatory/helper.go create mode 100644 internal/use-case/main-use-case/ambulatory/lib.go create mode 100644 internal/use-case/main-use-case/ambulatory/middleware-runner.go create mode 100644 internal/use-case/main-use-case/ambulatory/middleware.go create mode 100644 internal/use-case/main-use-case/ambulatory/tycovar.go create mode 100644 internal/use-case/main-use-case/emergency/case.go create mode 100644 internal/use-case/main-use-case/emergency/helper.go create mode 100644 internal/use-case/main-use-case/emergency/lib.go create mode 100644 internal/use-case/main-use-case/emergency/middleware-runner.go create mode 100644 internal/use-case/main-use-case/emergency/middleware.go create mode 100644 internal/use-case/main-use-case/emergency/tycovar.go create mode 100644 internal/use-case/main-use-case/encounter/case.go create mode 100644 internal/use-case/main-use-case/encounter/helper.go create mode 100644 internal/use-case/main-use-case/encounter/lib.go create mode 100644 internal/use-case/main-use-case/encounter/middleware-runner.go create mode 100644 internal/use-case/main-use-case/encounter/middleware.go create mode 100644 internal/use-case/main-use-case/encounter/tycovar.go create mode 100644 internal/use-case/main-use-case/inpatient/case.go create mode 100644 internal/use-case/main-use-case/inpatient/helper.go create mode 100644 internal/use-case/main-use-case/inpatient/lib.go create mode 100644 internal/use-case/main-use-case/inpatient/middleware-runner.go create mode 100644 internal/use-case/main-use-case/inpatient/middleware.go create mode 100644 internal/use-case/main-use-case/inpatient/tycovar.go diff --git a/internal/domain/main-entities/ambulatory/dto.go b/internal/domain/main-entities/ambulatory/dto.go index cc1eebdd..68147819 100644 --- a/internal/domain/main-entities/ambulatory/dto.go +++ b/internal/domain/main-entities/ambulatory/dto.go @@ -12,6 +12,12 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Class_Code ere.AmbulatoryClassCode `json:"class_code"` diff --git a/internal/domain/main-entities/emergency/dto.go b/internal/domain/main-entities/emergency/dto.go index 6f8d658b..b98096f2 100644 --- a/internal/domain/main-entities/emergency/dto.go +++ b/internal/domain/main-entities/emergency/dto.go @@ -12,6 +12,12 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Class_Code ere.EmergencyClassCode `json:"class_code"` diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index d128ac51..98c1649b 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -21,7 +21,7 @@ type CreateDto struct { Specialist_Id *uint16 `json:"specialist_id"` Subspecialist_Id *uint16 `json:"subspecialist_id"` VisitDate time.Time `json:"visitDate"` - Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` + Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` @@ -47,7 +47,7 @@ type FilterDto struct { Specialist_Id *uint16 `json:"specialist_id"` Subspecialist_Id *uint16 `json:"subspecialist_id"` VisitDate time.Time `json:"visitDate"` - Assignment_Doctor_Id *uint `json:"assignment_doctor_id"` + Appoinment_Doctor_Id *uint `json:"appointment_doctor_id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` diff --git a/internal/domain/main-entities/inpatient/dto.go b/internal/domain/main-entities/inpatient/dto.go index ec3bc229..acf1442a 100644 --- a/internal/domain/main-entities/inpatient/dto.go +++ b/internal/domain/main-entities/inpatient/dto.go @@ -14,6 +14,12 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Class_Code ere.InpatientClassCode `json:"class_code"` Infra_Id *uint16 `json:"infra_id"` diff --git a/internal/use-case/main-use-case/ambulatory/case.go b/internal/use-case/main-use-case/ambulatory/case.go new file mode 100644 index 00000000..14f6b2e5 --- /dev/null +++ b/internal/use-case/main-use-case/ambulatory/case.go @@ -0,0 +1,278 @@ +package ambulatory + +import ( + e "simrs-vx/internal/domain/main-entities/ambulatory" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "ambulatory" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Ambulatory{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Ambulatory + var dataList []e.Ambulatory + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Ambulatory + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Ambulatory + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Ambulatory + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/ambulatory/helper.go b/internal/use-case/main-use-case/ambulatory/helper.go new file mode 100644 index 00000000..497f0a0b --- /dev/null +++ b/internal/use-case/main-use-case/ambulatory/helper.go @@ -0,0 +1,22 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package ambulatory + +import ( + e "simrs-vx/internal/domain/main-entities/ambulatory" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Ambulatory) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Class_Code = inputSrc.Class_Code +} diff --git a/internal/use-case/main-use-case/ambulatory/lib.go b/internal/use-case/main-use-case/ambulatory/lib.go new file mode 100644 index 00000000..178bc53a --- /dev/null +++ b/internal/use-case/main-use-case/ambulatory/lib.go @@ -0,0 +1,155 @@ +package ambulatory + +import ( + e "simrs-vx/internal/domain/main-entities/ambulatory" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Ambulatory, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Ambulatory{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ambulatory, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Ambulatory{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Ambulatory{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Ambulatory, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Ambulatory{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Ambulatory, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Ambulatory, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/ambulatory/middleware-runner.go b/internal/use-case/main-use-case/ambulatory/middleware-runner.go new file mode 100644 index 00000000..292e6602 --- /dev/null +++ b/internal/use-case/main-use-case/ambulatory/middleware-runner.go @@ -0,0 +1,103 @@ +package ambulatory + +import ( + e "simrs-vx/internal/domain/main-entities/ambulatory" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Ambulatory) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Ambulatory) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Ambulatory) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Ambulatory) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Ambulatory) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/ambulatory/middleware.go b/internal/use-case/main-use-case/ambulatory/middleware.go new file mode 100644 index 00000000..4bb381e4 --- /dev/null +++ b/internal/use-case/main-use-case/ambulatory/middleware.go @@ -0,0 +1,9 @@ +package ambulatory + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/ambulatory/tycovar.go b/internal/use-case/main-use-case/ambulatory/tycovar.go new file mode 100644 index 00000000..81239c8d --- /dev/null +++ b/internal/use-case/main-use-case/ambulatory/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package ambulatory + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/ambulatory" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Ambulatory, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Ambulatory, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Ambulatory, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/emergency/case.go b/internal/use-case/main-use-case/emergency/case.go new file mode 100644 index 00000000..a21cc02c --- /dev/null +++ b/internal/use-case/main-use-case/emergency/case.go @@ -0,0 +1,278 @@ +package emergency + +import ( + e "simrs-vx/internal/domain/main-entities/emergency" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "emergency" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Emergency{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Emergency + var dataList []e.Emergency + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Emergency + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Emergency + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Emergency + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/emergency/helper.go b/internal/use-case/main-use-case/emergency/helper.go new file mode 100644 index 00000000..b3564c4e --- /dev/null +++ b/internal/use-case/main-use-case/emergency/helper.go @@ -0,0 +1,22 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package emergency + +import ( + e "simrs-vx/internal/domain/main-entities/emergency" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Emergency) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Class_Code = inputSrc.Class_Code +} diff --git a/internal/use-case/main-use-case/emergency/lib.go b/internal/use-case/main-use-case/emergency/lib.go new file mode 100644 index 00000000..8657d96e --- /dev/null +++ b/internal/use-case/main-use-case/emergency/lib.go @@ -0,0 +1,155 @@ +package emergency + +import ( + e "simrs-vx/internal/domain/main-entities/emergency" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Emergency, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Emergency{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Emergency, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Emergency{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Emergency{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Emergency, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Emergency{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Emergency, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Emergency, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/emergency/middleware-runner.go b/internal/use-case/main-use-case/emergency/middleware-runner.go new file mode 100644 index 00000000..121d1b79 --- /dev/null +++ b/internal/use-case/main-use-case/emergency/middleware-runner.go @@ -0,0 +1,103 @@ +package emergency + +import ( + e "simrs-vx/internal/domain/main-entities/emergency" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Emergency) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Emergency) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Emergency) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Emergency) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Emergency) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/emergency/middleware.go b/internal/use-case/main-use-case/emergency/middleware.go new file mode 100644 index 00000000..3ad52516 --- /dev/null +++ b/internal/use-case/main-use-case/emergency/middleware.go @@ -0,0 +1,9 @@ +package emergency + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/emergency/tycovar.go b/internal/use-case/main-use-case/emergency/tycovar.go new file mode 100644 index 00000000..e057fa29 --- /dev/null +++ b/internal/use-case/main-use-case/emergency/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package emergency + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/emergency" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Emergency, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Emergency, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Emergency, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go new file mode 100644 index 00000000..2105b1d6 --- /dev/null +++ b/internal/use-case/main-use-case/encounter/case.go @@ -0,0 +1,278 @@ +package encounter + +import ( + e "simrs-vx/internal/domain/main-entities/encounter" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "encounter" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Encounter{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Encounter + var dataList []e.Encounter + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Encounter + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Encounter + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Encounter + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go new file mode 100644 index 00000000..a6911637 --- /dev/null +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -0,0 +1,35 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package encounter + +import ( + e "simrs-vx/internal/domain/main-entities/encounter" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Patient_Id = inputSrc.Patient_Id + data.Class_Code = inputSrc.Class_Code + data.Unit_Id = inputSrc.Unit_Id + data.Specialist_Id = inputSrc.Specialist_Id + data.Subspecialist_Id = inputSrc.Subspecialist_Id + data.VisitDate = inputSrc.VisitDate + data.Appointment_Doctor_Id = inputSrc.Appointment_Doctor_Id + data.Responsible_Doctor_Id = inputSrc.Responsible_Doctor_Id + data.DischardeMethod_Code = inputSrc.DischardeMethod_Code + data.RefSource_Name = inputSrc.RefSource_Name + data.Appointment_Id = inputSrc.Appointment_Id + data.EarlyEducation = inputSrc.EarlyEducation + data.MedicalDischargeEducation = inputSrc.MedicalDischargeEducation + data.AdmDischargeEducation = inputSrc.AdmDischargeEducation + data.DischargeReason = inputSrc.DischargeReason +} diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go new file mode 100644 index 00000000..db1064c1 --- /dev/null +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -0,0 +1,155 @@ +package encounter + +import ( + e "simrs-vx/internal/domain/main-entities/encounter" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Encounter, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Encounter{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Encounter, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Encounter{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Encounter{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Encounter, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Encounter{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/encounter/middleware-runner.go b/internal/use-case/main-use-case/encounter/middleware-runner.go new file mode 100644 index 00000000..1448a7af --- /dev/null +++ b/internal/use-case/main-use-case/encounter/middleware-runner.go @@ -0,0 +1,103 @@ +package encounter + +import ( + e "simrs-vx/internal/domain/main-entities/encounter" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Encounter) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Encounter) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Encounter) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Encounter) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Encounter) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/encounter/middleware.go b/internal/use-case/main-use-case/encounter/middleware.go new file mode 100644 index 00000000..8a047d33 --- /dev/null +++ b/internal/use-case/main-use-case/encounter/middleware.go @@ -0,0 +1,9 @@ +package encounter + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/encounter/tycovar.go b/internal/use-case/main-use-case/encounter/tycovar.go new file mode 100644 index 00000000..17890a1b --- /dev/null +++ b/internal/use-case/main-use-case/encounter/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package encounter + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/encounter" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Encounter, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Encounter, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Encounter, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/inpatient/case.go b/internal/use-case/main-use-case/inpatient/case.go new file mode 100644 index 00000000..9c6aa963 --- /dev/null +++ b/internal/use-case/main-use-case/inpatient/case.go @@ -0,0 +1,278 @@ +package inpatient + +import ( + e "simrs-vx/internal/domain/main-entities/inpatient" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "ambulatory" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Inpatient{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Inpatient + var dataList []e.Inpatient + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Inpatient + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Inpatient + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Inpatient + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/inpatient/helper.go b/internal/use-case/main-use-case/inpatient/helper.go new file mode 100644 index 00000000..75f38c7e --- /dev/null +++ b/internal/use-case/main-use-case/inpatient/helper.go @@ -0,0 +1,22 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package inpatient + +import ( + e "simrs-vx/internal/domain/main-entities/inpatient" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Inpatient) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Class_Code = inputSrc.Class_Code +} diff --git a/internal/use-case/main-use-case/inpatient/lib.go b/internal/use-case/main-use-case/inpatient/lib.go new file mode 100644 index 00000000..134cc34a --- /dev/null +++ b/internal/use-case/main-use-case/inpatient/lib.go @@ -0,0 +1,155 @@ +package inpatient + +import ( + e "simrs-vx/internal/domain/main-entities/inpatient" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Inpatient, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Inpatient{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Inpatient, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Inpatient{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Inpatient{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Inpatient, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Inpatient{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Inpatient, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Inpatient, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/inpatient/middleware-runner.go b/internal/use-case/main-use-case/inpatient/middleware-runner.go new file mode 100644 index 00000000..5f771f5a --- /dev/null +++ b/internal/use-case/main-use-case/inpatient/middleware-runner.go @@ -0,0 +1,103 @@ +package inpatient + +import ( + e "simrs-vx/internal/domain/main-entities/inpatient" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Inpatient) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Inpatient) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Inpatient) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Inpatient) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Inpatient) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/inpatient/middleware.go b/internal/use-case/main-use-case/inpatient/middleware.go new file mode 100644 index 00000000..017be42d --- /dev/null +++ b/internal/use-case/main-use-case/inpatient/middleware.go @@ -0,0 +1,9 @@ +package inpatient + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/inpatient/tycovar.go b/internal/use-case/main-use-case/inpatient/tycovar.go new file mode 100644 index 00000000..209477ff --- /dev/null +++ b/internal/use-case/main-use-case/inpatient/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package inpatient + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/inpatient" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Inpatient, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Inpatient, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Inpatient, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From 191ad1b969bbf7eb5b21d3230cd9acb07e7f0eac Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 8 Sep 2025 14:09:27 +0700 Subject: [PATCH 010/190] feat (encounter): discharge method nullable --- .../domain/main-entities/encounter/dto.go | 46 +++++++++--------- .../domain/main-entities/encounter/entity.go | 48 +++++++++---------- 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index d128ac51..fa359ee1 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -83,29 +83,29 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Patient_Id *uint `json:"patient_id"` - Patient *ep.Patient `json:"patient,omitempty"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code"` - Unit_Id *uint `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Specialist *es.Specialist `json:"specialist,omitempty"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` - Unit *eu.Unit `json:"unit,omitempty"` - VisitDate time.Time `json:"visitDate"` - Appointment_Doctor_Id *uint `json:"assignment_doctor_id"` - Appointment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty"` - DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code"` - RefSource_Name *string `json:"refSource_name"` - Appointment_Id *uint `json:"appointment_id"` - Appointment *ea.Appointment `json:"appointment,omitempty"` - EarlyEducation *string `json:"earlyEducation"` - MedicalDischargeEducation *string `json:"medicalDischargeEducation"` - AdmDischargeEducation *string `json:"admDischargeEducation"` - DischargeReason *string `json:"dischargeReason"` + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code"` + Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` + Unit *eu.Unit `json:"unit,omitempty"` + VisitDate time.Time `json:"visitDate"` + Appointment_Doctor_Id *uint `json:"assignment_doctor_id"` + Appointment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty"` + DischardeMethod_Code *ere.DischargeMethodCode `json:"dischardeMethod_code"` + RefSource_Name *string `json:"refSource_name"` + Appointment_Id *uint `json:"appointment_id"` + Appointment *ea.Appointment `json:"appointment,omitempty"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` } func (d Encounter) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 91df9883..3a6ce0e3 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -13,28 +13,28 @@ import ( ) type Encounter struct { - ecore.Main // adjust this according to the needs - Patient_Id *uint `json:"patient_id"` - Patient *ep.Patient `json:"patient,omitempty" gorm:"foreignKey:Patient_Id;references:Id"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code" gorm:"not null;size:10"` - Unit_Id *uint `json:"unit_id"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` - Specialist_Id *uint16 `json:"specialist_id"` - Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id;references:Id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id;references:Id"` - VisitDate time.Time `json:"visitDate"` - Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` - Appointment_Doctor *ed.Doctor `json:"appointment_doctor,omitempty" gorm:"foreignKey:Appointment_Doctor_Id;references:Id"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty" gorm:"foreignKey:Responsible_Doctor_Id;references:Id"` - DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" gorm:"size:10"` - RefSource_Name *string `json:"refSource_name" gorm:"size:100"` - Appointment_Id *uint `json:"appointment_id"` - Appointment *ea.Appointment `json:"appointment,omitempty" gorm:"foreignKey:Appointment_Id;references:Id"` - EarlyEducation *string `json:"earlyEducation"` - MedicalDischargeEducation *string `json:"medicalDischargeEducation"` - AdmDischargeEducation *string `json:"admDischargeEducation"` - DischargeReason *string `json:"dischargeReason"` + ecore.Main // adjust this according to the needs + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty" gorm:"foreignKey:Patient_Id;references:Id"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code" gorm:"not null;size:10"` + Unit_Id *uint `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id;references:Id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id;references:Id"` + VisitDate time.Time `json:"visitDate"` + Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` + Appointment_Doctor *ed.Doctor `json:"appointment_doctor,omitempty" gorm:"foreignKey:Appointment_Doctor_Id;references:Id"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty" gorm:"foreignKey:Responsible_Doctor_Id;references:Id"` + DischardeMethod_Code *ere.DischargeMethodCode `json:"dischardeMethod_code" gorm:"size:10"` + RefSource_Name *string `json:"refSource_name" gorm:"size:100"` + Appointment_Id *uint `json:"appointment_id"` + Appointment *ea.Appointment `json:"appointment,omitempty" gorm:"foreignKey:Appointment_Id;references:Id"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` } From 1bb7647b6d0bf25539d1c76dda091187ff56ac7a Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 8 Sep 2025 14:33:19 +0700 Subject: [PATCH 011/190] discharge wip --- .../domain/main-entities/encounter/dto.go | 39 ++++++------ .../use-case/main-use-case/encounter/case.go | 61 ++++++++++++++++++- .../main-use-case/encounter/helper.go | 5 -- 3 files changed, 82 insertions(+), 23 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 2ea4116d..ed57971b 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -13,23 +13,20 @@ import ( ) type CreateDto struct { - Patient_Id *uint `json:"patient_id"` - Patient *ep.Patient `json:"patient,omitempty"` - RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` - Unit_Id *uint `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - VisitDate time.Time `json:"visitDate"` - Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` - RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` - Appointment_Id *uint `json:"appointment_id"` - EarlyEducation *string `json:"earlyEducation"` - MedicalDischargeEducation *string `json:"medicalDischargeEducation"` - AdmDischargeEducation *string `json:"admDischargeEducation"` - DischargeReason *string `json:"dischargeReason"` + Patient_Id *uint `json:"patient_id"` + Patient *ep.Patient `json:"patient,omitempty"` + RegisteredAt *time.Time `json:"registeredAt"` + Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` + SubClass_Code *string `json:"subClass_code" validate:"maxLength=10"` // for sub + Infra_Id *uint16 `json:"infra_id"` // for inpatient + Unit_Id *uint `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + VisitDate time.Time `json:"visitDate"` + Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` + Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` + RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` + Appointment_Id *uint `json:"appointment_id"` } type ReadListDto struct { @@ -80,6 +77,14 @@ type MetaDto struct { PageSize int `json:"page_size"` Count int `json:"count"` } +type DischargeDto struct { + Id uint `json:"id"` + DischardeMethod_Code *ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` + EarlyEducation *string `json:"earlyEducation"` + MedicalDischargeEducation *string `json:"medicalDischargeEducation"` + AdmDischargeEducation *string `json:"admDischargeEducation"` + DischargeReason *string `json:"dischargeReason"` +} type ResponseDto struct { ecore.Main diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 2105b1d6..3c8f5fc3 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -1,9 +1,20 @@ package encounter import ( - e "simrs-vx/internal/domain/main-entities/encounter" + "errors" "strconv" + ea "simrs-vx/internal/domain/main-entities/ambulatory" + ee "simrs-vx/internal/domain/main-entities/emergency" + e "simrs-vx/internal/domain/main-entities/encounter" + ei "simrs-vx/internal/domain/main-entities/inpatient" + + ua "simrs-vx/internal/use-case/main-use-case/ambulatory" + ue "simrs-vx/internal/use-case/main-use-case/emergency" + ui "simrs-vx/internal/use-case/main-use-case/inpatient" + + ere "simrs-vx/internal/domain/references/encounter" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -40,6 +51,54 @@ func Create(input e.CreateDto) (*d.Data, error) { data = *resData } + switch input.Class_Code { + case ere.ECAmbulatory: + ambCreate := ea.CreateDto{ + Encounter_Id: &data.Id, + Class_Code: func() ere.AmbulatoryClassCode { + if input.SubClass_Code != nil { + return ere.AmbulatoryClassCode(*input.SubClass_Code) + } + return "" + }(), + } + _, err := ua.CreateData(ambCreate, &event, tx) + if err != nil { + return err + } + case ere.ECEmergency: + emerCreate := ee.CreateDto{ + Encounter_Id: &data.Id, + Class_Code: func() ere.EmergencyClassCode { + if input.SubClass_Code != nil { + return ere.EmergencyClassCode(*input.SubClass_Code) + } + return "" + }(), + } + _, err := ue.CreateData(emerCreate, &event, tx) + if err != nil { + return err + } + case ere.ECInpatient: + inpCreate := ei.CreateDto{ + Encounter_Id: &data.Id, + Class_Code: func() ere.InpatientClassCode { + if input.SubClass_Code != nil { + return ere.InpatientClassCode(*input.SubClass_Code) + } + return "" + }(), + Infra_Id: input.Infra_Id, + } + _, err := ui.CreateData(inpCreate, &event, tx) + if err != nil { + return err + } + default: + return errors.New("invalid encounter class code") + } + mwRunner.setMwType(pu.MWTPost) // Run post-middleware if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index a6911637..5152810f 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -25,11 +25,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { data.VisitDate = inputSrc.VisitDate data.Appointment_Doctor_Id = inputSrc.Appointment_Doctor_Id data.Responsible_Doctor_Id = inputSrc.Responsible_Doctor_Id - data.DischardeMethod_Code = inputSrc.DischardeMethod_Code data.RefSource_Name = inputSrc.RefSource_Name data.Appointment_Id = inputSrc.Appointment_Id - data.EarlyEducation = inputSrc.EarlyEducation - data.MedicalDischargeEducation = inputSrc.MedicalDischargeEducation - data.AdmDischargeEducation = inputSrc.AdmDischargeEducation - data.DischargeReason = inputSrc.DischargeReason } From 6dd7b18de668c79f682fca2f7bb966734ce6b430 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 8 Sep 2025 14:40:03 +0700 Subject: [PATCH 012/190] rename column dischargemethod --- cmd/migration/migrations/20250908073811.sql | 2 ++ cmd/migration/migrations/20250908073839.sql | 2 ++ cmd/migration/migrations/atlas.sum | 12 +++++++----- internal/domain/main-entities/encounter/dto.go | 4 ++-- internal/domain/main-entities/encounter/entity.go | 2 +- 5 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 cmd/migration/migrations/20250908073811.sql create mode 100644 cmd/migration/migrations/20250908073839.sql diff --git a/cmd/migration/migrations/20250908073811.sql b/cmd/migration/migrations/20250908073811.sql new file mode 100644 index 00000000..ead1e965 --- /dev/null +++ b/cmd/migration/migrations/20250908073811.sql @@ -0,0 +1,2 @@ +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" ADD COLUMN "DischargeMethod_Code" character varying(10) NULL; diff --git a/cmd/migration/migrations/20250908073839.sql b/cmd/migration/migrations/20250908073839.sql new file mode 100644 index 00000000..43710589 --- /dev/null +++ b/cmd/migration/migrations/20250908073839.sql @@ -0,0 +1,2 @@ +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" DROP COLUMN "DischardeMethod_Code"; diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index 91349cd8..a10148d8 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,5 +1,7 @@ -h1:qEdw2cOowYcLvkC4fcOTQr2KqQIaZa6YYIgj2CgYbkM= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +h1:RfbV0C/2ANkgOZBCktEsNtRWKc2wWB6mQfjC2ftWhgc= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:UVLw6aJd4hnR1XRab6qew57gj2bqzwyCBP/fDRXbncc= +20250908073839.sql h1:2hBQEuCbIUHi4ybSefQG2ODbROOrlNDz1JwR0ElfFTU= diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index fa359ee1..fdbf9ceb 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -98,7 +98,7 @@ type ResponseDto struct { Appointment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty"` - DischardeMethod_Code *ere.DischargeMethodCode `json:"dischardeMethod_code"` + DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code"` RefSource_Name *string `json:"refSource_name"` Appointment_Id *uint `json:"appointment_id"` Appointment *ea.Appointment `json:"appointment,omitempty"` @@ -125,7 +125,7 @@ func (d Encounter) ToResponse() ResponseDto { Appointment_Doctor: d.Appointment_Doctor, Responsible_Doctor_Id: d.Responsible_Doctor_Id, Responsible_Doctor: d.Responsible_Doctor, - DischardeMethod_Code: d.DischardeMethod_Code, + DischargeMethod_Code: d.DischargeMethod_Code, RefSource_Name: d.RefSource_Name, Appointment_Id: d.Appointment_Id, Appointment: d.Appointment, diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 3a6ce0e3..0fde85e3 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -29,7 +29,7 @@ type Encounter struct { Appointment_Doctor *ed.Doctor `json:"appointment_doctor,omitempty" gorm:"foreignKey:Appointment_Doctor_Id;references:Id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty" gorm:"foreignKey:Responsible_Doctor_Id;references:Id"` - DischardeMethod_Code *ere.DischargeMethodCode `json:"dischardeMethod_code" gorm:"size:10"` + DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code" gorm:"size:10"` RefSource_Name *string `json:"refSource_name" gorm:"size:100"` Appointment_Id *uint `json:"appointment_id"` Appointment *ea.Appointment `json:"appointment,omitempty" gorm:"foreignKey:Appointment_Id;references:Id"` From cc226b8034625f93df064acd298fee68a1275d09 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 8 Sep 2025 15:18:41 +0700 Subject: [PATCH 013/190] feat (encouter): not tested yet, also add crud for soapi, adime, sbar --- internal/domain/main-entities/adime/dto.go | 6 + .../domain/main-entities/encounter/dto.go | 4 +- internal/domain/main-entities/sbar/dto.go | 6 + internal/domain/main-entities/soapi/dto.go | 6 + .../interface/main-handler/adime/handler.go | 71 +++++ .../main-handler/encounter/handler.go | 80 +++++ .../interface/main-handler/main-handler.go | 15 + .../interface/main-handler/sbar/handler.go | 71 +++++ .../interface/main-handler/soapi/handler.go | 71 +++++ internal/use-case/main-use-case/adime/case.go | 278 ++++++++++++++++++ .../use-case/main-use-case/adime/helper.go | 24 ++ internal/use-case/main-use-case/adime/lib.go | 155 ++++++++++ .../main-use-case/adime/middleware-runner.go | 103 +++++++ .../main-use-case/adime/middleware.go | 9 + .../use-case/main-use-case/adime/tycovar.go | 36 +++ .../use-case/main-use-case/encounter/case.go | 46 +++ .../main-use-case/encounter/helper.go | 34 +++ .../use-case/main-use-case/encounter/lib.go | 25 ++ internal/use-case/main-use-case/sbar/case.go | 278 ++++++++++++++++++ .../use-case/main-use-case/sbar/helper.go | 24 ++ internal/use-case/main-use-case/sbar/lib.go | 155 ++++++++++ .../main-use-case/sbar/middleware-runner.go | 103 +++++++ .../use-case/main-use-case/sbar/middleware.go | 9 + .../use-case/main-use-case/sbar/tycovar.go | 44 +++ internal/use-case/main-use-case/soapi/case.go | 278 ++++++++++++++++++ .../use-case/main-use-case/soapi/helper.go | 24 ++ internal/use-case/main-use-case/soapi/lib.go | 155 ++++++++++ .../main-use-case/soapi/middleware-runner.go | 103 +++++++ .../main-use-case/soapi/middleware.go | 9 + .../use-case/main-use-case/soapi/tycovar.go | 44 +++ 30 files changed, 2264 insertions(+), 2 deletions(-) create mode 100644 internal/interface/main-handler/adime/handler.go create mode 100644 internal/interface/main-handler/encounter/handler.go create mode 100644 internal/interface/main-handler/sbar/handler.go create mode 100644 internal/interface/main-handler/soapi/handler.go create mode 100644 internal/use-case/main-use-case/adime/case.go create mode 100644 internal/use-case/main-use-case/adime/helper.go create mode 100644 internal/use-case/main-use-case/adime/lib.go create mode 100644 internal/use-case/main-use-case/adime/middleware-runner.go create mode 100644 internal/use-case/main-use-case/adime/middleware.go create mode 100644 internal/use-case/main-use-case/adime/tycovar.go create mode 100644 internal/use-case/main-use-case/sbar/case.go create mode 100644 internal/use-case/main-use-case/sbar/helper.go create mode 100644 internal/use-case/main-use-case/sbar/lib.go create mode 100644 internal/use-case/main-use-case/sbar/middleware-runner.go create mode 100644 internal/use-case/main-use-case/sbar/middleware.go create mode 100644 internal/use-case/main-use-case/sbar/tycovar.go create mode 100644 internal/use-case/main-use-case/soapi/case.go create mode 100644 internal/use-case/main-use-case/soapi/helper.go create mode 100644 internal/use-case/main-use-case/soapi/lib.go create mode 100644 internal/use-case/main-use-case/soapi/middleware-runner.go create mode 100644 internal/use-case/main-use-case/soapi/middleware.go create mode 100644 internal/use-case/main-use-case/soapi/tycovar.go diff --git a/internal/domain/main-entities/adime/dto.go b/internal/domain/main-entities/adime/dto.go index 7cbe3608..b11ba182 100644 --- a/internal/domain/main-entities/adime/dto.go +++ b/internal/domain/main-entities/adime/dto.go @@ -15,6 +15,12 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Employee_Id *uint `json:"employee_id"` Time *time.Time `json:"time"` diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 6ef1fc58..d4d02929 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -46,7 +46,7 @@ type FilterDto struct { VisitDate time.Time `json:"visitDate"` Appoinment_Doctor_Id *uint `json:"appointment_doctor_id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - DischardeMethod_Code ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` + DischargeMethod_Code ere.DischargeMethodCode `json:"dischargeMethod_code" validate:"maxLength=10"` RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` Appointment_Id *uint `json:"appointment_id"` EarlyEducation *string `json:"earlyEducation"` @@ -79,7 +79,7 @@ type MetaDto struct { } type DischargeDto struct { Id uint `json:"id"` - DischardeMethod_Code *ere.DischargeMethodCode `json:"dischardeMethod_code" validate:"maxLength=10"` + DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code" validate:"maxLength=10"` EarlyEducation *string `json:"earlyEducation"` MedicalDischargeEducation *string `json:"medicalDischargeEducation"` AdmDischargeEducation *string `json:"admDischargeEducation"` diff --git a/internal/domain/main-entities/sbar/dto.go b/internal/domain/main-entities/sbar/dto.go index 3030b6d6..d3c08f21 100644 --- a/internal/domain/main-entities/sbar/dto.go +++ b/internal/domain/main-entities/sbar/dto.go @@ -15,6 +15,12 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Employee_Id *uint `json:"employee_id"` Time *time.Time `json:"time"` diff --git a/internal/domain/main-entities/soapi/dto.go b/internal/domain/main-entities/soapi/dto.go index 3e160cb2..d6282b00 100644 --- a/internal/domain/main-entities/soapi/dto.go +++ b/internal/domain/main-entities/soapi/dto.go @@ -15,6 +15,12 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Employee_Id *uint `json:"employee_id"` Time *time.Time `json:"time"` diff --git a/internal/interface/main-handler/adime/handler.go b/internal/interface/main-handler/adime/handler.go new file mode 100644 index 00000000..929081c7 --- /dev/null +++ b/internal/interface/main-handler/adime/handler.go @@ -0,0 +1,71 @@ +package adime + +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/adime" + u "simrs-vx/internal/use-case/main-use-case/adime" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go new file mode 100644 index 00000000..c2634a91 --- /dev/null +++ b/internal/interface/main-handler/encounter/handler.go @@ -0,0 +1,80 @@ +package encounter + +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/encounter" + u "simrs-vx/internal/use-case/main-use-case/encounter" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) CheckOut(w http.ResponseWriter, r *http.Request) { + dto := e.DischargeDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.CheckOut(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 476dacc7..67fdb67a 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -4,11 +4,15 @@ import ( "net/http" /******************** main / transaction ********************/ + adime "simrs-vx/internal/interface/main-handler/adime" auth "simrs-vx/internal/interface/main-handler/authentication" counter "simrs-vx/internal/interface/main-handler/counter" + encounter "simrs-vx/internal/interface/main-handler/encounter" medicicinemix "simrs-vx/internal/interface/main-handler/medicine-mix" medicicinemixitem "simrs-vx/internal/interface/main-handler/medicine-mix-item" practiceschedule "simrs-vx/internal/interface/main-handler/practice-schedule" + sbar "simrs-vx/internal/interface/main-handler/sbar" + soapi "simrs-vx/internal/interface/main-handler/soapi" /******************** actor ********************/ doctor "simrs-vx/internal/interface/main-handler/doctor" @@ -115,7 +119,18 @@ func SetRoutes() http.Handler { "DELETE /{id}": patient.O.Delete, "GET /by-identifier": patient.O.Search, }) + hk.GroupRoutes("/v1/encounter", r, hk.MapHandlerFunc{ + "GET /": encounter.O.GetList, + "GET /{id}": encounter.O.GetDetail, + "POST /": encounter.O.Create, + "PATCH /{id}": encounter.O.Update, + "DELETE /{id}": encounter.O.Delete, + "PATCH /{id}/checkOut": encounter.O.CheckOut, + }) + hc.RegCrud(r, "/v1/soapi", soapi.O) + hc.RegCrud(r, "/v1/adime", adime.O) + hc.RegCrud(r, "/v1/sbar", sbar.O) hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) hc.RegCrud(r, "/v1/person-contact", personcontact.O) diff --git a/internal/interface/main-handler/sbar/handler.go b/internal/interface/main-handler/sbar/handler.go new file mode 100644 index 00000000..c67b25a0 --- /dev/null +++ b/internal/interface/main-handler/sbar/handler.go @@ -0,0 +1,71 @@ +package sbar + +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/sbar" + u "simrs-vx/internal/use-case/main-use-case/sbar" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/soapi/handler.go b/internal/interface/main-handler/soapi/handler.go new file mode 100644 index 00000000..a7b59bba --- /dev/null +++ b/internal/interface/main-handler/soapi/handler.go @@ -0,0 +1,71 @@ +package soapi + +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/soapi" + u "simrs-vx/internal/use-case/main-use-case/soapi" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/adime/case.go b/internal/use-case/main-use-case/adime/case.go new file mode 100644 index 00000000..3a3656a8 --- /dev/null +++ b/internal/use-case/main-use-case/adime/case.go @@ -0,0 +1,278 @@ +package adime + +import ( + e "simrs-vx/internal/domain/main-entities/adime" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "adime" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Adime{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Adime + var dataList []e.Adime + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Adime + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Adime + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Adime + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/adime/helper.go b/internal/use-case/main-use-case/adime/helper.go new file mode 100644 index 00000000..ab6a16c9 --- /dev/null +++ b/internal/use-case/main-use-case/adime/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package adime + +import ( + e "simrs-vx/internal/domain/main-entities/adime" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Adime) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Employee_Id = inputSrc.Employee_Id + data.Time = inputSrc.Time + data.Value = inputSrc.Value +} diff --git a/internal/use-case/main-use-case/adime/lib.go b/internal/use-case/main-use-case/adime/lib.go new file mode 100644 index 00000000..5d3934c1 --- /dev/null +++ b/internal/use-case/main-use-case/adime/lib.go @@ -0,0 +1,155 @@ +package adime + +import ( + e "simrs-vx/internal/domain/main-entities/adime" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Adime, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Adime{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Adime, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Adime{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Adime{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Adime, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Adime{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Adime, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Adime, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/adime/middleware-runner.go b/internal/use-case/main-use-case/adime/middleware-runner.go new file mode 100644 index 00000000..5081ea55 --- /dev/null +++ b/internal/use-case/main-use-case/adime/middleware-runner.go @@ -0,0 +1,103 @@ +package adime + +import ( + e "simrs-vx/internal/domain/main-entities/adime" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Adime) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Adime) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Adime) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Adime) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Adime) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/adime/middleware.go b/internal/use-case/main-use-case/adime/middleware.go new file mode 100644 index 00000000..eb7de7a4 --- /dev/null +++ b/internal/use-case/main-use-case/adime/middleware.go @@ -0,0 +1,9 @@ +package adime + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/adime/tycovar.go b/internal/use-case/main-use-case/adime/tycovar.go new file mode 100644 index 00000000..bb12cce1 --- /dev/null +++ b/internal/use-case/main-use-case/adime/tycovar.go @@ -0,0 +1,36 @@ +package adime + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/adime" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Adime, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Adime, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Adime, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 3c8f5fc3..cfb70c81 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -335,3 +335,49 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func CheckOut(input e.DischargeDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Encounter + var err error + + event := pl.Event{ + Feature: "CheckOut", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "checkOut") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if err := checkSoapiByDocExists(data.Id, tx); err != nil { + return err + } + + if err := UpdateDischargeData(input, data, &event, tx); err != nil { + return err + } + + 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": "checkOut", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 5152810f..5f8e33a9 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -5,7 +5,13 @@ Any functions that are used internally by the use-case package encounter import ( + "errors" e "simrs-vx/internal/domain/main-entities/encounter" + es "simrs-vx/internal/domain/main-entities/soapi" + + ero "simrs-vx/internal/domain/references/organization" + + "gorm.io/gorm" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { @@ -28,3 +34,31 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { data.RefSource_Name = inputSrc.RefSource_Name data.Appointment_Id = inputSrc.Appointment_Id } + +func setDataDischarge(src e.DischargeDto, dst *e.Encounter) { + dst.DischargeMethod_Code = src.DischargeMethod_Code + dst.EarlyEducation = src.EarlyEducation + dst.MedicalDischargeEducation = src.MedicalDischargeEducation + dst.AdmDischargeEducation = src.AdmDischargeEducation + dst.DischargeReason = src.DischargeReason +} + +func checkSoapiByDocExists(encounter_id uint, tx *gorm.DB) error { + soapi := es.Soapi{} + err := tx. + Preload("Employee"). + Preload("Employee.User"). + Where("\"Encounter_Id\" = ?", encounter_id).First(&soapi).Error + if err != nil { + return err + } + + if soapi.Employee == nil || soapi.Employee.User == nil { + return errors.New("employee not found") + } + if soapi.Employee.User.Position_Code != ero.UPCDoc { + return errors.New("employee is not a doctor") + } + + return nil +} diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index db1064c1..e9b9bf9b 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -153,3 +153,28 @@ func DeleteData(data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func UpdateDischargeData(input e.DischargeDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdateDischarge") + setDataDischarge(input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} diff --git a/internal/use-case/main-use-case/sbar/case.go b/internal/use-case/main-use-case/sbar/case.go new file mode 100644 index 00000000..dfa36f72 --- /dev/null +++ b/internal/use-case/main-use-case/sbar/case.go @@ -0,0 +1,278 @@ +package sbar + +import ( + e "simrs-vx/internal/domain/main-entities/sbar" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "sbar" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Sbar{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Sbar + var dataList []e.Sbar + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Sbar + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Sbar + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Sbar + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/sbar/helper.go b/internal/use-case/main-use-case/sbar/helper.go new file mode 100644 index 00000000..06eefec6 --- /dev/null +++ b/internal/use-case/main-use-case/sbar/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package sbar + +import ( + e "simrs-vx/internal/domain/main-entities/sbar" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Sbar) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Employee_Id = inputSrc.Employee_Id + data.Time = inputSrc.Time + data.Value = inputSrc.Value +} diff --git a/internal/use-case/main-use-case/sbar/lib.go b/internal/use-case/main-use-case/sbar/lib.go new file mode 100644 index 00000000..0bc9feb9 --- /dev/null +++ b/internal/use-case/main-use-case/sbar/lib.go @@ -0,0 +1,155 @@ +package sbar + +import ( + e "simrs-vx/internal/domain/main-entities/sbar" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Sbar, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Sbar{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sbar, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Sbar{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Sbar{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Sbar, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Sbar{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Sbar, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Sbar, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/sbar/middleware-runner.go b/internal/use-case/main-use-case/sbar/middleware-runner.go new file mode 100644 index 00000000..a628d1b0 --- /dev/null +++ b/internal/use-case/main-use-case/sbar/middleware-runner.go @@ -0,0 +1,103 @@ +package sbar + +import ( + e "simrs-vx/internal/domain/main-entities/sbar" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Sbar) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Sbar) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Sbar) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Sbar) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Sbar) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/sbar/middleware.go b/internal/use-case/main-use-case/sbar/middleware.go new file mode 100644 index 00000000..6ed8e657 --- /dev/null +++ b/internal/use-case/main-use-case/sbar/middleware.go @@ -0,0 +1,9 @@ +package sbar + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/sbar/tycovar.go b/internal/use-case/main-use-case/sbar/tycovar.go new file mode 100644 index 00000000..dda3872a --- /dev/null +++ b/internal/use-case/main-use-case/sbar/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package sbar + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/sbar" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Sbar, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Sbar, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Sbar, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go new file mode 100644 index 00000000..b30da92f --- /dev/null +++ b/internal/use-case/main-use-case/soapi/case.go @@ -0,0 +1,278 @@ +package soapi + +import ( + e "simrs-vx/internal/domain/main-entities/soapi" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "soapi" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Soapi{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Soapi + var dataList []e.Soapi + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Soapi + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Soapi + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Soapi + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/soapi/helper.go b/internal/use-case/main-use-case/soapi/helper.go new file mode 100644 index 00000000..504acff6 --- /dev/null +++ b/internal/use-case/main-use-case/soapi/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package soapi + +import ( + e "simrs-vx/internal/domain/main-entities/soapi" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Soapi) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Employee_Id = inputSrc.Employee_Id + data.Time = inputSrc.Time + data.Value = inputSrc.Value +} diff --git a/internal/use-case/main-use-case/soapi/lib.go b/internal/use-case/main-use-case/soapi/lib.go new file mode 100644 index 00000000..288e7dae --- /dev/null +++ b/internal/use-case/main-use-case/soapi/lib.go @@ -0,0 +1,155 @@ +package soapi + +import ( + e "simrs-vx/internal/domain/main-entities/soapi" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Soapi, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Soapi{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Soapi, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Soapi{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Soapi{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Debug().Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Soapi, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Soapi{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Soapi, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Soapi, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/soapi/middleware-runner.go b/internal/use-case/main-use-case/soapi/middleware-runner.go new file mode 100644 index 00000000..a840a33a --- /dev/null +++ b/internal/use-case/main-use-case/soapi/middleware-runner.go @@ -0,0 +1,103 @@ +package soapi + +import ( + e "simrs-vx/internal/domain/main-entities/soapi" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Soapi) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Soapi) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Soapi) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Soapi) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Soapi) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/soapi/middleware.go b/internal/use-case/main-use-case/soapi/middleware.go new file mode 100644 index 00000000..f2fecda5 --- /dev/null +++ b/internal/use-case/main-use-case/soapi/middleware.go @@ -0,0 +1,9 @@ +package soapi + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/soapi/tycovar.go b/internal/use-case/main-use-case/soapi/tycovar.go new file mode 100644 index 00000000..956193a4 --- /dev/null +++ b/internal/use-case/main-use-case/soapi/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package soapi + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/soapi" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Soapi, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Soapi, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Soapi, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From e4358034d94f5613df3075370bc41012d5801ef8 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 9 Sep 2025 13:41:06 +0700 Subject: [PATCH 014/190] feat (encounter): create and checkout + checking soapi done --- .../domain/main-entities/encounter/dto.go | 1 - internal/domain/main-entities/soapi/dto.go | 6 ++- .../{authentication.go => handler.go} | 16 ++---- .../interface/main-handler/main-handler.go | 4 +- .../interface/main-handler/soapi/handler.go | 9 ++++ .../main-use-case/ambulatory/helper.go | 16 ++++++ .../main-use-case/authentication/case.go | 27 +++++----- .../main-use-case/authentication/tycovar.go | 9 ---- .../main-use-case/emergency/helper.go | 16 ++++++ .../use-case/main-use-case/encounter/case.go | 43 +++++++-------- .../main-use-case/encounter/helper.go | 44 ++++++++++++---- .../main-use-case/inpatient/helper.go | 16 ++++++ internal/use-case/main-use-case/soapi/case.go | 22 +++++++- pkg/auth-helper/auth-helper.go | 15 ++++++ pkg/auth-helper/tycovar.go | 52 +++++++++++++++++++ 15 files changed, 225 insertions(+), 71 deletions(-) rename internal/interface/main-handler/authentication/{authentication.go => handler.go} (83%) create mode 100644 pkg/auth-helper/auth-helper.go create mode 100644 pkg/auth-helper/tycovar.go diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index d4d02929..32472324 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -14,7 +14,6 @@ import ( type CreateDto struct { Patient_Id *uint `json:"patient_id"` - Patient *ep.Patient `json:"patient,omitempty"` RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` SubClass_Code *string `json:"subClass_code" validate:"maxLength=10"` // for sub diff --git a/internal/domain/main-entities/soapi/dto.go b/internal/domain/main-entities/soapi/dto.go index d6282b00..6aac522e 100644 --- a/internal/domain/main-entities/soapi/dto.go +++ b/internal/domain/main-entities/soapi/dto.go @@ -4,14 +4,18 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" eem "simrs-vx/internal/domain/main-entities/employee" ee "simrs-vx/internal/domain/main-entities/encounter" + + pa "simrs-vx/pkg/auth-helper" "time" ) type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` - Employee_Id *uint `json:"employee_id"` + Employee_Id *uint `json:"-"` Time *time.Time `json:"time"` Value *string `json:"value"` + + pa.AuthInfo } type ReadListDto struct { diff --git a/internal/interface/main-handler/authentication/authentication.go b/internal/interface/main-handler/authentication/handler.go similarity index 83% rename from internal/interface/main-handler/authentication/authentication.go rename to internal/interface/main-handler/authentication/handler.go index 37b84346..01d4fb89 100644 --- a/internal/interface/main-handler/authentication/authentication.go +++ b/internal/interface/main-handler/authentication/handler.go @@ -9,16 +9,10 @@ import ( m "simrs-vx/internal/domain/main-entities/user" s "simrs-vx/internal/use-case/main-use-case/authentication" + + pa "simrs-vx/pkg/auth-helper" ) -type authKey string - -const akInfo authKey = "authInfo" - -type AuthKey struct{} - -// var Position m.Position - func Login(w http.ResponseWriter, r *http.Request) { var input m.LoginDto if !(rw.ValidateStructByIOR(w, r.Body, &input)) { @@ -35,12 +29,12 @@ func Login(w http.ResponseWriter, r *http.Request) { } func Logout(w http.ResponseWriter, r *http.Request) { - ctxVal := r.Context().Value(AuthKey{}) + ctxVal := r.Context().Value(pa.AuthKey{}) if ctxVal == nil { rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "logout skiped. the request is done wihtout authorization."}, nil) return } - authInfo := ctxVal.(*s.AuthInfo) + authInfo := ctxVal.(*pa.AuthInfo) s.RevokeToken(authInfo.Uuid) rw.WriteJSON(w, http.StatusOK, d.IS{"message": "logged out"}, nil) } @@ -52,7 +46,7 @@ func GuardMW(next http.Handler) http.Handler { rw.WriteJSON(w, http.StatusUnauthorized, err.(d.FieldError), nil) return } - ctx := context.WithValue(r.Context(), AuthKey{}, accessDetail) + ctx := context.WithValue(r.Context(), pa.AuthKey{}, accessDetail) next.ServeHTTP(w, r.WithContext(ctx)) }) } diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 67fdb67a..553f2ac0 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -125,10 +125,10 @@ func SetRoutes() http.Handler { "POST /": encounter.O.Create, "PATCH /{id}": encounter.O.Update, "DELETE /{id}": encounter.O.Delete, - "PATCH /{id}/checkOut": encounter.O.CheckOut, + "PATCH /{id}/checkout": encounter.O.CheckOut, }) - hc.RegCrud(r, "/v1/soapi", soapi.O) + hc.RegCrud(r, "/v1/soapi", auth.GuardMW, soapi.O) hc.RegCrud(r, "/v1/adime", adime.O) hc.RegCrud(r, "/v1/sbar", sbar.O) hc.RegCrud(r, "/v1/person", person.O) diff --git a/internal/interface/main-handler/soapi/handler.go b/internal/interface/main-handler/soapi/handler.go index a7b59bba..f5446b82 100644 --- a/internal/interface/main-handler/soapi/handler.go +++ b/internal/interface/main-handler/soapi/handler.go @@ -10,6 +10,10 @@ import ( e "simrs-vx/internal/domain/main-entities/soapi" u "simrs-vx/internal/use-case/main-use-case/soapi" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -17,10 +21,15 @@ type myBase struct{} var O myBase func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } dto := e.CreateDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + dto.AuthInfo = *authInfo res, err := u.Create(dto) rw.DataResponse(w, res, err) } diff --git a/internal/use-case/main-use-case/ambulatory/helper.go b/internal/use-case/main-use-case/ambulatory/helper.go index 497f0a0b..39361d9d 100644 --- a/internal/use-case/main-use-case/ambulatory/helper.go +++ b/internal/use-case/main-use-case/ambulatory/helper.go @@ -5,7 +5,10 @@ Any functions that are used internally by the use-case package ambulatory import ( + "errors" e "simrs-vx/internal/domain/main-entities/ambulatory" + + ere "simrs-vx/internal/domain/references/encounter" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Ambulatory) { @@ -20,3 +23,16 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Ambulatory) { data.Encounter_Id = inputSrc.Encounter_Id data.Class_Code = inputSrc.Class_Code } + +func CheckClassCode(input *string) (ere.AmbulatoryClassCode, error) { + if input != nil { + subCode := ere.AmbulatoryClassCode(*input) + switch subCode { + case ere.ACCReg, ere.ACCRme: + return subCode, nil + default: + return "", errors.New("unknown sub class code") + } + } + return "", errors.New("sub class code is nil") +} diff --git a/internal/use-case/main-use-case/authentication/case.go b/internal/use-case/main-use-case/authentication/case.go index 70925827..0c1f4884 100644 --- a/internal/use-case/main-use-case/authentication/case.go +++ b/internal/use-case/main-use-case/authentication/case.go @@ -16,10 +16,11 @@ import ( a "github.com/karincake/apem" ms "github.com/karincake/apem/ms-redis" + pa "simrs-vx/pkg/auth-helper" el "simrs-vx/pkg/logger" p "simrs-vx/pkg/password" - mu "simrs-vx/internal/domain/main-entities/user" + eu "simrs-vx/internal/domain/main-entities/user" erc "simrs-vx/internal/domain/references/common" ) @@ -31,9 +32,9 @@ func init() { // Generates token and store in redis at one place // just return the error code -func GenToken(input mu.LoginDto) (*d.Data, error) { +func GenToken(input eu.LoginDto) (*d.Data, error) { // Get User - user := &mu.User{Name: input.Name} + user := &eu.User{Name: input.Name} // if input.Position_Code != "" { // user.Position_Code = input.Position_Code // } @@ -94,7 +95,7 @@ func GenToken(input mu.LoginDto) (*d.Data, error) { atClaims["user_id"] = user.Id atClaims["user_name"] = user.Name // atClaims["user_email"] = user.Email - // atClaims["user_position_code"] = user.Position_Code + atClaims["user_position_code"] = user.Position_Code // atClaims["user_ref_id"] = user.Ref_Id atClaims["exp"] = atExpires atClaims["uuid"] = aUuid @@ -129,7 +130,7 @@ func GenToken(input mu.LoginDto) (*d.Data, error) { "user_id": strconv.Itoa(int(user.Id)), "user_name": user.Name, // "user_email": user.Email, - // "user_position_code": user.Position_Code, + "user_position_code": user.Position_Code, // "user_ref_id": user.Ref_Id, "accessToken": ats, }, @@ -167,7 +168,7 @@ func VerifyToken(r *http.Request, tokenType TokenType) (data *jwt.Token, errCode return token, "", "" } -func ExtractToken(r *http.Request, tokenType TokenType) (data *AuthInfo, err error) { +func ExtractToken(r *http.Request, tokenType TokenType) (data *pa.AuthInfo, err error) { token, errCode, errDetail := VerifyToken(r, tokenType) if errCode != "" { return nil, d.FieldError{Code: errCode, Message: el.GenMessage(errCode, errDetail)} @@ -196,17 +197,17 @@ func ExtractToken(r *http.Request, tokenType TokenType) (data *AuthInfo, err err // tmp := v.(float64) // ref_id = int(tmp) // } - // position_code := "" - // if v, exist := claims["user_position_code"]; exist && v != nil { - // position_code = v.(string) - // } - data = &AuthInfo{ + position_code := "" + if v, exist := claims["user_position_code"]; exist && v != nil { + position_code = v.(string) + } + data = &pa.AuthInfo{ Uuid: accessUuid, - User_Id: int(user_id), + User_Id: uint(user_id), User_Name: user_name, // User_Email: user_email, // User_Ref_Id: ref_id, - // User_Position_Code: position_code, + User_Position_Code: position_code, } return } diff --git a/internal/use-case/main-use-case/authentication/tycovar.go b/internal/use-case/main-use-case/authentication/tycovar.go index d4d5b5ea..c1b11420 100644 --- a/internal/use-case/main-use-case/authentication/tycovar.go +++ b/internal/use-case/main-use-case/authentication/tycovar.go @@ -5,15 +5,6 @@ type TokenType string const AccessToken = "Access" const RefreshToken = "Refresh" -type AuthInfo struct { - Uuid string - User_Id int - User_Name string - // User_Email string - // User_Ref_Id int - // User_Position_Code string -} - type AuthCfg struct { AtSecretKey string `yaml:"atSecretKey"` RtSecretKey string `yaml:"rtSecretKey"` diff --git a/internal/use-case/main-use-case/emergency/helper.go b/internal/use-case/main-use-case/emergency/helper.go index b3564c4e..00cde658 100644 --- a/internal/use-case/main-use-case/emergency/helper.go +++ b/internal/use-case/main-use-case/emergency/helper.go @@ -5,7 +5,10 @@ Any functions that are used internally by the use-case package emergency import ( + "errors" e "simrs-vx/internal/domain/main-entities/emergency" + + ere "simrs-vx/internal/domain/references/encounter" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Emergency) { @@ -20,3 +23,16 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Emergency) { data.Encounter_Id = inputSrc.Encounter_Id data.Class_Code = inputSrc.Class_Code } + +func CheckClassCode(input *string) (ere.EmergencyClassCode, error) { + if input != nil { + subCode := ere.EmergencyClassCode(*input) + switch subCode { + case ere.ECCEmg, ere.ECCEon: + return subCode, nil + default: + return "", errors.New("unknown sub class code") + } + } + return "", errors.New("sub class code is nil") +} diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index cfb70c81..0101f38d 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -53,45 +53,42 @@ func Create(input e.CreateDto) (*d.Data, error) { switch input.Class_Code { case ere.ECAmbulatory: + subCode, err := ua.CheckClassCode(input.SubClass_Code) + if err != nil { + return err + } ambCreate := ea.CreateDto{ Encounter_Id: &data.Id, - Class_Code: func() ere.AmbulatoryClassCode { - if input.SubClass_Code != nil { - return ere.AmbulatoryClassCode(*input.SubClass_Code) - } - return "" - }(), + Class_Code: subCode, } - _, err := ua.CreateData(ambCreate, &event, tx) + _, err = ua.CreateData(ambCreate, &event, tx) if err != nil { return err } case ere.ECEmergency: + subCode, err := ue.CheckClassCode(input.SubClass_Code) + if err != nil { + return err + } emerCreate := ee.CreateDto{ Encounter_Id: &data.Id, - Class_Code: func() ere.EmergencyClassCode { - if input.SubClass_Code != nil { - return ere.EmergencyClassCode(*input.SubClass_Code) - } - return "" - }(), + Class_Code: subCode, } - _, err := ue.CreateData(emerCreate, &event, tx) + _, err = ue.CreateData(emerCreate, &event, tx) if err != nil { return err } case ere.ECInpatient: + subCode, err := ui.CheckClassCode(input.SubClass_Code) + if err != nil { + return err + } inpCreate := ei.CreateDto{ Encounter_Id: &data.Id, - Class_Code: func() ere.InpatientClassCode { - if input.SubClass_Code != nil { - return ere.InpatientClassCode(*input.SubClass_Code) - } - return "" - }(), - Infra_Id: input.Infra_Id, + Class_Code: subCode, + Infra_Id: input.Infra_Id, } - _, err := ui.CreateData(inpCreate, &event, tx) + _, err = ui.CreateData(inpCreate, &event, tx) if err != nil { return err } @@ -355,7 +352,7 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { return err } - if err := checkSoapiByDocExists(data.Id, tx); err != nil { + if err := checkSoapiByDocExists(data.Id, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 5f8e33a9..3e7e4b30 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -8,6 +8,7 @@ import ( "errors" e "simrs-vx/internal/domain/main-entities/encounter" es "simrs-vx/internal/domain/main-entities/soapi" + pl "simrs-vx/pkg/logger" ero "simrs-vx/internal/domain/references/organization" @@ -24,6 +25,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { } data.Patient_Id = inputSrc.Patient_Id + data.RegisteredAt = inputSrc.RegisteredAt data.Class_Code = inputSrc.Class_Code data.Unit_Id = inputSrc.Unit_Id data.Specialist_Id = inputSrc.Specialist_Id @@ -43,22 +45,44 @@ func setDataDischarge(src e.DischargeDto, dst *e.Encounter) { dst.DischargeReason = src.DischargeReason } -func checkSoapiByDocExists(encounter_id uint, tx *gorm.DB) error { - soapi := es.Soapi{} +func checkSoapiByDocExists(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "checkSoapiByDocExists") + var soapies []es.Soapi err := tx. Preload("Employee"). Preload("Employee.User"). - Where("\"Encounter_Id\" = ?", encounter_id).First(&soapi).Error + Where("\"Encounter_Id\" = ?", encounter_id).Find(&soapies).Error if err != nil { - return err + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get soapi failed", + Raw: err, + } + return pl.SetLogError(event, nil) } - if soapi.Employee == nil || soapi.Employee.User == nil { - return errors.New("employee not found") - } - if soapi.Employee.User.Position_Code != ero.UPCDoc { - return errors.New("employee is not a doctor") + if len(soapies) == 0 { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-notFound", + Detail: "no soapi found for encounter", + Raw: errors.New("soapi not found"), + } + return pl.SetLogError(event, nil) } - return nil + for _, s := range soapies { + if s.Employee != nil && s.Employee.User != nil && s.Employee.User.Position_Code == ero.UPCDoc { + return nil + } + } + + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "no soapi written by a doctor found", + Raw: errors.New("all soapi employees are not doctors"), + } + return pl.SetLogError(event, nil) } diff --git a/internal/use-case/main-use-case/inpatient/helper.go b/internal/use-case/main-use-case/inpatient/helper.go index 75f38c7e..45014af1 100644 --- a/internal/use-case/main-use-case/inpatient/helper.go +++ b/internal/use-case/main-use-case/inpatient/helper.go @@ -5,7 +5,10 @@ Any functions that are used internally by the use-case package inpatient import ( + "errors" e "simrs-vx/internal/domain/main-entities/inpatient" + + ere "simrs-vx/internal/domain/references/encounter" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Inpatient) { @@ -20,3 +23,16 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Inpatient) { data.Encounter_Id = inputSrc.Encounter_Id data.Class_Code = inputSrc.Class_Code } + +func CheckClassCode(input *string) (ere.InpatientClassCode, error) { + if input != nil { + subCode := ere.InpatientClassCode(*input) + switch subCode { + case ere.ICCHCU, ere.ICCICU, ere.ICCVK, ere.ICCIp: + return subCode, nil + default: + return "", errors.New("unknown sub class code") + } + } + return "", errors.New("sub class code is nil") +} diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index b30da92f..46e64e71 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -1,9 +1,14 @@ package soapi import ( - e "simrs-vx/internal/domain/main-entities/soapi" + "errors" "strconv" + ee "simrs-vx/internal/domain/main-entities/employee" + e "simrs-vx/internal/domain/main-entities/soapi" + + ue "simrs-vx/internal/use-case/main-use-case/employee" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -34,6 +39,21 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if !input.AuthInfo.IsDoctor() && !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) + } + + employee, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &input.AuthInfo.User_Id}, &event, tx) + if err != nil { + return err + } + input.Employee_Id = &employee.Id if resData, err := CreateData(input, &event, tx); err != nil { return err } else { diff --git a/pkg/auth-helper/auth-helper.go b/pkg/auth-helper/auth-helper.go new file mode 100644 index 00000000..934d8d61 --- /dev/null +++ b/pkg/auth-helper/auth-helper.go @@ -0,0 +1,15 @@ +package authhelper + +import ( + "errors" + "net/http" +) + +func GetAuthInfo(r *http.Request) (*AuthInfo, error) { + ctxVal := r.Context().Value(AuthKey{}) + if ctxVal == nil { + return nil, errors.New("can't get auth info") + } + authInfo := ctxVal.(*AuthInfo) + return authInfo, nil +} diff --git a/pkg/auth-helper/tycovar.go b/pkg/auth-helper/tycovar.go new file mode 100644 index 00000000..7586956d --- /dev/null +++ b/pkg/auth-helper/tycovar.go @@ -0,0 +1,52 @@ +package authhelper + +import ( + ero "simrs-vx/internal/domain/references/organization" +) + +type AuthKey struct{} + +type AuthInfo struct { + Uuid string + User_Id uint + User_Name string + // User_Email string + // User_Ref_Id int + User_Position_Code string +} + +func (a AuthInfo) IsDoctor() bool { + return a.User_Position_Code == string(ero.UPCDoc) +} + +func (a AuthInfo) IsNurse() bool { + return a.User_Position_Code == string(ero.UPCNur) +} + +func (a AuthInfo) IsNutritionist() bool { + return a.User_Position_Code == string(ero.UPCNut) +} + +func (a AuthInfo) IsLaborant() bool { + return a.User_Position_Code == string(ero.UPCLab) +} + +func (a AuthInfo) IsPharmacist() bool { + return a.User_Position_Code == string(ero.UPCPha) +} + +func (a AuthInfo) IsPayment() bool { + return a.User_Position_Code == string(ero.UPCPay) +} + +func (a AuthInfo) IsPaymentVerificator() bool { + return a.User_Position_Code == string(ero.UPCPav) +} + +func (a AuthInfo) IsManagement() bool { + return a.User_Position_Code == string(ero.UPCMan) +} + +func (a AuthInfo) IsSpecialistIntern() bool { + return a.User_Position_Code == string(ero.UPCInt) +} From e2f8947d3966e15dae99a3d3857725843110718a Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 9 Sep 2025 13:44:18 +0700 Subject: [PATCH 015/190] remove debug() --- internal/use-case/main-use-case/adime/lib.go | 2 +- internal/use-case/main-use-case/ambulatory/lib.go | 2 +- internal/use-case/main-use-case/counter/lib.go | 2 +- internal/use-case/main-use-case/device/lib.go | 2 +- internal/use-case/main-use-case/diagnose-src/lib.go | 2 +- internal/use-case/main-use-case/district/lib.go | 2 +- internal/use-case/main-use-case/division-position/lib.go | 2 +- internal/use-case/main-use-case/division/lib.go | 2 +- internal/use-case/main-use-case/doctor-fee/lib.go | 2 +- internal/use-case/main-use-case/doctor/lib.go | 2 +- internal/use-case/main-use-case/emergency/lib.go | 2 +- internal/use-case/main-use-case/employee/lib.go | 2 +- internal/use-case/main-use-case/encounter/lib.go | 2 +- internal/use-case/main-use-case/ethnic/lib.go | 2 +- internal/use-case/main-use-case/infra/lib.go | 2 +- internal/use-case/main-use-case/inpatient/lib.go | 2 +- internal/use-case/main-use-case/installation/lib.go | 2 +- internal/use-case/main-use-case/insurance-company/lib.go | 2 +- internal/use-case/main-use-case/item-price/lib.go | 2 +- internal/use-case/main-use-case/item/lib.go | 2 +- internal/use-case/main-use-case/laborant/lib.go | 2 +- internal/use-case/main-use-case/language/lib.go | 2 +- internal/use-case/main-use-case/material/lib.go | 2 +- internal/use-case/main-use-case/mcu-src-category/lib.go | 2 +- internal/use-case/main-use-case/mcu-src/lib.go | 2 +- internal/use-case/main-use-case/medical-action-src-item/lib.go | 2 +- internal/use-case/main-use-case/medical-action-src/lib.go | 2 +- internal/use-case/main-use-case/medicine-group/lib.go | 2 +- internal/use-case/main-use-case/medicine-method/lib.go | 2 +- internal/use-case/main-use-case/medicine-mix-item/lib.go | 2 +- internal/use-case/main-use-case/medicine-mix/lib.go | 2 +- internal/use-case/main-use-case/medicine/lib.go | 2 +- internal/use-case/main-use-case/nurse/lib.go | 2 +- internal/use-case/main-use-case/nutritionist/lib.go | 2 +- internal/use-case/main-use-case/patient/lib.go | 2 +- internal/use-case/main-use-case/person-address/lib.go | 2 +- internal/use-case/main-use-case/person-contact/lib.go | 2 +- internal/use-case/main-use-case/person-relative/lib.go | 2 +- internal/use-case/main-use-case/person/lib.go | 2 +- internal/use-case/main-use-case/pharmacist/lib.go | 2 +- internal/use-case/main-use-case/pharmacy-company/lib.go | 2 +- internal/use-case/main-use-case/practice-schedule/lib.go | 2 +- internal/use-case/main-use-case/procedure-src/lib.go | 2 +- internal/use-case/main-use-case/province/lib.go | 2 +- internal/use-case/main-use-case/regency/lib.go | 2 +- internal/use-case/main-use-case/room/lib.go | 2 +- internal/use-case/main-use-case/sbar/lib.go | 2 +- internal/use-case/main-use-case/soapi/lib.go | 2 +- internal/use-case/main-use-case/specialist-intern/lib.go | 2 +- internal/use-case/main-use-case/specialist/lib.go | 2 +- internal/use-case/main-use-case/subspecialist/lib.go | 2 +- internal/use-case/main-use-case/unit/lib.go | 2 +- internal/use-case/main-use-case/uom/lib.go | 2 +- internal/use-case/main-use-case/user/lib.go | 2 +- internal/use-case/main-use-case/village/lib.go | 2 +- 55 files changed, 55 insertions(+), 55 deletions(-) diff --git a/internal/use-case/main-use-case/adime/lib.go b/internal/use-case/main-use-case/adime/lib.go index 5d3934c1..851dfa4f 100644 --- a/internal/use-case/main-use-case/adime/lib.go +++ b/internal/use-case/main-use-case/adime/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ad Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/ambulatory/lib.go b/internal/use-case/main-use-case/ambulatory/lib.go index 178bc53a..86d4fb06 100644 --- a/internal/use-case/main-use-case/ambulatory/lib.go +++ b/internal/use-case/main-use-case/ambulatory/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Am Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/counter/lib.go b/internal/use-case/main-use-case/counter/lib.go index 64b22b0f..bfb0ee05 100644 --- a/internal/use-case/main-use-case/counter/lib.go +++ b/internal/use-case/main-use-case/counter/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Co Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/device/lib.go b/internal/use-case/main-use-case/device/lib.go index 22c233b6..af8f9f80 100644 --- a/internal/use-case/main-use-case/device/lib.go +++ b/internal/use-case/main-use-case/device/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/diagnose-src/lib.go b/internal/use-case/main-use-case/diagnose-src/lib.go index 344e36ef..1377c682 100644 --- a/internal/use-case/main-use-case/diagnose-src/lib.go +++ b/internal/use-case/main-use-case/diagnose-src/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/district/lib.go b/internal/use-case/main-use-case/district/lib.go index ba98ad06..6911f4b3 100644 --- a/internal/use-case/main-use-case/district/lib.go +++ b/internal/use-case/main-use-case/district/lib.go @@ -57,7 +57,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di Count(&count). Scopes(gh.Paginate(input, &pagination)) - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/division-position/lib.go b/internal/use-case/main-use-case/division-position/lib.go index c59506c0..6106f478 100644 --- a/internal/use-case/main-use-case/division-position/lib.go +++ b/internal/use-case/main-use-case/division-position/lib.go @@ -65,7 +65,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index ad9de8ef..64c58004 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/doctor-fee/lib.go b/internal/use-case/main-use-case/doctor-fee/lib.go index ef4629f5..2f96d1ab 100644 --- a/internal/use-case/main-use-case/doctor-fee/lib.go +++ b/internal/use-case/main-use-case/doctor-fee/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Do Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/doctor/lib.go b/internal/use-case/main-use-case/doctor/lib.go index 4383c666..e642336d 100644 --- a/internal/use-case/main-use-case/doctor/lib.go +++ b/internal/use-case/main-use-case/doctor/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Do Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/emergency/lib.go b/internal/use-case/main-use-case/emergency/lib.go index 8657d96e..a1762d3e 100644 --- a/internal/use-case/main-use-case/emergency/lib.go +++ b/internal/use-case/main-use-case/emergency/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Em Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/employee/lib.go b/internal/use-case/main-use-case/employee/lib.go index 377fdfb8..594ce040 100644 --- a/internal/use-case/main-use-case/employee/lib.go +++ b/internal/use-case/main-use-case/employee/lib.go @@ -65,7 +65,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Em Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index e9b9bf9b..ae83c8c2 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/ethnic/lib.go b/internal/use-case/main-use-case/ethnic/lib.go index 96921640..353618ef 100644 --- a/internal/use-case/main-use-case/ethnic/lib.go +++ b/internal/use-case/main-use-case/ethnic/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Et Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index d4ec76d0..56e528fb 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/inpatient/lib.go b/internal/use-case/main-use-case/inpatient/lib.go index 134cc34a..f7b49d8a 100644 --- a/internal/use-case/main-use-case/inpatient/lib.go +++ b/internal/use-case/main-use-case/inpatient/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/installation/lib.go b/internal/use-case/main-use-case/installation/lib.go index 0cd9a6dc..5fa5bbf9 100644 --- a/internal/use-case/main-use-case/installation/lib.go +++ b/internal/use-case/main-use-case/installation/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/insurance-company/lib.go b/internal/use-case/main-use-case/insurance-company/lib.go index 15073715..95d004b5 100644 --- a/internal/use-case/main-use-case/insurance-company/lib.go +++ b/internal/use-case/main-use-case/insurance-company/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/item-price/lib.go b/internal/use-case/main-use-case/item-price/lib.go index 8d61f2f8..6e3a8d5c 100644 --- a/internal/use-case/main-use-case/item-price/lib.go +++ b/internal/use-case/main-use-case/item-price/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.It Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/item/lib.go b/internal/use-case/main-use-case/item/lib.go index b62e1c3a..ed1eb3b8 100644 --- a/internal/use-case/main-use-case/item/lib.go +++ b/internal/use-case/main-use-case/item/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.It Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/laborant/lib.go b/internal/use-case/main-use-case/laborant/lib.go index 9c1ee441..0802f601 100644 --- a/internal/use-case/main-use-case/laborant/lib.go +++ b/internal/use-case/main-use-case/laborant/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/language/lib.go b/internal/use-case/main-use-case/language/lib.go index 65a2ed08..d44689d4 100644 --- a/internal/use-case/main-use-case/language/lib.go +++ b/internal/use-case/main-use-case/language/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/material/lib.go b/internal/use-case/main-use-case/material/lib.go index f1a3f40b..c74f7b6c 100644 --- a/internal/use-case/main-use-case/material/lib.go +++ b/internal/use-case/main-use-case/material/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/mcu-src-category/lib.go b/internal/use-case/main-use-case/mcu-src-category/lib.go index d62184d1..aea54986 100644 --- a/internal/use-case/main-use-case/mcu-src-category/lib.go +++ b/internal/use-case/main-use-case/mcu-src-category/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/mcu-src/lib.go b/internal/use-case/main-use-case/mcu-src/lib.go index e7e76041..36a1a604 100644 --- a/internal/use-case/main-use-case/mcu-src/lib.go +++ b/internal/use-case/main-use-case/mcu-src/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/medical-action-src-item/lib.go b/internal/use-case/main-use-case/medical-action-src-item/lib.go index 02d81f6c..50f7cecd 100644 --- a/internal/use-case/main-use-case/medical-action-src-item/lib.go +++ b/internal/use-case/main-use-case/medical-action-src-item/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/medical-action-src/lib.go b/internal/use-case/main-use-case/medical-action-src/lib.go index 5bef2fca..1446b759 100644 --- a/internal/use-case/main-use-case/medical-action-src/lib.go +++ b/internal/use-case/main-use-case/medical-action-src/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/medicine-group/lib.go b/internal/use-case/main-use-case/medicine-group/lib.go index 6388544c..f4288b03 100644 --- a/internal/use-case/main-use-case/medicine-group/lib.go +++ b/internal/use-case/main-use-case/medicine-group/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/medicine-method/lib.go b/internal/use-case/main-use-case/medicine-method/lib.go index 8e11d043..828427bc 100644 --- a/internal/use-case/main-use-case/medicine-method/lib.go +++ b/internal/use-case/main-use-case/medicine-method/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/medicine-mix-item/lib.go b/internal/use-case/main-use-case/medicine-mix-item/lib.go index 3bea8e9c..fa85aab5 100644 --- a/internal/use-case/main-use-case/medicine-mix-item/lib.go +++ b/internal/use-case/main-use-case/medicine-mix-item/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/medicine-mix/lib.go b/internal/use-case/main-use-case/medicine-mix/lib.go index 2c20870c..6a2cf257 100644 --- a/internal/use-case/main-use-case/medicine-mix/lib.go +++ b/internal/use-case/main-use-case/medicine-mix/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/medicine/lib.go b/internal/use-case/main-use-case/medicine/lib.go index c7295e10..ce894baa 100644 --- a/internal/use-case/main-use-case/medicine/lib.go +++ b/internal/use-case/main-use-case/medicine/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/nurse/lib.go b/internal/use-case/main-use-case/nurse/lib.go index 723829b6..d3c48f60 100644 --- a/internal/use-case/main-use-case/nurse/lib.go +++ b/internal/use-case/main-use-case/nurse/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Nu Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/nutritionist/lib.go b/internal/use-case/main-use-case/nutritionist/lib.go index 211e3718..c9d219a3 100644 --- a/internal/use-case/main-use-case/nutritionist/lib.go +++ b/internal/use-case/main-use-case/nutritionist/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Nu Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index 539f6843..590e732e 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -67,7 +67,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pa Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/person-address/lib.go b/internal/use-case/main-use-case/person-address/lib.go index 0743f427..fa7484ad 100644 --- a/internal/use-case/main-use-case/person-address/lib.go +++ b/internal/use-case/main-use-case/person-address/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pe Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/person-contact/lib.go b/internal/use-case/main-use-case/person-contact/lib.go index 9e61bb59..18c78dd3 100644 --- a/internal/use-case/main-use-case/person-contact/lib.go +++ b/internal/use-case/main-use-case/person-contact/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pe Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/person-relative/lib.go b/internal/use-case/main-use-case/person-relative/lib.go index 872ad321..44a75cda 100644 --- a/internal/use-case/main-use-case/person-relative/lib.go +++ b/internal/use-case/main-use-case/person-relative/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pe Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/person/lib.go b/internal/use-case/main-use-case/person/lib.go index 17380cb2..42703287 100644 --- a/internal/use-case/main-use-case/person/lib.go +++ b/internal/use-case/main-use-case/person/lib.go @@ -67,7 +67,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pe Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/pharmacist/lib.go b/internal/use-case/main-use-case/pharmacist/lib.go index fb6d5168..5559be6c 100644 --- a/internal/use-case/main-use-case/pharmacist/lib.go +++ b/internal/use-case/main-use-case/pharmacist/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ph Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/pharmacy-company/lib.go b/internal/use-case/main-use-case/pharmacy-company/lib.go index f4eca38e..3fca529a 100644 --- a/internal/use-case/main-use-case/pharmacy-company/lib.go +++ b/internal/use-case/main-use-case/pharmacy-company/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ph Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/practice-schedule/lib.go b/internal/use-case/main-use-case/practice-schedule/lib.go index 1d5e34ac..ae494b9d 100644 --- a/internal/use-case/main-use-case/practice-schedule/lib.go +++ b/internal/use-case/main-use-case/practice-schedule/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/procedure-src/lib.go b/internal/use-case/main-use-case/procedure-src/lib.go index b1b1b01f..501315ea 100644 --- a/internal/use-case/main-use-case/procedure-src/lib.go +++ b/internal/use-case/main-use-case/procedure-src/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index b84db301..5b8b4b33 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -57,7 +57,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr Count(&count). Scopes(gh.Paginate(input, &pagination)) - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/regency/lib.go b/internal/use-case/main-use-case/regency/lib.go index c098aabd..21433f6b 100644 --- a/internal/use-case/main-use-case/regency/lib.go +++ b/internal/use-case/main-use-case/regency/lib.go @@ -57,7 +57,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Re Count(&count). Scopes(gh.Paginate(input, &pagination)) - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/room/lib.go b/internal/use-case/main-use-case/room/lib.go index f8943263..df416fa1 100644 --- a/internal/use-case/main-use-case/room/lib.go +++ b/internal/use-case/main-use-case/room/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ro Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/sbar/lib.go b/internal/use-case/main-use-case/sbar/lib.go index 0bc9feb9..4151d276 100644 --- a/internal/use-case/main-use-case/sbar/lib.go +++ b/internal/use-case/main-use-case/sbar/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sb Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/soapi/lib.go b/internal/use-case/main-use-case/soapi/lib.go index 288e7dae..bc848678 100644 --- a/internal/use-case/main-use-case/soapi/lib.go +++ b/internal/use-case/main-use-case/soapi/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.So Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/specialist-intern/lib.go b/internal/use-case/main-use-case/specialist-intern/lib.go index 81c0f0a9..81590bc3 100644 --- a/internal/use-case/main-use-case/specialist-intern/lib.go +++ b/internal/use-case/main-use-case/specialist-intern/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/specialist/lib.go b/internal/use-case/main-use-case/specialist/lib.go index 5d31ea56..206682e0 100644 --- a/internal/use-case/main-use-case/specialist/lib.go +++ b/internal/use-case/main-use-case/specialist/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/subspecialist/lib.go b/internal/use-case/main-use-case/subspecialist/lib.go index 49c87685..5d879b1e 100644 --- a/internal/use-case/main-use-case/subspecialist/lib.go +++ b/internal/use-case/main-use-case/subspecialist/lib.go @@ -64,7 +64,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Su Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/unit/lib.go b/internal/use-case/main-use-case/unit/lib.go index f43530dc..9be91f11 100644 --- a/internal/use-case/main-use-case/unit/lib.go +++ b/internal/use-case/main-use-case/unit/lib.go @@ -65,7 +65,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/uom/lib.go b/internal/use-case/main-use-case/uom/lib.go index 655be4cd..0cbc85e0 100644 --- a/internal/use-case/main-use-case/uom/lib.go +++ b/internal/use-case/main-use-case/uom/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Uo Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/user/lib.go b/internal/use-case/main-use-case/user/lib.go index 0af63c75..e857e9b3 100644 --- a/internal/use-case/main-use-case/user/lib.go +++ b/internal/use-case/main-use-case/user/lib.go @@ -58,7 +58,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Us Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/village/lib.go b/internal/use-case/main-use-case/village/lib.go index c67f3ac4..2e7dd2da 100644 --- a/internal/use-case/main-use-case/village/lib.go +++ b/internal/use-case/main-use-case/village/lib.go @@ -57,7 +57,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Vi Count(&count). Scopes(gh.Paginate(input, &pagination)) - if err := tx.Debug().Find(&data).Error; err != nil { + if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { return nil, &meta, nil } From 61cb32afcc17c11dd5a4ac4f5ae7d6b8788ad735 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 9 Sep 2025 13:50:37 +0700 Subject: [PATCH 016/190] adjust adime and sbar case --- internal/domain/main-entities/adime/dto.go | 6 ++++- internal/domain/main-entities/sbar/dto.go | 6 ++++- .../interface/main-handler/adime/handler.go | 9 ++++++++ .../interface/main-handler/sbar/handler.go | 9 ++++++++ internal/use-case/main-use-case/adime/case.go | 22 ++++++++++++++++++- internal/use-case/main-use-case/sbar/case.go | 22 ++++++++++++++++++- 6 files changed, 70 insertions(+), 4 deletions(-) diff --git a/internal/domain/main-entities/adime/dto.go b/internal/domain/main-entities/adime/dto.go index b11ba182..39c48ab7 100644 --- a/internal/domain/main-entities/adime/dto.go +++ b/internal/domain/main-entities/adime/dto.go @@ -4,14 +4,18 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" eem "simrs-vx/internal/domain/main-entities/employee" ee "simrs-vx/internal/domain/main-entities/encounter" + + pa "simrs-vx/pkg/auth-helper" "time" ) type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` - Employee_Id *uint `json:"employee_id"` + Employee_Id *uint `json:"-"` Time *time.Time `json:"time"` Value *string `json:"value"` + + pa.AuthInfo } type ReadListDto struct { diff --git a/internal/domain/main-entities/sbar/dto.go b/internal/domain/main-entities/sbar/dto.go index d3c08f21..edba338c 100644 --- a/internal/domain/main-entities/sbar/dto.go +++ b/internal/domain/main-entities/sbar/dto.go @@ -4,14 +4,18 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" eem "simrs-vx/internal/domain/main-entities/employee" ee "simrs-vx/internal/domain/main-entities/encounter" + + pa "simrs-vx/pkg/auth-helper" "time" ) type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` - Employee_Id *uint `json:"employee_id"` + Employee_Id *uint `json:"-"` Time *time.Time `json:"time"` Value *string `json:"value"` + + pa.AuthInfo } type ReadListDto struct { diff --git a/internal/interface/main-handler/adime/handler.go b/internal/interface/main-handler/adime/handler.go index 929081c7..9eabb0af 100644 --- a/internal/interface/main-handler/adime/handler.go +++ b/internal/interface/main-handler/adime/handler.go @@ -10,6 +10,10 @@ import ( e "simrs-vx/internal/domain/main-entities/adime" u "simrs-vx/internal/use-case/main-use-case/adime" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -17,10 +21,15 @@ type myBase struct{} var O myBase func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } dto := e.CreateDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + dto.AuthInfo = *authInfo res, err := u.Create(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/sbar/handler.go b/internal/interface/main-handler/sbar/handler.go index c67b25a0..7fac1e00 100644 --- a/internal/interface/main-handler/sbar/handler.go +++ b/internal/interface/main-handler/sbar/handler.go @@ -10,6 +10,10 @@ import ( e "simrs-vx/internal/domain/main-entities/sbar" u "simrs-vx/internal/use-case/main-use-case/sbar" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -17,10 +21,15 @@ type myBase struct{} var O myBase func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } dto := e.CreateDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + dto.AuthInfo = *authInfo res, err := u.Create(dto) rw.DataResponse(w, res, err) } diff --git a/internal/use-case/main-use-case/adime/case.go b/internal/use-case/main-use-case/adime/case.go index 3a3656a8..3a4c4496 100644 --- a/internal/use-case/main-use-case/adime/case.go +++ b/internal/use-case/main-use-case/adime/case.go @@ -1,9 +1,14 @@ package adime import ( - e "simrs-vx/internal/domain/main-entities/adime" + "errors" "strconv" + e "simrs-vx/internal/domain/main-entities/adime" + ee "simrs-vx/internal/domain/main-entities/employee" + + ue "simrs-vx/internal/use-case/main-use-case/employee" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -34,6 +39,21 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if !input.AuthInfo.IsDoctor() && !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) + } + + employee, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &input.AuthInfo.User_Id}, &event, tx) + if err != nil { + return err + } + input.Employee_Id = &employee.Id if resData, err := CreateData(input, &event, tx); err != nil { return err } else { diff --git a/internal/use-case/main-use-case/sbar/case.go b/internal/use-case/main-use-case/sbar/case.go index dfa36f72..3606bae4 100644 --- a/internal/use-case/main-use-case/sbar/case.go +++ b/internal/use-case/main-use-case/sbar/case.go @@ -1,9 +1,14 @@ package sbar import ( - e "simrs-vx/internal/domain/main-entities/sbar" + "errors" "strconv" + ee "simrs-vx/internal/domain/main-entities/employee" + e "simrs-vx/internal/domain/main-entities/sbar" + + ue "simrs-vx/internal/use-case/main-use-case/employee" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -34,6 +39,21 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if !input.AuthInfo.IsDoctor() && !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) + } + + employee, err := ue.ReadDetailData(ee.ReadDetailDto{User_Id: &input.AuthInfo.User_Id}, &event, tx) + if err != nil { + return err + } + input.Employee_Id = &employee.Id if resData, err := CreateData(input, &event, tx); err != nil { return err } else { From 9cd19f4783c55cef99e4d5486645c5372add7822 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 9 Sep 2025 13:50:57 +0700 Subject: [PATCH 017/190] tidy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index da8ef314..c7e8a5fc 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/karincake/lepet v0.0.1 github.com/karincake/risoles v0.0.3 github.com/karincake/semprit v0.0.3 + github.com/karincake/serabi v0.0.14 github.com/rs/zerolog v1.33.0 golang.org/x/crypto v0.41.0 gorm.io/driver/postgres v1.5.11 @@ -34,7 +35,6 @@ require ( github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/karincake/serabi v0.0.14 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-sqlite3 v1.14.28 // indirect From 62c41be875f4f03fe69b60c7f99a2192c213609f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 9 Sep 2025 13:57:47 +0700 Subject: [PATCH 018/190] add auth for sbar and adime --- internal/interface/main-handler/main-handler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 553f2ac0..5c9559f4 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -129,8 +129,8 @@ func SetRoutes() http.Handler { }) hc.RegCrud(r, "/v1/soapi", auth.GuardMW, soapi.O) - hc.RegCrud(r, "/v1/adime", adime.O) - hc.RegCrud(r, "/v1/sbar", sbar.O) + hc.RegCrud(r, "/v1/adime", auth.GuardMW, adime.O) + hc.RegCrud(r, "/v1/sbar", auth.GuardMW, sbar.O) hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) hc.RegCrud(r, "/v1/person-contact", personcontact.O) From 528de44a92bd6316a23268de35d978d643b73449 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 10 Sep 2025 12:56:13 +0700 Subject: [PATCH 019/190] feat (encounter): update wip --- .../domain/references/clinical/clinical.go | 37 +++++++++++++++++++ .../main-use-case/encounter/helper.go | 9 +++++ .../use-case/main-use-case/encounter/lib.go | 2 +- 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index e5c85682..b7709333 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -40,3 +40,40 @@ const ( ICMedication InstructionCode = "medication" // Obat ICMaterial InstructionCode = "material" // BMHP ) + +type Soapi struct { + // Subject + PrimaryComplaint string `json:"pri-compl"` + SecondaryComplaint string `json:"sec-compl"` + CurrentDiseaseHistory string `json:"cur-disea-hist"` + PastDiseaseHistory string `json:"pas-disea-hist"` + FamilyDiseaseHistory string `json:"fam-disea-hist"` + AllergyHistory string `json:"alg-hist"` + AllergyReaction string `json:"alg-react"` + MedicationHistory string `json:"med-hist"` + + // Object + ConsciousnessLevel string `json:"consc-level"` + ConsciousnessLevelDet string `json:"consc-level-det"` + SystolicBloodPressure string `json:"syst-bp"` + DiastolicBloodPressure string `json:"diast-bp"` + HeartRate string `json:"hear-rt"` + Temperature string `json:"temp"` + SpO2 string `json:"spo2"` + Weight string `json:"weight"` + Height string `json:"height"` + + // Assessment + EarlyDiagnosis string `json:"early-diag"` + LateDiagnosis string `json:"late-diag"` + SecondaryDiag string `json:"sec-diag"` + + // Plan + Plan string `json:"plan"` + + // Instruction + InstructionDetail string `json:"detail"` + MedicalAction string `json:"med-act"` + Medication string `json:"medication"` + Material string `json:"material"` +} diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 3e7e4b30..4a24900b 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -37,6 +37,15 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { data.Appointment_Id = inputSrc.Appointment_Id } +func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { + dst.Appointment_Doctor_Id = src.Appointment_Doctor_Id + dst.Responsible_Doctor_Id = src.Responsible_Doctor_Id + dst.Unit_Id = src.Unit_Id + dst.Specialist_Id = src.Specialist_Id + dst.Subspecialist_Id = src.Subspecialist_Id + dst.VisitDate = src.VisitDate +} + func setDataDischarge(src e.DischargeDto, dst *e.Encounter) { dst.DischargeMethod_Code = src.DischargeMethod_Code dst.EarlyEducation = src.EarlyEducation diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index ae83c8c2..a0aaa94b 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -108,7 +108,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e func UpdateData(input e.UpdateDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - setData(&input, data) + setDataUpdate(input, data) var tx *gorm.DB if len(dbx) > 0 { From 2ed11fe5e58015bfe386ad0b0de1f05076672ad4 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 10 Sep 2025 12:59:28 +0700 Subject: [PATCH 020/190] add status code in encounter --- cmd/migration/migrations/20250910055902.sql | 2 ++ cmd/migration/migrations/atlas.sum | 7 ++++--- internal/domain/main-entities/encounter/entity.go | 2 ++ 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 cmd/migration/migrations/20250910055902.sql diff --git a/cmd/migration/migrations/20250910055902.sql b/cmd/migration/migrations/20250910055902.sql new file mode 100644 index 00000000..19583065 --- /dev/null +++ b/cmd/migration/migrations/20250910055902.sql @@ -0,0 +1,2 @@ +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" ADD COLUMN "Status_Code" character varying(10) NULL; diff --git a/cmd/migration/migrations/atlas.sum b/cmd/migration/migrations/atlas.sum index a10148d8..28fa58f4 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/migration/migrations/atlas.sum @@ -1,7 +1,8 @@ -h1:RfbV0C/2ANkgOZBCktEsNtRWKc2wWB6mQfjC2ftWhgc= +h1:dw8c/C5xz/Do+p93EVuqfaZWYja1GO1VsbM7vuCJYGo= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= 20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:UVLw6aJd4hnR1XRab6qew57gj2bqzwyCBP/fDRXbncc= -20250908073839.sql h1:2hBQEuCbIUHi4ybSefQG2ODbROOrlNDz1JwR0ElfFTU= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:fnLqf63sb0R02rzoj1Gnncp32NW/bUcBAMLyV4qF968= diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 0fde85e3..bb3b3e90 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -8,6 +8,7 @@ import ( es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" + erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" "time" ) @@ -37,4 +38,5 @@ type Encounter struct { MedicalDischargeEducation *string `json:"medicalDischargeEducation"` AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:10"` } From 266b96dd7351a3c4d8c07dcbc9b2902e1ca44dc7 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 10 Sep 2025 13:11:18 +0700 Subject: [PATCH 021/190] feat (encounter): handle status --- .../domain/main-entities/encounter/dto.go | 3 +++ .../domain/main-entities/encounter/entity.go | 4 ++++ .../use-case/main-use-case/encounter/case.go | 19 +++++++++++++++++++ .../main-use-case/encounter/helper.go | 3 +++ 4 files changed, 29 insertions(+) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 32472324..a431ad4e 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -8,6 +8,7 @@ import ( es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" + erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" "time" ) @@ -110,6 +111,7 @@ type ResponseDto struct { MedicalDischargeEducation *string `json:"medicalDischargeEducation"` AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` + Status_Code erc.DataStatusCode `json:"status_code"` } func (d Encounter) ToResponse() ResponseDto { @@ -137,6 +139,7 @@ func (d Encounter) ToResponse() ResponseDto { MedicalDischargeEducation: d.MedicalDischargeEducation, AdmDischargeEducation: d.AdmDischargeEducation, DischargeReason: d.DischargeReason, + Status_Code: d.Status_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index bb3b3e90..0a685611 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -40,3 +40,7 @@ type Encounter struct { DischargeReason *string `json:"dischargeReason"` Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:10"` } + +func (d Encounter) IsDone() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 0101f38d..ed8fa816 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -242,6 +242,16 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } + if data.IsDone() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "encounter is done", + Raw: errors.New("encounter is done"), + } + return pl.SetLogError(&event, input) + } + mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) // Run pre-middleware @@ -352,6 +362,15 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { return err } + if data.IsDone() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "encounter is done", + Raw: errors.New("encounter is done"), + } + return pl.SetLogError(&event, input) + } if err := checkSoapiByDocExists(data.Id, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 4a24900b..b40783b7 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -10,6 +10,7 @@ import ( es "simrs-vx/internal/domain/main-entities/soapi" pl "simrs-vx/pkg/logger" + erc "simrs-vx/internal/domain/references/common" ero "simrs-vx/internal/domain/references/organization" "gorm.io/gorm" @@ -35,6 +36,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { data.Responsible_Doctor_Id = inputSrc.Responsible_Doctor_Id data.RefSource_Name = inputSrc.RefSource_Name data.Appointment_Id = inputSrc.Appointment_Id + data.Status_Code = erc.DSCNew } func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { @@ -52,6 +54,7 @@ func setDataDischarge(src e.DischargeDto, dst *e.Encounter) { dst.MedicalDischargeEducation = src.MedicalDischargeEducation dst.AdmDischargeEducation = src.AdmDischargeEducation dst.DischargeReason = src.DischargeReason + dst.Status_Code = erc.DSCDone } func checkSoapiByDocExists(encounter_id uint, event *pl.Event, tx *gorm.DB) error { From 96a2ae9251bd7b8ab9300a8aa45d997a5c2196ca Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 11 Sep 2025 12:19:06 +0700 Subject: [PATCH 022/190] initiate multi db config --- cmd/main-api/config.yml-example | 18 +++++++--- go.mod | 2 ++ internal/infra/ss-db/ss-db.go | 33 ++----------------- internal/infra/ss-db/tycovar.go | 10 +----- .../interface/main-handler/main-handler.go | 2 +- 5 files changed, 20 insertions(+), 45 deletions(-) diff --git a/cmd/main-api/config.yml-example b/cmd/main-api/config.yml-example index aaf986f0..f131a725 100644 --- a/cmd/main-api/config.yml-example +++ b/cmd/main-api/config.yml-example @@ -15,11 +15,19 @@ dbCfg: maxIdleConns: 5 maxIdleTime: 100 -ssDbCfg: - dsn: - maxOpenConns: 5 - maxIdleConns: 5 - maxIdleTime: 100 +multiDbCfg: + - dbs : + name: + dsn: + maxOpenConns: + maxIdleConns: + maxIdleTime: + - bpjs + name: bpjs + dsn: + maxOpenConns: + maxIdleConns: + maxIdleTime: loggerCfg: hideTime: diff --git a/go.mod b/go.mod index da8ef314..f85c51cf 100644 --- a/go.mod +++ b/go.mod @@ -49,3 +49,5 @@ require ( gorm.io/driver/sqlite v1.5.7 // indirect gorm.io/driver/sqlserver v1.5.4 // indirect ) + +replace github.com/karincake/apem => D:\Kuli\Sabbi\external\apem \ No newline at end of file diff --git a/internal/infra/ss-db/ss-db.go b/internal/infra/ss-db/ss-db.go index 3c239540..ac9c13ee 100644 --- a/internal/infra/ss-db/ss-db.go +++ b/internal/infra/ss-db/ss-db.go @@ -1,36 +1,9 @@ package ssdb import ( - "log" - - a "github.com/karincake/apem" - lo "github.com/karincake/apem/loggero" - "gorm.io/driver/postgres" - "gorm.io/gorm" - "gorm.io/gorm/schema" + dg "github.com/karincake/apem/db-gorm-pg" ) -func Init() { - SetConfig() - NewInstance() -} - -func SetConfig() { - a.ParseSingleCfg(&Cfg) -} - -func NewInstance() { - // create database connection - db, err := gorm.Open(postgres.Open(Cfg.Dsn), &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - NoLowerCase: true, - }, - }) - if err != nil { - log.Fatal(err) - } - - SSDb = db - lo.I.Println("Instantiation for satu-sehat database-connetion using db-gorm-pg, status: DONE!!") +func SetInstance() { + I = dg.IS["satu-sehat"] } diff --git a/internal/infra/ss-db/tycovar.go b/internal/infra/ss-db/tycovar.go index ff084508..55fc90fd 100644 --- a/internal/infra/ss-db/tycovar.go +++ b/internal/infra/ss-db/tycovar.go @@ -2,12 +2,4 @@ package ssdb import "gorm.io/gorm" -type SsDbCfg struct { - Dsn string - MaxOpenConns int `yaml:"maxOpenConns"` - MaxIdleConns int `yaml:"maxIdleConns"` - MaxIdleTime int `yaml:"maxIdleTime"` -} - -var Cfg SsDbCfg = SsDbCfg{} -var SSDb *gorm.DB +var I *gorm.DB diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 476dacc7..5ef7d2c4 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -80,7 +80,7 @@ func SetRoutes() http.Handler { ///// a.RegisterExtCall(gs.Adjust) a.RegisterExtCall(zlc.Adjust) - a.RegisterExtCall(ssdb.Init) + a.RegisterExtCall(ssdb.SetInstance) a.RegisterExtCall(lh.Populate) a.RegisterExtCall(validation.RegisterValidation) From 7ab845d79ddebed20f1fad65c484f0b5f8c555b3 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 11 Sep 2025 13:02:57 +0700 Subject: [PATCH 023/190] handle ss migration, tested --- cmd/main-migration/atlas.hcl | 22 +++ .../atlas.hcl.example | 0 .../config.yml-example | 0 .../migration.go | 2 +- .../migrations/20250904105930.sql | 0 .../migrations/20250904141448.sql | 0 .../migrations/20250908062237.sql | 0 .../migrations/20250908062323.sql | 0 .../migrations/20250908073811.sql | 0 .../migrations/20250908073839.sql | 0 .../migrations/20250910055902.sql | 0 .../migrations/atlas.sum | 4 +- cmd/satusehat-migration/atlas.hcl | 22 +++ cmd/satusehat-migration/atlas.hcl.example | 22 +++ cmd/satusehat-migration/config.yml-example | 47 ++++++ cmd/satusehat-migration/migration.go | 9 ++ .../migrations/20250911060006.sql | 9 ++ cmd/satusehat-migration/migrations/atlas.sum | 2 + go.mod | 6 +- go.sum | 4 +- .../satusehat-entities/patient/entity.go | 92 ++++++++++++ internal/infra/ss-db/ss-db.go | 32 +--- internal/infra/ss-db/tycovar.go | 10 +- .../interface/main-handler/main-handler.go | 2 +- internal/interface/migration/main-entities.go | 121 +++++++++++++++ internal/interface/migration/migration.go | 140 ++---------------- .../interface/migration/satusehat-entities.go | 11 ++ internal/interface/migration/tycovar.go | 7 + 28 files changed, 388 insertions(+), 176 deletions(-) create mode 100644 cmd/main-migration/atlas.hcl rename cmd/{migration => main-migration}/atlas.hcl.example (100%) rename cmd/{migration => main-migration}/config.yml-example (100%) rename cmd/{migration => main-migration}/migration.go (81%) rename cmd/{migration => main-migration}/migrations/20250904105930.sql (100%) rename cmd/{migration => main-migration}/migrations/20250904141448.sql (100%) rename cmd/{migration => main-migration}/migrations/20250908062237.sql (100%) rename cmd/{migration => main-migration}/migrations/20250908062323.sql (100%) rename cmd/{migration => main-migration}/migrations/20250908073811.sql (100%) rename cmd/{migration => main-migration}/migrations/20250908073839.sql (100%) rename cmd/{migration => main-migration}/migrations/20250910055902.sql (100%) rename cmd/{migration => main-migration}/migrations/atlas.sum (77%) create mode 100644 cmd/satusehat-migration/atlas.hcl create mode 100644 cmd/satusehat-migration/atlas.hcl.example create mode 100644 cmd/satusehat-migration/config.yml-example create mode 100644 cmd/satusehat-migration/migration.go create mode 100644 cmd/satusehat-migration/migrations/20250911060006.sql create mode 100644 cmd/satusehat-migration/migrations/atlas.sum create mode 100644 internal/domain/satusehat-entities/patient/entity.go create mode 100644 internal/interface/migration/main-entities.go create mode 100644 internal/interface/migration/satusehat-entities.go create mode 100644 internal/interface/migration/tycovar.go diff --git a/cmd/main-migration/atlas.hcl b/cmd/main-migration/atlas.hcl new file mode 100644 index 00000000..3372fb2d --- /dev/null +++ b/cmd/main-migration/atlas.hcl @@ -0,0 +1,22 @@ +data "external_schema" "gorm" { + program = [ + "go", + "run", + "-mod=mod", + ".", + ] +} + +env "gorm" { + src = data.external_schema.gorm.url + dev = "postgres://moko:password@localhost:5432/simrs_vx3?sslmode=disable" + migration { + dir = "file://migrations" + } + url = "postgres://moko:password@localhost:5432/simrs_vx1?sslmode=disable" + format { + migrate { + diff = "{{ sql . \" \" }}" + } + } +} \ No newline at end of file diff --git a/cmd/migration/atlas.hcl.example b/cmd/main-migration/atlas.hcl.example similarity index 100% rename from cmd/migration/atlas.hcl.example rename to cmd/main-migration/atlas.hcl.example diff --git a/cmd/migration/config.yml-example b/cmd/main-migration/config.yml-example similarity index 100% rename from cmd/migration/config.yml-example rename to cmd/main-migration/config.yml-example diff --git a/cmd/migration/migration.go b/cmd/main-migration/migration.go similarity index 81% rename from cmd/migration/migration.go rename to cmd/main-migration/migration.go index c225edf1..dd28a55f 100644 --- a/cmd/migration/migration.go +++ b/cmd/main-migration/migration.go @@ -5,5 +5,5 @@ import ( ) func main() { - m.Migrate() + m.Migrate(m.Main) } diff --git a/cmd/migration/migrations/20250904105930.sql b/cmd/main-migration/migrations/20250904105930.sql similarity index 100% rename from cmd/migration/migrations/20250904105930.sql rename to cmd/main-migration/migrations/20250904105930.sql diff --git a/cmd/migration/migrations/20250904141448.sql b/cmd/main-migration/migrations/20250904141448.sql similarity index 100% rename from cmd/migration/migrations/20250904141448.sql rename to cmd/main-migration/migrations/20250904141448.sql diff --git a/cmd/migration/migrations/20250908062237.sql b/cmd/main-migration/migrations/20250908062237.sql similarity index 100% rename from cmd/migration/migrations/20250908062237.sql rename to cmd/main-migration/migrations/20250908062237.sql diff --git a/cmd/migration/migrations/20250908062323.sql b/cmd/main-migration/migrations/20250908062323.sql similarity index 100% rename from cmd/migration/migrations/20250908062323.sql rename to cmd/main-migration/migrations/20250908062323.sql diff --git a/cmd/migration/migrations/20250908073811.sql b/cmd/main-migration/migrations/20250908073811.sql similarity index 100% rename from cmd/migration/migrations/20250908073811.sql rename to cmd/main-migration/migrations/20250908073811.sql diff --git a/cmd/migration/migrations/20250908073839.sql b/cmd/main-migration/migrations/20250908073839.sql similarity index 100% rename from cmd/migration/migrations/20250908073839.sql rename to cmd/main-migration/migrations/20250908073839.sql diff --git a/cmd/migration/migrations/20250910055902.sql b/cmd/main-migration/migrations/20250910055902.sql similarity index 100% rename from cmd/migration/migrations/20250910055902.sql rename to cmd/main-migration/migrations/20250910055902.sql diff --git a/cmd/migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum similarity index 77% rename from cmd/migration/migrations/atlas.sum rename to cmd/main-migration/migrations/atlas.sum index 28fa58f4..3482f994 100644 --- a/cmd/migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,8 +1,8 @@ -h1:dw8c/C5xz/Do+p93EVuqfaZWYja1GO1VsbM7vuCJYGo= +h1:BLtMDgAdnqZbCj3HUbiTlyYtA87C4LcP/uquCbM6GSE= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= 20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= 20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= 20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:fnLqf63sb0R02rzoj1Gnncp32NW/bUcBAMLyV4qF968= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= diff --git a/cmd/satusehat-migration/atlas.hcl b/cmd/satusehat-migration/atlas.hcl new file mode 100644 index 00000000..5efd3e80 --- /dev/null +++ b/cmd/satusehat-migration/atlas.hcl @@ -0,0 +1,22 @@ +data "external_schema" "gorm" { + program = [ + "go", + "run", + "-mod=mod", + ".", + ] +} + +env "gorm" { + src = data.external_schema.gorm.url + dev = "postgres://moko:password@localhost:5432/satusehat_diff?sslmode=disable" + migration { + dir = "file://migrations" + } + url = "postgres://moko:password@localhost:5432/satusehat_main?sslmode=disable" + format { + migrate { + diff = "{{ sql . \" \" }}" + } + } +} \ No newline at end of file diff --git a/cmd/satusehat-migration/atlas.hcl.example b/cmd/satusehat-migration/atlas.hcl.example new file mode 100644 index 00000000..857d1352 --- /dev/null +++ b/cmd/satusehat-migration/atlas.hcl.example @@ -0,0 +1,22 @@ +data "external_schema" "gorm" { + program = [ + "go", + "run", + "-mod=mod", + ".", + ] +} + +env "gorm" { + src = data.external_schema.gorm.url + dev = "" // dsn db to check the diff + migration { + dir = "file://migrations" + } + url = "" // dsn db to apply + format { + migrate { + diff = "{{ sql . \" \" }}" + } + } +} \ No newline at end of file diff --git a/cmd/satusehat-migration/config.yml-example b/cmd/satusehat-migration/config.yml-example new file mode 100644 index 00000000..19893fd7 --- /dev/null +++ b/cmd/satusehat-migration/config.yml-example @@ -0,0 +1,47 @@ +appCfg: + fullName: BPJS Bridge + codeName: simrs-vx + version: 0.1.0 + env: development + lang: en + +httpCfg: + host: + port: + +dbCfg: + dsn: + maxOpenConns: 5 + maxIdleConns: 5 + maxIdleTime: 100 + +loggerCfg: + hideTime: + hideLevel: + +msCfg: + dsn: + +langCfg: + active: + path: + fileName: + +minioCfg: + endpoint: + region: + accessKey: + secretKey: + useSsl: + bucketName: + - patient + +corsCfg: + allowedOrigin: + allowedMethod: + +satuSehatCfg: + host: localhsot:8200 + +bpjsCfg: + host: localhsot:8200 diff --git a/cmd/satusehat-migration/migration.go b/cmd/satusehat-migration/migration.go new file mode 100644 index 00000000..e426633e --- /dev/null +++ b/cmd/satusehat-migration/migration.go @@ -0,0 +1,9 @@ +package main + +import ( + m "simrs-vx/internal/interface/migration" +) + +func main() { + m.Migrate(m.SatuSehat) +} diff --git a/cmd/satusehat-migration/migrations/20250911060006.sql b/cmd/satusehat-migration/migrations/20250911060006.sql new file mode 100644 index 00000000..b1671f9a --- /dev/null +++ b/cmd/satusehat-migration/migrations/20250911060006.sql @@ -0,0 +1,9 @@ +-- Create "Patient" table +CREATE TABLE "public"."Patient" ( + "ResourceType" text NULL, + "Active" boolean NULL, + "Gender" text NULL, + "BirthDate" text NULL, + "DeceasedBool" boolean NULL, + "MultipleBirthInteger" bigint NULL +); diff --git a/cmd/satusehat-migration/migrations/atlas.sum b/cmd/satusehat-migration/migrations/atlas.sum new file mode 100644 index 00000000..d8f010f3 --- /dev/null +++ b/cmd/satusehat-migration/migrations/atlas.sum @@ -0,0 +1,2 @@ +h1:dPpFMJ+ZSlHizKRHShYcjJZJNZXi4UuZXZUHME8zPb4= +20250911060006.sql h1:G3YiyY/tCTZijQWqyvyDAaMVCFkhh/gD3v/1gz/eBb8= diff --git a/go.mod b/go.mod index da8ef314..e717f960 100644 --- a/go.mod +++ b/go.mod @@ -8,16 +8,16 @@ require ( ariga.io/atlas-provider-gorm v0.5.6 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.6.0 - github.com/karincake/apem v0.0.16-h + github.com/karincake/apem v0.0.17 github.com/karincake/dodol v0.0.1 github.com/karincake/getuk v0.1.0 github.com/karincake/hongkue v0.0.4 github.com/karincake/lepet v0.0.1 github.com/karincake/risoles v0.0.3 github.com/karincake/semprit v0.0.3 + github.com/karincake/serabi v0.0.14 github.com/rs/zerolog v1.33.0 golang.org/x/crypto v0.41.0 - gorm.io/driver/postgres v1.5.11 gorm.io/gorm v1.25.12 ) @@ -34,7 +34,6 @@ require ( github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect - github.com/karincake/serabi v0.0.14 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-sqlite3 v1.14.28 // indirect @@ -46,6 +45,7 @@ require ( golang.org/x/text v0.28.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect gorm.io/driver/mysql v1.5.7 // indirect + gorm.io/driver/postgres v1.5.11 // indirect gorm.io/driver/sqlite v1.5.7 // indirect gorm.io/driver/sqlserver v1.5.4 // indirect ) diff --git a/go.sum b/go.sum index 8982eb2b..3045e095 100644 --- a/go.sum +++ b/go.sum @@ -69,8 +69,8 @@ github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ= github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/karincake/apem v0.0.16-h h1:rfO444oDG4cWFf0PjUshA+0U8KI/u067Va273WeJhpU= -github.com/karincake/apem v0.0.16-h/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM= +github.com/karincake/apem v0.0.17 h1:y3WXCr9GWLFFFH4Qyq/VWlWWpijHh5zpTc3Lm96twa4= +github.com/karincake/apem v0.0.17/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM= github.com/karincake/dodol v0.0.1 h1:jUXmJh1r0Ei4fmHPZ6IUkoplW/V9d27L63JEl6zudL0= github.com/karincake/dodol v0.0.1/go.mod h1:2f1NcvkvY0J3GMUkwILNDYVvRUpz0W3lpPp/Ha/Ld24= github.com/karincake/getuk v0.1.0 h1:jcIsASrr0UDE528GN7Ua6n9UFyRgUypsWh8Or8wzCO0= diff --git a/internal/domain/satusehat-entities/patient/entity.go b/internal/domain/satusehat-entities/patient/entity.go new file mode 100644 index 00000000..12efaa93 --- /dev/null +++ b/internal/domain/satusehat-entities/patient/entity.go @@ -0,0 +1,92 @@ +package patient + +type Patient struct { + ResourceType string `json:"resourceType"` + // Meta Meta `json:"meta"` + // Identifier []Identifier `json:"identifier"` + Active bool `json:"active"` + // Name []HumanName `json:"name"` + // Telecom []ContactPoint `json:"telecom"` + Gender string `json:"gender"` + BirthDate string `json:"birthDate"` + DeceasedBool bool `json:"deceasedBoolean"` + // Address []Address `json:"address"` + // MaritalStatus MaritalStatus `json:"maritalStatus"` + MultipleBirthInteger int `json:"multipleBirthInteger"` + // Contact []Contact `json:"contact"` + // Communication []Communication `json:"communication"` + // Extension []Extension `json:"extension"` +} + +type Meta struct { + Profile []string `json:"profile"` +} + +type Identifier struct { + Use string `json:"use"` + System string `json:"system"` + Value string `json:"value"` +} + +type HumanName struct { + Use string `json:"use"` + Text string `json:"text"` +} + +type ContactPoint struct { + System string `json:"system"` + Value string `json:"value"` + Use string `json:"use"` +} + +type Address struct { + Use string `json:"use"` + Line []string `json:"line"` + City string `json:"city"` + PostalCode string `json:"postalCode"` + Country string `json:"country"` + Extension []Extension `json:"extension"` +} + +type Extension struct { + URL string `json:"url"` + Extension []SubExtension `json:"extension,omitempty"` + ValueCode string `json:"valueCode,omitempty"` + ValueAddress *Address `json:"valueAddress,omitempty"` +} + +type SubExtension struct { + URL string `json:"url"` + ValueCode string `json:"valueCode"` +} + +type MaritalStatus struct { + Coding []Coding `json:"coding"` + Text string `json:"text"` +} + +type Coding struct { + System string `json:"system"` + Code string `json:"code"` + Display string `json:"display,omitempty"` +} + +type Contact struct { + Relationship []Relationship `json:"relationship"` + Name HumanName `json:"name"` + Telecom []ContactPoint `json:"telecom"` +} + +type Relationship struct { + Coding []Coding `json:"coding"` +} + +type Communication struct { + Language Language `json:"language"` + Preferred bool `json:"preferred"` +} + +type Language struct { + Coding []Coding `json:"coding"` + Text string `json:"text"` +} diff --git a/internal/infra/ss-db/ss-db.go b/internal/infra/ss-db/ss-db.go index 3c239540..810864b3 100644 --- a/internal/infra/ss-db/ss-db.go +++ b/internal/infra/ss-db/ss-db.go @@ -1,36 +1,10 @@ package ssdb import ( - "log" - - a "github.com/karincake/apem" - lo "github.com/karincake/apem/loggero" - "gorm.io/driver/postgres" - "gorm.io/gorm" - "gorm.io/gorm/schema" + dg "github.com/karincake/apem/db-gorm-pg" ) -func Init() { - SetConfig() - NewInstance() -} +func SetInstance() { -func SetConfig() { - a.ParseSingleCfg(&Cfg) -} - -func NewInstance() { - // create database connection - db, err := gorm.Open(postgres.Open(Cfg.Dsn), &gorm.Config{ - NamingStrategy: schema.NamingStrategy{ - SingularTable: true, - NoLowerCase: true, - }, - }) - if err != nil { - log.Fatal(err) - } - - SSDb = db - lo.I.Println("Instantiation for satu-sehat database-connetion using db-gorm-pg, status: DONE!!") + I = dg.IS["satusehat"] } diff --git a/internal/infra/ss-db/tycovar.go b/internal/infra/ss-db/tycovar.go index ff084508..55fc90fd 100644 --- a/internal/infra/ss-db/tycovar.go +++ b/internal/infra/ss-db/tycovar.go @@ -2,12 +2,4 @@ package ssdb import "gorm.io/gorm" -type SsDbCfg struct { - Dsn string - MaxOpenConns int `yaml:"maxOpenConns"` - MaxIdleConns int `yaml:"maxIdleConns"` - MaxIdleTime int `yaml:"maxIdleTime"` -} - -var Cfg SsDbCfg = SsDbCfg{} -var SSDb *gorm.DB +var I *gorm.DB diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 476dacc7..5ef7d2c4 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -80,7 +80,7 @@ func SetRoutes() http.Handler { ///// a.RegisterExtCall(gs.Adjust) a.RegisterExtCall(zlc.Adjust) - a.RegisterExtCall(ssdb.Init) + a.RegisterExtCall(ssdb.SetInstance) a.RegisterExtCall(lh.Populate) a.RegisterExtCall(validation.RegisterValidation) diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go new file mode 100644 index 00000000..62e7ee76 --- /dev/null +++ b/internal/interface/migration/main-entities.go @@ -0,0 +1,121 @@ +package migration + +import ( + adime "simrs-vx/internal/domain/main-entities/adime" + ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" + appointment "simrs-vx/internal/domain/main-entities/appointment" + counter "simrs-vx/internal/domain/main-entities/counter" + device "simrs-vx/internal/domain/main-entities/device" + diagnosesrc "simrs-vx/internal/domain/main-entities/diagnose-src" + district "simrs-vx/internal/domain/main-entities/district" + division "simrs-vx/internal/domain/main-entities/division" + divisionposition "simrs-vx/internal/domain/main-entities/division-position" + doctor "simrs-vx/internal/domain/main-entities/doctor" + doctorfee "simrs-vx/internal/domain/main-entities/doctor-fee" + emergency "simrs-vx/internal/domain/main-entities/emergency" + employee "simrs-vx/internal/domain/main-entities/employee" + encounter "simrs-vx/internal/domain/main-entities/encounter" + ethnic "simrs-vx/internal/domain/main-entities/ethnic" + infra "simrs-vx/internal/domain/main-entities/infra" + inpatient "simrs-vx/internal/domain/main-entities/inpatient" + installation "simrs-vx/internal/domain/main-entities/installation" + insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" + item "simrs-vx/internal/domain/main-entities/item" + itemprice "simrs-vx/internal/domain/main-entities/item-price" + laborant "simrs-vx/internal/domain/main-entities/laborant" + language "simrs-vx/internal/domain/main-entities/language" + material "simrs-vx/internal/domain/main-entities/material" + mcusrc "simrs-vx/internal/domain/main-entities/mcu-src" + mcusrccategory "simrs-vx/internal/domain/main-entities/mcu-src-category" + medicalactionsrc "simrs-vx/internal/domain/main-entities/medical-action-src" + medicalactionsrcitem "simrs-vx/internal/domain/main-entities/medical-action-src-item" + medicine "simrs-vx/internal/domain/main-entities/medicine" + medicinegroup "simrs-vx/internal/domain/main-entities/medicine-group" + medicinemethod "simrs-vx/internal/domain/main-entities/medicine-method" + medicinemix "simrs-vx/internal/domain/main-entities/medicine-mix" + medicinemixitem "simrs-vx/internal/domain/main-entities/medicine-mix-item" + nurse "simrs-vx/internal/domain/main-entities/nurse" + nutritionist "simrs-vx/internal/domain/main-entities/nutritionist" + patient "simrs-vx/internal/domain/main-entities/patient" + person "simrs-vx/internal/domain/main-entities/person" + personaddress "simrs-vx/internal/domain/main-entities/person-address" + personcontact "simrs-vx/internal/domain/main-entities/person-contact" + personrelative "simrs-vx/internal/domain/main-entities/person-relative" + pharmacist "simrs-vx/internal/domain/main-entities/pharmacist" + pharmacycompany "simrs-vx/internal/domain/main-entities/pharmacy-company" + practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" + proceduresrc "simrs-vx/internal/domain/main-entities/procedure-src" + province "simrs-vx/internal/domain/main-entities/province" + regency "simrs-vx/internal/domain/main-entities/regency" + room "simrs-vx/internal/domain/main-entities/room" + sbar "simrs-vx/internal/domain/main-entities/sbar" + soapi "simrs-vx/internal/domain/main-entities/soapi" + specialist "simrs-vx/internal/domain/main-entities/specialist" + specialistintern "simrs-vx/internal/domain/main-entities/specialist-intern" + subspecialist "simrs-vx/internal/domain/main-entities/subspecialist" + unit "simrs-vx/internal/domain/main-entities/unit" + uom "simrs-vx/internal/domain/main-entities/uom" + user "simrs-vx/internal/domain/main-entities/user" + village "simrs-vx/internal/domain/main-entities/village" +) + +func getMainEntities() []any { + return []any{ + &user.User{}, + &division.Division{}, + &divisionposition.DivisionPosition{}, + &installation.Installation{}, + &unit.Unit{}, + &village.Village{}, + &district.District{}, + ®ency.Regency{}, + &province.Province{}, + &person.Person{}, + &personaddress.PersonAddress{}, + &personcontact.PersonContact{}, + &pharmacycompany.PharmacyCompany{}, + &diagnosesrc.DiagnoseSrc{}, + &proceduresrc.ProcedureSrc{}, + &employee.Employee{}, + &doctor.Doctor{}, + &nurse.Nurse{}, + &nutritionist.Nutritionist{}, + &pharmacist.Pharmacist{}, + &counter.Counter{}, + &practiceschedule.PracticeSchedule{}, + &uom.Uom{}, + &item.Item{}, + &itemprice.ItemPrice{}, + &infra.Infra{}, + &medicinegroup.MedicineGroup{}, + &medicinemethod.MedicineMethod{}, + &mcusrccategory.McuSrcCategory{}, + &mcusrc.McuSrc{}, + ðnic.Ethnic{}, + &insurancecompany.InsuranceCompany{}, + &medicine.Medicine{}, + &medicinemix.MedicineMix{}, + &medicinemixitem.MedicineMixItem{}, + &medicalactionsrc.MedicalActionSrc{}, + &medicalactionsrcitem.MedicalActionSrcItem{}, + &material.Material{}, + &device.Device{}, + &doctorfee.DoctorFee{}, + &language.Language{}, + &personrelative.PersonRelative{}, + &patient.Patient{}, + &appointment.Appointment{}, + &encounter.Encounter{}, + &laborant.Laborant{}, + &specialist.Specialist{}, + &subspecialist.Subspecialist{}, + &specialistintern.SpecialistIntern{}, + &room.Room{}, + &soapi.Soapi{}, + &sbar.Sbar{}, + &adime.Adime{}, + &emergency.Emergency{}, + &inpatient.Inpatient{}, + &ambulatory.Ambulatory{}, + } +} diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go index 990ca134..66018a21 100644 --- a/internal/interface/migration/migration.go +++ b/internal/interface/migration/migration.go @@ -5,87 +5,20 @@ import ( "io" "os" "os/exec" - adime "simrs-vx/internal/domain/main-entities/adime" - ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" - appointment "simrs-vx/internal/domain/main-entities/appointment" - counter "simrs-vx/internal/domain/main-entities/counter" - device "simrs-vx/internal/domain/main-entities/device" - diagnosesrc "simrs-vx/internal/domain/main-entities/diagnose-src" - district "simrs-vx/internal/domain/main-entities/district" - division "simrs-vx/internal/domain/main-entities/division" - divisionposition "simrs-vx/internal/domain/main-entities/division-position" - doctor "simrs-vx/internal/domain/main-entities/doctor" - doctorfee "simrs-vx/internal/domain/main-entities/doctor-fee" - emergency "simrs-vx/internal/domain/main-entities/emergency" - employee "simrs-vx/internal/domain/main-entities/employee" - encounter "simrs-vx/internal/domain/main-entities/encounter" - ethnic "simrs-vx/internal/domain/main-entities/ethnic" - infra "simrs-vx/internal/domain/main-entities/infra" - inpatient "simrs-vx/internal/domain/main-entities/inpatient" - installation "simrs-vx/internal/domain/main-entities/installation" - insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" - item "simrs-vx/internal/domain/main-entities/item" - itemprice "simrs-vx/internal/domain/main-entities/item-price" - laborant "simrs-vx/internal/domain/main-entities/laborant" - language "simrs-vx/internal/domain/main-entities/language" - material "simrs-vx/internal/domain/main-entities/material" - mcusrc "simrs-vx/internal/domain/main-entities/mcu-src" - mcusrccategory "simrs-vx/internal/domain/main-entities/mcu-src-category" - medicalactionsrc "simrs-vx/internal/domain/main-entities/medical-action-src" - medicalactionsrcitem "simrs-vx/internal/domain/main-entities/medical-action-src-item" - medicine "simrs-vx/internal/domain/main-entities/medicine" - medicinegroup "simrs-vx/internal/domain/main-entities/medicine-group" - medicinemethod "simrs-vx/internal/domain/main-entities/medicine-method" - medicinemix "simrs-vx/internal/domain/main-entities/medicine-mix" - medicinemixitem "simrs-vx/internal/domain/main-entities/medicine-mix-item" - nurse "simrs-vx/internal/domain/main-entities/nurse" - nutritionist "simrs-vx/internal/domain/main-entities/nutritionist" - patient "simrs-vx/internal/domain/main-entities/patient" - person "simrs-vx/internal/domain/main-entities/person" - personaddress "simrs-vx/internal/domain/main-entities/person-address" - personcontact "simrs-vx/internal/domain/main-entities/person-contact" - personrelative "simrs-vx/internal/domain/main-entities/person-relative" - pharmacist "simrs-vx/internal/domain/main-entities/pharmacist" - pharmacycompany "simrs-vx/internal/domain/main-entities/pharmacy-company" - practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" - proceduresrc "simrs-vx/internal/domain/main-entities/procedure-src" - province "simrs-vx/internal/domain/main-entities/province" - regency "simrs-vx/internal/domain/main-entities/regency" - room "simrs-vx/internal/domain/main-entities/room" - sbar "simrs-vx/internal/domain/main-entities/sbar" - soapi "simrs-vx/internal/domain/main-entities/soapi" - specialist "simrs-vx/internal/domain/main-entities/specialist" - specialistintern "simrs-vx/internal/domain/main-entities/specialist-intern" - subspecialist "simrs-vx/internal/domain/main-entities/subspecialist" - unit "simrs-vx/internal/domain/main-entities/unit" - uom "simrs-vx/internal/domain/main-entities/uom" - user "simrs-vx/internal/domain/main-entities/user" - village "simrs-vx/internal/domain/main-entities/village" "ariga.io/atlas-provider-gorm/gormschema" "gorm.io/gorm" "gorm.io/gorm/schema" ) -type Config struct { - DbCfg DbConf `yaml:"dbCfg"` -} - -type DbConf struct { - DSN string `yaml:"dsn"` - MaxOpenConns int `yaml:"maxOpenConns"` - MaxIdleConns int `yaml:"maxIdleConns"` - MaxIdleTime int `yaml:"maxIdleTime"` -} - -func Loader() { +func loader(input string) { gormCfg := &gorm.Config{ NamingStrategy: schema.NamingStrategy{ SingularTable: true, NoLowerCase: true, }, } - stmts, err := gormschema.New("postgres", gormschema.WithConfig(gormCfg)).Load(GetEntities()...) + stmts, err := gormschema.New("postgres", gormschema.WithConfig(gormCfg)).Load(getEntities(input)...) if err != nil { fmt.Fprintf(os.Stderr, "failed to load gorm schema: %v\n", err) os.Exit(1) @@ -93,65 +26,14 @@ func Loader() { _, _ = io.WriteString(os.Stdout, stmts) } -func GetEntities() []any { - return []any{ - &user.User{}, - &division.Division{}, - &divisionposition.DivisionPosition{}, - &installation.Installation{}, - &unit.Unit{}, - &village.Village{}, - &district.District{}, - ®ency.Regency{}, - &province.Province{}, - &person.Person{}, - &personaddress.PersonAddress{}, - &personcontact.PersonContact{}, - &pharmacycompany.PharmacyCompany{}, - &diagnosesrc.DiagnoseSrc{}, - &proceduresrc.ProcedureSrc{}, - &employee.Employee{}, - &doctor.Doctor{}, - &nurse.Nurse{}, - &nutritionist.Nutritionist{}, - &pharmacist.Pharmacist{}, - &counter.Counter{}, - &practiceschedule.PracticeSchedule{}, - &uom.Uom{}, - &item.Item{}, - &itemprice.ItemPrice{}, - &infra.Infra{}, - &medicinegroup.MedicineGroup{}, - &medicinemethod.MedicineMethod{}, - &mcusrccategory.McuSrcCategory{}, - &mcusrc.McuSrc{}, - ðnic.Ethnic{}, - &insurancecompany.InsuranceCompany{}, - &medicine.Medicine{}, - &medicinemix.MedicineMix{}, - &medicinemixitem.MedicineMixItem{}, - &medicalactionsrc.MedicalActionSrc{}, - &medicalactionsrcitem.MedicalActionSrcItem{}, - &material.Material{}, - &device.Device{}, - &doctorfee.DoctorFee{}, - &language.Language{}, - &personrelative.PersonRelative{}, - &patient.Patient{}, - &appointment.Appointment{}, - &encounter.Encounter{}, - &laborant.Laborant{}, - &specialist.Specialist{}, - &subspecialist.Subspecialist{}, - &specialistintern.SpecialistIntern{}, - &room.Room{}, - &soapi.Soapi{}, - &sbar.Sbar{}, - &adime.Adime{}, - &emergency.Emergency{}, - &inpatient.Inpatient{}, - &ambulatory.Ambulatory{}, +func getEntities(input string) []any { + switch input { + case "main": + return getMainEntities() + case "satusehat": + return getSatuSehatEntities() } + return nil } func runAtlas(args ...string) error { @@ -165,8 +47,8 @@ func logMsg(msg string) { fmt.Fprintln(os.Stderr, msg) } -func Migrate() { - Loader() +func Migrate(input string) { + loader(input) logMsg("Running atlas migrate diff...") if err := runAtlas("migrate", "diff", "--env", "gorm"); err != nil { logMsg(fmt.Sprintf("Failed to run diff: %v", err)) diff --git a/internal/interface/migration/satusehat-entities.go b/internal/interface/migration/satusehat-entities.go new file mode 100644 index 00000000..02d4aa94 --- /dev/null +++ b/internal/interface/migration/satusehat-entities.go @@ -0,0 +1,11 @@ +package migration + +import ( + patient "simrs-vx/internal/domain/satusehat-entities/patient" +) + +func getSatuSehatEntities() []any { + return []any{ + &patient.Patient{}, + } +} diff --git a/internal/interface/migration/tycovar.go b/internal/interface/migration/tycovar.go new file mode 100644 index 00000000..f86f855d --- /dev/null +++ b/internal/interface/migration/tycovar.go @@ -0,0 +1,7 @@ +/* Package migration is used to migrate the database */ +package migration + +const ( + Main = "main" + SatuSehat = "satusehat" +) From dfaf6e8d29a066875da96cb2b2508b7dc42a2116 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 11 Sep 2025 13:09:30 +0700 Subject: [PATCH 024/190] remove replaced go mod --- go.mod | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.mod b/go.mod index 48086e5a..e717f960 100644 --- a/go.mod +++ b/go.mod @@ -49,5 +49,3 @@ require ( gorm.io/driver/sqlite v1.5.7 // indirect gorm.io/driver/sqlserver v1.5.4 // indirect ) - -replace github.com/karincake/apem => D:\Kuli\Sabbi\external\apem \ No newline at end of file From 20bc8419d00a25ca2d5a49c85be0f49314cec1a2 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 12 Sep 2025 08:57:05 +0700 Subject: [PATCH 025/190] separate atlas command --- cmd/main-migration/Makefile | 18 ++++++ cmd/main-migration/README-ATLAS.MD | 59 +++++++++++++++++++ cmd/main-migration/config.yml-example | 47 --------------- cmd/satusehat-migration/Makefile | 18 ++++++ cmd/satusehat-migration/README-ATLAS.MD | 59 +++++++++++++++++++ cmd/satusehat-migration/config.yml-example | 47 --------------- .../migrations/20250911060006.sql | 9 --- cmd/satusehat-migration/migrations/atlas.sum | 2 - .../satusehat-entities/patient/entity.go | 2 +- internal/interface/migration/migration.go | 24 -------- 10 files changed, 155 insertions(+), 130 deletions(-) create mode 100644 cmd/main-migration/Makefile create mode 100644 cmd/main-migration/README-ATLAS.MD delete mode 100644 cmd/main-migration/config.yml-example create mode 100644 cmd/satusehat-migration/Makefile create mode 100644 cmd/satusehat-migration/README-ATLAS.MD delete mode 100644 cmd/satusehat-migration/config.yml-example delete mode 100644 cmd/satusehat-migration/migrations/20250911060006.sql delete mode 100644 cmd/satusehat-migration/migrations/atlas.sum diff --git a/cmd/main-migration/Makefile b/cmd/main-migration/Makefile new file mode 100644 index 00000000..92a4be84 --- /dev/null +++ b/cmd/main-migration/Makefile @@ -0,0 +1,18 @@ +# Makefile for Atlas migrations + +# Default environment +ENV ?= gorm + +.PHONY: diff apply hash + +## Generate a new migration diff +diff: + atlas migrate diff --env $(ENV) + +## Apply migrations to the database +apply: + atlas migrate apply --env $(ENV) + +## Calculate the schema hash +hash: + atlas schema hash --env $(ENV) diff --git a/cmd/main-migration/README-ATLAS.MD b/cmd/main-migration/README-ATLAS.MD new file mode 100644 index 00000000..da249823 --- /dev/null +++ b/cmd/main-migration/README-ATLAS.MD @@ -0,0 +1,59 @@ +# Database Migration with Atlas + +This project uses [Atlas](https://atlasgo.io/) for database schema management and migrations. + +## 📋 Prerequisites + +1. **Download and Install Atlas CLI** + Run the following command in PowerShell or Git Bash: + + ```sh + curl -sSf https://atlasgo.sh | sh + ``` + Verify installation: + + ```sh + atlas version + ``` + +2. Install GORM Provider + Run inside your Go project: + + ```sh + go get -u ariga.io/atlas-provider-gorm + ``` + +3. Create atlas.hcl configuration file + Just create an atlas.hcl file in your project root as example given at atlas.hcl.example +4. Create migrations folder + ```sh + mkdir migrations + ``` +5. Usage +You can use the provided Makefile for common commands: + + Generate a migration diff + ```sh + make diff + ``` + + Apply migrations + ```sh + make apply + ``` + + Compute schema hash + ```sh + make hash + ``` + + If you don’t have make installed, you can run the Atlas commands directly: + ```sh + atlas migrate diff --env gorm + ``` + ```sh + atlas migrate apply --env gorm + ``` + ```sh + atlas migrate hash + ``` \ No newline at end of file diff --git a/cmd/main-migration/config.yml-example b/cmd/main-migration/config.yml-example deleted file mode 100644 index 19893fd7..00000000 --- a/cmd/main-migration/config.yml-example +++ /dev/null @@ -1,47 +0,0 @@ -appCfg: - fullName: BPJS Bridge - codeName: simrs-vx - version: 0.1.0 - env: development - lang: en - -httpCfg: - host: - port: - -dbCfg: - dsn: - maxOpenConns: 5 - maxIdleConns: 5 - maxIdleTime: 100 - -loggerCfg: - hideTime: - hideLevel: - -msCfg: - dsn: - -langCfg: - active: - path: - fileName: - -minioCfg: - endpoint: - region: - accessKey: - secretKey: - useSsl: - bucketName: - - patient - -corsCfg: - allowedOrigin: - allowedMethod: - -satuSehatCfg: - host: localhsot:8200 - -bpjsCfg: - host: localhsot:8200 diff --git a/cmd/satusehat-migration/Makefile b/cmd/satusehat-migration/Makefile new file mode 100644 index 00000000..92a4be84 --- /dev/null +++ b/cmd/satusehat-migration/Makefile @@ -0,0 +1,18 @@ +# Makefile for Atlas migrations + +# Default environment +ENV ?= gorm + +.PHONY: diff apply hash + +## Generate a new migration diff +diff: + atlas migrate diff --env $(ENV) + +## Apply migrations to the database +apply: + atlas migrate apply --env $(ENV) + +## Calculate the schema hash +hash: + atlas schema hash --env $(ENV) diff --git a/cmd/satusehat-migration/README-ATLAS.MD b/cmd/satusehat-migration/README-ATLAS.MD new file mode 100644 index 00000000..da249823 --- /dev/null +++ b/cmd/satusehat-migration/README-ATLAS.MD @@ -0,0 +1,59 @@ +# Database Migration with Atlas + +This project uses [Atlas](https://atlasgo.io/) for database schema management and migrations. + +## 📋 Prerequisites + +1. **Download and Install Atlas CLI** + Run the following command in PowerShell or Git Bash: + + ```sh + curl -sSf https://atlasgo.sh | sh + ``` + Verify installation: + + ```sh + atlas version + ``` + +2. Install GORM Provider + Run inside your Go project: + + ```sh + go get -u ariga.io/atlas-provider-gorm + ``` + +3. Create atlas.hcl configuration file + Just create an atlas.hcl file in your project root as example given at atlas.hcl.example +4. Create migrations folder + ```sh + mkdir migrations + ``` +5. Usage +You can use the provided Makefile for common commands: + + Generate a migration diff + ```sh + make diff + ``` + + Apply migrations + ```sh + make apply + ``` + + Compute schema hash + ```sh + make hash + ``` + + If you don’t have make installed, you can run the Atlas commands directly: + ```sh + atlas migrate diff --env gorm + ``` + ```sh + atlas migrate apply --env gorm + ``` + ```sh + atlas migrate hash + ``` \ No newline at end of file diff --git a/cmd/satusehat-migration/config.yml-example b/cmd/satusehat-migration/config.yml-example deleted file mode 100644 index 19893fd7..00000000 --- a/cmd/satusehat-migration/config.yml-example +++ /dev/null @@ -1,47 +0,0 @@ -appCfg: - fullName: BPJS Bridge - codeName: simrs-vx - version: 0.1.0 - env: development - lang: en - -httpCfg: - host: - port: - -dbCfg: - dsn: - maxOpenConns: 5 - maxIdleConns: 5 - maxIdleTime: 100 - -loggerCfg: - hideTime: - hideLevel: - -msCfg: - dsn: - -langCfg: - active: - path: - fileName: - -minioCfg: - endpoint: - region: - accessKey: - secretKey: - useSsl: - bucketName: - - patient - -corsCfg: - allowedOrigin: - allowedMethod: - -satuSehatCfg: - host: localhsot:8200 - -bpjsCfg: - host: localhsot:8200 diff --git a/cmd/satusehat-migration/migrations/20250911060006.sql b/cmd/satusehat-migration/migrations/20250911060006.sql deleted file mode 100644 index b1671f9a..00000000 --- a/cmd/satusehat-migration/migrations/20250911060006.sql +++ /dev/null @@ -1,9 +0,0 @@ --- Create "Patient" table -CREATE TABLE "public"."Patient" ( - "ResourceType" text NULL, - "Active" boolean NULL, - "Gender" text NULL, - "BirthDate" text NULL, - "DeceasedBool" boolean NULL, - "MultipleBirthInteger" bigint NULL -); diff --git a/cmd/satusehat-migration/migrations/atlas.sum b/cmd/satusehat-migration/migrations/atlas.sum deleted file mode 100644 index d8f010f3..00000000 --- a/cmd/satusehat-migration/migrations/atlas.sum +++ /dev/null @@ -1,2 +0,0 @@ -h1:dPpFMJ+ZSlHizKRHShYcjJZJNZXi4UuZXZUHME8zPb4= -20250911060006.sql h1:G3YiyY/tCTZijQWqyvyDAaMVCFkhh/gD3v/1gz/eBb8= diff --git a/internal/domain/satusehat-entities/patient/entity.go b/internal/domain/satusehat-entities/patient/entity.go index 12efaa93..21c6075b 100644 --- a/internal/domain/satusehat-entities/patient/entity.go +++ b/internal/domain/satusehat-entities/patient/entity.go @@ -7,7 +7,7 @@ type Patient struct { Active bool `json:"active"` // Name []HumanName `json:"name"` // Telecom []ContactPoint `json:"telecom"` - Gender string `json:"gender"` + Gender string `json:"gender" gorm:"size:10"` BirthDate string `json:"birthDate"` DeceasedBool bool `json:"deceasedBoolean"` // Address []Address `json:"address"` diff --git a/internal/interface/migration/migration.go b/internal/interface/migration/migration.go index 66018a21..6cec68dc 100644 --- a/internal/interface/migration/migration.go +++ b/internal/interface/migration/migration.go @@ -4,7 +4,6 @@ import ( "fmt" "io" "os" - "os/exec" "ariga.io/atlas-provider-gorm/gormschema" "gorm.io/gorm" @@ -36,30 +35,7 @@ func getEntities(input string) []any { return nil } -func runAtlas(args ...string) error { - cmd := exec.Command("atlas", args...) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - return cmd.Run() -} - -func logMsg(msg string) { - fmt.Fprintln(os.Stderr, msg) -} - func Migrate(input string) { loader(input) - logMsg("Running atlas migrate diff...") - if err := runAtlas("migrate", "diff", "--env", "gorm"); err != nil { - logMsg(fmt.Sprintf("Failed to run diff: %v", err)) - return - } - logMsg("Running atlas migrate apply...") - if err := runAtlas("migrate", "apply", "--env", "gorm"); err != nil { - logMsg(fmt.Sprintf("Failed to run apply: %v", err)) - return - } - - logMsg("Migration complete") } From 1194b607b9bc07d8497e7804c889c59a39a81d9a Mon Sep 17 00:00:00 2001 From: Dwi Atmoko Purbo Sakti <82804339+dpurbosakti@users.noreply.github.com> Date: Fri, 12 Sep 2025 09:57:39 +0700 Subject: [PATCH 026/190] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 286b9405..f7357d8a 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,8 @@ go.work.sum # env file .env config.yml -cmd/migration/atlas.hcl +cmd/main-migration/atlas.hcl +cmd/satusehat-migration/atlas.hcl # Editor/IDE # .idea/ From 0637e60837b12938458048975be7f496ed98b8d9 Mon Sep 17 00:00:00 2001 From: Dwi Atmoko Purbo Sakti <82804339+dpurbosakti@users.noreply.github.com> Date: Fri, 12 Sep 2025 09:58:32 +0700 Subject: [PATCH 027/190] Delete cmd/main-migration/atlas.hcl --- cmd/main-migration/atlas.hcl | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 cmd/main-migration/atlas.hcl diff --git a/cmd/main-migration/atlas.hcl b/cmd/main-migration/atlas.hcl deleted file mode 100644 index 3372fb2d..00000000 --- a/cmd/main-migration/atlas.hcl +++ /dev/null @@ -1,22 +0,0 @@ -data "external_schema" "gorm" { - program = [ - "go", - "run", - "-mod=mod", - ".", - ] -} - -env "gorm" { - src = data.external_schema.gorm.url - dev = "postgres://moko:password@localhost:5432/simrs_vx3?sslmode=disable" - migration { - dir = "file://migrations" - } - url = "postgres://moko:password@localhost:5432/simrs_vx1?sslmode=disable" - format { - migrate { - diff = "{{ sql . \" \" }}" - } - } -} \ No newline at end of file From 9d4787957f0577d838639d90a83c862f673e9661 Mon Sep 17 00:00:00 2001 From: Dwi Atmoko Purbo Sakti <82804339+dpurbosakti@users.noreply.github.com> Date: Fri, 12 Sep 2025 09:58:56 +0700 Subject: [PATCH 028/190] Delete cmd/satusehat-migration/atlas.hcl --- cmd/satusehat-migration/atlas.hcl | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 cmd/satusehat-migration/atlas.hcl diff --git a/cmd/satusehat-migration/atlas.hcl b/cmd/satusehat-migration/atlas.hcl deleted file mode 100644 index 5efd3e80..00000000 --- a/cmd/satusehat-migration/atlas.hcl +++ /dev/null @@ -1,22 +0,0 @@ -data "external_schema" "gorm" { - program = [ - "go", - "run", - "-mod=mod", - ".", - ] -} - -env "gorm" { - src = data.external_schema.gorm.url - dev = "postgres://moko:password@localhost:5432/satusehat_diff?sslmode=disable" - migration { - dir = "file://migrations" - } - url = "postgres://moko:password@localhost:5432/satusehat_main?sslmode=disable" - format { - migrate { - diff = "{{ sql . \" \" }}" - } - } -} \ No newline at end of file From 45d687c5ec4d6c414a9ce208c9ee53d3c5c414b2 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 15 Sep 2025 14:07:30 +0700 Subject: [PATCH 029/190] wip --- .../main-entities/device-order-item/dto.go | 72 ++++++++++++++ .../main-entities/device-order-item/entity.go | 15 +++ .../domain/main-entities/device-order/dto.go | 65 +++++++++++++ .../main-entities/device-order/entity.go | 12 +++ .../main-entities/material-order-item/dto.go | 76 +++++++++++++++ .../material-order-item/entity.go | 16 ++++ .../main-entities/material-order/dto.go | 65 +++++++++++++ .../main-entities/material-order/entity.go | 12 +++ .../main-entities/mcu-order-item/dto.go | 81 ++++++++++++++++ .../main-entities/mcu-order-item/entity.go | 19 ++++ .../domain/main-entities/mcu-order/dto.go | 77 +++++++++++++++ .../domain/main-entities/mcu-order/entity.go | 18 ++++ .../main-entities/medication-item-dist/dto.go | 74 +++++++++++++++ .../medication-item-dist/entity.go | 15 +++ .../main-entities/medication-item/dto.go | 94 +++++++++++++++++++ .../main-entities/medication-item/entity.go | 22 +++++ .../domain/main-entities/medication/dto.go | 77 +++++++++++++++ .../domain/main-entities/medication/entity.go | 18 ++++ .../main-entities/prescription-item/dto.go | 91 ++++++++++++++++++ .../main-entities/prescription-item/entity.go | 22 +++++ .../domain/main-entities/prescription/dto.go | 77 +++++++++++++++ .../main-entities/prescription/entity.go | 17 ++++ 22 files changed, 1035 insertions(+) create mode 100644 internal/domain/main-entities/device-order-item/dto.go create mode 100644 internal/domain/main-entities/device-order-item/entity.go create mode 100644 internal/domain/main-entities/device-order/dto.go create mode 100644 internal/domain/main-entities/device-order/entity.go create mode 100644 internal/domain/main-entities/material-order-item/dto.go create mode 100644 internal/domain/main-entities/material-order-item/entity.go create mode 100644 internal/domain/main-entities/material-order/dto.go create mode 100644 internal/domain/main-entities/material-order/entity.go create mode 100644 internal/domain/main-entities/mcu-order-item/dto.go create mode 100644 internal/domain/main-entities/mcu-order-item/entity.go create mode 100644 internal/domain/main-entities/mcu-order/dto.go create mode 100644 internal/domain/main-entities/mcu-order/entity.go create mode 100644 internal/domain/main-entities/medication-item-dist/dto.go create mode 100644 internal/domain/main-entities/medication-item-dist/entity.go create mode 100644 internal/domain/main-entities/medication-item/dto.go create mode 100644 internal/domain/main-entities/medication-item/entity.go create mode 100644 internal/domain/main-entities/medication/dto.go create mode 100644 internal/domain/main-entities/medication/entity.go create mode 100644 internal/domain/main-entities/prescription-item/dto.go create mode 100644 internal/domain/main-entities/prescription-item/entity.go create mode 100644 internal/domain/main-entities/prescription/dto.go create mode 100644 internal/domain/main-entities/prescription/entity.go diff --git a/internal/domain/main-entities/device-order-item/dto.go b/internal/domain/main-entities/device-order-item/dto.go new file mode 100644 index 00000000..8b29a332 --- /dev/null +++ b/internal/domain/main-entities/device-order-item/dto.go @@ -0,0 +1,72 @@ +package deviceorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/device" + edo "simrs-vx/internal/domain/main-entities/device-order" +) + +type CreateDto struct { + DeviceOrder_Id *uint `json:"deviceOrder_id"` + Device_Id *uint `json:"device_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + DeviceOrder_Id *uint `json:"deviceOrder_id"` + Device_Id *uint `json:"device_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + DeviceOrder_Id *uint `json:"deviceOrder_id"` + DeviceOrder *edo.DeviceOrder `json:"deviceOrder,omitempty"` + Device_Id *uint `json:"device_id"` + Device *ed.Device `json:"device,omitempty"` +} + +func (d DeviceOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + DeviceOrder_Id: d.DeviceOrder_Id, + DeviceOrder: d.DeviceOrder, + Device_Id: d.Device_Id, + Device: d.Device, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []DeviceOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/device-order-item/entity.go b/internal/domain/main-entities/device-order-item/entity.go new file mode 100644 index 00000000..536f0e13 --- /dev/null +++ b/internal/domain/main-entities/device-order-item/entity.go @@ -0,0 +1,15 @@ +package deviceorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/device" + edo "simrs-vx/internal/domain/main-entities/device-order" +) + +type DeviceOrderItem struct { + ecore.Main // adjust this according to the needs + DeviceOrder_Id *uint `json:"deviceOrder_id"` + DeviceOrder *edo.DeviceOrder `json:"deviceOrder,omitempty" gorm:"foreignKey:DeviceOrder_Id;references:Id"` + Device_Id *uint `json:"device_id"` + Device *ed.Device `json:"device,omitempty" gorm:"foreignKey:Device_Id;references:Id"` +} diff --git a/internal/domain/main-entities/device-order/dto.go b/internal/domain/main-entities/device-order/dto.go new file mode 100644 index 00000000..cf2fc5ff --- /dev/null +++ b/internal/domain/main-entities/device-order/dto.go @@ -0,0 +1,65 @@ +package deviceorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` +} + +func (d DeviceOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []DeviceOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/device-order/entity.go b/internal/domain/main-entities/device-order/entity.go new file mode 100644 index 00000000..b07067fc --- /dev/null +++ b/internal/domain/main-entities/device-order/entity.go @@ -0,0 +1,12 @@ +package deviceorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type DeviceOrder struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` +} diff --git a/internal/domain/main-entities/material-order-item/dto.go b/internal/domain/main-entities/material-order-item/dto.go new file mode 100644 index 00000000..81882e51 --- /dev/null +++ b/internal/domain/main-entities/material-order-item/dto.go @@ -0,0 +1,76 @@ +package materialorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + em "simrs-vx/internal/domain/main-entities/material" + emo "simrs-vx/internal/domain/main-entities/material-order" +) + +type CreateDto struct { + MaterialOrder_Id *uint `json:"materialOrder_id"` + Material_Id *uint `json:"material_id"` + Count *uint16 `json:"count"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + MaterialOrder_Id *uint `json:"materialOrder_id"` + Material_Id *uint `json:"material_id"` + Count *uint16 `json:"count"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + MaterialOrder_Id *uint `json:"materialOrder_id"` + MaterialOrder *emo.MaterialOrder `json:"materialOrder,omitempty"` + Material_Id *uint `json:"material_id"` + Material *em.Material `json:"material,omitempty"` + Count *uint16 `json:"count"` +} + +func (d MaterialOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + MaterialOrder_Id: d.MaterialOrder_Id, + MaterialOrder: d.MaterialOrder, + Material_Id: d.Material_Id, + Material: d.Material, + Count: d.Count, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []MaterialOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/material-order-item/entity.go b/internal/domain/main-entities/material-order-item/entity.go new file mode 100644 index 00000000..432a36b9 --- /dev/null +++ b/internal/domain/main-entities/material-order-item/entity.go @@ -0,0 +1,16 @@ +package materialorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + em "simrs-vx/internal/domain/main-entities/material" + emo "simrs-vx/internal/domain/main-entities/material-order" +) + +type MaterialOrderItem struct { + ecore.Main // adjust this according to the needs + MaterialOrder_Id *uint `json:"materialOrder_id"` + MaterialOrder *emo.MaterialOrder `json:"materialOrder,omitempty" gorm:"foreignKey:MaterialOrder_Id;references:Id"` + Material_Id *uint `json:"material_id"` + Material *em.Material `json:"material,omitempty" gorm:"foreignKey:Material_Id;references:Id"` + Count *uint16 `json:"count"` +} diff --git a/internal/domain/main-entities/material-order/dto.go b/internal/domain/main-entities/material-order/dto.go new file mode 100644 index 00000000..475ef7f8 --- /dev/null +++ b/internal/domain/main-entities/material-order/dto.go @@ -0,0 +1,65 @@ +package materialorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` +} + +func (d MaterialOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []MaterialOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/material-order/entity.go b/internal/domain/main-entities/material-order/entity.go new file mode 100644 index 00000000..566659d3 --- /dev/null +++ b/internal/domain/main-entities/material-order/entity.go @@ -0,0 +1,12 @@ +package materialorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type MaterialOrder struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` +} diff --git a/internal/domain/main-entities/mcu-order-item/dto.go b/internal/domain/main-entities/mcu-order-item/dto.go new file mode 100644 index 00000000..91ce3bdc --- /dev/null +++ b/internal/domain/main-entities/mcu-order-item/dto.go @@ -0,0 +1,81 @@ +package mcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + emo "simrs-vx/internal/domain/main-entities/mcu-order" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" +) + +type CreateDto struct { + McuOrder_Id *uint `json:"mcuOrder_id"` + McuSrc_Id *uint `json:"mcuSrc_id"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + McuOrder_Id *uint `json:"mcuOrder_id"` + McuSrc_Id *uint `json:"mcuSrc_id"` + Result *string `json:"result"` + 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"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + McuOrder_Id *uint `json:"mcuOrder_id"` + McuOrder *emo.McuOrder `json:"mcuOrder,omitempty"` + McuSrc_Id *uint `json:"mcuSrc_id"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +func (d McuOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + McuOrder_Id: d.McuOrder_Id, + McuOrder: d.McuOrder, + McuSrc_Id: d.McuSrc_Id, + McuSrc: d.McuSrc, + Result: d.Result, + Status_Code: d.Status_Code, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []McuOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/mcu-order-item/entity.go b/internal/domain/main-entities/mcu-order-item/entity.go new file mode 100644 index 00000000..73b56a95 --- /dev/null +++ b/internal/domain/main-entities/mcu-order-item/entity.go @@ -0,0 +1,19 @@ +package mcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + emo "simrs-vx/internal/domain/main-entities/mcu-order" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + + erc "simrs-vx/internal/domain/references/common" +) + +type McuOrderItem struct { + ecore.Main // adjust this according to the needs + McuOrder_Id *uint `json:"mcuOrder_id"` + McuOrder *emo.McuOrder `json:"mcuOrder,omitempty" gorm:"foreignKey:McuOrder_Id;references:Id"` + McuSrc_Id *uint `json:"mcuSrc_id"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Id;references:Id"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} diff --git a/internal/domain/main-entities/mcu-order/dto.go b/internal/domain/main-entities/mcu-order/dto.go new file mode 100644 index 00000000..418fb02c --- /dev/null +++ b/internal/domain/main-entities/mcu-order/dto.go @@ -0,0 +1,77 @@ +package mcuorder + +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" + erc "simrs-vx/internal/domain/references/common" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty"` +} + +func (d McuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Status_Code: d.Status_Code, + Doctor_Id: d.Doctor_Id, + Doctor: d.Doctor, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []McuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/mcu-order/entity.go b/internal/domain/main-entities/mcu-order/entity.go new file mode 100644 index 00000000..326c761f --- /dev/null +++ b/internal/domain/main-entities/mcu-order/entity.go @@ -0,0 +1,18 @@ +package mcuorder + +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" + + erc "simrs-vx/internal/domain/references/common" +) + +type McuOrder struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` +} diff --git a/internal/domain/main-entities/medication-item-dist/dto.go b/internal/domain/main-entities/medication-item-dist/dto.go new file mode 100644 index 00000000..05278d81 --- /dev/null +++ b/internal/domain/main-entities/medication-item-dist/dto.go @@ -0,0 +1,74 @@ +package medicationitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + emi "simrs-vx/internal/domain/main-entities/medication-item" + "time" +) + +type CreateDto struct { + MedicationItem_Id *uint `json:"medicationItem_id"` + DateTime *time.Time `json:"dateTime"` + Remain *uint `json:"remain"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + MedicationItem_Id *uint `json:"medicationItem_id"` + DateTime *time.Time `json:"dateTime"` + Remain *uint `json:"remain"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + MedicationItem_Id *uint `json:"medicationItem_id"` + MedicationItem *emi.MedicationItem `json:"medicationItem,omitempty"` + DateTime *time.Time `json:"dateTime"` + Remain *uint `json:"remain"` +} + +func (d MedicationItemDist) ToResponse() ResponseDto { + resp := ResponseDto{ + MedicationItem_Id: d.MedicationItem_Id, + MedicationItem: d.MedicationItem, + DateTime: d.DateTime, + Remain: d.Remain, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []MedicationItemDist) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/medication-item-dist/entity.go b/internal/domain/main-entities/medication-item-dist/entity.go new file mode 100644 index 00000000..5bd56912 --- /dev/null +++ b/internal/domain/main-entities/medication-item-dist/entity.go @@ -0,0 +1,15 @@ +package medicationitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + emi "simrs-vx/internal/domain/main-entities/medication-item" + "time" +) + +type MedicationItemDist struct { + ecore.Main // adjust this according to the needs + MedicationItem_Id *uint `json:"medicationItem_id"` + MedicationItem *emi.MedicationItem `json:"medicationItem,omitempty" gorm:"foreignKey:MedicationItem_Id;references:Id"` + DateTime *time.Time `json:"dateTime"` + Remain *uint `json:"remain"` +} diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go new file mode 100644 index 00000000..2b4e0ed1 --- /dev/null +++ b/internal/domain/main-entities/medication-item/dto.go @@ -0,0 +1,94 @@ +package medicationitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eme "simrs-vx/internal/domain/main-entities/medication" + em "simrs-vx/internal/domain/main-entities/medicine" + emm "simrs-vx/internal/domain/main-entities/medicine-mix" +) + +type CreateDto struct { + Medication_Id *uint `json:"medication_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + // IntervalUnit_Code +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Medication_Id *uint `json:"medication_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + // IntervalUnit_Code + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Medication_Id *uint `json:"medication_id"` + Medication *eme.Medication `json:"medication,omitempty"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty"` + MedicineMix_Id *uint `json:"medicineMix_id"` + MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + // IntervalUnit_Code +} + +func (d MedicationItem) ToResponse() ResponseDto { + resp := ResponseDto{ + Medication_Id: d.Medication_Id, + Medication: d.Medication, + IsMix: d.IsMix, + Medicine_Id: d.Medicine_Id, + Medicine: d.Medicine, + MedicineMix_Id: d.MedicineMix_Id, + MedicineMix: d.MedicineMix, + Usage: d.Usage, + Interval: d.Interval, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []MedicationItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/medication-item/entity.go b/internal/domain/main-entities/medication-item/entity.go new file mode 100644 index 00000000..160b7dec --- /dev/null +++ b/internal/domain/main-entities/medication-item/entity.go @@ -0,0 +1,22 @@ +package medicationitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eme "simrs-vx/internal/domain/main-entities/medication" + em "simrs-vx/internal/domain/main-entities/medicine" + emm "simrs-vx/internal/domain/main-entities/medicine-mix" +) + +type MedicationItem struct { + ecore.Main // adjust this according to the needs + Medication_Id *uint `json:"medication_id"` + Medication *eme.Medication `json:"medication,omitempty" gorm:"foreignKey:Medication_Id;references:Id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + // IntervalUnit_Code +} diff --git a/internal/domain/main-entities/medication/dto.go b/internal/domain/main-entities/medication/dto.go new file mode 100644 index 00000000..1bc1c774 --- /dev/null +++ b/internal/domain/main-entities/medication/dto.go @@ -0,0 +1,77 @@ +package medication + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + ep "simrs-vx/internal/domain/main-entities/pharmacist" + "time" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + IssuedAt *time.Time `json:"issuedAt"` + Pharmacist_Id *uint `json:"pharmacist_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter_id"` + IssuedAt *time.Time `json:"issuedAt"` + Pharmacist_Id *uint `json:"pharmacist_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + IssuedAt *time.Time `json:"issuedAt"` + Pharmacist_Id *uint `json:"pharmacist_id"` + Pharmacist *ep.Pharmacist `json:"pharmacist,omitempty"` +} + +func (d Medication) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + IssuedAt: d.IssuedAt, + Pharmacist_Id: d.Pharmacist_Id, + Pharmacist: d.Pharmacist, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Medication) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/medication/entity.go b/internal/domain/main-entities/medication/entity.go new file mode 100644 index 00000000..f18af23c --- /dev/null +++ b/internal/domain/main-entities/medication/entity.go @@ -0,0 +1,18 @@ +package medication + +import ( + "time" + + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + ep "simrs-vx/internal/domain/main-entities/pharmacist" +) + +type Medication struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + IssuedAt *time.Time `json:"issuedAt"` + Pharmacist_Id *uint `json:"pharmacist_id"` + Pharmacist *ep.Pharmacist `json:"pharmacist,omitempty" gorm:"foreignKey:Pharmacist_Id;references:Id"` +} diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go new file mode 100644 index 00000000..9d28a511 --- /dev/null +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -0,0 +1,91 @@ +package prescriptionitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + em "simrs-vx/internal/domain/main-entities/medicine" + emm "simrs-vx/internal/domain/main-entities/medicine-mix" + ep "simrs-vx/internal/domain/main-entities/prescription" +) + +type CreateDto struct { + Prescription_Id *uint `json:"prescription_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Prescription_Id *uint `json:"prescription_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Prescription_Id *uint `json:"prescription_id"` + Prescription *ep.Prescription `json:"prescription,omitempty"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty"` + MedicineMix_Id *uint `json:"medicineMix_id"` + MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` +} + +func (d PrescriptionItem) ToResponse() ResponseDto { + resp := ResponseDto{ + Prescription_Id: d.Prescription_Id, + Prescription: d.Prescription, + IsMix: d.IsMix, + Medicine_Id: d.Medicine_Id, + Medicine: d.Medicine, + MedicineMix_Id: d.MedicineMix_Id, + MedicineMix: d.MedicineMix, + Usage: d.Usage, + Interval: d.Interval, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []PrescriptionItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/prescription-item/entity.go b/internal/domain/main-entities/prescription-item/entity.go new file mode 100644 index 00000000..3898e170 --- /dev/null +++ b/internal/domain/main-entities/prescription-item/entity.go @@ -0,0 +1,22 @@ +package prescriptionitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + em "simrs-vx/internal/domain/main-entities/medicine" + emm "simrs-vx/internal/domain/main-entities/medicine-mix" + ep "simrs-vx/internal/domain/main-entities/prescription" +) + +type PrescriptionItem struct { + ecore.Main // adjust this according to the needs + Prescription_Id *uint `json:"prescription_id"` + Prescription *ep.Prescription `json:"prescription,omitempty" gorm:"foreignKey:Prescription_Id;references:Id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + // IntervalUnit_Code +} diff --git a/internal/domain/main-entities/prescription/dto.go b/internal/domain/main-entities/prescription/dto.go new file mode 100644 index 00000000..b87d6f12 --- /dev/null +++ b/internal/domain/main-entities/prescription/dto.go @@ -0,0 +1,77 @@ +package prescription + +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" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Doctor_Id *uint `json:"doctor_id"` + IssuedAt *time.Time `json:"issuedAt"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter_id"` + Doctor_Id *uint `json:"doctor_id"` + IssuedAt *time.Time `json:"issuedAt"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +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"` +} + +func (d Prescription) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Doctor_Id: d.Doctor_Id, + Doctor: d.Doctor, + IssuedAt: d.IssuedAt, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Prescription) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/prescription/entity.go b/internal/domain/main-entities/prescription/entity.go new file mode 100644 index 00000000..bf3e7930 --- /dev/null +++ b/internal/domain/main-entities/prescription/entity.go @@ -0,0 +1,17 @@ +package prescription + +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" +) + +type Prescription struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` + IssuedAt *time.Time `json:"issuedAt"` +} From b4dca13bc40fcc4ddf19dfc59daff6da69bf72ff Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 15 Sep 2025 14:11:53 +0700 Subject: [PATCH 030/190] regis entities for orders, not running diff yet --- internal/interface/migration/main-entities.go | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 62e7ee76..4e544a59 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -6,6 +6,8 @@ import ( appointment "simrs-vx/internal/domain/main-entities/appointment" counter "simrs-vx/internal/domain/main-entities/counter" device "simrs-vx/internal/domain/main-entities/device" + deviceorder "simrs-vx/internal/domain/main-entities/device-order" + deviceorderitem "simrs-vx/internal/domain/main-entities/device-order-item" diagnosesrc "simrs-vx/internal/domain/main-entities/diagnose-src" district "simrs-vx/internal/domain/main-entities/district" division "simrs-vx/internal/domain/main-entities/division" @@ -25,10 +27,17 @@ import ( laborant "simrs-vx/internal/domain/main-entities/laborant" language "simrs-vx/internal/domain/main-entities/language" material "simrs-vx/internal/domain/main-entities/material" + materialorder "simrs-vx/internal/domain/main-entities/material-order" + materialorderitem "simrs-vx/internal/domain/main-entities/material-order-item" + mcuorder "simrs-vx/internal/domain/main-entities/mcu-order" + mcuorderitem "simrs-vx/internal/domain/main-entities/mcu-order-item" mcusrc "simrs-vx/internal/domain/main-entities/mcu-src" mcusrccategory "simrs-vx/internal/domain/main-entities/mcu-src-category" medicalactionsrc "simrs-vx/internal/domain/main-entities/medical-action-src" medicalactionsrcitem "simrs-vx/internal/domain/main-entities/medical-action-src-item" + medication "simrs-vx/internal/domain/main-entities/medication" + medicationitem "simrs-vx/internal/domain/main-entities/medication-item" + medicationitemdist "simrs-vx/internal/domain/main-entities/medication-item-dist" medicine "simrs-vx/internal/domain/main-entities/medicine" medicinegroup "simrs-vx/internal/domain/main-entities/medicine-group" medicinemethod "simrs-vx/internal/domain/main-entities/medicine-method" @@ -44,6 +53,8 @@ import ( pharmacist "simrs-vx/internal/domain/main-entities/pharmacist" pharmacycompany "simrs-vx/internal/domain/main-entities/pharmacy-company" practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" + prescription "simrs-vx/internal/domain/main-entities/prescription" + prescriptionitem "simrs-vx/internal/domain/main-entities/prescription-item" proceduresrc "simrs-vx/internal/domain/main-entities/procedure-src" province "simrs-vx/internal/domain/main-entities/province" regency "simrs-vx/internal/domain/main-entities/regency" @@ -117,5 +128,16 @@ func getMainEntities() []any { &emergency.Emergency{}, &inpatient.Inpatient{}, &ambulatory.Ambulatory{}, + &prescription.Prescription{}, + &prescriptionitem.PrescriptionItem{}, + &medication.Medication{}, + &medicationitem.MedicationItem{}, + &medicationitemdist.MedicationItemDist{}, + &deviceorder.DeviceOrder{}, + &deviceorderitem.DeviceOrderItem{}, + &materialorder.MaterialOrder{}, + &materialorderitem.MaterialOrderItem{}, + &mcuorder.McuOrder{}, + &mcuorderitem.McuOrderItem{}, } } From 178fe7894017339ed719ec7eba45e4954829d4ca Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 15 Sep 2025 14:52:13 +0700 Subject: [PATCH 031/190] add crud for orders --- .../main-handler/device-order-item/handler.go | 71 +++++ .../main-handler/device-order/handler.go | 71 +++++ .../interface/main-handler/main-handler.go | 22 ++ .../material-order-item/handler.go | 71 +++++ .../main-handler/material-order/handler.go | 71 +++++ .../main-handler/mcu-order-item/handler.go | 71 +++++ .../main-handler/mcu-order/handler.go | 71 +++++ .../medication-item-dist/handler.go | 71 +++++ .../main-handler/medication-item/handler.go | 71 +++++ .../main-handler/medication/handler.go | 71 +++++ .../main-handler/prescription-item/handler.go | 71 +++++ .../main-handler/prescription/handler.go | 71 +++++ .../main-use-case/device-order-item/case.go | 279 ++++++++++++++++++ .../main-use-case/device-order-item/helper.go | 22 ++ .../main-use-case/device-order-item/lib.go | 155 ++++++++++ .../device-order-item/middleware-runner.go | 103 +++++++ .../device-order-item/middleware.go | 9 + .../device-order-item/tycovar.go | 44 +++ .../main-use-case/device-order/case.go | 279 ++++++++++++++++++ .../main-use-case/device-order/helper.go | 21 ++ .../main-use-case/device-order/lib.go | 155 ++++++++++ .../device-order/middleware-runner.go | 103 +++++++ .../main-use-case/device-order/middleware.go | 9 + .../main-use-case/device-order/tycovar.go | 44 +++ .../main-use-case/material-order-item/case.go | 279 ++++++++++++++++++ .../material-order-item/helper.go | 23 ++ .../main-use-case/material-order-item/lib.go | 155 ++++++++++ .../material-order-item/middleware-runner.go | 103 +++++++ .../material-order-item/middleware.go | 9 + .../material-order-item/tycovar.go | 44 +++ .../main-use-case/material-order/case.go | 279 ++++++++++++++++++ .../main-use-case/material-order/helper.go | 21 ++ .../main-use-case/material-order/lib.go | 155 ++++++++++ .../material-order/middleware-runner.go | 103 +++++++ .../material-order/middleware.go | 9 + .../main-use-case/material-order/tycovar.go | 44 +++ .../main-use-case/mcu-order-item/case.go | 279 ++++++++++++++++++ .../main-use-case/mcu-order-item/helper.go | 24 ++ .../main-use-case/mcu-order-item/lib.go | 155 ++++++++++ .../mcu-order-item/middleware-runner.go | 103 +++++++ .../mcu-order-item/middleware.go | 9 + .../main-use-case/mcu-order-item/tycovar.go | 44 +++ .../use-case/main-use-case/mcu-order/case.go | 279 ++++++++++++++++++ .../main-use-case/mcu-order/helper.go | 23 ++ .../use-case/main-use-case/mcu-order/lib.go | 155 ++++++++++ .../mcu-order/middleware-runner.go | 103 +++++++ .../main-use-case/mcu-order/middleware.go | 9 + .../main-use-case/mcu-order/tycovar.go | 44 +++ .../medication-item-dist/case.go | 279 ++++++++++++++++++ .../medication-item-dist/helper.go | 23 ++ .../main-use-case/medication-item-dist/lib.go | 155 ++++++++++ .../medication-item-dist/middleware-runner.go | 103 +++++++ .../medication-item-dist/middleware.go | 9 + .../medication-item-dist/tycovar.go | 44 +++ .../main-use-case/medication-item/case.go | 279 ++++++++++++++++++ .../main-use-case/medication-item/helper.go | 26 ++ .../main-use-case/medication-item/lib.go | 155 ++++++++++ .../medication-item/middleware-runner.go | 103 +++++++ .../medication-item/middleware.go | 9 + .../main-use-case/medication-item/tycovar.go | 44 +++ .../use-case/main-use-case/medication/case.go | 279 ++++++++++++++++++ .../main-use-case/medication/helper.go | 23 ++ .../use-case/main-use-case/medication/lib.go | 155 ++++++++++ .../medication/middleware-runner.go | 103 +++++++ .../main-use-case/medication/middleware.go | 9 + .../main-use-case/medication/tycovar.go | 44 +++ .../main-use-case/prescription-item/case.go | 279 ++++++++++++++++++ .../main-use-case/prescription-item/helper.go | 26 ++ .../main-use-case/prescription-item/lib.go | 155 ++++++++++ .../prescription-item/middleware-runner.go | 103 +++++++ .../prescription-item/middleware.go | 9 + .../prescription-item/tycovar.go | 44 +++ .../main-use-case/prescription/case.go | 279 ++++++++++++++++++ .../main-use-case/prescription/helper.go | 23 ++ .../main-use-case/prescription/lib.go | 155 ++++++++++ .../prescription/middleware-runner.go | 103 +++++++ .../main-use-case/prescription/middleware.go | 9 + .../main-use-case/prescription/tycovar.go | 44 +++ 78 files changed, 7548 insertions(+) create mode 100644 internal/interface/main-handler/device-order-item/handler.go create mode 100644 internal/interface/main-handler/device-order/handler.go create mode 100644 internal/interface/main-handler/material-order-item/handler.go create mode 100644 internal/interface/main-handler/material-order/handler.go create mode 100644 internal/interface/main-handler/mcu-order-item/handler.go create mode 100644 internal/interface/main-handler/mcu-order/handler.go create mode 100644 internal/interface/main-handler/medication-item-dist/handler.go create mode 100644 internal/interface/main-handler/medication-item/handler.go create mode 100644 internal/interface/main-handler/medication/handler.go create mode 100644 internal/interface/main-handler/prescription-item/handler.go create mode 100644 internal/interface/main-handler/prescription/handler.go create mode 100644 internal/use-case/main-use-case/device-order-item/case.go create mode 100644 internal/use-case/main-use-case/device-order-item/helper.go create mode 100644 internal/use-case/main-use-case/device-order-item/lib.go create mode 100644 internal/use-case/main-use-case/device-order-item/middleware-runner.go create mode 100644 internal/use-case/main-use-case/device-order-item/middleware.go create mode 100644 internal/use-case/main-use-case/device-order-item/tycovar.go create mode 100644 internal/use-case/main-use-case/device-order/case.go create mode 100644 internal/use-case/main-use-case/device-order/helper.go create mode 100644 internal/use-case/main-use-case/device-order/lib.go create mode 100644 internal/use-case/main-use-case/device-order/middleware-runner.go create mode 100644 internal/use-case/main-use-case/device-order/middleware.go create mode 100644 internal/use-case/main-use-case/device-order/tycovar.go create mode 100644 internal/use-case/main-use-case/material-order-item/case.go create mode 100644 internal/use-case/main-use-case/material-order-item/helper.go create mode 100644 internal/use-case/main-use-case/material-order-item/lib.go create mode 100644 internal/use-case/main-use-case/material-order-item/middleware-runner.go create mode 100644 internal/use-case/main-use-case/material-order-item/middleware.go create mode 100644 internal/use-case/main-use-case/material-order-item/tycovar.go create mode 100644 internal/use-case/main-use-case/material-order/case.go create mode 100644 internal/use-case/main-use-case/material-order/helper.go create mode 100644 internal/use-case/main-use-case/material-order/lib.go create mode 100644 internal/use-case/main-use-case/material-order/middleware-runner.go create mode 100644 internal/use-case/main-use-case/material-order/middleware.go create mode 100644 internal/use-case/main-use-case/material-order/tycovar.go create mode 100644 internal/use-case/main-use-case/mcu-order-item/case.go create mode 100644 internal/use-case/main-use-case/mcu-order-item/helper.go create mode 100644 internal/use-case/main-use-case/mcu-order-item/lib.go create mode 100644 internal/use-case/main-use-case/mcu-order-item/middleware-runner.go create mode 100644 internal/use-case/main-use-case/mcu-order-item/middleware.go create mode 100644 internal/use-case/main-use-case/mcu-order-item/tycovar.go create mode 100644 internal/use-case/main-use-case/mcu-order/case.go create mode 100644 internal/use-case/main-use-case/mcu-order/helper.go create mode 100644 internal/use-case/main-use-case/mcu-order/lib.go create mode 100644 internal/use-case/main-use-case/mcu-order/middleware-runner.go create mode 100644 internal/use-case/main-use-case/mcu-order/middleware.go create mode 100644 internal/use-case/main-use-case/mcu-order/tycovar.go create mode 100644 internal/use-case/main-use-case/medication-item-dist/case.go create mode 100644 internal/use-case/main-use-case/medication-item-dist/helper.go create mode 100644 internal/use-case/main-use-case/medication-item-dist/lib.go create mode 100644 internal/use-case/main-use-case/medication-item-dist/middleware-runner.go create mode 100644 internal/use-case/main-use-case/medication-item-dist/middleware.go create mode 100644 internal/use-case/main-use-case/medication-item-dist/tycovar.go create mode 100644 internal/use-case/main-use-case/medication-item/case.go create mode 100644 internal/use-case/main-use-case/medication-item/helper.go create mode 100644 internal/use-case/main-use-case/medication-item/lib.go create mode 100644 internal/use-case/main-use-case/medication-item/middleware-runner.go create mode 100644 internal/use-case/main-use-case/medication-item/middleware.go create mode 100644 internal/use-case/main-use-case/medication-item/tycovar.go create mode 100644 internal/use-case/main-use-case/medication/case.go create mode 100644 internal/use-case/main-use-case/medication/helper.go create mode 100644 internal/use-case/main-use-case/medication/lib.go create mode 100644 internal/use-case/main-use-case/medication/middleware-runner.go create mode 100644 internal/use-case/main-use-case/medication/middleware.go create mode 100644 internal/use-case/main-use-case/medication/tycovar.go create mode 100644 internal/use-case/main-use-case/prescription-item/case.go create mode 100644 internal/use-case/main-use-case/prescription-item/helper.go create mode 100644 internal/use-case/main-use-case/prescription-item/lib.go create mode 100644 internal/use-case/main-use-case/prescription-item/middleware-runner.go create mode 100644 internal/use-case/main-use-case/prescription-item/middleware.go create mode 100644 internal/use-case/main-use-case/prescription-item/tycovar.go create mode 100644 internal/use-case/main-use-case/prescription/case.go create mode 100644 internal/use-case/main-use-case/prescription/helper.go create mode 100644 internal/use-case/main-use-case/prescription/lib.go create mode 100644 internal/use-case/main-use-case/prescription/middleware-runner.go create mode 100644 internal/use-case/main-use-case/prescription/middleware.go create mode 100644 internal/use-case/main-use-case/prescription/tycovar.go diff --git a/internal/interface/main-handler/device-order-item/handler.go b/internal/interface/main-handler/device-order-item/handler.go new file mode 100644 index 00000000..42dfd510 --- /dev/null +++ b/internal/interface/main-handler/device-order-item/handler.go @@ -0,0 +1,71 @@ +package deviceorderitem + +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/device-order-item" + u "simrs-vx/internal/use-case/main-use-case/device-order-item" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/device-order/handler.go b/internal/interface/main-handler/device-order/handler.go new file mode 100644 index 00000000..d9b55d6a --- /dev/null +++ b/internal/interface/main-handler/device-order/handler.go @@ -0,0 +1,71 @@ +package deviceorder + +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/device-order" + u "simrs-vx/internal/use-case/main-use-case/device-order" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(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 363e9ad1..db155f73 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -7,10 +7,21 @@ import ( adime "simrs-vx/internal/interface/main-handler/adime" auth "simrs-vx/internal/interface/main-handler/authentication" counter "simrs-vx/internal/interface/main-handler/counter" + deviceorder "simrs-vx/internal/interface/main-handler/device-order" + deviceorderitem "simrs-vx/internal/interface/main-handler/device-order-item" encounter "simrs-vx/internal/interface/main-handler/encounter" + materialorder "simrs-vx/internal/interface/main-handler/material-order" + materialorderitem "simrs-vx/internal/interface/main-handler/material-order-item" + mcuorder "simrs-vx/internal/interface/main-handler/mcu-order" + mcuorderitem "simrs-vx/internal/interface/main-handler/mcu-order-item" + medication "simrs-vx/internal/interface/main-handler/medication" + medicationitem "simrs-vx/internal/interface/main-handler/medication-item" + medicationitemdist "simrs-vx/internal/interface/main-handler/medication-item-dist" medicicinemix "simrs-vx/internal/interface/main-handler/medicine-mix" medicicinemixitem "simrs-vx/internal/interface/main-handler/medicine-mix-item" practiceschedule "simrs-vx/internal/interface/main-handler/practice-schedule" + prescription "simrs-vx/internal/interface/main-handler/prescription" + prescriptionitem "simrs-vx/internal/interface/main-handler/prescription-item" sbar "simrs-vx/internal/interface/main-handler/sbar" soapi "simrs-vx/internal/interface/main-handler/soapi" @@ -139,6 +150,17 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/nurse", nurse.O) hc.RegCrud(r, "/v1/nutritionist", nutritionist.O) 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) /******************** sources ********************/ hc.RegCrud(r, "/v1/division", division.O) diff --git a/internal/interface/main-handler/material-order-item/handler.go b/internal/interface/main-handler/material-order-item/handler.go new file mode 100644 index 00000000..3b25f1d3 --- /dev/null +++ b/internal/interface/main-handler/material-order-item/handler.go @@ -0,0 +1,71 @@ +package materialorderitem + +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/material-order-item" + u "simrs-vx/internal/use-case/main-use-case/material-order-item" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/material-order/handler.go b/internal/interface/main-handler/material-order/handler.go new file mode 100644 index 00000000..cfea48f7 --- /dev/null +++ b/internal/interface/main-handler/material-order/handler.go @@ -0,0 +1,71 @@ +package materialorder + +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/material-order" + u "simrs-vx/internal/use-case/main-use-case/material-order" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/mcu-order-item/handler.go b/internal/interface/main-handler/mcu-order-item/handler.go new file mode 100644 index 00000000..a3a4bcc8 --- /dev/null +++ b/internal/interface/main-handler/mcu-order-item/handler.go @@ -0,0 +1,71 @@ +package mcuorderitem + +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/mcu-order-item" + u "simrs-vx/internal/use-case/main-use-case/mcu-order-item" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/mcu-order/handler.go b/internal/interface/main-handler/mcu-order/handler.go new file mode 100644 index 00000000..77e19669 --- /dev/null +++ b/internal/interface/main-handler/mcu-order/handler.go @@ -0,0 +1,71 @@ +package mcuorder + +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/mcu-order" + u "simrs-vx/internal/use-case/main-use-case/mcu-order" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(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 new file mode 100644 index 00000000..956a98ae --- /dev/null +++ b/internal/interface/main-handler/medication-item-dist/handler.go @@ -0,0 +1,71 @@ +package medicationitemdist + +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/medication-item-dist" + u "simrs-vx/internal/use-case/main-use-case/medication-item-dist" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(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 new file mode 100644 index 00000000..b5a5e6ae --- /dev/null +++ b/internal/interface/main-handler/medication-item/handler.go @@ -0,0 +1,71 @@ +package medicationitem + +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/medication-item" + u "simrs-vx/internal/use-case/main-use-case/medication-item" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/medication/handler.go b/internal/interface/main-handler/medication/handler.go new file mode 100644 index 00000000..269c2e6f --- /dev/null +++ b/internal/interface/main-handler/medication/handler.go @@ -0,0 +1,71 @@ +package medication + +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/medication" + u "simrs-vx/internal/use-case/main-use-case/medication" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/prescription-item/handler.go b/internal/interface/main-handler/prescription-item/handler.go new file mode 100644 index 00000000..faab4849 --- /dev/null +++ b/internal/interface/main-handler/prescription-item/handler.go @@ -0,0 +1,71 @@ +package prescriptionitem + +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/prescription-item" + u "simrs-vx/internal/use-case/main-use-case/prescription-item" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/prescription/handler.go b/internal/interface/main-handler/prescription/handler.go new file mode 100644 index 00000000..25ee9469 --- /dev/null +++ b/internal/interface/main-handler/prescription/handler.go @@ -0,0 +1,71 @@ +package prescription + +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/prescription" + u "simrs-vx/internal/use-case/main-use-case/prescription" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/device-order-item/case.go b/internal/use-case/main-use-case/device-order-item/case.go new file mode 100644 index 00000000..d4920979 --- /dev/null +++ b/internal/use-case/main-use-case/device-order-item/case.go @@ -0,0 +1,279 @@ +package deviceorderitem + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/device-order-item" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "device-order-item" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.DeviceOrderItem{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.DeviceOrderItem + var dataList []e.DeviceOrderItem + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.DeviceOrderItem + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.DeviceOrderItem + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.DeviceOrderItem + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} 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 new file mode 100644 index 00000000..d618afae --- /dev/null +++ b/internal/use-case/main-use-case/device-order-item/helper.go @@ -0,0 +1,22 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package deviceorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/device-order-item" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DeviceOrderItem) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.DeviceOrder_Id = inputSrc.DeviceOrder_Id + data.Device_Id = inputSrc.Device_Id +} diff --git a/internal/use-case/main-use-case/device-order-item/lib.go b/internal/use-case/main-use-case/device-order-item/lib.go new file mode 100644 index 00000000..ab36a7a1 --- /dev/null +++ b/internal/use-case/main-use-case/device-order-item/lib.go @@ -0,0 +1,155 @@ +package deviceorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/device-order-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.DeviceOrderItem, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.DeviceOrderItem{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.DeviceOrderItem, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.DeviceOrderItem{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.DeviceOrderItem{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.DeviceOrderItem, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.DeviceOrderItem{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.DeviceOrderItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.DeviceOrderItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/device-order-item/middleware-runner.go b/internal/use-case/main-use-case/device-order-item/middleware-runner.go new file mode 100644 index 00000000..6722ef63 --- /dev/null +++ b/internal/use-case/main-use-case/device-order-item/middleware-runner.go @@ -0,0 +1,103 @@ +package deviceorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/device-order-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.DeviceOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.DeviceOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.DeviceOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.DeviceOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.DeviceOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/device-order-item/middleware.go b/internal/use-case/main-use-case/device-order-item/middleware.go new file mode 100644 index 00000000..c43a462b --- /dev/null +++ b/internal/use-case/main-use-case/device-order-item/middleware.go @@ -0,0 +1,9 @@ +package deviceorderitem + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/device-order-item/tycovar.go b/internal/use-case/main-use-case/device-order-item/tycovar.go new file mode 100644 index 00000000..b5801749 --- /dev/null +++ b/internal/use-case/main-use-case/device-order-item/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package deviceorderitem + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/device-order-item" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.DeviceOrderItem, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.DeviceOrderItem, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.DeviceOrderItem, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/device-order/case.go b/internal/use-case/main-use-case/device-order/case.go new file mode 100644 index 00000000..c4f1ebe5 --- /dev/null +++ b/internal/use-case/main-use-case/device-order/case.go @@ -0,0 +1,279 @@ +package deviceorder + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/device-order" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "device-order" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.DeviceOrder{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.DeviceOrder + var dataList []e.DeviceOrder + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.DeviceOrder + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.DeviceOrder + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.DeviceOrder + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + 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 new file mode 100644 index 00000000..975ef50b --- /dev/null +++ b/internal/use-case/main-use-case/device-order/helper.go @@ -0,0 +1,21 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package deviceorder + +import ( + e "simrs-vx/internal/domain/main-entities/device-order" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DeviceOrder) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id +} diff --git a/internal/use-case/main-use-case/device-order/lib.go b/internal/use-case/main-use-case/device-order/lib.go new file mode 100644 index 00000000..20f344c3 --- /dev/null +++ b/internal/use-case/main-use-case/device-order/lib.go @@ -0,0 +1,155 @@ +package deviceorder + +import ( + e "simrs-vx/internal/domain/main-entities/device-order" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.DeviceOrder, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.DeviceOrder{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.DeviceOrder, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.DeviceOrder{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.DeviceOrder{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.DeviceOrder, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.DeviceOrder{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.DeviceOrder, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.DeviceOrder, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/device-order/middleware-runner.go b/internal/use-case/main-use-case/device-order/middleware-runner.go new file mode 100644 index 00000000..7628d931 --- /dev/null +++ b/internal/use-case/main-use-case/device-order/middleware-runner.go @@ -0,0 +1,103 @@ +package deviceorder + +import ( + e "simrs-vx/internal/domain/main-entities/device-order" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.DeviceOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.DeviceOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.DeviceOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.DeviceOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.DeviceOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/device-order/middleware.go b/internal/use-case/main-use-case/device-order/middleware.go new file mode 100644 index 00000000..a8765213 --- /dev/null +++ b/internal/use-case/main-use-case/device-order/middleware.go @@ -0,0 +1,9 @@ +package deviceorder + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/device-order/tycovar.go b/internal/use-case/main-use-case/device-order/tycovar.go new file mode 100644 index 00000000..9faa49d6 --- /dev/null +++ b/internal/use-case/main-use-case/device-order/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package deviceorder + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/device-order" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.DeviceOrder, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.DeviceOrder, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.DeviceOrder, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/material-order-item/case.go b/internal/use-case/main-use-case/material-order-item/case.go new file mode 100644 index 00000000..497c3b02 --- /dev/null +++ b/internal/use-case/main-use-case/material-order-item/case.go @@ -0,0 +1,279 @@ +package materialorderitem + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/material-order-item" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "material-order-item" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.MaterialOrderItem{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.MaterialOrderItem + var dataList []e.MaterialOrderItem + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.MaterialOrderItem + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MaterialOrderItem + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MaterialOrderItem + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/material-order-item/helper.go b/internal/use-case/main-use-case/material-order-item/helper.go new file mode 100644 index 00000000..25e89a21 --- /dev/null +++ b/internal/use-case/main-use-case/material-order-item/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package materialorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/material-order-item" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MaterialOrderItem) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.MaterialOrder_Id = inputSrc.MaterialOrder_Id + data.Material_Id = inputSrc.Material_Id + data.Count = inputSrc.Count +} diff --git a/internal/use-case/main-use-case/material-order-item/lib.go b/internal/use-case/main-use-case/material-order-item/lib.go new file mode 100644 index 00000000..4daf147c --- /dev/null +++ b/internal/use-case/main-use-case/material-order-item/lib.go @@ -0,0 +1,155 @@ +package materialorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/material-order-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.MaterialOrderItem, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.MaterialOrderItem{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.MaterialOrderItem, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.MaterialOrderItem{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.MaterialOrderItem{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.MaterialOrderItem, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.MaterialOrderItem{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.MaterialOrderItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.MaterialOrderItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/material-order-item/middleware-runner.go b/internal/use-case/main-use-case/material-order-item/middleware-runner.go new file mode 100644 index 00000000..4cb38f03 --- /dev/null +++ b/internal/use-case/main-use-case/material-order-item/middleware-runner.go @@ -0,0 +1,103 @@ +package materialorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/material-order-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.MaterialOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.MaterialOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/material-order-item/middleware.go b/internal/use-case/main-use-case/material-order-item/middleware.go new file mode 100644 index 00000000..1ed7165d --- /dev/null +++ b/internal/use-case/main-use-case/material-order-item/middleware.go @@ -0,0 +1,9 @@ +package materialorderitem + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/material-order-item/tycovar.go b/internal/use-case/main-use-case/material-order-item/tycovar.go new file mode 100644 index 00000000..adad9821 --- /dev/null +++ b/internal/use-case/main-use-case/material-order-item/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package materialorderitem + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/material-order-item" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.MaterialOrderItem, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.MaterialOrderItem, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.MaterialOrderItem, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/material-order/case.go b/internal/use-case/main-use-case/material-order/case.go new file mode 100644 index 00000000..f566015f --- /dev/null +++ b/internal/use-case/main-use-case/material-order/case.go @@ -0,0 +1,279 @@ +package materialorder + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/material-order" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "material-order" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.MaterialOrder{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.MaterialOrder + var dataList []e.MaterialOrder + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.MaterialOrder + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MaterialOrder + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MaterialOrder + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + 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 new file mode 100644 index 00000000..565d2487 --- /dev/null +++ b/internal/use-case/main-use-case/material-order/helper.go @@ -0,0 +1,21 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package materialorder + +import ( + e "simrs-vx/internal/domain/main-entities/material-order" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MaterialOrder) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id +} diff --git a/internal/use-case/main-use-case/material-order/lib.go b/internal/use-case/main-use-case/material-order/lib.go new file mode 100644 index 00000000..27b91ce1 --- /dev/null +++ b/internal/use-case/main-use-case/material-order/lib.go @@ -0,0 +1,155 @@ +package materialorder + +import ( + e "simrs-vx/internal/domain/main-entities/material-order" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.MaterialOrder, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.MaterialOrder{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.MaterialOrder, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.MaterialOrder{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.MaterialOrder{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.MaterialOrder, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.MaterialOrder{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.MaterialOrder, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.MaterialOrder, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/material-order/middleware-runner.go b/internal/use-case/main-use-case/material-order/middleware-runner.go new file mode 100644 index 00000000..0e872c9e --- /dev/null +++ b/internal/use-case/main-use-case/material-order/middleware-runner.go @@ -0,0 +1,103 @@ +package materialorder + +import ( + e "simrs-vx/internal/domain/main-entities/material-order" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.MaterialOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.MaterialOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MaterialOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/material-order/middleware.go b/internal/use-case/main-use-case/material-order/middleware.go new file mode 100644 index 00000000..e6bb67d6 --- /dev/null +++ b/internal/use-case/main-use-case/material-order/middleware.go @@ -0,0 +1,9 @@ +package materialorder + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/material-order/tycovar.go b/internal/use-case/main-use-case/material-order/tycovar.go new file mode 100644 index 00000000..5aaff1ce --- /dev/null +++ b/internal/use-case/main-use-case/material-order/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package materialorder + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/material-order" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.MaterialOrder, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.MaterialOrder, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.MaterialOrder, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/mcu-order-item/case.go b/internal/use-case/main-use-case/mcu-order-item/case.go new file mode 100644 index 00000000..74323143 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-item/case.go @@ -0,0 +1,279 @@ +package mcuorderitem + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/mcu-order-item" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "mcu-order-item" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.McuOrderItem{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.McuOrderItem + var dataList []e.McuOrderItem + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.McuOrderItem + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuOrderItem + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuOrderItem + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/mcu-order-item/helper.go b/internal/use-case/main-use-case/mcu-order-item/helper.go new file mode 100644 index 00000000..48eaaf09 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-item/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package mcuorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order-item" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuOrderItem) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.McuOrder_Id = inputSrc.McuOrder_Id + data.McuSrc_Id = inputSrc.McuSrc_Id + data.Result = inputSrc.Result + data.Status_Code = inputSrc.Status_Code +} diff --git a/internal/use-case/main-use-case/mcu-order-item/lib.go b/internal/use-case/main-use-case/mcu-order-item/lib.go new file mode 100644 index 00000000..be5c0374 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-item/lib.go @@ -0,0 +1,155 @@ +package mcuorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrderItem, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.McuOrderItem{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.McuOrderItem, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.McuOrderItem{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.McuOrderItem{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrderItem, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.McuOrderItem{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.McuOrderItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.McuOrderItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/mcu-order-item/middleware-runner.go b/internal/use-case/main-use-case/mcu-order-item/middleware-runner.go new file mode 100644 index 00000000..d80da394 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-item/middleware-runner.go @@ -0,0 +1,103 @@ +package mcuorderitem + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.McuOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.McuOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrderItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/mcu-order-item/middleware.go b/internal/use-case/main-use-case/mcu-order-item/middleware.go new file mode 100644 index 00000000..33e97e3d --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-item/middleware.go @@ -0,0 +1,9 @@ +package mcuorderitem + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/mcu-order-item/tycovar.go b/internal/use-case/main-use-case/mcu-order-item/tycovar.go new file mode 100644 index 00000000..4e3f10b2 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-item/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package mcuorderitem + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/mcu-order-item" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.McuOrderItem, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.McuOrderItem, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.McuOrderItem, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/mcu-order/case.go b/internal/use-case/main-use-case/mcu-order/case.go new file mode 100644 index 00000000..b000ffc8 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order/case.go @@ -0,0 +1,279 @@ +package mcuorder + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/mcu-order" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "mcu-order" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.McuOrder{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.McuOrder + var dataList []e.McuOrder + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.McuOrder + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuOrder + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuOrder + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/mcu-order/helper.go b/internal/use-case/main-use-case/mcu-order/helper.go new file mode 100644 index 00000000..cb0b9878 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package mcuorder + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuOrder) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Status_Code = inputSrc.Status_Code + data.Doctor_Id = inputSrc.Doctor_Id +} diff --git a/internal/use-case/main-use-case/mcu-order/lib.go b/internal/use-case/main-use-case/mcu-order/lib.go new file mode 100644 index 00000000..1cfd7adc --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order/lib.go @@ -0,0 +1,155 @@ +package mcuorder + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrder, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.McuOrder{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.McuOrder, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.McuOrder{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.McuOrder{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrder, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.McuOrder{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.McuOrder, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.McuOrder, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/mcu-order/middleware-runner.go b/internal/use-case/main-use-case/mcu-order/middleware-runner.go new file mode 100644 index 00000000..00db4da6 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order/middleware-runner.go @@ -0,0 +1,103 @@ +package mcuorder + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.McuOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.McuOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrder) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/mcu-order/middleware.go b/internal/use-case/main-use-case/mcu-order/middleware.go new file mode 100644 index 00000000..7c033a49 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order/middleware.go @@ -0,0 +1,9 @@ +package mcuorder + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/mcu-order/tycovar.go b/internal/use-case/main-use-case/mcu-order/tycovar.go new file mode 100644 index 00000000..a4c8de62 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package mcuorder + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/mcu-order" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.McuOrder, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.McuOrder, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.McuOrder, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw 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 new file mode 100644 index 00000000..c2b87993 --- /dev/null +++ b/internal/use-case/main-use-case/medication-item-dist/case.go @@ -0,0 +1,279 @@ +package medicationitemdist + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/medication-item-dist" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "medication-item-dist" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.MedicationItemDist{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.MedicationItemDist + var dataList []e.MedicationItemDist + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.MedicationItemDist + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MedicationItemDist + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MedicationItemDist + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + 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 new file mode 100644 index 00000000..eadc8958 --- /dev/null +++ b/internal/use-case/main-use-case/medication-item-dist/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package medicationitemdist + +import ( + e "simrs-vx/internal/domain/main-entities/medication-item-dist" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicationItemDist) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.MedicationItem_Id = inputSrc.MedicationItem_Id + data.DateTime = inputSrc.DateTime + data.Remain = inputSrc.Remain +} diff --git a/internal/use-case/main-use-case/medication-item-dist/lib.go b/internal/use-case/main-use-case/medication-item-dist/lib.go new file mode 100644 index 00000000..f39b8753 --- /dev/null +++ b/internal/use-case/main-use-case/medication-item-dist/lib.go @@ -0,0 +1,155 @@ +package medicationitemdist + +import ( + e "simrs-vx/internal/domain/main-entities/medication-item-dist" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.MedicationItemDist, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.MedicationItemDist{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.MedicationItemDist, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.MedicationItemDist{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.MedicationItemDist{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.MedicationItemDist, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.MedicationItemDist{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.MedicationItemDist, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.MedicationItemDist, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/medication-item-dist/middleware-runner.go b/internal/use-case/main-use-case/medication-item-dist/middleware-runner.go new file mode 100644 index 00000000..8dc45e4f --- /dev/null +++ b/internal/use-case/main-use-case/medication-item-dist/middleware-runner.go @@ -0,0 +1,103 @@ +package medicationitemdist + +import ( + e "simrs-vx/internal/domain/main-entities/medication-item-dist" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.MedicationItemDist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.MedicationItemDist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MedicationItemDist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MedicationItemDist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MedicationItemDist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/medication-item-dist/middleware.go b/internal/use-case/main-use-case/medication-item-dist/middleware.go new file mode 100644 index 00000000..e519da96 --- /dev/null +++ b/internal/use-case/main-use-case/medication-item-dist/middleware.go @@ -0,0 +1,9 @@ +package medicationitemdist + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/medication-item-dist/tycovar.go b/internal/use-case/main-use-case/medication-item-dist/tycovar.go new file mode 100644 index 00000000..38334e8b --- /dev/null +++ b/internal/use-case/main-use-case/medication-item-dist/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package medicationitemdist + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/medication-item-dist" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.MedicationItemDist, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.MedicationItemDist, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.MedicationItemDist, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/medication-item/case.go b/internal/use-case/main-use-case/medication-item/case.go new file mode 100644 index 00000000..1573a5a7 --- /dev/null +++ b/internal/use-case/main-use-case/medication-item/case.go @@ -0,0 +1,279 @@ +package medicationitem + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/medication-item" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "medication-item" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.MedicationItem{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.MedicationItem + var dataList []e.MedicationItem + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.MedicationItem + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MedicationItem + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.MedicationItem + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + 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 new file mode 100644 index 00000000..67b8a204 --- /dev/null +++ b/internal/use-case/main-use-case/medication-item/helper.go @@ -0,0 +1,26 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package medicationitem + +import ( + e "simrs-vx/internal/domain/main-entities/medication-item" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicationItem) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Medication_Id = inputSrc.Medication_Id + data.IsMix = inputSrc.IsMix + data.Medicine_Id = inputSrc.Medicine_Id + data.MedicineMix_Id = inputSrc.MedicineMix_Id + data.Usage = inputSrc.Usage + data.Interval = inputSrc.Interval +} diff --git a/internal/use-case/main-use-case/medication-item/lib.go b/internal/use-case/main-use-case/medication-item/lib.go new file mode 100644 index 00000000..3dbab755 --- /dev/null +++ b/internal/use-case/main-use-case/medication-item/lib.go @@ -0,0 +1,155 @@ +package medicationitem + +import ( + e "simrs-vx/internal/domain/main-entities/medication-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.MedicationItem, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.MedicationItem{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.MedicationItem, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.MedicationItem{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.MedicationItem{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.MedicationItem, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.MedicationItem{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.MedicationItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.MedicationItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/medication-item/middleware-runner.go b/internal/use-case/main-use-case/medication-item/middleware-runner.go new file mode 100644 index 00000000..875f8235 --- /dev/null +++ b/internal/use-case/main-use-case/medication-item/middleware-runner.go @@ -0,0 +1,103 @@ +package medicationitem + +import ( + e "simrs-vx/internal/domain/main-entities/medication-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.MedicationItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.MedicationItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MedicationItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MedicationItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.MedicationItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/medication-item/middleware.go b/internal/use-case/main-use-case/medication-item/middleware.go new file mode 100644 index 00000000..5fa37ffe --- /dev/null +++ b/internal/use-case/main-use-case/medication-item/middleware.go @@ -0,0 +1,9 @@ +package medicationitem + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/medication-item/tycovar.go b/internal/use-case/main-use-case/medication-item/tycovar.go new file mode 100644 index 00000000..04d1d95b --- /dev/null +++ b/internal/use-case/main-use-case/medication-item/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package medicationitem + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/medication-item" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.MedicationItem, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.MedicationItem, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.MedicationItem, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/medication/case.go b/internal/use-case/main-use-case/medication/case.go new file mode 100644 index 00000000..df23a586 --- /dev/null +++ b/internal/use-case/main-use-case/medication/case.go @@ -0,0 +1,279 @@ +package medication + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/medication" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "medication" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Medication{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Medication + var dataList []e.Medication + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Medication + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Medication + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Medication + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + 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 new file mode 100644 index 00000000..f2d545ac --- /dev/null +++ b/internal/use-case/main-use-case/medication/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package medication + +import ( + e "simrs-vx/internal/domain/main-entities/medication" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Medication) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.IssuedAt = inputSrc.IssuedAt + data.Pharmacist_Id = inputSrc.Pharmacist_Id +} diff --git a/internal/use-case/main-use-case/medication/lib.go b/internal/use-case/main-use-case/medication/lib.go new file mode 100644 index 00000000..95488f11 --- /dev/null +++ b/internal/use-case/main-use-case/medication/lib.go @@ -0,0 +1,155 @@ +package medication + +import ( + e "simrs-vx/internal/domain/main-entities/medication" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medication, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Medication{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Medication, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Medication{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Medication{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medication, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Medication{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Medication, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Medication, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/medication/middleware-runner.go b/internal/use-case/main-use-case/medication/middleware-runner.go new file mode 100644 index 00000000..88d9b728 --- /dev/null +++ b/internal/use-case/main-use-case/medication/middleware-runner.go @@ -0,0 +1,103 @@ +package medication + +import ( + e "simrs-vx/internal/domain/main-entities/medication" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Medication) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Medication) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Medication) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Medication) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Medication) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/medication/middleware.go b/internal/use-case/main-use-case/medication/middleware.go new file mode 100644 index 00000000..0eac76a7 --- /dev/null +++ b/internal/use-case/main-use-case/medication/middleware.go @@ -0,0 +1,9 @@ +package medication + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/medication/tycovar.go b/internal/use-case/main-use-case/medication/tycovar.go new file mode 100644 index 00000000..5c9cbd8b --- /dev/null +++ b/internal/use-case/main-use-case/medication/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package medication + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/medication" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Medication, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Medication, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Medication, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/prescription-item/case.go b/internal/use-case/main-use-case/prescription-item/case.go new file mode 100644 index 00000000..a6dd7be1 --- /dev/null +++ b/internal/use-case/main-use-case/prescription-item/case.go @@ -0,0 +1,279 @@ +package prescriptionitem + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/prescription-item" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "prescription-item" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.PrescriptionItem{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.PrescriptionItem + var dataList []e.PrescriptionItem + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.PrescriptionItem + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.PrescriptionItem + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.PrescriptionItem + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, 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 new file mode 100644 index 00000000..e63ca8c7 --- /dev/null +++ b/internal/use-case/main-use-case/prescription-item/helper.go @@ -0,0 +1,26 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package prescriptionitem + +import ( + e "simrs-vx/internal/domain/main-entities/prescription-item" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PrescriptionItem) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Prescription_Id = inputSrc.Prescription_Id + data.IsMix = inputSrc.IsMix + data.Medicine_Id = inputSrc.Medicine_Id + data.MedicineMix_Id = inputSrc.MedicineMix_Id + data.Usage = inputSrc.Usage + data.Interval = inputSrc.Interval +} diff --git a/internal/use-case/main-use-case/prescription-item/lib.go b/internal/use-case/main-use-case/prescription-item/lib.go new file mode 100644 index 00000000..800096fd --- /dev/null +++ b/internal/use-case/main-use-case/prescription-item/lib.go @@ -0,0 +1,155 @@ +package prescriptionitem + +import ( + e "simrs-vx/internal/domain/main-entities/prescription-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PrescriptionItem, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.PrescriptionItem{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.PrescriptionItem, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.PrescriptionItem{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.PrescriptionItem{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.PrescriptionItem, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.PrescriptionItem{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.PrescriptionItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.PrescriptionItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/prescription-item/middleware-runner.go b/internal/use-case/main-use-case/prescription-item/middleware-runner.go new file mode 100644 index 00000000..04d5aa00 --- /dev/null +++ b/internal/use-case/main-use-case/prescription-item/middleware-runner.go @@ -0,0 +1,103 @@ +package prescriptionitem + +import ( + e "simrs-vx/internal/domain/main-entities/prescription-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.PrescriptionItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.PrescriptionItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PrescriptionItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PrescriptionItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PrescriptionItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/prescription-item/middleware.go b/internal/use-case/main-use-case/prescription-item/middleware.go new file mode 100644 index 00000000..23d4fe7a --- /dev/null +++ b/internal/use-case/main-use-case/prescription-item/middleware.go @@ -0,0 +1,9 @@ +package prescriptionitem + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/prescription-item/tycovar.go b/internal/use-case/main-use-case/prescription-item/tycovar.go new file mode 100644 index 00000000..9ec60a94 --- /dev/null +++ b/internal/use-case/main-use-case/prescription-item/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package prescriptionitem + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/prescription-item" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.PrescriptionItem, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.PrescriptionItem, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.PrescriptionItem, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/prescription/case.go b/internal/use-case/main-use-case/prescription/case.go new file mode 100644 index 00000000..9b0baeb2 --- /dev/null +++ b/internal/use-case/main-use-case/prescription/case.go @@ -0,0 +1,279 @@ +package prescription + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/prescription" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "prescription" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Prescription{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Prescription + var dataList []e.Prescription + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Prescription + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Prescription + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Prescription + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/prescription/helper.go b/internal/use-case/main-use-case/prescription/helper.go new file mode 100644 index 00000000..768d11bd --- /dev/null +++ b/internal/use-case/main-use-case/prescription/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package prescription + +import ( + e "simrs-vx/internal/domain/main-entities/prescription" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Prescription) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Doctor_Id = inputSrc.Doctor_Id + data.IssuedAt = inputSrc.IssuedAt +} diff --git a/internal/use-case/main-use-case/prescription/lib.go b/internal/use-case/main-use-case/prescription/lib.go new file mode 100644 index 00000000..bf1fe36b --- /dev/null +++ b/internal/use-case/main-use-case/prescription/lib.go @@ -0,0 +1,155 @@ +package prescription + +import ( + e "simrs-vx/internal/domain/main-entities/prescription" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Prescription, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Prescription{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Prescription, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Prescription{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Prescription{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Prescription, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Prescription{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Prescription, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Prescription, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/prescription/middleware-runner.go b/internal/use-case/main-use-case/prescription/middleware-runner.go new file mode 100644 index 00000000..e5ccb023 --- /dev/null +++ b/internal/use-case/main-use-case/prescription/middleware-runner.go @@ -0,0 +1,103 @@ +package prescription + +import ( + e "simrs-vx/internal/domain/main-entities/prescription" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Prescription) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Prescription) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Prescription) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Prescription) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Prescription) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/prescription/middleware.go b/internal/use-case/main-use-case/prescription/middleware.go new file mode 100644 index 00000000..6a61bfc6 --- /dev/null +++ b/internal/use-case/main-use-case/prescription/middleware.go @@ -0,0 +1,9 @@ +package prescription + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/prescription/tycovar.go b/internal/use-case/main-use-case/prescription/tycovar.go new file mode 100644 index 00000000..ab938fce --- /dev/null +++ b/internal/use-case/main-use-case/prescription/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package prescription + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/prescription" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Prescription, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Prescription, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Prescription, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From 29f0ff688762fb768533fd92d189d9f67bc2477e Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 15 Sep 2025 19:36:26 +0700 Subject: [PATCH 032/190] add migration for several order tables --- .../migrations/20250915123412.sql | 146 ++++++++++++++++++ cmd/main-migration/migrations/atlas.sum | 3 +- .../main-entities/medication-item/dto.go | 68 ++++---- .../main-entities/medication-item/entity.go | 24 +-- .../main-entities/prescription-item/dto.go | 65 ++++---- .../main-entities/prescription-item/entity.go | 24 +-- 6 files changed, 244 insertions(+), 86 deletions(-) create mode 100644 cmd/main-migration/migrations/20250915123412.sql diff --git a/cmd/main-migration/migrations/20250915123412.sql b/cmd/main-migration/migrations/20250915123412.sql new file mode 100644 index 00000000..5bb948f0 --- /dev/null +++ b/cmd/main-migration/migrations/20250915123412.sql @@ -0,0 +1,146 @@ +-- Create "DeviceOrder" table +CREATE TABLE "public"."DeviceOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_DeviceOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "DeviceOrderItem" table +CREATE TABLE "public"."DeviceOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "DeviceOrder_Id" bigint NULL, + "Device_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_DeviceOrderItem_Device" FOREIGN KEY ("Device_Id") REFERENCES "public"."Device" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_DeviceOrderItem_DeviceOrder" FOREIGN KEY ("DeviceOrder_Id") REFERENCES "public"."DeviceOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MaterialOrder" table +CREATE TABLE "public"."MaterialOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_MaterialOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MaterialOrderItem" table +CREATE TABLE "public"."MaterialOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "MaterialOrder_Id" bigint NULL, + "Material_Id" bigint NULL, + "Count" integer NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_MaterialOrderItem_Material" FOREIGN KEY ("Material_Id") REFERENCES "public"."Material" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_MaterialOrderItem_MaterialOrder" FOREIGN KEY ("MaterialOrder_Id") REFERENCES "public"."MaterialOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "McuOrder" table +CREATE TABLE "public"."McuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Status_Code" character varying(10) NOT NULL, + "Doctor_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_McuOrder_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_McuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "McuOrderItem" table +CREATE TABLE "public"."McuOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "McuOrder_Id" bigint NULL, + "McuSrc_Id" bigint NULL, + "Result" text NULL, + "Status_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_McuOrderItem_McuOrder" FOREIGN KEY ("McuOrder_Id") REFERENCES "public"."McuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_McuOrderItem_McuSrc" FOREIGN KEY ("McuSrc_Id") REFERENCES "public"."McuSrc" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Medication" table +CREATE TABLE "public"."Medication" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "IssuedAt" timestamptz NULL, + "Pharmacist_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Medication_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Medication_Pharmacist" FOREIGN KEY ("Pharmacist_Id") REFERENCES "public"."Pharmacist" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MedicationItem" table +CREATE TABLE "public"."MedicationItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Medication_Id" bigint NULL, + "IsMix" boolean NULL, + "Medicine_Id" bigint NULL, + "MedicineMix_Id" bigint NULL, + "Usage" smallint NULL, + "Interval" smallint NULL, + "IntervalUnit_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_MedicationItem_Medication" FOREIGN KEY ("Medication_Id") REFERENCES "public"."Medication" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_MedicationItem_Medicine" FOREIGN KEY ("Medicine_Id") REFERENCES "public"."Medicine" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_MedicationItem_MedicineMix" FOREIGN KEY ("MedicineMix_Id") REFERENCES "public"."MedicineMix" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MedicationItemDist" table +CREATE TABLE "public"."MedicationItemDist" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "MedicationItem_Id" bigint NULL, + "DateTime" timestamptz NULL, + "Remain" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_MedicationItemDist_MedicationItem" FOREIGN KEY ("MedicationItem_Id") REFERENCES "public"."MedicationItem" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Prescription" table +CREATE TABLE "public"."Prescription" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Doctor_Id" bigint NULL, + "IssuedAt" timestamptz NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Prescription_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Prescription_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "PrescriptionItem" table +CREATE TABLE "public"."PrescriptionItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Prescription_Id" bigint NULL, + "IsMix" boolean NULL, + "Medicine_Id" bigint NULL, + "MedicineMix_Id" bigint NULL, + "Usage" smallint NULL, + "Interval" smallint NULL, + "IntervalUnit_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_PrescriptionItem_Medicine" FOREIGN KEY ("Medicine_Id") REFERENCES "public"."Medicine" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_PrescriptionItem_MedicineMix" FOREIGN KEY ("MedicineMix_Id") REFERENCES "public"."MedicineMix" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_PrescriptionItem_Prescription" FOREIGN KEY ("Prescription_Id") REFERENCES "public"."Prescription" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 3482f994..7bc09afb 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:BLtMDgAdnqZbCj3HUbiTlyYtA87C4LcP/uquCbM6GSE= +h1:vKW524Os6+DLuWTIk2ogb2LnlRoaYqgz1GLvvmc2KYA= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -6,3 +6,4 @@ h1:BLtMDgAdnqZbCj3HUbiTlyYtA87C4LcP/uquCbM6GSE= 20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= 20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= 20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:CndzsEFauRnieT/Qv/kqZ5Gr49g6f127Tq/fskHAPwg= diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go index 2b4e0ed1..59ae7688 100644 --- a/internal/domain/main-entities/medication-item/dto.go +++ b/internal/domain/main-entities/medication-item/dto.go @@ -5,16 +5,17 @@ import ( eme "simrs-vx/internal/domain/main-entities/medication" em "simrs-vx/internal/domain/main-entities/medicine" emm "simrs-vx/internal/domain/main-entities/medicine-mix" + erc "simrs-vx/internal/domain/references/common" ) type CreateDto struct { - Medication_Id *uint `json:"medication_id"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - MedicineMix_Id *uint `json:"medicineMix_id"` - Usage uint8 `json:"usage"` - Interval uint8 `json:"interval"` - // IntervalUnit_Code + Medication_Id *uint `json:"medication_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } type ReadListDto struct { @@ -24,13 +25,13 @@ type ReadListDto struct { } type FilterDto struct { - Medication_Id *uint `json:"medication_id"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - MedicineMix_Id *uint `json:"medicineMix_id"` - Usage uint8 `json:"usage"` - Interval uint8 `json:"interval"` - // IntervalUnit_Code + Medication_Id *uint `json:"medication_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -57,29 +58,30 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Medication_Id *uint `json:"medication_id"` - Medication *eme.Medication `json:"medication,omitempty"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - Medicine *em.Medicine `json:"medicine,omitempty"` - MedicineMix_Id *uint `json:"medicineMix_id"` - MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` - Usage uint8 `json:"usage"` - Interval uint8 `json:"interval"` - // IntervalUnit_Code + Medication_Id *uint `json:"medication_id"` + Medication *eme.Medication `json:"medication,omitempty"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty"` + MedicineMix_Id *uint `json:"medicineMix_id"` + MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } func (d MedicationItem) ToResponse() ResponseDto { resp := ResponseDto{ - Medication_Id: d.Medication_Id, - Medication: d.Medication, - IsMix: d.IsMix, - Medicine_Id: d.Medicine_Id, - Medicine: d.Medicine, - MedicineMix_Id: d.MedicineMix_Id, - MedicineMix: d.MedicineMix, - Usage: d.Usage, - Interval: d.Interval, + Medication_Id: d.Medication_Id, + Medication: d.Medication, + IsMix: d.IsMix, + Medicine_Id: d.Medicine_Id, + Medicine: d.Medicine, + MedicineMix_Id: d.MedicineMix_Id, + MedicineMix: d.MedicineMix, + Usage: d.Usage, + Interval: d.Interval, + IntervalUnit_Code: d.IntervalUnit_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/medication-item/entity.go b/internal/domain/main-entities/medication-item/entity.go index 160b7dec..ef7f20ea 100644 --- a/internal/domain/main-entities/medication-item/entity.go +++ b/internal/domain/main-entities/medication-item/entity.go @@ -5,18 +5,20 @@ import ( eme "simrs-vx/internal/domain/main-entities/medication" em "simrs-vx/internal/domain/main-entities/medicine" emm "simrs-vx/internal/domain/main-entities/medicine-mix" + + erc "simrs-vx/internal/domain/references/common" ) type MedicationItem struct { - ecore.Main // adjust this according to the needs - Medication_Id *uint `json:"medication_id"` - Medication *eme.Medication `json:"medication,omitempty" gorm:"foreignKey:Medication_Id;references:Id"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` - MedicineMix_Id *uint `json:"medicineMix_id"` - MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` - Usage uint8 `json:"usage"` - Interval uint8 `json:"interval"` - // IntervalUnit_Code + ecore.Main // adjust this according to the needs + Medication_Id *uint `json:"medication_id"` + Medication *eme.Medication `json:"medication,omitempty" gorm:"foreignKey:Medication_Id;references:Id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index 9d28a511..a87daaae 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -5,15 +5,17 @@ import ( em "simrs-vx/internal/domain/main-entities/medicine" emm "simrs-vx/internal/domain/main-entities/medicine-mix" ep "simrs-vx/internal/domain/main-entities/prescription" + erc "simrs-vx/internal/domain/references/common" ) type CreateDto struct { - Prescription_Id *uint `json:"prescription_id"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - MedicineMix_Id *uint `json:"medicineMix_id"` - Usage uint8 `json:"usage"` - Interval uint8 `json:"interval"` + Prescription_Id *uint `json:"prescription_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } type ReadListDto struct { @@ -23,12 +25,13 @@ type ReadListDto struct { } type FilterDto struct { - Prescription_Id *uint `json:"prescription_id"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - MedicineMix_Id *uint `json:"medicineMix_id"` - Usage uint8 `json:"usage"` - Interval uint8 `json:"interval"` + Prescription_Id *uint `json:"prescription_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -55,28 +58,30 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Prescription_Id *uint `json:"prescription_id"` - Prescription *ep.Prescription `json:"prescription,omitempty"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - Medicine *em.Medicine `json:"medicine,omitempty"` - MedicineMix_Id *uint `json:"medicineMix_id"` - MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` - Usage uint8 `json:"usage"` - Interval uint8 `json:"interval"` + Prescription_Id *uint `json:"prescription_id"` + Prescription *ep.Prescription `json:"prescription,omitempty"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty"` + MedicineMix_Id *uint `json:"medicineMix_id"` + MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } func (d PrescriptionItem) ToResponse() ResponseDto { resp := ResponseDto{ - Prescription_Id: d.Prescription_Id, - Prescription: d.Prescription, - IsMix: d.IsMix, - Medicine_Id: d.Medicine_Id, - Medicine: d.Medicine, - MedicineMix_Id: d.MedicineMix_Id, - MedicineMix: d.MedicineMix, - Usage: d.Usage, - Interval: d.Interval, + Prescription_Id: d.Prescription_Id, + Prescription: d.Prescription, + IsMix: d.IsMix, + Medicine_Id: d.Medicine_Id, + Medicine: d.Medicine, + MedicineMix_Id: d.MedicineMix_Id, + MedicineMix: d.MedicineMix, + Usage: d.Usage, + Interval: d.Interval, + IntervalUnit_Code: d.IntervalUnit_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/prescription-item/entity.go b/internal/domain/main-entities/prescription-item/entity.go index 3898e170..3c662c5c 100644 --- a/internal/domain/main-entities/prescription-item/entity.go +++ b/internal/domain/main-entities/prescription-item/entity.go @@ -5,18 +5,20 @@ import ( em "simrs-vx/internal/domain/main-entities/medicine" emm "simrs-vx/internal/domain/main-entities/medicine-mix" ep "simrs-vx/internal/domain/main-entities/prescription" + + erc "simrs-vx/internal/domain/references/common" ) type PrescriptionItem struct { - ecore.Main // adjust this according to the needs - Prescription_Id *uint `json:"prescription_id"` - Prescription *ep.Prescription `json:"prescription,omitempty" gorm:"foreignKey:Prescription_Id;references:Id"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` - MedicineMix_Id *uint `json:"medicineMix_id"` - MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` - Usage uint8 `json:"usage"` - Interval uint8 `json:"interval"` - // IntervalUnit_Code + ecore.Main // adjust this according to the needs + Prescription_Id *uint `json:"prescription_id"` + Prescription *ep.Prescription `json:"prescription,omitempty" gorm:"foreignKey:Prescription_Id;references:Id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` + Usage uint8 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } From e8ff57168c1af46627a29a4812a5c1d6dbb8e8d0 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 16 Sep 2025 11:44:36 +0700 Subject: [PATCH 033/190] update serveral field on order tables --- cmd/main-migration/Makefile | 2 +- .../migrations/20250916043819.sql | 14 ++++++++++ cmd/main-migration/migrations/atlas.sum | 5 ++-- cmd/satusehat-migration/Makefile | 2 +- .../main-entities/device-order-item/dto.go | 4 +++ .../main-entities/device-order-item/entity.go | 1 + .../domain/main-entities/device-order/dto.go | 13 ++++++--- .../main-entities/device-order/entity.go | 9 ++++--- .../main-entities/material-order/dto.go | 13 ++++++--- .../main-entities/material-order/entity.go | 9 ++++--- .../main-entities/medication-item-dist/dto.go | 10 ++++--- .../medication-item-dist/entity.go | 8 ++++-- .../main-entities/medication-item/dto.go | 10 ++++--- .../main-entities/medication-item/entity.go | 3 ++- .../domain/main-entities/medication/dto.go | 27 +++++++++++-------- .../domain/main-entities/medication/entity.go | 15 ++++++----- .../main-entities/prescription-item/dto.go | 6 ++--- .../main-entities/prescription-item/entity.go | 2 +- 18 files changed, 105 insertions(+), 48 deletions(-) create mode 100644 cmd/main-migration/migrations/20250916043819.sql diff --git a/cmd/main-migration/Makefile b/cmd/main-migration/Makefile index 92a4be84..e83356e5 100644 --- a/cmd/main-migration/Makefile +++ b/cmd/main-migration/Makefile @@ -15,4 +15,4 @@ apply: ## Calculate the schema hash hash: - atlas schema hash --env $(ENV) + atlas migrate hash diff --git a/cmd/main-migration/migrations/20250916043819.sql b/cmd/main-migration/migrations/20250916043819.sql new file mode 100644 index 00000000..1abe147b --- /dev/null +++ b/cmd/main-migration/migrations/20250916043819.sql @@ -0,0 +1,14 @@ +-- Modify "DeviceOrder" table +ALTER TABLE "public"."DeviceOrder" ADD COLUMN "Status_Code" text NULL; +-- Modify "DeviceOrderItem" table +ALTER TABLE "public"."DeviceOrderItem" ADD COLUMN "Count" smallint NULL; +-- Modify "MaterialOrder" table +ALTER TABLE "public"."MaterialOrder" ADD COLUMN "Status_Code" text NULL; +-- Modify "Medication" table +ALTER TABLE "public"."Medication" ADD COLUMN "Status_Code" text NULL; +-- Modify "MedicationItem" table +ALTER TABLE "public"."MedicationItem" ALTER COLUMN "Usage" TYPE numeric, ADD COLUMN "IsRedeemed" boolean NULL; +-- Modify "PrescriptionItem" table +ALTER TABLE "public"."PrescriptionItem" ALTER COLUMN "Usage" TYPE numeric; +-- Modify "MedicationItemDist" table +ALTER TABLE "public"."MedicationItemDist" ALTER COLUMN "Remain" TYPE numeric, ADD COLUMN "Nurse_Id" bigint NULL, ADD CONSTRAINT "fk_MedicationItemDist_Nurse" FOREIGN KEY ("Nurse_Id") REFERENCES "public"."Nurse" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 7bc09afb..fcc26fdd 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:vKW524Os6+DLuWTIk2ogb2LnlRoaYqgz1GLvvmc2KYA= +h1:lwrJz1Vor7muHsLHihYT704fcsjyX/JmBfRLfg+4PjI= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -6,4 +6,5 @@ h1:vKW524Os6+DLuWTIk2ogb2LnlRoaYqgz1GLvvmc2KYA= 20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= 20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= 20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:CndzsEFauRnieT/Qv/kqZ5Gr49g6f127Tq/fskHAPwg= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:qcON0PZq3bYL0dWZdDMHEvK9C7oH4JIMh5Il+RWA3UY= diff --git a/cmd/satusehat-migration/Makefile b/cmd/satusehat-migration/Makefile index 92a4be84..e83356e5 100644 --- a/cmd/satusehat-migration/Makefile +++ b/cmd/satusehat-migration/Makefile @@ -15,4 +15,4 @@ apply: ## Calculate the schema hash hash: - atlas schema hash --env $(ENV) + atlas migrate hash diff --git a/internal/domain/main-entities/device-order-item/dto.go b/internal/domain/main-entities/device-order-item/dto.go index 8b29a332..3added12 100644 --- a/internal/domain/main-entities/device-order-item/dto.go +++ b/internal/domain/main-entities/device-order-item/dto.go @@ -9,6 +9,7 @@ import ( type CreateDto struct { DeviceOrder_Id *uint `json:"deviceOrder_id"` Device_Id *uint `json:"device_id"` + Count uint8 `json:"count"` } type ReadListDto struct { @@ -20,6 +21,7 @@ type ReadListDto struct { type FilterDto struct { DeviceOrder_Id *uint `json:"deviceOrder_id"` Device_Id *uint `json:"device_id"` + Count uint8 `json:"count"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -50,6 +52,7 @@ type ResponseDto struct { DeviceOrder *edo.DeviceOrder `json:"deviceOrder,omitempty"` Device_Id *uint `json:"device_id"` Device *ed.Device `json:"device,omitempty"` + Count uint8 `json:"count"` } func (d DeviceOrderItem) ToResponse() ResponseDto { @@ -58,6 +61,7 @@ func (d DeviceOrderItem) ToResponse() ResponseDto { DeviceOrder: d.DeviceOrder, Device_Id: d.Device_Id, Device: d.Device, + Count: d.Count, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/device-order-item/entity.go b/internal/domain/main-entities/device-order-item/entity.go index 536f0e13..196415af 100644 --- a/internal/domain/main-entities/device-order-item/entity.go +++ b/internal/domain/main-entities/device-order-item/entity.go @@ -12,4 +12,5 @@ type DeviceOrderItem struct { DeviceOrder *edo.DeviceOrder `json:"deviceOrder,omitempty" gorm:"foreignKey:DeviceOrder_Id;references:Id"` Device_Id *uint `json:"device_id"` Device *ed.Device `json:"device,omitempty" gorm:"foreignKey:Device_Id;references:Id"` + Count uint8 `json:"count"` } diff --git a/internal/domain/main-entities/device-order/dto.go b/internal/domain/main-entities/device-order/dto.go index cf2fc5ff..f26d1155 100644 --- a/internal/domain/main-entities/device-order/dto.go +++ b/internal/domain/main-entities/device-order/dto.go @@ -3,10 +3,12 @@ package deviceorder import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" + erc "simrs-vx/internal/domain/references/common" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code"` } type ReadListDto struct { @@ -16,7 +18,8 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -43,14 +46,16 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Status_Code erc.DataStatusCode `json:"status_code"` } func (d DeviceOrder) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, + Status_Code: d.Status_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/device-order/entity.go b/internal/domain/main-entities/device-order/entity.go index b07067fc..79af88c2 100644 --- a/internal/domain/main-entities/device-order/entity.go +++ b/internal/domain/main-entities/device-order/entity.go @@ -3,10 +3,13 @@ package deviceorder import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" + + erc "simrs-vx/internal/domain/references/common" ) type DeviceOrder struct { - ecore.Main // adjust this according to the needs - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Status_Code erc.DataStatusCode `json:"status_code"` } diff --git a/internal/domain/main-entities/material-order/dto.go b/internal/domain/main-entities/material-order/dto.go index 475ef7f8..849f887f 100644 --- a/internal/domain/main-entities/material-order/dto.go +++ b/internal/domain/main-entities/material-order/dto.go @@ -3,10 +3,12 @@ package materialorder import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" + erc "simrs-vx/internal/domain/references/common" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code"` } type ReadListDto struct { @@ -16,7 +18,8 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -43,14 +46,16 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Status_Code erc.DataStatusCode `json:"status_code"` } func (d MaterialOrder) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, + Status_Code: d.Status_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/material-order/entity.go b/internal/domain/main-entities/material-order/entity.go index 566659d3..e306d372 100644 --- a/internal/domain/main-entities/material-order/entity.go +++ b/internal/domain/main-entities/material-order/entity.go @@ -3,10 +3,13 @@ package materialorder import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" + + erc "simrs-vx/internal/domain/references/common" ) type MaterialOrder struct { - ecore.Main // adjust this according to the needs - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Status_Code erc.DataStatusCode `json:"status_code"` } diff --git a/internal/domain/main-entities/medication-item-dist/dto.go b/internal/domain/main-entities/medication-item-dist/dto.go index 05278d81..cf44fb50 100644 --- a/internal/domain/main-entities/medication-item-dist/dto.go +++ b/internal/domain/main-entities/medication-item-dist/dto.go @@ -9,7 +9,8 @@ import ( type CreateDto struct { MedicationItem_Id *uint `json:"medicationItem_id"` DateTime *time.Time `json:"dateTime"` - Remain *uint `json:"remain"` + Remain float64 `json:"remain"` + Nurse_Id *uint `json:"nurse_id"` } type ReadListDto struct { @@ -21,7 +22,8 @@ type ReadListDto struct { type FilterDto struct { MedicationItem_Id *uint `json:"medicationItem_id"` DateTime *time.Time `json:"dateTime"` - Remain *uint `json:"remain"` + Remain float64 `json:"remain"` + Nurse_Id *uint `json:"nurse_id"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -51,7 +53,8 @@ type ResponseDto struct { MedicationItem_Id *uint `json:"medicationItem_id"` MedicationItem *emi.MedicationItem `json:"medicationItem,omitempty"` DateTime *time.Time `json:"dateTime"` - Remain *uint `json:"remain"` + Remain float64 `json:"remain"` + Nurse_Id *uint `json:"nurse_id"` } func (d MedicationItemDist) ToResponse() ResponseDto { @@ -60,6 +63,7 @@ func (d MedicationItemDist) ToResponse() ResponseDto { MedicationItem: d.MedicationItem, DateTime: d.DateTime, Remain: d.Remain, + Nurse_Id: d.Nurse_Id, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/medication-item-dist/entity.go b/internal/domain/main-entities/medication-item-dist/entity.go index 5bd56912..99e16d48 100644 --- a/internal/domain/main-entities/medication-item-dist/entity.go +++ b/internal/domain/main-entities/medication-item-dist/entity.go @@ -1,9 +1,11 @@ package medicationitem import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" emi "simrs-vx/internal/domain/main-entities/medication-item" - "time" + en "simrs-vx/internal/domain/main-entities/nurse" ) type MedicationItemDist struct { @@ -11,5 +13,7 @@ type MedicationItemDist struct { MedicationItem_Id *uint `json:"medicationItem_id"` MedicationItem *emi.MedicationItem `json:"medicationItem,omitempty" gorm:"foreignKey:MedicationItem_Id;references:Id"` DateTime *time.Time `json:"dateTime"` - Remain *uint `json:"remain"` + Remain float64 `json:"remain"` + Nurse_Id *uint `json:"nurse_id"` + Nurse *en.Nurse `json:"nurse,omitempty" gorm:"foreignKey:Nurse_Id;references:Id"` } diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go index 59ae7688..00edb045 100644 --- a/internal/domain/main-entities/medication-item/dto.go +++ b/internal/domain/main-entities/medication-item/dto.go @@ -13,9 +13,10 @@ type CreateDto struct { IsMix bool `json:"isMix"` Medicine_Id *uint `json:"medicine_id"` MedicineMix_Id *uint `json:"medicineMix_id"` - Usage uint8 `json:"usage"` + Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + IsRedeemed bool `json:"isRedeemed"` } type ReadListDto struct { @@ -29,9 +30,10 @@ type FilterDto struct { IsMix bool `json:"isMix"` Medicine_Id *uint `json:"medicine_id"` MedicineMix_Id *uint `json:"medicineMix_id"` - Usage uint8 `json:"usage"` + Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + IsRedeemed bool `json:"isRedeemed"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -65,9 +67,10 @@ type ResponseDto struct { Medicine *em.Medicine `json:"medicine,omitempty"` MedicineMix_Id *uint `json:"medicineMix_id"` MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` - Usage uint8 `json:"usage"` + Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + IsRedeemed bool `json:"isRedeemed"` } func (d MedicationItem) ToResponse() ResponseDto { @@ -82,6 +85,7 @@ func (d MedicationItem) ToResponse() ResponseDto { Usage: d.Usage, Interval: d.Interval, IntervalUnit_Code: d.IntervalUnit_Code, + IsRedeemed: d.IsRedeemed, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/medication-item/entity.go b/internal/domain/main-entities/medication-item/entity.go index ef7f20ea..671e96b3 100644 --- a/internal/domain/main-entities/medication-item/entity.go +++ b/internal/domain/main-entities/medication-item/entity.go @@ -18,7 +18,8 @@ type MedicationItem struct { Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` MedicineMix_Id *uint `json:"medicineMix_id"` MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` - Usage uint8 `json:"usage"` + Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + IsRedeemed bool `json:"isRedeemed"` } diff --git a/internal/domain/main-entities/medication/dto.go b/internal/domain/main-entities/medication/dto.go index 1bc1c774..ec158df8 100644 --- a/internal/domain/main-entities/medication/dto.go +++ b/internal/domain/main-entities/medication/dto.go @@ -4,13 +4,15 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" ep "simrs-vx/internal/domain/main-entities/pharmacist" + erc "simrs-vx/internal/domain/references/common" "time" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - IssuedAt *time.Time `json:"issuedAt"` - Pharmacist_Id *uint `json:"pharmacist_id"` + Encounter_Id *uint `json:"encounter_id"` + IssuedAt *time.Time `json:"issuedAt"` + Pharmacist_Id *uint `json:"pharmacist_id"` + Status_Code erc.DataStatusCode `json:"status_code"` } type ReadListDto struct { @@ -20,9 +22,10 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - IssuedAt *time.Time `json:"issuedAt"` - Pharmacist_Id *uint `json:"pharmacist_id"` + Encounter_Id *uint `json:"encounter_id"` + IssuedAt *time.Time `json:"issuedAt"` + Pharmacist_Id *uint `json:"pharmacist_id"` + Status_Code erc.DataStatusCode `json:"status_code"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -49,11 +52,12 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` - IssuedAt *time.Time `json:"issuedAt"` - Pharmacist_Id *uint `json:"pharmacist_id"` - Pharmacist *ep.Pharmacist `json:"pharmacist,omitempty"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + IssuedAt *time.Time `json:"issuedAt"` + Pharmacist_Id *uint `json:"pharmacist_id"` + Pharmacist *ep.Pharmacist `json:"pharmacist,omitempty"` + Status_Code erc.DataStatusCode `json:"status_code"` } func (d Medication) ToResponse() ResponseDto { @@ -63,6 +67,7 @@ func (d Medication) ToResponse() ResponseDto { IssuedAt: d.IssuedAt, Pharmacist_Id: d.Pharmacist_Id, Pharmacist: d.Pharmacist, + Status_Code: d.Status_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/medication/entity.go b/internal/domain/main-entities/medication/entity.go index f18af23c..cc126de7 100644 --- a/internal/domain/main-entities/medication/entity.go +++ b/internal/domain/main-entities/medication/entity.go @@ -6,13 +6,16 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" ep "simrs-vx/internal/domain/main-entities/pharmacist" + + erc "simrs-vx/internal/domain/references/common" ) type Medication struct { - ecore.Main // adjust this according to the needs - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - IssuedAt *time.Time `json:"issuedAt"` - Pharmacist_Id *uint `json:"pharmacist_id"` - Pharmacist *ep.Pharmacist `json:"pharmacist,omitempty" gorm:"foreignKey:Pharmacist_Id;references:Id"` + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + IssuedAt *time.Time `json:"issuedAt"` + Pharmacist_Id *uint `json:"pharmacist_id"` + Pharmacist *ep.Pharmacist `json:"pharmacist,omitempty" gorm:"foreignKey:Pharmacist_Id;references:Id"` + Status_Code erc.DataStatusCode `json:"status_code"` } diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index a87daaae..f23a6610 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -13,7 +13,7 @@ type CreateDto struct { IsMix bool `json:"isMix"` Medicine_Id *uint `json:"medicine_id"` MedicineMix_Id *uint `json:"medicineMix_id"` - Usage uint8 `json:"usage"` + Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } @@ -29,7 +29,7 @@ type FilterDto struct { IsMix bool `json:"isMix"` Medicine_Id *uint `json:"medicine_id"` MedicineMix_Id *uint `json:"medicineMix_id"` - Usage uint8 `json:"usage"` + Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` @@ -65,7 +65,7 @@ type ResponseDto struct { Medicine *em.Medicine `json:"medicine,omitempty"` MedicineMix_Id *uint `json:"medicineMix_id"` MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` - Usage uint8 `json:"usage"` + Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } diff --git a/internal/domain/main-entities/prescription-item/entity.go b/internal/domain/main-entities/prescription-item/entity.go index 3c662c5c..89537496 100644 --- a/internal/domain/main-entities/prescription-item/entity.go +++ b/internal/domain/main-entities/prescription-item/entity.go @@ -18,7 +18,7 @@ type PrescriptionItem struct { Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` MedicineMix_Id *uint `json:"medicineMix_id"` MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` - Usage uint8 `json:"usage"` + Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` } From cb5b743beea975fe01707458d0ff99f62a66d3af Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 16 Sep 2025 17:59:33 +0700 Subject: [PATCH 034/190] wip --- .../main-entities/device-order/entity.go | 4 + .../main-entities/material-order/entity.go | 4 + .../main-entities/medication-item-dist/dto.go | 10 +++ .../domain/main-entities/medication/dto.go | 5 ++ .../domain/main-entities/medication/entity.go | 4 + .../main-handler/device-order/handler.go | 12 +++ .../interface/main-handler/main-handler.go | 49 ++++++++++-- .../main-handler/material-order/handler.go | 12 +++ .../medication-item-dist/handler.go | 25 ++++++- .../main-handler/medication-item/handler.go | 12 +++ .../main-handler/medication/handler.go | 25 ++++++- .../main-use-case/device-order-item/helper.go | 1 + .../main-use-case/device-order/case.go | 60 +++++++++++++++ .../main-use-case/device-order/helper.go | 1 + .../main-use-case/material-order/case.go | 62 ++++++++++++++++ .../main-use-case/material-order/helper.go | 1 + .../medication-item-dist/case.go | 74 +++++++++++++++++++ .../medication-item-dist/helper.go | 1 + .../main-use-case/medication-item/case.go | 52 +++++++++++++ .../main-use-case/medication-item/helper.go | 2 + .../use-case/main-use-case/medication/case.go | 72 ++++++++++++++++++ .../main-use-case/medication/helper.go | 35 +++++++++ internal/use-case/main-use-case/nurse/lib.go | 31 ++++++++ .../use-case/main-use-case/pharmacist/lib.go | 31 ++++++++ .../main-use-case/prescription-item/helper.go | 1 + 25 files changed, 579 insertions(+), 7 deletions(-) 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 } From 6b8f84efac8be32f9db72acfd4ce8cc324e3cf8f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 17 Sep 2025 11:08:38 +0700 Subject: [PATCH 035/190] adjust on several order tables --- cmd/main-migration/migrations/20250917040616.sql | 8 ++++++++ cmd/main-migration/migrations/20250917040751.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 6 ++++-- .../main-entities/medication-item/entity.go | 2 ++ .../domain/main-entities/medicine-mix/entity.go | 5 +++-- .../main-entities/prescription-item/entity.go | 1 + .../domain/main-entities/prescription/entity.go | 16 ++++++++++------ 7 files changed, 30 insertions(+), 10 deletions(-) create mode 100644 cmd/main-migration/migrations/20250917040616.sql create mode 100644 cmd/main-migration/migrations/20250917040751.sql diff --git a/cmd/main-migration/migrations/20250917040616.sql b/cmd/main-migration/migrations/20250917040616.sql new file mode 100644 index 00000000..71fc13e7 --- /dev/null +++ b/cmd/main-migration/migrations/20250917040616.sql @@ -0,0 +1,8 @@ +-- Modify "MedicationItem" table +ALTER TABLE "public"."MedicationItem" ADD COLUMN "Quantity" numeric NULL; +-- Modify "MedicineMix" table +ALTER TABLE "public"."MedicineMix" ADD COLUMN "Note" text NULL; +-- Modify "Prescription" table +ALTER TABLE "public"."Prescription" ADD COLUMN "Status_Code" text NULL; +-- Modify "PrescriptionItem" table +ALTER TABLE "public"."PrescriptionItem" ADD COLUMN "Quantity" numeric NULL; diff --git a/cmd/main-migration/migrations/20250917040751.sql b/cmd/main-migration/migrations/20250917040751.sql new file mode 100644 index 00000000..0b8f243b --- /dev/null +++ b/cmd/main-migration/migrations/20250917040751.sql @@ -0,0 +1,2 @@ +-- Modify "MedicationItem" table +ALTER TABLE "public"."MedicationItem" ADD COLUMN "Note" character varying(1024) NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index fcc26fdd..559bbade 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:lwrJz1Vor7muHsLHihYT704fcsjyX/JmBfRLfg+4PjI= +h1:1QSYLfLrRojOO3SUOR0bOUsv7hWGJxR4mfzv6/P540k= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -7,4 +7,6 @@ h1:lwrJz1Vor7muHsLHihYT704fcsjyX/JmBfRLfg+4PjI= 20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= 20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= 20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:qcON0PZq3bYL0dWZdDMHEvK9C7oH4JIMh5Il+RWA3UY= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:QFuMvZUCmZPWsjHTdIFOT8P0fzCv3/xP0jGsfVms0aA= +20250917040751.sql h1:/0YgGP0VLK/WGTVi1KUuPQsx7i9O9Em8u/Ec1luYPDo= diff --git a/internal/domain/main-entities/medication-item/entity.go b/internal/domain/main-entities/medication-item/entity.go index 671e96b3..e778cb50 100644 --- a/internal/domain/main-entities/medication-item/entity.go +++ b/internal/domain/main-entities/medication-item/entity.go @@ -22,4 +22,6 @@ type MedicationItem 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"` } diff --git a/internal/domain/main-entities/medicine-mix/entity.go b/internal/domain/main-entities/medicine-mix/entity.go index 3670c6d6..2445bde2 100644 --- a/internal/domain/main-entities/medicine-mix/entity.go +++ b/internal/domain/main-entities/medicine-mix/entity.go @@ -5,6 +5,7 @@ import ( ) type MedicineMix struct { - ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"size:50"` + ecore.Main // adjust this according to the needs + Name string `json:"name" gorm:"size:50"` + Note *string `json:"note" gom:"size:1024"` } diff --git a/internal/domain/main-entities/prescription-item/entity.go b/internal/domain/main-entities/prescription-item/entity.go index 89537496..6ccf3ae4 100644 --- a/internal/domain/main-entities/prescription-item/entity.go +++ b/internal/domain/main-entities/prescription-item/entity.go @@ -21,4 +21,5 @@ type PrescriptionItem struct { Usage float64 `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + Quantity float64 `json:"quantity"` } diff --git a/internal/domain/main-entities/prescription/entity.go b/internal/domain/main-entities/prescription/entity.go index bf3e7930..da0554a9 100644 --- a/internal/domain/main-entities/prescription/entity.go +++ b/internal/domain/main-entities/prescription/entity.go @@ -4,14 +4,18 @@ 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 Prescription struct { - ecore.Main // adjust this according to the needs - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` - IssuedAt *time.Time `json:"issuedAt"` + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` + IssuedAt *time.Time `json:"issuedAt"` + Status_Code *erc.DataStatusCode `json:"status_code"` } From 86a073164da8f828303bc59f6a78d6d62d37f3fd Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 17 Sep 2025 11:47:03 +0700 Subject: [PATCH 036/190] wip encounter + medication --- .../main-entities/medication-item/dto.go | 8 +++ .../domain/main-entities/medication/dto.go | 7 +- .../main-entities/prescription-item/dto.go | 4 ++ .../domain/main-entities/prescription/dto.go | 36 ++++++---- .../main-handler/medication/handler.go | 8 +-- .../main-handler/prescription/handler.go | 6 +- .../main-use-case/encounter/helper.go | 51 ++++++++++++++ .../use-case/main-use-case/medication/case.go | 4 ++ .../main-use-case/medication/helper.go | 69 ++++++++++--------- .../use-case/main-use-case/medication/lib.go | 10 ++- .../main-use-case/prescription-item/helper.go | 1 + .../main-use-case/prescription/helper.go | 1 + .../main-use-case/prescription/lib.go | 10 ++- pkg/use-case-helper/use-case-helper.go | 6 ++ 14 files changed, 164 insertions(+), 57 deletions(-) diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go index 00edb045..ce2f9193 100644 --- a/internal/domain/main-entities/medication-item/dto.go +++ b/internal/domain/main-entities/medication-item/dto.go @@ -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 diff --git a/internal/domain/main-entities/medication/dto.go b/internal/domain/main-entities/medication/dto.go index 7242b9d5..86c77b2f 100644 --- a/internal/domain/main-entities/medication/dto.go +++ b/internal/domain/main-entities/medication/dto.go @@ -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 { diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index f23a6610..f46b8bc9 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -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 diff --git a/internal/domain/main-entities/prescription/dto.go b/internal/domain/main-entities/prescription/dto.go index b87d6f12..e693a1c2 100644 --- a/internal/domain/main-entities/prescription/dto.go +++ b/internal/domain/main-entities/prescription/dto.go @@ -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 diff --git a/internal/interface/main-handler/medication/handler.go b/internal/interface/main-handler/medication/handler.go index b847eb5b..5037f2eb 100644 --- a/internal/interface/main-handler/medication/handler.go +++ b/internal/interface/main-handler/medication/handler.go @@ -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) } diff --git a/internal/interface/main-handler/prescription/handler.go b/internal/interface/main-handler/prescription/handler.go index 25ee9469..1ac30d97 100644 --- a/internal/interface/main-handler/prescription/handler.go +++ b/internal/interface/main-handler/prescription/handler.go @@ -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) } diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index b40783b7..94f196bb 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -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) +// } +// } diff --git a/internal/use-case/main-use-case/medication/case.go b/internal/use-case/main-use-case/medication/case.go index ec096f29..c4a97373 100644 --- a/internal/use-case/main-use-case/medication/case.go +++ b/internal/use-case/main-use-case/medication/case.go @@ -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 }) diff --git a/internal/use-case/main-use-case/medication/helper.go b/internal/use-case/main-use-case/medication/helper.go index 52676431..374eaf1f 100644 --- a/internal/use-case/main-use-case/medication/helper.go +++ b/internal/use-case/main-use-case/medication/helper.go @@ -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 +} diff --git a/internal/use-case/main-use-case/medication/lib.go b/internal/use-case/main-use-case/medication/lib.go index 95488f11..227eb27b 100644 --- a/internal/use-case/main-use-case/medication/lib.go +++ b/internal/use-case/main-use-case/medication/lib.go @@ -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 } 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 000522d5..47efc3f9 100644 --- a/internal/use-case/main-use-case/prescription-item/helper.go +++ b/internal/use-case/main-use-case/prescription-item/helper.go @@ -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 } diff --git a/internal/use-case/main-use-case/prescription/helper.go b/internal/use-case/main-use-case/prescription/helper.go index 768d11bd..13f8f2e6 100644 --- a/internal/use-case/main-use-case/prescription/helper.go +++ b/internal/use-case/main-use-case/prescription/helper.go @@ -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 } diff --git a/internal/use-case/main-use-case/prescription/lib.go b/internal/use-case/main-use-case/prescription/lib.go index bf1fe36b..bff59916 100644 --- a/internal/use-case/main-use-case/prescription/lib.go +++ b/internal/use-case/main-use-case/prescription/lib.go @@ -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 } diff --git a/pkg/use-case-helper/use-case-helper.go b/pkg/use-case-helper/use-case-helper.go index a16a9ba2..9fd8351d 100644 --- a/pkg/use-case-helper/use-case-helper.go +++ b/pkg/use-case-helper/use-case-helper.go @@ -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 +} From 282cc93c140959a9a8c2c23d7f7f414c057d9251 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 17 Sep 2025 11:53:04 +0700 Subject: [PATCH 037/190] change fk, put fk on medmix and remove fk from medmixitem --- cmd/main-migration/migrations/20250917045138.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 7 ++++--- .../domain/main-entities/medicine-mix-item/dto.go | 11 ++++------- .../domain/main-entities/medicine-mix-item/entity.go | 12 +++++------- internal/domain/main-entities/medicine-mix/dto.go | 8 ++++++-- internal/domain/main-entities/medicine-mix/entity.go | 8 +++++--- 6 files changed, 26 insertions(+), 22 deletions(-) create mode 100644 cmd/main-migration/migrations/20250917045138.sql diff --git a/cmd/main-migration/migrations/20250917045138.sql b/cmd/main-migration/migrations/20250917045138.sql new file mode 100644 index 00000000..b40ade76 --- /dev/null +++ b/cmd/main-migration/migrations/20250917045138.sql @@ -0,0 +1,2 @@ +-- Modify "MedicineMixItem" table +ALTER TABLE "public"."MedicineMixItem" DROP CONSTRAINT "fk_MedicineMixItem_MedicineMix", ADD CONSTRAINT "fk_MedicineMix_MixItems" FOREIGN KEY ("MedicineMix_Id") REFERENCES "public"."MedicineMix" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 559bbade..947c21ed 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:1QSYLfLrRojOO3SUOR0bOUsv7hWGJxR4mfzv6/P540k= +h1:QeWON016g64FziEzikpibQnksdHm3nulYh4SE5Wrpek= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -8,5 +8,6 @@ h1:1QSYLfLrRojOO3SUOR0bOUsv7hWGJxR4mfzv6/P540k= 20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= 20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= 20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:QFuMvZUCmZPWsjHTdIFOT8P0fzCv3/xP0jGsfVms0aA= -20250917040751.sql h1:/0YgGP0VLK/WGTVi1KUuPQsx7i9O9Em8u/Ec1luYPDo= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:7yGxD9Rxn89d9Z7bJQQo0kS++ZE6c1w1iURemEDeo/U= diff --git a/internal/domain/main-entities/medicine-mix-item/dto.go b/internal/domain/main-entities/medicine-mix-item/dto.go index dbcbce21..1be930e1 100644 --- a/internal/domain/main-entities/medicine-mix-item/dto.go +++ b/internal/domain/main-entities/medicine-mix-item/dto.go @@ -3,7 +3,6 @@ package medicinemixitem import ( ecore "simrs-vx/internal/domain/base-entities/core" em "simrs-vx/internal/domain/main-entities/medicine" - emm "simrs-vx/internal/domain/main-entities/medicine-mix" ) type CreateDto struct { @@ -49,17 +48,15 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - MedicineMix_Id *uint `json:"medicineMix_id"` - MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` - Medicine_Id *uint `json:"medicine_id"` - Medicine *em.Medicine `json:"medicine,omitempty"` - Dose *uint8 `json:"dose"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty"` + Dose *uint8 `json:"dose"` } func (d MedicineMixItem) ToResponse() ResponseDto { resp := ResponseDto{ MedicineMix_Id: d.MedicineMix_Id, - MedicineMix: d.MedicineMix, Medicine_Id: d.Medicine_Id, Medicine: d.Medicine, Dose: d.Dose, diff --git a/internal/domain/main-entities/medicine-mix-item/entity.go b/internal/domain/main-entities/medicine-mix-item/entity.go index 7c456fcb..cbfdc7ed 100644 --- a/internal/domain/main-entities/medicine-mix-item/entity.go +++ b/internal/domain/main-entities/medicine-mix-item/entity.go @@ -3,14 +3,12 @@ package medicinemixitem import ( ecore "simrs-vx/internal/domain/base-entities/core" em "simrs-vx/internal/domain/main-entities/medicine" - emm "simrs-vx/internal/domain/main-entities/medicine-mix" ) type MedicineMixItem struct { - ecore.Main // adjust this according to the needs - MedicineMix_Id *uint `json:"medicineMix_id"` - MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` - Medicine_Id *uint `json:"medicine_id"` - Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` - Dose *uint8 `json:"dose"` + ecore.Main // adjust this according to the needs + MedicineMix_Id *uint `json:"medicineMix_id"` + Medicine_Id *uint `json:"medicine_id"` + Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` + Dose *uint8 `json:"dose"` } diff --git a/internal/domain/main-entities/medicine-mix/dto.go b/internal/domain/main-entities/medicine-mix/dto.go index b9fc656e..05b67a06 100644 --- a/internal/domain/main-entities/medicine-mix/dto.go +++ b/internal/domain/main-entities/medicine-mix/dto.go @@ -2,6 +2,8 @@ package medicinemix import ( ecore "simrs-vx/internal/domain/base-entities/core" + + emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" ) type CreateDto struct { @@ -37,12 +39,14 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Name string `json:"name"` + Name string `json:"name"` + MixItems []*emmi.MedicineMixItem `json:"mixItems"` } func (d MedicineMix) ToResponse() ResponseDto { resp := ResponseDto{ - Name: d.Name, + Name: d.Name, + MixItems: d.MixItems, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/medicine-mix/entity.go b/internal/domain/main-entities/medicine-mix/entity.go index 2445bde2..8c609579 100644 --- a/internal/domain/main-entities/medicine-mix/entity.go +++ b/internal/domain/main-entities/medicine-mix/entity.go @@ -2,10 +2,12 @@ package medicinemix import ( ecore "simrs-vx/internal/domain/base-entities/core" + emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" ) type MedicineMix struct { - ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"size:50"` - Note *string `json:"note" gom:"size:1024"` + ecore.Main // adjust this according to the needs + Name string `json:"name" gorm:"size:50"` + Note *string `json:"note" gom:"size:1024"` + MixItems []*emmi.MedicineMixItem `json:"mixItems" gorm:"foreignKey:MedicineMix_Id;references:Id"` } From 5a5856ccb960c00eb004e216ee06990cc708e519 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 17 Sep 2025 16:35:07 +0700 Subject: [PATCH 038/190] waiting for migration --- .../main-handler/encounter/handler.go | 5 + .../main-handler/medication/handler.go | 3 - .../use-case/main-use-case/encounter/case.go | 4 + .../main-use-case/encounter/helper.go | 140 ++++++++++++------ .../main-use-case/medication/helper.go | 3 +- .../main-use-case/medicine-mix/lib.go | 4 + internal/use-case/main-use-case/nurse/lib.go | 6 +- .../use-case/main-use-case/pharmacist/lib.go | 6 +- .../main-use-case/prescription-item/lib.go | 4 + 9 files changed, 123 insertions(+), 52 deletions(-) diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index c2634a91..7484b302 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -72,9 +72,14 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { func (obj myBase) CheckOut(w http.ResponseWriter, r *http.Request) { dto := e.DischargeDto{} + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + dto.Id = uint(id) res, err := u.CheckOut(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 5037f2eb..272eae56 100644 --- a/internal/interface/main-handler/medication/handler.go +++ b/internal/interface/main-handler/medication/handler.go @@ -84,9 +84,6 @@ func (obj myBase) Complete(w http.ResponseWriter, r *http.Request) { } dto := e.ReadDetailDto{} - if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { - return - } dto.AuthInfo = *authInfo dto.Id = uint(id) res, err := u.Complete(dto) diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index ed8fa816..437e6b55 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -379,6 +379,10 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { return err } + if err := createMedication(data.Id, &event, tx); err != nil { + return err + } + pl.SetLogInfo(&event, nil, "complete") return nil diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 94f196bb..5bf73d14 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -9,16 +9,22 @@ import ( 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" + em "simrs-vx/internal/domain/main-entities/medication" + emei "simrs-vx/internal/domain/main-entities/medication-item" + emi "simrs-vx/internal/domain/main-entities/medicine-mix" + emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" + ep "simrs-vx/internal/domain/main-entities/prescription" + epi "simrs-vx/internal/domain/main-entities/prescription-item" - // 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" + um "simrs-vx/internal/use-case/main-use-case/medication" + umei "simrs-vx/internal/use-case/main-use-case/medication-item" + umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" + ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item" + up "simrs-vx/internal/use-case/main-use-case/prescription" + upi "simrs-vx/internal/use-case/main-use-case/prescription-item" pl "simrs-vx/pkg/logger" - // pu "simrs-vx/pkg/use-case-helper" + pu "simrs-vx/pkg/use-case-helper" erc "simrs-vx/internal/domain/references/common" ero "simrs-vx/internal/domain/references/organization" @@ -109,43 +115,93 @@ 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") +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 -// } + prescription, err := up.ReadDetailData(ep.ReadDetailDto{Encounter_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 -// } + 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 -// } + 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 -// } + 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) -// } -// } + for _, prescriptionItem := range prescriptionItem { + if prescriptionItem.IsMix { + medMix_id, err := createMedicineMixAndItem(*prescriptionItem.MedicineMix, event, tx) + if err != nil { + return err + } + prescriptionItem.MedicineMix_Id = medMix_id + } + err := createMedicationItem(medication.Id, prescriptionItem, event, tx) + if err != nil { + return err + } + } + return nil +} + +func createMedicineMixAndItem(input emi.MedicineMix, event *pl.Event, tx *gorm.DB) (*uint, error) { + pl.SetLogInfo(event, nil, "started", "createMedicineMix") + + medicineMixCreate := emi.CreateDto{ + Name: input.Name, + } + medicineMix, err := umi.CreateData(medicineMixCreate, event, tx) + if err != nil { + return nil, err + } + + // recreate medicineMixItem with new medicineMix_id to keep medMixItem remain the same for prescriptionItem that is created + for _, medicineMixItem := range input.MixItems { + medicineMixItemCreate := emmi.CreateDto{ + MedicineMix_Id: &medicineMix.Id, + Medicine_Id: medicineMixItem.Medicine_Id, + Dose: medicineMixItem.Dose, + } + _, err := ummi.CreateData(medicineMixItemCreate, event, tx) + if err != nil { + return nil, err + } + + } + return &medicineMix.Id, nil +} + +func createMedicationItem(medication_id uint, input epi.PrescriptionItem, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "createMedicationItem") + + medicationItemCreate := emei.CreateDto{ + Medication_Id: &medication_id, + IsMix: input.IsMix, + Medicine_Id: input.Medicine_Id, + MedicineMix_Id: input.MedicineMix_Id, + Usage: input.Usage, + Interval: input.Interval, + IntervalUnit_Code: input.IntervalUnit_Code, + Quantity: input.Quantity, + } + + _, err := umei.CreateData(medicationItemCreate, event, tx) + if err != nil { + return err + } + + return nil +} diff --git a/internal/use-case/main-use-case/medication/helper.go b/internal/use-case/main-use-case/medication/helper.go index 374eaf1f..63290cb1 100644 --- a/internal/use-case/main-use-case/medication/helper.go +++ b/internal/use-case/main-use-case/medication/helper.go @@ -43,7 +43,7 @@ func createMedicationItemDist(medication_id *uint, event *pl.Event, dbx ...*gorm tx = dg.I } - filterMI := emi.ReadListDto{FilterDto: emi.FilterDto{Medication_Id: medication_id, IsRedeemed: true}} + filterMI := emi.ReadListDto{FilterDto: emi.FilterDto{Medication_Id: medication_id, IsRedeemed: true}, Preloads: []string{"MedicineMix"}} medicationItemList, _, err := umi.ReadListData(filterMI, event, tx) if err != nil { return err @@ -58,6 +58,7 @@ func createMedicationItemDist(medication_id *uint, event *pl.Event, dbx ...*gorm if _, err := umid.CreateData(midCreate, event, tx); err != nil { return err } + } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medicine-mix/lib.go b/internal/use-case/main-use-case/medicine-mix/lib.go index 6a2cf257..162399db 100644 --- a/internal/use-case/main-use-case/medicine-mix/lib.go +++ b/internal/use-case/main-use-case/medicine-mix/lib.go @@ -51,6 +51,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } + tx = tx.Preload("MixItems") + tx = tx. Model(&e.MedicineMix{}). Scopes(gh.Filter(input)). @@ -90,6 +92,8 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = dg.I } + tx = tx.Preload("MixItems") + if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr diff --git a/internal/use-case/main-use-case/nurse/lib.go b/internal/use-case/main-use-case/nurse/lib.go index 468b41c2..adbd1b76 100644 --- a/internal/use-case/main-use-case/nurse/lib.go +++ b/internal/use-case/main-use-case/nurse/lib.go @@ -172,9 +172,9 @@ func GetIdByUserId(user_id *uint, event *pl.Event, dbx ...*gorm.DB) (*uint, erro 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). + Select("\"Nurse\".\"Id\" as nurse_id"). + Joins("JOIN \"Employee\" AS e ON e.\"Id\" = \"Nurse\".\"Employee_Id\""). + Where("e.\"User_Id\" = ?", user_id). Scan(&nurse_id).Error if err != nil { diff --git a/internal/use-case/main-use-case/pharmacist/lib.go b/internal/use-case/main-use-case/pharmacist/lib.go index e9478d70..0038591a 100644 --- a/internal/use-case/main-use-case/pharmacist/lib.go +++ b/internal/use-case/main-use-case/pharmacist/lib.go @@ -172,9 +172,9 @@ func GetIdByUserId(user_id *uint, event *pl.Event, dbx ...*gorm.DB) (*uint, erro 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). + Select("\"Pharmacist\".\"Id\" as pharmacist_id"). + Joins("JOIN \"Employee\" as e ON e.\"Id\" = \"Pharmacist\".\"Employee_Id\""). + Where("e.\"User_Id\" = ?", user_id). Scan(&pharmacist_id).Error if err != nil { diff --git a/internal/use-case/main-use-case/prescription-item/lib.go b/internal/use-case/main-use-case/prescription-item/lib.go index 800096fd..70913046 100644 --- a/internal/use-case/main-use-case/prescription-item/lib.go +++ b/internal/use-case/main-use-case/prescription-item/lib.go @@ -51,6 +51,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } + tx = tx.Preload("MedicineMix").Preload("MedicineMix.MixItems") + if len(input.Preloads) > 0 { for _, preload := range input.Preloads { tx = tx.Preload(preload) @@ -96,6 +98,8 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = dg.I } + tx = tx.Preload("MedicineMix").Preload("MedicineMix.MixItems") + if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr From ab9cda65af3d786ca545055caf38b765081935f5 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 17 Sep 2025 16:37:17 +0700 Subject: [PATCH 039/190] remove note from medmix, add note for medmixitem --- cmd/main-migration/migrations/20250917093645.sql | 4 ++++ cmd/main-migration/migrations/atlas.sum | 5 +++-- internal/domain/main-entities/medicine-mix-item/entity.go | 1 + internal/domain/main-entities/medicine-mix/entity.go | 1 - 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 cmd/main-migration/migrations/20250917093645.sql diff --git a/cmd/main-migration/migrations/20250917093645.sql b/cmd/main-migration/migrations/20250917093645.sql new file mode 100644 index 00000000..b0922c6a --- /dev/null +++ b/cmd/main-migration/migrations/20250917093645.sql @@ -0,0 +1,4 @@ +-- Modify "MedicineMix" table +ALTER TABLE "public"."MedicineMix" DROP COLUMN "Note"; +-- Modify "MedicineMixItem" table +ALTER TABLE "public"."MedicineMixItem" ADD COLUMN "Note" text NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 947c21ed..bef5214a 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:QeWON016g64FziEzikpibQnksdHm3nulYh4SE5Wrpek= +h1:MYP+zDQNT6gqYsXaJnhbXwwAogZIHtCYOfAs8/dvsQs= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -10,4 +10,5 @@ h1:QeWON016g64FziEzikpibQnksdHm3nulYh4SE5Wrpek= 20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= 20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= 20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:7yGxD9Rxn89d9Z7bJQQo0kS++ZE6c1w1iURemEDeo/U= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:Ap/l0AV/iazV6g88JbBEnnDdb/QUAt3j0DAGsNonswY= diff --git a/internal/domain/main-entities/medicine-mix-item/entity.go b/internal/domain/main-entities/medicine-mix-item/entity.go index cbfdc7ed..a642fce0 100644 --- a/internal/domain/main-entities/medicine-mix-item/entity.go +++ b/internal/domain/main-entities/medicine-mix-item/entity.go @@ -11,4 +11,5 @@ type MedicineMixItem struct { Medicine_Id *uint `json:"medicine_id"` Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` Dose *uint8 `json:"dose"` + Note *string `json:"note" gom:"size:1024"` } diff --git a/internal/domain/main-entities/medicine-mix/entity.go b/internal/domain/main-entities/medicine-mix/entity.go index 8c609579..6575d703 100644 --- a/internal/domain/main-entities/medicine-mix/entity.go +++ b/internal/domain/main-entities/medicine-mix/entity.go @@ -8,6 +8,5 @@ import ( type MedicineMix struct { ecore.Main // adjust this according to the needs Name string `json:"name" gorm:"size:50"` - Note *string `json:"note" gom:"size:1024"` MixItems []*emmi.MedicineMixItem `json:"mixItems" gorm:"foreignKey:MedicineMix_Id;references:Id"` } From 3b753cb972461ba87b96385e76b60cb98c276e7f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 17 Sep 2025 16:38:35 +0700 Subject: [PATCH 040/190] feat (medicine-mix-item): add note --- .../main-entities/medicine-mix-item/dto.go | 16 ++++++++++------ .../main-use-case/medicine-mix-item/helper.go | 1 + 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/internal/domain/main-entities/medicine-mix-item/dto.go b/internal/domain/main-entities/medicine-mix-item/dto.go index 1be930e1..b00114c5 100644 --- a/internal/domain/main-entities/medicine-mix-item/dto.go +++ b/internal/domain/main-entities/medicine-mix-item/dto.go @@ -6,9 +6,10 @@ import ( ) type CreateDto struct { - MedicineMix_Id *uint `json:"medicineMix_id"` - Medicine_Id *uint `json:"medicine_id"` - Dose *uint8 `json:"dose"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Medicine_Id *uint `json:"medicine_id"` + Dose *uint8 `json:"dose"` + Note *string `json:"note" gom:"size:1024"` } type ReadListDto struct { @@ -18,9 +19,10 @@ type ReadListDto struct { } type FilterDto struct { - MedicineMix_Id *uint `json:"medicineMix_id"` - Medicine_Id *uint `json:"medicine_id"` - Dose *uint8 `json:"dose"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Medicine_Id *uint `json:"medicine_id"` + Dose *uint8 `json:"dose"` + Note *string `json:"note" gom:"size:1024"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -52,6 +54,7 @@ type ResponseDto struct { Medicine_Id *uint `json:"medicine_id"` Medicine *em.Medicine `json:"medicine,omitempty"` Dose *uint8 `json:"dose"` + Note *string `json:"note" gom:"size:1024"` } func (d MedicineMixItem) ToResponse() ResponseDto { @@ -60,6 +63,7 @@ func (d MedicineMixItem) ToResponse() ResponseDto { Medicine_Id: d.Medicine_Id, Medicine: d.Medicine, Dose: d.Dose, + Note: d.Note, } resp.Main = d.Main return resp diff --git a/internal/use-case/main-use-case/medicine-mix-item/helper.go b/internal/use-case/main-use-case/medicine-mix-item/helper.go index d4ac8020..0a64f30c 100644 --- a/internal/use-case/main-use-case/medicine-mix-item/helper.go +++ b/internal/use-case/main-use-case/medicine-mix-item/helper.go @@ -20,4 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicineMixItem) { data.MedicineMix_Id = inputSrc.MedicineMix_Id data.Medicine_Id = inputSrc.Medicine_Id data.Dose = inputSrc.Dose + data.Note = inputSrc.Note } From 3b601c4d7666dc4271f3d17f8eb4701e71523ca6 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 18 Sep 2025 14:38:18 +0700 Subject: [PATCH 041/190] adjust and add tables for mcu orders --- .../migrations/20250918073552.sql | 10 +++ .../migrations/20250918073742.sql | 31 +++++++ cmd/main-migration/migrations/atlas.sum | 6 +- .../main-entities/mcu-order-item/entity.go | 16 ++-- .../main-entities/mcu-order-sub-item/dto.go | 81 +++++++++++++++++++ .../mcu-order-sub-item/entity.go | 19 +++++ .../domain/main-entities/mcu-order/entity.go | 19 +++-- internal/domain/main-entities/mcu-src/dto.go | 15 ++-- .../domain/main-entities/mcu-src/entity.go | 5 +- .../domain/main-entities/mcu-sub-src/dto.go | 80 ++++++++++++++++++ .../main-entities/mcu-sub-src/entity.go | 17 ++++ .../main-entities/person-relative/dto.go | 3 + .../main-entities/person-relative/entity.go | 1 + .../domain/references/clinical/clinical.go | 18 +++-- internal/interface/migration/main-entities.go | 4 + 15 files changed, 299 insertions(+), 26 deletions(-) create mode 100644 cmd/main-migration/migrations/20250918073552.sql create mode 100644 cmd/main-migration/migrations/20250918073742.sql create mode 100644 internal/domain/main-entities/mcu-order-sub-item/dto.go create mode 100644 internal/domain/main-entities/mcu-order-sub-item/entity.go create mode 100644 internal/domain/main-entities/mcu-sub-src/dto.go create mode 100644 internal/domain/main-entities/mcu-sub-src/entity.go diff --git a/cmd/main-migration/migrations/20250918073552.sql b/cmd/main-migration/migrations/20250918073552.sql new file mode 100644 index 00000000..1b45e5d4 --- /dev/null +++ b/cmd/main-migration/migrations/20250918073552.sql @@ -0,0 +1,10 @@ +-- Modify "McuOrder" table +ALTER TABLE "public"."McuOrder" ADD COLUMN "SpecimenPickTime" timestamptz NULL, ADD COLUMN "ExaminationDate" timestamptz NULL, ADD COLUMN "Number" smallint NULL, ADD COLUMN "Temperature" numeric NULL, ADD COLUMN "McuUrgencyLevel_Code" character varying(10) NOT NULL; +-- Modify "McuOrderItem" table +ALTER TABLE "public"."McuOrderItem" ADD COLUMN "ExaminationDate" timestamptz NULL; +-- Create index "idx_order_src" to table: "McuOrderItem" +CREATE UNIQUE INDEX "idx_order_src" ON "public"."McuOrderItem" ("McuOrder_Id", "McuSrc_Id"); +-- Modify "PersonRelative" table +ALTER TABLE "public"."PersonRelative" ADD COLUMN "Responsible" boolean NULL; +-- Modify "McuSrc" table +ALTER TABLE "public"."McuSrc" ALTER COLUMN "Id" TYPE bigint, ADD COLUMN "Item_Id" bigint NULL, ADD CONSTRAINT "fk_McuSrc_Item" FOREIGN KEY ("Item_Id") REFERENCES "public"."Item" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/20250918073742.sql b/cmd/main-migration/migrations/20250918073742.sql new file mode 100644 index 00000000..28611d73 --- /dev/null +++ b/cmd/main-migration/migrations/20250918073742.sql @@ -0,0 +1,31 @@ +-- Create "McuSubSrc" table +CREATE TABLE "public"."McuSubSrc" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Code" character varying(20) NULL, + "Name" character varying(50) NULL, + "McuSrc_Id" bigint NULL, + "Item_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_McuSubSrc_Code" UNIQUE ("Code"), + CONSTRAINT "fk_McuSubSrc_Item" FOREIGN KEY ("Item_Id") REFERENCES "public"."Item" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_McuSubSrc_McuSrc" FOREIGN KEY ("McuSrc_Id") REFERENCES "public"."McuSrc" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "McuOrderSubItem" table +CREATE TABLE "public"."McuOrderSubItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "McuSubSrc_Id" bigint NULL, + "McuOrderItem_Id" bigint NULL, + "Result" text NULL, + "Status_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_McuOrderSubItem_McuOrderItem" FOREIGN KEY ("McuOrderItem_Id") REFERENCES "public"."McuOrderItem" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_McuOrderSubItem_McuSubSrc" FOREIGN KEY ("McuSubSrc_Id") REFERENCES "public"."McuSubSrc" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create index "idx_order_sub_src" to table: "McuOrderSubItem" +CREATE UNIQUE INDEX "idx_order_sub_src" ON "public"."McuOrderSubItem" ("McuSubSrc_Id", "McuOrderItem_Id"); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index bef5214a..8331a224 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:MYP+zDQNT6gqYsXaJnhbXwwAogZIHtCYOfAs8/dvsQs= +h1:/1wrpFNiVjqgLh9gO/ylCCpvvZ/DLYioH4r0cbc+F7Y= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -11,4 +11,6 @@ h1:MYP+zDQNT6gqYsXaJnhbXwwAogZIHtCYOfAs8/dvsQs= 20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= 20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= 20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:Ap/l0AV/iazV6g88JbBEnnDdb/QUAt3j0DAGsNonswY= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:QyqEw1qSiM43O0+6eDfbEh6bp/a/AzDjKAKKO9fyvgg= +20250918073742.sql h1:8pwPLtUk7WRL2yTeZUMz8VnqZeoxTcUc2DtMcL8GH9Q= diff --git a/internal/domain/main-entities/mcu-order-item/entity.go b/internal/domain/main-entities/mcu-order-item/entity.go index 73b56a95..f1ae0cc8 100644 --- a/internal/domain/main-entities/mcu-order-item/entity.go +++ b/internal/domain/main-entities/mcu-order-item/entity.go @@ -4,16 +4,18 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" emo "simrs-vx/internal/domain/main-entities/mcu-order" ems "simrs-vx/internal/domain/main-entities/mcu-src" + "time" erc "simrs-vx/internal/domain/references/common" ) type McuOrderItem struct { - ecore.Main // adjust this according to the needs - McuOrder_Id *uint `json:"mcuOrder_id"` - McuOrder *emo.McuOrder `json:"mcuOrder,omitempty" gorm:"foreignKey:McuOrder_Id;references:Id"` - McuSrc_Id *uint `json:"mcuSrc_id"` - McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Id;references:Id"` - Result *string `json:"result"` - Status_Code erc.DataStatusCode `json:"status_code"` + ecore.Main // adjust this according to the needs + McuOrder_Id *uint `json:"mcuOrder_id" gorm:"uniqueIndex:idx_order_src"` + McuOrder *emo.McuOrder `json:"mcuOrder,omitempty" gorm:"foreignKey:McuOrder_Id;references:Id"` + McuSrc_Id *uint `json:"mcuSrc_id" gorm:"uniqueIndex:idx_order_src"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Id;references:Id"` + ExaminationDate *time.Time `json:"examinationDate"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` } diff --git a/internal/domain/main-entities/mcu-order-sub-item/dto.go b/internal/domain/main-entities/mcu-order-sub-item/dto.go new file mode 100644 index 00000000..d59d2ccf --- /dev/null +++ b/internal/domain/main-entities/mcu-order-sub-item/dto.go @@ -0,0 +1,81 @@ +package mcuordersubitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + emoi "simrs-vx/internal/domain/main-entities/mcu-order-item" + emss "simrs-vx/internal/domain/main-entities/mcu-sub-src" + erc "simrs-vx/internal/domain/references/common" +) + +type CreateDto struct { + McuSubSrc_Id *uint `json:"mcuSubSrc_id"` + McuOrderItem_Id *uint `json:"mcuOrderItem_id"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + McuOrder_Id *uint `json:"mcuOrder_id"` + McuSrc_Id *uint `json:"mcuSrc_id"` + Result *string `json:"result"` + 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"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + McuSubSrc_Id *uint `json:"mcuSubSrc_id"` + McuSubSrc *emss.McuSubSrc `json:"mcuSubSrc,omitempty"` + McuOrderItem_Id *uint `json:"mcuOrderItem_id"` + McuOrderItem *emoi.McuOrderItem `json:"mcuOrderItem,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +func (d McuOrderSubItem) ToResponse() ResponseDto { + resp := ResponseDto{ + McuSubSrc_Id: d.McuSubSrc_Id, + McuSubSrc: d.McuSubSrc, + McuOrderItem_Id: d.McuOrderItem_Id, + McuOrderItem: d.McuOrderItem, + Result: d.Result, + Status_Code: d.Status_Code, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []McuOrderSubItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/mcu-order-sub-item/entity.go b/internal/domain/main-entities/mcu-order-sub-item/entity.go new file mode 100644 index 00000000..c3f77361 --- /dev/null +++ b/internal/domain/main-entities/mcu-order-sub-item/entity.go @@ -0,0 +1,19 @@ +package mcuordersubitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + emoi "simrs-vx/internal/domain/main-entities/mcu-order-item" + emss "simrs-vx/internal/domain/main-entities/mcu-sub-src" + + erc "simrs-vx/internal/domain/references/common" +) + +type McuOrderSubItem struct { + ecore.Main // adjust this according to the needs + McuSubSrc_Id *uint `json:"mcuSubSrc_id" gorm:"uniqueIndex:idx_order_sub_src"` + McuSubSrc *emss.McuSubSrc `json:"mcuSubSrc,omitempty" gorm:"foreignKey:McuSubSrc_Id;references:Id"` + McuOrderItem_Id *uint `json:"mcuOrderItem_id" gorm:"uniqueIndex:idx_order_sub_src"` + McuOrderItem *emoi.McuOrderItem `json:"mcuOrderItem,omitempty" gorm:"foreignKey:McuOrderItem_Id;references:Id"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} diff --git a/internal/domain/main-entities/mcu-order/entity.go b/internal/domain/main-entities/mcu-order/entity.go index 326c761f..e02fdcc2 100644 --- a/internal/domain/main-entities/mcu-order/entity.go +++ b/internal/domain/main-entities/mcu-order/entity.go @@ -4,15 +4,22 @@ 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" + ercl "simrs-vx/internal/domain/references/clinical" erc "simrs-vx/internal/domain/references/common" ) type McuOrder struct { - ecore.Main // adjust this according to the needs - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` + SpecimenPickTime *time.Time `json:"specimenPickTime"` + ExaminationDate *time.Time `json:"examinationDate"` + Number uint8 `json:"number"` + Temperature float64 `json:"temperature"` + McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code" gorm:"not null;size:10"` } diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index 26d76102..56ab9f57 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -2,6 +2,7 @@ package mcusrc import ( ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/item" ) type CreateDto struct { @@ -47,10 +48,12 @@ type MetaDto struct { } type ResponseDto struct { - ecore.SmallMain - Code string `json:"code"` - Name string `json:"name"` - CheckupCategory_Code *string `json:"checkupCategory_code"` + ecore.Main + Code string `json:"code"` + Name string `json:"name"` + CheckupCategory_Code *string `json:"checkupCategory_code"` + Item_Id *uint `json:"item_id"` + Item *ei.Item `json:"item,omitempty"` } func (d McuSrc) ToResponse() ResponseDto { @@ -58,8 +61,10 @@ func (d McuSrc) ToResponse() ResponseDto { Code: d.Code, Name: d.Name, CheckupCategory_Code: d.CheckupCategory_Code, + Item_Id: d.Item_Id, + Item: d.Item, } - resp.SmallMain = d.SmallMain + resp.Main = d.Main return resp } diff --git a/internal/domain/main-entities/mcu-src/entity.go b/internal/domain/main-entities/mcu-src/entity.go index cdd8356f..fbdb3f54 100644 --- a/internal/domain/main-entities/mcu-src/entity.go +++ b/internal/domain/main-entities/mcu-src/entity.go @@ -2,13 +2,16 @@ package mcusrc import ( ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/item" emsc "simrs-vx/internal/domain/main-entities/mcu-src-category" ) type McuSrc struct { - ecore.SmallMain // adjust this according to the needs + ecore.Main // adjust this according to the needs Code string `json:"code" gorm:"unique;size:20"` Name string `json:"name" gorm:"size:50"` CheckupCategory_Code *string `json:"checkupCategory_code" gorm:"size:20"` CheckupCategory *emsc.McuSrcCategory `json:"checkupCategory,omitempty" gorm:"foreignKey:CheckupCategory_Code;references:Code"` + Item_Id *uint `json:"item_id"` + Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` } diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go new file mode 100644 index 00000000..eec34ead --- /dev/null +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -0,0 +1,80 @@ +package mcusubsrc + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/item" + ems "simrs-vx/internal/domain/main-entities/mcu-src" +) + +type CreateDto struct { + Code string `json:"code" validate:"maxLength=20"` + Name string `json:"name" validate:"maxLength=50"` + McuSrc_Id *uint `json:"mcuSrc_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` + CheckupCategory_Code *string `json:"checkupCategory_code"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + Code *string `json:"code"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Code string `json:"code"` + Name string `json:"name"` + McuSrc_Id *uint `json:"mcuSrc_id"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Item_Id *uint `json:"item_id"` + Item *ei.Item `json:"item,omitempty"` +} + +func (d McuSubSrc) ToResponse() ResponseDto { + resp := ResponseDto{ + Code: d.Code, + Name: d.Name, + McuSrc_Id: d.McuSrc_Id, + McuSrc: d.McuSrc, + Item_Id: d.Item_Id, + Item: d.Item, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []McuSubSrc) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/mcu-sub-src/entity.go b/internal/domain/main-entities/mcu-sub-src/entity.go new file mode 100644 index 00000000..02559abb --- /dev/null +++ b/internal/domain/main-entities/mcu-sub-src/entity.go @@ -0,0 +1,17 @@ +package mcusubsrc + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/item" + ems "simrs-vx/internal/domain/main-entities/mcu-src" +) + +type McuSubSrc struct { + ecore.Main // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:20"` + Name string `json:"name" gorm:"size:50"` + McuSrc_Id *uint `json:"mcuSrc_id"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Id;references:Id"` + Item_Id *uint `json:"item_id"` + Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` +} diff --git a/internal/domain/main-entities/person-relative/dto.go b/internal/domain/main-entities/person-relative/dto.go index 4b870771..4f28cbf8 100644 --- a/internal/domain/main-entities/person-relative/dto.go +++ b/internal/domain/main-entities/person-relative/dto.go @@ -17,6 +17,7 @@ type CreateDto struct { Education_Code *erp.EducationCode `json:"education_code" validate:"maxLength=10"` Occupation_Code *erp.OcupationCode `json:"occupation_code" validate:"maxLength=10"` Occupation_Name *string `json:"occupation_name" validate:"maxLength=50"` + Responsible bool `json:"responsible"` } type ReadListDto struct { @@ -37,6 +38,7 @@ type FilterDto struct { Education_Code *erp.EducationCode `json:"education_code"` Occupation_Code *erp.OcupationCode `json:"occupation_code"` Occupation_Name *string `json:"occupation_name"` + Responsible bool `json:"responsible"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -78,6 +80,7 @@ type ResponseDto struct { Education_Code *erp.EducationCode `json:"education_code"` Occupation_Code *erp.OcupationCode `json:"occupation_code"` Occupation_Name *string `json:"occupation_name"` + Responsible bool `json:"responsible"` } func (d *PersonRelative) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/person-relative/entity.go b/internal/domain/main-entities/person-relative/entity.go index 9b67bd0b..3f83aa23 100644 --- a/internal/domain/main-entities/person-relative/entity.go +++ b/internal/domain/main-entities/person-relative/entity.go @@ -19,4 +19,5 @@ type PersonRelative struct { Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` Occupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:10"` Occupation_Name *string `json:"occupation_name" gorm:"size:50"` + Responsible bool `json:"responsible"` } diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index e5c85682..d76770fe 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -2,11 +2,12 @@ package clinical type ( - SubjectCode string - ObjectCode string - AssessmentCode string - PlanCode string - InstructionCode string + SubjectCode string + ObjectCode string + AssessmentCode string + PlanCode string + InstructionCode string + McuUrgencyLevelCode string ) const ( @@ -39,4 +40,11 @@ const ( ICMedAct InstructionCode = "med-act" // Tindakan medis ICMedication InstructionCode = "medication" // Obat ICMaterial InstructionCode = "material" // BMHP + + MULCCITO McuUrgencyLevelCode = "cito" + MULCCITOIGD McuUrgencyLevelCode = "cito-igd" + MULCPonek McuUrgencyLevelCode = "ponek" + MULCBG McuUrgencyLevelCode = "blood-gas" + MULCPF McuUrgencyLevelCode = "priority-form" + MULCRT McuUrgencyLevelCode = "routine" ) diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 4e544a59..6bfde570 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -31,8 +31,10 @@ import ( materialorderitem "simrs-vx/internal/domain/main-entities/material-order-item" mcuorder "simrs-vx/internal/domain/main-entities/mcu-order" mcuorderitem "simrs-vx/internal/domain/main-entities/mcu-order-item" + mcuordersubitem "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" mcusrc "simrs-vx/internal/domain/main-entities/mcu-src" mcusrccategory "simrs-vx/internal/domain/main-entities/mcu-src-category" + mcusubsrc "simrs-vx/internal/domain/main-entities/mcu-sub-src" medicalactionsrc "simrs-vx/internal/domain/main-entities/medical-action-src" medicalactionsrcitem "simrs-vx/internal/domain/main-entities/medical-action-src-item" medication "simrs-vx/internal/domain/main-entities/medication" @@ -139,5 +141,7 @@ func getMainEntities() []any { &materialorderitem.MaterialOrderItem{}, &mcuorder.McuOrder{}, &mcuorderitem.McuOrderItem{}, + &mcusubsrc.McuSubSrc{}, + &mcuordersubitem.McuOrderSubItem{}, } } From e666a421f45c9626e8de4478fc39bc8608e29831 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 18 Sep 2025 14:47:11 +0700 Subject: [PATCH 042/190] feat (mcu-order): adjust mcu dto and helper --- .../main-entities/mcu-order-item/dto.go | 27 +++++----- .../domain/main-entities/mcu-order/dto.go | 54 +++++++++++++------ .../main-entities/person-relative/dto.go | 15 +++++- .../use-case/main-use-case/device/helper.go | 1 + .../use-case/main-use-case/material/helper.go | 1 + .../main-use-case/mcu-order/helper.go | 5 ++ .../main-use-case/person-relative/helper.go | 1 + 7 files changed, 75 insertions(+), 29 deletions(-) diff --git a/internal/domain/main-entities/mcu-order-item/dto.go b/internal/domain/main-entities/mcu-order-item/dto.go index 91ce3bdc..e5b82cb9 100644 --- a/internal/domain/main-entities/mcu-order-item/dto.go +++ b/internal/domain/main-entities/mcu-order-item/dto.go @@ -5,6 +5,7 @@ import ( emo "simrs-vx/internal/domain/main-entities/mcu-order" ems "simrs-vx/internal/domain/main-entities/mcu-src" erc "simrs-vx/internal/domain/references/common" + "time" ) type CreateDto struct { @@ -51,22 +52,24 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - McuOrder_Id *uint `json:"mcuOrder_id"` - McuOrder *emo.McuOrder `json:"mcuOrder,omitempty"` - McuSrc_Id *uint `json:"mcuSrc_id"` - McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` - Result *string `json:"result"` - Status_Code erc.DataStatusCode `json:"status_code"` + McuOrder_Id *uint `json:"mcuOrder_id"` + McuOrder *emo.McuOrder `json:"mcuOrder,omitempty"` + McuSrc_Id *uint `json:"mcuSrc_id"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` + ExaminationDate *time.Time `json:"examinationDate"` } func (d McuOrderItem) ToResponse() ResponseDto { resp := ResponseDto{ - McuOrder_Id: d.McuOrder_Id, - McuOrder: d.McuOrder, - McuSrc_Id: d.McuSrc_Id, - McuSrc: d.McuSrc, - Result: d.Result, - Status_Code: d.Status_Code, + McuOrder_Id: d.McuOrder_Id, + McuOrder: d.McuOrder, + McuSrc_Id: d.McuSrc_Id, + McuSrc: d.McuSrc, + Result: d.Result, + Status_Code: d.Status_Code, + ExaminationDate: d.ExaminationDate, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/mcu-order/dto.go b/internal/domain/main-entities/mcu-order/dto.go index 418fb02c..dbff3fdc 100644 --- a/internal/domain/main-entities/mcu-order/dto.go +++ b/internal/domain/main-entities/mcu-order/dto.go @@ -4,13 +4,20 @@ 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" + ercl "simrs-vx/internal/domain/references/clinical" erc "simrs-vx/internal/domain/references/common" + "time" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor_id"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor_id"` + SpecimenPickTime *time.Time `json:"specimenPickTime"` + ExaminationDate *time.Time `json:"examinationDate"` + Number uint8 `json:"number"` + Temperature float64 `json:"temperature"` + McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code""` } type ReadListDto struct { @@ -20,9 +27,14 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor_id"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor_id"` + SpecimenPickTime *time.Time `json:"specimenPickTime"` + ExaminationDate *time.Time `json:"examinationDate"` + Number uint8 `json:"number"` + Temperature float64 `json:"temperature"` + McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code""` Page int `json:"page"` PageSize int `json:"page_size"` @@ -49,20 +61,30 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` - Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty"` + SpecimenPickTime *time.Time `json:"specimenPickTime"` + ExaminationDate *time.Time `json:"examinationDate"` + Number uint8 `json:"number"` + Temperature float64 `json:"temperature"` + McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code""` } func (d McuOrder) ToResponse() ResponseDto { resp := ResponseDto{ - Encounter_Id: d.Encounter_Id, - Encounter: d.Encounter, - Status_Code: d.Status_Code, - Doctor_Id: d.Doctor_Id, - Doctor: d.Doctor, + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Status_Code: d.Status_Code, + Doctor_Id: d.Doctor_Id, + Doctor: d.Doctor, + SpecimenPickTime: d.SpecimenPickTime, + ExaminationDate: d.ExaminationDate, + Number: d.Number, + Temperature: d.Temperature, + McuUrgencyLevel_Code: d.McuUrgencyLevel_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/person-relative/dto.go b/internal/domain/main-entities/person-relative/dto.go index 4f28cbf8..deb29886 100644 --- a/internal/domain/main-entities/person-relative/dto.go +++ b/internal/domain/main-entities/person-relative/dto.go @@ -84,7 +84,20 @@ type ResponseDto struct { } func (d *PersonRelative) ToResponse() ResponseDto { - resp := ResponseDto{} + resp := ResponseDto{ + Person_Id: d.Person_Id, + Relationship_Code: d.Relationship_Code, + Name: d.Name, + Address: d.Address, + Village_Code: d.Village_Code, + Village: d.Village, + Gender_Code: d.Gender_Code, + PhoneNumber: d.PhoneNumber, + Education_Code: d.Education_Code, + Occupation_Code: d.Occupation_Code, + Occupation_Name: d.Occupation_Name, + Responsible: d.Responsible, + } resp.Main = d.Main return resp } diff --git a/internal/use-case/main-use-case/device/helper.go b/internal/use-case/main-use-case/device/helper.go index 63d51664..08964464 100644 --- a/internal/use-case/main-use-case/device/helper.go +++ b/internal/use-case/main-use-case/device/helper.go @@ -31,6 +31,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Device) { data.Name = inputSrc.Name data.Uom_Code = inputSrc.Uom_Code data.Item_Id = inputSrc.Item_Id + data.Infra_Id = inputSrc.Infra_Id } func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { diff --git a/internal/use-case/main-use-case/material/helper.go b/internal/use-case/main-use-case/material/helper.go index ce0d8a2e..9cfefe27 100644 --- a/internal/use-case/main-use-case/material/helper.go +++ b/internal/use-case/main-use-case/material/helper.go @@ -31,6 +31,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Material) { data.Uom_Code = inputSrc.Uom_Code data.Stock = inputSrc.Stock data.Item_Id = inputSrc.Item_Id + data.Infra_Id = inputSrc.Infra_Id } func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { diff --git a/internal/use-case/main-use-case/mcu-order/helper.go b/internal/use-case/main-use-case/mcu-order/helper.go index cb0b9878..65c95bff 100644 --- a/internal/use-case/main-use-case/mcu-order/helper.go +++ b/internal/use-case/main-use-case/mcu-order/helper.go @@ -20,4 +20,9 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuOrder) { data.Encounter_Id = inputSrc.Encounter_Id data.Status_Code = inputSrc.Status_Code data.Doctor_Id = inputSrc.Doctor_Id + data.SpecimenPickTime = inputSrc.SpecimenPickTime + data.ExaminationDate = inputSrc.ExaminationDate + data.Number = inputSrc.Number + data.Temperature = inputSrc.Temperature + data.McuUrgencyLevel_Code = inputSrc.McuUrgencyLevel_Code } diff --git a/internal/use-case/main-use-case/person-relative/helper.go b/internal/use-case/main-use-case/person-relative/helper.go index 48883d5a..b0624521 100644 --- a/internal/use-case/main-use-case/person-relative/helper.go +++ b/internal/use-case/main-use-case/person-relative/helper.go @@ -27,4 +27,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PersonRelative) { data.Education_Code = inputSrc.Education_Code data.Occupation_Code = inputSrc.Occupation_Code data.Occupation_Name = inputSrc.Occupation_Name + data.Responsible = inputSrc.Responsible } From 28a8fff219fd571b995c8b99a6ebc57ce87a103a Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 18 Sep 2025 14:48:07 +0700 Subject: [PATCH 043/190] change size mcu urgency level code --- cmd/main-migration/migrations/20250918074745.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 7 ++++--- internal/domain/main-entities/mcu-order/entity.go | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 cmd/main-migration/migrations/20250918074745.sql diff --git a/cmd/main-migration/migrations/20250918074745.sql b/cmd/main-migration/migrations/20250918074745.sql new file mode 100644 index 00000000..365227cb --- /dev/null +++ b/cmd/main-migration/migrations/20250918074745.sql @@ -0,0 +1,2 @@ +-- Modify "McuOrder" table +ALTER TABLE "public"."McuOrder" ALTER COLUMN "McuUrgencyLevel_Code" TYPE character varying(15); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 8331a224..6d4d0688 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:/1wrpFNiVjqgLh9gO/ylCCpvvZ/DLYioH4r0cbc+F7Y= +h1:5jNo0I155phYhWoHR1fzLdCLVByy/lPwGz5IS1aslTc= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -12,5 +12,6 @@ h1:/1wrpFNiVjqgLh9gO/ylCCpvvZ/DLYioH4r0cbc+F7Y= 20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= 20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= 20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:QyqEw1qSiM43O0+6eDfbEh6bp/a/AzDjKAKKO9fyvgg= -20250918073742.sql h1:8pwPLtUk7WRL2yTeZUMz8VnqZeoxTcUc2DtMcL8GH9Q= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:Nl0Z6QghF2/iUk5AtslyA4Jo7YzQSfrGoH2gZuXVXK8= diff --git a/internal/domain/main-entities/mcu-order/entity.go b/internal/domain/main-entities/mcu-order/entity.go index e02fdcc2..134485e5 100644 --- a/internal/domain/main-entities/mcu-order/entity.go +++ b/internal/domain/main-entities/mcu-order/entity.go @@ -21,5 +21,5 @@ type McuOrder struct { ExaminationDate *time.Time `json:"examinationDate"` Number uint8 `json:"number"` Temperature float64 `json:"temperature"` - McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code" gorm:"not null;size:10"` + McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code" gorm:"not null;size:15"` } From 6304d8f02af5852e279caec5e90a830f790b88b0 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sun, 21 Sep 2025 04:41:43 +0700 Subject: [PATCH 044/190] add mcu orders related, not tested yet --- .../main-entities/mcu-order-item/dto.go | 20 +- .../main-entities/mcu-order-item/entity.go | 4 + .../main-entities/mcu-order-sub-item/dto.go | 6 +- .../domain/main-entities/mcu-order/dto.go | 12 +- .../domain/main-entities/mcu-order/entity.go | 4 + internal/domain/main-entities/mcu-src/dto.go | 1 + .../domain/main-entities/mcu-sub-src/dto.go | 1 + .../references/organization/organization.go | 2 + .../interface/main-handler/main-handler.go | 70 +++-- .../main-handler/mcu-order-item/handler.go | 21 +- .../mcu-order-sub-item/handler.go | 71 +++++ .../main-handler/mcu-order/handler.go | 33 +- .../main-handler/mcu-sub-src/handler.go | 71 +++++ .../main-use-case/mcu-order-item/case.go | 54 ++++ .../main-use-case/mcu-order-item/helper.go | 1 + .../main-use-case/mcu-order-sub-item/case.go | 279 +++++++++++++++++ .../mcu-order-sub-item/helper.go | 24 ++ .../main-use-case/mcu-order-sub-item/lib.go | 155 ++++++++++ .../mcu-order-sub-item/middleware-runner.go | 103 +++++++ .../mcu-order-sub-item/middleware.go | 9 + .../mcu-order-sub-item/tycovar.go | 44 +++ .../use-case/main-use-case/mcu-order/case.go | 107 +++++++ .../use-case/main-use-case/mcu-src/case.go | 4 + .../use-case/main-use-case/mcu-src/helper.go | 28 ++ .../main-use-case/mcu-sub-src/case.go | 282 ++++++++++++++++++ .../main-use-case/mcu-sub-src/helper.go | 51 ++++ .../use-case/main-use-case/mcu-sub-src/lib.go | 155 ++++++++++ .../mcu-sub-src/middleware-runner.go | 103 +++++++ .../main-use-case/mcu-sub-src/middleware.go | 9 + .../main-use-case/mcu-sub-src/tycovar.go | 44 +++ 30 files changed, 1722 insertions(+), 46 deletions(-) create mode 100644 internal/interface/main-handler/mcu-order-sub-item/handler.go create mode 100644 internal/interface/main-handler/mcu-sub-src/handler.go create mode 100644 internal/use-case/main-use-case/mcu-order-sub-item/case.go create mode 100644 internal/use-case/main-use-case/mcu-order-sub-item/helper.go create mode 100644 internal/use-case/main-use-case/mcu-order-sub-item/lib.go create mode 100644 internal/use-case/main-use-case/mcu-order-sub-item/middleware-runner.go create mode 100644 internal/use-case/main-use-case/mcu-order-sub-item/middleware.go create mode 100644 internal/use-case/main-use-case/mcu-order-sub-item/tycovar.go create mode 100644 internal/use-case/main-use-case/mcu-sub-src/case.go create mode 100644 internal/use-case/main-use-case/mcu-sub-src/helper.go create mode 100644 internal/use-case/main-use-case/mcu-sub-src/lib.go create mode 100644 internal/use-case/main-use-case/mcu-sub-src/middleware-runner.go create mode 100644 internal/use-case/main-use-case/mcu-sub-src/middleware.go create mode 100644 internal/use-case/main-use-case/mcu-sub-src/tycovar.go diff --git a/internal/domain/main-entities/mcu-order-item/dto.go b/internal/domain/main-entities/mcu-order-item/dto.go index e5b82cb9..24aba1b8 100644 --- a/internal/domain/main-entities/mcu-order-item/dto.go +++ b/internal/domain/main-entities/mcu-order-item/dto.go @@ -9,10 +9,11 @@ import ( ) type CreateDto struct { - McuOrder_Id *uint `json:"mcuOrder_id"` - McuSrc_Id *uint `json:"mcuSrc_id"` - Result *string `json:"result"` - Status_Code erc.DataStatusCode `json:"status_code"` + McuOrder_Id *uint `json:"mcuOrder_id"` + McuSrc_Id *uint `json:"mcuSrc_id"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` + ExaminationDate *time.Time `json:"examinationDate"` } type ReadListDto struct { @@ -32,16 +33,21 @@ type FilterDto struct { NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint `json:"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 SetScheduleDto struct { + Id uint `json:"id"` + ExaminationDate *time.Time `json:"examinationDate"` } type MetaDto struct { diff --git a/internal/domain/main-entities/mcu-order-item/entity.go b/internal/domain/main-entities/mcu-order-item/entity.go index f1ae0cc8..6a4441d0 100644 --- a/internal/domain/main-entities/mcu-order-item/entity.go +++ b/internal/domain/main-entities/mcu-order-item/entity.go @@ -19,3 +19,7 @@ type McuOrderItem struct { Result *string `json:"result"` Status_Code erc.DataStatusCode `json:"status_code"` } + +func (d McuOrderItem) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/mcu-order-sub-item/dto.go b/internal/domain/main-entities/mcu-order-sub-item/dto.go index d59d2ccf..cb250200 100644 --- a/internal/domain/main-entities/mcu-order-sub-item/dto.go +++ b/internal/domain/main-entities/mcu-order-sub-item/dto.go @@ -31,16 +31,16 @@ type FilterDto struct { NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint `json:"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 { diff --git a/internal/domain/main-entities/mcu-order/dto.go b/internal/domain/main-entities/mcu-order/dto.go index dbff3fdc..4dcabce4 100644 --- a/internal/domain/main-entities/mcu-order/dto.go +++ b/internal/domain/main-entities/mcu-order/dto.go @@ -41,16 +41,21 @@ type FilterDto struct { NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint `json:"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 SetScheduleDto struct { + Id uint `json:"id"` + ExaminationDate *time.Time `json:"examinationDate"` } type MetaDto struct { @@ -58,7 +63,6 @@ type MetaDto struct { PageSize int `json:"page_size"` Count int `json:"count"` } - type ResponseDto struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` diff --git a/internal/domain/main-entities/mcu-order/entity.go b/internal/domain/main-entities/mcu-order/entity.go index 134485e5..96721caf 100644 --- a/internal/domain/main-entities/mcu-order/entity.go +++ b/internal/domain/main-entities/mcu-order/entity.go @@ -23,3 +23,7 @@ type McuOrder struct { Temperature float64 `json:"temperature"` McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code" gorm:"not null;size:15"` } + +func (d McuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index 56ab9f57..2d0e9827 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -9,6 +9,7 @@ type CreateDto struct { Code string `json:"code" validate:"maxLength=20"` Name string `json:"name" validate:"maxLength=50"` CheckupCategory_Code *string `json:"checkupCategory_code" validate:"maxLength=20"` + Item_Id *uint `json:"item_id"` } type ReadListDto struct { diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go index eec34ead..a6d0a804 100644 --- a/internal/domain/main-entities/mcu-sub-src/dto.go +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -10,6 +10,7 @@ type CreateDto struct { Code string `json:"code" validate:"maxLength=20"` Name string `json:"name" validate:"maxLength=50"` McuSrc_Id *uint `json:"mcuSrc_id"` + Item_Id *uint `json:"item_id"` } type ReadListDto struct { diff --git a/internal/domain/references/organization/organization.go b/internal/domain/references/organization/organization.go index 30aa25b5..1f655466 100644 --- a/internal/domain/references/organization/organization.go +++ b/internal/domain/references/organization/organization.go @@ -23,6 +23,8 @@ const ( ITGCMedicine ItemGroupCode = "medicine" ITGCDevice ItemGroupCode = "device" ITGCMaterial ItemGroupCode = "material" + ITGCMCU ItemGroupCode = "mcu" + ITGCMCUSub ItemGroupCode = "mcuSub" ITGCEmpFee ItemGroupCode = "employee-fee" ITGCDocFee ItemGroupCode = "doctor-fee" diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index cc14eaf1..b57ad997 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -14,6 +14,7 @@ import ( materialorderitem "simrs-vx/internal/interface/main-handler/material-order-item" mcuorder "simrs-vx/internal/interface/main-handler/mcu-order" mcuorderitem "simrs-vx/internal/interface/main-handler/mcu-order-item" + mcuordersubitem "simrs-vx/internal/interface/main-handler/mcu-order-sub-item" medication "simrs-vx/internal/interface/main-handler/medication" medicationitem "simrs-vx/internal/interface/main-handler/medication-item" medicationitemdist "simrs-vx/internal/interface/main-handler/medication-item-dist" @@ -68,6 +69,7 @@ import ( material "simrs-vx/internal/interface/main-handler/material" mcusrc "simrs-vx/internal/interface/main-handler/mcu-src" mcusrccategory "simrs-vx/internal/interface/main-handler/mcu-src-category" + mcusubsrc "simrs-vx/internal/interface/main-handler/mcu-sub-src" medicalactionsrc "simrs-vx/internal/interface/main-handler/medical-action-src" medicalactionsrcitem "simrs-vx/internal/interface/main-handler/medical-action-src-item" medicine "simrs-vx/internal/interface/main-handler/medicine" @@ -111,24 +113,30 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/counter", counter.O) hc.RegCrud(r, "/v1/medicine-mix", medicicinemix.O) hc.RegCrud(r, "/v1/medicine-mix-item", medicicinemixitem.O) - - /******************** actor ********************/ - hk.GroupRoutes("/v1/user", r, hk.MapHandlerFunc{ - "GET /": user.O.GetList, - "GET /{id}": user.O.GetDetail, - "POST /": user.O.Create, - "PATCH /{id}": user.O.Update, - "DELETE /{id}": user.O.Delete, - "PATCH /{id}/block": user.O.Block, - "PATCH /{id}/active": user.O.Active, + hc.RegCrud(r, "/v1/soapi", auth.GuardMW, soapi.O) + hc.RegCrud(r, "/v1/adime", auth.GuardMW, adime.O) + hc.RegCrud(r, "/v1/sbar", auth.GuardMW, sbar.O) + hc.RegCrud(r, "/v1/prescription", prescription.O) + hc.RegCrud(r, "/v1/prescription-item", prescriptionitem.O) + hc.RegCrud(r, "/v1/device-order-item", deviceorderitem.O) + hc.RegCrud(r, "/v1/material-order-item", materialorderitem.O) + hc.RegCrud(r, "/v1/mcu-order-sub-item", mcuordersubitem.O) + hk.GroupRoutes("/v1/mcu-order", r, hk.MapHandlerFunc{ + "GET /": mcuorder.O.GetList, + "GET /{id}": mcuorder.O.GetDetail, + "POST /": mcuorder.O.Create, + "PATCH /{id}": mcuorder.O.Update, + "DELETE /{id}": mcuorder.O.Delete, + "PATCH /{id}/complete": mcuorder.O.Complete, + "PATCH /{id}/set-schedule": mcuorder.O.SetSchedule, }) - hk.GroupRoutes("/v1/patient", r, hk.MapHandlerFunc{ - "GET /": patient.O.GetList, - "GET /{id}": patient.O.GetDetail, - "POST /": patient.O.Create, - "PATCH /{id}": patient.O.Update, - "DELETE /{id}": patient.O.Delete, - "GET /by-identifier": patient.O.Search, + hk.GroupRoutes("/v1/mcu-order-item", r, hk.MapHandlerFunc{ + "GET /": mcuorderitem.O.GetList, + "GET /{id}": mcuorderitem.O.GetDetail, + "POST /": mcuorderitem.O.Create, + "PATCH /{id}": mcuorderitem.O.Update, + "DELETE /{id}": mcuorderitem.O.Delete, + "PATCH /{id}/set-schedule": mcuorderitem.O.SetSchedule, }) hk.GroupRoutes("/v1/encounter", r, hk.MapHandlerFunc{ "GET /": encounter.O.GetList, @@ -183,9 +191,7 @@ func SetRoutes() http.Handler { "PATCH /{id}/complete": materialorder.O.Complete, }) - hc.RegCrud(r, "/v1/soapi", auth.GuardMW, soapi.O) - hc.RegCrud(r, "/v1/adime", auth.GuardMW, adime.O) - hc.RegCrud(r, "/v1/sbar", auth.GuardMW, sbar.O) + /******************** actor ********************/ hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) hc.RegCrud(r, "/v1/person-contact", personcontact.O) @@ -194,12 +200,23 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/nurse", nurse.O) hc.RegCrud(r, "/v1/nutritionist", nutritionist.O) 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/device-order-item", deviceorderitem.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) + hk.GroupRoutes("/v1/user", r, hk.MapHandlerFunc{ + "GET /": user.O.GetList, + "GET /{id}": user.O.GetDetail, + "POST /": user.O.Create, + "PATCH /{id}": user.O.Update, + "DELETE /{id}": user.O.Delete, + "PATCH /{id}/block": user.O.Block, + "PATCH /{id}/active": user.O.Active, + }) + hk.GroupRoutes("/v1/patient", r, hk.MapHandlerFunc{ + "GET /": patient.O.GetList, + "GET /{id}": patient.O.GetDetail, + "POST /": patient.O.Create, + "PATCH /{id}": patient.O.Update, + "DELETE /{id}": patient.O.Delete, + "GET /by-identifier": patient.O.Search, + }) /******************** sources ********************/ hc.RegCrud(r, "/v1/division", division.O) @@ -228,6 +245,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/language", language.O) hc.RegCrud(r, "/v1/specialist", specialist.O) hc.RegCrud(r, "/v1/subspecialist", subspecialist.O) + hc.RegCrud(r, "/v1/mcu-sub-src", mcusubsrc.O) hc.RegCrud(r, "/v1/village", village.O) hc.RegCrud(r, "/v1/district", district.O) diff --git a/internal/interface/main-handler/mcu-order-item/handler.go b/internal/interface/main-handler/mcu-order-item/handler.go index a3a4bcc8..f407a044 100644 --- a/internal/interface/main-handler/mcu-order-item/handler.go +++ b/internal/interface/main-handler/mcu-order-item/handler.go @@ -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,22 @@ 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) } + +func (obj myBase) SetSchedule(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.SetScheduleDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint(id) + res, err := u.SetSchedule(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/mcu-order-sub-item/handler.go b/internal/interface/main-handler/mcu-order-sub-item/handler.go new file mode 100644 index 00000000..e36426e0 --- /dev/null +++ b/internal/interface/main-handler/mcu-order-sub-item/handler.go @@ -0,0 +1,71 @@ +package mcuordersubitem + +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/mcu-order-sub-item" + u "simrs-vx/internal/use-case/main-use-case/mcu-order-sub-item" +) + +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 = uint(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/interface/main-handler/mcu-order/handler.go b/internal/interface/main-handler/mcu-order/handler.go index 77e19669..44a635a5 100644 --- a/internal/interface/main-handler/mcu-order/handler.go +++ b/internal/interface/main-handler/mcu-order/handler.go @@ -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,34 @@ 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) } + +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 = uint(id) + res, err := u.Complete(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) SetSchedule(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.SetScheduleDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint(id) + res, err := u.SetSchedule(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/mcu-sub-src/handler.go b/internal/interface/main-handler/mcu-sub-src/handler.go new file mode 100644 index 00000000..949be715 --- /dev/null +++ b/internal/interface/main-handler/mcu-sub-src/handler.go @@ -0,0 +1,71 @@ +package mcusubsrc + +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/mcu-sub-src" + u "simrs-vx/internal/use-case/main-use-case/mcu-sub-src" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/mcu-order-item/case.go b/internal/use-case/main-use-case/mcu-order-item/case.go index 74323143..899b8120 100644 --- a/internal/use-case/main-use-case/mcu-order-item/case.go +++ b/internal/use-case/main-use-case/mcu-order-item/case.go @@ -1,6 +1,7 @@ package mcuorderitem import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/mcu-order-item" @@ -277,3 +278,56 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func SetSchedule(input e.SetScheduleDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuOrderItem + var err error + + event := pl.Event{ + Feature: "SetSchedule", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "setSchedule") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + data, err = ReadDetailData(rdDto, &event, tx) + if err != nil { + return err + } + if data.IsCompleted() { + return errors.New("data already completed") + } + + data.ExaminationDate = input.ExaminationDate + 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": "setSchedule", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/mcu-order-item/helper.go b/internal/use-case/main-use-case/mcu-order-item/helper.go index 48eaaf09..a2694ecd 100644 --- a/internal/use-case/main-use-case/mcu-order-item/helper.go +++ b/internal/use-case/main-use-case/mcu-order-item/helper.go @@ -21,4 +21,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuOrderItem) { data.McuSrc_Id = inputSrc.McuSrc_Id data.Result = inputSrc.Result data.Status_Code = inputSrc.Status_Code + data.ExaminationDate = inputSrc.ExaminationDate } diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/case.go b/internal/use-case/main-use-case/mcu-order-sub-item/case.go new file mode 100644 index 00000000..bf3e4ce9 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-sub-item/case.go @@ -0,0 +1,279 @@ +package mcuordersubitem + +import ( + "strconv" + + e "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "mcu-order-sub-item" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.McuOrderSubItem{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.McuOrderSubItem + var dataList []e.McuOrderSubItem + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.McuOrderSubItem + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuOrderSubItem + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuOrderSubItem + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/helper.go b/internal/use-case/main-use-case/mcu-order-sub-item/helper.go new file mode 100644 index 00000000..f8d9c30f --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-sub-item/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package mcuordersubitem + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuOrderSubItem) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.McuSubSrc_Id = inputSrc.McuSubSrc_Id + data.McuOrderItem_Id = inputSrc.McuOrderItem_Id + data.Result = inputSrc.Result + data.Status_Code = inputSrc.Status_Code +} diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/lib.go b/internal/use-case/main-use-case/mcu-order-sub-item/lib.go new file mode 100644 index 00000000..edfee9cd --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-sub-item/lib.go @@ -0,0 +1,155 @@ +package mcuordersubitem + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrderSubItem, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.McuOrderSubItem{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.McuOrderSubItem, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.McuOrderSubItem{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.McuOrderSubItem{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrderSubItem, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.McuOrderSubItem{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.McuOrderSubItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.McuOrderSubItem, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/middleware-runner.go b/internal/use-case/main-use-case/mcu-order-sub-item/middleware-runner.go new file mode 100644 index 00000000..04b7323f --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-sub-item/middleware-runner.go @@ -0,0 +1,103 @@ +package mcuordersubitem + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.McuOrderSubItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.McuOrderSubItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrderSubItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrderSubItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuOrderSubItem) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/middleware.go b/internal/use-case/main-use-case/mcu-order-sub-item/middleware.go new file mode 100644 index 00000000..8dda3302 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-sub-item/middleware.go @@ -0,0 +1,9 @@ +package mcuordersubitem + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/tycovar.go b/internal/use-case/main-use-case/mcu-order-sub-item/tycovar.go new file mode 100644 index 00000000..58b67a88 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-order-sub-item/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package mcuordersubitem + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.McuOrderSubItem, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.McuOrderSubItem, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.McuOrderSubItem, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/mcu-order/case.go b/internal/use-case/main-use-case/mcu-order/case.go index b000ffc8..57de98fb 100644 --- a/internal/use-case/main-use-case/mcu-order/case.go +++ b/internal/use-case/main-use-case/mcu-order/case.go @@ -1,10 +1,13 @@ package mcuorder import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/mcu-order" + erc "simrs-vx/internal/domain/references/common" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -277,3 +280,107 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Complete(input e.ReadDetailDto) (*d.Data, error) { + var data *e.McuOrder + 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 +} + +func SetSchedule(input e.SetScheduleDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuOrder + var err error + + event := pl.Event{ + Feature: "SetSchedule", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "setSchedule") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + data, err = ReadDetailData(rdDto, &event, tx) + if err != nil { + return err + } + if data.IsCompleted() { + return errors.New("data already completed") + } + + data.ExaminationDate = input.ExaminationDate + 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": "setSchedule", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/mcu-src/case.go b/internal/use-case/main-use-case/mcu-src/case.go index ae7a1860..f0e7589a 100644 --- a/internal/use-case/main-use-case/mcu-src/case.go +++ b/internal/use-case/main-use-case/mcu-src/case.go @@ -34,6 +34,10 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if err := createItem(&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/mcu-src/helper.go b/internal/use-case/main-use-case/mcu-src/helper.go index 820dbfa7..3c7dc31c 100644 --- a/internal/use-case/main-use-case/mcu-src/helper.go +++ b/internal/use-case/main-use-case/mcu-src/helper.go @@ -5,7 +5,17 @@ Any functions that are used internally by the use-case package mcusrc import ( + ei "simrs-vx/internal/domain/main-entities/item" e "simrs-vx/internal/domain/main-entities/mcu-src" + + ui "simrs-vx/internal/use-case/main-use-case/item" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + ero "simrs-vx/internal/domain/references/organization" + + "gorm.io/gorm" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuSrc) { @@ -20,4 +30,22 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuSrc) { data.Code = inputSrc.Code data.Name = inputSrc.Name data.CheckupCategory_Code = inputSrc.CheckupCategory_Code + data.Item_Id = inputSrc.Item_Id +} + +func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { + itemCreate := ei.CreateDto{ + Code: pu.AddPrefix("mcu-", input.Code), + Name: input.Name, + ItemGroup_Code: ero.ITGCMCU, + // Uom_Code: &input.Uom_Code, + // Infra_Id: input.Infra_Id, + } + item, err := ui.CreateData(itemCreate, event, tx) + if err != nil { + return err + } + + input.Item_Id = &item.Id + return nil } diff --git a/internal/use-case/main-use-case/mcu-sub-src/case.go b/internal/use-case/main-use-case/mcu-sub-src/case.go new file mode 100644 index 00000000..e977931f --- /dev/null +++ b/internal/use-case/main-use-case/mcu-sub-src/case.go @@ -0,0 +1,282 @@ +package mcusubsrc + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-sub-src" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "mcu-sub-src" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.McuSubSrc{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if err := createItem(&input, &event, tx); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.McuSubSrc + var dataList []e.McuSubSrc + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.McuSubSrc + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuSubSrc + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.McuSubSrc + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/mcu-sub-src/helper.go b/internal/use-case/main-use-case/mcu-sub-src/helper.go new file mode 100644 index 00000000..071d5f38 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-sub-src/helper.go @@ -0,0 +1,51 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package mcusubsrc + +import ( + ei "simrs-vx/internal/domain/main-entities/item" + e "simrs-vx/internal/domain/main-entities/mcu-sub-src" + + ui "simrs-vx/internal/use-case/main-use-case/item" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + ero "simrs-vx/internal/domain/references/organization" + + "gorm.io/gorm" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuSubSrc) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Code = inputSrc.Code + data.Name = inputSrc.Name + data.McuSrc_Id = inputSrc.McuSrc_Id + data.Item_Id = inputSrc.Item_Id +} + +func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { + itemCreate := ei.CreateDto{ + Code: pu.AddPrefix("mcuSub-", input.Code), + Name: input.Name, + ItemGroup_Code: ero.ITGCMCU, + // Uom_Code: &input.Uom_Code, + // Infra_Id: input.Infra_Id, + } + item, err := ui.CreateData(itemCreate, event, tx) + if err != nil { + return err + } + + input.Item_Id = &item.Id + return nil +} diff --git a/internal/use-case/main-use-case/mcu-sub-src/lib.go b/internal/use-case/main-use-case/mcu-sub-src/lib.go new file mode 100644 index 00000000..711dabdd --- /dev/null +++ b/internal/use-case/main-use-case/mcu-sub-src/lib.go @@ -0,0 +1,155 @@ +package mcusubsrc + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-sub-src" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuSubSrc, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.McuSubSrc{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.McuSubSrc, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.McuSubSrc{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.McuSubSrc{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuSubSrc, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.McuSubSrc{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.McuSubSrc, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.McuSubSrc, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/mcu-sub-src/middleware-runner.go b/internal/use-case/main-use-case/mcu-sub-src/middleware-runner.go new file mode 100644 index 00000000..89d328ed --- /dev/null +++ b/internal/use-case/main-use-case/mcu-sub-src/middleware-runner.go @@ -0,0 +1,103 @@ +package mcusubsrc + +import ( + e "simrs-vx/internal/domain/main-entities/mcu-sub-src" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.McuSubSrc) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.McuSubSrc) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuSubSrc) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuSubSrc) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.McuSubSrc) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/mcu-sub-src/middleware.go b/internal/use-case/main-use-case/mcu-sub-src/middleware.go new file mode 100644 index 00000000..a58ac781 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-sub-src/middleware.go @@ -0,0 +1,9 @@ +package mcusubsrc + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/mcu-sub-src/tycovar.go b/internal/use-case/main-use-case/mcu-sub-src/tycovar.go new file mode 100644 index 00000000..7522ada4 --- /dev/null +++ b/internal/use-case/main-use-case/mcu-sub-src/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package mcusubsrc + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/mcu-sub-src" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.McuSubSrc, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.McuSubSrc, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.McuSubSrc, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From 37da1ee418ea8398a62ad7fc95df55688c6f1c2a Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 22 Sep 2025 13:00:23 +0700 Subject: [PATCH 045/190] feat (orders): add guard if parents are done, cant create child --- .../mcu-order-sub-item/entity.go | 4 ++ .../interface/main-handler/main-handler.go | 10 ++- .../main-handler/mcu-order-item/handler.go | 12 ++++ .../mcu-order-sub-item/handler.go | 12 ++++ .../main-use-case/device-order/case.go | 7 ++ .../use-case/main-use-case/encounter/case.go | 4 +- .../use-case/main-use-case/encounter/lib.go | 24 +++++++ .../main-use-case/material-order-item/case.go | 8 +++ .../main-use-case/material-order/case.go | 7 ++ .../main-use-case/material-order/lib.go | 24 +++++++ .../main-use-case/mcu-order-item/case.go | 66 ++++++++++++++++++ .../main-use-case/mcu-order-item/lib.go | 24 +++++++ .../main-use-case/mcu-order-sub-item/case.go | 67 +++++++++++++++++++ .../use-case/main-use-case/mcu-order/case.go | 7 ++ .../use-case/main-use-case/mcu-order/lib.go | 24 +++++++ .../main-use-case/mcu-sub-src/helper.go | 2 +- .../main-use-case/prescription/case.go | 59 ++++++++++++++++ pkg/use-case-helper/use-case-helper.go | 7 ++ 18 files changed, 365 insertions(+), 3 deletions(-) diff --git a/internal/domain/main-entities/mcu-order-sub-item/entity.go b/internal/domain/main-entities/mcu-order-sub-item/entity.go index c3f77361..83ae4d53 100644 --- a/internal/domain/main-entities/mcu-order-sub-item/entity.go +++ b/internal/domain/main-entities/mcu-order-sub-item/entity.go @@ -17,3 +17,7 @@ type McuOrderSubItem struct { Result *string `json:"result"` Status_Code erc.DataStatusCode `json:"status_code"` } + +func (d McuOrderSubItem) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index b57ad997..121a2c8d 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -120,7 +120,6 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/prescription-item", prescriptionitem.O) hc.RegCrud(r, "/v1/device-order-item", deviceorderitem.O) hc.RegCrud(r, "/v1/material-order-item", materialorderitem.O) - hc.RegCrud(r, "/v1/mcu-order-sub-item", mcuordersubitem.O) hk.GroupRoutes("/v1/mcu-order", r, hk.MapHandlerFunc{ "GET /": mcuorder.O.GetList, "GET /{id}": mcuorder.O.GetDetail, @@ -136,8 +135,17 @@ func SetRoutes() http.Handler { "POST /": mcuorderitem.O.Create, "PATCH /{id}": mcuorderitem.O.Update, "DELETE /{id}": mcuorderitem.O.Delete, + "PATCH /{id}/complete": mcuorderitem.O.Complete, "PATCH /{id}/set-schedule": mcuorderitem.O.SetSchedule, }) + hk.GroupRoutes("/v1/mcu-order-sub-item", r, hk.MapHandlerFunc{ + "GET /": mcuordersubitem.O.GetList, + "GET /{id}": mcuordersubitem.O.GetDetail, + "POST /": mcuordersubitem.O.Create, + "PATCH /{id}": mcuordersubitem.O.Update, + "DELETE /{id}": mcuordersubitem.O.Delete, + "PATCH /{id}/complete": mcuordersubitem.O.Complete, + }) hk.GroupRoutes("/v1/encounter", r, hk.MapHandlerFunc{ "GET /": encounter.O.GetList, "GET /{id}": encounter.O.GetDetail, diff --git a/internal/interface/main-handler/mcu-order-item/handler.go b/internal/interface/main-handler/mcu-order-item/handler.go index f407a044..75f5ad6a 100644 --- a/internal/interface/main-handler/mcu-order-item/handler.go +++ b/internal/interface/main-handler/mcu-order-item/handler.go @@ -70,6 +70,18 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { 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 = uint(id) + res, err := u.Complete(dto) + rw.DataResponse(w, res, err) +} + func (obj myBase) SetSchedule(w http.ResponseWriter, r *http.Request) { id := rw.ValidateInt(w, "id", r.PathValue("id")) if id <= 0 { diff --git a/internal/interface/main-handler/mcu-order-sub-item/handler.go b/internal/interface/main-handler/mcu-order-sub-item/handler.go index e36426e0..8e8f8c79 100644 --- a/internal/interface/main-handler/mcu-order-sub-item/handler.go +++ b/internal/interface/main-handler/mcu-order-sub-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) Complete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.ReadDetailDto{} + dto.Id = uint(id) + res, err := u.Complete(dto) + rw.DataResponse(w, res, err) +} 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 96c510c0..66dc1949 100644 --- a/internal/use-case/main-use-case/device-order/case.go +++ b/internal/use-case/main-use-case/device-order/case.go @@ -6,6 +6,8 @@ import ( e "simrs-vx/internal/domain/main-entities/device-order" + ue "simrs-vx/internal/use-case/main-use-case/encounter" + erc "simrs-vx/internal/domain/references/common" dg "github.com/karincake/apem/db-gorm-pg" @@ -38,6 +40,11 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + // check if encounter is done + if ue.IsDone(*input.Encounter_Id, &event, tx) { + return errors.New("encounter is already done") + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 437e6b55..c63579cf 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -380,7 +380,9 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { } if err := createMedication(data.Id, &event, tx); err != nil { - return err + if !pu.IsDataNotFoundError(err) { + return err + } } pl.SetLogInfo(&event, nil, "complete") diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index a0aaa94b..8653cdbf 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -178,3 +178,27 @@ func UpdateDischargeData(input e.DischargeDto, data *e.Encounter, event *pl.Even pl.SetLogInfo(event, nil, "complete") return nil } + +func IsDone(encounter_id uint, event *pl.Event, dbx ...*gorm.DB) bool { + pl.SetLogInfo(event, nil, "started", "DBIsDone") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + var data e.Encounter + if err := tx.Where("\"Id\" = ?", encounter_id).First(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return false + } + + pl.SetLogInfo(event, nil, "complete") + return data.IsDone() +} diff --git a/internal/use-case/main-use-case/material-order-item/case.go b/internal/use-case/main-use-case/material-order-item/case.go index 497c3b02..32d7875d 100644 --- a/internal/use-case/main-use-case/material-order-item/case.go +++ b/internal/use-case/main-use-case/material-order-item/case.go @@ -1,10 +1,13 @@ package materialorderitem import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/material-order-item" + umo "simrs-vx/internal/use-case/main-use-case/material-order" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -35,6 +38,11 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + // check if materialOrder is done + if umo.IsCompleted(*input.MaterialOrder_Id, &event, tx) { + return errors.New("materialOrder is already done") + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { 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 28f41704..bed63695 100644 --- a/internal/use-case/main-use-case/material-order/case.go +++ b/internal/use-case/main-use-case/material-order/case.go @@ -6,6 +6,8 @@ import ( e "simrs-vx/internal/domain/main-entities/material-order" + ue "simrs-vx/internal/use-case/main-use-case/encounter" + erc "simrs-vx/internal/domain/references/common" dg "github.com/karincake/apem/db-gorm-pg" @@ -38,6 +40,11 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + // check if encounter is done + if ue.IsDone(*input.Encounter_Id, &event, tx) { + return errors.New("encounter is already done") + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { diff --git a/internal/use-case/main-use-case/material-order/lib.go b/internal/use-case/main-use-case/material-order/lib.go index 27b91ce1..135aaf54 100644 --- a/internal/use-case/main-use-case/material-order/lib.go +++ b/internal/use-case/main-use-case/material-order/lib.go @@ -153,3 +153,27 @@ func DeleteData(data *e.MaterialOrder, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func IsCompleted(materialOrder_id uint, event *pl.Event, dbx ...*gorm.DB) bool { + pl.SetLogInfo(event, nil, "started", "DBIsCompleted") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + var data e.MaterialOrder + if err := tx.Where("\"Id\" = ?", materialOrder_id).First(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return false + } + + pl.SetLogInfo(event, nil, "complete") + return data.IsCompleted() +} diff --git a/internal/use-case/main-use-case/mcu-order-item/case.go b/internal/use-case/main-use-case/mcu-order-item/case.go index 899b8120..2b1cacd1 100644 --- a/internal/use-case/main-use-case/mcu-order-item/case.go +++ b/internal/use-case/main-use-case/mcu-order-item/case.go @@ -6,6 +6,10 @@ import ( e "simrs-vx/internal/domain/main-entities/mcu-order-item" + umo "simrs-vx/internal/use-case/main-use-case/mcu-order" + + erc "simrs-vx/internal/domain/references/common" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -36,6 +40,11 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + // check if mcuOrder is done + if umo.IsCompleted(*input.McuOrder_Id, &event, tx) { + return errors.New("mcuOrder is already done") + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -279,6 +288,63 @@ func Delete(input e.DeleteDto) (*d.Data, error) { } +func Complete(input e.ReadDetailDto) (*d.Data, error) { + var data *e.McuOrderItem + 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() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "mcuOrderItem is already completed", + Raw: errors.New("mcuOrderItem is already completed"), + } + return pl.SetLogError(&event, input) + } + + 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 +} + func SetSchedule(input e.SetScheduleDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id} var data *e.McuOrderItem diff --git a/internal/use-case/main-use-case/mcu-order-item/lib.go b/internal/use-case/main-use-case/mcu-order-item/lib.go index be5c0374..40ebf33d 100644 --- a/internal/use-case/main-use-case/mcu-order-item/lib.go +++ b/internal/use-case/main-use-case/mcu-order-item/lib.go @@ -153,3 +153,27 @@ func DeleteData(data *e.McuOrderItem, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func IsCompleted(mcuOrderItem_id uint, event *pl.Event, dbx ...*gorm.DB) bool { + pl.SetLogInfo(event, nil, "started", "DBIsCompleted") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + var data e.McuOrderItem + if err := tx.Where("\"Id\" = ?", mcuOrderItem_id).First(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return false + } + + pl.SetLogInfo(event, nil, "complete") + return data.IsCompleted() +} diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/case.go b/internal/use-case/main-use-case/mcu-order-sub-item/case.go index bf3e4ce9..88684bff 100644 --- a/internal/use-case/main-use-case/mcu-order-sub-item/case.go +++ b/internal/use-case/main-use-case/mcu-order-sub-item/case.go @@ -1,10 +1,15 @@ package mcuordersubitem import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" + umoi "simrs-vx/internal/use-case/main-use-case/mcu-order-item" + + erc "simrs-vx/internal/domain/references/common" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -35,6 +40,11 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + // check if mcuOrderItem is done + if umoi.IsCompleted(*input.McuOrderItem_Id, &event, tx) { + return errors.New("mcuOrderItem is already done") + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -277,3 +287,60 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Complete(input e.ReadDetailDto) (*d.Data, error) { + var data *e.McuOrderSubItem + 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() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "mcuOrderSubItem is already completed", + Raw: errors.New("mcuOrderSubItem is already completed"), + } + return pl.SetLogError(&event, input) + } + + 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/mcu-order/case.go b/internal/use-case/main-use-case/mcu-order/case.go index 57de98fb..158a4995 100644 --- a/internal/use-case/main-use-case/mcu-order/case.go +++ b/internal/use-case/main-use-case/mcu-order/case.go @@ -6,6 +6,8 @@ import ( e "simrs-vx/internal/domain/main-entities/mcu-order" + ue "simrs-vx/internal/use-case/main-use-case/encounter" + erc "simrs-vx/internal/domain/references/common" dg "github.com/karincake/apem/db-gorm-pg" @@ -38,6 +40,11 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + // check if encounter is done + if ue.IsDone(*input.Encounter_Id, &event, tx) { + return errors.New("encounter is already done") + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { diff --git a/internal/use-case/main-use-case/mcu-order/lib.go b/internal/use-case/main-use-case/mcu-order/lib.go index 1cfd7adc..048e6129 100644 --- a/internal/use-case/main-use-case/mcu-order/lib.go +++ b/internal/use-case/main-use-case/mcu-order/lib.go @@ -153,3 +153,27 @@ func DeleteData(data *e.McuOrder, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func IsCompleted(mcuOrder_id uint, event *pl.Event, dbx ...*gorm.DB) bool { + pl.SetLogInfo(event, nil, "started", "DBIsCompleted") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + var data e.McuOrder + if err := tx.Where("\"Id\" = ?", mcuOrder_id).First(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return false + } + + pl.SetLogInfo(event, nil, "complete") + return data.IsCompleted() +} diff --git a/internal/use-case/main-use-case/mcu-sub-src/helper.go b/internal/use-case/main-use-case/mcu-sub-src/helper.go index 071d5f38..95444d5a 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/helper.go +++ b/internal/use-case/main-use-case/mcu-sub-src/helper.go @@ -37,7 +37,7 @@ func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { itemCreate := ei.CreateDto{ Code: pu.AddPrefix("mcuSub-", input.Code), Name: input.Name, - ItemGroup_Code: ero.ITGCMCU, + ItemGroup_Code: ero.ITGCMCUSub, // Uom_Code: &input.Uom_Code, // Infra_Id: input.Infra_Id, } diff --git a/internal/use-case/main-use-case/prescription/case.go b/internal/use-case/main-use-case/prescription/case.go index 9b0baeb2..43c0a9e9 100644 --- a/internal/use-case/main-use-case/prescription/case.go +++ b/internal/use-case/main-use-case/prescription/case.go @@ -277,3 +277,62 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +// func Approve(input e.ReadDetailDto) (*d.Data, error) { +// var data *e.Prescription +// var err error + +// event := pl.Event{ +// Feature: "Approve", +// Source: source, +// } + +// // Start log +// pl.SetLogInfo(&event, input, "started", "approve") + +// err = dg.I.Transaction(func(tx *gorm.DB) error { +// data, err = ReadDetailData(input, &event, tx) +// if err != nil { +// return err +// } + +// if data.IsApproved() { +// event.Status = "failed" +// event.ErrInfo = pl.ErrorInfo{ +// Code: "data-state-mismatch", +// Detail: "prescription is already approved", +// Raw: errors.New("prescription is already approved"), +// } +// return pl.SetLogError(&event, input) +// } + +// data.Status_Code = erc.DSCApproved +// 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": "approved", +// }, +// Data: data.ToResponse(), +// }, nil + +// } diff --git a/pkg/use-case-helper/use-case-helper.go b/pkg/use-case-helper/use-case-helper.go index 9fd8351d..04a8eada 100644 --- a/pkg/use-case-helper/use-case-helper.go +++ b/pkg/use-case-helper/use-case-helper.go @@ -103,6 +103,13 @@ func HandleMiddlewareError(event *pl.Event, mwType, mwName string, logData inter return pl.SetLogError(event, logData) } +func IsDataNotFoundError(err error) bool { + if err == nil { + return false + } + return strings.Contains(err.Error(), "code: data-notFound") +} + func AddPrefix(prefix string, str string) string { return prefix + str } From 5810c2cb2b6a7d806291171b75eace8f376d11ee Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 22 Sep 2025 13:03:31 +0700 Subject: [PATCH 046/190] change datatype prescription's status code --- cmd/main-migration/migrations/atlas.sum | 4 ++-- .../domain/main-entities/prescription/entity.go | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 6d4d0688..59829316 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:5jNo0I155phYhWoHR1fzLdCLVByy/lPwGz5IS1aslTc= +h1:ZD6tpr1oc81DWrZLIE3ZVmvnBpU7r6Nlet5N489jJVk= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -14,4 +14,4 @@ h1:5jNo0I155phYhWoHR1fzLdCLVByy/lPwGz5IS1aslTc= 20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= 20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= 20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:Nl0Z6QghF2/iUk5AtslyA4Jo7YzQSfrGoH2gZuXVXK8= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= diff --git a/internal/domain/main-entities/prescription/entity.go b/internal/domain/main-entities/prescription/entity.go index da0554a9..20386bf4 100644 --- a/internal/domain/main-entities/prescription/entity.go +++ b/internal/domain/main-entities/prescription/entity.go @@ -11,11 +11,11 @@ import ( ) type Prescription struct { - ecore.Main // adjust this according to the needs - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` - IssuedAt *time.Time `json:"issuedAt"` - Status_Code *erc.DataStatusCode `json:"status_code"` + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` + IssuedAt *time.Time `json:"issuedAt"` + Status_Code erc.DataStatusCode `json:"status_code"` } From 202bb32e9c8ed2bd84966a9942cb59ed64e11d11 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 22 Sep 2025 13:21:29 +0700 Subject: [PATCH 047/190] feat (prescription): add approve + create medication --- .../domain/main-entities/prescription/dto.go | 20 ++-- .../main-entities/prescription/entity.go | 4 + .../interface/main-handler/main-handler.go | 9 +- .../main-handler/prescription/handler.go | 12 ++ .../main-use-case/prescription/case.go | 103 +++++++++-------- .../main-use-case/prescription/helper.go | 107 ++++++++++++++++++ 6 files changed, 196 insertions(+), 59 deletions(-) diff --git a/internal/domain/main-entities/prescription/dto.go b/internal/domain/main-entities/prescription/dto.go index e693a1c2..107509e1 100644 --- a/internal/domain/main-entities/prescription/dto.go +++ b/internal/domain/main-entities/prescription/dto.go @@ -11,10 +11,10 @@ import ( ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Doctor_Id *uint `json:"doctor_id"` - IssuedAt *time.Time `json:"issuedAt"` - Status_Code *erc.DataStatusCode `json:"status_code"` + 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 { @@ -55,12 +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"` - Status_Code *erc.DataStatusCode `json:"status_code"` + 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 { diff --git a/internal/domain/main-entities/prescription/entity.go b/internal/domain/main-entities/prescription/entity.go index 20386bf4..bdc2d2fb 100644 --- a/internal/domain/main-entities/prescription/entity.go +++ b/internal/domain/main-entities/prescription/entity.go @@ -19,3 +19,7 @@ type Prescription struct { IssuedAt *time.Time `json:"issuedAt"` Status_Code erc.DataStatusCode `json:"status_code"` } + +func (d Prescription) IsApproved() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 121a2c8d..930e30f1 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -116,7 +116,6 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/soapi", auth.GuardMW, soapi.O) hc.RegCrud(r, "/v1/adime", auth.GuardMW, adime.O) hc.RegCrud(r, "/v1/sbar", auth.GuardMW, sbar.O) - hc.RegCrud(r, "/v1/prescription", prescription.O) hc.RegCrud(r, "/v1/prescription-item", prescriptionitem.O) hc.RegCrud(r, "/v1/device-order-item", deviceorderitem.O) hc.RegCrud(r, "/v1/material-order-item", materialorderitem.O) @@ -138,6 +137,14 @@ func SetRoutes() http.Handler { "PATCH /{id}/complete": mcuorderitem.O.Complete, "PATCH /{id}/set-schedule": mcuorderitem.O.SetSchedule, }) + hk.GroupRoutes("/v1/prescription", r, hk.MapHandlerFunc{ + "GET /": prescription.O.GetList, + "GET /{id}": prescription.O.GetDetail, + "POST /": prescription.O.Create, + "PATCH /{id}": prescription.O.Update, + "DELETE /{id}": prescription.O.Delete, + "PATCH /{id}/approve": prescription.O.Approve, + }) hk.GroupRoutes("/v1/mcu-order-sub-item", r, hk.MapHandlerFunc{ "GET /": mcuordersubitem.O.GetList, "GET /{id}": mcuordersubitem.O.GetDetail, diff --git a/internal/interface/main-handler/prescription/handler.go b/internal/interface/main-handler/prescription/handler.go index 1ac30d97..fe73e3fe 100644 --- a/internal/interface/main-handler/prescription/handler.go +++ b/internal/interface/main-handler/prescription/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) Approve(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.ReadDetailDto{} + dto.Id = uint(id) + res, err := u.Approve(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/prescription/case.go b/internal/use-case/main-use-case/prescription/case.go index 43c0a9e9..ce9bc9ba 100644 --- a/internal/use-case/main-use-case/prescription/case.go +++ b/internal/use-case/main-use-case/prescription/case.go @@ -1,10 +1,13 @@ package prescription import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/prescription" + erc "simrs-vx/internal/domain/references/common" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -278,61 +281,65 @@ func Delete(input e.DeleteDto) (*d.Data, error) { } -// func Approve(input e.ReadDetailDto) (*d.Data, error) { -// var data *e.Prescription -// var err error +func Approve(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Prescription + var err error -// event := pl.Event{ -// Feature: "Approve", -// Source: source, -// } + event := pl.Event{ + Feature: "Approve", + Source: source, + } -// // Start log -// pl.SetLogInfo(&event, input, "started", "approve") + // Start log + pl.SetLogInfo(&event, input, "started", "approve") -// err = dg.I.Transaction(func(tx *gorm.DB) error { -// data, err = ReadDetailData(input, &event, tx) -// if err != nil { -// return err -// } + err = dg.I.Transaction(func(tx *gorm.DB) error { + data, err = ReadDetailData(input, &event, tx) + if err != nil { + return err + } -// if data.IsApproved() { -// event.Status = "failed" -// event.ErrInfo = pl.ErrorInfo{ -// Code: "data-state-mismatch", -// Detail: "prescription is already approved", -// Raw: errors.New("prescription is already approved"), -// } -// return pl.SetLogError(&event, input) -// } + if data.IsApproved() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "prescription is already approved", + Raw: errors.New("prescription is already approved"), + } + return pl.SetLogError(&event, input) + } -// data.Status_Code = erc.DSCApproved -// 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) -// } + 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") + if err := createMedication(input.Id, &event, tx); err != nil { + return err + } -// return nil -// }) + pl.SetLogInfo(&event, nil, "complete") -// if err != nil { -// return nil, err -// } + return nil + }) -// return &d.Data{ -// Meta: d.IS{ -// "source": source, -// "structure": "single-data", -// "status": "approved", -// }, -// Data: data.ToResponse(), -// }, nil + if err != nil { + return nil, err + } -// } + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "approved", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/prescription/helper.go b/internal/use-case/main-use-case/prescription/helper.go index 13f8f2e6..7c61469b 100644 --- a/internal/use-case/main-use-case/prescription/helper.go +++ b/internal/use-case/main-use-case/prescription/helper.go @@ -5,7 +5,23 @@ Any functions that are used internally by the use-case package prescription import ( + em "simrs-vx/internal/domain/main-entities/medication" + emei "simrs-vx/internal/domain/main-entities/medication-item" + emi "simrs-vx/internal/domain/main-entities/medicine-mix" + emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" e "simrs-vx/internal/domain/main-entities/prescription" + epi "simrs-vx/internal/domain/main-entities/prescription-item" + + um "simrs-vx/internal/use-case/main-use-case/medication" + umei "simrs-vx/internal/use-case/main-use-case/medication-item" + umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" + ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item" + upi "simrs-vx/internal/use-case/main-use-case/prescription-item" + + 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.Prescription) { @@ -22,3 +38,94 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Prescription) { data.IssuedAt = inputSrc.IssuedAt data.Status_Code = inputSrc.Status_Code } + +func createMedication(prescription_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "createMedication") + + prescription, err := ReadDetailData(e.ReadDetailDto{Id: prescription_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: prescription.Encounter_Id, + IssuedAt: pu.GetTimeNow(), + } + medication, err := um.CreateData(medicationCreate, event, tx) + if err != nil { + return err + } + + for _, prescriptionItem := range prescriptionItem { + if prescriptionItem.IsMix { + medMix_id, err := createMedicineMixAndItem(*prescriptionItem.MedicineMix, event, tx) + if err != nil { + return err + } + prescriptionItem.MedicineMix_Id = medMix_id + } + err := createMedicationItem(medication.Id, prescriptionItem, event, tx) + if err != nil { + return err + } + } + return nil +} + +func createMedicineMixAndItem(input emi.MedicineMix, event *pl.Event, tx *gorm.DB) (*uint, error) { + pl.SetLogInfo(event, nil, "started", "createMedicineMix") + + medicineMixCreate := emi.CreateDto{ + Name: input.Name, + } + medicineMix, err := umi.CreateData(medicineMixCreate, event, tx) + if err != nil { + return nil, err + } + + // recreate medicineMixItem with new medicineMix_id to keep medMixItem remain the same for prescriptionItem that is created + for _, medicineMixItem := range input.MixItems { + medicineMixItemCreate := emmi.CreateDto{ + MedicineMix_Id: &medicineMix.Id, + Medicine_Id: medicineMixItem.Medicine_Id, + Dose: medicineMixItem.Dose, + } + _, err := ummi.CreateData(medicineMixItemCreate, event, tx) + if err != nil { + return nil, err + } + + } + return &medicineMix.Id, nil +} + +func createMedicationItem(medication_id uint, input epi.PrescriptionItem, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "createMedicationItem") + + medicationItemCreate := emei.CreateDto{ + Medication_Id: &medication_id, + IsMix: input.IsMix, + Medicine_Id: input.Medicine_Id, + MedicineMix_Id: input.MedicineMix_Id, + Usage: input.Usage, + Interval: input.Interval, + IntervalUnit_Code: input.IntervalUnit_Code, + Quantity: input.Quantity, + } + + _, err := umei.CreateData(medicationItemCreate, event, tx) + if err != nil { + return err + } + + return nil +} From d851989df2d972d06a01557e775665b45bd029f7 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 23 Sep 2025 09:51:55 +0700 Subject: [PATCH 048/190] add consultation --- .../migrations/20250923025134.sql | 17 ++++ cmd/main-migration/migrations/atlas.sum | 3 +- .../domain/main-entities/consultation/dto.go | 87 +++++++++++++++++++ .../main-entities/consultation/entity.go | 23 +++++ internal/interface/migration/main-entities.go | 2 + 5 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 cmd/main-migration/migrations/20250923025134.sql create mode 100644 internal/domain/main-entities/consultation/dto.go create mode 100644 internal/domain/main-entities/consultation/entity.go diff --git a/cmd/main-migration/migrations/20250923025134.sql b/cmd/main-migration/migrations/20250923025134.sql new file mode 100644 index 00000000..57a04744 --- /dev/null +++ b/cmd/main-migration/migrations/20250923025134.sql @@ -0,0 +1,17 @@ +-- Create "Consultation" table +CREATE TABLE "public"."Consultation" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Case" character varying(2048) NULL, + "Solution" character varying(2048) NULL, + "Unit_Id" bigint NULL, + "Doctor_Id" bigint NULL, + "RepliedAt" timestamptz NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Consultation_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Consultation_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Consultation_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 59829316..e61e9880 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:ZD6tpr1oc81DWrZLIE3ZVmvnBpU7r6Nlet5N489jJVk= +h1:0Hvo3AS2yMsS60eDIKnU5B2qvjDhNWHSDHcMxKKYJTk= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -15,3 +15,4 @@ h1:ZD6tpr1oc81DWrZLIE3ZVmvnBpU7r6Nlet5N489jJVk= 20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= 20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= 20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:q1bndJguAqjnTjXr6Jpnsrj4d8zMseR2tf02h0h6ArE= diff --git a/internal/domain/main-entities/consultation/dto.go b/internal/domain/main-entities/consultation/dto.go new file mode 100644 index 00000000..7cac88dd --- /dev/null +++ b/internal/domain/main-entities/consultation/dto.go @@ -0,0 +1,87 @@ +package consultation + +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" + eu "simrs-vx/internal/domain/main-entities/unit" + "time" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Case *string `json:"case" validate:"maxLength=2048"` + Unit_Id *uint `json:"unit_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter_id"` + Unit_Id *uint `json:"unit_id"` + Doctor_Id *uint `json:"doctor_id"` + + Page int `json:"page"` + PageSize int `json:"page_size"` + NoPagination int `json:"no_pagination"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Case *string `json:"case"` + Solution *string `json:"solution"` + Unit_Id *uint `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty"` + RepliedAt *time.Time `json:"repliedAt"` +} + +func (d Consultation) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Case: d.Case, + Solution: d.Solution, + Unit_Id: d.Unit_Id, + Unit: d.Unit, + Doctor_Id: d.Doctor_Id, + Doctor: d.Doctor, + RepliedAt: d.RepliedAt, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Consultation) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/consultation/entity.go b/internal/domain/main-entities/consultation/entity.go new file mode 100644 index 00000000..68ad37f2 --- /dev/null +++ b/internal/domain/main-entities/consultation/entity.go @@ -0,0 +1,23 @@ +package consultation + +import ( + "time" + + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + eu "simrs-vx/internal/domain/main-entities/unit" +) + +type Consultation struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter" gorm:"foreignKey:Encounter_Id;references:Id"` + Case *string `json:"case" gorm:"size:2048"` + Solution *string `json:"solution" gorm:"size:2048"` + Unit_Id *uint `json:"unit_id"` + Unit *eu.Unit `json:"unit" gorm:"foreignKey:Unit_Id;references:Id"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor" gorm:"foreignKey:Doctor_Id;references:Id"` + RepliedAt *time.Time `json:"repliedAt"` +} diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 6bfde570..6e582af2 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -4,6 +4,7 @@ import ( adime "simrs-vx/internal/domain/main-entities/adime" ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" appointment "simrs-vx/internal/domain/main-entities/appointment" + consultation "simrs-vx/internal/domain/main-entities/consultation" counter "simrs-vx/internal/domain/main-entities/counter" device "simrs-vx/internal/domain/main-entities/device" deviceorder "simrs-vx/internal/domain/main-entities/device-order" @@ -143,5 +144,6 @@ func getMainEntities() []any { &mcuorderitem.McuOrderItem{}, &mcusubsrc.McuSubSrc{}, &mcuordersubitem.McuOrderSubItem{}, + &consultation.Consultation{}, } } From ef5f50957dbd602773f43ac9c1cd7aa5fd417bd0 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 23 Sep 2025 10:20:06 +0700 Subject: [PATCH 049/190] feat (consultation): done --- .../domain/main-entities/consultation/dto.go | 12 +- .../main-handler/consultation/handler.go | 97 +++++ .../interface/main-handler/main-handler.go | 10 + .../main-use-case/consultation/case.go | 356 ++++++++++++++++++ .../main-use-case/consultation/helper.go | 23 ++ .../main-use-case/consultation/lib.go | 155 ++++++++ .../consultation/middleware-runner.go | 103 +++++ .../main-use-case/consultation/middleware.go | 9 + .../main-use-case/consultation/tycovar.go | 44 +++ internal/use-case/main-use-case/doctor/lib.go | 31 ++ 10 files changed, 839 insertions(+), 1 deletion(-) create mode 100644 internal/interface/main-handler/consultation/handler.go create mode 100644 internal/use-case/main-use-case/consultation/case.go create mode 100644 internal/use-case/main-use-case/consultation/helper.go create mode 100644 internal/use-case/main-use-case/consultation/lib.go create mode 100644 internal/use-case/main-use-case/consultation/middleware-runner.go create mode 100644 internal/use-case/main-use-case/consultation/middleware.go create mode 100644 internal/use-case/main-use-case/consultation/tycovar.go diff --git a/internal/domain/main-entities/consultation/dto.go b/internal/domain/main-entities/consultation/dto.go index 7cac88dd..1969ce4f 100644 --- a/internal/domain/main-entities/consultation/dto.go +++ b/internal/domain/main-entities/consultation/dto.go @@ -1,11 +1,14 @@ package consultation import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/encounter" eu "simrs-vx/internal/domain/main-entities/unit" - "time" + + pa "simrs-vx/pkg/auth-helper" ) type CreateDto struct { @@ -43,6 +46,13 @@ type DeleteDto struct { Id uint `json:"id"` } +type ReplyDto struct { + Id uint `json:"id"` + Solution *string `json:"solution"` + + pa.AuthInfo +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` diff --git a/internal/interface/main-handler/consultation/handler.go b/internal/interface/main-handler/consultation/handler.go new file mode 100644 index 00000000..2be1cbdd --- /dev/null +++ b/internal/interface/main-handler/consultation/handler.go @@ -0,0 +1,97 @@ +package device + +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/consultation" + u "simrs-vx/internal/use-case/main-use-case/consultation" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" +) + +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) +} + +func (obj myBase) Reply(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.ReplyDto{} + + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.AuthInfo = *authInfo + dto.Id = uint(id) + res, err := u.Reply(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 930e30f1..94b00837 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -6,6 +6,7 @@ import ( /******************** main / transaction ********************/ adime "simrs-vx/internal/interface/main-handler/adime" auth "simrs-vx/internal/interface/main-handler/authentication" + consultation "simrs-vx/internal/interface/main-handler/consultation" counter "simrs-vx/internal/interface/main-handler/counter" deviceorder "simrs-vx/internal/interface/main-handler/device-order" deviceorderitem "simrs-vx/internal/interface/main-handler/device-order-item" @@ -206,6 +207,15 @@ func SetRoutes() http.Handler { "PATCH /{id}/complete": materialorder.O.Complete, }) + hk.GroupRoutes("/v1/consultation", r, auth.GuardMW, hk.MapHandlerFunc{ + "GET /": consultation.O.GetList, + "GET /{id}": consultation.O.GetDetail, + "POST /": consultation.O.Create, + "PATCH /{id}": consultation.O.Update, + "DELETE /{id}": consultation.O.Delete, + "PATCH /{id}/reply": consultation.O.Reply, + }) + /******************** actor ********************/ hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) diff --git a/internal/use-case/main-use-case/consultation/case.go b/internal/use-case/main-use-case/consultation/case.go new file mode 100644 index 00000000..40099e9c --- /dev/null +++ b/internal/use-case/main-use-case/consultation/case.go @@ -0,0 +1,356 @@ +package consultation + +import ( + "errors" + "strconv" + + e "simrs-vx/internal/domain/main-entities/consultation" + ue "simrs-vx/internal/use-case/main-use-case/encounter" + + ud "simrs-vx/internal/use-case/main-use-case/doctor" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "consultation" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Consultation{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + // check if encounter is done + if ue.IsDone(*input.Encounter_Id, &event, tx) { + return errors.New("encounter is already done") + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Consultation + var dataList []e.Consultation + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Consultation + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Consultation + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Consultation + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} + +func Reply(input e.ReplyDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Consultation + var err error + + event := pl.Event{ + Feature: "Reply", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "reply") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if !input.AuthInfo.IsDoctor() { + 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) + } + + doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + + data.Doctor_Id = doctor_id + data.Solution = input.Solution + data.RepliedAt = pu.GetTimeNow() + err = tx.Save(&data).Error + if 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/consultation/helper.go b/internal/use-case/main-use-case/consultation/helper.go new file mode 100644 index 00000000..7df4a9f9 --- /dev/null +++ b/internal/use-case/main-use-case/consultation/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package consultation + +import ( + e "simrs-vx/internal/domain/main-entities/consultation" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Consultation) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Case = inputSrc.Case + data.Unit_Id = inputSrc.Unit_Id +} diff --git a/internal/use-case/main-use-case/consultation/lib.go b/internal/use-case/main-use-case/consultation/lib.go new file mode 100644 index 00000000..08d034d3 --- /dev/null +++ b/internal/use-case/main-use-case/consultation/lib.go @@ -0,0 +1,155 @@ +package consultation + +import ( + e "simrs-vx/internal/domain/main-entities/consultation" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Consultation, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Consultation{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return nil, pl.SetLogError(event, input) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Consultation, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Consultation{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Consultation{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Consultation, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Consultation{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Consultation, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Consultation, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/consultation/middleware-runner.go b/internal/use-case/main-use-case/consultation/middleware-runner.go new file mode 100644 index 00000000..30b354c5 --- /dev/null +++ b/internal/use-case/main-use-case/consultation/middleware-runner.go @@ -0,0 +1,103 @@ +package consultation + +import ( + e "simrs-vx/internal/domain/main-entities/consultation" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Consultation) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Consultation) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Consultation) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Consultation) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Consultation) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/consultation/middleware.go b/internal/use-case/main-use-case/consultation/middleware.go new file mode 100644 index 00000000..cabd7683 --- /dev/null +++ b/internal/use-case/main-use-case/consultation/middleware.go @@ -0,0 +1,9 @@ +package consultation + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/consultation/tycovar.go b/internal/use-case/main-use-case/consultation/tycovar.go new file mode 100644 index 00000000..fdf26fc4 --- /dev/null +++ b/internal/use-case/main-use-case/consultation/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package consultation + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/consultation" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Consultation, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Consultation, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Consultation, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/doctor/lib.go b/internal/use-case/main-use-case/doctor/lib.go index e642336d..432254fe 100644 --- a/internal/use-case/main-use-case/doctor/lib.go +++ b/internal/use-case/main-use-case/doctor/lib.go @@ -159,3 +159,34 @@ func DeleteData(data *e.Doctor, 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 doctor_id uint + + err := tx.Model(&e.Doctor{}). + Select("\"Doctor\".\"Id\" as doctor_id"). + Joins("JOIN \"Employee\" as e ON e.\"Id\" = \"Doctor\".\"Employee_Id\""). + Where("e.\"User_Id\" = ?", user_id). + Scan(&doctor_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 &doctor_id, nil +} From a50f62f5eca3aaacd2ecbdf9fa9bff0389ee61ad Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 24 Sep 2025 07:51:15 +0700 Subject: [PATCH 050/190] feat (minio): done, upload wip --- go.mod | 12 ++ go.sum | 23 +++ .../domain/references/encounter/encounter.go | 7 + internal/infra/minio/minio.go | 104 ++++++++++++ .../interface/main-handler/main-handler.go | 4 + .../interface/main-handler/upload/handler.go | 56 +++++++ pkg/minio-helper/minio-helper.go | 149 ++++++++++++++++++ pkg/upload-helper/tycovar.go | 16 ++ pkg/upload-helper/upload-helper.go | 75 +++++++++ 9 files changed, 446 insertions(+) create mode 100644 internal/infra/minio/minio.go create mode 100644 internal/interface/main-handler/upload/handler.go create mode 100644 pkg/minio-helper/minio-helper.go create mode 100644 pkg/upload-helper/tycovar.go create mode 100644 pkg/upload-helper/upload-helper.go diff --git a/go.mod b/go.mod index e717f960..d05acad5 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/karincake/risoles v0.0.3 github.com/karincake/semprit v0.0.3 github.com/karincake/serabi v0.0.14 + github.com/minio/minio-go/v7 v7.0.95 github.com/rs/zerolog v1.33.0 golang.org/x/crypto v0.41.0 gorm.io/gorm v1.25.12 @@ -23,8 +24,11 @@ require ( require ( ariga.io/atlas v0.36.2-0.20250806044935-5bb51a0a956e // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/go-ini/ini v1.67.0 // indirect github.com/go-redis/redis v6.15.9+incompatible // indirect github.com/go-sql-driver/mysql v1.7.0 // indirect + github.com/goccy/go-json v0.10.5 // indirect github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect github.com/golang-sql/sqlexp v0.1.0 // indirect github.com/google/go-cmp v0.7.0 // indirect @@ -34,12 +38,20 @@ require ( github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-sqlite3 v1.14.28 // indirect github.com/microsoft/go-mssqldb v1.7.2 // indirect + github.com/minio/crc64nvme v1.0.2 // indirect + github.com/minio/md5-simd v1.1.2 // indirect github.com/nxadm/tail v1.4.11 // indirect + github.com/philhofer/fwd v1.2.0 // indirect + github.com/rs/xid v1.6.0 // indirect + github.com/tinylib/msgp v1.3.0 // indirect golang.org/x/exp v0.0.0-20240613232115-7f521ea00fb8 // indirect + golang.org/x/net v0.42.0 // indirect golang.org/x/sync v0.16.0 // indirect golang.org/x/sys v0.35.0 // indirect golang.org/x/text v0.28.0 // indirect diff --git a/go.sum b/go.sum index 3045e095..8f09ca78 100644 --- a/go.sum +++ b/go.sum @@ -25,12 +25,18 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= +github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= +github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= @@ -85,6 +91,11 @@ github.com/karincake/semprit v0.0.3 h1:znleGRu73xrHk6a70+jRQgVh9VF3TAhttQz6vfgNd github.com/karincake/semprit v0.0.3/go.mod h1:nLtNmWlHkxMKG0IMzqnnfkn1L/RVYGXVW3LchfYQMu8= github.com/karincake/serabi v0.0.14 h1:yK3nBLRXdoUNSUDIfbZqIQxnZ6U6Ij5QEO8d5QzZzsw= github.com/karincake/serabi v0.0.14/go.mod h1:GcnPBWb+UotDxvb/a2CKwourCEyVIL4P9+YxVmZ5zgk= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.11 h1:0OwqZRYI2rFrjS4kvkDnqJkKHdHaRnCm68/DY4OxRzU= +github.com/klauspost/cpuid/v2 v2.2.11/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -100,6 +111,12 @@ github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEu github.com/mattn/go-sqlite3 v1.14.28/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/microsoft/go-mssqldb v1.7.2 h1:CHkFJiObW7ItKTJfHo1QX7QBBD1iV+mn1eOyRP3b/PA= github.com/microsoft/go-mssqldb v1.7.2/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA= +github.com/minio/crc64nvme v1.0.2 h1:6uO1UxGAD+kwqWWp7mBFsi5gAse66C4NXO8cmcVculg= +github.com/minio/crc64nvme v1.0.2/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= +github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= +github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= +github.com/minio/minio-go/v7 v7.0.95 h1:ywOUPg+PebTMTzn9VDsoFJy32ZuARN9zhB+K3IYEvYU= +github.com/minio/minio-go/v7 v7.0.95/go.mod h1:wOOX3uxS334vImCNRVyIDdXX9OsXDm89ToynKgqUKlo= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY= @@ -108,6 +125,8 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= +github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= +github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= @@ -117,6 +136,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8= github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -131,6 +152,8 @@ github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww= +github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 68585f9e..8ed4dd81 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -11,6 +11,7 @@ type ( CheckupScopeCode string AmbulatoryClassCode string InpatientClassCode string + UploadCode string ) const ( @@ -64,6 +65,12 @@ const ( ICCICU InpatientClassCode = "icu" // ICU ICCHCU InpatientClassCode = "hcu" // HCU ICCVK InpatientClassCode = "vk" // Verlos kamer + + UCPRN UploadCode = "person-resident-number" // Person Resident Number + UCPDL UploadCode = "person-driver-license" // Person Driver License + UCPP UploadCode = "person-passport" // Person Passport + UCPFC UploadCode = "person-family-card" // Person Family Card + UCMIR UploadCode = "mcu-item-result" // Mcu Item Result ) func (ec EncounterClassCode) Code() string { diff --git a/internal/infra/minio/minio.go b/internal/infra/minio/minio.go new file mode 100644 index 00000000..36e9c546 --- /dev/null +++ b/internal/infra/minio/minio.go @@ -0,0 +1,104 @@ +package minio + +import ( + "errors" + "io" + "net/url" + "time" + + a "github.com/karincake/apem" + lo "github.com/karincake/apem/loggero" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" +) + +var O MinioCfg = MinioCfg{} +var I *minio.Client + +type MinioCfg struct { + Endpoint string + Region string + AccessKey string `yaml:"accessKey"` + SecretKey string `yaml:"secretKey"` + UseSsl bool `yaml:"useSsl"` + BucketName []string `yaml:"bucketName"` +} + +type UploadReaderInput struct { + File io.Reader + Name string + Size int64 + ContentType string + BucketName string +} + +type UploadPathInput struct { + BucketName string + ContentType string + Name string + Path string +} + +type PresignedGetInput struct { + Bucket string + Object string + Expiry time.Duration + ReqParams url.Values +} + +type ResponsePostPolicy struct { + Url string `json:"url"` + FormData map[string]string `json:"form-data"` +} + +func (c MinioCfg) GetRegion() string { + return c.Region +} + +func (c MinioCfg) GetEndpoint() string { + return c.Endpoint +} + +func (c MinioCfg) GetUseSsl() bool { + return c.UseSsl +} + +func (c MinioCfg) GetBucketName() []string { + return c.BucketName +} + +// connect db +func Connect() { + a.ParseSingleCfg(&O) + NewClient(&O) + if I == nil { + panic("minio client is nil") + } + lo.I.Println("Instantiation for object storage service using Minio, status: DONE!!") +} + +func NewClient(cfg *MinioCfg) error { + // Initialize minio client object. + endpoint := cfg.Endpoint + if endpoint == "" { + return errors.New("config minio endpoint empty") + } + accessKey := cfg.AccessKey + if accessKey == "" { + return errors.New("config minio access key empty") + } + secretKey := cfg.SecretKey + if secretKey == "" { + return errors.New("config minio secret key empty") + } + useSSL := cfg.UseSsl + minioClient, err := minio.New(endpoint, &minio.Options{ + Creds: credentials.NewStaticV4(accessKey, secretKey, ""), + Secure: useSSL, + }) + if err != nil { + return err + } + I = minioClient + return nil +} diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index cc14eaf1..fa2334bc 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -43,6 +43,7 @@ import ( /******************** infra ********************/ gs "simrs-vx/internal/infra/gorm-setting" + minio "simrs-vx/internal/infra/minio" ssdb "simrs-vx/internal/infra/ss-db" /******************** pkg ********************/ @@ -50,6 +51,7 @@ import ( hc "simrs-vx/pkg/handler-crud-helper" lh "simrs-vx/pkg/lang-helper" handlerlogger "simrs-vx/pkg/middleware/handler-logger" + mh "simrs-vx/pkg/minio-helper" zlc "simrs-vx/pkg/zerolog-ctx" /******************** sources ********************/ @@ -97,6 +99,8 @@ func SetRoutes() http.Handler { a.RegisterExtCall(zlc.Adjust) a.RegisterExtCall(ssdb.SetInstance) a.RegisterExtCall(lh.Populate) + a.RegisterExtCall(minio.Connect) + a.RegisterExtCall(mh.I.SetClient) a.RegisterExtCall(validation.RegisterValidation) r := http.NewServeMux() diff --git a/internal/interface/main-handler/upload/handler.go b/internal/interface/main-handler/upload/handler.go new file mode 100644 index 00000000..0cff949e --- /dev/null +++ b/internal/interface/main-handler/upload/handler.go @@ -0,0 +1,56 @@ +package upload + +// "net/http" + +// uh "simrs-vx/pkg/upload-helper" + +// uploadHandler handles single file upload requests +// func uploadHandler(w http.ResponseWriter, r *http.Request) { + +// if r.Method == "OPTIONS" { +// w.WriteHeader(http.StatusNoContent) +// return +// } + +// if r.Method != "POST" { +// writeJSONResponse(w, http.StatusMethodNotAllowed, uh.UploadResponse{ +// Success: false, +// Message: "Method not allowed. Use POST.", +// }) +// return +// } + +// // Parse multipart form (32MB max memory) +// err := r.ParseMultipartForm(32 << 20) +// if err != nil { +// writeJSONResponse(w, http.StatusBadRequest, uh.UploadResponse{ +// Success: false, +// Message: "Failed to parse multipart form", +// }) +// return +// } + +// // Get file from form +// file, header, err := r.FormFile("file") +// if err != nil { +// writeJSONResponse(w, http.StatusBadRequest, uh.UploadResponse{ +// Success: false, +// Message: "No file uploaded or invalid file field name. Use 'file' as field name.", +// }) +// return +// } +// defer file.Close() + +// // Upload file +// response, err := service.UploadFile(file, header.Filename, header.Size) +// if err != nil { +// writeJSONResponse(w, http.StatusInternalServerError, *response) +// return +// } + +// if response.Success { +// writeJSONResponse(w, http.StatusOK, *response) +// } else { +// writeJSONResponse(w, http.StatusBadRequest, *response) +// } +// } diff --git a/pkg/minio-helper/minio-helper.go b/pkg/minio-helper/minio-helper.go new file mode 100644 index 00000000..637ca1b6 --- /dev/null +++ b/pkg/minio-helper/minio-helper.go @@ -0,0 +1,149 @@ +package miniohelper + +import ( + "context" + "errors" + "fmt" + "net/url" + + m "simrs-vx/internal/infra/minio" + + "github.com/minio/minio-go/v7" +) + +type minioRepository struct { + client *minio.Client +} + +var I minioRepository = minioRepository{} + +func (repo *minioRepository) SetClient() { + repo.client = m.I +} + +// Check exist bucket if not exist create Bucket +func (repo *minioRepository) createBucket(bucketName string, region string) error { + exist, err := repo.client.BucketExists(context.Background(), bucketName) + if err != nil { + return err + } + if exist { + return nil + } + if err := repo.client.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: region, ObjectLocking: true}); err != nil { + return err + } + return nil +} + +// Upload file reader to MinIO +func (repo *minioRepository) PutObject(input m.UploadReaderInput) (*minio.UploadInfo, error) { + if err := repo.createBucket(input.BucketName, m.O.GetRegion()); err != nil { + return nil, err + } + options := minio.PutObjectOptions{ + ContentType: input.ContentType, + UserMetadata: map[string]string{"x-amz-acl": "public-read"}, + } + + uploadInfo, err := repo.client.PutObject(context.Background(), input.BucketName, input.Name, input.File, input.Size, options) + if err != nil { + return nil, err + } + + return &uploadInfo, err +} + +// Upload file path to MinIO +func (repo *minioRepository) FPutObject(input m.UploadPathInput) (*minio.UploadInfo, error) { + if err := repo.createBucket(input.BucketName, m.O.GetRegion()); err != nil { + return nil, err + } + options := minio.PutObjectOptions{ + ContentType: input.ContentType, + UserMetadata: map[string]string{"x-amz-acl": "public-read"}, + } + + uploadInfo, err := repo.client.FPutObject(context.Background(), input.BucketName, input.Name, input.Path, options) + if err != nil { + return nil, err + } + + return &uploadInfo, err +} + +// Move file from old to new MinIO path +func (repo *minioRepository) MoveObject(src minio.CopySrcOptions, dst minio.CopyDestOptions) (*minio.UploadInfo, error) { + uploadInfo, err := repo.client.CopyObject(context.Background(), dst, src) + if err != nil { + return nil, err + } + if err := repo.RemoveObject(src.Bucket, src.Object); err != nil { + return nil, err + } + return &uploadInfo, err +} + +// Generatet public link MinIO +func (repo *minioRepository) GenerateUrl(bucket, object string) string { + mode := "http" + if m.O.GetUseSsl() { + mode = "https" + } + return fmt.Sprintf("%s://%s/%s/%s", mode, m.O.GetEndpoint(), bucket, object) +} + +// Download file from MinIO +func (repo *minioRepository) GetObject(bucket string, fileName string) (*minio.Object, error) { + object, err := repo.client.GetObject(context.Background(), bucket, fileName, minio.GetObjectOptions{}) + if err != nil { + return nil, err + } + return object, nil +} + +// Delete file from MinIO +func (repo *minioRepository) RemoveObject(bucket string, fileName string) error { + if err := repo.client.RemoveObject(context.Background(), bucket, fileName, minio.RemoveObjectOptions{}); err != nil { + return err + } + return nil +} + +// create presigned url to post object with custom policy +func (repo *minioRepository) GeneratePresignedPost(policy *minio.PostPolicy) (*url.URL, map[string]string, error) { + presignedUrl, formData, err := repo.client.PresignedPostPolicy(context.Background(), policy) + if err != nil { + return nil, nil, err + } + return presignedUrl, formData, nil +} + +// create presigned url to get object +func (repo *minioRepository) GeneratePresignedGetObject(input m.PresignedGetInput) (*url.URL, error) { + presignedUrl, err := repo.client.PresignedGetObject(context.Background(), input.Bucket, input.Object, input.Expiry, input.ReqParams) + if err != nil { + return nil, err + } + return presignedUrl, nil +} + +func getBucketName(idx int) string { + return m.O.GetBucketName()[idx] +} + +func GetBucketPatient() (string, error) { + bucketName := getBucketName(0) + if bucketName == "" { + return "", errors.New("bucket name unknown") + } + return bucketName, nil +} + +func GetEndpointUrl(bucket string) string { + mode := "http" + if m.O.GetUseSsl() { + mode = "https" + } + return fmt.Sprintf("%s://%s/%s", mode, m.O.GetEndpoint(), bucket) +} diff --git a/pkg/upload-helper/tycovar.go b/pkg/upload-helper/tycovar.go new file mode 100644 index 00000000..09142c1b --- /dev/null +++ b/pkg/upload-helper/tycovar.go @@ -0,0 +1,16 @@ +package uploadhelper + +type UploadResponse struct { + Success bool `json:"success"` + Message string `json:"message"` + URL string `json:"url,omitempty"` + FileName string `json:"filename,omitempty"` +} + +type MultipleUploadResponse struct { + Success bool `json:"success"` + Message string `json:"message"` + TotalFiles int `json:"total_files"` + SuccessCount int `json:"success_count"` + Results []UploadResponse `json:"results"` +} diff --git a/pkg/upload-helper/upload-helper.go b/pkg/upload-helper/upload-helper.go new file mode 100644 index 00000000..3c80a176 --- /dev/null +++ b/pkg/upload-helper/upload-helper.go @@ -0,0 +1,75 @@ +package uploadhelper + +import ( + "fmt" + "path/filepath" + "strings" + + ere "simrs-vx/internal/domain/references/encounter" +) + +func getBucketForType(docType string) (string, error) { + switch strings.ToLower(docType) { + case "resident", "resident-number", "ktp": + return string(ere.UCPRN), nil + case "driver-license", "sim", "license": + return string(ere.UCPDL), nil + case "passport", "paspor": + return string(ere.UCPP), nil + case "family-card", "kk", "family": + return string(ere.UCPFC), nil + case "mcu", "medical", "mcu-result": + return string(ere.UCMIR), nil + default: + return "", fmt.Errorf("unknown document type: %s", docType) + } +} + +// getValidFileTypesForBucket returns allowed file types for each bucket +func getValidFileTypesForBucket(bucketName string) []string { + switch bucketName { + case string(ere.UCPRN), string(ere.UCPDL), string(ere.UCPP), string(ere.UCPFC): + return []string{".jpg", ".jpeg", ".png", ".pdf", ".gif"} + case string(ere.UCMIR): + return []string{".jpg", ".jpeg", ".png", ".pdf", ".gif", ".doc", ".docx", ".xls", ".xlsx"} + default: + return []string{".jpg", ".jpeg", ".png", ".pdf"} + } +} + +// isValidFileType checks if the uploaded file type is allowed for the specific bucket +func isValidFileType(filename, bucketName string) bool { + allowedTypes := getValidFileTypesForBucket(bucketName) + ext := strings.ToLower(filepath.Ext(filename)) + + for _, allowedExt := range allowedTypes { + if ext == allowedExt { + return true + } + } + return false +} + +// getContentType determines the content type based on file extension +func getContentType(filename string) string { + switch strings.ToLower(filepath.Ext(filename)) { + case ".jpg", ".jpeg": + return "image/jpeg" + case ".png": + return "image/png" + case ".pdf": + return "application/pdf" + case ".gif": + return "image/gif" + case ".doc": + return "application/msword" + case ".docx": + return "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + case ".xls": + return "application/vnd.ms-excel" + case ".xlsx": + return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + default: + return "application/octet-stream" + } +} From d68a9bb7b7ab074e319e642503e4841bb0433db8 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 24 Sep 2025 12:13:57 +0700 Subject: [PATCH 051/190] add several columns for file url person --- .../migrations/20250924051317.sql | 2 + cmd/main-migration/migrations/atlas.sum | 5 +- internal/domain/main-entities/person/dto.go | 84 ++++++++++--------- .../domain/main-entities/person/entity.go | 46 +++++----- 4 files changed, 76 insertions(+), 61 deletions(-) create mode 100644 cmd/main-migration/migrations/20250924051317.sql diff --git a/cmd/main-migration/migrations/20250924051317.sql b/cmd/main-migration/migrations/20250924051317.sql new file mode 100644 index 00000000..f0f58947 --- /dev/null +++ b/cmd/main-migration/migrations/20250924051317.sql @@ -0,0 +1,2 @@ +-- Modify "Person" table +ALTER TABLE "public"."Person" ADD COLUMN "ResidentIdentityFileUrl" character varying(1024) NULL, ADD COLUMN "PassportFileUrl" character varying(1024) NULL, ADD COLUMN "DrivingLicenseFileUrl" character varying(1024) NULL, ADD COLUMN "FamilyIdentityFileUrl" character varying(1024) NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index e61e9880..b33a1e5c 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:0Hvo3AS2yMsS60eDIKnU5B2qvjDhNWHSDHcMxKKYJTk= +h1:n2YbCQPYchOWsVSLUNPCl29Xx3RMTi7vdulwPRHXL4E= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -15,4 +15,5 @@ h1:0Hvo3AS2yMsS60eDIKnU5B2qvjDhNWHSDHcMxKKYJTk= 20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= 20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= 20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:q1bndJguAqjnTjXr6Jpnsrj4d8zMseR2tf02h0h6ArE= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:vbbuylW434V23raIl6Y6Ima6aZVItLrdIpk+xehVsJc= diff --git a/internal/domain/main-entities/person/dto.go b/internal/domain/main-entities/person/dto.go index bab22944..fd38822b 100644 --- a/internal/domain/main-entities/person/dto.go +++ b/internal/domain/main-entities/person/dto.go @@ -81,48 +81,56 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Name string `json:"name"` - FrontTitle *string `json:"frontTitle"` - EndTitle *string `json:"endTitle"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency_code"` - Gender_Code *erp.GenderCode `json:"gender_code"` - ResidentIdentityNumber *string `json:"residentIdentityNumber"` - PassportNumber *string `json:"passportNumber"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber"` - Religion_Code *erp.ReligionCode `json:"religion_code"` - Education_Code *erp.EducationCode `json:"education_code"` - Ocupation_Code *erp.OcupationCode `json:"occupation_code"` - Ocupation_Name *string `json:"occupation_name"` - Ethnic_Code *string `json:"ethnic_code"` - Ethnic *ee.Ethnic `json:"ethnic,omitempty"` - Addresses *[]epa.PersonAddress `json:"addresses,omitempty"` - Contacts *[]epc.PersonContact `json:"contacts,omitempty"` - Relatives *[]epr.PersonRelative `json:"relatives,omitempty"` - Language_Code *string `json:"language_code"` + Name string `json:"name"` + FrontTitle *string `json:"frontTitle"` + EndTitle *string `json:"endTitle"` + BirthDate *time.Time `json:"birthDate,omitempty"` + BirthRegency_Code *string `json:"birthRegency_code"` + Gender_Code *erp.GenderCode `json:"gender_code"` + ResidentIdentityNumber *string `json:"residentIdentityNumber"` + PassportNumber *string `json:"passportNumber"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber"` + Religion_Code *erp.ReligionCode `json:"religion_code"` + Education_Code *erp.EducationCode `json:"education_code"` + Ocupation_Code *erp.OcupationCode `json:"occupation_code"` + Ocupation_Name *string `json:"occupation_name"` + Ethnic_Code *string `json:"ethnic_code"` + Ethnic *ee.Ethnic `json:"ethnic,omitempty"` + Addresses *[]epa.PersonAddress `json:"addresses,omitempty"` + Contacts *[]epc.PersonContact `json:"contacts,omitempty"` + Relatives *[]epr.PersonRelative `json:"relatives,omitempty"` + Language_Code *string `json:"language_code"` + ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl"` + PassportFileUrl *string `json:"passportFileUrl"` + DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl"` + FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl"` } func (d *Person) ToResponse() ResponseDto { resp := ResponseDto{ - Name: d.Name, - FrontTitle: d.FrontTitle, - EndTitle: d.EndTitle, - BirthDate: d.BirthDate, - BirthRegency_Code: d.BirthRegency_Code, - Gender_Code: d.Gender_Code, - ResidentIdentityNumber: d.ResidentIdentityNumber, - PassportNumber: d.PassportNumber, - DrivingLicenseNumber: d.DrivingLicenseNumber, - Religion_Code: d.Religion_Code, - Education_Code: d.Education_Code, - Ocupation_Code: d.Ocupation_Code, - Ocupation_Name: d.Ocupation_Name, - Ethnic_Code: d.Ethnic_Code, - Ethnic: d.Ethnic, - Addresses: d.Addresses, - Contacts: d.Contacts, - Relatives: d.Relatives, - Language_Code: d.Language_Code, + Name: d.Name, + FrontTitle: d.FrontTitle, + EndTitle: d.EndTitle, + BirthDate: d.BirthDate, + BirthRegency_Code: d.BirthRegency_Code, + Gender_Code: d.Gender_Code, + ResidentIdentityNumber: d.ResidentIdentityNumber, + PassportNumber: d.PassportNumber, + DrivingLicenseNumber: d.DrivingLicenseNumber, + Religion_Code: d.Religion_Code, + Education_Code: d.Education_Code, + Ocupation_Code: d.Ocupation_Code, + Ocupation_Name: d.Ocupation_Name, + Ethnic_Code: d.Ethnic_Code, + Ethnic: d.Ethnic, + Addresses: d.Addresses, + Contacts: d.Contacts, + Relatives: d.Relatives, + Language_Code: d.Language_Code, + ResidentIdentityFileUrl: d.ResidentIdentityFileUrl, + PassportFileUrl: d.PassportFileUrl, + DrivingLicenseFileUrl: d.DrivingLicenseFileUrl, + FamilyIdentityFileUrl: d.FamilyIdentityFileUrl, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index eb3bab27..37e2086c 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -13,27 +13,31 @@ import ( ) type Person struct { - ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"not null;size:150"` - FrontTitle *string `json:"frontTitle" gorm:"size:50"` - EndTitle *string `json:"endTitle" gorm:"size:50"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` - Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` - ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"unique;size:16"` - PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"unique;size:20"` - Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` - Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` - Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` - Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` - Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` - Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` - Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` - Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` - Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` - Language_Code *string `json:"language_code" gorm:"size:10"` - Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` + ecore.Main // adjust this according to the needs + Name string `json:"name" gorm:"not null;size:150"` + FrontTitle *string `json:"frontTitle" gorm:"size:50"` + EndTitle *string `json:"endTitle" gorm:"size:50"` + BirthDate *time.Time `json:"birthDate,omitempty"` + BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` + Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` + ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"unique;size:16"` + PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"unique;size:20"` + Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` + Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` + Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` + Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` + Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` + Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` + Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` + Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` + Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` + Language_Code *string `json:"language_code" gorm:"size:10"` + Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` + ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl" gorm:"size:1024"` + PassportFileUrl *string `json:"passportFileUrl" gorm:"size:1024"` + DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl" gorm:"size:1024"` + FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl" gorm:"size:1024"` } func (d Person) IsSameResidentIdentityNumber(input *string) bool { From f618a2d6d0c94e61a5662c4c71bcda2a328bbe89 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 24 Sep 2025 14:24:57 +0700 Subject: [PATCH 052/190] feat (patient): upload done --- internal/domain/main-entities/patient/dto.go | 16 +++- .../domain/references/encounter/encounter.go | 9 +++ internal/infra/minio/minio.go | 25 ------- .../interface/main-handler/main-handler.go | 1 + .../interface/main-handler/patient/handler.go | 36 +++++++++ .../use-case/main-use-case/patient/case.go | 73 +++++++++++++++++++ .../use-case/main-use-case/patient/helper.go | 40 +++++++++- pkg/minio-helper/minio-helper.go | 34 +++++++-- pkg/minio-helper/tycovar.go | 29 ++++++++ pkg/upload-helper/upload-helper.go | 3 +- 10 files changed, 229 insertions(+), 37 deletions(-) create mode 100644 pkg/minio-helper/tycovar.go diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index 02e9b0e7..b8630a0f 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -1,13 +1,16 @@ package patient import ( + "mime/multipart" + "time" + ecore "simrs-vx/internal/domain/base-entities/core" ep "simrs-vx/internal/domain/main-entities/person" epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" epr "simrs-vx/internal/domain/main-entities/person-relative" erc "simrs-vx/internal/domain/references/common" - "time" + ere "simrs-vx/internal/domain/references/encounter" ) type CreateDto struct { @@ -56,6 +59,17 @@ type SearchDto struct { Search string `json:"search"` } +type UploadDto struct { + Id uint `json:"-"` + Code ere.UploadCode `json:"-"` + File multipart.File `json:"-"` + FileHeader *multipart.FileHeader `json:"-"` + Filename string `json:"-"` + Size int64 `json:"-"` + MimeType string `json:"-"` + MedRecNumber string `json:"-"` +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 8ed4dd81..14e6a269 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -85,3 +85,12 @@ func (ec EncounterClassCode) Code() string { return "UNKNOWN" } } + +func IsValidUploadCode(code UploadCode) bool { + switch UploadCode(code) { + case UCPRN, UCPDL, UCPP, UCPFC, UCMIR: + return true + default: + return false + } +} diff --git a/internal/infra/minio/minio.go b/internal/infra/minio/minio.go index 36e9c546..e403b964 100644 --- a/internal/infra/minio/minio.go +++ b/internal/infra/minio/minio.go @@ -2,9 +2,6 @@ package minio import ( "errors" - "io" - "net/url" - "time" a "github.com/karincake/apem" lo "github.com/karincake/apem/loggero" @@ -24,28 +21,6 @@ type MinioCfg struct { BucketName []string `yaml:"bucketName"` } -type UploadReaderInput struct { - File io.Reader - Name string - Size int64 - ContentType string - BucketName string -} - -type UploadPathInput struct { - BucketName string - ContentType string - Name string - Path string -} - -type PresignedGetInput struct { - Bucket string - Object string - Expiry time.Duration - ReqParams url.Values -} - type ResponsePostPolicy struct { Url string `json:"url"` FormData map[string]string `json:"form-data"` diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index f62f7036..7b02de54 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -235,6 +235,7 @@ func SetRoutes() http.Handler { "PATCH /{id}": patient.O.Update, "DELETE /{id}": patient.O.Delete, "GET /by-identifier": patient.O.Search, + "POST /{id}/upload": patient.O.Upload, }) /******************** sources ********************/ diff --git a/internal/interface/main-handler/patient/handler.go b/internal/interface/main-handler/patient/handler.go index c392ee4c..1bcdacee 100644 --- a/internal/interface/main-handler/patient/handler.go +++ b/internal/interface/main-handler/patient/handler.go @@ -10,6 +10,8 @@ import ( e "simrs-vx/internal/domain/main-entities/patient" u "simrs-vx/internal/use-case/main-use-case/patient" + + ere "simrs-vx/internal/domain/references/encounter" ) type myBase struct{} @@ -76,3 +78,37 @@ func (obj myBase) Search(w http.ResponseWriter, r *http.Request) { res, err := u.Search(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Upload(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + err := r.ParseMultipartForm(10 << 20) // 10 MB + if err != nil { + rw.DataResponse(w, nil, err) + return + } + + code := r.FormValue("code") + + file, header, err := r.FormFile("content") + if err != nil { + rw.DataResponse(w, nil, err) + return + } + defer file.Close() + + dto := e.UploadDto{} + dto.Id = uint(id) + dto.Code = ere.UploadCode(code) + dto.File = file + dto.FileHeader = header + dto.Filename = header.Filename + dto.Size = header.Size + dto.MimeType = header.Header.Get("Content-Type") + + res, err := u.Upload(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index b17c756a..6fca5ab1 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -1,6 +1,7 @@ package patient import ( + "errors" "strconv" e "simrs-vx/internal/domain/main-entities/patient" @@ -10,6 +11,8 @@ import ( upc "simrs-vx/internal/use-case/main-use-case/person-contact" upr "simrs-vx/internal/use-case/main-use-case/person-relative" + ere "simrs-vx/internal/domain/references/encounter" + pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -359,3 +362,73 @@ func Search(input e.SearchDto) (*d.Data, error) { Data: data.ToResponse(), }, nil } + +func Upload(input e.UploadDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Patient + var err error + + event := pl.Event{ + Feature: "Upload", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "upload") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + if !ere.IsValidUploadCode(input.Code) { + return errors.New("invalid upload code") + } + + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if data.Person == nil { + return errors.New("person not found") + } + + person := data.Person + + input.MedRecNumber = *data.Number + pubUrl, err := uploadAndGenerateFileUrl(input, &event) + if err != nil { + event.Action = "" + } + switch input.Code { + case ere.UCPRN: + person.ResidentIdentityFileUrl = &pubUrl + case ere.UCPDL: + person.DrivingLicenseFileUrl = &pubUrl + case ere.UCPP: + person.PassportFileUrl = &pubUrl + case ere.UCPFC: + person.FamilyIdentityFileUrl = &pubUrl + default: + return errors.New("invalid upload code") + } + + if err := tx.Save(&person).Error; err != nil { + return err + } + + 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": "uploaded", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/patient/helper.go b/internal/use-case/main-use-case/patient/helper.go index 09f94ef6..be1a4355 100644 --- a/internal/use-case/main-use-case/patient/helper.go +++ b/internal/use-case/main-use-case/patient/helper.go @@ -6,8 +6,16 @@ package patient import ( "fmt" - e "simrs-vx/internal/domain/main-entities/patient" + "path/filepath" "strconv" + "strings" + "time" + + e "simrs-vx/internal/domain/main-entities/patient" + + pl "simrs-vx/pkg/logger" + pmh "simrs-vx/pkg/minio-helper" + puh "simrs-vx/pkg/upload-helper" dg "github.com/karincake/apem/db-gorm-pg" ) @@ -81,3 +89,33 @@ func GenerateNextMedicalRecordNumber() (string, error) { return fmt.Sprintf(format, nextInt), nil } + +func uploadAndGenerateFileUrl(input e.UploadDto, event *pl.Event) (string, error) { + pl.SetLogInfo(event, input, "started", "uploadAndGenerateFileUrl") + bucket := string(input.Code) + ext := strings.ToLower(filepath.Ext(input.Filename)) + + if !puh.IsValidFileType(ext, bucket) { + return "", fmt.Errorf("invalid file type: %s", input.Filename) + } + objectName := fmt.Sprintf("%s%d%s", input.MedRecNumber, time.Now().UnixNano(), ext) + + uploadInput := pmh.UploadReaderInput{ + BucketName: bucket, + Name: objectName, + File: input.File, + Size: input.Size, + ContentType: input.MimeType, + } + + _, err := pmh.I.PutObject(uploadInput) + if err != nil { + return "", err + } + + // Build URL for access + publicUrl := pmh.I.GenerateUrl(bucket, objectName) + + pl.SetLogInfo(event, nil, "complete") + return publicUrl, nil +} diff --git a/pkg/minio-helper/minio-helper.go b/pkg/minio-helper/minio-helper.go index 637ca1b6..4c5c3952 100644 --- a/pkg/minio-helper/minio-helper.go +++ b/pkg/minio-helper/minio-helper.go @@ -27,17 +27,35 @@ func (repo *minioRepository) createBucket(bucketName string, region string) erro if err != nil { return err } - if exist { - return nil - } - if err := repo.client.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: region, ObjectLocking: true}); err != nil { - return err + if !exist { + // create bucket + if err := repo.client.MakeBucket(context.Background(), bucketName, minio.MakeBucketOptions{Region: region}); err != nil { + return err + } + + // set bucket policy to public read + policy := fmt.Sprintf(`{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Principal": {"AWS": ["*"]}, + "Action": ["s3:GetObject"], + "Resource": ["arn:aws:s3:::%s/*"] + } + ] + }`, bucketName) + + if err := repo.client.SetBucketPolicy(context.Background(), bucketName, policy); err != nil { + return err + } } + return nil } // Upload file reader to MinIO -func (repo *minioRepository) PutObject(input m.UploadReaderInput) (*minio.UploadInfo, error) { +func (repo *minioRepository) PutObject(input UploadReaderInput) (*minio.UploadInfo, error) { if err := repo.createBucket(input.BucketName, m.O.GetRegion()); err != nil { return nil, err } @@ -55,7 +73,7 @@ func (repo *minioRepository) PutObject(input m.UploadReaderInput) (*minio.Upload } // Upload file path to MinIO -func (repo *minioRepository) FPutObject(input m.UploadPathInput) (*minio.UploadInfo, error) { +func (repo *minioRepository) FPutObject(input UploadPathInput) (*minio.UploadInfo, error) { if err := repo.createBucket(input.BucketName, m.O.GetRegion()); err != nil { return nil, err } @@ -120,7 +138,7 @@ func (repo *minioRepository) GeneratePresignedPost(policy *minio.PostPolicy) (*u } // create presigned url to get object -func (repo *minioRepository) GeneratePresignedGetObject(input m.PresignedGetInput) (*url.URL, error) { +func (repo *minioRepository) GeneratePresignedGetObject(input PresignedGetInput) (*url.URL, error) { presignedUrl, err := repo.client.PresignedGetObject(context.Background(), input.Bucket, input.Object, input.Expiry, input.ReqParams) if err != nil { return nil, err diff --git a/pkg/minio-helper/tycovar.go b/pkg/minio-helper/tycovar.go new file mode 100644 index 00000000..a9ac20dc --- /dev/null +++ b/pkg/minio-helper/tycovar.go @@ -0,0 +1,29 @@ +package miniohelper + +import ( + "io" + "net/url" + "time" +) + +type UploadReaderInput struct { + File io.Reader + Name string + Size int64 + ContentType string + BucketName string +} + +type UploadPathInput struct { + BucketName string + ContentType string + Name string + Path string +} + +type PresignedGetInput struct { + Bucket string + Object string + Expiry time.Duration + ReqParams url.Values +} diff --git a/pkg/upload-helper/upload-helper.go b/pkg/upload-helper/upload-helper.go index 3c80a176..0ce72ff1 100644 --- a/pkg/upload-helper/upload-helper.go +++ b/pkg/upload-helper/upload-helper.go @@ -38,9 +38,8 @@ func getValidFileTypesForBucket(bucketName string) []string { } // isValidFileType checks if the uploaded file type is allowed for the specific bucket -func isValidFileType(filename, bucketName string) bool { +func IsValidFileType(ext, bucketName string) bool { allowedTypes := getValidFileTypesForBucket(bucketName) - ext := strings.ToLower(filepath.Ext(filename)) for _, allowedExt := range allowedTypes { if ext == allowedExt { From ea50df44bdeef63a7d7f150c4c78dccef2f1aa19 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 24 Sep 2025 14:32:31 +0700 Subject: [PATCH 053/190] feat (consultation): add guard for diff doctor_id --- assets/language/en/data.json | 1 + internal/use-case/main-use-case/consultation/case.go | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/assets/language/en/data.json b/assets/language/en/data.json index be5c94c1..a5223967 100644 --- a/assets/language/en/data.json +++ b/assets/language/en/data.json @@ -39,6 +39,7 @@ "data-state-mismatch": "\"%v\" is not in \"%v\" state", "data-duplicate": "duplicate data", "data-payment-fail": "failed to create payment", + "data-handled-mismatch": "data handled by different user/person", "expired": "is expired", "registered": "is already registered", diff --git a/internal/use-case/main-use-case/consultation/case.go b/internal/use-case/main-use-case/consultation/case.go index 40099e9c..2de98916 100644 --- a/internal/use-case/main-use-case/consultation/case.go +++ b/internal/use-case/main-use-case/consultation/case.go @@ -321,6 +321,16 @@ func Reply(input e.ReplyDto) (*d.Data, error) { return err } + if data.Doctor_Id != nil && data.Doctor_Id != doctor_id { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-handled-mismatch", + Detail: "data handled by different user/person", + Raw: errors.New("data handled by different user/person"), + } + return pl.SetLogError(&event, input) + } + data.Doctor_Id = doctor_id data.Solution = input.Solution data.RepliedAt = pu.GetTimeNow() From a9e380f9571597e54278f9e9f27e5d46fe69b1fd Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 25 Sep 2025 11:14:47 +0700 Subject: [PATCH 054/190] feat (patient): remove previously uploaded file when a new one is created --- .../use-case/main-use-case/patient/case.go | 20 +++++++++++++++++++ .../use-case/main-use-case/patient/helper.go | 15 ++++++++++++++ pkg/minio-helper/minio-helper.go | 9 +++++++++ 3 files changed, 44 insertions(+) diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 6fca5ab1..2d874b8b 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -397,19 +397,39 @@ func Upload(input e.UploadDto) (*d.Data, error) { if err != nil { event.Action = "" } + + fileUrl := "" switch input.Code { case ere.UCPRN: + if person.ResidentIdentityFileUrl != nil { + fileUrl = *person.ResidentIdentityFileUrl + } person.ResidentIdentityFileUrl = &pubUrl case ere.UCPDL: + if person.DrivingLicenseFileUrl != nil { + fileUrl = *person.DrivingLicenseFileUrl + } person.DrivingLicenseFileUrl = &pubUrl case ere.UCPP: + if person.PassportFileUrl != nil { + fileUrl = *person.PassportFileUrl + } person.PassportFileUrl = &pubUrl case ere.UCPFC: + if person.FamilyIdentityFileUrl != nil { + fileUrl = *person.FamilyIdentityFileUrl + } person.FamilyIdentityFileUrl = &pubUrl default: return errors.New("invalid upload code") } + if fileUrl != "" { + if err := removeUploadedFile(string(input.Code), fileUrl, &event); err != nil { + return err + } + } + if err := tx.Save(&person).Error; err != nil { return err } diff --git a/internal/use-case/main-use-case/patient/helper.go b/internal/use-case/main-use-case/patient/helper.go index be1a4355..82154b47 100644 --- a/internal/use-case/main-use-case/patient/helper.go +++ b/internal/use-case/main-use-case/patient/helper.go @@ -119,3 +119,18 @@ func uploadAndGenerateFileUrl(input e.UploadDto, event *pl.Event) (string, error pl.SetLogInfo(event, nil, "complete") return publicUrl, nil } + +func removeUploadedFile(bucket, fileUrl string, event *pl.Event) error { + pl.SetLogInfo(event, nil, "started", "removeUploadedFile") + filename, err := pmh.GetFilename(fileUrl) + if err != nil { + return err + } + + err = pmh.I.RemoveObject(bucket, filename) + if err != nil { + return err + } + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/pkg/minio-helper/minio-helper.go b/pkg/minio-helper/minio-helper.go index 4c5c3952..15c52ca5 100644 --- a/pkg/minio-helper/minio-helper.go +++ b/pkg/minio-helper/minio-helper.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net/url" + "path" m "simrs-vx/internal/infra/minio" @@ -165,3 +166,11 @@ func GetEndpointUrl(bucket string) string { } return fmt.Sprintf("%s://%s/%s", mode, m.O.GetEndpoint(), bucket) } + +func GetFilename(rawUrl string) (string, error) { + parsed, err := url.Parse(rawUrl) + if err != nil { + return "", err + } + return path.Base(parsed.Path), nil +} From d34596d3e853e306962d103a748523132fbaecac Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 25 Sep 2025 11:38:04 +0700 Subject: [PATCH 055/190] fix (encounter): add open orders guard --- .../use-case/main-use-case/encounter/case.go | 6 +- .../main-use-case/encounter/helper.go | 101 ++++++++++++++++++ .../use-case/main-use-case/encounter/lib.go | 2 +- 3 files changed, 107 insertions(+), 2 deletions(-) diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index c63579cf..3a95e1d0 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -375,7 +375,11 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { return err } - if err := UpdateDischargeData(input, data, &event, tx); err != nil { + if err := updateDischargeData(input, data, &event, tx); err != nil { + return err + } + + if err := checkNewOrdersExist(data.Id, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 5bf73d14..035577df 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -6,9 +6,15 @@ package encounter import ( "errors" + "fmt" + "strings" + e "simrs-vx/internal/domain/main-entities/encounter" es "simrs-vx/internal/domain/main-entities/soapi" + edo "simrs-vx/internal/domain/main-entities/device-order" + emo "simrs-vx/internal/domain/main-entities/material-order" + emco "simrs-vx/internal/domain/main-entities/mcu-order" em "simrs-vx/internal/domain/main-entities/medication" emei "simrs-vx/internal/domain/main-entities/medication-item" emi "simrs-vx/internal/domain/main-entities/medicine-mix" @@ -16,6 +22,7 @@ import ( ep "simrs-vx/internal/domain/main-entities/prescription" epi "simrs-vx/internal/domain/main-entities/prescription-item" + // udo "simrs-vx/internal/use-case/main-use-case/device-order" um "simrs-vx/internal/use-case/main-use-case/medication" umei "simrs-vx/internal/use-case/main-use-case/medication-item" umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" @@ -205,3 +212,97 @@ func createMedicationItem(medication_id uint, input epi.PrescriptionItem, event return nil } + +func checkNewOrdersExist(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "CheckNewOrdersExist") + var errs []string + if err := getDeviceOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if err := getMaterialOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if err := getMcuOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if len(errs) > 0 { + return fmt.Errorf("encounter has open orders: %s", strings.Join(errs, "; ")) + } + + return nil +} + +func getDeviceOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getDeviceOrders") + var orders []edo.DeviceOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get device order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d device orders", len(orders)) + } + + return nil +} + +func getMaterialOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getMaterialOrders") + var orders []emo.MaterialOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get material order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d material orders", len(orders)) + } + + return nil +} + +func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getMcuOrders") + var orders []emco.McuOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get mcu order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d mcu orders", len(orders)) + } + + return nil +} diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index 8653cdbf..108b298a 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -154,7 +154,7 @@ func DeleteData(data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { return nil } -func UpdateDischargeData(input e.DischargeDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { +func updateDischargeData(input e.DischargeDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdateDischarge") setDataDischarge(input, data) From f7edee1ac5fb011bf1c9b40c5422a3b0a938c3d4 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 29 Sep 2025 10:45:16 +0700 Subject: [PATCH 056/190] add soapiTypeCode, adjust soapi --- .../migrations/20250929034321.sql | 2 ++ .../migrations/20250929034428.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 6 ++++-- internal/domain/main-entities/soapi/entity.go | 20 +++++++++++-------- .../domain/references/clinical/clinical.go | 9 +++++++-- .../references/organization/organization.go | 2 ++ 6 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 cmd/main-migration/migrations/20250929034321.sql create mode 100644 cmd/main-migration/migrations/20250929034428.sql diff --git a/cmd/main-migration/migrations/20250929034321.sql b/cmd/main-migration/migrations/20250929034321.sql new file mode 100644 index 00000000..bfdc5021 --- /dev/null +++ b/cmd/main-migration/migrations/20250929034321.sql @@ -0,0 +1,2 @@ +-- Modify "Soapi" table +ALTER TABLE "public"."Soapi" ADD COLUMN "TypeCode" text NULL; diff --git a/cmd/main-migration/migrations/20250929034428.sql b/cmd/main-migration/migrations/20250929034428.sql new file mode 100644 index 00000000..84a214a5 --- /dev/null +++ b/cmd/main-migration/migrations/20250929034428.sql @@ -0,0 +1,2 @@ +-- Modify "Soapi" table +ALTER TABLE "public"."Soapi" ALTER COLUMN "TypeCode" TYPE character varying(11); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index b33a1e5c..9bdd6275 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:n2YbCQPYchOWsVSLUNPCl29Xx3RMTi7vdulwPRHXL4E= +h1:xkdKsHk/4s72juNsRgWubyMR4XEXjEQ38+XI4m/e/jM= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -16,4 +16,6 @@ h1:n2YbCQPYchOWsVSLUNPCl29Xx3RMTi7vdulwPRHXL4E= 20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= 20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= 20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:vbbuylW434V23raIl6Y6Ima6aZVItLrdIpk+xehVsJc= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:Pjs8W2zK7Q6Nwta/xpYE7YdfT+JfIMHjgWfDK2hnaEI= +20250929034428.sql h1:w3JomY0HxQJIdHA6Pq7mixJNi1YcO8NpQMjIfhNw+oA= diff --git a/internal/domain/main-entities/soapi/entity.go b/internal/domain/main-entities/soapi/entity.go index f6c6b5e9..7e457ca9 100644 --- a/internal/domain/main-entities/soapi/entity.go +++ b/internal/domain/main-entities/soapi/entity.go @@ -1,18 +1,22 @@ package soapi import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" eem "simrs-vx/internal/domain/main-entities/employee" ee "simrs-vx/internal/domain/main-entities/encounter" - "time" + + erc "simrs-vx/internal/domain/references/clinical" ) type Soapi struct { - ecore.Main // adjust this according to the needs - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Employee_Id *uint `json:"employee_id"` - Employee *eem.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` - Time *time.Time `json:"time"` - Value *string `json:"value"` + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Employee_Id *uint `json:"employee_id"` + Employee *eem.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + Time *time.Time `json:"time"` + TypeCode erc.SoapiTypeCode `json:"type_code" gorm:"size:11"` + Value *string `json:"value"` } diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index d76770fe..505298af 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -8,11 +8,12 @@ type ( PlanCode string InstructionCode string McuUrgencyLevelCode string + SoapiTypeCode string ) const ( - SCPrimaryComplaint SubjectCode = "pri-compl" // Keluhan Utama - SCSecComplaint SubjectCode = "sec-compl" // Secondary Complaint + SCPrimaryComplaint SubjectCode = "pri-complain" // Keluhan Utama + SCSecComplaint SubjectCode = "sec-complain" // Secondary Complaint SCCurrentDiseaseHistory SubjectCode = "cur-disea-hist" // Current Disease History SCPastDiseaseHistory SubjectCode = "pas-disea-hist" // Past Disease History SCFamilyDiseaseHistory SubjectCode = "fam-disea-hist" // Family Disease History @@ -47,4 +48,8 @@ const ( MULCBG McuUrgencyLevelCode = "blood-gas" MULCPF McuUrgencyLevelCode = "priority-form" MULCRT McuUrgencyLevelCode = "routine" + + STCEarly SoapiTypeCode = "early" // Kajian Awal Medis + STCERehab SoapiTypeCode = "early-rehab" // Kajian Awal Rehab Medik + STCFunc SoapiTypeCode = "function" // Assessment Fungsi ) diff --git a/internal/domain/references/organization/organization.go b/internal/domain/references/organization/organization.go index 30aa25b5..894257c8 100644 --- a/internal/domain/references/organization/organization.go +++ b/internal/domain/references/organization/organization.go @@ -15,6 +15,8 @@ const ( UPCLab UserPosisitionCode = "laborant" // Laboran UPCPha UserPosisitionCode = "pharmacy" // Farmasi UPCPay UserPosisitionCode = "payment" // Pembayaran + UPCHur UserPosisitionCode = "human-resource" // Sumber Daya Manusia + UPCGea UserPosisitionCode = "general-affair" // Bagian Umu UPCPav UserPosisitionCode = "payment-verificator" // Konfirmasi pembayaran UPCMan UserPosisitionCode = "management" // Manajemen UPCInt UserPosisitionCode = "specialist-intern" // PPDS From df46ba33356d578dfa1735519a610d705d1967d8 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 29 Sep 2025 10:47:28 +0700 Subject: [PATCH 057/190] fix (soapi): add type code --- internal/domain/main-entities/soapi/dto.go | 37 +++++++++++-------- .../use-case/main-use-case/soapi/helper.go | 1 + 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/internal/domain/main-entities/soapi/dto.go b/internal/domain/main-entities/soapi/dto.go index 6aac522e..172b38b2 100644 --- a/internal/domain/main-entities/soapi/dto.go +++ b/internal/domain/main-entities/soapi/dto.go @@ -1,19 +1,23 @@ package soapi import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" eem "simrs-vx/internal/domain/main-entities/employee" ee "simrs-vx/internal/domain/main-entities/encounter" + erc "simrs-vx/internal/domain/references/clinical" + pa "simrs-vx/pkg/auth-helper" - "time" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Employee_Id *uint `json:"-"` - Time *time.Time `json:"time"` - Value *string `json:"value"` + Encounter_Id *uint `json:"encounter_id"` + Employee_Id *uint `json:"-"` + Time *time.Time `json:"time"` + TypeCode erc.SoapiTypeCode `json:"typeCode"` + Value *string `json:"value"` pa.AuthInfo } @@ -25,10 +29,11 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Employee_Id *uint `json:"employee_id"` - Time *time.Time `json:"time"` - Value *string `json:"value"` + Encounter_Id *uint `json:"encounter_id"` + Employee_Id *uint `json:"employee_id"` + Time *time.Time `json:"time"` + TypeCode erc.SoapiTypeCode `json:"typeCode"` + Value *string `json:"value"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -56,12 +61,13 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` - Employee_Id *uint `json:"employee_id"` - Employee *eem.Employee `json:"employee,omitempty"` - Time *time.Time `json:"time"` - Value *string `json:"value"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Employee_Id *uint `json:"employee_id"` + Employee *eem.Employee `json:"employee,omitempty"` + Time *time.Time `json:"time"` + TypeCode erc.SoapiTypeCode `json:"typeCode"` + Value *string `json:"value"` } func (d Soapi) ToResponse() ResponseDto { @@ -71,6 +77,7 @@ func (d Soapi) ToResponse() ResponseDto { Employee_Id: d.Employee_Id, Employee: d.Employee, Time: d.Time, + TypeCode: d.TypeCode, Value: d.Value, } resp.Main = d.Main diff --git a/internal/use-case/main-use-case/soapi/helper.go b/internal/use-case/main-use-case/soapi/helper.go index 504acff6..5a94848a 100644 --- a/internal/use-case/main-use-case/soapi/helper.go +++ b/internal/use-case/main-use-case/soapi/helper.go @@ -20,5 +20,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Soapi) { data.Encounter_Id = inputSrc.Encounter_Id data.Employee_Id = inputSrc.Employee_Id data.Time = inputSrc.Time + data.TypeCode = inputSrc.TypeCode data.Value = inputSrc.Value } From 8d3113a86077f120cae5d114247b28ef393c19ce Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Mon, 29 Sep 2025 21:09:34 +0700 Subject: [PATCH 058/190] update after run migration --- cmd/main-migration/migrations/atlas.sum | 38 ++++++++++++------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index b33a1e5c..829eae6d 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,19 +1,19 @@ -h1:n2YbCQPYchOWsVSLUNPCl29Xx3RMTi7vdulwPRHXL4E= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:vbbuylW434V23raIl6Y6Ima6aZVItLrdIpk+xehVsJc= +h1:eOZHhYflqYtiRTD78THsLwQxQbS9eIvsRFQBtcsT670= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= From ff026914c4863041ca799b5f80956a051a60f700 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 30 Sep 2025 09:39:51 +0700 Subject: [PATCH 059/190] rerun atlas migration --- cmd/main-migration/migrations/atlas.sum | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 9bdd6275..7d3543b4 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:xkdKsHk/4s72juNsRgWubyMR4XEXjEQ38+XI4m/e/jM= +h1:UQi1THfG0QI80rmHgbXNK/vgQv+5eUA5VRy3zqfWdbI= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -17,5 +17,5 @@ h1:xkdKsHk/4s72juNsRgWubyMR4XEXjEQ38+XI4m/e/jM= 20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= 20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= 20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:Pjs8W2zK7Q6Nwta/xpYE7YdfT+JfIMHjgWfDK2hnaEI= -20250929034428.sql h1:w3JomY0HxQJIdHA6Pq7mixJNi1YcO8NpQMjIfhNw+oA= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= From 7fd8bca3f893c3082d49ca4a2cff8fbe95a1f27b Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 30 Sep 2025 09:56:25 +0700 Subject: [PATCH 060/190] adjust for prescription item, medicinemix, medication item --- .../migrations/20250930025550.sql | 6 +++++ cmd/main-migration/migrations/atlas.sum | 7 +++--- .../main-entities/medication-item/dto.go | 7 ++++-- .../main-entities/medication-item/entity.go | 4 ++- .../main-entities/medicine-mix/entity.go | 3 +++ .../main-entities/prescription-item/dto.go | 25 +++++++++++++------ .../main-entities/prescription-item/entity.go | 4 ++- 7 files changed, 41 insertions(+), 15 deletions(-) create mode 100644 cmd/main-migration/migrations/20250930025550.sql diff --git a/cmd/main-migration/migrations/20250930025550.sql b/cmd/main-migration/migrations/20250930025550.sql new file mode 100644 index 00000000..cb24b7fc --- /dev/null +++ b/cmd/main-migration/migrations/20250930025550.sql @@ -0,0 +1,6 @@ +-- Modify "MedicationItem" table +ALTER TABLE "public"."MedicationItem" ALTER COLUMN "Usage" TYPE character varying(255), ADD COLUMN "Frequency" integer NULL, ADD COLUMN "Dose" numeric NULL; +-- Modify "PrescriptionItem" table +ALTER TABLE "public"."PrescriptionItem" ALTER COLUMN "Usage" TYPE character varying(255), ADD COLUMN "Frequency" integer NULL, ADD COLUMN "Dose" numeric NULL; +-- Modify "MedicineMix" table +ALTER TABLE "public"."MedicineMix" ADD COLUMN "Uom_Code" character varying(10) NULL, ADD CONSTRAINT "fk_MedicineMix_Uom" FOREIGN KEY ("Uom_Code") REFERENCES "public"."Uom" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 9bdd6275..553c25ea 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:xkdKsHk/4s72juNsRgWubyMR4XEXjEQ38+XI4m/e/jM= +h1:Q2e6TNVbdE4yvg1W/bZvcNzYuBjy1kIT2z0QVbyWDYY= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -17,5 +17,6 @@ h1:xkdKsHk/4s72juNsRgWubyMR4XEXjEQ38+XI4m/e/jM= 20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= 20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= 20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:Pjs8W2zK7Q6Nwta/xpYE7YdfT+JfIMHjgWfDK2hnaEI= -20250929034428.sql h1:w3JomY0HxQJIdHA6Pq7mixJNi1YcO8NpQMjIfhNw+oA= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:cUvQcYn+4BoID3BGn2JriESuD7WactMf/fp48EFwtAA= diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go index 00edb045..8267fde5 100644 --- a/internal/domain/main-entities/medication-item/dto.go +++ b/internal/domain/main-entities/medication-item/dto.go @@ -13,10 +13,13 @@ type CreateDto struct { IsMix bool `json:"isMix"` Medicine_Id *uint `json:"medicine_id"` MedicineMix_Id *uint `json:"medicineMix_id"` - Usage float64 `json:"usage"` + Frequency *uint16 `json:"frequency"` + Dose float64 `json:"dose"` + Usage string `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` IsRedeemed bool `json:"isRedeemed"` + Quantity float64 `json:"quantity"` } type ReadListDto struct { @@ -67,7 +70,7 @@ type ResponseDto struct { Medicine *em.Medicine `json:"medicine,omitempty"` MedicineMix_Id *uint `json:"medicineMix_id"` MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` - Usage float64 `json:"usage"` + Usage string `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` IsRedeemed bool `json:"isRedeemed"` diff --git a/internal/domain/main-entities/medication-item/entity.go b/internal/domain/main-entities/medication-item/entity.go index e778cb50..ffef0761 100644 --- a/internal/domain/main-entities/medication-item/entity.go +++ b/internal/domain/main-entities/medication-item/entity.go @@ -18,7 +18,9 @@ type MedicationItem struct { Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` MedicineMix_Id *uint `json:"medicineMix_id"` MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` - Usage float64 `json:"usage"` + Frequency *uint16 `json:"frequency"` + Dose float64 `json:"dose"` + Usage string `json:"usage" gorm:"size:255"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` IsRedeemed bool `json:"isRedeemed"` diff --git a/internal/domain/main-entities/medicine-mix/entity.go b/internal/domain/main-entities/medicine-mix/entity.go index 6575d703..1b9edd4f 100644 --- a/internal/domain/main-entities/medicine-mix/entity.go +++ b/internal/domain/main-entities/medicine-mix/entity.go @@ -3,10 +3,13 @@ package medicinemix import ( ecore "simrs-vx/internal/domain/base-entities/core" emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" + eu "simrs-vx/internal/domain/main-entities/uom" ) type MedicineMix struct { ecore.Main // adjust this according to the needs Name string `json:"name" gorm:"size:50"` + Uom_Code *string `json:"uom_code" gorm:"size:10"` + Uom *eu.Uom `json:"uom" gorm:"foreignKey:Uom_Code;references:Code"` MixItems []*emmi.MedicineMixItem `json:"mixItems" gorm:"foreignKey:MedicineMix_Id;references:Id"` } diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index f23a6610..1926853d 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -9,13 +9,16 @@ import ( ) type CreateDto struct { - Prescription_Id *uint `json:"prescription_id"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - MedicineMix_Id *uint `json:"medicineMix_id"` - Usage float64 `json:"usage"` - Interval uint8 `json:"interval"` - IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + Prescription_Id *uint `json:"prescription_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Frequency *uint16 `json:"frequency"` + Dose float64 `json:"dose"` + Usage float64 `json:"usage"` + Interval uint8 `json:"interval"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + IntervalMultiplier *uint16 `json:"intervalMultiplier"` } type ReadListDto struct { @@ -65,9 +68,12 @@ type ResponseDto struct { Medicine *em.Medicine `json:"medicine,omitempty"` MedicineMix_Id *uint `json:"medicineMix_id"` MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty"` - Usage float64 `json:"usage"` + Frequency *uint16 `json:"frequency"` + Dose float64 `json:"dose"` + Usage string `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + Quantity float64 `json:"quantity"` } func (d PrescriptionItem) ToResponse() ResponseDto { @@ -79,9 +85,12 @@ func (d PrescriptionItem) ToResponse() ResponseDto { Medicine: d.Medicine, MedicineMix_Id: d.MedicineMix_Id, MedicineMix: d.MedicineMix, + Frequency: d.Frequency, + Dose: d.Dose, Usage: d.Usage, Interval: d.Interval, IntervalUnit_Code: d.IntervalUnit_Code, + Quantity: d.Quantity, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/prescription-item/entity.go b/internal/domain/main-entities/prescription-item/entity.go index 6ccf3ae4..33696385 100644 --- a/internal/domain/main-entities/prescription-item/entity.go +++ b/internal/domain/main-entities/prescription-item/entity.go @@ -18,7 +18,9 @@ type PrescriptionItem struct { Medicine *em.Medicine `json:"medicine,omitempty" gorm:"foreignKey:Medicine_Id;references:Id"` MedicineMix_Id *uint `json:"medicineMix_id"` MedicineMix *emm.MedicineMix `json:"medicineMix,omitempty" gorm:"foreignKey:MedicineMix_Id;references:Id"` - Usage float64 `json:"usage"` + Frequency *uint16 `json:"frequency"` + Dose float64 `json:"dose"` + Usage string `json:"usage" gorm:"size:255"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` Quantity float64 `json:"quantity"` From 0f86c0827c342147ff949ea6e4981529155e83fd Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 30 Sep 2025 10:43:31 +0700 Subject: [PATCH 061/190] feat (prescription-item, medicine-mix, medication-item): adjust field, calculate qty --- internal/domain/main-entities/medication-item/dto.go | 1 - internal/domain/main-entities/medicine-mix/dto.go | 8 ++++++-- internal/domain/main-entities/prescription-item/dto.go | 3 ++- internal/use-case/main-use-case/encounter/helper.go | 4 +++- .../use-case/main-use-case/medication-item/helper.go | 4 ++++ internal/use-case/main-use-case/medicine-mix/helper.go | 1 + .../use-case/main-use-case/prescription-item/case.go | 2 ++ .../use-case/main-use-case/prescription-item/helper.go | 9 +++++++++ internal/use-case/main-use-case/prescription/helper.go | 5 ++++- 9 files changed, 31 insertions(+), 6 deletions(-) diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go index 9f26cebb..c90be314 100644 --- a/internal/domain/main-entities/medication-item/dto.go +++ b/internal/domain/main-entities/medication-item/dto.go @@ -20,7 +20,6 @@ type CreateDto struct { IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` IsRedeemed bool `json:"isRedeemed"` Quantity float64 `json:"quantity"` - Quantity float64 `json:"quantity"` Note *string `json:"note" gorm:"size:1024"` } diff --git a/internal/domain/main-entities/medicine-mix/dto.go b/internal/domain/main-entities/medicine-mix/dto.go index 05b67a06..6f7cd424 100644 --- a/internal/domain/main-entities/medicine-mix/dto.go +++ b/internal/domain/main-entities/medicine-mix/dto.go @@ -7,11 +7,13 @@ import ( ) type CreateDto struct { - Name string `json:"name" validate:"maxLength=50"` + Name string `json:"name" validate:"maxLength=50"` + Uom_Code *string `json:"uom_code" validate:"maxLength=10"` } type ReadListDto struct { - Name string `json:"name"` + Name string `json:"name"` + Uom_Code *string `json:"uom_code"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -40,12 +42,14 @@ type MetaDto struct { type ResponseDto struct { ecore.Main Name string `json:"name"` + Uom_Code *string `json:"uom_code"` MixItems []*emmi.MedicineMixItem `json:"mixItems"` } func (d MedicineMix) ToResponse() ResponseDto { resp := ResponseDto{ Name: d.Name, + Uom_Code: d.Uom_Code, MixItems: d.MixItems, } resp.Main = d.Main diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index 44636535..5abf902f 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -15,10 +15,11 @@ type CreateDto struct { MedicineMix_Id *uint `json:"medicineMix_id"` Frequency *uint16 `json:"frequency"` Dose float64 `json:"dose"` - Usage float64 `json:"usage"` + Usage string `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` IntervalMultiplier *uint16 `json:"intervalMultiplier"` + Quantity float64 `json:"quantity"` } type ReadListDto struct { diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 035577df..8d9ea44d 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -142,6 +142,7 @@ func createMedication(encounter_id uint, event *pl.Event, tx *gorm.DB) error { medicationCreate := em.CreateDto{ Encounter_Id: &encounter_id, IssuedAt: pu.GetTimeNow(), + Status_Code: erc.DSCNew, } medication, err := um.CreateData(medicationCreate, event, tx) if err != nil { @@ -168,7 +169,8 @@ func createMedicineMixAndItem(input emi.MedicineMix, event *pl.Event, tx *gorm.D pl.SetLogInfo(event, nil, "started", "createMedicineMix") medicineMixCreate := emi.CreateDto{ - Name: input.Name, + Name: input.Name, + Uom_Code: input.Uom_Code, } medicineMix, err := umi.CreateData(medicineMixCreate, event, tx) if err != 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 c3c07b36..aa3833d9 100644 --- a/internal/use-case/main-use-case/medication-item/helper.go +++ b/internal/use-case/main-use-case/medication-item/helper.go @@ -21,8 +21,12 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicationItem) { data.IsMix = inputSrc.IsMix data.Medicine_Id = inputSrc.Medicine_Id data.MedicineMix_Id = inputSrc.MedicineMix_Id + data.Frequency = inputSrc.Frequency + data.Dose = inputSrc.Dose data.Usage = inputSrc.Usage data.Interval = inputSrc.Interval data.IntervalUnit_Code = inputSrc.IntervalUnit_Code data.IsRedeemed = inputSrc.IsRedeemed + data.Quantity = inputSrc.Quantity + data.Note = inputSrc.Note } diff --git a/internal/use-case/main-use-case/medicine-mix/helper.go b/internal/use-case/main-use-case/medicine-mix/helper.go index bd0892e0..1427fa49 100644 --- a/internal/use-case/main-use-case/medicine-mix/helper.go +++ b/internal/use-case/main-use-case/medicine-mix/helper.go @@ -18,4 +18,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicineMix) { } data.Name = inputSrc.Name + data.Uom_Code = inputSrc.Uom_Code } diff --git a/internal/use-case/main-use-case/prescription-item/case.go b/internal/use-case/main-use-case/prescription-item/case.go index a6dd7be1..c068344d 100644 --- a/internal/use-case/main-use-case/prescription-item/case.go +++ b/internal/use-case/main-use-case/prescription-item/case.go @@ -35,6 +35,8 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + input.Quantity = countQty(input) + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { 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 47efc3f9..3f627ddf 100644 --- a/internal/use-case/main-use-case/prescription-item/helper.go +++ b/internal/use-case/main-use-case/prescription-item/helper.go @@ -21,8 +21,17 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PrescriptionItem) { data.IsMix = inputSrc.IsMix data.Medicine_Id = inputSrc.Medicine_Id data.MedicineMix_Id = inputSrc.MedicineMix_Id + data.Frequency = inputSrc.Frequency + data.Dose = inputSrc.Dose data.Usage = inputSrc.Usage data.Interval = inputSrc.Interval data.IntervalUnit_Code = inputSrc.IntervalUnit_Code data.Quantity = inputSrc.Quantity } + +func countQty(input e.CreateDto) float64 { + if input.Frequency != nil && input.Dose != 0 && input.IntervalMultiplier != nil { + return (float64(*input.Frequency) * float64(input.Dose)) * float64(*input.IntervalMultiplier) + } + return 0 +} diff --git a/internal/use-case/main-use-case/prescription/helper.go b/internal/use-case/main-use-case/prescription/helper.go index 7c61469b..ee0b23b3 100644 --- a/internal/use-case/main-use-case/prescription/helper.go +++ b/internal/use-case/main-use-case/prescription/helper.go @@ -85,7 +85,8 @@ func createMedicineMixAndItem(input emi.MedicineMix, event *pl.Event, tx *gorm.D pl.SetLogInfo(event, nil, "started", "createMedicineMix") medicineMixCreate := emi.CreateDto{ - Name: input.Name, + Name: input.Name, + Uom_Code: input.Uom_Code, } medicineMix, err := umi.CreateData(medicineMixCreate, event, tx) if err != nil { @@ -116,6 +117,8 @@ func createMedicationItem(medication_id uint, input epi.PrescriptionItem, event IsMix: input.IsMix, Medicine_Id: input.Medicine_Id, MedicineMix_Id: input.MedicineMix_Id, + Frequency: input.Frequency, + Dose: input.Dose, Usage: input.Usage, Interval: input.Interval, IntervalUnit_Code: input.IntervalUnit_Code, From 74acd328bcaeabe27efdd3b9bfd612f3f0ce4bd9 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 30 Sep 2025 18:53:42 +0700 Subject: [PATCH 062/190] add validation --- internal/domain/main-entities/prescription-item/dto.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index 5abf902f..4c278b6f 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -13,12 +13,12 @@ type CreateDto struct { IsMix bool `json:"isMix"` Medicine_Id *uint `json:"medicine_id"` MedicineMix_Id *uint `json:"medicineMix_id"` - Frequency *uint16 `json:"frequency"` - Dose float64 `json:"dose"` + Frequency *uint16 `json:"frequency" validate:"required"` + Dose float64 `json:"dose" validate:"required"` Usage string `json:"usage"` Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` - IntervalMultiplier *uint16 `json:"intervalMultiplier"` + IntervalMultiplier *uint16 `json:"intervalMultiplier" validate:"required"` Quantity float64 `json:"quantity"` } From c90529c847a51bbcc1bb38f43b63d557659a94a8 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 30 Sep 2025 21:05:11 +0700 Subject: [PATCH 063/190] rename CheckupCategory_Code into McuSrcCategory_Code --- cmd/main-migration/migrations/20250930140351.sql | 4 ++++ cmd/main-migration/migrations/atlas.sum | 5 +++-- internal/domain/main-entities/mcu-src/dto.go | 10 +++++----- internal/domain/main-entities/mcu-src/entity.go | 14 +++++++------- internal/use-case/main-use-case/mcu-src/helper.go | 2 +- 5 files changed, 20 insertions(+), 15 deletions(-) create mode 100644 cmd/main-migration/migrations/20250930140351.sql diff --git a/cmd/main-migration/migrations/20250930140351.sql b/cmd/main-migration/migrations/20250930140351.sql new file mode 100644 index 00000000..c98fd12a --- /dev/null +++ b/cmd/main-migration/migrations/20250930140351.sql @@ -0,0 +1,4 @@ +-- Rename a column from "CheckupCategory_Code" to "McuSrcCategory_Code" +ALTER TABLE "public"."McuSrc" RENAME COLUMN "CheckupCategory_Code" TO "McuSrcCategory_Code"; +-- Modify "McuSrc" table +ALTER TABLE "public"."McuSrc" DROP CONSTRAINT "fk_McuSrc_CheckupCategory", ADD CONSTRAINT "fk_McuSrc_McuSrcCategory" FOREIGN KEY ("McuSrcCategory_Code") REFERENCES "public"."McuSrcCategory" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 553c25ea..4c7a0491 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:Q2e6TNVbdE4yvg1W/bZvcNzYuBjy1kIT2z0QVbyWDYY= +h1:X7LbOLpbDhciJ1O92KiWgnrVP60dDAyBKJqQKJnom+M= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -19,4 +19,5 @@ h1:Q2e6TNVbdE4yvg1W/bZvcNzYuBjy1kIT2z0QVbyWDYY= 20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= 20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= 20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:cUvQcYn+4BoID3BGn2JriESuD7WactMf/fp48EFwtAA= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:aqXw0j09+xjFqemWlo0enw3tn/IT1FMxw3oUPljkjks= diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index 56ab9f57..a4fec862 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -58,11 +58,11 @@ type ResponseDto struct { func (d McuSrc) ToResponse() ResponseDto { resp := ResponseDto{ - Code: d.Code, - Name: d.Name, - CheckupCategory_Code: d.CheckupCategory_Code, - Item_Id: d.Item_Id, - Item: d.Item, + Code: d.Code, + Name: d.Name, + // CheckupCategory_Code: d.CheckupCategory_Code, + Item_Id: d.Item_Id, + Item: d.Item, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/mcu-src/entity.go b/internal/domain/main-entities/mcu-src/entity.go index fbdb3f54..d3f4fca1 100644 --- a/internal/domain/main-entities/mcu-src/entity.go +++ b/internal/domain/main-entities/mcu-src/entity.go @@ -7,11 +7,11 @@ import ( ) type McuSrc struct { - ecore.Main // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:20"` - Name string `json:"name" gorm:"size:50"` - CheckupCategory_Code *string `json:"checkupCategory_code" gorm:"size:20"` - CheckupCategory *emsc.McuSrcCategory `json:"checkupCategory,omitempty" gorm:"foreignKey:CheckupCategory_Code;references:Code"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` + ecore.Main // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:20"` + Name string `json:"name" gorm:"size:50"` + McuSrcCategory_Code *string `json:"mcuSrcCategory_code" gorm:"size:20"` + McuSrcCategory *emsc.McuSrcCategory `json:"mcuSrcCategory,omitempty" gorm:"foreignKey:McuSrcCategory_Code;references:Code"` + Item_Id *uint `json:"item_id"` + Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` } diff --git a/internal/use-case/main-use-case/mcu-src/helper.go b/internal/use-case/main-use-case/mcu-src/helper.go index 820dbfa7..abe07378 100644 --- a/internal/use-case/main-use-case/mcu-src/helper.go +++ b/internal/use-case/main-use-case/mcu-src/helper.go @@ -19,5 +19,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuSrc) { data.Code = inputSrc.Code data.Name = inputSrc.Name - data.CheckupCategory_Code = inputSrc.CheckupCategory_Code + // data.CheckupCategory_Code = inputSrc.CheckupCategory_Code } From c7242536c96bef48deda673d73219d6e2685316e Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 30 Sep 2025 21:10:04 +0700 Subject: [PATCH 064/190] feat (mcu-src): adjust after renaming CheckupCategory_code --- internal/domain/main-entities/mcu-src/dto.go | 34 +++++++++---------- .../use-case/main-use-case/mcu-src/helper.go | 29 +++++++++++++++- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index 63c45d51..7aa6c7e6 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -6,10 +6,10 @@ import ( ) type CreateDto struct { - Code string `json:"code" validate:"maxLength=20"` - Name string `json:"name" validate:"maxLength=50"` - CheckupCategory_Code *string `json:"checkupCategory_code" validate:"maxLength=20"` - Item_Id *uint `json:"item_id"` + Code string `json:"code" validate:"maxLength=20"` + Name string `json:"name" validate:"maxLength=50"` + McuSrcCategory_Code *string `json:"mcuSrcCategory_code" validate:"maxLength=20"` + Item_Id *uint `json:"item_id"` } type ReadListDto struct { @@ -19,9 +19,9 @@ type ReadListDto struct { } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` - CheckupCategory_Code *string `json:"checkupCategory_code"` + Code string `json:"code"` + Name string `json:"name"` + McuSrcCategory_Code *string `json:"mcuSrcCategory_code"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -50,20 +50,20 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Code string `json:"code"` - Name string `json:"name"` - CheckupCategory_Code *string `json:"checkupCategory_code"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty"` + Code string `json:"code"` + Name string `json:"name"` + McuSrcCategory_Code *string `json:"mcuSrcCategory_code"` + Item_Id *uint `json:"item_id"` + Item *ei.Item `json:"item,omitempty"` } func (d McuSrc) ToResponse() ResponseDto { resp := ResponseDto{ - Code: d.Code, - Name: d.Name, - // CheckupCategory_Code: d.CheckupCategory_Code, - Item_Id: d.Item_Id, - Item: d.Item, + Code: d.Code, + Name: d.Name, + McuSrcCategory_Code: d.McuSrcCategory_Code, + Item_Id: d.Item_Id, + Item: d.Item, } resp.Main = d.Main return resp diff --git a/internal/use-case/main-use-case/mcu-src/helper.go b/internal/use-case/main-use-case/mcu-src/helper.go index abe07378..9d808ca8 100644 --- a/internal/use-case/main-use-case/mcu-src/helper.go +++ b/internal/use-case/main-use-case/mcu-src/helper.go @@ -5,7 +5,17 @@ Any functions that are used internally by the use-case package mcusrc import ( + ei "simrs-vx/internal/domain/main-entities/item" e "simrs-vx/internal/domain/main-entities/mcu-src" + + ui "simrs-vx/internal/use-case/main-use-case/item" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + ero "simrs-vx/internal/domain/references/organization" + + "gorm.io/gorm" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuSrc) { @@ -19,5 +29,22 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuSrc) { data.Code = inputSrc.Code data.Name = inputSrc.Name - // data.CheckupCategory_Code = inputSrc.CheckupCategory_Code + data.McuSrcCategory_Code = inputSrc.McuSrcCategory_Code +} + +func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { + itemCreate := ei.CreateDto{ + Code: pu.AddPrefix("mcu-", input.Code), + Name: input.Name, + ItemGroup_Code: ero.ITGCMCU, + // Uom_Code: &input.Uom_Code, + // Infra_Id: input.Infra_Id, + } + item, err := ui.CreateData(itemCreate, event, tx) + if err != nil { + return err + } + + input.Item_Id = &item.Id + return nil } From d3bca381043f53123887c0b36dff409924cc4c91 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 30 Sep 2025 21:20:32 +0700 Subject: [PATCH 065/190] feat (medication-item): add qty calculation if intervalMultiplier is not nil --- .../main-entities/medication-item/dto.go | 25 ++++++++++--------- .../main-use-case/medication-item/helper.go | 11 ++++++++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go index c90be314..a43473d2 100644 --- a/internal/domain/main-entities/medication-item/dto.go +++ b/internal/domain/main-entities/medication-item/dto.go @@ -9,18 +9,19 @@ import ( ) type CreateDto struct { - Medication_Id *uint `json:"medication_id"` - IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - MedicineMix_Id *uint `json:"medicineMix_id"` - Frequency *uint16 `json:"frequency"` - Dose float64 `json:"dose"` - Usage string `json:"usage"` - 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"` + Medication_Id *uint `json:"medication_id"` + IsMix bool `json:"isMix"` + Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix_id"` + Frequency *uint16 `json:"frequency"` + Dose float64 `json:"dose"` + Usage string `json:"usage"` + 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"` + IntervalMultiplier *uint16 `json:"intervalMultiplier"` } type ReadListDto struct { 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 aa3833d9..dcee2cac 100644 --- a/internal/use-case/main-use-case/medication-item/helper.go +++ b/internal/use-case/main-use-case/medication-item/helper.go @@ -29,4 +29,15 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicationItem) { data.IsRedeemed = inputSrc.IsRedeemed data.Quantity = inputSrc.Quantity data.Note = inputSrc.Note + + if inputSrc.IntervalMultiplier != nil { + data.Quantity = countQty(*inputSrc) + } +} + +func countQty(input e.CreateDto) float64 { + if input.Frequency != nil && input.Dose != 0 && input.IntervalMultiplier != nil { + return (float64(*input.Frequency) * float64(input.Dose)) * float64(*input.IntervalMultiplier) + } + return 0 } From 8efc2a2c3cfa3987e9d81448a1c5eed827f6a01b Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 1 Oct 2025 09:42:28 +0700 Subject: [PATCH 066/190] add search on several data source --- internal/domain/main-entities/medicine/dto.go | 1 + internal/domain/main-entities/specialist/dto.go | 1 + internal/domain/main-entities/subspecialist/dto.go | 1 + internal/domain/main-entities/unit/dto.go | 1 + internal/use-case/main-use-case/medicine/lib.go | 4 ++++ internal/use-case/main-use-case/specialist/lib.go | 4 ++++ internal/use-case/main-use-case/subspecialist/lib.go | 4 ++++ internal/use-case/main-use-case/unit/lib.go | 4 ++++ pkg/lib-helper/lib-helper.go | 9 +++++++++ 9 files changed, 29 insertions(+) create mode 100644 pkg/lib-helper/lib-helper.go diff --git a/internal/domain/main-entities/medicine/dto.go b/internal/domain/main-entities/medicine/dto.go index 9e63c9ae..df45de8f 100644 --- a/internal/domain/main-entities/medicine/dto.go +++ b/internal/domain/main-entities/medicine/dto.go @@ -25,6 +25,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index ac10b720..01b004e0 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go index cf387146..ef3178d8 100644 --- a/internal/domain/main-entities/subspecialist/dto.go +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go index e3521eb5..ff082dc7 100644 --- a/internal/domain/main-entities/unit/dto.go +++ b/internal/domain/main-entities/unit/dto.go @@ -15,6 +15,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/use-case/main-use-case/medicine/lib.go b/internal/use-case/main-use-case/medicine/lib.go index ce894baa..40fe2c13 100644 --- a/internal/use-case/main-use-case/medicine/lib.go +++ b/internal/use-case/main-use-case/medicine/lib.go @@ -2,6 +2,8 @@ package medicine import ( e "simrs-vx/internal/domain/main-entities/medicine" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -57,6 +59,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Medicine{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/specialist/lib.go b/internal/use-case/main-use-case/specialist/lib.go index 206682e0..32378daf 100644 --- a/internal/use-case/main-use-case/specialist/lib.go +++ b/internal/use-case/main-use-case/specialist/lib.go @@ -2,6 +2,8 @@ package specialist import ( e "simrs-vx/internal/domain/main-entities/specialist" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -57,6 +59,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Specialist{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/subspecialist/lib.go b/internal/use-case/main-use-case/subspecialist/lib.go index 5d879b1e..3753cc8d 100644 --- a/internal/use-case/main-use-case/subspecialist/lib.go +++ b/internal/use-case/main-use-case/subspecialist/lib.go @@ -2,6 +2,8 @@ package subspecialist import ( e "simrs-vx/internal/domain/main-entities/subspecialist" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -57,6 +59,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Su } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Subspecialist{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/unit/lib.go b/internal/use-case/main-use-case/unit/lib.go index 9be91f11..24f49256 100644 --- a/internal/use-case/main-use-case/unit/lib.go +++ b/internal/use-case/main-use-case/unit/lib.go @@ -2,6 +2,8 @@ package unit import ( e "simrs-vx/internal/domain/main-entities/unit" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -57,6 +59,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Unit{}). Preload("Installation"). diff --git a/pkg/lib-helper/lib-helper.go b/pkg/lib-helper/lib-helper.go new file mode 100644 index 00000000..d5274847 --- /dev/null +++ b/pkg/lib-helper/lib-helper.go @@ -0,0 +1,9 @@ +package libhelper + +import "gorm.io/gorm" + +func SearchCodeOrName(search string, tx *gorm.DB) { + if search != "" { + tx.Where("\"Code\" LIKE ? OR \"Name\" LIKE ?", "%"+search+"%", "%"+search+"%") + } +} From ec4e624cbde3a8f9872e97e609594882cd2b231f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 1 Oct 2025 11:14:02 +0700 Subject: [PATCH 067/190] update libhelper on case sensitive --- pkg/lib-helper/lib-helper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/lib-helper/lib-helper.go b/pkg/lib-helper/lib-helper.go index d5274847..c0d8e05d 100644 --- a/pkg/lib-helper/lib-helper.go +++ b/pkg/lib-helper/lib-helper.go @@ -4,6 +4,6 @@ import "gorm.io/gorm" func SearchCodeOrName(search string, tx *gorm.DB) { if search != "" { - tx.Where("\"Code\" LIKE ? OR \"Name\" LIKE ?", "%"+search+"%", "%"+search+"%") + tx.Where("\"Code\" ILIKE ? OR \"Name\" ILIKE ?", "%"+search+"%", "%"+search+"%") } } From 92d4fb8d3888bb84b8f5e1c1ba5ff39aa342326b Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Wed, 1 Oct 2025 11:27:32 +0700 Subject: [PATCH 068/190] migration from server --- cmd/main-migration/atlas.hcl | 7 ++-- cmd/main-migration/migrations/atlas.sum | 46 ++++++++++++------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/cmd/main-migration/atlas.hcl b/cmd/main-migration/atlas.hcl index 3372fb2d..163119d3 100644 --- a/cmd/main-migration/atlas.hcl +++ b/cmd/main-migration/atlas.hcl @@ -9,14 +9,15 @@ data "external_schema" "gorm" { env "gorm" { src = data.external_schema.gorm.url - dev = "postgres://moko:password@localhost:5432/simrs_vx3?sslmode=disable" + dev = "postgres://simrs:p@ssw0rd@localhost:5432/simrs-diff-01?sslmode=disable" migration { dir = "file://migrations" } - url = "postgres://moko:password@localhost:5432/simrs_vx1?sslmode=disable" + url = "postgres://simrs:p@ssw0rd@localhost:5432/simrs-01?sslmode=disable" format { migrate { diff = "{{ sql . \" \" }}" } } -} \ No newline at end of file +} + diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 4c7a0491..3c24d36a 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,23 +1,23 @@ -h1:X7LbOLpbDhciJ1O92KiWgnrVP60dDAyBKJqQKJnom+M= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:aqXw0j09+xjFqemWlo0enw3tn/IT1FMxw3oUPljkjks= +h1:NqZplHE9s3i2A3OK3OMBOTHfYgRfb+1HyZLBfS9SLeM= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= From af090ed7c12985d4d98ed96eac20293ef9db79dc Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 1 Oct 2025 16:04:10 +0700 Subject: [PATCH 069/190] feat: improve error handling on create and add search for objects with code and name --- go.mod | 2 +- internal/domain/main-entities/device/dto.go | 1 + internal/domain/main-entities/ethnic/dto.go | 5 +- internal/domain/main-entities/language/dto.go | 5 +- internal/domain/main-entities/material/dto.go | 1 + internal/domain/main-entities/mcu-src/dto.go | 1 + .../domain/main-entities/mcu-sub-src/dto.go | 1 + .../main-entities/medical-action-src/dto.go | 1 + .../domain/main-entities/procedure-src/dto.go | 1 + internal/domain/main-entities/uom/dto.go | 5 +- internal/use-case/main-use-case/adime/lib.go | 10 ++-- .../use-case/main-use-case/ambulatory/lib.go | 10 ++-- .../main-use-case/consultation/lib.go | 10 ++-- .../use-case/main-use-case/counter/lib.go | 10 ++-- .../main-use-case/device-order-item/lib.go | 10 ++-- .../main-use-case/device-order/lib.go | 10 ++-- internal/use-case/main-use-case/device/lib.go | 12 ++--- .../main-use-case/diagnose-src/lib.go | 10 ++-- .../use-case/main-use-case/district/lib.go | 10 ++-- .../main-use-case/division-position/lib.go | 10 ++-- .../use-case/main-use-case/division/lib.go | 10 ++-- .../use-case/main-use-case/doctor-fee/lib.go | 10 ++-- internal/use-case/main-use-case/doctor/lib.go | 10 ++-- .../use-case/main-use-case/emergency/lib.go | 10 ++-- .../use-case/main-use-case/employee/lib.go | 10 ++-- .../use-case/main-use-case/encounter/lib.go | 10 ++-- internal/use-case/main-use-case/ethnic/lib.go | 12 ++--- internal/use-case/main-use-case/infra/lib.go | 10 ++-- .../use-case/main-use-case/inpatient/lib.go | 10 ++-- .../main-use-case/installation/lib.go | 10 ++-- .../main-use-case/insurance-company/lib.go | 10 ++-- .../use-case/main-use-case/item-price/lib.go | 10 ++-- internal/use-case/main-use-case/item/lib.go | 10 ++-- .../use-case/main-use-case/laborant/lib.go | 10 ++-- .../use-case/main-use-case/language/lib.go | 12 ++--- .../main-use-case/material-order-item/lib.go | 10 ++-- .../main-use-case/material-order/lib.go | 10 ++-- .../use-case/main-use-case/material/lib.go | 12 ++--- .../main-use-case/mcu-order-item/lib.go | 10 ++-- .../main-use-case/mcu-order-sub-item/lib.go | 10 ++-- .../use-case/main-use-case/mcu-order/lib.go | 10 ++-- .../main-use-case/mcu-src-category/lib.go | 10 ++-- .../use-case/main-use-case/mcu-src/lib.go | 12 ++--- .../use-case/main-use-case/mcu-sub-src/lib.go | 12 ++--- .../medical-action-src-item/lib.go | 10 ++-- .../main-use-case/medical-action-src/lib.go | 12 ++--- .../main-use-case/medication-item-dist/lib.go | 10 ++-- .../main-use-case/medication-item/lib.go | 10 ++-- .../use-case/main-use-case/medication/lib.go | 10 ++-- .../main-use-case/medicine-group/lib.go | 10 ++-- .../main-use-case/medicine-method/lib.go | 10 ++-- .../main-use-case/medicine-mix-item/lib.go | 10 ++-- .../main-use-case/medicine-mix/lib.go | 10 ++-- .../use-case/main-use-case/medicine/lib.go | 8 +-- internal/use-case/main-use-case/nurse/lib.go | 10 ++-- .../main-use-case/nutritionist/lib.go | 10 ++-- .../use-case/main-use-case/patient/lib.go | 10 ++-- .../main-use-case/person-address/lib.go | 10 ++-- .../main-use-case/person-contact/lib.go | 10 ++-- .../main-use-case/person-relative/lib.go | 10 ++-- internal/use-case/main-use-case/person/lib.go | 13 ++--- .../use-case/main-use-case/pharmacist/lib.go | 10 ++-- .../main-use-case/pharmacy-company/lib.go | 10 ++-- .../main-use-case/practice-schedule/lib.go | 10 ++-- .../main-use-case/prescription-item/lib.go | 10 ++-- .../main-use-case/prescription/lib.go | 10 ++-- .../main-use-case/procedure-src/lib.go | 12 ++--- .../use-case/main-use-case/province/lib.go | 10 ++-- .../use-case/main-use-case/regency/lib.go | 10 ++-- internal/use-case/main-use-case/room/lib.go | 10 ++-- internal/use-case/main-use-case/sbar/lib.go | 10 ++-- internal/use-case/main-use-case/soapi/lib.go | 10 ++-- .../main-use-case/specialist-intern/lib.go | 10 ++-- .../use-case/main-use-case/specialist/lib.go | 8 +-- .../main-use-case/subspecialist/lib.go | 8 +-- internal/use-case/main-use-case/unit/lib.go | 8 +-- internal/use-case/main-use-case/uom/lib.go | 12 ++--- internal/use-case/main-use-case/user/lib.go | 10 ++-- .../use-case/main-use-case/village/lib.go | 10 ++-- pkg/lib-helper/lib-helper.go | 51 ++++++++++++++++++- 80 files changed, 285 insertions(+), 492 deletions(-) diff --git a/go.mod b/go.mod index d05acad5..18b17db3 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( ariga.io/atlas-provider-gorm v0.5.6 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/google/uuid v1.6.0 + github.com/jackc/pgx/v5 v5.5.5 github.com/karincake/apem v0.0.17 github.com/karincake/dodol v0.0.1 github.com/karincake/getuk v0.1.0 @@ -34,7 +35,6 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect - github.com/jackc/pgx/v5 v5.5.5 // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect diff --git a/internal/domain/main-entities/device/dto.go b/internal/domain/main-entities/device/dto.go index dcc115c6..c7a386cd 100644 --- a/internal/domain/main-entities/device/dto.go +++ b/internal/domain/main-entities/device/dto.go @@ -19,6 +19,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/domain/main-entities/ethnic/dto.go b/internal/domain/main-entities/ethnic/dto.go index 8b14fde1..ff0d41a4 100644 --- a/internal/domain/main-entities/ethnic/dto.go +++ b/internal/domain/main-entities/ethnic/dto.go @@ -10,8 +10,9 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search"` Page int `json:"page"` PageSize int `json:"page_size"` diff --git a/internal/domain/main-entities/language/dto.go b/internal/domain/main-entities/language/dto.go index 563b5205..7d2e7239 100644 --- a/internal/domain/main-entities/language/dto.go +++ b/internal/domain/main-entities/language/dto.go @@ -10,8 +10,9 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search"` Page int `json:"page"` PageSize int `json:"page_size"` diff --git a/internal/domain/main-entities/material/dto.go b/internal/domain/main-entities/material/dto.go index 9ae830f9..627d49c1 100644 --- a/internal/domain/main-entities/material/dto.go +++ b/internal/domain/main-entities/material/dto.go @@ -20,6 +20,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index 7aa6c7e6..e64c0d5d 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -16,6 +16,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go index a6d0a804..a112b3c4 100644 --- a/internal/domain/main-entities/mcu-sub-src/dto.go +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -17,6 +17,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index e902a1e8..6480e732 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -15,6 +15,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { diff --git a/internal/domain/main-entities/procedure-src/dto.go b/internal/domain/main-entities/procedure-src/dto.go index 8dd97f1e..687fbad6 100644 --- a/internal/domain/main-entities/procedure-src/dto.go +++ b/internal/domain/main-entities/procedure-src/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` IndName string `json:"indName"` + Search string `json:"search"` Page int `json:"page"` PageSize int `json:"page_size"` diff --git a/internal/domain/main-entities/uom/dto.go b/internal/domain/main-entities/uom/dto.go index 348fb7fd..58ea2554 100644 --- a/internal/domain/main-entities/uom/dto.go +++ b/internal/domain/main-entities/uom/dto.go @@ -10,8 +10,9 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search"` Page int `json:"page"` PageSize int `json:"page_size"` diff --git a/internal/use-case/main-use-case/adime/lib.go b/internal/use-case/main-use-case/adime/lib.go index 851dfa4f..5b0574fe 100644 --- a/internal/use-case/main-use-case/adime/lib.go +++ b/internal/use-case/main-use-case/adime/lib.go @@ -2,6 +2,8 @@ package adime import ( e "simrs-vx/internal/domain/main-entities/adime" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Adime, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/ambulatory/lib.go b/internal/use-case/main-use-case/ambulatory/lib.go index 86d4fb06..2a68a980 100644 --- a/internal/use-case/main-use-case/ambulatory/lib.go +++ b/internal/use-case/main-use-case/ambulatory/lib.go @@ -2,6 +2,8 @@ package ambulatory import ( e "simrs-vx/internal/domain/main-entities/ambulatory" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Ambulat } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/consultation/lib.go b/internal/use-case/main-use-case/consultation/lib.go index 08d034d3..2cb2753b 100644 --- a/internal/use-case/main-use-case/consultation/lib.go +++ b/internal/use-case/main-use-case/consultation/lib.go @@ -2,6 +2,8 @@ package consultation import ( e "simrs-vx/internal/domain/main-entities/consultation" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Consult } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/counter/lib.go b/internal/use-case/main-use-case/counter/lib.go index bfb0ee05..1a28e29a 100644 --- a/internal/use-case/main-use-case/counter/lib.go +++ b/internal/use-case/main-use-case/counter/lib.go @@ -2,6 +2,8 @@ package counter import ( e "simrs-vx/internal/domain/main-entities/counter" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Counter } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/device-order-item/lib.go b/internal/use-case/main-use-case/device-order-item/lib.go index ab36a7a1..5861f403 100644 --- a/internal/use-case/main-use-case/device-order-item/lib.go +++ b/internal/use-case/main-use-case/device-order-item/lib.go @@ -2,6 +2,8 @@ package deviceorderitem import ( e "simrs-vx/internal/domain/main-entities/device-order-item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.DeviceO } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/device-order/lib.go b/internal/use-case/main-use-case/device-order/lib.go index 20f344c3..d8a9c8f3 100644 --- a/internal/use-case/main-use-case/device-order/lib.go +++ b/internal/use-case/main-use-case/device-order/lib.go @@ -2,6 +2,8 @@ package deviceorder import ( e "simrs-vx/internal/domain/main-entities/device-order" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.DeviceO } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/device/lib.go b/internal/use-case/main-use-case/device/lib.go index af8f9f80..c606b645 100644 --- a/internal/use-case/main-use-case/device/lib.go +++ b/internal/use-case/main-use-case/device/lib.go @@ -2,6 +2,8 @@ package device import ( e "simrs-vx/internal/domain/main-entities/device" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Device, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -57,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Device{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/diagnose-src/lib.go b/internal/use-case/main-use-case/diagnose-src/lib.go index 1377c682..c572a35d 100644 --- a/internal/use-case/main-use-case/diagnose-src/lib.go +++ b/internal/use-case/main-use-case/diagnose-src/lib.go @@ -2,6 +2,8 @@ package diagnosesrc import ( e "simrs-vx/internal/domain/main-entities/diagnose-src" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Diagnos } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/district/lib.go b/internal/use-case/main-use-case/district/lib.go index 6911f4b3..26f6cf07 100644 --- a/internal/use-case/main-use-case/district/lib.go +++ b/internal/use-case/main-use-case/district/lib.go @@ -2,6 +2,8 @@ package district import ( e "simrs-vx/internal/domain/main-entities/district" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Distric } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/division-position/lib.go b/internal/use-case/main-use-case/division-position/lib.go index 6106f478..322e5593 100644 --- a/internal/use-case/main-use-case/division-position/lib.go +++ b/internal/use-case/main-use-case/division-position/lib.go @@ -2,6 +2,8 @@ package divisionposition import ( e "simrs-vx/internal/domain/main-entities/division-position" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Divisio } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index 64c58004..4a3c71b9 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -2,6 +2,8 @@ package division import ( e "simrs-vx/internal/domain/main-entities/division" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Divisio } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/doctor-fee/lib.go b/internal/use-case/main-use-case/doctor-fee/lib.go index 2f96d1ab..17c8a86d 100644 --- a/internal/use-case/main-use-case/doctor-fee/lib.go +++ b/internal/use-case/main-use-case/doctor-fee/lib.go @@ -2,6 +2,8 @@ package doctorfee import ( e "simrs-vx/internal/domain/main-entities/doctor-fee" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.DoctorF } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/doctor/lib.go b/internal/use-case/main-use-case/doctor/lib.go index 432254fe..859a2bd6 100644 --- a/internal/use-case/main-use-case/doctor/lib.go +++ b/internal/use-case/main-use-case/doctor/lib.go @@ -2,6 +2,8 @@ package doctor import ( e "simrs-vx/internal/domain/main-entities/doctor" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Doctor, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/emergency/lib.go b/internal/use-case/main-use-case/emergency/lib.go index a1762d3e..414deba7 100644 --- a/internal/use-case/main-use-case/emergency/lib.go +++ b/internal/use-case/main-use-case/emergency/lib.go @@ -2,6 +2,8 @@ package emergency import ( e "simrs-vx/internal/domain/main-entities/emergency" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Emergen } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/employee/lib.go b/internal/use-case/main-use-case/employee/lib.go index 594ce040..020328b5 100644 --- a/internal/use-case/main-use-case/employee/lib.go +++ b/internal/use-case/main-use-case/employee/lib.go @@ -2,6 +2,8 @@ package employee import ( e "simrs-vx/internal/domain/main-entities/employee" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -25,13 +27,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Employe } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index 108b298a..bfc62fdc 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -2,6 +2,8 @@ package encounter import ( e "simrs-vx/internal/domain/main-entities/encounter" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Encount } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/ethnic/lib.go b/internal/use-case/main-use-case/ethnic/lib.go index 353618ef..716da183 100644 --- a/internal/use-case/main-use-case/ethnic/lib.go +++ b/internal/use-case/main-use-case/ethnic/lib.go @@ -2,6 +2,8 @@ package ethnic import ( e "simrs-vx/internal/domain/main-entities/ethnic" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Ethnic, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -51,6 +47,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Et tx = dg.I } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Ethnic{}). Scopes(gh.Filter(input)). diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index 56e528fb..c733ca39 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -2,6 +2,8 @@ package infra import ( e "simrs-vx/internal/domain/main-entities/infra" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Infra, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/inpatient/lib.go b/internal/use-case/main-use-case/inpatient/lib.go index f7b49d8a..f70b2add 100644 --- a/internal/use-case/main-use-case/inpatient/lib.go +++ b/internal/use-case/main-use-case/inpatient/lib.go @@ -2,6 +2,8 @@ package inpatient import ( e "simrs-vx/internal/domain/main-entities/inpatient" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Inpatie } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/installation/lib.go b/internal/use-case/main-use-case/installation/lib.go index 5fa5bbf9..c8e3d2aa 100644 --- a/internal/use-case/main-use-case/installation/lib.go +++ b/internal/use-case/main-use-case/installation/lib.go @@ -2,6 +2,8 @@ package installation import ( e "simrs-vx/internal/domain/main-entities/installation" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Install } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/insurance-company/lib.go b/internal/use-case/main-use-case/insurance-company/lib.go index 95d004b5..4dc5bb6f 100644 --- a/internal/use-case/main-use-case/insurance-company/lib.go +++ b/internal/use-case/main-use-case/insurance-company/lib.go @@ -2,6 +2,8 @@ package insurancecompany import ( e "simrs-vx/internal/domain/main-entities/insurance-company" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Insuran } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/item-price/lib.go b/internal/use-case/main-use-case/item-price/lib.go index 6e3a8d5c..32b387ea 100644 --- a/internal/use-case/main-use-case/item-price/lib.go +++ b/internal/use-case/main-use-case/item-price/lib.go @@ -2,6 +2,8 @@ package itemprice import ( e "simrs-vx/internal/domain/main-entities/item-price" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ItemPri } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/item/lib.go b/internal/use-case/main-use-case/item/lib.go index ed1eb3b8..c5b937ce 100644 --- a/internal/use-case/main-use-case/item/lib.go +++ b/internal/use-case/main-use-case/item/lib.go @@ -2,6 +2,8 @@ package item import ( e "simrs-vx/internal/domain/main-entities/item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Item, e } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/laborant/lib.go b/internal/use-case/main-use-case/laborant/lib.go index 0802f601..a02889bb 100644 --- a/internal/use-case/main-use-case/laborant/lib.go +++ b/internal/use-case/main-use-case/laborant/lib.go @@ -2,6 +2,8 @@ package laborant import ( e "simrs-vx/internal/domain/main-entities/laborant" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Laboran } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/language/lib.go b/internal/use-case/main-use-case/language/lib.go index d44689d4..24544b3f 100644 --- a/internal/use-case/main-use-case/language/lib.go +++ b/internal/use-case/main-use-case/language/lib.go @@ -2,6 +2,8 @@ package language import ( e "simrs-vx/internal/domain/main-entities/language" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Languag } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -51,6 +47,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La tx = dg.I } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Language{}). Scopes(gh.Filter(input)). diff --git a/internal/use-case/main-use-case/material-order-item/lib.go b/internal/use-case/main-use-case/material-order-item/lib.go index 4daf147c..121d2360 100644 --- a/internal/use-case/main-use-case/material-order-item/lib.go +++ b/internal/use-case/main-use-case/material-order-item/lib.go @@ -2,6 +2,8 @@ package materialorderitem import ( e "simrs-vx/internal/domain/main-entities/material-order-item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Materia } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/material-order/lib.go b/internal/use-case/main-use-case/material-order/lib.go index 135aaf54..333628c2 100644 --- a/internal/use-case/main-use-case/material-order/lib.go +++ b/internal/use-case/main-use-case/material-order/lib.go @@ -2,6 +2,8 @@ package materialorder import ( e "simrs-vx/internal/domain/main-entities/material-order" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Materia } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/material/lib.go b/internal/use-case/main-use-case/material/lib.go index c74f7b6c..b4b32440 100644 --- a/internal/use-case/main-use-case/material/lib.go +++ b/internal/use-case/main-use-case/material/lib.go @@ -2,6 +2,8 @@ package material import ( e "simrs-vx/internal/domain/main-entities/material" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Materia } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -57,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Material{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/mcu-order-item/lib.go b/internal/use-case/main-use-case/mcu-order-item/lib.go index 40ebf33d..3fab2d62 100644 --- a/internal/use-case/main-use-case/mcu-order-item/lib.go +++ b/internal/use-case/main-use-case/mcu-order-item/lib.go @@ -2,6 +2,8 @@ package mcuorderitem import ( e "simrs-vx/internal/domain/main-entities/mcu-order-item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrde } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/lib.go b/internal/use-case/main-use-case/mcu-order-sub-item/lib.go index edfee9cd..45b45645 100644 --- a/internal/use-case/main-use-case/mcu-order-sub-item/lib.go +++ b/internal/use-case/main-use-case/mcu-order-sub-item/lib.go @@ -2,6 +2,8 @@ package mcuordersubitem import ( e "simrs-vx/internal/domain/main-entities/mcu-order-sub-item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrde } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/mcu-order/lib.go b/internal/use-case/main-use-case/mcu-order/lib.go index 048e6129..b269e559 100644 --- a/internal/use-case/main-use-case/mcu-order/lib.go +++ b/internal/use-case/main-use-case/mcu-order/lib.go @@ -2,6 +2,8 @@ package mcuorder import ( e "simrs-vx/internal/domain/main-entities/mcu-order" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuOrde } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/mcu-src-category/lib.go b/internal/use-case/main-use-case/mcu-src-category/lib.go index aea54986..aef1fcf5 100644 --- a/internal/use-case/main-use-case/mcu-src-category/lib.go +++ b/internal/use-case/main-use-case/mcu-src-category/lib.go @@ -2,6 +2,8 @@ package mcusrccategory import ( e "simrs-vx/internal/domain/main-entities/mcu-src-category" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuSrcC } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/mcu-src/lib.go b/internal/use-case/main-use-case/mcu-src/lib.go index 36a1a604..246c4ccf 100644 --- a/internal/use-case/main-use-case/mcu-src/lib.go +++ b/internal/use-case/main-use-case/mcu-src/lib.go @@ -2,6 +2,8 @@ package mcusrc import ( e "simrs-vx/internal/domain/main-entities/mcu-src" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuSrc, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -57,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.McuSrc{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/mcu-sub-src/lib.go b/internal/use-case/main-use-case/mcu-sub-src/lib.go index 711dabdd..43433380 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/lib.go +++ b/internal/use-case/main-use-case/mcu-sub-src/lib.go @@ -2,6 +2,8 @@ package mcusubsrc import ( e "simrs-vx/internal/domain/main-entities/mcu-sub-src" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.McuSubS } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -57,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.McuSubSrc{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/medical-action-src-item/lib.go b/internal/use-case/main-use-case/medical-action-src-item/lib.go index 50f7cecd..20fc526d 100644 --- a/internal/use-case/main-use-case/medical-action-src-item/lib.go +++ b/internal/use-case/main-use-case/medical-action-src-item/lib.go @@ -2,6 +2,8 @@ package medicalactionsrcitem import ( e "simrs-vx/internal/domain/main-entities/medical-action-src-item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medical } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medical-action-src/lib.go b/internal/use-case/main-use-case/medical-action-src/lib.go index 1446b759..9bb9d762 100644 --- a/internal/use-case/main-use-case/medical-action-src/lib.go +++ b/internal/use-case/main-use-case/medical-action-src/lib.go @@ -2,6 +2,8 @@ package medicalactionsrc import ( e "simrs-vx/internal/domain/main-entities/medical-action-src" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medical } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -57,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.MedicalActionSrc{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/medication-item-dist/lib.go b/internal/use-case/main-use-case/medication-item-dist/lib.go index f39b8753..dd732cd2 100644 --- a/internal/use-case/main-use-case/medication-item-dist/lib.go +++ b/internal/use-case/main-use-case/medication-item-dist/lib.go @@ -2,6 +2,8 @@ package medicationitemdist import ( e "simrs-vx/internal/domain/main-entities/medication-item-dist" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medicat } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medication-item/lib.go b/internal/use-case/main-use-case/medication-item/lib.go index 3dbab755..c54e9db5 100644 --- a/internal/use-case/main-use-case/medication-item/lib.go +++ b/internal/use-case/main-use-case/medication-item/lib.go @@ -2,6 +2,8 @@ package medicationitem import ( e "simrs-vx/internal/domain/main-entities/medication-item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medicat } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medication/lib.go b/internal/use-case/main-use-case/medication/lib.go index 227eb27b..a420a677 100644 --- a/internal/use-case/main-use-case/medication/lib.go +++ b/internal/use-case/main-use-case/medication/lib.go @@ -2,6 +2,8 @@ package medication import ( e "simrs-vx/internal/domain/main-entities/medication" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medicat } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medicine-group/lib.go b/internal/use-case/main-use-case/medicine-group/lib.go index f4288b03..ac269a85 100644 --- a/internal/use-case/main-use-case/medicine-group/lib.go +++ b/internal/use-case/main-use-case/medicine-group/lib.go @@ -2,6 +2,8 @@ package medicinegroup import ( e "simrs-vx/internal/domain/main-entities/medicine-group" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medicin } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medicine-method/lib.go b/internal/use-case/main-use-case/medicine-method/lib.go index 828427bc..56907327 100644 --- a/internal/use-case/main-use-case/medicine-method/lib.go +++ b/internal/use-case/main-use-case/medicine-method/lib.go @@ -2,6 +2,8 @@ package medicinemethod import ( e "simrs-vx/internal/domain/main-entities/medicine-method" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medicin } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medicine-mix-item/lib.go b/internal/use-case/main-use-case/medicine-mix-item/lib.go index fa85aab5..077b1346 100644 --- a/internal/use-case/main-use-case/medicine-mix-item/lib.go +++ b/internal/use-case/main-use-case/medicine-mix-item/lib.go @@ -2,6 +2,8 @@ package medicinemixitem import ( e "simrs-vx/internal/domain/main-entities/medicine-mix-item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medicin } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medicine-mix/lib.go b/internal/use-case/main-use-case/medicine-mix/lib.go index 162399db..329ec556 100644 --- a/internal/use-case/main-use-case/medicine-mix/lib.go +++ b/internal/use-case/main-use-case/medicine-mix/lib.go @@ -2,6 +2,8 @@ package medicinemix import ( e "simrs-vx/internal/domain/main-entities/medicine-mix" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medicin } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/medicine/lib.go b/internal/use-case/main-use-case/medicine/lib.go index 40fe2c13..b4ea21f6 100644 --- a/internal/use-case/main-use-case/medicine/lib.go +++ b/internal/use-case/main-use-case/medicine/lib.go @@ -26,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Medicin } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/nurse/lib.go b/internal/use-case/main-use-case/nurse/lib.go index adbd1b76..3d4465d6 100644 --- a/internal/use-case/main-use-case/nurse/lib.go +++ b/internal/use-case/main-use-case/nurse/lib.go @@ -2,6 +2,8 @@ package nurse import ( e "simrs-vx/internal/domain/main-entities/nurse" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Nurse, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/nutritionist/lib.go b/internal/use-case/main-use-case/nutritionist/lib.go index c9d219a3..89d96e94 100644 --- a/internal/use-case/main-use-case/nutritionist/lib.go +++ b/internal/use-case/main-use-case/nutritionist/lib.go @@ -2,6 +2,8 @@ package nutritionist import ( e "simrs-vx/internal/domain/main-entities/nutritionist" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Nutriti } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index 590e732e..8f6148ee 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -2,6 +2,8 @@ package patient import ( e "simrs-vx/internal/domain/main-entities/patient" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -27,13 +29,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Patient } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/person-address/lib.go b/internal/use-case/main-use-case/person-address/lib.go index fa7484ad..d0a581bd 100644 --- a/internal/use-case/main-use-case/person-address/lib.go +++ b/internal/use-case/main-use-case/person-address/lib.go @@ -2,6 +2,8 @@ package personaddress import ( e "simrs-vx/internal/domain/main-entities/person-address" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PersonA } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/person-contact/lib.go b/internal/use-case/main-use-case/person-contact/lib.go index 18c78dd3..034800a4 100644 --- a/internal/use-case/main-use-case/person-contact/lib.go +++ b/internal/use-case/main-use-case/person-contact/lib.go @@ -2,6 +2,8 @@ package personcontact import ( e "simrs-vx/internal/domain/main-entities/person-contact" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PersonC } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/person-relative/lib.go b/internal/use-case/main-use-case/person-relative/lib.go index 44a75cda..28e12e2b 100644 --- a/internal/use-case/main-use-case/person-relative/lib.go +++ b/internal/use-case/main-use-case/person-relative/lib.go @@ -2,6 +2,8 @@ package personrelative import ( e "simrs-vx/internal/domain/main-entities/person-relative" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PersonR } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/person/lib.go b/internal/use-case/main-use-case/person/lib.go index 42703287..f12c6fac 100644 --- a/internal/use-case/main-use-case/person/lib.go +++ b/internal/use-case/main-use-case/person/lib.go @@ -2,10 +2,13 @@ package person import ( "errors" + "strconv" + e "simrs-vx/internal/domain/main-entities/person" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" - "strconv" dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -27,13 +30,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Person, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/pharmacist/lib.go b/internal/use-case/main-use-case/pharmacist/lib.go index 0038591a..6e7358cb 100644 --- a/internal/use-case/main-use-case/pharmacist/lib.go +++ b/internal/use-case/main-use-case/pharmacist/lib.go @@ -2,6 +2,8 @@ package pharmacist import ( e "simrs-vx/internal/domain/main-entities/pharmacist" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Pharmac } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/pharmacy-company/lib.go b/internal/use-case/main-use-case/pharmacy-company/lib.go index 3fca529a..b0e9c146 100644 --- a/internal/use-case/main-use-case/pharmacy-company/lib.go +++ b/internal/use-case/main-use-case/pharmacy-company/lib.go @@ -2,6 +2,8 @@ package pharmacycompany import ( e "simrs-vx/internal/domain/main-entities/pharmacy-company" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Pharmac } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/practice-schedule/lib.go b/internal/use-case/main-use-case/practice-schedule/lib.go index ae494b9d..3dd0fd69 100644 --- a/internal/use-case/main-use-case/practice-schedule/lib.go +++ b/internal/use-case/main-use-case/practice-schedule/lib.go @@ -2,6 +2,8 @@ package practiceschedule import ( e "simrs-vx/internal/domain/main-entities/practice-schedule" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Practic } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/prescription-item/lib.go b/internal/use-case/main-use-case/prescription-item/lib.go index 70913046..83a8fca8 100644 --- a/internal/use-case/main-use-case/prescription-item/lib.go +++ b/internal/use-case/main-use-case/prescription-item/lib.go @@ -2,6 +2,8 @@ package prescriptionitem import ( e "simrs-vx/internal/domain/main-entities/prescription-item" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Prescri } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/prescription/lib.go b/internal/use-case/main-use-case/prescription/lib.go index bff59916..af559fb8 100644 --- a/internal/use-case/main-use-case/prescription/lib.go +++ b/internal/use-case/main-use-case/prescription/lib.go @@ -2,6 +2,8 @@ package prescription import ( e "simrs-vx/internal/domain/main-entities/prescription" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Prescri } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/procedure-src/lib.go b/internal/use-case/main-use-case/procedure-src/lib.go index 501315ea..6cd2b7dd 100644 --- a/internal/use-case/main-use-case/procedure-src/lib.go +++ b/internal/use-case/main-use-case/procedure-src/lib.go @@ -2,6 +2,8 @@ package proceduresrc import ( e "simrs-vx/internal/domain/main-entities/procedure-src" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Procedu } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -51,6 +47,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.ProcedureSrc{}). Scopes(gh.Filter(input)). diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index 5b8b4b33..9955b076 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -2,6 +2,8 @@ package province import ( e "simrs-vx/internal/domain/main-entities/province" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Provinc } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/regency/lib.go b/internal/use-case/main-use-case/regency/lib.go index 21433f6b..4f66c9c0 100644 --- a/internal/use-case/main-use-case/regency/lib.go +++ b/internal/use-case/main-use-case/regency/lib.go @@ -2,6 +2,8 @@ package regency import ( e "simrs-vx/internal/domain/main-entities/regency" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Regency } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/room/lib.go b/internal/use-case/main-use-case/room/lib.go index df416fa1..a37485e0 100644 --- a/internal/use-case/main-use-case/room/lib.go +++ b/internal/use-case/main-use-case/room/lib.go @@ -2,6 +2,8 @@ package room import ( e "simrs-vx/internal/domain/main-entities/room" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Room, e } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/sbar/lib.go b/internal/use-case/main-use-case/sbar/lib.go index 4151d276..da6fc10a 100644 --- a/internal/use-case/main-use-case/sbar/lib.go +++ b/internal/use-case/main-use-case/sbar/lib.go @@ -2,6 +2,8 @@ package sbar import ( e "simrs-vx/internal/domain/main-entities/sbar" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Sbar, e } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/soapi/lib.go b/internal/use-case/main-use-case/soapi/lib.go index bc848678..8f58b55a 100644 --- a/internal/use-case/main-use-case/soapi/lib.go +++ b/internal/use-case/main-use-case/soapi/lib.go @@ -2,6 +2,8 @@ package soapi import ( e "simrs-vx/internal/domain/main-entities/soapi" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Soapi, } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/specialist-intern/lib.go b/internal/use-case/main-use-case/specialist-intern/lib.go index 81590bc3..7c2dadd9 100644 --- a/internal/use-case/main-use-case/specialist-intern/lib.go +++ b/internal/use-case/main-use-case/specialist-intern/lib.go @@ -2,6 +2,8 @@ package specialistintern import ( e "simrs-vx/internal/domain/main-entities/specialist-intern" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Special } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/specialist/lib.go b/internal/use-case/main-use-case/specialist/lib.go index 32378daf..04b1b552 100644 --- a/internal/use-case/main-use-case/specialist/lib.go +++ b/internal/use-case/main-use-case/specialist/lib.go @@ -26,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Special } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/subspecialist/lib.go b/internal/use-case/main-use-case/subspecialist/lib.go index 3753cc8d..428c0a5f 100644 --- a/internal/use-case/main-use-case/subspecialist/lib.go +++ b/internal/use-case/main-use-case/subspecialist/lib.go @@ -26,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Subspec } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/unit/lib.go b/internal/use-case/main-use-case/unit/lib.go index 24f49256..2924b7df 100644 --- a/internal/use-case/main-use-case/unit/lib.go +++ b/internal/use-case/main-use-case/unit/lib.go @@ -26,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Unit, e } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/uom/lib.go b/internal/use-case/main-use-case/uom/lib.go index 0cbc85e0..3658faf2 100644 --- a/internal/use-case/main-use-case/uom/lib.go +++ b/internal/use-case/main-use-case/uom/lib.go @@ -2,6 +2,8 @@ package uom import ( e "simrs-vx/internal/domain/main-entities/uom" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Uom, er } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") @@ -51,6 +47,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Uo tx = dg.I } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Uom{}). Scopes(gh.Filter(input)). diff --git a/internal/use-case/main-use-case/user/lib.go b/internal/use-case/main-use-case/user/lib.go index e857e9b3..fdb670dc 100644 --- a/internal/use-case/main-use-case/user/lib.go +++ b/internal/use-case/main-use-case/user/lib.go @@ -2,6 +2,8 @@ package user import ( e "simrs-vx/internal/domain/main-entities/user" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.User, e } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/village/lib.go b/internal/use-case/main-use-case/village/lib.go index 2e7dd2da..1c6a48e3 100644 --- a/internal/use-case/main-use-case/village/lib.go +++ b/internal/use-case/main-use-case/village/lib.go @@ -2,6 +2,8 @@ package village import ( e "simrs-vx/internal/domain/main-entities/village" + + plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -24,13 +26,7 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Village } if err := tx.Create(&data).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "Database insert failed", - Raw: err, - } - return nil, pl.SetLogError(event, input) + return nil, plh.HandleCreateError(input, event, err) } pl.SetLogInfo(event, nil, "complete") diff --git a/pkg/lib-helper/lib-helper.go b/pkg/lib-helper/lib-helper.go index c0d8e05d..b24c1004 100644 --- a/pkg/lib-helper/lib-helper.go +++ b/pkg/lib-helper/lib-helper.go @@ -1,9 +1,58 @@ package libhelper -import "gorm.io/gorm" +import ( + "fmt" + pl "simrs-vx/pkg/logger" + + "github.com/jackc/pgx/v5/pgconn" + "gorm.io/gorm" +) func SearchCodeOrName(search string, tx *gorm.DB) { if search != "" { tx.Where("\"Code\" ILIKE ? OR \"Name\" ILIKE ?", "%"+search+"%", "%"+search+"%") } } + +func HandleCreateError(input any, event *pl.Event, err error) error { + e, ok := err.(*pgconn.PgError) + if !ok { + // fallback if it's not a pg error + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: fmt.Sprintf("Database insert failed: %s", err.Error()), + Raw: err, + } + return pl.SetLogError(event, input) + } + + switch e.Code { + case "23505": // unique_violation + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-duplicate", + Detail: fmt.Sprintf("Duplicate value violates unique constraint: %s", e.ConstraintName), + Raw: err, + } + return pl.SetLogError(event, input) + + case "23503": // foreign_key_violation + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fkViolation", + Detail: fmt.Sprintf("Foreign key constraint '%s' violated. Please check related record exists.", e.ConstraintName), + Raw: err, + } + return pl.SetLogError(event, input) + + default: + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: fmt.Sprintf("Database insert failed: %s", e.Message), + Raw: err, + } + return pl.SetLogError(event, input) + } +} From 0870832b1528ec14cc0243f68b95f1dac6f68f6d Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 08:00:11 +0700 Subject: [PATCH 070/190] update constlist --- .../domain/references/clinical/clinical.go | 184 ++++++++++++++---- internal/domain/references/common/common.go | 32 +-- .../domain/references/encounter/encounter.go | 21 +- .../references/organization/organization.go | 35 ++-- 4 files changed, 192 insertions(+), 80 deletions(-) diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index 6420d2a1..81eddb12 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -7,29 +7,50 @@ type ( AssessmentCode string PlanCode string InstructionCode string + HeadToToeCode string McuUrgencyLevelCode string SoapiTypeCode string ) const ( - SCPrimaryComplaint SubjectCode = "pri-complain" // Keluhan Utama - SCSecComplaint SubjectCode = "sec-complain" // Secondary Complaint + SCPrimaryComplain SubjectCode = "pri-complain" // Keluhan Utama + SCSecComplain SubjectCode = "sec-complain" // Secondary Complaint SCCurrentDiseaseHistory SubjectCode = "cur-disea-hist" // Current Disease History SCPastDiseaseHistory SubjectCode = "pas-disea-hist" // Past Disease History SCFamilyDiseaseHistory SubjectCode = "fam-disea-hist" // Family Disease History SCAllergyHistory SubjectCode = "alg-hist" // Allergic History SCAllergyReaction SubjectCode = "alg-react" // Allergic Reaction SCMedicationHistory SubjectCode = "med-hist" // Medication History + SCBloodType SubjectCode = "blood-type" // Blood Type - OCConsciousnessLevel ObjectCode = "consc-level" // Tingkat Kesadaran - OCConsciousnessLevelDet ObjectCode = "consc-level-det" // Detail Tingkat Kesadaran - OCSystolicBloodPressure ObjectCode = "syst-bp" // Tekanan Darah Systolic - OCDiastolicBloodPressure ObjectCode = "diast-bp" // Tekanan Darah Diastolic - OCHeartRate ObjectCode = "hear-rt" // Detak Jantung - OCTemperature ObjectCode = "temp" // Suhu - OCSpO2 ObjectCode = "spo2" // SpO2 - OCWeight ObjectCode = "weight" // Berat Badan - OCHeight ObjectCode = "height" // Tinggi Badan + OCConsciousnessLevel ObjectCode = "consc-level" // Tingkat Kesadaran + OCConsciousnessLevelDet ObjectCode = "consc-level-det" // Detail Tingkat Kesadaran + OCSystolicBloodPressure ObjectCode = "syst-bp" // Tekanan Darah Systolic + OCDiastolicBloodPressure ObjectCode = "diast-bp" // Tekanan Darah Diastolic + OCPulse ObjectCode = "pulse" // Nadi + OCRespiratoryRate ObjectCode = "resp-rate" // Pernafasan + OCHeartRate ObjectCode = "hear-rt" // Detak Jantung + OCNeuroCranialis ObjectCode = "neuro-cranialis" // Neurologist Cranialist + OCSensoris ObjectCode = "sensoris" // Sensoris + OCReflectFisio ObjectCode = "reflect-fisio" // Refleks Fisiologi + OCReflectPato ObjectCode = "reflect-pato" // Refleks Patologi + OCAutonomNeuron ObjectCode = "autonom-neuron" // Saraf Otonom + OCNeckRom ObjectCode = "neck-rom" // ROM Leher + OCBodyRom ObjectCode = "body-rom" // ROM Batang Tubuh + OCAgaRom ObjectCode = "aga-rom" // ROM AGA + OCAgbRom ObjectCode = "agb-rom" // ROM AGB + OCNeckMmt ObjectCode = "neck-mmt" // MMT Leher + OCBodyMmt ObjectCode = "body-mmt" // MMT Batang Tubuh + OCAgaMmt ObjectCode = "aga-mmt" // MMT AGA + OCAgbMmt ObjectCode = "agb-mmt" // MMT AGB + OCLocalis ObjectCode = "localis" // Status Lokalis + OCMedicalTrouble ObjectCode = "medical-trouble" // Masalah Medis + OCRehabMedicTrouble ObjectCode = "rehab-medic-trouble" // Masalah Rehab Medik + OCTemperature ObjectCode = "temp" // Suhu + OCSpO2 ObjectCode = "spo2" // SpO2 + OCWeight ObjectCode = "weight" // Berat Badan + OCHeight ObjectCode = "height" // Tinggi Badan + OCHeadToToe ObjectCode = "head-to-toe" // Kepala Sampai Kaki ACEarlyDiag AssessmentCode = "early-diag" // Diagnosis Awal ACLateDiag AssessmentCode = "late-diag" // Diagnosis Akhir @@ -37,56 +58,135 @@ const ( PCPlan PlanCode = "plan" // Rencana - ICDetail InstructionCode = "detail" // Detail instruksi - ICMedAct InstructionCode = "med-act" // Tindakan medis - ICMedication InstructionCode = "medication" // Obat - ICMaterial InstructionCode = "material" // BMHP + ICDetail InstructionCode = "detail" // Detail Instruksi + ICMedAct InstructionCode = "medical-act" // Tindakan Medis + ICSupExam InstructionCode = "supporting-exam" // Pemeriksaan Penunjang + ICTherapy InstructionCode = "therapy" // Terapi + ICMedication InstructionCode = "medication" // Obat + ICMaterial InstructionCode = "material" // BMHP + ICREhabProg InstructionCode = "rehab-program" // Program Rehab + ICPhyMod InstructionCode = "physic-modal" // Modalitas Fisik + ICExcercise InstructionCode = "exercise" // Latihan + ICOrtPro InstructionCode = "ortes-protesa" // Ortesa Protesa + ICEducation InstructionCode = "education" // Edukasi + ICOther InstructionCode = "other" // Lain-lain - MULCCITO McuUrgencyLevelCode = "cito" - MULCCITOIGD McuUrgencyLevelCode = "cito-igd" - MULCPonek McuUrgencyLevelCode = "ponek" - MULCBG McuUrgencyLevelCode = "blood-gas" - MULCPF McuUrgencyLevelCode = "priority-form" - MULCRT McuUrgencyLevelCode = "routine" + HTTHead HeadToToeCode = "head" + HTTEye HeadToToeCode = "eye" + HTTEar HeadToToeCode = "ear" + HTTNose HeadToToeCode = "nose" + HTTMouthThroat HeadToToeCode = "mouth-throat" + HTTHeadOthers HeadToToeCode = "head-others" + HTTThorax HeadToToeCode = "thorax" + HTTHeart HeadToToeCode = "heart" + HTTLung HeadToToeCode = "lung" + HTTAbdomen HeadToToeCode = "abdomen" + HTTLiver HeadToToeCode = "liver" + HTTBack HeadToToeCode = "back" + HTTEkstremitas HeadToToeCode = "ekstremitas" + HTTGender HeadToToeCode = "gender" + HTTRectum HeadToToeCode = "rectum" + HTTNeuron HeadToToeCode = "neuron" + HTTBodyOthers HeadToToeCode = "body-others" - STCEarly SoapiTypeCode = "early" // Kajian Awal Medis - STCERehab SoapiTypeCode = "early-rehab" // Kajian Awal Rehab Medik - STCFunc SoapiTypeCode = "function" // Assessment Fungsi + MULCCITO McuUrgencyLevelCode = "cito" // CITO + MULCCITOIGD McuUrgencyLevelCode = "cito-igd" // CITO IGD + MULCPonek McuUrgencyLevelCode = "ponek" // PONEK + MULCBG McuUrgencyLevelCode = "blood-gas" // Analisa Gas Darah + MULCPF McuUrgencyLevelCode = "priority-form" // Form Prioritas + MULCRT McuUrgencyLevelCode = "routine" // Pemeriksaan Rutin + + STCEarlyNurse SoapiTypeCode = "early-nurse" // Kajian Awal Medis + STCEEarlyMedic SoapiTypeCode = "early-medic" // Kajian Awal Rehab Medis + STCEarlyRehab SoapiTypeCode = "early-rehab" // Kajian Awal Rehab Medik + STCFunc SoapiTypeCode = "function" // Assessment Fungsi + STCProgress SoapiTypeCode = "progress" // CPPT ) type Soapi struct { - // Subject - PrimaryComplaint string `json:"pri-compl"` - SecondaryComplaint string `json:"sec-compl"` + Subject SubjectSection `json:"subject"` + Object ObjectSection `json:"object"` + Assessment AssessmentSection `json:"assessment"` + Plan string `json:"plan"` + Instruction InstructionSection `json:"instruction"` +} + +// ---------------- SUBJECT ---------------- +type SubjectSection struct { + PrimaryComplain string `json:"pri-complain"` + SecondaryComplain string `json:"sec-complain"` CurrentDiseaseHistory string `json:"cur-disea-hist"` PastDiseaseHistory string `json:"pas-disea-hist"` FamilyDiseaseHistory string `json:"fam-disea-hist"` AllergyHistory string `json:"alg-hist"` AllergyReaction string `json:"alg-react"` MedicationHistory string `json:"med-hist"` + BloodType string `json:"blood-type"` +} - // Object +// ---------------- OBJECT ---------------- +type ObjectSection struct { ConsciousnessLevel string `json:"consc-level"` ConsciousnessLevelDet string `json:"consc-level-det"` SystolicBloodPressure string `json:"syst-bp"` DiastolicBloodPressure string `json:"diast-bp"` + Pulse string `json:"pulse"` + RespiratoryRate string `json:"resp-rate"` HeartRate string `json:"hear-rt"` + NeuroCranialis string `json:"neuro-cranialis"` + Sensoris string `json:"sensoris"` + ReflectFisio string `json:"reflect-fisio"` + ReflectPato string `json:"reflect-pato"` + AutonomNeuron string `json:"autonom-neuron"` + NeckRom string `json:"neck-rom"` + BodyRom string `json:"body-rom"` + AgaRom string `json:"aga-rom"` + AgbRom string `json:"agb-rom"` + NeckMmt string `json:"neck-mmt"` + BodyMmt string `json:"body-mmt"` + AgaMmt string `json:"aga-mmt"` + AgbMmt string `json:"agb-mmt"` + Localis string `json:"localis"` + MedicalTrouble string `json:"medical-trouble"` + RehabMedicTrouble string `json:"rehab-medic-trouble"` Temperature string `json:"temp"` SpO2 string `json:"spo2"` Weight string `json:"weight"` Height string `json:"height"` - - // Assessment - EarlyDiagnosis string `json:"early-diag"` - LateDiagnosis string `json:"late-diag"` - SecondaryDiag string `json:"sec-diag"` - - // Plan - Plan string `json:"plan"` - - // Instruction - InstructionDetail string `json:"detail"` - MedicalAction string `json:"med-act"` - Medication string `json:"medication"` - Material string `json:"material"` + HeadToToe string `json:"head-to-toe"` +} + +// ---------------- ASSESSMENT ---------------- +type AssessmentSection struct { + Note string `json:"note,omitempty"` + Codes []CodeWithName `json:"codes,omitempty"` + + EarlyDiagnosis string `json:"early-diag,omitempty"` + LateDiagnosis string `json:"late-diag,omitempty"` + SecondaryDiag string `json:"sec-diag,omitempty"` +} + +// ---------------- INSTRUCTION ---------------- +type InstructionSection struct { + Note string `json:"note,omitempty"` + Codes []CodeWithName `json:"codes,omitempty"` + + InstructionDetail string `json:"detail,omitempty"` + MedicalAction string `json:"medical-act,omitempty"` + SupportingExam string `json:"supporting-exam,omitempty"` + Therapy string `json:"therapy,omitempty"` + Medication string `json:"medication,omitempty"` + Material string `json:"material,omitempty"` + RehabProgram string `json:"rehab-program,omitempty"` + PhysicModal string `json:"physic-modal,omitempty"` + Exercise string `json:"exercise,omitempty"` + OrtesProsthesis string `json:"ortes-protesa,omitempty"` + Education string `json:"education,omitempty"` + InstructionOther string `json:"other,omitempty"` +} + +// ---------------- CODES ---------------- +type CodeWithName struct { + Code string `json:"code"` + Name string `json:"name"` } diff --git a/internal/domain/references/common/common.go b/internal/domain/references/common/common.go index d60ee8a3..2970e2a8 100644 --- a/internal/domain/references/common/common.go +++ b/internal/domain/references/common/common.go @@ -1,17 +1,19 @@ package common type ( - YaTidakCode byte - SudahBelumCode byte - AktifSimpelCode byte - AktifAdvanceCode byte - TersediaCode byte - DayCode byte - ActiveStatusCode string - DataStatusCode string - UserStatusCode string - TimeUnitCode string - PaymentMethodCode string + YaTidakCode byte + SudahBelumCode byte + AktifSimpelCode byte + AktifAdvanceCode byte + TersediaCode byte + DayCode byte + ActiveStatusCode string + DataStatusCode string + UserStatusCode string + TimeUnitCode string + PaymentMethodCode string + DataAvailabilityCode string + DataVerifiedCode string ) const ( @@ -61,6 +63,14 @@ const ( DSCRejected DataStatusCode = "rejected" // Ditolak DSCSkipped DataStatusCode = "skipped" // Dilewati + DACReview DataAvailabilityCode = "review" // Konfirmasi + DACAvailable DataAvailabilityCode = "available" // Tersedia + DACUnavailable DataAvailabilityCode = "unavailable" // Tidak Tersedia + + DVCNew DataVerifiedCode = "new" // Baru + DVCVerified DataVerifiedCode = "verified" // Terverifikasi + DVCRejected DataVerifiedCode = "rejected" // Ditolak + USCNew UserStatusCode = "new" // Baru USCActive UserStatusCode = "active" // Aktif USCInactive UserStatusCode = "inactive" // Tidak aktif diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 14e6a269..4819ee17 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -15,9 +15,9 @@ type ( ) const ( - ECAmbulatory EncounterClassCode = "ambulatory" - ECEmergency EncounterClassCode = "emergency" - ECInpatient EncounterClassCode = "inpatient" + ECAmbulatory EncounterClassCode = "ambulatory" // Rawat Jalan + ECEmergency EncounterClassCode = "emergency" // Gawat Darurat + ECInpatient EncounterClassCode = "inpatient" // Rawat Inap QSCWait QueueStatusCode = "wait" // Tunggu QSCProc QueueStatusCode = "proc" // Proses @@ -33,16 +33,16 @@ const ( DMCIntRef DischargeMethodCode = "internal-ref" // Rujuk Internal DMCDeath DischargeMethodCode = "death" // Meninggal - TCAmbulance TransportationCode = "ambulance" - TCCar TransportationCode = "car" - TCMotorCycle TransportationCode = "motor-cycle" - TCOther TransportationCode = "other" + TCAmbulance TransportationCode = "ambulance" // Ambulans + TCCar TransportationCode = "car" // Mobil + TCMotorCycle TransportationCode = "motor-cycle" // Motor + TCOther TransportationCode = "other" // Lainnya PCCRes PersonConditionCode = "res" // Resutiasi PCCEmg PersonConditionCode = "emg" // Darurat PCCUrg PersonConditionCode = "urg" // Mendesak PCCLurg PersonConditionCode = "lurg" // Kurang mendesak - PCCNurg PersonConditionCode = "nurg" // + PCCNurg PersonConditionCode = "nurg" // Mendesak PCCDoa PersonConditionCode = "doa" // Meninggal saat tiba ECCEmg EmergencyClassCode = "emg" // Darurat/Emergency biasa @@ -58,8 +58,9 @@ const ( CSCPLab CheckupScopeCode = "pa-lab" // Patology Anatomy Laboratorium CSCRad CheckupScopeCode = "radiology" // Radiology - ACCReg AmbulatoryClassCode = "reg" // Regular - ACCRme AmbulatoryClassCode = "rme" // Rehab Medik + ACCReg AmbulatoryClassCode = "reg" // Regular + ACCRme AmbulatoryClassCode = "rme" // Rehab Medik + ACCChe AmbulatoryClassCode = "chemo" // Chemotherapy ICCIp InpatientClassCode = "ip" // Regular Rawat Inap ICCICU InpatientClassCode = "icu" // ICU diff --git a/internal/domain/references/organization/organization.go b/internal/domain/references/organization/organization.go index db2afe55..68edc332 100644 --- a/internal/domain/references/organization/organization.go +++ b/internal/domain/references/organization/organization.go @@ -9,17 +9,18 @@ type ( ) const ( - UPCDoc UserPosisitionCode = "doctor" // Dokter - UPCNur UserPosisitionCode = "nurse" // Perawat - UPCNut UserPosisitionCode = "nutritionist" // Ahli gizi - UPCLab UserPosisitionCode = "laborant" // Laboran - UPCPha UserPosisitionCode = "pharmacy" // Farmasi - UPCPay UserPosisitionCode = "payment" // Pembayaran - UPCHur UserPosisitionCode = "human-resource" // Sumber Daya Manusia - UPCGea UserPosisitionCode = "general-affair" // Bagian Umu - UPCPav UserPosisitionCode = "payment-verificator" // Konfirmasi pembayaran - UPCMan UserPosisitionCode = "management" // Manajemen - UPCInt UserPosisitionCode = "specialist-intern" // PPDS + UPCReg UserPosisitionCode = "registration" // Admisi/Pendaftaran + UPCNur UserPosisitionCode = "nurse" // Perawat + UPCDoc UserPosisitionCode = "doctor" // Dokter + UPCNut UserPosisitionCode = "nutritionist" // Ahli gizi + UPCMwi UserPosisitionCode = "mid-wife" // Bidan + UPCLab UserPosisitionCode = "laborant" // Laboran + UPCPha UserPosisitionCode = "pharmacy" // Farmasi + UPCPay UserPosisitionCode = "payment" // Pembayaran + UPCHur UserPosisitionCode = "human-resource" // Sumber Daya Manusia + UPCGea UserPosisitionCode = "general-affair" // Bagian Umum + UPCInt UserPosisitionCode = "specialist-intern" // PPDS + UPCMan UserPosisitionCode = "management" // Manajemen ITGCInfra ItemGroupCode = "infra" ITGCMedicine ItemGroupCode = "medicine" @@ -30,12 +31,12 @@ const ( ITGCEmpFee ItemGroupCode = "employee-fee" ITGCDocFee ItemGroupCode = "doctor-fee" - IFGCBuilding InfraGroupCode = "building" - IFGCFloor InfraGroupCode = "floor" - IFGCRoom InfraGroupCode = "room" - IFGCChamber InfraGroupCode = "chamber" - IFGCBed InfraGroupCode = "bed" - IFGCWarehouse InfraGroupCode = "warehouse" + IFGCBuilding InfraGroupCode = "building" // Bangunan + IFGCFloor InfraGroupCode = "floor" // Lantai + IFGCRoom InfraGroupCode = "room" // Ruang + IFGCChamber InfraGroupCode = "chamber" // Kamar + IFGCBed InfraGroupCode = "bed" // Ranjang + IFGCWarehouse InfraGroupCode = "warehouse" // Gudang/Depo UTCReg UnitTypeCode = "reg" // Registrasi UTCExa UnitTypeCode = "exa" // Pemeriksaan From fb437127dc1773943a17155cc48a5f52057ea5ab Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 08:11:24 +0700 Subject: [PATCH 071/190] update soapi struct --- .../domain/references/clinical/clinical.go | 144 +++++++++++------- 1 file changed, 86 insertions(+), 58 deletions(-) diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index 81eddb12..5a9fc280 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -113,80 +113,108 @@ type Soapi struct { // ---------------- SUBJECT ---------------- type SubjectSection struct { - PrimaryComplain string `json:"pri-complain"` - SecondaryComplain string `json:"sec-complain"` - CurrentDiseaseHistory string `json:"cur-disea-hist"` - PastDiseaseHistory string `json:"pas-disea-hist"` - FamilyDiseaseHistory string `json:"fam-disea-hist"` - AllergyHistory string `json:"alg-hist"` - AllergyReaction string `json:"alg-react"` - MedicationHistory string `json:"med-hist"` - BloodType string `json:"blood-type"` + Note string `json:"note,omitempty"` + PrimComplain string `json:"prim-compl,omitempty"` + SecComplainQ string `json:"sec-compl,omitempty"` + PrimaryComplain string `json:"pri-complain,omitempty"` + SecondaryComplain string `json:"sec-complain,omitempty"` + CurrentDiseaseHistory string `json:"cur-disea-hist,omitempty"` + PastDiseaseHistory string `json:"pas-disea-hist,omitempty"` + FamilyDiseaseHistory string `json:"fam-disea-hist,omitempty"` + AllergyHistory string `json:"alg-hist,omitempty"` + AllergyReaction string `json:"alg-react,omitempty"` + MedicationHistory string `json:"med-hist,omitempty"` + BloodType string `json:"blood-type,omitempty"` } // ---------------- OBJECT ---------------- type ObjectSection struct { - ConsciousnessLevel string `json:"consc-level"` - ConsciousnessLevelDet string `json:"consc-level-det"` - SystolicBloodPressure string `json:"syst-bp"` - DiastolicBloodPressure string `json:"diast-bp"` - Pulse string `json:"pulse"` - RespiratoryRate string `json:"resp-rate"` - HeartRate string `json:"hear-rt"` - NeuroCranialis string `json:"neuro-cranialis"` - Sensoris string `json:"sensoris"` - ReflectFisio string `json:"reflect-fisio"` - ReflectPato string `json:"reflect-pato"` - AutonomNeuron string `json:"autonom-neuron"` - NeckRom string `json:"neck-rom"` - BodyRom string `json:"body-rom"` - AgaRom string `json:"aga-rom"` - AgbRom string `json:"agb-rom"` - NeckMmt string `json:"neck-mmt"` - BodyMmt string `json:"body-mmt"` - AgaMmt string `json:"aga-mmt"` - AgbMmt string `json:"agb-mmt"` - Localis string `json:"localis"` - MedicalTrouble string `json:"medical-trouble"` - RehabMedicTrouble string `json:"rehab-medic-trouble"` - Temperature string `json:"temp"` - SpO2 string `json:"spo2"` - Weight string `json:"weight"` - Height string `json:"height"` - HeadToToe string `json:"head-to-toe"` + Note string `json:"note,omitempty"` + ConsciousnessLevel string `json:"consc-level,omitempty"` + ConsciousnessLevelDet string `json:"consc-level-det,omitempty"` + SystolicBloodPressure string `json:"syst-bp,omitempty"` + DiastolicBloodPressure string `json:"diast-bp,omitempty"` + Pulse string `json:"pulse,omitempty"` + RespiratoryRate string `json:"resp-rate,omitempty"` + HeartRate string `json:"hear-rt,omitempty"` + NeuroCranialis string `json:"neuro-cranialis,omitempty"` + Sensoris string `json:"sensoris,omitempty"` + ReflectFisio string `json:"reflect-fisio,omitempty"` + ReflectPato string `json:"reflect-pato,omitempty"` + AutonomNeuron string `json:"autonom-neuron,omitempty"` + NeckRom string `json:"neck-rom,omitempty"` + BodyRom string `json:"body-rom,omitempty"` + AgaRom string `json:"aga-rom,omitempty"` + AgbRom string `json:"agb-rom,omitempty"` + NeckMmt string `json:"neck-mmt,omitempty"` + BodyMmt string `json:"body-mmt,omitempty"` + AgaMmt string `json:"aga-mmt,omitempty"` + AgbMmt string `json:"agb-mmt,omitempty"` + Localis string `json:"localis,omitempty"` + MedicalTrouble string `json:"medical-trouble,omitempty"` + RehabMedicTrouble string `json:"rehab-medic-trouble,omitempty"` + Temperature string `json:"temp,omitempty"` + SpO2 string `json:"spo2,omitempty"` + Weight string `json:"weight,omitempty"` + Height string `json:"height,omitempty"` + HeadToToe HeadToToe `json:"head-to-toe,omitempty"` } // ---------------- ASSESSMENT ---------------- type AssessmentSection struct { + EarlyDiagnosis DiagnosisDetail `json:"early-diag,omitempty"` + LateDiagnosis DiagnosisDetail `json:"late-diag,omitempty"` + SecondaryDiag DiagnosisDetail `json:"sec-diag,omitempty"` +} + +// nested object {note, codes} +type DiagnosisDetail struct { Note string `json:"note,omitempty"` Codes []CodeWithName `json:"codes,omitempty"` - - EarlyDiagnosis string `json:"early-diag,omitempty"` - LateDiagnosis string `json:"late-diag,omitempty"` - SecondaryDiag string `json:"sec-diag,omitempty"` } // ---------------- INSTRUCTION ---------------- type InstructionSection struct { - Note string `json:"note,omitempty"` - Codes []CodeWithName `json:"codes,omitempty"` - - InstructionDetail string `json:"detail,omitempty"` - MedicalAction string `json:"medical-act,omitempty"` - SupportingExam string `json:"supporting-exam,omitempty"` - Therapy string `json:"therapy,omitempty"` - Medication string `json:"medication,omitempty"` - Material string `json:"material,omitempty"` - RehabProgram string `json:"rehab-program,omitempty"` - PhysicModal string `json:"physic-modal,omitempty"` - Exercise string `json:"exercise,omitempty"` - OrtesProsthesis string `json:"ortes-protesa,omitempty"` - Education string `json:"education,omitempty"` - InstructionOther string `json:"other,omitempty"` + Detail string `json:"detail,omitempty"` + MedicalAction CodesWithNote `json:"medical-act,omitempty"` + SupportingExam []CodeWithName `json:"supporting-exam,omitempty"` + Therapy string `json:"therapy,omitempty"` + Medication []CodeWithName `json:"medication,omitempty"` + Material []CodeWithName `json:"material,omitempty"` + RehabProgram string `json:"rehab-program,omitempty"` + PhysicModal string `json:"physic-modal,omitempty"` + Exercise string `json:"exercise,omitempty"` + OrtesProsthesis string `json:"ortes-protesa,omitempty"` + Education string `json:"education,omitempty"` + Other string `json:"other,omitempty"` } // ---------------- CODES ---------------- type CodeWithName struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code,omitempty"` + Name string `json:"name,omitempty"` +} +type CodesWithNote struct { + Note string `json:"note,omitempty"` + Codes []CodeWithName `json:"codes,omitempty"` +} + +type HeadToToe struct { + Head string `json:"head,omitempty"` + Eye string `json:"eye,omitempty"` + Ear string `json:"ear,omitempty"` + Nose string `json:"nose,omitempty"` + MouthThroat string `json:"mouth-throat,omitempty"` + HeadOthers string `json:"head-others,omitempty"` + Thorax string `json:"thorax,omitempty"` + Heart string `json:"heart,omitempty"` + Lung string `json:"lung,omitempty"` + Abdomen string `json:"abdomen,omitempty"` + Liver string `json:"liver,omitempty"` + Back string `json:"back,omitempty"` + Ekstremitas string `json:"ekstremitas,omitempty"` + Gender string `json:"gender,omitempty"` + Rectum string `json:"rectum,omitempty"` + Neuron string `json:"neuron,omitempty"` + BodyOthers string `json:"body-others,omitempty"` } From fe0fcecf807216d17e9b8d0008bce636cf56174e Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 16:02:47 +0700 Subject: [PATCH 072/190] git commit -m "migration updates" --- .gitignore | 3 +- .../migrations/20251002085604.sql | 2 + cmd/main-migration/migrations/atlas.sum | 47 ++++++++++--------- .../domain/main-entities/division/entity.go | 10 ++-- 4 files changed, 34 insertions(+), 28 deletions(-) create mode 100644 cmd/main-migration/migrations/20251002085604.sql diff --git a/.gitignore b/.gitignore index 286b9405..f7357d8a 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,8 @@ go.work.sum # env file .env config.yml -cmd/migration/atlas.hcl +cmd/main-migration/atlas.hcl +cmd/satusehat-migration/atlas.hcl # Editor/IDE # .idea/ diff --git a/cmd/main-migration/migrations/20251002085604.sql b/cmd/main-migration/migrations/20251002085604.sql new file mode 100644 index 00000000..e215cd13 --- /dev/null +++ b/cmd/main-migration/migrations/20251002085604.sql @@ -0,0 +1,2 @@ +-- Modify "Division" table +ALTER TABLE "public"."Division" ALTER COLUMN "Parent_Id" TYPE integer, ADD CONSTRAINT "fk_Division_Childrens" FOREIGN KEY ("Parent_Id") REFERENCES "public"."Division" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 3c24d36a..dc21429b 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,23 +1,24 @@ -h1:NqZplHE9s3i2A3OK3OMBOTHfYgRfb+1HyZLBfS9SLeM= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +h1:kkT6c88mNI2KVSF5h2r1qdgxouqRlqt6scn0lhxl9+Q= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:ml+jTtNkj5T12/loEW77jMScHbt+XAx4mN80heqo7+Q= diff --git a/internal/domain/main-entities/division/entity.go b/internal/domain/main-entities/division/entity.go index 7d3bc65d..bf600c88 100644 --- a/internal/domain/main-entities/division/entity.go +++ b/internal/domain/main-entities/division/entity.go @@ -5,8 +5,10 @@ import ( ) type Division struct { - ecore.SmallMain // adjust this according to the needs - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` - Parent_Id *int16 `json:"parent_id"` + ecore.SmallMain // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:10"` + Name string `json:"name" gorm:"size:50"` + Parent_Id *int16 `json:"parent_id"` + Parent *Division `gorm:"foreignKey:Parent_Id;references:Id"` + Childrens []Division `gorm:"foreignKey:Parent_Id"` } From 82fd71dbbf7240a0994f7b7dbebf5fc5f3698cee Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 16:03:26 +0700 Subject: [PATCH 073/190] update gitignore to ignore atlas.hcl files --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index f7357d8a..5f88f352 100644 --- a/.gitignore +++ b/.gitignore @@ -27,8 +27,8 @@ go.work.sum # env file .env config.yml -cmd/main-migration/atlas.hcl -cmd/satusehat-migration/atlas.hcl +**/atlas.hcl +!**/atlas.hcl.example # Editor/IDE # .idea/ From c946380e4a436a724c6b7f47603756b4e80919c9 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 16:05:21 +0700 Subject: [PATCH 074/190] stop tracking atlas.hcl files (ignored) --- cmd/main-migration/atlas.hcl | 23 ----------------------- cmd/satusehat-migration/atlas.hcl | 22 ---------------------- 2 files changed, 45 deletions(-) delete mode 100644 cmd/main-migration/atlas.hcl delete mode 100644 cmd/satusehat-migration/atlas.hcl diff --git a/cmd/main-migration/atlas.hcl b/cmd/main-migration/atlas.hcl deleted file mode 100644 index 163119d3..00000000 --- a/cmd/main-migration/atlas.hcl +++ /dev/null @@ -1,23 +0,0 @@ -data "external_schema" "gorm" { - program = [ - "go", - "run", - "-mod=mod", - ".", - ] -} - -env "gorm" { - src = data.external_schema.gorm.url - dev = "postgres://simrs:p@ssw0rd@localhost:5432/simrs-diff-01?sslmode=disable" - migration { - dir = "file://migrations" - } - url = "postgres://simrs:p@ssw0rd@localhost:5432/simrs-01?sslmode=disable" - format { - migrate { - diff = "{{ sql . \" \" }}" - } - } -} - diff --git a/cmd/satusehat-migration/atlas.hcl b/cmd/satusehat-migration/atlas.hcl deleted file mode 100644 index 5efd3e80..00000000 --- a/cmd/satusehat-migration/atlas.hcl +++ /dev/null @@ -1,22 +0,0 @@ -data "external_schema" "gorm" { - program = [ - "go", - "run", - "-mod=mod", - ".", - ] -} - -env "gorm" { - src = data.external_schema.gorm.url - dev = "postgres://moko:password@localhost:5432/satusehat_diff?sslmode=disable" - migration { - dir = "file://migrations" - } - url = "postgres://moko:password@localhost:5432/satusehat_main?sslmode=disable" - format { - migrate { - diff = "{{ sql . \" \" }}" - } - } -} \ No newline at end of file From 01ea6b0961cbb0782e72df760ab46d6fcaba1e94 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 16:06:44 +0700 Subject: [PATCH 075/190] add comment in division entity --- internal/domain/main-entities/division/entity.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/domain/main-entities/division/entity.go b/internal/domain/main-entities/division/entity.go index bf600c88..5585d8a2 100644 --- a/internal/domain/main-entities/division/entity.go +++ b/internal/domain/main-entities/division/entity.go @@ -10,5 +10,5 @@ type Division struct { Name string `json:"name" gorm:"size:50"` Parent_Id *int16 `json:"parent_id"` Parent *Division `gorm:"foreignKey:Parent_Id;references:Id"` - Childrens []Division `gorm:"foreignKey:Parent_Id"` + Childrens []Division `gorm:"foreignKey:Parent_Id"` // may need references to self } From 12522a4e6742e17b802c979b21dbbe9ba5def312 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 16:11:25 +0700 Subject: [PATCH 076/190] wip --- internal/domain/main-entities/division/dto.go | 10 +++++++--- pkg/auth-helper/tycovar.go | 4 ---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index e8ba2d97..77c0d08b 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -42,9 +42,11 @@ type MetaDto struct { type ResponseDto struct { ecore.SmallMain - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + Code string `json:"code"` + Name string `json:"name"` + Parent_Id *int16 `json:"parent_id"` + Parent *Division `json:"parent"` + Childrens []Division `json:"childrens"` } func (d Division) ToResponse() ResponseDto { @@ -52,6 +54,8 @@ func (d Division) ToResponse() ResponseDto { Code: d.Code, Name: d.Name, Parent_Id: d.Parent_Id, + Parent: d.Parent, + Childrens: d.Childrens, } resp.SmallMain = d.SmallMain return resp diff --git a/pkg/auth-helper/tycovar.go b/pkg/auth-helper/tycovar.go index 7586956d..deda1097 100644 --- a/pkg/auth-helper/tycovar.go +++ b/pkg/auth-helper/tycovar.go @@ -39,10 +39,6 @@ func (a AuthInfo) IsPayment() bool { return a.User_Position_Code == string(ero.UPCPay) } -func (a AuthInfo) IsPaymentVerificator() bool { - return a.User_Position_Code == string(ero.UPCPav) -} - func (a AuthInfo) IsManagement() bool { return a.User_Position_Code == string(ero.UPCMan) } From 6d50ca233a944ba65c503eebb0c10249e5b1fe22 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 16:12:43 +0700 Subject: [PATCH 077/190] change datatype parent_id --- cmd/main-migration/migrations/atlas.sum | 4 ++-- internal/domain/main-entities/division/dto.go | 18 +++++++++--------- .../domain/main-entities/division/entity.go | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index dc21429b..dedb750a 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:kkT6c88mNI2KVSF5h2r1qdgxouqRlqt6scn0lhxl9+Q= +h1:jZ9sh96fN1qtT2OItPgP+Anzvi92I1twBDGmU2RWlVU= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -21,4 +21,4 @@ h1:kkT6c88mNI2KVSF5h2r1qdgxouqRlqt6scn0lhxl9+Q= 20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= 20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= 20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:ml+jTtNkj5T12/loEW77jMScHbt+XAx4mN80heqo7+Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index e8ba2d97..43406e34 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -5,15 +5,15 @@ import ( ) type CreateDto struct { - Code string `json:"code" validate:"maxLength=10"` - Name string `json:"name" validate:"maxLength=50"` - Parent_Id *int16 `json:"parent_id"` + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` + Parent_Id *uint16 `json:"parent_id"` } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + Code string `json:"code"` + Name string `json:"name"` + Parent_Id *uint16 `json:"parent_id"` Page int `json:"page"` PageSize int `json:"page_size"` @@ -42,9 +42,9 @@ type MetaDto struct { type ResponseDto struct { ecore.SmallMain - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *int16 `json:"parent_id"` + Code string `json:"code"` + Name string `json:"name"` + Parent_Id *uint16 `json:"parent_id"` } func (d Division) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/division/entity.go b/internal/domain/main-entities/division/entity.go index 5585d8a2..2aa6c8dd 100644 --- a/internal/domain/main-entities/division/entity.go +++ b/internal/domain/main-entities/division/entity.go @@ -8,7 +8,7 @@ type Division struct { ecore.SmallMain // adjust this according to the needs Code string `json:"code" gorm:"unique;size:10"` Name string `json:"name" gorm:"size:50"` - Parent_Id *int16 `json:"parent_id"` + Parent_Id *uint16 `json:"parent_id"` Parent *Division `gorm:"foreignKey:Parent_Id;references:Id"` Childrens []Division `gorm:"foreignKey:Parent_Id"` // may need references to self } From 47e855f91e27d19fa3fb19cfebc3df8065780fb1 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 2 Oct 2025 16:19:35 +0700 Subject: [PATCH 078/190] feat (division): add fk and preloads for parent and childrens --- internal/domain/main-entities/division/dto.go | 6 ++++++ internal/use-case/main-use-case/division/case.go | 3 +++ internal/use-case/main-use-case/division/lib.go | 8 +++++++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index c3a053b0..49f2b647 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -11,6 +11,12 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` +} + +type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Parent_Id *uint16 `json:"parent_id"` diff --git a/internal/use-case/main-use-case/division/case.go b/internal/use-case/main-use-case/division/case.go index bf1b94fe..cf37c36c 100644 --- a/internal/use-case/main-use-case/division/case.go +++ b/internal/use-case/main-use-case/division/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index 4a3c71b9..9e0909c8 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -47,9 +47,15 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + tx = tx. Model(&e.Division{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") From 200c3e9c83ec88c9ec16d50f41cbad5f8bb5b4b6 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 3 Oct 2025 10:21:18 +0700 Subject: [PATCH 079/190] add doctor id into device-order, material-order, add fk parent and childrens for infra --- cmd/main-migration/migrations/20251003032030.sql | 6 ++++++ cmd/main-migration/migrations/atlas.sum | 3 ++- internal/domain/main-entities/device-order/entity.go | 3 +++ internal/domain/main-entities/division/entity.go | 4 ++-- internal/domain/main-entities/infra/entity.go | 2 ++ internal/domain/main-entities/material-order/entity.go | 3 +++ 6 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 cmd/main-migration/migrations/20251003032030.sql diff --git a/cmd/main-migration/migrations/20251003032030.sql b/cmd/main-migration/migrations/20251003032030.sql new file mode 100644 index 00000000..2bdf73ba --- /dev/null +++ b/cmd/main-migration/migrations/20251003032030.sql @@ -0,0 +1,6 @@ +-- Modify "Infra" table +ALTER TABLE "public"."Infra" ADD CONSTRAINT "fk_Infra_Childrens" FOREIGN KEY ("Parent_Id") REFERENCES "public"."Infra" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "DeviceOrder" table +ALTER TABLE "public"."DeviceOrder" ADD COLUMN "Doctor_Id" bigint NULL, ADD CONSTRAINT "fk_DeviceOrder_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "MaterialOrder" table +ALTER TABLE "public"."MaterialOrder" ADD COLUMN "Doctor_Id" bigint NULL, ADD CONSTRAINT "fk_MaterialOrder_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index dedb750a..571f69da 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:jZ9sh96fN1qtT2OItPgP+Anzvi92I1twBDGmU2RWlVU= +h1:EkXfc/qeBa+6Fog89GGHEbrpjWfLwy/t6MQdrP9tImE= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -22,3 +22,4 @@ h1:jZ9sh96fN1qtT2OItPgP+Anzvi92I1twBDGmU2RWlVU= 20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= 20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= 20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:hdN6UINPM9Pz9ME6uP3pr6PNCqqz4y7h2qY1UlVjw60= diff --git a/internal/domain/main-entities/device-order/entity.go b/internal/domain/main-entities/device-order/entity.go index 79af88c2..cfb39216 100644 --- a/internal/domain/main-entities/device-order/entity.go +++ b/internal/domain/main-entities/device-order/entity.go @@ -2,6 +2,7 @@ package deviceorder 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" erc "simrs-vx/internal/domain/references/common" @@ -11,5 +12,7 @@ type DeviceOrder struct { ecore.Main // adjust this according to the needs Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` Status_Code erc.DataStatusCode `json:"status_code"` } diff --git a/internal/domain/main-entities/division/entity.go b/internal/domain/main-entities/division/entity.go index 2aa6c8dd..470fab0d 100644 --- a/internal/domain/main-entities/division/entity.go +++ b/internal/domain/main-entities/division/entity.go @@ -9,6 +9,6 @@ type Division struct { Code string `json:"code" gorm:"unique;size:10"` Name string `json:"name" gorm:"size:50"` Parent_Id *uint16 `json:"parent_id"` - Parent *Division `gorm:"foreignKey:Parent_Id;references:Id"` - Childrens []Division `gorm:"foreignKey:Parent_Id"` // may need references to self + Parent *Division `json:"parent" gorm:"foreignKey:Parent_Id;references:Id"` + Childrens []Division `json:"childrens" gorm:"foreignKey:Parent_Id"` // may need references to self } diff --git a/internal/domain/main-entities/infra/entity.go b/internal/domain/main-entities/infra/entity.go index a7d2e6d4..cf069376 100644 --- a/internal/domain/main-entities/infra/entity.go +++ b/internal/domain/main-entities/infra/entity.go @@ -13,6 +13,8 @@ type Infra struct { Name string `json:"name" gorm:"size:50"` InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" gorm:"size:10"` Parent_Id *uint16 `json:"parent_id"` + Parent *Infra `json:"parent" gorm:"foreignKey:Parent_Id;references:Id"` + Childrens []Infra `json:"childrens" gorm:"foreignKey:Parent_Id"` // may need references to self Item_Id *uint `json:"item_id"` Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` } diff --git a/internal/domain/main-entities/material-order/entity.go b/internal/domain/main-entities/material-order/entity.go index e306d372..73cd9851 100644 --- a/internal/domain/main-entities/material-order/entity.go +++ b/internal/domain/main-entities/material-order/entity.go @@ -2,6 +2,7 @@ package materialorder 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" erc "simrs-vx/internal/domain/references/common" @@ -11,5 +12,7 @@ type MaterialOrder struct { ecore.Main // adjust this according to the needs Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` Status_Code erc.DataStatusCode `json:"status_code"` } From 39efdf4d57d5bb006a7b0c44a28bd29d9f387a90 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 3 Oct 2025 10:53:06 +0700 Subject: [PATCH 080/190] material, device-order required doctor_id, infra search and parent,childrens --- .../domain/main-entities/device-order/dto.go | 11 +++++ .../main-entities/device-order/entity.go | 4 ++ internal/domain/main-entities/division/dto.go | 5 +- internal/domain/main-entities/infra/dto.go | 5 ++ .../main-entities/material-order/dto.go | 11 +++++ .../main-entities/material-order/entity.go | 4 ++ .../main-handler/device-order/handler.go | 17 ++++++- .../interface/main-handler/main-handler.go | 4 +- .../main-handler/material-order/handler.go | 14 ++++++ .../main-use-case/device-order/case.go | 47 +++++++++++++++++++ .../main-use-case/device-order/helper.go | 1 + .../use-case/main-use-case/division/lib.go | 2 + internal/use-case/main-use-case/infra/lib.go | 2 + .../main-use-case/material-order/case.go | 44 +++++++++++++++++ .../main-use-case/material-order/helper.go | 1 + 15 files changed, 166 insertions(+), 6 deletions(-) diff --git a/internal/domain/main-entities/device-order/dto.go b/internal/domain/main-entities/device-order/dto.go index f26d1155..6d61757e 100644 --- a/internal/domain/main-entities/device-order/dto.go +++ b/internal/domain/main-entities/device-order/dto.go @@ -2,13 +2,20 @@ package deviceorder 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" + erc "simrs-vx/internal/domain/references/common" + + pa "simrs-vx/pkg/auth-helper" ) type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataStatusCode `json:"status_code"` + Doctor_Id *uint `json:"doctor_id"` + + pa.AuthInfo } type ReadListDto struct { @@ -48,6 +55,8 @@ 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"` Status_Code erc.DataStatusCode `json:"status_code"` } @@ -55,6 +64,8 @@ func (d DeviceOrder) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, + Doctor_Id: d.Doctor_Id, + Doctor: d.Doctor, Status_Code: d.Status_Code, } resp.Main = d.Main diff --git a/internal/domain/main-entities/device-order/entity.go b/internal/domain/main-entities/device-order/entity.go index 53470219..7f693518 100644 --- a/internal/domain/main-entities/device-order/entity.go +++ b/internal/domain/main-entities/device-order/entity.go @@ -20,3 +20,7 @@ type DeviceOrder struct { func (d DeviceOrder) IsCompleted() bool { return d.Status_Code == erc.DSCDone } + +func (d DeviceOrder) IsSameDoctor(doctor_id *uint) bool { + return d.Doctor_Id == doctor_id +} diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index 49f2b647..ea45ee1d 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { @@ -51,8 +52,8 @@ type ResponseDto struct { Code string `json:"code"` Name string `json:"name"` Parent_Id *uint16 `json:"parent_id"` - Parent *Division `json:"parent"` - Childrens []Division `json:"childrens"` + Parent *Division `json:"parent,omitempty"` + Childrens []Division `json:"childrens,omitempty"` } func (d Division) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index 69531f5f..b51937ce 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -23,6 +23,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` } type FilterDto struct { @@ -64,6 +65,8 @@ type ResponseDto struct { Name string `json:"name"` InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code"` Parent_Id *uint16 `json:"parent_id"` + Parent *Infra `json:"parent,omitempty"` + Childrens []Infra `json:"childrens,omitempty"` Item_Id *uint `json:"item_id"` Item *ei.Item `json:"item,omitempty"` } @@ -74,6 +77,8 @@ func (d Infra) ToResponse() ResponseDto { Name: d.Name, InfraGroup_Code: d.InfraGroup_Code, Parent_Id: d.Parent_Id, + Parent: d.Parent, + Childrens: d.Childrens, Item_Id: d.Item_Id, Item: d.Item, } diff --git a/internal/domain/main-entities/material-order/dto.go b/internal/domain/main-entities/material-order/dto.go index 849f887f..1c58c379 100644 --- a/internal/domain/main-entities/material-order/dto.go +++ b/internal/domain/main-entities/material-order/dto.go @@ -2,13 +2,20 @@ package materialorder 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" + erc "simrs-vx/internal/domain/references/common" + + pa "simrs-vx/pkg/auth-helper" ) type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataStatusCode `json:"status_code"` + Doctor_Id *uint `json:"doctor_id"` + + pa.AuthInfo } type ReadListDto struct { @@ -48,6 +55,8 @@ 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"` Status_Code erc.DataStatusCode `json:"status_code"` } @@ -55,6 +64,8 @@ func (d MaterialOrder) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, + Doctor_Id: d.Doctor_Id, + Doctor: d.Doctor, Status_Code: d.Status_Code, } resp.Main = d.Main diff --git a/internal/domain/main-entities/material-order/entity.go b/internal/domain/main-entities/material-order/entity.go index 0a2d8d51..27b5c011 100644 --- a/internal/domain/main-entities/material-order/entity.go +++ b/internal/domain/main-entities/material-order/entity.go @@ -20,3 +20,7 @@ type MaterialOrder struct { func (d MaterialOrder) IsCompleted() bool { return d.Status_Code == erc.DSCDone } + +func (d MaterialOrder) IsSameDoctor(doctor_id *uint) bool { + return d.Doctor_Id == doctor_id +} diff --git a/internal/interface/main-handler/device-order/handler.go b/internal/interface/main-handler/device-order/handler.go index ca11ff90..42135e58 100644 --- a/internal/interface/main-handler/device-order/handler.go +++ b/internal/interface/main-handler/device-order/handler.go @@ -6,10 +6,12 @@ import ( rw "github.com/karincake/risoles" sf "github.com/karincake/semprit" - // ua "github.com/karincake/tumpeng/auth/svc" - e "simrs-vx/internal/domain/main-entities/device-order" u "simrs-vx/internal/use-case/main-use-case/device-order" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -21,6 +23,12 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.AuthInfo = *authInfo res, err := u.Create(dto) rw.DataResponse(w, res, err) } @@ -54,6 +62,11 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { return } dto.Id = uint16(id) + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.AuthInfo = *authInfo res, err := u.Update(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 43b2f950..5adb40cd 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -193,7 +193,7 @@ func SetRoutes() http.Handler { "PATCH /{id}/consume": medicationitemdist.O.Consume, }) - hk.GroupRoutes("/v1/device-order", r, hk.MapHandlerFunc{ + hk.GroupRoutes("/v1/device-order", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": deviceorder.O.GetList, "GET /{id}": deviceorder.O.GetDetail, "POST /": deviceorder.O.Create, @@ -202,7 +202,7 @@ func SetRoutes() http.Handler { "PATCH /{id}/complete": deviceorder.O.Complete, }) - hk.GroupRoutes("/v1/material-order", r, hk.MapHandlerFunc{ + hk.GroupRoutes("/v1/material-order", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": materialorder.O.GetList, "GET /{id}": materialorder.O.GetDetail, "POST /": materialorder.O.Create, diff --git a/internal/interface/main-handler/material-order/handler.go b/internal/interface/main-handler/material-order/handler.go index eb717973..ae8777cb 100644 --- a/internal/interface/main-handler/material-order/handler.go +++ b/internal/interface/main-handler/material-order/handler.go @@ -10,6 +10,10 @@ import ( e "simrs-vx/internal/domain/main-entities/material-order" u "simrs-vx/internal/use-case/main-use-case/material-order" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -21,6 +25,11 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.AuthInfo = *authInfo res, err := u.Create(dto) rw.DataResponse(w, res, err) } @@ -53,6 +62,11 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.AuthInfo = *authInfo dto.Id = uint16(id) res, err := u.Update(dto) rw.DataResponse(w, res, err) 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 66dc1949..422c4f1a 100644 --- a/internal/use-case/main-use-case/device-order/case.go +++ b/internal/use-case/main-use-case/device-order/case.go @@ -6,6 +6,7 @@ import ( e "simrs-vx/internal/domain/main-entities/device-order" + ud "simrs-vx/internal/use-case/main-use-case/doctor" ue "simrs-vx/internal/use-case/main-use-case/encounter" erc "simrs-vx/internal/domain/references/common" @@ -45,6 +46,26 @@ func Create(input e.CreateDto) (*d.Data, error) { return errors.New("encounter is already done") } + if data.IsCompleted() { + return errors.New("data already completed") + } + + if !input.AuthInfo.IsDoctor() { + 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) + } + + doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + input.Doctor_Id = doctor_id + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -207,6 +228,32 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } + if !input.AuthInfo.IsDoctor() { + 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) + } + + doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + if !data.IsSameDoctor(doctor_id) { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "auth-forbidden", + Detail: "doctor is not the same as the data", + Raw: errors.New("authentication failed"), + } + return pl.SetLogError(&event, input) + } + + input.Doctor_Id = doctor_id + if err := UpdateData(input, data, &event, tx); err != nil { return err } 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 84a49fa2..f64e8886 100644 --- a/internal/use-case/main-use-case/device-order/helper.go +++ b/internal/use-case/main-use-case/device-order/helper.go @@ -19,4 +19,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 + data.Doctor_Id = inputSrc.Doctor_Id } diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index 9e0909c8..25ccd22f 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -53,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Division{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index c733ca39..656aec39 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -53,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In } } + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Infra{}). Scopes(gh.Filter(input.FilterDto)). 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 bed63695..af93924c 100644 --- a/internal/use-case/main-use-case/material-order/case.go +++ b/internal/use-case/main-use-case/material-order/case.go @@ -6,6 +6,7 @@ import ( e "simrs-vx/internal/domain/main-entities/material-order" + ud "simrs-vx/internal/use-case/main-use-case/doctor" ue "simrs-vx/internal/use-case/main-use-case/encounter" erc "simrs-vx/internal/domain/references/common" @@ -45,6 +46,22 @@ func Create(input e.CreateDto) (*d.Data, error) { return errors.New("encounter is already done") } + if !input.AuthInfo.IsDoctor() { + 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) + } + + doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + input.Doctor_Id = doctor_id + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -208,6 +225,33 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } + if !input.AuthInfo.IsDoctor() { + 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) + } + + doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + + if !data.IsSameDoctor(doctor_id) { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "auth-forbidden", + Detail: "doctor is not the same as the data", + Raw: errors.New("authentication failed"), + } + return pl.SetLogError(&event, input) + } + + input.Doctor_Id = doctor_id + if err := UpdateData(input, data, &event, tx); err != nil { return err } 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 f5f67b1a..c3a0fdde 100644 --- a/internal/use-case/main-use-case/material-order/helper.go +++ b/internal/use-case/main-use-case/material-order/helper.go @@ -19,4 +19,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 + data.Doctor_Id = inputSrc.Doctor_Id } From 06a6ac642495f97251f32ba470d5a4c2027847ff Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 3 Oct 2025 11:00:07 +0700 Subject: [PATCH 081/190] feat (mcu-order): handle doctor_id on create and update --- .../domain/main-entities/mcu-order/dto.go | 7 ++- .../domain/main-entities/mcu-order/entity.go | 4 ++ .../main-handler/mcu-order/handler.go | 14 ++++++ .../use-case/main-use-case/mcu-order/case.go | 48 +++++++++++++++++++ .../main-use-case/mcu-order/helper.go | 1 + 5 files changed, 73 insertions(+), 1 deletion(-) diff --git a/internal/domain/main-entities/mcu-order/dto.go b/internal/domain/main-entities/mcu-order/dto.go index 4dcabce4..0f76b576 100644 --- a/internal/domain/main-entities/mcu-order/dto.go +++ b/internal/domain/main-entities/mcu-order/dto.go @@ -4,9 +4,12 @@ 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" + ercl "simrs-vx/internal/domain/references/clinical" erc "simrs-vx/internal/domain/references/common" - "time" + + pa "simrs-vx/pkg/auth-helper" ) type CreateDto struct { @@ -18,6 +21,8 @@ type CreateDto struct { Number uint8 `json:"number"` Temperature float64 `json:"temperature"` McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code""` + + pa.AuthInfo } type ReadListDto struct { diff --git a/internal/domain/main-entities/mcu-order/entity.go b/internal/domain/main-entities/mcu-order/entity.go index 96721caf..1c72a2ba 100644 --- a/internal/domain/main-entities/mcu-order/entity.go +++ b/internal/domain/main-entities/mcu-order/entity.go @@ -27,3 +27,7 @@ type McuOrder struct { func (d McuOrder) IsCompleted() bool { return d.Status_Code == erc.DSCDone } + +func (d McuOrder) IsSameDoctor(doctor_id *uint) bool { + return d.Doctor_Id == doctor_id +} diff --git a/internal/interface/main-handler/mcu-order/handler.go b/internal/interface/main-handler/mcu-order/handler.go index 44a635a5..bcd07a05 100644 --- a/internal/interface/main-handler/mcu-order/handler.go +++ b/internal/interface/main-handler/mcu-order/handler.go @@ -10,6 +10,10 @@ import ( e "simrs-vx/internal/domain/main-entities/mcu-order" u "simrs-vx/internal/use-case/main-use-case/mcu-order" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -21,6 +25,11 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.AuthInfo = *authInfo res, err := u.Create(dto) rw.DataResponse(w, res, err) } @@ -53,6 +62,11 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.AuthInfo = *authInfo dto.Id = uint(id) res, err := u.Update(dto) rw.DataResponse(w, res, err) diff --git a/internal/use-case/main-use-case/mcu-order/case.go b/internal/use-case/main-use-case/mcu-order/case.go index 158a4995..77176cd9 100644 --- a/internal/use-case/main-use-case/mcu-order/case.go +++ b/internal/use-case/main-use-case/mcu-order/case.go @@ -6,6 +6,7 @@ import ( e "simrs-vx/internal/domain/main-entities/mcu-order" + ud "simrs-vx/internal/use-case/main-use-case/doctor" ue "simrs-vx/internal/use-case/main-use-case/encounter" erc "simrs-vx/internal/domain/references/common" @@ -45,6 +46,22 @@ func Create(input e.CreateDto) (*d.Data, error) { return errors.New("encounter is already done") } + if !input.AuthInfo.IsDoctor() { + 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) + } + + doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + input.Doctor_Id = doctor_id + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -197,6 +214,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 @@ -204,6 +225,33 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } + if !input.AuthInfo.IsDoctor() { + 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) + } + + doctor_id, err := ud.GetIdByUserId(&input.AuthInfo.User_Id, &event, tx) + if err != nil { + return err + } + + if !data.IsSameDoctor(doctor_id) { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "auth-forbidden", + Detail: "doctor is not the same as the data", + Raw: errors.New("authentication failed"), + } + return pl.SetLogError(&event, input) + } + + input.Doctor_Id = doctor_id + if err := UpdateData(input, data, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/mcu-order/helper.go b/internal/use-case/main-use-case/mcu-order/helper.go index 65c95bff..b5c9bdf1 100644 --- a/internal/use-case/main-use-case/mcu-order/helper.go +++ b/internal/use-case/main-use-case/mcu-order/helper.go @@ -25,4 +25,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuOrder) { data.Number = inputSrc.Number data.Temperature = inputSrc.Temperature data.McuUrgencyLevel_Code = inputSrc.McuUrgencyLevel_Code + data.Doctor_Id = inputSrc.Doctor_Id } From 06e7b1ce717312bd7830317931ae94621c42be6f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 3 Oct 2025 11:00:24 +0700 Subject: [PATCH 082/190] feat (mcu-order): add guard --- internal/interface/main-handler/main-handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 5adb40cd..87325400 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -124,7 +124,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/prescription-item", prescriptionitem.O) hc.RegCrud(r, "/v1/device-order-item", deviceorderitem.O) hc.RegCrud(r, "/v1/material-order-item", materialorderitem.O) - hk.GroupRoutes("/v1/mcu-order", r, hk.MapHandlerFunc{ + hk.GroupRoutes("/v1/mcu-order", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": mcuorder.O.GetList, "GET /{id}": mcuorder.O.GetDetail, "POST /": mcuorder.O.Create, From 27ba102ca763bfe44e93961c56866867a1ca74d7 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 3 Oct 2025 11:05:49 +0700 Subject: [PATCH 083/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 50 ++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 571f69da..cc9c7026 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,25 +1,25 @@ -h1:EkXfc/qeBa+6Fog89GGHEbrpjWfLwy/t6MQdrP9tImE= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:hdN6UINPM9Pz9ME6uP3pr6PNCqqz4y7h2qY1UlVjw60= +h1:x6PUnQLcwgdcTvuTAMcDT6t9fPz/u1d1YFIFXyuGIKU= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= From bd6351e3a32a6c3c8e351392bb2a2871de178173 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 3 Oct 2025 17:13:53 +0700 Subject: [PATCH 084/190] fix pagination, filter to show only have children data on division --- go.mod | 5 +++-- go.sum | 10 ++++++---- internal/domain/base-entities/core/dto.go | 7 +++++++ internal/domain/main-entities/adime/dto.go | 12 +++++------- internal/domain/main-entities/ambulatory/dto.go | 9 +++------ internal/domain/main-entities/appointment/dto.go | 5 +---- internal/domain/main-entities/consultation/dto.go | 9 +++------ internal/domain/main-entities/counter/dto.go | 5 +---- .../domain/main-entities/device-order-item/dto.go | 9 +++------ internal/domain/main-entities/device-order/dto.go | 10 ++++------ internal/domain/main-entities/device/dto.go | 11 ++++------- internal/domain/main-entities/diagnose-src/dto.go | 11 ++++------- internal/domain/main-entities/district/dto.go | 10 +++++----- .../domain/main-entities/division-position/dto.go | 9 +++------ internal/domain/main-entities/division/dto.go | 12 +++++------- internal/domain/main-entities/doctor-fee/dto.go | 9 +++------ internal/domain/main-entities/doctor/dto.go | 9 +++------ internal/domain/main-entities/emergency/dto.go | 9 +++------ internal/domain/main-entities/employee/dto.go | 10 ++++------ internal/domain/main-entities/encounter/dto.go | 13 ++++++------- internal/domain/main-entities/ethnic/dto.go | 11 ++++------- internal/domain/main-entities/infra/dto.go | 11 ++++------- internal/domain/main-entities/inpatient/dto.go | 10 ++++------ internal/domain/main-entities/installation/dto.go | 6 ++---- .../domain/main-entities/insurance-company/dto.go | 9 +++------ internal/domain/main-entities/item-price/dto.go | 9 +++------ internal/domain/main-entities/item/dto.go | 9 +++------ internal/domain/main-entities/laborant/dto.go | 9 +++------ internal/domain/main-entities/language/dto.go | 11 ++++------- .../main-entities/material-order-item/dto.go | 9 +++------ .../domain/main-entities/material-order/dto.go | 9 +++------ internal/domain/main-entities/material/dto.go | 11 ++++------- .../domain/main-entities/mcu-order-item/dto.go | 9 +++------ .../domain/main-entities/mcu-order-sub-item/dto.go | 9 +++------ internal/domain/main-entities/mcu-order/dto.go | 9 +++------ .../domain/main-entities/mcu-src-category/dto.go | 6 ++---- internal/domain/main-entities/mcu-src/dto.go | 11 ++++------- internal/domain/main-entities/mcu-sub-src/dto.go | 11 ++++------- .../main-entities/medical-action-src-item/dto.go | 9 +++------ .../domain/main-entities/medical-action-src/dto.go | 11 ++++------- .../main-entities/medication-item-dist/dto.go | 9 +++------ .../domain/main-entities/medication-item/dto.go | 10 ++++------ internal/domain/main-entities/medication/dto.go | 14 ++++++-------- .../domain/main-entities/medicine-group/dto.go | 9 +++------ .../domain/main-entities/medicine-method/dto.go | 9 +++------ .../domain/main-entities/medicine-mix-item/dto.go | 9 +++------ internal/domain/main-entities/medicine-mix/dto.go | 9 +++------ internal/domain/main-entities/medicine/dto.go | 11 ++++------- internal/domain/main-entities/nurse/dto.go | 9 +++------ internal/domain/main-entities/nutritionist/dto.go | 9 +++------ internal/domain/main-entities/patient/dto.go | 10 ++++------ .../domain/main-entities/person-address/dto.go | 4 +--- .../domain/main-entities/person-contact/dto.go | 4 +--- .../domain/main-entities/person-relative/dto.go | 9 +++------ internal/domain/main-entities/person/dto.go | 13 ++++++------- internal/domain/main-entities/pharmacist/dto.go | 9 +++------ .../domain/main-entities/pharmacy-company/dto.go | 5 +---- .../domain/main-entities/practice-schedule/dto.go | 9 +++------ .../domain/main-entities/prescription-item/dto.go | 10 ++++------ internal/domain/main-entities/prescription/dto.go | 13 +++++-------- internal/domain/main-entities/procedure-src/dto.go | 13 +++++-------- internal/domain/main-entities/province/dto.go | 13 +++++++------ internal/domain/main-entities/regency/dto.go | 10 +++++----- internal/domain/main-entities/room/dto.go | 9 +++------ internal/domain/main-entities/sbar/dto.go | 12 +++++------- internal/domain/main-entities/soapi/dto.go | 9 +++------ .../domain/main-entities/specialist-intern/dto.go | 9 +++------ internal/domain/main-entities/specialist/dto.go | 11 ++++------- internal/domain/main-entities/subspecialist/dto.go | 11 ++++------- internal/domain/main-entities/unit/dto.go | 11 ++++------- internal/domain/main-entities/uom/dto.go | 11 ++++------- internal/domain/main-entities/user/dto.go | 9 ++++----- internal/domain/main-entities/user/entity.go | 3 ++- internal/domain/main-entities/village/dto.go | 9 +++++---- internal/use-case/main-use-case/adime/case.go | 13 +++++++------ internal/use-case/main-use-case/ambulatory/case.go | 13 +++++++------ .../use-case/main-use-case/consultation/case.go | 13 +++++++------ internal/use-case/main-use-case/counter/case.go | 13 +++++++------ .../main-use-case/device-order-item/case.go | 13 +++++++------ .../use-case/main-use-case/device-order/case.go | 13 +++++++------ internal/use-case/main-use-case/device/case.go | 13 +++++++------ .../use-case/main-use-case/diagnose-src/case.go | 13 +++++++------ internal/use-case/main-use-case/district/case.go | 13 +++++++------ .../main-use-case/division-position/case.go | 13 +++++++------ internal/use-case/main-use-case/division/case.go | 13 +++++++------ internal/use-case/main-use-case/division/lib.go | 10 ++++++++++ internal/use-case/main-use-case/doctor-fee/case.go | 13 +++++++------ internal/use-case/main-use-case/doctor/case.go | 13 +++++++------ internal/use-case/main-use-case/emergency/case.go | 13 +++++++------ internal/use-case/main-use-case/employee/case.go | 13 +++++++------ internal/use-case/main-use-case/encounter/case.go | 13 +++++++------ internal/use-case/main-use-case/ethnic/case.go | 13 +++++++------ internal/use-case/main-use-case/infra/case.go | 13 +++++++------ internal/use-case/main-use-case/inpatient/case.go | 13 +++++++------ .../use-case/main-use-case/installation/case.go | 13 +++++++------ .../main-use-case/insurance-company/case.go | 13 +++++++------ internal/use-case/main-use-case/item-price/case.go | 13 +++++++------ internal/use-case/main-use-case/item/case.go | 13 +++++++------ internal/use-case/main-use-case/laborant/case.go | 13 +++++++------ internal/use-case/main-use-case/language/case.go | 13 +++++++------ .../main-use-case/material-order-item/case.go | 13 +++++++------ .../use-case/main-use-case/material-order/case.go | 13 +++++++------ internal/use-case/main-use-case/material/case.go | 13 +++++++------ .../use-case/main-use-case/mcu-order-item/case.go | 13 +++++++------ .../main-use-case/mcu-order-sub-item/case.go | 13 +++++++------ internal/use-case/main-use-case/mcu-order/case.go | 13 +++++++------ .../main-use-case/mcu-src-category/case.go | 13 +++++++------ internal/use-case/main-use-case/mcu-src/case.go | 13 +++++++------ .../use-case/main-use-case/mcu-sub-src/case.go | 13 +++++++------ .../main-use-case/medical-action-src-item/case.go | 13 +++++++------ .../main-use-case/medical-action-src/case.go | 13 +++++++------ .../main-use-case/medication-item-dist/case.go | 13 +++++++------ .../use-case/main-use-case/medication-item/case.go | 13 +++++++------ internal/use-case/main-use-case/medication/case.go | 13 +++++++------ .../use-case/main-use-case/medicine-group/case.go | 13 +++++++------ .../use-case/main-use-case/medicine-method/case.go | 13 +++++++------ .../main-use-case/medicine-mix-item/case.go | 13 +++++++------ .../use-case/main-use-case/medicine-mix/case.go | 13 +++++++------ internal/use-case/main-use-case/medicine/case.go | 13 +++++++------ internal/use-case/main-use-case/nurse/case.go | 13 +++++++------ .../use-case/main-use-case/nutritionist/case.go | 13 +++++++------ internal/use-case/main-use-case/patient/case.go | 13 +++++++------ .../use-case/main-use-case/person-address/case.go | 13 +++++++------ .../use-case/main-use-case/person-contact/case.go | 13 +++++++------ .../use-case/main-use-case/person-relative/case.go | 13 +++++++------ internal/use-case/main-use-case/person/case.go | 13 +++++++------ internal/use-case/main-use-case/pharmacist/case.go | 13 +++++++------ .../main-use-case/pharmacy-company/case.go | 13 +++++++------ .../main-use-case/practice-schedule/case.go | 13 +++++++------ .../main-use-case/prescription-item/case.go | 13 +++++++------ .../use-case/main-use-case/prescription/case.go | 13 +++++++------ .../use-case/main-use-case/procedure-src/case.go | 13 +++++++------ internal/use-case/main-use-case/province/case.go | 13 +++++++------ internal/use-case/main-use-case/regency/case.go | 13 +++++++------ internal/use-case/main-use-case/room/case.go | 13 +++++++------ internal/use-case/main-use-case/sbar/case.go | 13 +++++++------ internal/use-case/main-use-case/soapi/case.go | 13 +++++++------ .../main-use-case/specialist-intern/case.go | 13 +++++++------ internal/use-case/main-use-case/specialist/case.go | 13 +++++++------ .../use-case/main-use-case/subspecialist/case.go | 13 +++++++------ internal/use-case/main-use-case/unit/case.go | 13 +++++++------ internal/use-case/main-use-case/uom/case.go | 13 +++++++------ internal/use-case/main-use-case/user/case.go | 13 +++++++------ internal/use-case/main-use-case/village/case.go | 13 +++++++------ 144 files changed, 759 insertions(+), 845 deletions(-) create mode 100644 internal/domain/base-entities/core/dto.go diff --git a/go.mod b/go.mod index 18b17db3..26a41b29 100644 --- a/go.mod +++ b/go.mod @@ -11,11 +11,11 @@ require ( github.com/jackc/pgx/v5 v5.5.5 github.com/karincake/apem v0.0.17 github.com/karincake/dodol v0.0.1 - github.com/karincake/getuk v0.1.0 + github.com/karincake/getuk v0.1.1 github.com/karincake/hongkue v0.0.4 github.com/karincake/lepet v0.0.1 github.com/karincake/risoles v0.0.3 - github.com/karincake/semprit v0.0.3 + github.com/karincake/semprit v0.0.6 github.com/karincake/serabi v0.0.14 github.com/minio/minio-go/v7 v7.0.95 github.com/rs/zerolog v1.33.0 @@ -38,6 +38,7 @@ require ( github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect + github.com/karincake/pentol v0.0.3 // indirect github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.11 // indirect github.com/mattn/go-colorable v0.1.13 // indirect diff --git a/go.sum b/go.sum index 8f09ca78..b0534e4d 100644 --- a/go.sum +++ b/go.sum @@ -79,16 +79,18 @@ github.com/karincake/apem v0.0.17 h1:y3WXCr9GWLFFFH4Qyq/VWlWWpijHh5zpTc3Lm96twa4 github.com/karincake/apem v0.0.17/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM= github.com/karincake/dodol v0.0.1 h1:jUXmJh1r0Ei4fmHPZ6IUkoplW/V9d27L63JEl6zudL0= github.com/karincake/dodol v0.0.1/go.mod h1:2f1NcvkvY0J3GMUkwILNDYVvRUpz0W3lpPp/Ha/Ld24= -github.com/karincake/getuk v0.1.0 h1:jcIsASrr0UDE528GN7Ua6n9UFyRgUypsWh8Or8wzCO0= -github.com/karincake/getuk v0.1.0/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c= +github.com/karincake/getuk v0.1.1 h1:zygZ9N5tk+sWwiRSo1SmlNwcAdl+qQVxmOG6jbQ7X1g= +github.com/karincake/getuk v0.1.1/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c= github.com/karincake/hongkue v0.0.4 h1:oWthq6cDg5DvDm1Z3e7mCLOATQf+oAdtHxN9OPnCfA8= github.com/karincake/hongkue v0.0.4/go.mod h1:YVi5Lyh3DE+GRHx2OSODOr7FwvLi8U4idvcPHO7yeag= github.com/karincake/lepet v0.0.1 h1:eq/cwn5BBg0jWZ1c/MmvhFIBma0zBpVs2LwkfDOncy4= github.com/karincake/lepet v0.0.1/go.mod h1:U84w7olXO3BPJw2Hu6MBonFmJmPKaFjtyAj1HTu3z1A= +github.com/karincake/pentol v0.0.3 h1:NgiR101yZuqZjYT7LiUkOgsFS+OzUHxceBpL9RbAXeg= +github.com/karincake/pentol v0.0.3/go.mod h1:6F2jlwLkVtNuC0nW/gfdU+B9bZoiIVN+IEdB2WIlKgQ= github.com/karincake/risoles v0.0.3 h1:7VBShf2yC6NqD0PotQcb0i8Xe6mJeTRrHnE0qzKf7NU= github.com/karincake/risoles v0.0.3/go.mod h1:u4YS+rPp92ODTbGC4RUx4DxKoThnmPjBl1CNdnmKD/c= -github.com/karincake/semprit v0.0.3 h1:znleGRu73xrHk6a70+jRQgVh9VF3TAhttQz6vfgNdyM= -github.com/karincake/semprit v0.0.3/go.mod h1:nLtNmWlHkxMKG0IMzqnnfkn1L/RVYGXVW3LchfYQMu8= +github.com/karincake/semprit v0.0.6 h1:TvY9Np2jEmbGcucbxBO7GzdZ9AiIhSVe5+ki1rgoocE= +github.com/karincake/semprit v0.0.6/go.mod h1:pZ63Q2WHw3mrsRPm6LSx999tRD+N8eYzpfN/vP3aEoQ= github.com/karincake/serabi v0.0.14 h1:yK3nBLRXdoUNSUDIfbZqIQxnZ6U6Ij5QEO8d5QzZzsw= github.com/karincake/serabi v0.0.14/go.mod h1:GcnPBWb+UotDxvb/a2CKwourCEyVIL4P9+YxVmZ5zgk= github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= diff --git a/internal/domain/base-entities/core/dto.go b/internal/domain/base-entities/core/dto.go new file mode 100644 index 00000000..f0bfc6b0 --- /dev/null +++ b/internal/domain/base-entities/core/dto.go @@ -0,0 +1,7 @@ +package core + +type Pagination struct { + PageNumber int `json:"page-number"` + PageSize int `json:"page-size"` + PageNoLimit int `json:"page-no-limit"` +} diff --git a/internal/domain/main-entities/adime/dto.go b/internal/domain/main-entities/adime/dto.go index 39c48ab7..e1c67451 100644 --- a/internal/domain/main-entities/adime/dto.go +++ b/internal/domain/main-entities/adime/dto.go @@ -1,12 +1,13 @@ package adime import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" eem "simrs-vx/internal/domain/main-entities/employee" ee "simrs-vx/internal/domain/main-entities/encounter" pa "simrs-vx/pkg/auth-helper" - "time" ) type CreateDto struct { @@ -20,8 +21,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -29,10 +31,6 @@ type FilterDto struct { Employee_Id *uint `json:"employee_id"` Time *time.Time `json:"time"` Value *string `json:"value"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/ambulatory/dto.go b/internal/domain/main-entities/ambulatory/dto.go index 68147819..4236f6bd 100644 --- a/internal/domain/main-entities/ambulatory/dto.go +++ b/internal/domain/main-entities/ambulatory/dto.go @@ -13,17 +13,14 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Class_Code ere.AmbulatoryClassCode `json:"class_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/appointment/dto.go b/internal/domain/main-entities/appointment/dto.go index ff91ae92..356abf5a 100644 --- a/internal/domain/main-entities/appointment/dto.go +++ b/internal/domain/main-entities/appointment/dto.go @@ -25,10 +25,7 @@ type ReadListDto struct { Person_PhoneNumber string `json:"person_phoneNumber"` PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code"` RefNumber string `json:"refNumber"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/consultation/dto.go b/internal/domain/main-entities/consultation/dto.go index 1969ce4f..a13231da 100644 --- a/internal/domain/main-entities/consultation/dto.go +++ b/internal/domain/main-entities/consultation/dto.go @@ -19,18 +19,15 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Unit_Id *uint `json:"unit_id"` Doctor_Id *uint `json:"doctor_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/counter/dto.go b/internal/domain/main-entities/counter/dto.go index 58e1a1d0..ae2a2e18 100644 --- a/internal/domain/main-entities/counter/dto.go +++ b/internal/domain/main-entities/counter/dto.go @@ -20,10 +20,7 @@ type ReadListDto struct { Parent_Id *uint16 `json:"parent_id"` Type_Code string `json:"type_code"` Queue_Code string `json:"queue_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/device-order-item/dto.go b/internal/domain/main-entities/device-order-item/dto.go index 3added12..90c6ea2b 100644 --- a/internal/domain/main-entities/device-order-item/dto.go +++ b/internal/domain/main-entities/device-order-item/dto.go @@ -14,18 +14,15 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { DeviceOrder_Id *uint `json:"deviceOrder_id"` Device_Id *uint `json:"device_id"` Count uint8 `json:"count"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/device-order/dto.go b/internal/domain/main-entities/device-order/dto.go index 6d61757e..a045a096 100644 --- a/internal/domain/main-entities/device-order/dto.go +++ b/internal/domain/main-entities/device-order/dto.go @@ -20,17 +20,15 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataStatusCode `json:"status_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Doctor_Id *uint `json:"doctor_id"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/device/dto.go b/internal/domain/main-entities/device/dto.go index c7a386cd..b8046c75 100644 --- a/internal/domain/main-entities/device/dto.go +++ b/internal/domain/main-entities/device/dto.go @@ -17,9 +17,10 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { @@ -28,10 +29,6 @@ type FilterDto struct { Uom_Code string `json:"uom_code"` Infra_Id *uint16 `json:"infra_id"` Item_Id *uint `json:"item_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/diagnose-src/dto.go b/internal/domain/main-entities/diagnose-src/dto.go index 7b11f8b8..2f135368 100644 --- a/internal/domain/main-entities/diagnose-src/dto.go +++ b/internal/domain/main-entities/diagnose-src/dto.go @@ -11,13 +11,10 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - IndName string `json:"indName"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Code string `json:"code"` + Name string `json:"name"` + IndName string `json:"indName"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/district/dto.go b/internal/domain/main-entities/district/dto.go index 57f41892..869aa9c2 100644 --- a/internal/domain/main-entities/district/dto.go +++ b/internal/domain/main-entities/district/dto.go @@ -1,6 +1,9 @@ package district -import ev "simrs-vx/internal/domain/main-entities/village" +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ev "simrs-vx/internal/domain/main-entities/village" +) type CreateDto struct { Regency_Code string `json:"regency_code" validate:"numeric;maxLength=4"` @@ -12,10 +15,7 @@ type ReadListDto struct { Regency_Code string `json:"regency_code"` Code string `json:"code"` Name string `json:"name"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index 592985fe..20664a7e 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -13,18 +13,15 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Division_Id *uint16 `json:"division_id"` Code string `json:"code"` Name string `json:"name"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index ea45ee1d..2babaf28 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -12,19 +12,17 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination + OnlyHaveChildren bool `json:"only-have-children"` } type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Parent_Id *uint16 `json:"parent_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/doctor-fee/dto.go b/internal/domain/main-entities/doctor-fee/dto.go index 9e22d4d2..c11467dd 100644 --- a/internal/domain/main-entities/doctor-fee/dto.go +++ b/internal/domain/main-entities/doctor-fee/dto.go @@ -16,8 +16,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -25,10 +26,6 @@ type FilterDto struct { FeeType_Code *ero.DoctorFeeTypeCode `json:"feeType_code"` Price *float64 `json:"price"` Item_Id *uint `json:"item_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/doctor/dto.go b/internal/domain/main-entities/doctor/dto.go index 3d744a32..b6177607 100644 --- a/internal/domain/main-entities/doctor/dto.go +++ b/internal/domain/main-entities/doctor/dto.go @@ -19,8 +19,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -30,10 +31,6 @@ type FilterDto struct { Unit_Id *uint `json:"unit_id"` Specialist_Id *uint16 `json:"specialist_id"` Subspecialist_Id *uint16 `json:"subspecialist_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/emergency/dto.go b/internal/domain/main-entities/emergency/dto.go index b98096f2..ff9041a6 100644 --- a/internal/domain/main-entities/emergency/dto.go +++ b/internal/domain/main-entities/emergency/dto.go @@ -13,17 +13,14 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Class_Code ere.EmergencyClassCode `json:"class_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/employee/dto.go b/internal/domain/main-entities/employee/dto.go index 762e72a4..fa0a240c 100644 --- a/internal/domain/main-entities/employee/dto.go +++ b/internal/domain/main-entities/employee/dto.go @@ -5,6 +5,7 @@ import ( ed "simrs-vx/internal/domain/main-entities/division" ep "simrs-vx/internal/domain/main-entities/person" eu "simrs-vx/internal/domain/main-entities/user" + erc "simrs-vx/internal/domain/references/common" ) @@ -18,8 +19,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -28,10 +30,6 @@ type FilterDto struct { Division_Code *string `json:"division_code"` Number *string `json:"number"` Status_Code erc.ActiveStatusCode `json:"status_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index a431ad4e..b0415901 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -1,6 +1,8 @@ package encounter import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" ea "simrs-vx/internal/domain/main-entities/appointment" ed "simrs-vx/internal/domain/main-entities/doctor" @@ -8,9 +10,9 @@ import ( es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" + erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" - "time" ) type CreateDto struct { @@ -31,8 +33,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -53,10 +56,6 @@ type FilterDto struct { MedicalDischargeEducation *string `json:"medicalDischargeEducation"` AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/ethnic/dto.go b/internal/domain/main-entities/ethnic/dto.go index ff0d41a4..a25ced65 100644 --- a/internal/domain/main-entities/ethnic/dto.go +++ b/internal/domain/main-entities/ethnic/dto.go @@ -10,13 +10,10 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - Search string `json:"search"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index b51937ce..33b4fe62 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -21,9 +21,10 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { @@ -32,10 +33,6 @@ type FilterDto struct { InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code"` Parent_Id *uint16 `json:"parent_id"` Item_Id *uint `json:"item_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/inpatient/dto.go b/internal/domain/main-entities/inpatient/dto.go index acf1442a..6592db69 100644 --- a/internal/domain/main-entities/inpatient/dto.go +++ b/internal/domain/main-entities/inpatient/dto.go @@ -4,6 +4,7 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" ei "simrs-vx/internal/domain/main-entities/infra" + ere "simrs-vx/internal/domain/references/encounter" ) @@ -15,18 +16,15 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` Class_Code ere.InpatientClassCode `json:"class_code"` Infra_Id *uint16 `json:"infra_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index 15377317..ee307677 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -2,6 +2,7 @@ package installation import ( ecore "simrs-vx/internal/domain/base-entities/core" + ere "simrs-vx/internal/domain/references/encounter" ) @@ -15,10 +16,7 @@ type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/insurance-company/dto.go b/internal/domain/main-entities/insurance-company/dto.go index 4ca58076..b99b546e 100644 --- a/internal/domain/main-entities/insurance-company/dto.go +++ b/internal/domain/main-entities/insurance-company/dto.go @@ -15,8 +15,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -25,10 +26,6 @@ type FilterDto struct { Regency_Code *string `json:"regency_code"` Address string `json:"address"` PhoneNumber string `json:"phoneNumber"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/item-price/dto.go b/internal/domain/main-entities/item-price/dto.go index b4740788..a8ec2f55 100644 --- a/internal/domain/main-entities/item-price/dto.go +++ b/internal/domain/main-entities/item-price/dto.go @@ -14,18 +14,15 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Item_Id *uint `json:"item_id"` Price float64 `json:"price"` InsuranceCompany_Code *string `json:"insuranceCompany_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/item/dto.go b/internal/domain/main-entities/item/dto.go index 6c364828..32844b43 100644 --- a/internal/domain/main-entities/item/dto.go +++ b/internal/domain/main-entities/item/dto.go @@ -17,8 +17,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -28,10 +29,6 @@ type FilterDto struct { Uom_Code *string `json:"uom_code"` Infra_Id *uint16 `json:"infra_id"` Stock *int `json:"stock"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/laborant/dto.go b/internal/domain/main-entities/laborant/dto.go index 85c0176e..aff95200 100644 --- a/internal/domain/main-entities/laborant/dto.go +++ b/internal/domain/main-entities/laborant/dto.go @@ -12,17 +12,14 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Employee_Id *uint `json:"employee_id"` IHS_Number *string `json:"ihs_number"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/language/dto.go b/internal/domain/main-entities/language/dto.go index 7d2e7239..79ae648c 100644 --- a/internal/domain/main-entities/language/dto.go +++ b/internal/domain/main-entities/language/dto.go @@ -10,13 +10,10 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - Search string `json:"search"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/material-order-item/dto.go b/internal/domain/main-entities/material-order-item/dto.go index 81882e51..91e3c52d 100644 --- a/internal/domain/main-entities/material-order-item/dto.go +++ b/internal/domain/main-entities/material-order-item/dto.go @@ -14,18 +14,15 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { MaterialOrder_Id *uint `json:"materialOrder_id"` Material_Id *uint `json:"material_id"` Count *uint16 `json:"count"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/material-order/dto.go b/internal/domain/main-entities/material-order/dto.go index 1c58c379..553347eb 100644 --- a/internal/domain/main-entities/material-order/dto.go +++ b/internal/domain/main-entities/material-order/dto.go @@ -20,17 +20,14 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` 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"` diff --git a/internal/domain/main-entities/material/dto.go b/internal/domain/main-entities/material/dto.go index 627d49c1..16f6b7c7 100644 --- a/internal/domain/main-entities/material/dto.go +++ b/internal/domain/main-entities/material/dto.go @@ -18,9 +18,10 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { @@ -30,10 +31,6 @@ type FilterDto struct { Infra_Id *uint16 `json:"infra_id"` Stock *int `json:"stock"` Item_Id *uint `json:"item_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/mcu-order-item/dto.go b/internal/domain/main-entities/mcu-order-item/dto.go index 24aba1b8..61590ffc 100644 --- a/internal/domain/main-entities/mcu-order-item/dto.go +++ b/internal/domain/main-entities/mcu-order-item/dto.go @@ -18,8 +18,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -27,10 +28,6 @@ type FilterDto struct { McuSrc_Id *uint `json:"mcuSrc_id"` Result *string `json:"result"` 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 uint `json:"id"` diff --git a/internal/domain/main-entities/mcu-order-sub-item/dto.go b/internal/domain/main-entities/mcu-order-sub-item/dto.go index cb250200..bfd2312a 100644 --- a/internal/domain/main-entities/mcu-order-sub-item/dto.go +++ b/internal/domain/main-entities/mcu-order-sub-item/dto.go @@ -16,8 +16,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -25,10 +26,6 @@ type FilterDto struct { McuSrc_Id *uint `json:"mcuSrc_id"` Result *string `json:"result"` 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 uint `json:"id"` diff --git a/internal/domain/main-entities/mcu-order/dto.go b/internal/domain/main-entities/mcu-order/dto.go index 0f76b576..75f3647f 100644 --- a/internal/domain/main-entities/mcu-order/dto.go +++ b/internal/domain/main-entities/mcu-order/dto.go @@ -27,8 +27,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -40,10 +41,6 @@ type FilterDto struct { Number uint8 `json:"number"` Temperature float64 `json:"temperature"` McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code""` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { Id uint `json:"id"` diff --git a/internal/domain/main-entities/mcu-src-category/dto.go b/internal/domain/main-entities/mcu-src-category/dto.go index 03e7cf79..06ab351c 100644 --- a/internal/domain/main-entities/mcu-src-category/dto.go +++ b/internal/domain/main-entities/mcu-src-category/dto.go @@ -2,6 +2,7 @@ package division import ( ecore "simrs-vx/internal/domain/base-entities/core" + ere "simrs-vx/internal/domain/references/encounter" ) @@ -15,10 +16,7 @@ type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` Scope_Code *ere.CheckupScopeCode `json:"scope_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index e64c0d5d..447bb64f 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -14,19 +14,16 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { Code string `json:"code"` Name string `json:"name"` McuSrcCategory_Code *string `json:"mcuSrcCategory_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go index a112b3c4..eb3a2c5b 100644 --- a/internal/domain/main-entities/mcu-sub-src/dto.go +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -15,19 +15,16 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { Code string `json:"code"` Name string `json:"name"` CheckupCategory_Code *string `json:"checkupCategory_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medical-action-src-item/dto.go b/internal/domain/main-entities/medical-action-src-item/dto.go index 75836c14..357d5f1b 100644 --- a/internal/domain/main-entities/medical-action-src-item/dto.go +++ b/internal/domain/main-entities/medical-action-src-item/dto.go @@ -15,18 +15,15 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { MedicalActionSrc_Id *uint `json:"medicalActionSrc_id"` ProcedureSrc_Id *uint `json:"procedureSrc_id"` Item_Id *uint `json:"item_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index 6480e732..a6178e71 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -13,19 +13,16 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Item_Id *uint `json:"item_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medication-item-dist/dto.go b/internal/domain/main-entities/medication-item-dist/dto.go index 8d5c43e1..ffafede0 100644 --- a/internal/domain/main-entities/medication-item-dist/dto.go +++ b/internal/domain/main-entities/medication-item-dist/dto.go @@ -18,8 +18,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -27,10 +28,6 @@ type FilterDto struct { DateTime *time.Time `json:"dateTime"` Remain float64 `json:"remain"` Nurse_Id *uint `json:"nurse_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go index a43473d2..bf9d9f28 100644 --- a/internal/domain/main-entities/medication-item/dto.go +++ b/internal/domain/main-entities/medication-item/dto.go @@ -5,6 +5,7 @@ import ( eme "simrs-vx/internal/domain/main-entities/medication" em "simrs-vx/internal/domain/main-entities/medicine" emm "simrs-vx/internal/domain/main-entities/medicine-mix" + erc "simrs-vx/internal/domain/references/common" ) @@ -26,8 +27,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -41,10 +43,6 @@ type FilterDto struct { IsRedeemed bool `json:"isRedeemed"` Quantity float64 `json:"quantity"` Note *string `json:"note" gorm:"size:1024"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/medication/dto.go b/internal/domain/main-entities/medication/dto.go index 86c77b2f..0db720f4 100644 --- a/internal/domain/main-entities/medication/dto.go +++ b/internal/domain/main-entities/medication/dto.go @@ -1,12 +1,13 @@ package medication import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" ep "simrs-vx/internal/domain/main-entities/pharmacist" - erc "simrs-vx/internal/domain/references/common" - "time" + erc "simrs-vx/internal/domain/references/common" pa "simrs-vx/pkg/auth-helper" ) @@ -20,8 +21,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -29,10 +31,6 @@ type FilterDto struct { IssuedAt *time.Time `json:"issuedAt"` Pharmacist_Id *uint `json:"pharmacist_id"` 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 uint `json:"id"` diff --git a/internal/domain/main-entities/medicine-group/dto.go b/internal/domain/main-entities/medicine-group/dto.go index 88de7c21..c392e46f 100644 --- a/internal/domain/main-entities/medicine-group/dto.go +++ b/internal/domain/main-entities/medicine-group/dto.go @@ -10,12 +10,9 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Code string `json:"code"` + Name string `json:"name"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medicine-method/dto.go b/internal/domain/main-entities/medicine-method/dto.go index 5df40a7a..337eb6e6 100644 --- a/internal/domain/main-entities/medicine-method/dto.go +++ b/internal/domain/main-entities/medicine-method/dto.go @@ -10,12 +10,9 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Code string `json:"code"` + Name string `json:"name"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medicine-mix-item/dto.go b/internal/domain/main-entities/medicine-mix-item/dto.go index b00114c5..5c372654 100644 --- a/internal/domain/main-entities/medicine-mix-item/dto.go +++ b/internal/domain/main-entities/medicine-mix-item/dto.go @@ -14,8 +14,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -23,10 +24,6 @@ type FilterDto struct { Medicine_Id *uint `json:"medicine_id"` Dose *uint8 `json:"dose"` Note *string `json:"note" gom:"size:1024"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medicine-mix/dto.go b/internal/domain/main-entities/medicine-mix/dto.go index 6f7cd424..8c9b2c7f 100644 --- a/internal/domain/main-entities/medicine-mix/dto.go +++ b/internal/domain/main-entities/medicine-mix/dto.go @@ -12,12 +12,9 @@ type CreateDto struct { } type ReadListDto struct { - Name string `json:"name"` - Uom_Code *string `json:"uom_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Name string `json:"name"` + Uom_Code *string `json:"uom_code"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medicine/dto.go b/internal/domain/main-entities/medicine/dto.go index df45de8f..08352c20 100644 --- a/internal/domain/main-entities/medicine/dto.go +++ b/internal/domain/main-entities/medicine/dto.go @@ -23,9 +23,10 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { @@ -38,10 +39,6 @@ type FilterDto struct { Infra_Id *uint16 `json:"infra_id"` Stock *int `json:"stock"` Item_Id *uint `json:"item_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/nurse/dto.go b/internal/domain/main-entities/nurse/dto.go index f59d2ee5..4aa37c25 100644 --- a/internal/domain/main-entities/nurse/dto.go +++ b/internal/domain/main-entities/nurse/dto.go @@ -16,8 +16,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -25,10 +26,6 @@ type FilterDto struct { IHS_Number *string `json:"ihs_number"` Unit_Id *uint16 `json:"unit_id"` Infra_Id *uint16 `json:"infra_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/nutritionist/dto.go b/internal/domain/main-entities/nutritionist/dto.go index 7f8c2229..b884e413 100644 --- a/internal/domain/main-entities/nutritionist/dto.go +++ b/internal/domain/main-entities/nutritionist/dto.go @@ -12,17 +12,14 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Employee_Id *uint `json:"employee_id"` IHS_Number *string `json:"ihs_number"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index b8630a0f..1c084a54 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -9,6 +9,7 @@ import ( epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" epr "simrs-vx/internal/domain/main-entities/person-relative" + erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" ) @@ -25,8 +26,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -34,10 +36,6 @@ type FilterDto struct { RegisteredAt *time.Time `json:"registeredAt"` Status_Code erc.ActiveStatusCode `json:"status_code"` Number *string `json:"number"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/person-address/dto.go b/internal/domain/main-entities/person-address/dto.go index 5f5dad52..0fcd52df 100644 --- a/internal/domain/main-entities/person-address/dto.go +++ b/internal/domain/main-entities/person-address/dto.go @@ -13,9 +13,7 @@ type CreateDto struct { } type ReadListDto struct { - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/person-contact/dto.go b/internal/domain/main-entities/person-contact/dto.go index c2b684e2..577d3776 100644 --- a/internal/domain/main-entities/person-contact/dto.go +++ b/internal/domain/main-entities/person-contact/dto.go @@ -12,9 +12,7 @@ type CreateDto struct { } type ReadListDto struct { - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/person-relative/dto.go b/internal/domain/main-entities/person-relative/dto.go index deb29886..76276f92 100644 --- a/internal/domain/main-entities/person-relative/dto.go +++ b/internal/domain/main-entities/person-relative/dto.go @@ -22,8 +22,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -39,10 +40,6 @@ type FilterDto struct { Occupation_Code *erp.OcupationCode `json:"occupation_code"` Occupation_Name *string `json:"occupation_name"` Responsible bool `json:"responsible"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/person/dto.go b/internal/domain/main-entities/person/dto.go index fd38822b..b946436b 100644 --- a/internal/domain/main-entities/person/dto.go +++ b/internal/domain/main-entities/person/dto.go @@ -1,13 +1,15 @@ package person import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/ethnic" epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" epr "simrs-vx/internal/domain/main-entities/person-relative" + erp "simrs-vx/internal/domain/references/person" - "time" ) type CreateDto struct { @@ -30,8 +32,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -50,10 +53,6 @@ type FilterDto struct { Ocupation_Name *string `json:"occupation_name"` Ethnic_Code *string `json:"ethnic_code"` Language_Code *string `json:"language_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/pharmacist/dto.go b/internal/domain/main-entities/pharmacist/dto.go index 39ba0d85..9a42f2ca 100644 --- a/internal/domain/main-entities/pharmacist/dto.go +++ b/internal/domain/main-entities/pharmacist/dto.go @@ -12,17 +12,14 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { Employee_Id *uint `json:"employee_id"` IHS_Number *string `json:"ihs_number"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/pharmacy-company/dto.go b/internal/domain/main-entities/pharmacy-company/dto.go index 138c58ad..d28de67e 100644 --- a/internal/domain/main-entities/pharmacy-company/dto.go +++ b/internal/domain/main-entities/pharmacy-company/dto.go @@ -14,10 +14,7 @@ type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` Regency_Code string `json:"regency_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/practice-schedule/dto.go b/internal/domain/main-entities/practice-schedule/dto.go index 505d793e..5ec6fd2e 100644 --- a/internal/domain/main-entities/practice-schedule/dto.go +++ b/internal/domain/main-entities/practice-schedule/dto.go @@ -15,8 +15,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -25,10 +26,6 @@ type FilterDto struct { Day_Code *erc.DayCode `json:"day_code"` StartTime *string `json:"startTime"` EndTime *string `json:"endTime"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index 4c278b6f..3b70394f 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -5,6 +5,7 @@ import ( em "simrs-vx/internal/domain/main-entities/medicine" emm "simrs-vx/internal/domain/main-entities/medicine-mix" ep "simrs-vx/internal/domain/main-entities/prescription" + erc "simrs-vx/internal/domain/references/common" ) @@ -24,8 +25,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -37,10 +39,6 @@ type FilterDto struct { Interval uint8 `json:"interval"` IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` Quantity float64 `json:"quantity"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/prescription/dto.go b/internal/domain/main-entities/prescription/dto.go index 107509e1..bc538517 100644 --- a/internal/domain/main-entities/prescription/dto.go +++ b/internal/domain/main-entities/prescription/dto.go @@ -1,12 +1,12 @@ package prescription import ( + "time" + 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" ) @@ -19,8 +19,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -28,10 +29,6 @@ type FilterDto struct { 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 uint `json:"id"` diff --git a/internal/domain/main-entities/procedure-src/dto.go b/internal/domain/main-entities/procedure-src/dto.go index 687fbad6..f047fba1 100644 --- a/internal/domain/main-entities/procedure-src/dto.go +++ b/internal/domain/main-entities/procedure-src/dto.go @@ -11,14 +11,11 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - IndName string `json:"indName"` - Search string `json:"search"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Code string `json:"code"` + Name string `json:"name"` + IndName string `json:"indName"` + Search string `json:"search"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/province/dto.go b/internal/domain/main-entities/province/dto.go index 5bd519a8..d2cfc1ca 100644 --- a/internal/domain/main-entities/province/dto.go +++ b/internal/domain/main-entities/province/dto.go @@ -1,17 +1,18 @@ package province +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + type CreateDto struct { Code string `json:"code" validate:"required;minLength=2;maxLength=2"` Name string `json:"name" validate:"required;maxLength=10"` } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Code string `json:"code"` + Name string `json:"name"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/regency/dto.go b/internal/domain/main-entities/regency/dto.go index 7fb7546b..e4d76df2 100644 --- a/internal/domain/main-entities/regency/dto.go +++ b/internal/domain/main-entities/regency/dto.go @@ -1,6 +1,9 @@ package regency -import ed "simrs-vx/internal/domain/main-entities/district" +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/district" +) type CreateDto struct { Province_Code string `json:"province_code" validate:"numeric;maxLength=2"` @@ -12,10 +15,7 @@ type ReadListDto struct { Province_Code string `json:"province_code"` Code string `json:"code"` Name string `json:"name"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/room/dto.go b/internal/domain/main-entities/room/dto.go index eff76d0a..acee005e 100644 --- a/internal/domain/main-entities/room/dto.go +++ b/internal/domain/main-entities/room/dto.go @@ -17,8 +17,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -26,10 +27,6 @@ type FilterDto struct { Unit_Id *uint16 `json:"unit_id"` Specialist_Id *uint16 `json:"specialist_id"` Subspecialist_Id *uint16 `json:"subspecialist_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/sbar/dto.go b/internal/domain/main-entities/sbar/dto.go index edba338c..40f992e4 100644 --- a/internal/domain/main-entities/sbar/dto.go +++ b/internal/domain/main-entities/sbar/dto.go @@ -1,12 +1,13 @@ package sbar import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" eem "simrs-vx/internal/domain/main-entities/employee" ee "simrs-vx/internal/domain/main-entities/encounter" pa "simrs-vx/pkg/auth-helper" - "time" ) type CreateDto struct { @@ -20,8 +21,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -29,10 +31,6 @@ type FilterDto struct { Employee_Id *uint `json:"employee_id"` Time *time.Time `json:"time"` Value *string `json:"value"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/soapi/dto.go b/internal/domain/main-entities/soapi/dto.go index 172b38b2..b2830d32 100644 --- a/internal/domain/main-entities/soapi/dto.go +++ b/internal/domain/main-entities/soapi/dto.go @@ -24,8 +24,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -34,10 +35,6 @@ type FilterDto struct { Time *time.Time `json:"time"` TypeCode erc.SoapiTypeCode `json:"typeCode"` Value *string `json:"value"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/specialist-intern/dto.go b/internal/domain/main-entities/specialist-intern/dto.go index 87044ba7..46563c8d 100644 --- a/internal/domain/main-entities/specialist-intern/dto.go +++ b/internal/domain/main-entities/specialist-intern/dto.go @@ -17,8 +17,9 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination } type FilterDto struct { @@ -26,10 +27,6 @@ type FilterDto struct { Specialist_Id *uint16 `json:"specialist_id"` Subspecialist_Id *uint16 `json:"subspecialist_id"` User_Id *uint `json:"user_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index 01b004e0..2ab153bb 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -12,19 +12,16 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Unit_Id *uint16 `json:"unit_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go index ef3178d8..41073313 100644 --- a/internal/domain/main-entities/subspecialist/dto.go +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -12,19 +12,16 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { Code *string `json:"code"` Name *string `json:"name"` Specialist_Id *uint16 `json:"specialist_id"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go index ff082dc7..bf589aa5 100644 --- a/internal/domain/main-entities/unit/dto.go +++ b/internal/domain/main-entities/unit/dto.go @@ -13,19 +13,16 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination } type FilterDto struct { Installation_Id *uint16 `json:"installation_id"` Code string `json:"code"` Name string `json:"name"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/uom/dto.go b/internal/domain/main-entities/uom/dto.go index 58ea2554..ef50ea4b 100644 --- a/internal/domain/main-entities/uom/dto.go +++ b/internal/domain/main-entities/uom/dto.go @@ -10,13 +10,10 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - Search string `json:"search"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/user/dto.go b/internal/domain/main-entities/user/dto.go index 47b50dca..62a0c587 100644 --- a/internal/domain/main-entities/user/dto.go +++ b/internal/domain/main-entities/user/dto.go @@ -1,13 +1,15 @@ package user import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" ep "simrs-vx/internal/domain/main-entities/person" epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" + erc "simrs-vx/internal/domain/references/common" ero "simrs-vx/internal/domain/references/organization" - "time" ) type CreateDto struct { @@ -31,10 +33,7 @@ type CreateDto struct { type ReadListDto struct { Name string `json:"name"` Status_Code erc.UserStatusCode `json:"status_code"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/user/entity.go b/internal/domain/main-entities/user/entity.go index 43669663..4f7d8792 100644 --- a/internal/domain/main-entities/user/entity.go +++ b/internal/domain/main-entities/user/entity.go @@ -1,10 +1,11 @@ package user import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" erc "simrs-vx/internal/domain/references/common" ero "simrs-vx/internal/domain/references/organization" - "time" ) type User struct { diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index 968784ee..ca42f073 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -1,5 +1,9 @@ package village +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + type CreateDto struct { District_Code string `json:"district_code" validate:"numeric;maxLength=6"` Code string `json:"code" validate:"numeric;maxLength=10"` @@ -10,10 +14,7 @@ type ReadListDto struct { District_Code string `json:"district_code"` Code string `json:"code"` Name string `json:"name"` - - Page int `json:"page"` - PageSize int `json:"page_size"` - NoPagination int `json:"no_pagination"` + Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/use-case/main-use-case/adime/case.go b/internal/use-case/main-use-case/adime/case.go index 3a4c4496..5d07ab13 100644 --- a/internal/use-case/main-use-case/adime/case.go +++ b/internal/use-case/main-use-case/adime/case.go @@ -129,12 +129,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/ambulatory/case.go b/internal/use-case/main-use-case/ambulatory/case.go index 14f6b2e5..312a9376 100644 --- a/internal/use-case/main-use-case/ambulatory/case.go +++ b/internal/use-case/main-use-case/ambulatory/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/consultation/case.go b/internal/use-case/main-use-case/consultation/case.go index 2de98916..683ece20 100644 --- a/internal/use-case/main-use-case/consultation/case.go +++ b/internal/use-case/main-use-case/consultation/case.go @@ -119,12 +119,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/counter/case.go b/internal/use-case/main-use-case/counter/case.go index bfc24194..dcf70781 100644 --- a/internal/use-case/main-use-case/counter/case.go +++ b/internal/use-case/main-use-case/counter/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/device-order-item/case.go b/internal/use-case/main-use-case/device-order-item/case.go index d4920979..11cd88ab 100644 --- a/internal/use-case/main-use-case/device-order-item/case.go +++ b/internal/use-case/main-use-case/device-order-item/case.go @@ -110,12 +110,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil 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 422c4f1a..d8f52238 100644 --- a/internal/use-case/main-use-case/device-order/case.go +++ b/internal/use-case/main-use-case/device-order/case.go @@ -141,12 +141,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/device/case.go b/internal/use-case/main-use-case/device/case.go index 5c5c9b73..3e97fe6c 100644 --- a/internal/use-case/main-use-case/device/case.go +++ b/internal/use-case/main-use-case/device/case.go @@ -112,12 +112,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/diagnose-src/case.go b/internal/use-case/main-use-case/diagnose-src/case.go index 6fc921e4..184e68a8 100644 --- a/internal/use-case/main-use-case/diagnose-src/case.go +++ b/internal/use-case/main-use-case/diagnose-src/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/district/case.go b/internal/use-case/main-use-case/district/case.go index 1770e6f2..b7a4b1a0 100644 --- a/internal/use-case/main-use-case/district/case.go +++ b/internal/use-case/main-use-case/district/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/division-position/case.go b/internal/use-case/main-use-case/division-position/case.go index 2fbb0c3b..2ab963e5 100644 --- a/internal/use-case/main-use-case/division-position/case.go +++ b/internal/use-case/main-use-case/division-position/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/division/case.go b/internal/use-case/main-use-case/division/case.go index cf37c36c..885d5724 100644 --- a/internal/use-case/main-use-case/division/case.go +++ b/internal/use-case/main-use-case/division/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index 25ccd22f..e8713508 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -55,6 +55,16 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di plh.SearchCodeOrName(input.Search, tx) + if input.OnlyHaveChildren { + tx = tx.Where(` + EXISTS ( + SELECT 1 + FROM "Division" c + WHERE c."Parent_Id" = "Division"."Id" + ) + `) + } + tx = tx. Model(&e.Division{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/doctor-fee/case.go b/internal/use-case/main-use-case/doctor-fee/case.go index cce2ae5f..6a93b57d 100644 --- a/internal/use-case/main-use-case/doctor-fee/case.go +++ b/internal/use-case/main-use-case/doctor-fee/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/doctor/case.go b/internal/use-case/main-use-case/doctor/case.go index 19088c61..e09376b7 100644 --- a/internal/use-case/main-use-case/doctor/case.go +++ b/internal/use-case/main-use-case/doctor/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/emergency/case.go b/internal/use-case/main-use-case/emergency/case.go index a21cc02c..0a9e48e7 100644 --- a/internal/use-case/main-use-case/emergency/case.go +++ b/internal/use-case/main-use-case/emergency/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/employee/case.go b/internal/use-case/main-use-case/employee/case.go index 030374f0..c68fd7cf 100644 --- a/internal/use-case/main-use-case/employee/case.go +++ b/internal/use-case/main-use-case/employee/case.go @@ -104,12 +104,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 3a95e1d0..50761e11 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -165,12 +165,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/ethnic/case.go b/internal/use-case/main-use-case/ethnic/case.go index adf50f44..c8ca95a1 100644 --- a/internal/use-case/main-use-case/ethnic/case.go +++ b/internal/use-case/main-use-case/ethnic/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/infra/case.go b/internal/use-case/main-use-case/infra/case.go index 26f9d319..52e594a5 100644 --- a/internal/use-case/main-use-case/infra/case.go +++ b/internal/use-case/main-use-case/infra/case.go @@ -134,12 +134,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/inpatient/case.go b/internal/use-case/main-use-case/inpatient/case.go index 9c6aa963..3548a908 100644 --- a/internal/use-case/main-use-case/inpatient/case.go +++ b/internal/use-case/main-use-case/inpatient/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/installation/case.go b/internal/use-case/main-use-case/installation/case.go index 6de77882..5e1339da 100644 --- a/internal/use-case/main-use-case/installation/case.go +++ b/internal/use-case/main-use-case/installation/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/insurance-company/case.go b/internal/use-case/main-use-case/insurance-company/case.go index a981339d..3d55fa1f 100644 --- a/internal/use-case/main-use-case/insurance-company/case.go +++ b/internal/use-case/main-use-case/insurance-company/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/item-price/case.go b/internal/use-case/main-use-case/item-price/case.go index a40f9142..9c916875 100644 --- a/internal/use-case/main-use-case/item-price/case.go +++ b/internal/use-case/main-use-case/item-price/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/item/case.go b/internal/use-case/main-use-case/item/case.go index 67027fa8..be9f6b16 100644 --- a/internal/use-case/main-use-case/item/case.go +++ b/internal/use-case/main-use-case/item/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/laborant/case.go b/internal/use-case/main-use-case/laborant/case.go index 4049ff53..79a9ba32 100644 --- a/internal/use-case/main-use-case/laborant/case.go +++ b/internal/use-case/main-use-case/laborant/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/language/case.go b/internal/use-case/main-use-case/language/case.go index 142e14af..885bcfeb 100644 --- a/internal/use-case/main-use-case/language/case.go +++ b/internal/use-case/main-use-case/language/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/material-order-item/case.go b/internal/use-case/main-use-case/material-order-item/case.go index 32d7875d..b1a6f61d 100644 --- a/internal/use-case/main-use-case/material-order-item/case.go +++ b/internal/use-case/main-use-case/material-order-item/case.go @@ -118,12 +118,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil 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 af93924c..558c55f6 100644 --- a/internal/use-case/main-use-case/material-order/case.go +++ b/internal/use-case/main-use-case/material-order/case.go @@ -137,12 +137,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/material/case.go b/internal/use-case/main-use-case/material/case.go index 87b8be9c..3462971c 100644 --- a/internal/use-case/main-use-case/material/case.go +++ b/internal/use-case/main-use-case/material/case.go @@ -112,12 +112,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/mcu-order-item/case.go b/internal/use-case/main-use-case/mcu-order-item/case.go index 2b1cacd1..a2149006 100644 --- a/internal/use-case/main-use-case/mcu-order-item/case.go +++ b/internal/use-case/main-use-case/mcu-order-item/case.go @@ -120,12 +120,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/case.go b/internal/use-case/main-use-case/mcu-order-sub-item/case.go index 88684bff..d7fd5af5 100644 --- a/internal/use-case/main-use-case/mcu-order-sub-item/case.go +++ b/internal/use-case/main-use-case/mcu-order-sub-item/case.go @@ -120,12 +120,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/mcu-order/case.go b/internal/use-case/main-use-case/mcu-order/case.go index 77176cd9..1d3d43dc 100644 --- a/internal/use-case/main-use-case/mcu-order/case.go +++ b/internal/use-case/main-use-case/mcu-order/case.go @@ -137,12 +137,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/mcu-src-category/case.go b/internal/use-case/main-use-case/mcu-src-category/case.go index 004d97f2..c105603c 100644 --- a/internal/use-case/main-use-case/mcu-src-category/case.go +++ b/internal/use-case/main-use-case/mcu-src-category/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/mcu-src/case.go b/internal/use-case/main-use-case/mcu-src/case.go index f0e7589a..9509b219 100644 --- a/internal/use-case/main-use-case/mcu-src/case.go +++ b/internal/use-case/main-use-case/mcu-src/case.go @@ -113,12 +113,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/mcu-sub-src/case.go b/internal/use-case/main-use-case/mcu-sub-src/case.go index e977931f..1463facd 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/case.go +++ b/internal/use-case/main-use-case/mcu-sub-src/case.go @@ -113,12 +113,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/medical-action-src-item/case.go b/internal/use-case/main-use-case/medical-action-src-item/case.go index 2efdca2c..74af5873 100644 --- a/internal/use-case/main-use-case/medical-action-src-item/case.go +++ b/internal/use-case/main-use-case/medical-action-src-item/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/medical-action-src/case.go b/internal/use-case/main-use-case/medical-action-src/case.go index 1c0fe565..059c15be 100644 --- a/internal/use-case/main-use-case/medical-action-src/case.go +++ b/internal/use-case/main-use-case/medical-action-src/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil 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 3c79b6a7..550cc67c 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 @@ -113,12 +113,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil 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 b5c3a015..498df263 100644 --- a/internal/use-case/main-use-case/medication-item/case.go +++ b/internal/use-case/main-use-case/medication-item/case.go @@ -111,12 +111,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/medication/case.go b/internal/use-case/main-use-case/medication/case.go index c4a97373..4662f4c3 100644 --- a/internal/use-case/main-use-case/medication/case.go +++ b/internal/use-case/main-use-case/medication/case.go @@ -115,12 +115,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/medicine-group/case.go b/internal/use-case/main-use-case/medicine-group/case.go index 66fe35b8..180c6e00 100644 --- a/internal/use-case/main-use-case/medicine-group/case.go +++ b/internal/use-case/main-use-case/medicine-group/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/medicine-method/case.go b/internal/use-case/main-use-case/medicine-method/case.go index 2a672f80..012b77b0 100644 --- a/internal/use-case/main-use-case/medicine-method/case.go +++ b/internal/use-case/main-use-case/medicine-method/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/medicine-mix-item/case.go b/internal/use-case/main-use-case/medicine-mix-item/case.go index 42145947..30932664 100644 --- a/internal/use-case/main-use-case/medicine-mix-item/case.go +++ b/internal/use-case/main-use-case/medicine-mix-item/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/medicine-mix/case.go b/internal/use-case/main-use-case/medicine-mix/case.go index 13602162..c48a1e17 100644 --- a/internal/use-case/main-use-case/medicine-mix/case.go +++ b/internal/use-case/main-use-case/medicine-mix/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/medicine/case.go b/internal/use-case/main-use-case/medicine/case.go index aa970478..22e052ab 100644 --- a/internal/use-case/main-use-case/medicine/case.go +++ b/internal/use-case/main-use-case/medicine/case.go @@ -112,12 +112,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/nurse/case.go b/internal/use-case/main-use-case/nurse/case.go index 509be4dd..a683bfda 100644 --- a/internal/use-case/main-use-case/nurse/case.go +++ b/internal/use-case/main-use-case/nurse/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/nutritionist/case.go b/internal/use-case/main-use-case/nutritionist/case.go index f584f005..cc5b2163 100644 --- a/internal/use-case/main-use-case/nutritionist/case.go +++ b/internal/use-case/main-use-case/nutritionist/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 2d874b8b..590183e4 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -143,12 +143,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/person-address/case.go b/internal/use-case/main-use-case/person-address/case.go index 1f354661..38353ae9 100644 --- a/internal/use-case/main-use-case/person-address/case.go +++ b/internal/use-case/main-use-case/person-address/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/person-contact/case.go b/internal/use-case/main-use-case/person-contact/case.go index 10bf8408..5f37388b 100644 --- a/internal/use-case/main-use-case/person-contact/case.go +++ b/internal/use-case/main-use-case/person-contact/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/person-relative/case.go b/internal/use-case/main-use-case/person-relative/case.go index ab68bbef..929d0817 100644 --- a/internal/use-case/main-use-case/person-relative/case.go +++ b/internal/use-case/main-use-case/person-relative/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/person/case.go b/internal/use-case/main-use-case/person/case.go index e0395bd9..bb8ee7fb 100644 --- a/internal/use-case/main-use-case/person/case.go +++ b/internal/use-case/main-use-case/person/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/pharmacist/case.go b/internal/use-case/main-use-case/pharmacist/case.go index cdc8503f..b8a9d063 100644 --- a/internal/use-case/main-use-case/pharmacist/case.go +++ b/internal/use-case/main-use-case/pharmacist/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/pharmacy-company/case.go b/internal/use-case/main-use-case/pharmacy-company/case.go index bf22d56d..cce54750 100644 --- a/internal/use-case/main-use-case/pharmacy-company/case.go +++ b/internal/use-case/main-use-case/pharmacy-company/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/practice-schedule/case.go b/internal/use-case/main-use-case/practice-schedule/case.go index 223d97ec..bb2be8d0 100644 --- a/internal/use-case/main-use-case/practice-schedule/case.go +++ b/internal/use-case/main-use-case/practice-schedule/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/prescription-item/case.go b/internal/use-case/main-use-case/prescription-item/case.go index c068344d..ae4c15f6 100644 --- a/internal/use-case/main-use-case/prescription-item/case.go +++ b/internal/use-case/main-use-case/prescription-item/case.go @@ -112,12 +112,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/prescription/case.go b/internal/use-case/main-use-case/prescription/case.go index ce9bc9ba..e7666dd2 100644 --- a/internal/use-case/main-use-case/prescription/case.go +++ b/internal/use-case/main-use-case/prescription/case.go @@ -113,12 +113,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/procedure-src/case.go b/internal/use-case/main-use-case/procedure-src/case.go index d7b116c0..1b91f6bb 100644 --- a/internal/use-case/main-use-case/procedure-src/case.go +++ b/internal/use-case/main-use-case/procedure-src/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/province/case.go b/internal/use-case/main-use-case/province/case.go index c8705614..50d5e7ab 100644 --- a/internal/use-case/main-use-case/province/case.go +++ b/internal/use-case/main-use-case/province/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/regency/case.go b/internal/use-case/main-use-case/regency/case.go index a0836549..c6ed4b4f 100644 --- a/internal/use-case/main-use-case/regency/case.go +++ b/internal/use-case/main-use-case/regency/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/room/case.go b/internal/use-case/main-use-case/room/case.go index c14fbbe9..36bf3aa5 100644 --- a/internal/use-case/main-use-case/room/case.go +++ b/internal/use-case/main-use-case/room/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/sbar/case.go b/internal/use-case/main-use-case/sbar/case.go index 3606bae4..e7571e75 100644 --- a/internal/use-case/main-use-case/sbar/case.go +++ b/internal/use-case/main-use-case/sbar/case.go @@ -129,12 +129,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index 46e64e71..b589e946 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -129,12 +129,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/specialist-intern/case.go b/internal/use-case/main-use-case/specialist-intern/case.go index ad71627b..0a189e3d 100644 --- a/internal/use-case/main-use-case/specialist-intern/case.go +++ b/internal/use-case/main-use-case/specialist-intern/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/specialist/case.go b/internal/use-case/main-use-case/specialist/case.go index 1ede6556..91e06eb3 100644 --- a/internal/use-case/main-use-case/specialist/case.go +++ b/internal/use-case/main-use-case/specialist/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/subspecialist/case.go b/internal/use-case/main-use-case/subspecialist/case.go index 66df538b..5e633047 100644 --- a/internal/use-case/main-use-case/subspecialist/case.go +++ b/internal/use-case/main-use-case/subspecialist/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/unit/case.go b/internal/use-case/main-use-case/unit/case.go index beb91f7b..2c07bed7 100644 --- a/internal/use-case/main-use-case/unit/case.go +++ b/internal/use-case/main-use-case/unit/case.go @@ -109,12 +109,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/uom/case.go b/internal/use-case/main-use-case/uom/case.go index 786d4b7e..29c4516b 100644 --- a/internal/use-case/main-use-case/uom/case.go +++ b/internal/use-case/main-use-case/uom/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index ae1e8464..f33286bb 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -220,12 +220,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil diff --git a/internal/use-case/main-use-case/village/case.go b/internal/use-case/main-use-case/village/case.go index dbdeb33d..787fdb12 100644 --- a/internal/use-case/main-use-case/village/case.go +++ b/internal/use-case/main-use-case/village/case.go @@ -106,12 +106,13 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return &d.Data{ Meta: d.IS{ - "source": source, - "structure": "list-data", - "status": "fetched", - "page_number": strconv.Itoa(metaList.PageNumber), - "page_size": strconv.Itoa(metaList.PageSize), - "record_totalCount": strconv.Itoa(metaList.Count), + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), }, Data: e.ToResponseList(dataList), }, nil From 10ef340d635f2a0b9e3ea2a2e1ab419ca2f80e4d Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sat, 4 Oct 2025 15:42:40 +0700 Subject: [PATCH 085/190] feat (infra): add filter data that only have children --- internal/domain/main-entities/infra/dto.go | 9 +++++---- internal/use-case/main-use-case/infra/lib.go | 10 ++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index 33b4fe62..fda399e5 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -21,10 +21,11 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Search string `json:"search"` - Pagination ecore.Pagination + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination + OnlyHaveChildren bool `json:"only-have-children"` } type FilterDto struct { diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index 656aec39..303fce88 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -55,6 +55,16 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In plh.SearchCodeOrName(input.Search, tx) + if input.OnlyHaveChildren { + tx = tx.Where(` + EXISTS ( + SELECT 1 + FROM "Infra" c + WHERE c."Parent_Id" = "Infra"."Id" + ) + `) + } + tx = tx. Model(&e.Infra{}). Scopes(gh.Filter(input.FilterDto)). From 1370edcd390042c47a2306235aa81df89b8295bd Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sun, 5 Oct 2025 12:24:08 +0700 Subject: [PATCH 086/190] feat (ambulatory): add checking class for chemo --- internal/domain/references/encounter/encounter.go | 7 ++++--- internal/use-case/main-use-case/ambulatory/helper.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 4819ee17..585a5035 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -58,9 +58,10 @@ const ( CSCPLab CheckupScopeCode = "pa-lab" // Patology Anatomy Laboratorium CSCRad CheckupScopeCode = "radiology" // Radiology - ACCReg AmbulatoryClassCode = "reg" // Regular - ACCRme AmbulatoryClassCode = "rme" // Rehab Medik - ACCChe AmbulatoryClassCode = "chemo" // Chemotherapy + ACCReg AmbulatoryClassCode = "reg" // Regular + ACCRme AmbulatoryClassCode = "rme" // Rehab Medik + ACCCad AmbulatoryClassCode = "chemo-adm" // Chemotherapy + ACCCac AmbulatoryClassCode = "chemo-act" // Chemotherapy ICCIp InpatientClassCode = "ip" // Regular Rawat Inap ICCICU InpatientClassCode = "icu" // ICU diff --git a/internal/use-case/main-use-case/ambulatory/helper.go b/internal/use-case/main-use-case/ambulatory/helper.go index 39361d9d..f78f0b65 100644 --- a/internal/use-case/main-use-case/ambulatory/helper.go +++ b/internal/use-case/main-use-case/ambulatory/helper.go @@ -28,7 +28,7 @@ func CheckClassCode(input *string) (ere.AmbulatoryClassCode, error) { if input != nil { subCode := ere.AmbulatoryClassCode(*input) switch subCode { - case ere.ACCReg, ere.ACCRme: + case ere.ACCReg, ere.ACCRme, ere.ACCCad, ere.ACCCac: return subCode, nil default: return "", errors.New("unknown sub class code") From ad358e4f79a65696a363cdf7d585001b49b30aea Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sun, 5 Oct 2025 13:01:43 +0700 Subject: [PATCH 087/190] feat (chemo): add entities --- internal/domain/main-entities/chemo/dto.go | 86 +++++++++++++++++++ internal/domain/main-entities/chemo/entity.go | 24 ++++++ 2 files changed, 110 insertions(+) create mode 100644 internal/domain/main-entities/chemo/dto.go create mode 100644 internal/domain/main-entities/chemo/entity.go diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go new file mode 100644 index 00000000..cf01b8ad --- /dev/null +++ b/internal/domain/main-entities/chemo/dto.go @@ -0,0 +1,86 @@ +package chemo + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + eun "simrs-vx/internal/domain/main-entities/unit" + eus "simrs-vx/internal/domain/main-entities/user" + "time" + + erc "simrs-vx/internal/domain/references/common" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataStatusCode `json:"status_code"` + VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` + SrcUnit_Id *uint `json:"src_unit_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter_id"` + Status_Code *erc.DataVerifiedCode `json:"status_code"` + VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` + SrcUnit_Id *uint `json:"src_unit_id"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Status_Code erc.DataVerifiedCode `json:"status_code"` + VerifiedAt *time.Time `json:"verifiedAt"` + VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` + VerifiedBy *eus.User `json:"verifiedBy,omitempty"` + SrcUnit_Id *uint `json:"src_unit_id"` + SrcUnit *eun.Unit `json:"src_unit,omitempty"` +} + +func (d Chemo) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Status_Code: d.Status_Code, + VerifiedAt: d.VerifiedAt, + VerifiedBy_User_Id: d.VerifiedBy_User_Id, + VerifiedBy: d.VerifiedBy, + SrcUnit_Id: d.SrcUnit_Id, + SrcUnit: d.SrcUnit, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Chemo) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/chemo/entity.go b/internal/domain/main-entities/chemo/entity.go new file mode 100644 index 00000000..2ba83990 --- /dev/null +++ b/internal/domain/main-entities/chemo/entity.go @@ -0,0 +1,24 @@ +package chemo + +import ( + "time" + + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" + eun "simrs-vx/internal/domain/main-entities/unit" + eus "simrs-vx/internal/domain/main-entities/user" + + erc "simrs-vx/internal/domain/references/common" +) + +type Chemo struct { + ecore.Main // adjust this according to the needs + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Status_Code erc.DataVerifiedCode `json:"status_code"` + VerifiedAt *time.Time `json:"verifiedAt"` + VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` + VerifiedBy *eus.User `json:"verifiedBy,omitempty" gorm:"foreignKey:VerifiedBy_User_Id;references:Id"` + SrcUnit_Id *uint `json:"src_unit_id"` + SrcUnit *eun.Unit `json:"src_unit,omitempty" gorm:"foreignKey:SrcUnit_Id;references:Id"` +} From 3a68aac53eed9c592e7aa8ba2f8ba2128350f60f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sun, 5 Oct 2025 13:02:19 +0700 Subject: [PATCH 088/190] feat (consultation): update column and adjust --- .../domain/main-entities/consultation/dto.go | 34 ++++++++++--------- .../main-entities/consultation/entity.go | 16 +++++---- internal/interface/migration/main-entities.go | 2 ++ .../main-use-case/consultation/case.go | 4 +-- .../main-use-case/consultation/helper.go | 5 +-- 5 files changed, 34 insertions(+), 27 deletions(-) diff --git a/internal/domain/main-entities/consultation/dto.go b/internal/domain/main-entities/consultation/dto.go index a13231da..7b53f90f 100644 --- a/internal/domain/main-entities/consultation/dto.go +++ b/internal/domain/main-entities/consultation/dto.go @@ -12,9 +12,10 @@ import ( ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Case *string `json:"case" validate:"maxLength=2048"` - Unit_Id *uint `json:"unit_id"` + Encounter_Id *uint `json:"encounter_id"` + Date *time.Time `json:"date"` + Problem *string `json:"problem" validate:"maxLength=10240"` + DstUnit_Id *uint `json:"dstUnit_id"` } type ReadListDto struct { @@ -26,8 +27,8 @@ type ReadListDto struct { type FilterDto struct { Encounter_Id *uint `json:"encounter_id"` - Unit_Id *uint `json:"unit_id"` - Doctor_Id *uint `json:"doctor_id"` + DstUnit_Id *uint `json:"dstUnit_id"` + DstDoctor_Id *uint `json:"dstDoctor_id"` } type ReadDetailDto struct { @@ -60,12 +61,13 @@ type ResponseDto struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty"` - Case *string `json:"case"` + Date *time.Time `json:"date"` + Problem *string `json:"problem"` Solution *string `json:"solution"` - Unit_Id *uint `json:"unit_id"` - Unit *eu.Unit `json:"unit,omitempty"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty"` + DstUnit_Id *uint `json:"dstUnit_id"` + DstUnit *eu.Unit `json:"dstUnit,omitempty"` + DstDoctor_Id *uint `json:"dstDoctor_id"` + DstDoctor *ed.Doctor `json:"dstDoctor,omitempty"` RepliedAt *time.Time `json:"repliedAt"` } @@ -73,13 +75,13 @@ func (d Consultation) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, - Case: d.Case, + Date: d.Date, + Problem: d.Problem, Solution: d.Solution, - Unit_Id: d.Unit_Id, - Unit: d.Unit, - Doctor_Id: d.Doctor_Id, - Doctor: d.Doctor, - RepliedAt: d.RepliedAt, + DstUnit_Id: d.DstUnit_Id, + DstUnit: d.DstUnit, + DstDoctor_Id: d.DstDoctor_Id, + DstDoctor: d.DstDoctor, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/consultation/entity.go b/internal/domain/main-entities/consultation/entity.go index 68ad37f2..2fda8bd0 100644 --- a/internal/domain/main-entities/consultation/entity.go +++ b/internal/domain/main-entities/consultation/entity.go @@ -13,11 +13,13 @@ type Consultation struct { ecore.Main // adjust this according to the needs Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter" gorm:"foreignKey:Encounter_Id;references:Id"` - Case *string `json:"case" gorm:"size:2048"` - Solution *string `json:"solution" gorm:"size:2048"` - Unit_Id *uint `json:"unit_id"` - Unit *eu.Unit `json:"unit" gorm:"foreignKey:Unit_Id;references:Id"` - Doctor_Id *uint `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor" gorm:"foreignKey:Doctor_Id;references:Id"` - RepliedAt *time.Time `json:"repliedAt"` + Date *time.Time `json:"date"` + + Problem *string `json:"case" gorm:"size:10240"` + Solution *string `json:"solution" gorm:"size:10240"` + DstUnit_Id *uint `json:"dstUnit_id"` + DstUnit *eu.Unit `json:"dstUnit" gorm:"foreignKey:DstUnit_Id;references:Id"` + DstDoctor_Id *uint `json:"dstDoctor_id"` + DstDoctor *ed.Doctor `json:"dstDoctor" gorm:"foreignKey:DstDoctor_Id;references:Id"` + RepliedAt *time.Time `json:"repliedAt"` } diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 6e582af2..4d0f79c1 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -4,6 +4,7 @@ import ( adime "simrs-vx/internal/domain/main-entities/adime" ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" appointment "simrs-vx/internal/domain/main-entities/appointment" + chemo "simrs-vx/internal/domain/main-entities/chemo" consultation "simrs-vx/internal/domain/main-entities/consultation" counter "simrs-vx/internal/domain/main-entities/counter" device "simrs-vx/internal/domain/main-entities/device" @@ -145,5 +146,6 @@ func getMainEntities() []any { &mcusubsrc.McuSubSrc{}, &mcuordersubitem.McuOrderSubItem{}, &consultation.Consultation{}, + &chemo.Chemo{}, } } diff --git a/internal/use-case/main-use-case/consultation/case.go b/internal/use-case/main-use-case/consultation/case.go index 683ece20..1b20d463 100644 --- a/internal/use-case/main-use-case/consultation/case.go +++ b/internal/use-case/main-use-case/consultation/case.go @@ -322,7 +322,7 @@ func Reply(input e.ReplyDto) (*d.Data, error) { return err } - if data.Doctor_Id != nil && data.Doctor_Id != doctor_id { + if data.DstDoctor_Id != nil && data.DstDoctor_Id != doctor_id { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "data-handled-mismatch", @@ -332,7 +332,7 @@ func Reply(input e.ReplyDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - data.Doctor_Id = doctor_id + data.DstDoctor_Id = doctor_id data.Solution = input.Solution data.RepliedAt = pu.GetTimeNow() err = tx.Save(&data).Error diff --git a/internal/use-case/main-use-case/consultation/helper.go b/internal/use-case/main-use-case/consultation/helper.go index 7df4a9f9..519c3c91 100644 --- a/internal/use-case/main-use-case/consultation/helper.go +++ b/internal/use-case/main-use-case/consultation/helper.go @@ -18,6 +18,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Consultation) { } data.Encounter_Id = inputSrc.Encounter_Id - data.Case = inputSrc.Case - data.Unit_Id = inputSrc.Unit_Id + data.Date = inputSrc.Date + data.Problem = inputSrc.Problem + data.DstUnit_Id = inputSrc.DstUnit_Id } From b603a05980fc2ea63d8d14ae18d8afefbdfc4012 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sun, 5 Oct 2025 13:03:51 +0700 Subject: [PATCH 089/190] feat (person): add column nationality and adjust --- internal/domain/main-entities/person/dto.go | 4 ++++ internal/domain/main-entities/person/entity.go | 1 + internal/use-case/main-use-case/person/helper.go | 1 + 3 files changed, 6 insertions(+) diff --git a/internal/domain/main-entities/person/dto.go b/internal/domain/main-entities/person/dto.go index b946436b..3cfe18f2 100644 --- a/internal/domain/main-entities/person/dto.go +++ b/internal/domain/main-entities/person/dto.go @@ -26,6 +26,7 @@ type CreateDto struct { Education_Code *erp.EducationCode `json:"education_code" validate:"maxLength=10"` Ocupation_Code *erp.OcupationCode `json:"occupation_code" validate:"maxLength=15"` Ocupation_Name *string `json:"occupation_name" validate:"maxLength=50"` + Nationality *string `json:"nationality" validate:"maxLength=50"` Ethnic_Code *string `json:"ethnic_code" validate:"maxLength=20"` Language_Code *string `json:"language_code" validate:"maxLength=10"` } @@ -51,6 +52,7 @@ type FilterDto struct { Education_Code *erp.EducationCode `json:"education_code"` Ocupation_Code *erp.OcupationCode `json:"occupation_code"` Ocupation_Name *string `json:"occupation_name"` + Nationality *string `json:"nationality"` Ethnic_Code *string `json:"ethnic_code"` Language_Code *string `json:"language_code"` } @@ -93,6 +95,7 @@ type ResponseDto struct { Education_Code *erp.EducationCode `json:"education_code"` Ocupation_Code *erp.OcupationCode `json:"occupation_code"` Ocupation_Name *string `json:"occupation_name"` + Nationality *string `json:"nationality"` Ethnic_Code *string `json:"ethnic_code"` Ethnic *ee.Ethnic `json:"ethnic,omitempty"` Addresses *[]epa.PersonAddress `json:"addresses,omitempty"` @@ -120,6 +123,7 @@ func (d *Person) ToResponse() ResponseDto { Education_Code: d.Education_Code, Ocupation_Code: d.Ocupation_Code, Ocupation_Name: d.Ocupation_Name, + Nationality: d.Nationality, Ethnic_Code: d.Ethnic_Code, Ethnic: d.Ethnic, Addresses: d.Addresses, diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index 37e2086c..0f12fcd3 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -27,6 +27,7 @@ type Person struct { Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` + Nationality *string `json:"nationality": gorm:"size:50"` Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` diff --git a/internal/use-case/main-use-case/person/helper.go b/internal/use-case/main-use-case/person/helper.go index a2588c0e..f412a268 100644 --- a/internal/use-case/main-use-case/person/helper.go +++ b/internal/use-case/main-use-case/person/helper.go @@ -30,6 +30,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Person) { data.Education_Code = inputSrc.Education_Code data.Ocupation_Code = inputSrc.Ocupation_Code data.Ocupation_Name = inputSrc.Ocupation_Name + data.Nationality = inputSrc.Nationality data.Ethnic_Code = inputSrc.Ethnic_Code data.Language_Code = inputSrc.Language_Code } From 6c91c6df59d3dd7764a5c2bbb1154d84ceb7943d Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sun, 5 Oct 2025 13:05:36 +0700 Subject: [PATCH 090/190] run migration --- .../migrations/20251005060450.sql | 24 +++++++++++++++++++ cmd/main-migration/migrations/atlas.sum | 5 ++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 cmd/main-migration/migrations/20251005060450.sql diff --git a/cmd/main-migration/migrations/20251005060450.sql b/cmd/main-migration/migrations/20251005060450.sql new file mode 100644 index 00000000..7ec05f92 --- /dev/null +++ b/cmd/main-migration/migrations/20251005060450.sql @@ -0,0 +1,24 @@ +-- Modify "Person" table +ALTER TABLE "public"."Person" ADD COLUMN "Nationality" text NULL; +-- Create "Chemo" table +CREATE TABLE "public"."Chemo" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Status_Code" text NULL, + "VerifiedAt" timestamptz NULL, + "VerifiedBy_User_Id" bigint NULL, + "SrcUnit_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Chemo_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Chemo_SrcUnit" FOREIGN KEY ("SrcUnit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Chemo_VerifiedBy" FOREIGN KEY ("VerifiedBy_User_Id") REFERENCES "public"."User" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Rename a column from "Unit_Id" to "DstUnit_Id" +ALTER TABLE "public"."Consultation" RENAME COLUMN "Unit_Id" TO "DstUnit_Id"; +-- Rename a column from "Doctor_Id" to "DstDoctor_Id" +ALTER TABLE "public"."Consultation" RENAME COLUMN "Doctor_Id" TO "DstDoctor_Id"; +-- Modify "Consultation" table +ALTER TABLE "public"."Consultation" DROP CONSTRAINT "fk_Consultation_Doctor", DROP CONSTRAINT "fk_Consultation_Unit", DROP COLUMN "Case", ALTER COLUMN "Solution" TYPE character varying(10240), ADD COLUMN "Date" timestamptz NULL, ADD COLUMN "Problem" character varying(10240) NULL, ADD CONSTRAINT "fk_Consultation_DstDoctor" FOREIGN KEY ("DstDoctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_Consultation_DstUnit" FOREIGN KEY ("DstUnit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 571f69da..649eb37f 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:EkXfc/qeBa+6Fog89GGHEbrpjWfLwy/t6MQdrP9tImE= +h1:kjCOkexwu0wdD+/FPTIz43E0F/a1LI1VtyxR9B+CWyo= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -22,4 +22,5 @@ h1:EkXfc/qeBa+6Fog89GGHEbrpjWfLwy/t6MQdrP9tImE= 20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= 20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= 20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:hdN6UINPM9Pz9ME6uP3pr6PNCqqz4y7h2qY1UlVjw60= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:zM3l4oB0U1kNpAvz47IBBIKdRW0QOGylzWHiBNLfUzs= From 854143ef42d1458619e68c8b49760e737ae8f92a Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sun, 5 Oct 2025 14:38:33 +0700 Subject: [PATCH 091/190] feat (chemo): add handler, use case, and handle in encounter --- internal/domain/main-entities/chemo/dto.go | 19 +- .../interface/main-handler/chemo/handler.go | 114 ++++++ .../interface/main-handler/main-handler.go | 11 + internal/use-case/main-use-case/chemo/case.go | 346 ++++++++++++++++++ .../use-case/main-use-case/chemo/helper.go | 23 ++ internal/use-case/main-use-case/chemo/lib.go | 151 ++++++++ .../main-use-case/chemo/middleware-runner.go | 103 ++++++ .../main-use-case/chemo/middleware.go | 9 + .../use-case/main-use-case/chemo/tycovar.go | 44 +++ .../use-case/main-use-case/encounter/case.go | 16 + 10 files changed, 831 insertions(+), 5 deletions(-) create mode 100644 internal/interface/main-handler/chemo/handler.go create mode 100644 internal/use-case/main-use-case/chemo/case.go create mode 100644 internal/use-case/main-use-case/chemo/helper.go create mode 100644 internal/use-case/main-use-case/chemo/lib.go create mode 100644 internal/use-case/main-use-case/chemo/middleware-runner.go create mode 100644 internal/use-case/main-use-case/chemo/middleware.go create mode 100644 internal/use-case/main-use-case/chemo/tycovar.go diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index cf01b8ad..9b50b37c 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -1,20 +1,22 @@ package chemo import ( + "time" + ecore "simrs-vx/internal/domain/base-entities/core" ee "simrs-vx/internal/domain/main-entities/encounter" eun "simrs-vx/internal/domain/main-entities/unit" eus "simrs-vx/internal/domain/main-entities/user" - "time" erc "simrs-vx/internal/domain/references/common" + + pa "simrs-vx/pkg/auth-helper" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Status_Code erc.DataStatusCode `json:"status_code"` - VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` - SrcUnit_Id *uint `json:"src_unit_id"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataVerifiedCode `json:"status_code"` + SrcUnit_Id *uint `json:"src_unit_id"` } type ReadListDto struct { @@ -44,6 +46,13 @@ type DeleteDto struct { Id uint16 `json:"id"` } +type VerifyDto struct { + Id uint16 `json:"id"` + Status_Code erc.DataVerifiedCode `json:"status_code"` + + pa.AuthInfo +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` diff --git a/internal/interface/main-handler/chemo/handler.go b/internal/interface/main-handler/chemo/handler.go new file mode 100644 index 00000000..ee8c0435 --- /dev/null +++ b/internal/interface/main-handler/chemo/handler.go @@ -0,0 +1,114 @@ +package chemo + +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/chemo" + + erc "simrs-vx/internal/domain/references/common" + + u "simrs-vx/internal/use-case/main-use-case/chemo" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Verify(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.VerifyDto{} + dto.Id = uint16(id) + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.AuthInfo = *authInfo + dto.Status_Code = erc.DVCVerified + res, err := u.Verify(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Reject(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.VerifyDto{} + dto.Id = uint16(id) + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } + dto.AuthInfo = *authInfo + dto.Status_Code = erc.DVCRejected + res, err := u.Verify(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 87325400..f718697d 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -6,6 +6,7 @@ import ( /******************** main / transaction ********************/ adime "simrs-vx/internal/interface/main-handler/adime" auth "simrs-vx/internal/interface/main-handler/authentication" + chemo "simrs-vx/internal/interface/main-handler/chemo" consultation "simrs-vx/internal/interface/main-handler/consultation" counter "simrs-vx/internal/interface/main-handler/counter" deviceorder "simrs-vx/internal/interface/main-handler/device-order" @@ -220,6 +221,16 @@ func SetRoutes() http.Handler { "PATCH /{id}/reply": consultation.O.Reply, }) + hk.GroupRoutes("/v1/chemo", r, auth.GuardMW, hk.MapHandlerFunc{ + "GET /": chemo.O.GetList, + "GET /{id}": chemo.O.GetDetail, + "POST /": chemo.O.Create, + "PATCH /{id}": chemo.O.Update, + "DELETE /{id}": chemo.O.Delete, + "PATCH /{id}/verify": chemo.O.Verify, + "PATCH /{id}/reject": chemo.O.Reject, + }) + /******************** actor ********************/ hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) diff --git a/internal/use-case/main-use-case/chemo/case.go b/internal/use-case/main-use-case/chemo/case.go new file mode 100644 index 00000000..7167588b --- /dev/null +++ b/internal/use-case/main-use-case/chemo/case.go @@ -0,0 +1,346 @@ +package chemo + +import ( + "errors" + "strconv" + + e "simrs-vx/internal/domain/main-entities/chemo" + + erc "simrs-vx/internal/domain/references/common" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "division" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Chemo{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Chemo + var dataList []e.Chemo + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Chemo + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Chemo + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Chemo + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} + +func Verify(input e.VerifyDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Chemo + var err error + + event := pl.Event{ + Feature: "Verify", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "verify") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if data.Status_Code != erc.DVCNew { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "data is not new", + Raw: errors.New("data is not new"), + } + return pl.SetLogError(&event, input) + } + + data.VerifiedAt = pu.GetTimeNow() + data.Status_Code = input.Status_Code + data.VerifiedBy_User_Id = &input.AuthInfo.User_Id + + err = tx.Save(&data).Error + if 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": "verify", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/chemo/helper.go b/internal/use-case/main-use-case/chemo/helper.go new file mode 100644 index 00000000..bb60a39b --- /dev/null +++ b/internal/use-case/main-use-case/chemo/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package chemo + +import ( + e "simrs-vx/internal/domain/main-entities/chemo" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Chemo) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Status_Code = inputSrc.Status_Code + data.SrcUnit_Id = inputSrc.SrcUnit_Id +} diff --git a/internal/use-case/main-use-case/chemo/lib.go b/internal/use-case/main-use-case/chemo/lib.go new file mode 100644 index 00000000..0fa1d51e --- /dev/null +++ b/internal/use-case/main-use-case/chemo/lib.go @@ -0,0 +1,151 @@ +package chemo + +import ( + e "simrs-vx/internal/domain/main-entities/chemo" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Chemo, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Chemo{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Chemo, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Chemo{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Chemo{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Chemo, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Chemo{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Chemo, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Chemo, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/chemo/middleware-runner.go b/internal/use-case/main-use-case/chemo/middleware-runner.go new file mode 100644 index 00000000..a29ded7a --- /dev/null +++ b/internal/use-case/main-use-case/chemo/middleware-runner.go @@ -0,0 +1,103 @@ +package chemo + +import ( + e "simrs-vx/internal/domain/main-entities/chemo" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Chemo) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Chemo) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Chemo) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Chemo) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Chemo) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/chemo/middleware.go b/internal/use-case/main-use-case/chemo/middleware.go new file mode 100644 index 00000000..df8c0bc3 --- /dev/null +++ b/internal/use-case/main-use-case/chemo/middleware.go @@ -0,0 +1,9 @@ +package chemo + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/chemo/tycovar.go b/internal/use-case/main-use-case/chemo/tycovar.go new file mode 100644 index 00000000..857871c9 --- /dev/null +++ b/internal/use-case/main-use-case/chemo/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package chemo + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/chemo" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Chemo, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Chemo, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Chemo, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 50761e11..cdd3beb2 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -5,14 +5,17 @@ import ( "strconv" ea "simrs-vx/internal/domain/main-entities/ambulatory" + ec "simrs-vx/internal/domain/main-entities/chemo" ee "simrs-vx/internal/domain/main-entities/emergency" e "simrs-vx/internal/domain/main-entities/encounter" ei "simrs-vx/internal/domain/main-entities/inpatient" ua "simrs-vx/internal/use-case/main-use-case/ambulatory" + uc "simrs-vx/internal/use-case/main-use-case/chemo" ue "simrs-vx/internal/use-case/main-use-case/emergency" ui "simrs-vx/internal/use-case/main-use-case/inpatient" + erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" dg "github.com/karincake/apem/db-gorm-pg" @@ -65,6 +68,19 @@ func Create(input e.CreateDto) (*d.Data, error) { if err != nil { return err } + + if subCode == ere.ACCCac || subCode == ere.ACCCad { + chemoCreate := ec.CreateDto{ + Encounter_Id: &data.Id, + Status_Code: erc.DVCNew, + SrcUnit_Id: input.Unit_Id, + } + + _, err = uc.CreateData(chemoCreate, &event, tx) + if err != nil { + return err + } + } case ere.ECEmergency: subCode, err := ue.CheckClassCode(input.SubClass_Code) if err != nil { From 5794256f621d27d8ba20a29c3dacca628ff92d28 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 11:08:43 +0700 Subject: [PATCH 092/190] fix json convention for list --- internal/domain/main-entities/adime/dto.go | 4 ++-- .../domain/main-entities/ambulatory/dto.go | 4 ++-- .../domain/main-entities/appointment/dto.go | 12 ++++++------ internal/domain/main-entities/chemo/dto.go | 14 +++++++------- internal/domain/main-entities/chemo/entity.go | 4 ++-- .../domain/main-entities/consultation/dto.go | 6 +++--- internal/domain/main-entities/counter/dto.go | 6 +++--- .../main-entities/device-order-item/dto.go | 4 ++-- .../domain/main-entities/device-order/dto.go | 6 +++--- internal/domain/main-entities/device/dto.go | 6 +++--- internal/domain/main-entities/district/dto.go | 2 +- .../main-entities/division-position/dto.go | 2 +- internal/domain/main-entities/division/dto.go | 2 +- .../domain/main-entities/doctor-fee/dto.go | 6 +++--- internal/domain/main-entities/doctor/dto.go | 12 ++++++------ internal/domain/main-entities/emergency/dto.go | 4 ++-- internal/domain/main-entities/employee/dto.go | 8 ++++---- internal/domain/main-entities/encounter/dto.go | 18 +++++++++--------- internal/domain/main-entities/infra/dto.go | 6 +++--- internal/domain/main-entities/inpatient/dto.go | 6 +++--- .../domain/main-entities/installation/dto.go | 2 +- .../main-entities/insurance-company/dto.go | 2 +- .../domain/main-entities/item-price/dto.go | 4 ++-- internal/domain/main-entities/item/dto.go | 6 +++--- internal/domain/main-entities/laborant/dto.go | 4 ++-- .../main-entities/material-order-item/dto.go | 4 ++-- .../domain/main-entities/material-order/dto.go | 2 +- internal/domain/main-entities/material/dto.go | 6 +++--- .../domain/main-entities/mcu-order-item/dto.go | 6 +++--- .../main-entities/mcu-order-sub-item/dto.go | 6 +++--- internal/domain/main-entities/mcu-order/dto.go | 8 ++++---- .../main-entities/mcu-src-category/dto.go | 2 +- internal/domain/main-entities/mcu-src/dto.go | 2 +- .../domain/main-entities/mcu-sub-src/dto.go | 2 +- .../medical-action-src-item/dto.go | 6 +++--- .../main-entities/medical-action-src/dto.go | 2 +- .../main-entities/medication-item-dist/dto.go | 4 ++-- .../main-entities/medication-item/dto.go | 8 ++++---- .../domain/main-entities/medication/dto.go | 6 +++--- .../main-entities/medicine-mix-item/dto.go | 4 ++-- .../domain/main-entities/medicine-mix/dto.go | 2 +- internal/domain/main-entities/medicine/dto.go | 10 +++++----- internal/domain/main-entities/nurse/dto.go | 8 ++++---- .../domain/main-entities/nutritionist/dto.go | 4 ++-- internal/domain/main-entities/patient/dto.go | 4 ++-- .../main-entities/person-relative/dto.go | 15 +++++++-------- internal/domain/main-entities/person/dto.go | 16 ++++++++-------- .../domain/main-entities/pharmacist/dto.go | 4 ++-- .../main-entities/pharmacy-company/dto.go | 2 +- .../main-entities/practice-schedule/dto.go | 6 +++--- .../main-entities/prescription-item/dto.go | 8 ++++---- .../domain/main-entities/prescription/dto.go | 6 +++--- internal/domain/main-entities/regency/dto.go | 2 +- internal/domain/main-entities/room/dto.go | 8 ++++---- internal/domain/main-entities/sbar/dto.go | 4 ++-- internal/domain/main-entities/soapi/dto.go | 4 ++-- .../main-entities/specialist-intern/dto.go | 8 ++++---- .../domain/main-entities/specialist/dto.go | 2 +- .../domain/main-entities/subspecialist/dto.go | 2 +- internal/domain/main-entities/unit/dto.go | 2 +- internal/domain/main-entities/user/dto.go | 2 +- internal/domain/main-entities/village/dto.go | 2 +- 62 files changed, 169 insertions(+), 170 deletions(-) diff --git a/internal/domain/main-entities/adime/dto.go b/internal/domain/main-entities/adime/dto.go index e1c67451..d121c24b 100644 --- a/internal/domain/main-entities/adime/dto.go +++ b/internal/domain/main-entities/adime/dto.go @@ -27,8 +27,8 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Employee_Id *uint `json:"employee_id"` + Encounter_Id *uint `json:"encounter-id"` + Employee_Id *uint `json:"employee-id"` Time *time.Time `json:"time"` Value *string `json:"value"` } diff --git a/internal/domain/main-entities/ambulatory/dto.go b/internal/domain/main-entities/ambulatory/dto.go index 4236f6bd..79a69807 100644 --- a/internal/domain/main-entities/ambulatory/dto.go +++ b/internal/domain/main-entities/ambulatory/dto.go @@ -19,8 +19,8 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Class_Code ere.AmbulatoryClassCode `json:"class_code"` + Encounter_Id *uint `json:"encounter-id"` + Class_Code ere.AmbulatoryClassCode `json:"class-code"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/appointment/dto.go b/internal/domain/main-entities/appointment/dto.go index 356abf5a..3f7fcea9 100644 --- a/internal/domain/main-entities/appointment/dto.go +++ b/internal/domain/main-entities/appointment/dto.go @@ -18,12 +18,12 @@ type CreateDto struct { } type ReadListDto struct { - PracticeSchedule_Id *uint `json:"practiceSchedule_id"` - Patient_Id *uint `json:"patient_id"` - Person_ResidentIdentityNumber string `json:"person_residentIdentityNumber"` - Person_Name string `json:"person_name"` - Person_PhoneNumber string `json:"person_phoneNumber"` - PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code"` + PracticeSchedule_Id *uint `json:"practiceSchedule-id"` + Patient_Id *uint `json:"patient-id"` + Person_ResidentIdentityNumber string `json:"person-residentIdentityNumber"` + Person_Name string `json:"person-name"` + Person_PhoneNumber string `json:"person-phoneNumber"` + PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod-code"` RefNumber string `json:"refNumber"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index 9b50b37c..dd432d43 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -16,7 +16,7 @@ import ( type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataVerifiedCode `json:"status_code"` - SrcUnit_Id *uint `json:"src_unit_id"` + SrcUnit_Id *uint `json:"srcUnit_id"` } type ReadListDto struct { @@ -27,10 +27,10 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Status_Code *erc.DataVerifiedCode `json:"status_code"` - VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` - SrcUnit_Id *uint `json:"src_unit_id"` + Encounter_Id *uint `json:"encounter-id"` + Status_Code *erc.DataVerifiedCode `json:"status-code"` + VerifiedBy_User_Id *uint `json:"verifiedBy-user-id"` + SrcUnit_Id *uint `json:"srcUnit-id"` } type ReadDetailDto struct { @@ -67,8 +67,8 @@ type ResponseDto struct { VerifiedAt *time.Time `json:"verifiedAt"` VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` VerifiedBy *eus.User `json:"verifiedBy,omitempty"` - SrcUnit_Id *uint `json:"src_unit_id"` - SrcUnit *eun.Unit `json:"src_unit,omitempty"` + SrcUnit_Id *uint `json:"srcUnit_id"` + SrcUnit *eun.Unit `json:"srcUnit,omitempty"` } func (d Chemo) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/chemo/entity.go b/internal/domain/main-entities/chemo/entity.go index 2ba83990..f80d5bc1 100644 --- a/internal/domain/main-entities/chemo/entity.go +++ b/internal/domain/main-entities/chemo/entity.go @@ -19,6 +19,6 @@ type Chemo struct { VerifiedAt *time.Time `json:"verifiedAt"` VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` VerifiedBy *eus.User `json:"verifiedBy,omitempty" gorm:"foreignKey:VerifiedBy_User_Id;references:Id"` - SrcUnit_Id *uint `json:"src_unit_id"` - SrcUnit *eun.Unit `json:"src_unit,omitempty" gorm:"foreignKey:SrcUnit_Id;references:Id"` + SrcUnit_Id *uint `json:"srcUnit_id"` + SrcUnit *eun.Unit `json:"srcUnit,omitempty" gorm:"foreignKey:SrcUnit_Id;references:Id"` } diff --git a/internal/domain/main-entities/consultation/dto.go b/internal/domain/main-entities/consultation/dto.go index 7b53f90f..ea141ace 100644 --- a/internal/domain/main-entities/consultation/dto.go +++ b/internal/domain/main-entities/consultation/dto.go @@ -26,9 +26,9 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - DstUnit_Id *uint `json:"dstUnit_id"` - DstDoctor_Id *uint `json:"dstDoctor_id"` + Encounter_Id *uint `json:"encounter-id"` + DstUnit_Id *uint `json:"dstUnit-id"` + DstDoctor_Id *uint `json:"dstDoctor-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/counter/dto.go b/internal/domain/main-entities/counter/dto.go index ae2a2e18..ad11f7a0 100644 --- a/internal/domain/main-entities/counter/dto.go +++ b/internal/domain/main-entities/counter/dto.go @@ -17,9 +17,9 @@ type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` Number uint8 `json:"number"` - Parent_Id *uint16 `json:"parent_id"` - Type_Code string `json:"type_code"` - Queue_Code string `json:"queue_code"` + Parent_Id *uint16 `json:"parent-id"` + Type_Code string `json:"type-code"` + Queue_Code string `json:"queue-code"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/device-order-item/dto.go b/internal/domain/main-entities/device-order-item/dto.go index 90c6ea2b..7206e7db 100644 --- a/internal/domain/main-entities/device-order-item/dto.go +++ b/internal/domain/main-entities/device-order-item/dto.go @@ -20,8 +20,8 @@ type ReadListDto struct { } type FilterDto struct { - DeviceOrder_Id *uint `json:"deviceOrder_id"` - Device_Id *uint `json:"device_id"` + DeviceOrder_Id *uint `json:"deviceOrder-id"` + Device_Id *uint `json:"device-id"` Count uint8 `json:"count"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/device-order/dto.go b/internal/domain/main-entities/device-order/dto.go index a045a096..e1c5c1ea 100644 --- a/internal/domain/main-entities/device-order/dto.go +++ b/internal/domain/main-entities/device-order/dto.go @@ -26,9 +26,9 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Status_Code erc.DataStatusCode `json:"status_code"` - Doctor_Id *uint `json:"doctor_id"` + Encounter_Id *uint `json:"encounter-id"` + Status_Code erc.DataStatusCode `json:"status-code"` + Doctor_Id *uint `json:"doctor-id"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/device/dto.go b/internal/domain/main-entities/device/dto.go index b8046c75..5a00ca18 100644 --- a/internal/domain/main-entities/device/dto.go +++ b/internal/domain/main-entities/device/dto.go @@ -26,9 +26,9 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - Uom_Code string `json:"uom_code"` - Infra_Id *uint16 `json:"infra_id"` - Item_Id *uint `json:"item_id"` + Uom_Code string `json:"uom-code"` + Infra_Id *uint16 `json:"infra-id"` + Item_Id *uint `json:"item-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/district/dto.go b/internal/domain/main-entities/district/dto.go index 869aa9c2..be0f6c01 100644 --- a/internal/domain/main-entities/district/dto.go +++ b/internal/domain/main-entities/district/dto.go @@ -12,7 +12,7 @@ type CreateDto struct { } type ReadListDto struct { - Regency_Code string `json:"regency_code"` + Regency_Code string `json:"regency-code"` Code string `json:"code"` Name string `json:"name"` Pagination ecore.Pagination diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index 20664a7e..66aa43db 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -19,7 +19,7 @@ type ReadListDto struct { } type FilterDto struct { - Division_Id *uint16 `json:"division_id"` + Division_Id *uint16 `json:"division-id"` Code string `json:"code"` Name string `json:"name"` } diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index 2babaf28..87f1a5f7 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -22,7 +22,7 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - Parent_Id *uint16 `json:"parent_id"` + Parent_Id *uint16 `json:"parent-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/doctor-fee/dto.go b/internal/domain/main-entities/doctor-fee/dto.go index c11467dd..4bec752e 100644 --- a/internal/domain/main-entities/doctor-fee/dto.go +++ b/internal/domain/main-entities/doctor-fee/dto.go @@ -22,10 +22,10 @@ type ReadListDto struct { } type FilterDto struct { - Doctor_Id *uint `json:"doctor_id"` - FeeType_Code *ero.DoctorFeeTypeCode `json:"feeType_code"` + Doctor_Id *uint `json:"doctor-id"` + FeeType_Code *ero.DoctorFeeTypeCode `json:"feeType-code"` Price *float64 `json:"price"` - Item_Id *uint `json:"item_id"` + Item_Id *uint `json:"item-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/doctor/dto.go b/internal/domain/main-entities/doctor/dto.go index b6177607..4f298795 100644 --- a/internal/domain/main-entities/doctor/dto.go +++ b/internal/domain/main-entities/doctor/dto.go @@ -25,12 +25,12 @@ type ReadListDto struct { } type FilterDto struct { - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` - SIP_Number *string `json:"sip_number" validate:"maxLength=20"` - Unit_Id *uint `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` + Employee_Id *uint `json:"employee-id"` + IHS_Number *string `json:"ihs-number" validate:"maxLength=20"` + SIP_Number *string `json:"sip-number" validate:"maxLength=20"` + Unit_Id *uint `json:"unit-id"` + Specialist_Id *uint16 `json:"specialist-id"` + Subspecialist_Id *uint16 `json:"subspecialist-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/emergency/dto.go b/internal/domain/main-entities/emergency/dto.go index ff9041a6..e37ba95d 100644 --- a/internal/domain/main-entities/emergency/dto.go +++ b/internal/domain/main-entities/emergency/dto.go @@ -19,8 +19,8 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Class_Code ere.EmergencyClassCode `json:"class_code"` + Encounter_Id *uint `json:"encounter-id"` + Class_Code ere.EmergencyClassCode `json:"class-code"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/employee/dto.go b/internal/domain/main-entities/employee/dto.go index fa0a240c..d7b723f9 100644 --- a/internal/domain/main-entities/employee/dto.go +++ b/internal/domain/main-entities/employee/dto.go @@ -25,11 +25,11 @@ type ReadListDto struct { } type FilterDto struct { - User_Id *uint `json:"user_id"` - Person_Id *uint `json:"person_id"` - Division_Code *string `json:"division_code"` + User_Id *uint `json:"user-id"` + Person_Id *uint `json:"person-id"` + Division_Code *string `json:"division-code"` Number *string `json:"number"` - Status_Code erc.ActiveStatusCode `json:"status_code"` + Status_Code erc.ActiveStatusCode `json:"status-code"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index b0415901..b9057610 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -39,19 +39,19 @@ type ReadListDto struct { } type FilterDto struct { - Patient_Id *uint `json:"patient_id"` + Patient_Id *uint `json:"patient-id"` Patient *ep.Patient `json:"patient,omitempty"` RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` - Unit_Id *uint `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` + Unit_Id *uint `json:"unit-id"` + Specialist_Id *uint16 `json:"specialist-id"` + Subspecialist_Id *uint16 `json:"subspecialist-id"` VisitDate time.Time `json:"visitDate"` - Appoinment_Doctor_Id *uint `json:"appointment_doctor_id"` - Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` - DischargeMethod_Code ere.DischargeMethodCode `json:"dischargeMethod_code" validate:"maxLength=10"` - RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` - Appointment_Id *uint `json:"appointment_id"` + Appoinment_Doctor_Id *uint `json:"appointment-doctor-id"` + Responsible_Doctor_Id *uint `json:"responsible-doctor-id"` + DischargeMethod_Code ere.DischargeMethodCode `json:"dischargeMethod-code" validate:"maxLength=10"` + RefSource_Name *string `json:"refSource-name" validate:"maxLength=100"` + Appointment_Id *uint `json:"appointment-id"` EarlyEducation *string `json:"earlyEducation"` MedicalDischargeEducation *string `json:"medicalDischargeEducation"` AdmDischargeEducation *string `json:"admDischargeEducation"` diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index fda399e5..34a0774d 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -31,9 +31,9 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code"` - Parent_Id *uint16 `json:"parent_id"` - Item_Id *uint `json:"item_id"` + InfraGroup_Code ero.InfraGroupCode `json:"infraGroup-code"` + Parent_Id *uint16 `json:"parent-id"` + Item_Id *uint `json:"item-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/inpatient/dto.go b/internal/domain/main-entities/inpatient/dto.go index 6592db69..c2191c6b 100644 --- a/internal/domain/main-entities/inpatient/dto.go +++ b/internal/domain/main-entities/inpatient/dto.go @@ -22,9 +22,9 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Class_Code ere.InpatientClassCode `json:"class_code"` - Infra_Id *uint16 `json:"infra_id"` + Encounter_Id *uint `json:"encounter-id"` + Class_Code ere.InpatientClassCode `json:"class-code"` + Infra_Id *uint16 `json:"infra-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index ee307677..f6d8ef03 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -15,7 +15,7 @@ type CreateDto struct { type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` - EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code"` + EncounterClass_Code ere.EncounterClassCode `json:"encounterClass-code"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/insurance-company/dto.go b/internal/domain/main-entities/insurance-company/dto.go index b99b546e..93966c71 100644 --- a/internal/domain/main-entities/insurance-company/dto.go +++ b/internal/domain/main-entities/insurance-company/dto.go @@ -23,7 +23,7 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - Regency_Code *string `json:"regency_code"` + Regency_Code *string `json:"regency-code"` Address string `json:"address"` PhoneNumber string `json:"phoneNumber"` } diff --git a/internal/domain/main-entities/item-price/dto.go b/internal/domain/main-entities/item-price/dto.go index a8ec2f55..1a4ca2a4 100644 --- a/internal/domain/main-entities/item-price/dto.go +++ b/internal/domain/main-entities/item-price/dto.go @@ -20,9 +20,9 @@ type ReadListDto struct { } type FilterDto struct { - Item_Id *uint `json:"item_id"` + Item_Id *uint `json:"item-id"` Price float64 `json:"price"` - InsuranceCompany_Code *string `json:"insuranceCompany_code"` + InsuranceCompany_Code *string `json:"insuranceCompany-code"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/item/dto.go b/internal/domain/main-entities/item/dto.go index 32844b43..3d48e2bb 100644 --- a/internal/domain/main-entities/item/dto.go +++ b/internal/domain/main-entities/item/dto.go @@ -25,9 +25,9 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - ItemGroup_Code ero.ItemGroupCode `json:"itemGroup_code"` - Uom_Code *string `json:"uom_code"` - Infra_Id *uint16 `json:"infra_id"` + ItemGroup_Code ero.ItemGroupCode `json:"itemGroup-code"` + Uom_Code *string `json:"uom-code"` + Infra_Id *uint16 `json:"infra-id"` Stock *int `json:"stock"` } diff --git a/internal/domain/main-entities/laborant/dto.go b/internal/domain/main-entities/laborant/dto.go index aff95200..3648455c 100644 --- a/internal/domain/main-entities/laborant/dto.go +++ b/internal/domain/main-entities/laborant/dto.go @@ -18,8 +18,8 @@ type ReadListDto struct { } type FilterDto struct { - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number"` + Employee_Id *uint `json:"employee-id"` + IHS_Number *string `json:"ihs-number"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/material-order-item/dto.go b/internal/domain/main-entities/material-order-item/dto.go index 91e3c52d..74b1f05f 100644 --- a/internal/domain/main-entities/material-order-item/dto.go +++ b/internal/domain/main-entities/material-order-item/dto.go @@ -20,8 +20,8 @@ type ReadListDto struct { } type FilterDto struct { - MaterialOrder_Id *uint `json:"materialOrder_id"` - Material_Id *uint `json:"material_id"` + MaterialOrder_Id *uint `json:"materialOrder-id"` + Material_Id *uint `json:"material-id"` Count *uint16 `json:"count"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/material-order/dto.go b/internal/domain/main-entities/material-order/dto.go index 553347eb..d2971a85 100644 --- a/internal/domain/main-entities/material-order/dto.go +++ b/internal/domain/main-entities/material-order/dto.go @@ -26,7 +26,7 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` + Encounter_Id *uint `json:"encounter-id"` Status_Code erc.DataStatusCode `json:"status_code"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/material/dto.go b/internal/domain/main-entities/material/dto.go index 16f6b7c7..695b3d11 100644 --- a/internal/domain/main-entities/material/dto.go +++ b/internal/domain/main-entities/material/dto.go @@ -27,10 +27,10 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - Uom_Code string `json:"uom_code"` - Infra_Id *uint16 `json:"infra_id"` + Uom_Code string `json:"uom-code"` + Infra_Id *uint16 `json:"infra-id"` Stock *int `json:"stock"` - Item_Id *uint `json:"item_id"` + Item_Id *uint `json:"item-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/mcu-order-item/dto.go b/internal/domain/main-entities/mcu-order-item/dto.go index 61590ffc..06ebd781 100644 --- a/internal/domain/main-entities/mcu-order-item/dto.go +++ b/internal/domain/main-entities/mcu-order-item/dto.go @@ -24,10 +24,10 @@ type ReadListDto struct { } type FilterDto struct { - McuOrder_Id *uint `json:"mcuOrder_id"` - McuSrc_Id *uint `json:"mcuSrc_id"` + McuOrder_Id *uint `json:"mcuOrder-id"` + McuSrc_Id *uint `json:"mcuSrc-id"` Result *string `json:"result"` - Status_Code erc.DataStatusCode `json:"status_code"` + Status_Code erc.DataStatusCode `json:"status-code"` } type ReadDetailDto struct { Id uint `json:"id"` diff --git a/internal/domain/main-entities/mcu-order-sub-item/dto.go b/internal/domain/main-entities/mcu-order-sub-item/dto.go index bfd2312a..a38376d3 100644 --- a/internal/domain/main-entities/mcu-order-sub-item/dto.go +++ b/internal/domain/main-entities/mcu-order-sub-item/dto.go @@ -22,10 +22,10 @@ type ReadListDto struct { } type FilterDto struct { - McuOrder_Id *uint `json:"mcuOrder_id"` - McuSrc_Id *uint `json:"mcuSrc_id"` + McuOrder_Id *uint `json:"mcuOrder-id"` + McuSrc_Id *uint `json:"mcuSrc-id"` Result *string `json:"result"` - Status_Code erc.DataStatusCode `json:"status_code"` + Status_Code erc.DataStatusCode `json:"status-code"` } type ReadDetailDto struct { Id uint `json:"id"` diff --git a/internal/domain/main-entities/mcu-order/dto.go b/internal/domain/main-entities/mcu-order/dto.go index 75f3647f..a5e09f5e 100644 --- a/internal/domain/main-entities/mcu-order/dto.go +++ b/internal/domain/main-entities/mcu-order/dto.go @@ -33,14 +33,14 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` - Doctor_Id *uint `json:"doctor_id"` + Encounter_Id *uint `json:"encounter-id"` + Status_Code erc.DataStatusCode `json:"status-code" gorm:"not null;size:10"` + Doctor_Id *uint `json:"doctor-id"` SpecimenPickTime *time.Time `json:"specimenPickTime"` ExaminationDate *time.Time `json:"examinationDate"` Number uint8 `json:"number"` Temperature float64 `json:"temperature"` - McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel_code""` + McuUrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"mcuUrgencyLevel-code""` } type ReadDetailDto struct { Id uint `json:"id"` diff --git a/internal/domain/main-entities/mcu-src-category/dto.go b/internal/domain/main-entities/mcu-src-category/dto.go index 06ab351c..bf2deb4a 100644 --- a/internal/domain/main-entities/mcu-src-category/dto.go +++ b/internal/domain/main-entities/mcu-src-category/dto.go @@ -15,7 +15,7 @@ type CreateDto struct { type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` - Scope_Code *ere.CheckupScopeCode `json:"scope_code"` + Scope_Code *ere.CheckupScopeCode `json:"scope-code"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index 447bb64f..be1c14bf 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -23,7 +23,7 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - McuSrcCategory_Code *string `json:"mcuSrcCategory_code"` + McuSrcCategory_Code *string `json:"mcuSrcCategory-code"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go index eb3a2c5b..0a3f52a9 100644 --- a/internal/domain/main-entities/mcu-sub-src/dto.go +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -24,7 +24,7 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - CheckupCategory_Code *string `json:"checkupCategory_code"` + CheckupCategory_Code *string `json:"checkupCategory-code"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medical-action-src-item/dto.go b/internal/domain/main-entities/medical-action-src-item/dto.go index 357d5f1b..e60a12ed 100644 --- a/internal/domain/main-entities/medical-action-src-item/dto.go +++ b/internal/domain/main-entities/medical-action-src-item/dto.go @@ -21,9 +21,9 @@ type ReadListDto struct { } type FilterDto struct { - MedicalActionSrc_Id *uint `json:"medicalActionSrc_id"` - ProcedureSrc_Id *uint `json:"procedureSrc_id"` - Item_Id *uint `json:"item_id"` + MedicalActionSrc_Id *uint `json:"medicalActionSrc-id"` + ProcedureSrc_Id *uint `json:"procedureSrc-id"` + Item_Id *uint `json:"item-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index a6178e71..509f5b49 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -22,7 +22,7 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - Item_Id *uint `json:"item_id"` + Item_Id *uint `json:"item-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medication-item-dist/dto.go b/internal/domain/main-entities/medication-item-dist/dto.go index ffafede0..5186b99c 100644 --- a/internal/domain/main-entities/medication-item-dist/dto.go +++ b/internal/domain/main-entities/medication-item-dist/dto.go @@ -24,10 +24,10 @@ type ReadListDto struct { } type FilterDto struct { - MedicationItem_Id *uint `json:"medicationItem_id"` + MedicationItem_Id *uint `json:"medicationItem-id"` DateTime *time.Time `json:"dateTime"` Remain float64 `json:"remain"` - Nurse_Id *uint `json:"nurse_id"` + Nurse_Id *uint `json:"nurse-id"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/medication-item/dto.go b/internal/domain/main-entities/medication-item/dto.go index bf9d9f28..26a5b35e 100644 --- a/internal/domain/main-entities/medication-item/dto.go +++ b/internal/domain/main-entities/medication-item/dto.go @@ -33,13 +33,13 @@ type ReadListDto struct { } type FilterDto struct { - Medication_Id *uint `json:"medication_id"` + Medication_Id *uint `json:"medication-id"` IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - MedicineMix_Id *uint `json:"medicineMix_id"` + Medicine_Id *uint `json:"medicine-id"` + MedicineMix_Id *uint `json:"medicineMix-id"` Usage float64 `json:"usage"` Interval uint8 `json:"interval"` - IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit-code"` IsRedeemed bool `json:"isRedeemed"` Quantity float64 `json:"quantity"` Note *string `json:"note" gorm:"size:1024"` diff --git a/internal/domain/main-entities/medication/dto.go b/internal/domain/main-entities/medication/dto.go index 0db720f4..abf91fc7 100644 --- a/internal/domain/main-entities/medication/dto.go +++ b/internal/domain/main-entities/medication/dto.go @@ -27,10 +27,10 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` + Encounter_Id *uint `json:"encounter-id"` IssuedAt *time.Time `json:"issuedAt"` - Pharmacist_Id *uint `json:"pharmacist_id"` - Status_Code erc.DataStatusCode `json:"status_code"` + Pharmacist_Id *uint `json:"pharmacist-id"` + Status_Code erc.DataStatusCode `json:"status-code"` } type ReadDetailDto struct { Id uint `json:"id"` diff --git a/internal/domain/main-entities/medicine-mix-item/dto.go b/internal/domain/main-entities/medicine-mix-item/dto.go index 5c372654..1790a207 100644 --- a/internal/domain/main-entities/medicine-mix-item/dto.go +++ b/internal/domain/main-entities/medicine-mix-item/dto.go @@ -20,8 +20,8 @@ type ReadListDto struct { } type FilterDto struct { - MedicineMix_Id *uint `json:"medicineMix_id"` - Medicine_Id *uint `json:"medicine_id"` + MedicineMix_Id *uint `json:"medicineMix-id"` + Medicine_Id *uint `json:"medicine-id"` Dose *uint8 `json:"dose"` Note *string `json:"note" gom:"size:1024"` } diff --git a/internal/domain/main-entities/medicine-mix/dto.go b/internal/domain/main-entities/medicine-mix/dto.go index 8c9b2c7f..6cb8cb1a 100644 --- a/internal/domain/main-entities/medicine-mix/dto.go +++ b/internal/domain/main-entities/medicine-mix/dto.go @@ -13,7 +13,7 @@ type CreateDto struct { type ReadListDto struct { Name string `json:"name"` - Uom_Code *string `json:"uom_code"` + Uom_Code *string `json:"uom-code"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medicine/dto.go b/internal/domain/main-entities/medicine/dto.go index 08352c20..6b6517f9 100644 --- a/internal/domain/main-entities/medicine/dto.go +++ b/internal/domain/main-entities/medicine/dto.go @@ -32,13 +32,13 @@ type ReadListDto struct { type FilterDto 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"` + 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"` + Infra_Id *uint16 `json:"infra-id"` Stock *int `json:"stock"` - Item_Id *uint `json:"item_id"` + Item_Id *uint `json:"item-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/nurse/dto.go b/internal/domain/main-entities/nurse/dto.go index 4aa37c25..11d4bfb8 100644 --- a/internal/domain/main-entities/nurse/dto.go +++ b/internal/domain/main-entities/nurse/dto.go @@ -22,10 +22,10 @@ type ReadListDto struct { } type FilterDto struct { - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number"` - Unit_Id *uint16 `json:"unit_id"` - Infra_Id *uint16 `json:"infra_id"` + Employee_Id *uint `json:"employee-id"` + IHS_Number *string `json:"ihs-number"` + Unit_Id *uint16 `json:"unit-id"` + Infra_Id *uint16 `json:"infra-id"` } type ReadDetailDto struct { Id uint16 `json:"id"` diff --git a/internal/domain/main-entities/nutritionist/dto.go b/internal/domain/main-entities/nutritionist/dto.go index b884e413..f48160a2 100644 --- a/internal/domain/main-entities/nutritionist/dto.go +++ b/internal/domain/main-entities/nutritionist/dto.go @@ -18,8 +18,8 @@ type ReadListDto struct { } type FilterDto struct { - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number"` + Employee_Id *uint `json:"employee-id"` + IHS_Number *string `json:"ihs-number"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index 1c084a54..394d1ee7 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -32,9 +32,9 @@ type ReadListDto struct { } type FilterDto struct { - Person_Id *uint `json:"person_id"` + Person_Id *uint `json:"person-id"` RegisteredAt *time.Time `json:"registeredAt"` - Status_Code erc.ActiveStatusCode `json:"status_code"` + Status_Code erc.ActiveStatusCode `json:"status-code"` Number *string `json:"number"` } diff --git a/internal/domain/main-entities/person-relative/dto.go b/internal/domain/main-entities/person-relative/dto.go index 76276f92..f56e68c7 100644 --- a/internal/domain/main-entities/person-relative/dto.go +++ b/internal/domain/main-entities/person-relative/dto.go @@ -28,17 +28,16 @@ type ReadListDto struct { } type FilterDto struct { - Person_Id uint `json:"person_id"` - Relationship_Code erp.RelationshipCode `json:"relationship_code" ` + Person_Id uint `json:"person-id"` + Relationship_Code erp.RelationshipCode `json:"relationship-code" ` Name *string `json:"name"` Address *string `json:"address"` - Village_Code *string `json:"village_code"` - Village *ev.Village `json:"village,omitempty"` - Gender_Code *erp.GenderCode `json:"gender_code"` + Village_Code *string `json:"village-code"` + Gender_Code *erp.GenderCode `json:"gender-code"` PhoneNumber *string `json:"phoneNumber"` - Education_Code *erp.EducationCode `json:"education_code"` - Occupation_Code *erp.OcupationCode `json:"occupation_code"` - Occupation_Name *string `json:"occupation_name"` + Education_Code *erp.EducationCode `json:"education-code"` + Occupation_Code *erp.OcupationCode `json:"occupation-code"` + Occupation_Name *string `json:"occupation-name"` Responsible bool `json:"responsible"` } diff --git a/internal/domain/main-entities/person/dto.go b/internal/domain/main-entities/person/dto.go index 3cfe18f2..7490d579 100644 --- a/internal/domain/main-entities/person/dto.go +++ b/internal/domain/main-entities/person/dto.go @@ -43,18 +43,18 @@ type FilterDto struct { FrontTitle *string `json:"frontTitle"` EndTitle *string `json:"endTitle"` BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency_code"` - Gender_Code *erp.GenderCode `json:"gender_code"` + BirthRegency_Code *string `json:"birthRegency-code"` + Gender_Code *erp.GenderCode `json:"gender-code"` ResidentIdentityNumber *string `json:"residentIdentityNumber"` PassportNumber *string `json:"passportNumber"` DrivingLicenseNumber *string `json:"drivingLicenseNumber"` - Religion_Code *erp.ReligionCode `json:"religion_code"` - Education_Code *erp.EducationCode `json:"education_code"` - Ocupation_Code *erp.OcupationCode `json:"occupation_code"` - Ocupation_Name *string `json:"occupation_name"` + Religion_Code *erp.ReligionCode `json:"religion-code"` + Education_Code *erp.EducationCode `json:"education-code"` + Ocupation_Code *erp.OcupationCode `json:"occupation-code"` + Ocupation_Name *string `json:"occupation-name"` Nationality *string `json:"nationality"` - Ethnic_Code *string `json:"ethnic_code"` - Language_Code *string `json:"language_code"` + Ethnic_Code *string `json:"ethnic-code"` + Language_Code *string `json:"language-code"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/pharmacist/dto.go b/internal/domain/main-entities/pharmacist/dto.go index 9a42f2ca..fd1bde79 100644 --- a/internal/domain/main-entities/pharmacist/dto.go +++ b/internal/domain/main-entities/pharmacist/dto.go @@ -18,8 +18,8 @@ type ReadListDto struct { } type FilterDto struct { - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number"` + Employee_Id *uint `json:"employee-id"` + IHS_Number *string `json:"ihs-number"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/pharmacy-company/dto.go b/internal/domain/main-entities/pharmacy-company/dto.go index d28de67e..ed61fd61 100644 --- a/internal/domain/main-entities/pharmacy-company/dto.go +++ b/internal/domain/main-entities/pharmacy-company/dto.go @@ -13,7 +13,7 @@ type CreateDto struct { type ReadListDto struct { Code string `json:"code"` Name string `json:"name"` - Regency_Code string `json:"regency_code"` + Regency_Code string `json:"regency-code"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/practice-schedule/dto.go b/internal/domain/main-entities/practice-schedule/dto.go index 5ec6fd2e..48f61543 100644 --- a/internal/domain/main-entities/practice-schedule/dto.go +++ b/internal/domain/main-entities/practice-schedule/dto.go @@ -21,9 +21,9 @@ type ReadListDto struct { } type FilterDto struct { - Doctor_Id *uint `json:"doctor_id"` - Unit_Code *string `json:"unit_code"` - Day_Code *erc.DayCode `json:"day_code"` + Doctor_Id *uint `json:"doctor-id"` + Unit_Code *string `json:"unit-code"` + Day_Code *erc.DayCode `json:"day-code"` StartTime *string `json:"startTime"` EndTime *string `json:"endTime"` } diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index 3b70394f..91922664 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -31,13 +31,13 @@ type ReadListDto struct { } type FilterDto struct { - Prescription_Id *uint `json:"prescription_id"` + Prescription_Id *uint `json:"prescription-id"` IsMix bool `json:"isMix"` - Medicine_Id *uint `json:"medicine_id"` - MedicineMix_Id *uint `json:"medicineMix_id"` + Medicine_Id *uint `json:"medicine-id"` + MedicineMix_Id *uint `json:"medicineMix-id"` Usage float64 `json:"usage"` Interval uint8 `json:"interval"` - IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit_code"` + IntervalUnit_Code erc.TimeUnitCode `json:"intervalUnit-code"` Quantity float64 `json:"quantity"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/prescription/dto.go b/internal/domain/main-entities/prescription/dto.go index bc538517..e05db349 100644 --- a/internal/domain/main-entities/prescription/dto.go +++ b/internal/domain/main-entities/prescription/dto.go @@ -25,10 +25,10 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Doctor_Id *uint `json:"doctor_id"` + Encounter_Id *uint `json:"encounter-id"` + Doctor_Id *uint `json:"doctor-id"` IssuedAt *time.Time `json:"issuedAt"` - Status_Code *erc.DataStatusCode `json:"status_code"` + Status_Code *erc.DataStatusCode `json:"status-code"` } type ReadDetailDto struct { Id uint `json:"id"` diff --git a/internal/domain/main-entities/regency/dto.go b/internal/domain/main-entities/regency/dto.go index e4d76df2..61c131fe 100644 --- a/internal/domain/main-entities/regency/dto.go +++ b/internal/domain/main-entities/regency/dto.go @@ -12,7 +12,7 @@ type CreateDto struct { } type ReadListDto struct { - Province_Code string `json:"province_code"` + Province_Code string `json:"province-code"` Code string `json:"code"` Name string `json:"name"` Pagination ecore.Pagination diff --git a/internal/domain/main-entities/room/dto.go b/internal/domain/main-entities/room/dto.go index acee005e..808e1ee2 100644 --- a/internal/domain/main-entities/room/dto.go +++ b/internal/domain/main-entities/room/dto.go @@ -23,10 +23,10 @@ type ReadListDto struct { } type FilterDto struct { - Infra_Id *uint16 `json:"infra_id"` - Unit_Id *uint16 `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` + Infra_Id *uint16 `json:"infra-id"` + Unit_Id *uint16 `json:"unit-id"` + Specialist_Id *uint16 `json:"specialist-id"` + Subspecialist_Id *uint16 `json:"subspecialist-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/sbar/dto.go b/internal/domain/main-entities/sbar/dto.go index 40f992e4..4e3317a8 100644 --- a/internal/domain/main-entities/sbar/dto.go +++ b/internal/domain/main-entities/sbar/dto.go @@ -27,8 +27,8 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Employee_Id *uint `json:"employee_id"` + Encounter_Id *uint `json:"encounter-id"` + Employee_Id *uint `json:"employee-id"` Time *time.Time `json:"time"` Value *string `json:"value"` } diff --git a/internal/domain/main-entities/soapi/dto.go b/internal/domain/main-entities/soapi/dto.go index b2830d32..2a431942 100644 --- a/internal/domain/main-entities/soapi/dto.go +++ b/internal/domain/main-entities/soapi/dto.go @@ -30,8 +30,8 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter_id"` - Employee_Id *uint `json:"employee_id"` + Encounter_Id *uint `json:"encounter-id"` + Employee_Id *uint `json:"employee-id"` Time *time.Time `json:"time"` TypeCode erc.SoapiTypeCode `json:"typeCode"` Value *string `json:"value"` diff --git a/internal/domain/main-entities/specialist-intern/dto.go b/internal/domain/main-entities/specialist-intern/dto.go index 46563c8d..1090793c 100644 --- a/internal/domain/main-entities/specialist-intern/dto.go +++ b/internal/domain/main-entities/specialist-intern/dto.go @@ -23,10 +23,10 @@ type ReadListDto struct { } type FilterDto struct { - Person_Id *uint `json:"person_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - User_Id *uint `json:"user_id"` + Person_Id *uint `json:"person-id"` + Specialist_Id *uint16 `json:"specialist-id"` + Subspecialist_Id *uint16 `json:"subspecialist-id"` + User_Id *uint `json:"user-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index 2ab153bb..a7dc48e9 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -21,7 +21,7 @@ type ReadListDto struct { type FilterDto struct { Code string `json:"code"` Name string `json:"name"` - Unit_Id *uint16 `json:"unit_id"` + Unit_Id *uint16 `json:"unit-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go index 41073313..1a98906f 100644 --- a/internal/domain/main-entities/subspecialist/dto.go +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -21,7 +21,7 @@ type ReadListDto struct { type FilterDto struct { Code *string `json:"code"` Name *string `json:"name"` - Specialist_Id *uint16 `json:"specialist_id"` + Specialist_Id *uint16 `json:"specialist-id"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go index bf589aa5..6f11f849 100644 --- a/internal/domain/main-entities/unit/dto.go +++ b/internal/domain/main-entities/unit/dto.go @@ -20,7 +20,7 @@ type ReadListDto struct { } type FilterDto struct { - Installation_Id *uint16 `json:"installation_id"` + Installation_Id *uint16 `json:"installation-id"` Code string `json:"code"` Name string `json:"name"` } diff --git a/internal/domain/main-entities/user/dto.go b/internal/domain/main-entities/user/dto.go index 62a0c587..9f948fe7 100644 --- a/internal/domain/main-entities/user/dto.go +++ b/internal/domain/main-entities/user/dto.go @@ -32,7 +32,7 @@ type CreateDto struct { type ReadListDto struct { Name string `json:"name"` - Status_Code erc.UserStatusCode `json:"status_code"` + Status_Code erc.UserStatusCode `json:"status-code"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index ca42f073..842a1cb6 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -11,7 +11,7 @@ type CreateDto struct { } type ReadListDto struct { - District_Code string `json:"district_code"` + District_Code string `json:"district-code"` Code string `json:"code"` Name string `json:"name"` Pagination ecore.Pagination From 1adc942ae73fef4f3fd5c166711cb9ed9da298bd Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 11:08:55 +0700 Subject: [PATCH 093/190] auth wip --- .../main-use-case/authentication/case.go | 37 +++++++------------ .../main-use-case/authentication/helper.go | 13 ++++++- pkg/auth-helper/tycovar.go | 16 +++++--- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/internal/use-case/main-use-case/authentication/case.go b/internal/use-case/main-use-case/authentication/case.go index 0c1f4884..f80cf8e8 100644 --- a/internal/use-case/main-use-case/authentication/case.go +++ b/internal/use-case/main-use-case/authentication/case.go @@ -9,19 +9,19 @@ import ( "github.com/golang-jwt/jwt" "github.com/google/uuid" - dg "github.com/karincake/apem/db-gorm-pg" - d "github.com/karincake/dodol" - l "github.com/karincake/lepet" - a "github.com/karincake/apem" - ms "github.com/karincake/apem/ms-redis" + eu "simrs-vx/internal/domain/main-entities/user" + erc "simrs-vx/internal/domain/references/common" pa "simrs-vx/pkg/auth-helper" el "simrs-vx/pkg/logger" p "simrs-vx/pkg/password" - eu "simrs-vx/internal/domain/main-entities/user" - erc "simrs-vx/internal/domain/references/common" + a "github.com/karincake/apem" + dg "github.com/karincake/apem/db-gorm-pg" + ms "github.com/karincake/apem/ms-redis" + d "github.com/karincake/dodol" + l "github.com/karincake/lepet" ) var authCfg AuthCfg @@ -38,7 +38,7 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { // if input.Position_Code != "" { // user.Position_Code = input.Position_Code // } - if errCode := GetAndCheck(user, user); errCode != "" { + if errCode := getAndCheck(user, user); errCode != "" { return nil, d.FieldErrors{"authentication": d.FieldError{Code: errCode, Message: el.GenMessage(errCode)}} } @@ -85,11 +85,6 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { atExpires := time.Now().Add(duration).Unix() atSecretKey := authCfg.AtSecretKey - // extra - // if input.Position_Code == "doc" { - - // } - // Creating Access Token atClaims := jwt.MapClaims{} atClaims["user_id"] = user.Id @@ -127,12 +122,10 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { "status": "verified", }, Data: d.II{ - "user_id": strconv.Itoa(int(user.Id)), - "user_name": user.Name, - // "user_email": user.Email, + "user_id": strconv.Itoa(int(user.Id)), + "user_name": user.Name, "user_position_code": user.Position_Code, - // "user_ref_id": user.Ref_Id, - "accessToken": ats, + "accessToken": ats, }, }, nil } @@ -202,11 +195,9 @@ func ExtractToken(r *http.Request, tokenType TokenType) (data *pa.AuthInfo, err position_code = v.(string) } data = &pa.AuthInfo{ - Uuid: accessUuid, - User_Id: uint(user_id), - User_Name: user_name, - // User_Email: user_email, - // User_Ref_Id: ref_id, + Uuid: accessUuid, + User_Id: uint(user_id), + User_Name: user_name, User_Position_Code: position_code, } return diff --git a/internal/use-case/main-use-case/authentication/helper.go b/internal/use-case/main-use-case/authentication/helper.go index de618b5c..af4d2ccc 100644 --- a/internal/use-case/main-use-case/authentication/helper.go +++ b/internal/use-case/main-use-case/authentication/helper.go @@ -1,11 +1,15 @@ package authentication import ( + + // edp "simrs-vx/internal/domain/main-entities/division-position" + dg "github.com/karincake/apem/db-gorm-pg" + // pa "simrs-vx/pkg/auth-helper" ) // just return the error code -func GetAndCheck(input, condition any) (eCode string) { +func getAndCheck(input, condition any) (eCode string) { result := dg.I.Where(condition).Find(&input) if result.Error != nil { return "fetch-fail" @@ -16,6 +20,11 @@ func GetAndCheck(input, condition any) (eCode string) { return "" } -func GetDocName(id uint) string { +func getDocName(id uint) string { return "authentication" } + +// func getDivisionPosition(user_id uint) []pa.DivisionPosition { +// var divisionPosition []pa.DivisionPosition +// var divisionPositionList []edp.DivisionPosition +// } diff --git a/pkg/auth-helper/tycovar.go b/pkg/auth-helper/tycovar.go index deda1097..aa23e992 100644 --- a/pkg/auth-helper/tycovar.go +++ b/pkg/auth-helper/tycovar.go @@ -7,12 +7,16 @@ import ( type AuthKey struct{} type AuthInfo struct { - Uuid string - User_Id uint - User_Name string - // User_Email string - // User_Ref_Id int - User_Position_Code string + Uuid string + User_Id uint + User_Name string + User_DivisionPosition []DivisionPosition + User_Position_Code string +} + +type DivisionPosition struct { + Division_Code string + DivisionPosition_Code string } func (a AuthInfo) IsDoctor() bool { From c262947d3f4227a77d3d457540a6b298f69708f5 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 11:12:00 +0700 Subject: [PATCH 094/190] add employee id into division-position --- cmd/main-migration/migrations/20251006041122.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 5 +++-- internal/domain/main-entities/division-position/dto.go | 1 + internal/domain/main-entities/division-position/entity.go | 3 +++ 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 cmd/main-migration/migrations/20251006041122.sql diff --git a/cmd/main-migration/migrations/20251006041122.sql b/cmd/main-migration/migrations/20251006041122.sql new file mode 100644 index 00000000..24ace4a9 --- /dev/null +++ b/cmd/main-migration/migrations/20251006041122.sql @@ -0,0 +1,2 @@ +-- Modify "DivisionPosition" table +ALTER TABLE "public"."DivisionPosition" ADD COLUMN "Employee_Id" bigint NULL, ADD CONSTRAINT "fk_DivisionPosition_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 649eb37f..de8766a9 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:kjCOkexwu0wdD+/FPTIz43E0F/a1LI1VtyxR9B+CWyo= +h1:cZd+VVhnt5FF4se9KNDa0hoFlY3AMn3nN7apKGwyPf4= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -23,4 +23,5 @@ h1:kjCOkexwu0wdD+/FPTIz43E0F/a1LI1VtyxR9B+CWyo= 20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= 20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= 20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:zM3l4oB0U1kNpAvz47IBBIKdRW0QOGylzWHiBNLfUzs= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:XQh6G6ZbkpiKXpMy6xe1pJRD+vvyQ1IEw+1JOIRU7Cg= diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index 20664a7e..452fb86f 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -9,6 +9,7 @@ type CreateDto struct { Division_Id *uint16 `json:"division_id"` Code string `json:"code" validate:"maxLength=10"` Name string `json:"name" validate:"maxLength=50"` + Employee_Id *uint `json:"employee_id"` } type ReadListDto struct { diff --git a/internal/domain/main-entities/division-position/entity.go b/internal/domain/main-entities/division-position/entity.go index 6ff32055..27614764 100644 --- a/internal/domain/main-entities/division-position/entity.go +++ b/internal/domain/main-entities/division-position/entity.go @@ -3,6 +3,7 @@ package divisionposition import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/division" + ee "simrs-vx/internal/domain/main-entities/employee" ) type DivisionPosition struct { @@ -11,4 +12,6 @@ type DivisionPosition struct { Division *ed.Division `json:"division" gorm:"foreignKey:Division_Id"` Code string `json:"code" gorm:"unique;size:10"` Name string `json:"name" gorm:"size:50"` + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` } From e7611c9078c6d19e4eaf973a713b0de1f9a9b369 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 11:13:45 +0700 Subject: [PATCH 095/190] feat (division-position): add employee id --- internal/domain/main-entities/division-position/dto.go | 6 ++++++ internal/use-case/main-use-case/division-position/helper.go | 1 + 2 files changed, 7 insertions(+) diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index c1c6b125..5fefe554 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -3,6 +3,7 @@ package divisionposition import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/division" + ee "simrs-vx/internal/domain/main-entities/employee" ) type CreateDto struct { @@ -23,6 +24,7 @@ type FilterDto struct { Division_Id *uint16 `json:"division-id"` Code string `json:"code"` Name string `json:"name"` + Employee_Id *uint `json:"employee-id"` } type ReadDetailDto struct { @@ -51,6 +53,8 @@ type ResponseDto struct { Division *ed.Division `json:"division,omitempty"` Code string `json:"code"` Name string `json:"name"` + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty"` } func (d DivisionPosition) ToResponse() ResponseDto { @@ -58,6 +62,8 @@ func (d DivisionPosition) ToResponse() ResponseDto { Division_Id: d.Division_Id, Code: d.Code, Name: d.Name, + Employee_Id: d.Employee_Id, + Employee: d.Employee, } resp.SmallMain = d.SmallMain if d.Division != nil { diff --git a/internal/use-case/main-use-case/division-position/helper.go b/internal/use-case/main-use-case/division-position/helper.go index f353a9ea..97f2f26c 100644 --- a/internal/use-case/main-use-case/division-position/helper.go +++ b/internal/use-case/main-use-case/division-position/helper.go @@ -20,4 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DivisionPosition) { data.Division_Id = inputSrc.Division_Id data.Code = inputSrc.Code data.Name = inputSrc.Name + data.Employee_Id = inputSrc.Employee_Id } From 8e1fb5657080ce73dae2f546ef532f82e10357de Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 11:54:56 +0700 Subject: [PATCH 096/190] feat (auth): add user division position --- assets/language/en/data.json | 1 + .../main-use-case/authentication/case.go | 50 ++++++++++++------- .../main-use-case/authentication/helper.go | 48 +++++++++++++++--- pkg/auth-helper/tycovar.go | 14 +++--- 4 files changed, 81 insertions(+), 32 deletions(-) diff --git a/assets/language/en/data.json b/assets/language/en/data.json index a5223967..d78f3424 100644 --- a/assets/language/en/data.json +++ b/assets/language/en/data.json @@ -14,6 +14,7 @@ "auth-login-unverified": "login failed, account is not verified", "auth-logout-success": "logout success", "auth-reject-suspend": "restricted for suspended account", + "auth-getData-failed": "failed to get user data", "balance-exceeded": "must not exceeds balance", diff --git a/internal/use-case/main-use-case/authentication/case.go b/internal/use-case/main-use-case/authentication/case.go index f80cf8e8..3e10d86f 100644 --- a/internal/use-case/main-use-case/authentication/case.go +++ b/internal/use-case/main-use-case/authentication/case.go @@ -72,6 +72,11 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-login-unverified", Message: el.GenMessage("auth-login-unverified")}} } + userDivisionPositions, err := getDivisionPosition(user.Id) + if err != nil { + return nil, d.FieldErrors{"authentication": d.FieldError{Code: "auth-getData-failed", Message: el.GenMessage("auth-getData-failed")}} + } + // Access token prep id, err := uuid.NewRandom() if err != nil { @@ -89,11 +94,10 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { atClaims := jwt.MapClaims{} atClaims["user_id"] = user.Id atClaims["user_name"] = user.Name - // atClaims["user_email"] = user.Email atClaims["user_position_code"] = user.Position_Code - // atClaims["user_ref_id"] = user.Ref_Id atClaims["exp"] = atExpires atClaims["uuid"] = aUuid + atClaims["user_division_positions"] = userDivisionPositions at := jwt.NewWithClaims(jwt.SigningMethodHS256, atClaims) ats, err := at.SignedString([]byte(atSecretKey)) if err != nil { @@ -122,10 +126,11 @@ func GenToken(input eu.LoginDto) (*d.Data, error) { "status": "verified", }, Data: d.II{ - "user_id": strconv.Itoa(int(user.Id)), - "user_name": user.Name, - "user_position_code": user.Position_Code, - "accessToken": ats, + "user_id": strconv.Itoa(int(user.Id)), + "user_name": user.Name, + "user_position_code": user.Position_Code, + "accessToken": ats, + "user_division_positions": userDivisionPositions, }, }, nil } @@ -181,24 +186,31 @@ func ExtractToken(r *http.Request, tokenType TokenType) (data *pa.AuthInfo, err return nil, d.FieldError{Code: "token-unidentified", Message: el.GenMessage("token-unidentified")} } user_name := fmt.Sprintf("%v", claims["user_name"]) - // user_email := "" - // if v, exist := claims["user_email"]; exist && v != nil { - // user_email = v.(string) - // } - // ref_id := 0 - // if v, exist := claims["user_ref_id"]; exist && v != nil { - // tmp := v.(float64) - // ref_id = int(tmp) - // } + + var userDivisionPositions []pa.DivisionPosition + if raw, ok := claims["user_division_position"]; ok && raw != nil { + if list, ok := raw.([]interface{}); ok { + for _, item := range list { + if m, ok := item.(map[string]interface{}); ok { + dp := pa.DivisionPosition{ + Division_Code: fmt.Sprintf("%v", m["Division_Code"]), + DivisionPosition_Code: fmt.Sprintf("%v", m["DivisionPosition_Code"]), + } + userDivisionPositions = append(userDivisionPositions, dp) + } + } + } + } position_code := "" if v, exist := claims["user_position_code"]; exist && v != nil { position_code = v.(string) } data = &pa.AuthInfo{ - Uuid: accessUuid, - User_Id: uint(user_id), - User_Name: user_name, - User_Position_Code: position_code, + Uuid: accessUuid, + User_Id: uint(user_id), + User_Name: user_name, + User_Position_Code: position_code, + User_DivisionPositions: userDivisionPositions, } return } diff --git a/internal/use-case/main-use-case/authentication/helper.go b/internal/use-case/main-use-case/authentication/helper.go index af4d2ccc..50b0c8fd 100644 --- a/internal/use-case/main-use-case/authentication/helper.go +++ b/internal/use-case/main-use-case/authentication/helper.go @@ -1,11 +1,14 @@ package authentication import ( + "errors" + edp "simrs-vx/internal/domain/main-entities/division-position" + ee "simrs-vx/internal/domain/main-entities/employee" - // edp "simrs-vx/internal/domain/main-entities/division-position" + pa "simrs-vx/pkg/auth-helper" dg "github.com/karincake/apem/db-gorm-pg" - // pa "simrs-vx/pkg/auth-helper" + "gorm.io/gorm" ) // just return the error code @@ -24,7 +27,40 @@ func getDocName(id uint) string { return "authentication" } -// func getDivisionPosition(user_id uint) []pa.DivisionPosition { -// var divisionPosition []pa.DivisionPosition -// var divisionPositionList []edp.DivisionPosition -// } +func getDivisionPosition(user_id uint) ([]pa.DivisionPosition, error) { + var result []pa.DivisionPosition + + var employee ee.Employee + if err := dg.I.Where("\"User_Id\" = ?", user_id).First(&employee).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return result, nil + } + return result, errors.New("no employee found") + } + + var divisionPositions []edp.DivisionPosition + err := dg.I. + Preload("Division"). + Where("\"Employee_Id\" = ?", employee.Id). + Find(&divisionPositions).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return result, nil + } + return result, err + } + + for _, dp := range divisionPositions { + result = append(result, pa.DivisionPosition{ + Division_Code: func() string { + if dp.Division != nil { + return dp.Division.Code + } + return "" + }(), + DivisionPosition_Code: dp.Code, + }) + } + + return result, nil +} diff --git a/pkg/auth-helper/tycovar.go b/pkg/auth-helper/tycovar.go index aa23e992..288c9d21 100644 --- a/pkg/auth-helper/tycovar.go +++ b/pkg/auth-helper/tycovar.go @@ -7,16 +7,16 @@ import ( type AuthKey struct{} type AuthInfo struct { - Uuid string - User_Id uint - User_Name string - User_DivisionPosition []DivisionPosition - User_Position_Code string + Uuid string + User_Id uint + User_Name string + User_DivisionPositions []DivisionPosition + User_Position_Code string } type DivisionPosition struct { - Division_Code string - DivisionPosition_Code string + Division_Code string `json:"division_code"` + DivisionPosition_Code string `json:"divisionPosition_code"` } func (a AuthInfo) IsDoctor() bool { From 7966cd11e139116f6f903ce88f6fd9b7c52cd51d Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 11:57:31 +0700 Subject: [PATCH 097/190] add coms, and disabillty column into person --- .../migrations/20251006045658.sql | 2 + cmd/main-migration/migrations/atlas.sum | 5 +- .../domain/main-entities/person/entity.go | 54 ++++++++++--------- 3 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 cmd/main-migration/migrations/20251006045658.sql diff --git a/cmd/main-migration/migrations/20251006045658.sql b/cmd/main-migration/migrations/20251006045658.sql new file mode 100644 index 00000000..a8c3a4d7 --- /dev/null +++ b/cmd/main-migration/migrations/20251006045658.sql @@ -0,0 +1,2 @@ +-- Modify "Person" table +ALTER TABLE "public"."Person" ADD COLUMN "CommunicationIssueStatus" boolean NULL, ADD COLUMN "Disabillity" character varying(100) NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index de8766a9..e6f4c0ca 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:cZd+VVhnt5FF4se9KNDa0hoFlY3AMn3nN7apKGwyPf4= +h1:JsKC89Hpwk3JTQjwLwPRlSPOwsFDWgb5NZ1roR6HyL4= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -24,4 +24,5 @@ h1:cZd+VVhnt5FF4se9KNDa0hoFlY3AMn3nN7apKGwyPf4= 20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= 20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= 20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:XQh6G6ZbkpiKXpMy6xe1pJRD+vvyQ1IEw+1JOIRU7Cg= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:Frqb7wni/OVZT3jVYOE4ff/3MmWccWJJj4yMxvWUHbs= diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index 0f12fcd3..569a73c4 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -13,32 +13,34 @@ import ( ) type Person struct { - ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"not null;size:150"` - FrontTitle *string `json:"frontTitle" gorm:"size:50"` - EndTitle *string `json:"endTitle" gorm:"size:50"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` - Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` - ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"unique;size:16"` - PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"unique;size:20"` - Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` - Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` - Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` - Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` - Nationality *string `json:"nationality": gorm:"size:50"` - Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` - Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` - Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` - Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` - Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` - Language_Code *string `json:"language_code" gorm:"size:10"` - Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` - ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl" gorm:"size:1024"` - PassportFileUrl *string `json:"passportFileUrl" gorm:"size:1024"` - DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl" gorm:"size:1024"` - FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl" gorm:"size:1024"` + ecore.Main // adjust this according to the needs + Name string `json:"name" gorm:"not null;size:150"` + FrontTitle *string `json:"frontTitle" gorm:"size:50"` + EndTitle *string `json:"endTitle" gorm:"size:50"` + BirthDate *time.Time `json:"birthDate,omitempty"` + BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` + Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` + ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"unique;size:16"` + PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"unique;size:20"` + Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` + Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` + Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` + Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` + Nationality *string `json:"nationality": gorm:"size:50"` + Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` + Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` + Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` + Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` + Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` + Language_Code *string `json:"language_code" gorm:"size:10"` + Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` + CommunicationIssueStatus bool `json:"communicationIssueStatus"` + Disabillity *string `json:"disabillity" gorm:"size:100"` + ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl" gorm:"size:1024"` + PassportFileUrl *string `json:"passportFileUrl" gorm:"size:1024"` + DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl" gorm:"size:1024"` + FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl" gorm:"size:1024"` } func (d Person) IsSameResidentIdentityNumber(input *string) bool { From cb7eac26ef5fd853a8b9fd8f065832705817c56d Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 11:59:50 +0700 Subject: [PATCH 098/190] fix disability column typo --- cmd/main-migration/migrations/20251006045928.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 5 +++-- internal/domain/main-entities/person/entity.go | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 cmd/main-migration/migrations/20251006045928.sql diff --git a/cmd/main-migration/migrations/20251006045928.sql b/cmd/main-migration/migrations/20251006045928.sql new file mode 100644 index 00000000..f495a26d --- /dev/null +++ b/cmd/main-migration/migrations/20251006045928.sql @@ -0,0 +1,2 @@ +-- Rename a column from "Disabillity" to "Disability" +ALTER TABLE "public"."Person" RENAME COLUMN "Disabillity" TO "Disability"; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index e6f4c0ca..e900c72e 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:JsKC89Hpwk3JTQjwLwPRlSPOwsFDWgb5NZ1roR6HyL4= +h1:mTtZwYftlpTk+eVzzPqjg+OMUYcQGa39qB5fLUehDC8= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -25,4 +25,5 @@ h1:JsKC89Hpwk3JTQjwLwPRlSPOwsFDWgb5NZ1roR6HyL4= 20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= 20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= 20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:Frqb7wni/OVZT3jVYOE4ff/3MmWccWJJj4yMxvWUHbs= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:bIdFndhaIdxtwEJr9aNirQTZ2bFGg9KK5PYhN8dDyUs= diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index 569a73c4..91b2462e 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -36,7 +36,7 @@ type Person struct { Language_Code *string `json:"language_code" gorm:"size:10"` Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` CommunicationIssueStatus bool `json:"communicationIssueStatus"` - Disabillity *string `json:"disabillity" gorm:"size:100"` + Disability *string `json:"disability" gorm:"size:100"` ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl" gorm:"size:1024"` PassportFileUrl *string `json:"passportFileUrl" gorm:"size:1024"` DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl" gorm:"size:1024"` From ec7cd9b9293b2d36b770400047d3b27e2bb167cb Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 12:03:25 +0700 Subject: [PATCH 099/190] feat (person): add coms issue and disability field --- internal/domain/main-entities/person/dto.go | 168 +++++++++--------- .../use-case/main-use-case/person/helper.go | 2 + 2 files changed, 90 insertions(+), 80 deletions(-) diff --git a/internal/domain/main-entities/person/dto.go b/internal/domain/main-entities/person/dto.go index 7490d579..85617706 100644 --- a/internal/domain/main-entities/person/dto.go +++ b/internal/domain/main-entities/person/dto.go @@ -13,22 +13,24 @@ import ( ) type CreateDto struct { - Name string `json:"name" validate:"maxLength=150"` - FrontTitle *string `json:"frontTitle" validate:"maxLength=50"` - EndTitle *string `json:"endTitle" validate:"maxLength=50"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency_code" validate:"maxLength=4"` - Gender_Code *erp.GenderCode `json:"gender_code"` - ResidentIdentityNumber *string `json:"residentIdentityNumber" validate:"nik;maxLength=16"` - PassportNumber *string `json:"passportNumber" validate:"maxLength=20"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber" validate:"maxLength=20"` - Religion_Code *erp.ReligionCode `json:"religion_code" validate:"maxLength=10"` - Education_Code *erp.EducationCode `json:"education_code" validate:"maxLength=10"` - Ocupation_Code *erp.OcupationCode `json:"occupation_code" validate:"maxLength=15"` - Ocupation_Name *string `json:"occupation_name" validate:"maxLength=50"` - Nationality *string `json:"nationality" validate:"maxLength=50"` - Ethnic_Code *string `json:"ethnic_code" validate:"maxLength=20"` - Language_Code *string `json:"language_code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=150"` + FrontTitle *string `json:"frontTitle" validate:"maxLength=50"` + EndTitle *string `json:"endTitle" validate:"maxLength=50"` + BirthDate *time.Time `json:"birthDate,omitempty"` + BirthRegency_Code *string `json:"birthRegency_code" validate:"maxLength=4"` + Gender_Code *erp.GenderCode `json:"gender_code"` + ResidentIdentityNumber *string `json:"residentIdentityNumber" validate:"nik;maxLength=16"` + PassportNumber *string `json:"passportNumber" validate:"maxLength=20"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber" validate:"maxLength=20"` + Religion_Code *erp.ReligionCode `json:"religion_code" validate:"maxLength=10"` + Education_Code *erp.EducationCode `json:"education_code" validate:"maxLength=10"` + Ocupation_Code *erp.OcupationCode `json:"occupation_code" validate:"maxLength=15"` + Ocupation_Name *string `json:"occupation_name" validate:"maxLength=50"` + Nationality *string `json:"nationality" validate:"maxLength=50"` + Ethnic_Code *string `json:"ethnic_code" validate:"maxLength=20"` + Language_Code *string `json:"language_code" validate:"maxLength=10"` + CommunicationIssueStatus bool `json:"communicationIssueStatus"` + Disability *string `json:"disability" validate:"maxLength=100"` } type ReadListDto struct { @@ -39,22 +41,24 @@ type ReadListDto struct { } type FilterDto struct { - Name string `json:"name"` - FrontTitle *string `json:"frontTitle"` - EndTitle *string `json:"endTitle"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency-code"` - Gender_Code *erp.GenderCode `json:"gender-code"` - ResidentIdentityNumber *string `json:"residentIdentityNumber"` - PassportNumber *string `json:"passportNumber"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber"` - Religion_Code *erp.ReligionCode `json:"religion-code"` - Education_Code *erp.EducationCode `json:"education-code"` - Ocupation_Code *erp.OcupationCode `json:"occupation-code"` - Ocupation_Name *string `json:"occupation-name"` - Nationality *string `json:"nationality"` - Ethnic_Code *string `json:"ethnic-code"` - Language_Code *string `json:"language-code"` + Name string `json:"name"` + FrontTitle *string `json:"frontTitle"` + EndTitle *string `json:"endTitle"` + BirthDate *time.Time `json:"birthDate,omitempty"` + BirthRegency_Code *string `json:"birthRegency-code"` + Gender_Code *erp.GenderCode `json:"gender-code"` + ResidentIdentityNumber *string `json:"residentIdentityNumber"` + PassportNumber *string `json:"passportNumber"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber"` + Religion_Code *erp.ReligionCode `json:"religion-code"` + Education_Code *erp.EducationCode `json:"education-code"` + Ocupation_Code *erp.OcupationCode `json:"occupation-code"` + Ocupation_Name *string `json:"occupation-name"` + Nationality *string `json:"nationality"` + Ethnic_Code *string `json:"ethnic-code"` + Language_Code *string `json:"language-code"` + CommunicationIssueStatus bool `json:"communicationIssueStatus"` + Disability *string `json:"disability"` } type ReadDetailDto struct { @@ -82,58 +86,62 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Name string `json:"name"` - FrontTitle *string `json:"frontTitle"` - EndTitle *string `json:"endTitle"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency_code"` - Gender_Code *erp.GenderCode `json:"gender_code"` - ResidentIdentityNumber *string `json:"residentIdentityNumber"` - PassportNumber *string `json:"passportNumber"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber"` - Religion_Code *erp.ReligionCode `json:"religion_code"` - Education_Code *erp.EducationCode `json:"education_code"` - Ocupation_Code *erp.OcupationCode `json:"occupation_code"` - Ocupation_Name *string `json:"occupation_name"` - Nationality *string `json:"nationality"` - Ethnic_Code *string `json:"ethnic_code"` - Ethnic *ee.Ethnic `json:"ethnic,omitempty"` - Addresses *[]epa.PersonAddress `json:"addresses,omitempty"` - Contacts *[]epc.PersonContact `json:"contacts,omitempty"` - Relatives *[]epr.PersonRelative `json:"relatives,omitempty"` - Language_Code *string `json:"language_code"` - ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl"` - PassportFileUrl *string `json:"passportFileUrl"` - DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl"` - FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl"` + Name string `json:"name"` + FrontTitle *string `json:"frontTitle"` + EndTitle *string `json:"endTitle"` + BirthDate *time.Time `json:"birthDate,omitempty"` + BirthRegency_Code *string `json:"birthRegency_code"` + Gender_Code *erp.GenderCode `json:"gender_code"` + ResidentIdentityNumber *string `json:"residentIdentityNumber"` + PassportNumber *string `json:"passportNumber"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber"` + Religion_Code *erp.ReligionCode `json:"religion_code"` + Education_Code *erp.EducationCode `json:"education_code"` + Ocupation_Code *erp.OcupationCode `json:"occupation_code"` + Ocupation_Name *string `json:"occupation_name"` + Nationality *string `json:"nationality"` + Ethnic_Code *string `json:"ethnic_code"` + Ethnic *ee.Ethnic `json:"ethnic,omitempty"` + Addresses *[]epa.PersonAddress `json:"addresses,omitempty"` + Contacts *[]epc.PersonContact `json:"contacts,omitempty"` + Relatives *[]epr.PersonRelative `json:"relatives,omitempty"` + Language_Code *string `json:"language_code"` + CommunicationIssueStatus bool `json:"communicationIssueStatus"` + Disability *string `json:"disability"` + ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl"` + PassportFileUrl *string `json:"passportFileUrl"` + DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl"` + FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl"` } func (d *Person) ToResponse() ResponseDto { resp := ResponseDto{ - Name: d.Name, - FrontTitle: d.FrontTitle, - EndTitle: d.EndTitle, - BirthDate: d.BirthDate, - BirthRegency_Code: d.BirthRegency_Code, - Gender_Code: d.Gender_Code, - ResidentIdentityNumber: d.ResidentIdentityNumber, - PassportNumber: d.PassportNumber, - DrivingLicenseNumber: d.DrivingLicenseNumber, - Religion_Code: d.Religion_Code, - Education_Code: d.Education_Code, - Ocupation_Code: d.Ocupation_Code, - Ocupation_Name: d.Ocupation_Name, - Nationality: d.Nationality, - Ethnic_Code: d.Ethnic_Code, - Ethnic: d.Ethnic, - Addresses: d.Addresses, - Contacts: d.Contacts, - Relatives: d.Relatives, - Language_Code: d.Language_Code, - ResidentIdentityFileUrl: d.ResidentIdentityFileUrl, - PassportFileUrl: d.PassportFileUrl, - DrivingLicenseFileUrl: d.DrivingLicenseFileUrl, - FamilyIdentityFileUrl: d.FamilyIdentityFileUrl, + Name: d.Name, + FrontTitle: d.FrontTitle, + EndTitle: d.EndTitle, + BirthDate: d.BirthDate, + BirthRegency_Code: d.BirthRegency_Code, + Gender_Code: d.Gender_Code, + ResidentIdentityNumber: d.ResidentIdentityNumber, + PassportNumber: d.PassportNumber, + DrivingLicenseNumber: d.DrivingLicenseNumber, + Religion_Code: d.Religion_Code, + Education_Code: d.Education_Code, + Ocupation_Code: d.Ocupation_Code, + Ocupation_Name: d.Ocupation_Name, + Nationality: d.Nationality, + Ethnic_Code: d.Ethnic_Code, + Ethnic: d.Ethnic, + Addresses: d.Addresses, + Contacts: d.Contacts, + Relatives: d.Relatives, + Language_Code: d.Language_Code, + CommunicationIssueStatus: d.CommunicationIssueStatus, + Disability: d.Disability, + ResidentIdentityFileUrl: d.ResidentIdentityFileUrl, + PassportFileUrl: d.PassportFileUrl, + DrivingLicenseFileUrl: d.DrivingLicenseFileUrl, + FamilyIdentityFileUrl: d.FamilyIdentityFileUrl, } resp.Main = d.Main return resp diff --git a/internal/use-case/main-use-case/person/helper.go b/internal/use-case/main-use-case/person/helper.go index f412a268..61a2f18c 100644 --- a/internal/use-case/main-use-case/person/helper.go +++ b/internal/use-case/main-use-case/person/helper.go @@ -33,4 +33,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Person) { data.Nationality = inputSrc.Nationality data.Ethnic_Code = inputSrc.Ethnic_Code data.Language_Code = inputSrc.Language_Code + data.CommunicationIssueStatus = inputSrc.CommunicationIssueStatus + data.Disability = inputSrc.Disability } From 8de44b1e4d3a6365977e07cb51df5e1a28cd4f03 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 12:41:09 +0700 Subject: [PATCH 100/190] update extractToken to read user_division_positions claim/jwt --- .../main-use-case/authentication/case.go | 20 ++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/internal/use-case/main-use-case/authentication/case.go b/internal/use-case/main-use-case/authentication/case.go index 3e10d86f..b6e9f2f4 100644 --- a/internal/use-case/main-use-case/authentication/case.go +++ b/internal/use-case/main-use-case/authentication/case.go @@ -188,15 +188,25 @@ func ExtractToken(r *http.Request, tokenType TokenType) (data *pa.AuthInfo, err user_name := fmt.Sprintf("%v", claims["user_name"]) var userDivisionPositions []pa.DivisionPosition - if raw, ok := claims["user_division_position"]; ok && raw != nil { - if list, ok := raw.([]interface{}); ok { - for _, item := range list { + raw := claims["user_division_positions"] + if raw == nil { + fmt.Println("No user_division_positions found in claims") + } else { + list, ok := raw.([]interface{}) + if !ok { + fmt.Printf("user_division_positions is not []interface{}, but %T\n", raw) + } else { + fmt.Printf("Found %d division positions\n", len(list)) + for i, item := range list { if m, ok := item.(map[string]interface{}); ok { + fmt.Printf("Item %d: %v\n", i, m) dp := pa.DivisionPosition{ - Division_Code: fmt.Sprintf("%v", m["Division_Code"]), - DivisionPosition_Code: fmt.Sprintf("%v", m["DivisionPosition_Code"]), + Division_Code: fmt.Sprintf("%v", m["division_code"]), + DivisionPosition_Code: fmt.Sprintf("%v", m["divisionPosition_code"]), } userDivisionPositions = append(userDivisionPositions, dp) + } else { + fmt.Printf("Item %d not map[string]interface{} but %T\n", i, item) } } } From 40206abb2be9dae94c7cfb4b565b6602adad08eb Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 6 Oct 2025 14:31:34 +0700 Subject: [PATCH 101/190] handle nested preloads --- pkg/use-case-helper/use-case-helper.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/use-case-helper/use-case-helper.go b/pkg/use-case-helper/use-case-helper.go index 04a8eada..8c41266f 100644 --- a/pkg/use-case-helper/use-case-helper.go +++ b/pkg/use-case-helper/use-case-helper.go @@ -118,7 +118,11 @@ func GetPreloads(input string) []string { result := []string{} parts := strings.Split(input, ",") for _, p := range parts { - result = append(result, kebabToPascal(p)) + subParts := strings.Split(p, "-") + for i := range subParts { + subParts[i] = kebabToPascal(subParts[i]) + } + result = append(result, strings.Join(subParts, ".")) } return result } From 33fcedae5014b73f36e5ca428ad28e6c007b1bd6 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Mon, 6 Oct 2025 14:36:25 +0700 Subject: [PATCH 102/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 58 ++++++++++++------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index e900c72e..faf641f7 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,29 +1,29 @@ -h1:mTtZwYftlpTk+eVzzPqjg+OMUYcQGa39qB5fLUehDC8= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:bIdFndhaIdxtwEJr9aNirQTZ2bFGg9KK5PYhN8dDyUs= +h1:lnNqH2GgK+sX9G6wiCQLrxP38JwV6vPkCsiWE9+QZRE= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= From 32bfbf2c031e4931255fbbeb994271e50b59c77e Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 7 Oct 2025 09:19:17 +0700 Subject: [PATCH 103/190] set static status_code as new for orders --- internal/use-case/main-use-case/device-order/helper.go | 4 +++- internal/use-case/main-use-case/material-order/helper.go | 4 +++- internal/use-case/main-use-case/mcu-order/helper.go | 4 +++- internal/use-case/main-use-case/prescription/helper.go | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) 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 f64e8886..3be32a7a 100644 --- a/internal/use-case/main-use-case/device-order/helper.go +++ b/internal/use-case/main-use-case/device-order/helper.go @@ -6,18 +6,20 @@ package deviceorder import ( e "simrs-vx/internal/domain/main-entities/device-order" + + erc "simrs-vx/internal/domain/references/common" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DeviceOrder) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT + data.Status_Code = erc.DSCNew } else { inputTemp := any(input).(*e.UpdateDto) inputSrc = &inputTemp.CreateDto } data.Encounter_Id = inputSrc.Encounter_Id - data.Status_Code = inputSrc.Status_Code data.Doctor_Id = inputSrc.Doctor_Id } 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 c3a0fdde..fe0862e9 100644 --- a/internal/use-case/main-use-case/material-order/helper.go +++ b/internal/use-case/main-use-case/material-order/helper.go @@ -6,18 +6,20 @@ package materialorder import ( e "simrs-vx/internal/domain/main-entities/material-order" + + erc "simrs-vx/internal/domain/references/common" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MaterialOrder) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT + data.Status_Code = erc.DSCNew } else { inputTemp := any(input).(*e.UpdateDto) inputSrc = &inputTemp.CreateDto } data.Encounter_Id = inputSrc.Encounter_Id - data.Status_Code = inputSrc.Status_Code data.Doctor_Id = inputSrc.Doctor_Id } diff --git a/internal/use-case/main-use-case/mcu-order/helper.go b/internal/use-case/main-use-case/mcu-order/helper.go index b5c9bdf1..8c7115b6 100644 --- a/internal/use-case/main-use-case/mcu-order/helper.go +++ b/internal/use-case/main-use-case/mcu-order/helper.go @@ -6,19 +6,21 @@ package mcuorder import ( e "simrs-vx/internal/domain/main-entities/mcu-order" + + erc "simrs-vx/internal/domain/references/common" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.McuOrder) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT + data.Status_Code = erc.DSCNew } else { inputTemp := any(input).(*e.UpdateDto) inputSrc = &inputTemp.CreateDto } data.Encounter_Id = inputSrc.Encounter_Id - data.Status_Code = inputSrc.Status_Code data.Doctor_Id = inputSrc.Doctor_Id data.SpecimenPickTime = inputSrc.SpecimenPickTime data.ExaminationDate = inputSrc.ExaminationDate diff --git a/internal/use-case/main-use-case/prescription/helper.go b/internal/use-case/main-use-case/prescription/helper.go index ee0b23b3..8b85884a 100644 --- a/internal/use-case/main-use-case/prescription/helper.go +++ b/internal/use-case/main-use-case/prescription/helper.go @@ -12,6 +12,8 @@ import ( e "simrs-vx/internal/domain/main-entities/prescription" epi "simrs-vx/internal/domain/main-entities/prescription-item" + erc "simrs-vx/internal/domain/references/common" + um "simrs-vx/internal/use-case/main-use-case/medication" umei "simrs-vx/internal/use-case/main-use-case/medication-item" umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" @@ -28,6 +30,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Prescription) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT + data.Status_Code = erc.DSCNew } else { inputTemp := any(input).(*e.UpdateDto) inputSrc = &inputTemp.CreateDto @@ -36,7 +39,6 @@ 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 } func createMedication(prescription_id uint, event *pl.Event, tx *gorm.DB) error { From 7bd2a5105da8cb5caab6d3f35a8eb324047d07cf Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 7 Oct 2025 09:29:17 +0700 Subject: [PATCH 104/190] add newbornstatus into patient --- .../migrations/20251007022859.sql | 2 + cmd/main-migration/migrations/atlas.sum | 59 ++++++++++--------- .../domain/main-entities/patient/entity.go | 13 ++-- 3 files changed, 39 insertions(+), 35 deletions(-) create mode 100644 cmd/main-migration/migrations/20251007022859.sql diff --git a/cmd/main-migration/migrations/20251007022859.sql b/cmd/main-migration/migrations/20251007022859.sql new file mode 100644 index 00000000..03b0890b --- /dev/null +++ b/cmd/main-migration/migrations/20251007022859.sql @@ -0,0 +1,2 @@ +-- Modify "Patient" table +ALTER TABLE "public"."Patient" ADD COLUMN "NewBornStatus" boolean NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index faf641f7..d0920867 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,29 +1,30 @@ -h1:lnNqH2GgK+sX9G6wiCQLrxP38JwV6vPkCsiWE9+QZRE= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +h1:ZyLhZFZoiN0F1XdEaKvIbcFdvrYL1nLWtjK94oqn9IA= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:fFz0Kjuopv0QqLDiMvq+9sfq6K6PdiOs55EECWk4U+I= diff --git a/internal/domain/main-entities/patient/entity.go b/internal/domain/main-entities/patient/entity.go index ada67f3b..491140cd 100644 --- a/internal/domain/main-entities/patient/entity.go +++ b/internal/domain/main-entities/patient/entity.go @@ -8,10 +8,11 @@ import ( ) type Patient struct { - ecore.Main // adjust this according to the needs - Person_Id *uint `json:"person_id"` - Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id;references:Id"` - RegisteredAt *time.Time `json:"registeredAt"` - Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` - Number *string `json:"number" gorm:"unique;size:15"` + ecore.Main // adjust this according to the needs + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id;references:Id"` + NewBornStatus bool `json:"newBornStatus"` + RegisteredAt *time.Time `json:"registeredAt"` + Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` + Number *string `json:"number" gorm:"unique;size:15"` } From 34a85fa0fa9b2fbd34addfd98b69b7c26c01d309 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 7 Oct 2025 09:31:48 +0700 Subject: [PATCH 105/190] feat (patient): adjust after newbornstatus added --- internal/domain/main-entities/patient/dto.go | 32 +++++++++++-------- .../use-case/main-use-case/patient/helper.go | 1 + 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index 394d1ee7..26cac97e 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -17,6 +17,7 @@ import ( type CreateDto struct { Person_Id *uint `json:"-"` Person *ep.UpdateDto `json:"person"` + NewBornStatus bool `json:"newBornStatus"` PersonAddresses []epa.UpdateDto `json:"personAddresses"` PersonContacts []epc.UpdateDto `json:"personContacts"` PersonRelatives []epr.UpdateDto `json:"personRelatives"` @@ -32,10 +33,11 @@ type ReadListDto struct { } type FilterDto struct { - Person_Id *uint `json:"person-id"` - RegisteredAt *time.Time `json:"registeredAt"` - Status_Code erc.ActiveStatusCode `json:"status-code"` - Number *string `json:"number"` + Person_Id *uint `json:"person-id"` + NewBornStatus *bool `json:"newBornStatus"` + RegisteredAt *time.Time `json:"registeredAt"` + Status_Code erc.ActiveStatusCode `json:"status-code"` + Number *string `json:"number"` } type ReadDetailDto struct { @@ -76,20 +78,22 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Person_Id *uint `json:"person_id"` - Person *ep.Person `json:"person,omitempty"` - RegisteredAt *time.Time `json:"registeredAt"` - Status_Code erc.ActiveStatusCode `json:"status_code"` - Number *string `json:"number"` + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty"` + NewBornStatus bool `json:"newBornStatus"` + RegisteredAt *time.Time `json:"registeredAt"` + Status_Code erc.ActiveStatusCode `json:"status_code"` + Number *string `json:"number"` } func (d Patient) ToResponse() ResponseDto { resp := ResponseDto{ - Person_Id: d.Person_Id, - Person: d.Person, - RegisteredAt: d.RegisteredAt, - Status_Code: d.Status_Code, - Number: d.Number, + Person_Id: d.Person_Id, + Person: d.Person, + NewBornStatus: d.NewBornStatus, + RegisteredAt: d.RegisteredAt, + Status_Code: d.Status_Code, + Number: d.Number, } resp.Main = d.Main return resp diff --git a/internal/use-case/main-use-case/patient/helper.go b/internal/use-case/main-use-case/patient/helper.go index 82154b47..8abfeaf3 100644 --- a/internal/use-case/main-use-case/patient/helper.go +++ b/internal/use-case/main-use-case/patient/helper.go @@ -40,6 +40,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Patient) error { data.Person_Id = inputSrc.Person_Id data.RegisteredAt = inputSrc.RegisteredAt data.Status_Code = inputSrc.Status_Code + data.NewBornStatus = inputSrc.NewBornStatus return nil } From 1a97fbb99887396bab45fd675f5171e20c7a415b Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 7 Oct 2025 09:35:01 +0700 Subject: [PATCH 106/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 60 ++++++++++++------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index d0920867..ec604c0f 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,30 +1,30 @@ -h1:ZyLhZFZoiN0F1XdEaKvIbcFdvrYL1nLWtjK94oqn9IA= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:fFz0Kjuopv0QqLDiMvq+9sfq6K6PdiOs55EECWk4U+I= +h1:4sYu9Y6C4NdDbQlKG+HP42zgqIwnaR7K66JkL5b2gBg= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= From 7c4b8b484903204a56e536db76b0ea9f7257bfcc Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 7 Oct 2025 15:03:04 +0700 Subject: [PATCH 107/190] fix (installation): fix pagination --- internal/domain/main-entities/installation/dto.go | 9 ++++++++- internal/use-case/main-use-case/installation/case.go | 3 +++ internal/use-case/main-use-case/installation/lib.go | 10 +++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index f6d8ef03..591c7a6d 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -13,10 +13,17 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination +} + +type FilterDto struct { Code string `json:"code"` Name string `json:"name"` EncounterClass_Code ere.EncounterClassCode `json:"encounterClass-code"` - Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/use-case/main-use-case/installation/case.go b/internal/use-case/main-use-case/installation/case.go index 5e1339da..234681e8 100644 --- a/internal/use-case/main-use-case/installation/case.go +++ b/internal/use-case/main-use-case/installation/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/installation/lib.go b/internal/use-case/main-use-case/installation/lib.go index c8e3d2aa..7178cd18 100644 --- a/internal/use-case/main-use-case/installation/lib.go +++ b/internal/use-case/main-use-case/installation/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Installation{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") From 885992ffeb75fd744ebe6cae96fe8265283ff641 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 7 Oct 2025 15:45:54 +0700 Subject: [PATCH 108/190] work around infra to handle rooms --- cmd/main-migration/migrations/atlas.sum | 60 +++++++++---------- internal/domain/main-entities/infra/entity.go | 2 + .../domain/main-entities/room/base/entity.go | 19 ++++++ internal/domain/main-entities/room/entity.go | 16 +---- 4 files changed, 54 insertions(+), 43 deletions(-) create mode 100644 internal/domain/main-entities/room/base/entity.go diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index ec604c0f..a8dfe2ee 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,30 +1,30 @@ -h1:4sYu9Y6C4NdDbQlKG+HP42zgqIwnaR7K66JkL5b2gBg= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +h1:4thtC22CJCQMIeVkYLmcFOT5w7S+bUUWy9wHZ21OHi8= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= diff --git a/internal/domain/main-entities/infra/entity.go b/internal/domain/main-entities/infra/entity.go index cf069376..dcda82fb 100644 --- a/internal/domain/main-entities/infra/entity.go +++ b/internal/domain/main-entities/infra/entity.go @@ -3,6 +3,7 @@ package infra import ( ecore "simrs-vx/internal/domain/base-entities/core" ei "simrs-vx/internal/domain/main-entities/item" + erb "simrs-vx/internal/domain/main-entities/room/base" ero "simrs-vx/internal/domain/references/organization" ) @@ -17,4 +18,5 @@ type Infra struct { Childrens []Infra `json:"childrens" gorm:"foreignKey:Parent_Id"` // may need references to self Item_Id *uint `json:"item_id"` Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` + Rooms []erb.Basic `json:"rooms" gorm:"foreignKey:Infra_Id"` } diff --git a/internal/domain/main-entities/room/base/entity.go b/internal/domain/main-entities/room/base/entity.go new file mode 100644 index 00000000..bbf87db8 --- /dev/null +++ b/internal/domain/main-entities/room/base/entity.go @@ -0,0 +1,19 @@ +package base + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" + eu "simrs-vx/internal/domain/main-entities/unit" +) + +type Basic struct { + ecore.SmallMain // adjust this according to the needs + Infra_Id *uint16 `json:"infra_id"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` +} diff --git a/internal/domain/main-entities/room/entity.go b/internal/domain/main-entities/room/entity.go index bcc02aeb..346c7741 100644 --- a/internal/domain/main-entities/room/entity.go +++ b/internal/domain/main-entities/room/entity.go @@ -1,21 +1,11 @@ package room import ( - ecore "simrs-vx/internal/domain/base-entities/core" ei "simrs-vx/internal/domain/main-entities/infra" - es "simrs-vx/internal/domain/main-entities/specialist" - ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" + ebase "simrs-vx/internal/domain/main-entities/room/base" ) type Room struct { - ecore.SmallMain // adjust this according to the needs - Infra_Id *uint16 `json:"infra_id"` - Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id"` - Unit_Id *uint16 `json:"unit_id"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id"` - Specialist_Id *uint16 `json:"specialist_id"` - Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` + ebase.Basic + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id"` } From 6efffc9056a64399e76d989b01800b48420e5d6c Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 7 Oct 2025 16:02:12 +0700 Subject: [PATCH 109/190] feat (infra): add rooms relation --- internal/domain/main-entities/infra/dto.go | 3 +++ internal/domain/main-entities/room/base/entity.go | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index 34a0774d..938ac42a 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -3,6 +3,7 @@ package infra import ( ecore "simrs-vx/internal/domain/base-entities/core" ei "simrs-vx/internal/domain/main-entities/item" + erb "simrs-vx/internal/domain/main-entities/room/base" ero "simrs-vx/internal/domain/references/organization" ) @@ -67,6 +68,7 @@ type ResponseDto struct { Childrens []Infra `json:"childrens,omitempty"` Item_Id *uint `json:"item_id"` Item *ei.Item `json:"item,omitempty"` + Rooms []erb.Basic `json:"rooms,omitempty"` } func (d Infra) ToResponse() ResponseDto { @@ -79,6 +81,7 @@ func (d Infra) ToResponse() ResponseDto { Childrens: d.Childrens, Item_Id: d.Item_Id, Item: d.Item, + Rooms: d.Rooms, } resp.SmallMain = d.SmallMain return resp diff --git a/internal/domain/main-entities/room/base/entity.go b/internal/domain/main-entities/room/base/entity.go index bbf87db8..e45a441d 100644 --- a/internal/domain/main-entities/room/base/entity.go +++ b/internal/domain/main-entities/room/base/entity.go @@ -17,3 +17,7 @@ type Basic struct { Subspecialist_Id *uint16 `json:"subspecialist_id"` Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` } + +func (Basic) TableName() string { + return "Room" +} From 386ffb15cc0d7fbbcb858d8195d461ef753fcd5e Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 7 Oct 2025 16:31:47 +0700 Subject: [PATCH 110/190] adjust room entity --- .../domain/main-entities/room/base/entity.go | 16 +++++----------- internal/domain/main-entities/room/entity.go | 8 +++++++- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/internal/domain/main-entities/room/base/entity.go b/internal/domain/main-entities/room/base/entity.go index bbf87db8..614e611c 100644 --- a/internal/domain/main-entities/room/base/entity.go +++ b/internal/domain/main-entities/room/base/entity.go @@ -2,18 +2,12 @@ package base import ( ecore "simrs-vx/internal/domain/base-entities/core" - es "simrs-vx/internal/domain/main-entities/specialist" - ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" ) type Basic struct { - ecore.SmallMain // adjust this according to the needs - Infra_Id *uint16 `json:"infra_id"` - Unit_Id *uint16 `json:"unit_id"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id"` - Specialist_Id *uint16 `json:"specialist_id"` - Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` - Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` + ecore.SmallMain // adjust this according to the needs + Infra_Id *uint16 `json:"infra_id"` + Unit_Id *uint16 `json:"unit_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` } diff --git a/internal/domain/main-entities/room/entity.go b/internal/domain/main-entities/room/entity.go index 346c7741..cfa7ec05 100644 --- a/internal/domain/main-entities/room/entity.go +++ b/internal/domain/main-entities/room/entity.go @@ -3,9 +3,15 @@ package room import ( ei "simrs-vx/internal/domain/main-entities/infra" ebase "simrs-vx/internal/domain/main-entities/room/base" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" + eu "simrs-vx/internal/domain/main-entities/unit" ) type Room struct { ebase.Basic - Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id"` + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` } From e630e3ac38ce6bba5ad59c736b46520ad1574e7d Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Tue, 7 Oct 2025 16:33:48 +0700 Subject: [PATCH 111/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 60 ++++++++++++------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index a8dfe2ee..ec604c0f 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,30 +1,30 @@ -h1:4thtC22CJCQMIeVkYLmcFOT5w7S+bUUWy9wHZ21OHi8= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +h1:4sYu9Y6C4NdDbQlKG+HP42zgqIwnaR7K66JkL5b2gBg= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= From 88ae9d5f30b3d76cdb6430ac0ff7826734974dde Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 10:16:21 +0700 Subject: [PATCH 112/190] update personaddress + midwife --- .../migrations/20251008031337.sql | 2 + .../migrations/20251008031554.sql | 12 ++++ cmd/main-migration/migrations/atlas.sum | 62 +++++++++-------- internal/domain/main-entities/midwife/dto.go | 69 +++++++++++++++++++ .../domain/main-entities/midwife/entity.go | 13 ++++ .../main-entities/person-address/entity.go | 1 + .../references/organization/organization.go | 14 ++-- internal/interface/migration/main-entities.go | 2 + 8 files changed, 139 insertions(+), 36 deletions(-) create mode 100644 cmd/main-migration/migrations/20251008031337.sql create mode 100644 cmd/main-migration/migrations/20251008031554.sql create mode 100644 internal/domain/main-entities/midwife/dto.go create mode 100644 internal/domain/main-entities/midwife/entity.go diff --git a/cmd/main-migration/migrations/20251008031337.sql b/cmd/main-migration/migrations/20251008031337.sql new file mode 100644 index 00000000..fd2aff8a --- /dev/null +++ b/cmd/main-migration/migrations/20251008031337.sql @@ -0,0 +1,2 @@ +-- Modify "PersonAddress" table +ALTER TABLE "public"."PersonAddress" ADD COLUMN "PostalCode" character varying(6) NULL; diff --git a/cmd/main-migration/migrations/20251008031554.sql b/cmd/main-migration/migrations/20251008031554.sql new file mode 100644 index 00000000..58cee318 --- /dev/null +++ b/cmd/main-migration/migrations/20251008031554.sql @@ -0,0 +1,12 @@ +-- Create "Midwife" table +CREATE TABLE "public"."Midwife" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Employee_Id" bigint NULL, + "IHS_Number" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_Midwife_IHS_Number" UNIQUE ("IHS_Number"), + CONSTRAINT "fk_Midwife_Employee" FOREIGN KEY ("Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index ec604c0f..34db99e7 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,30 +1,32 @@ -h1:4sYu9Y6C4NdDbQlKG+HP42zgqIwnaR7K66JkL5b2gBg= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +h1:ggc8pOi/e+U1WtE8F5K1QjGB3iuTm2Xr71jLLMn7LJc= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:IYmKye5jNMkepsnEcUzaB0lLWDGzn7dO9zT3dZxIhgY= +20251008031554.sql h1:zqUmpXDFfFgDi7I8I/izxPG6D4SPeF8B3WfpnT6mo4Y= diff --git a/internal/domain/main-entities/midwife/dto.go b/internal/domain/main-entities/midwife/dto.go new file mode 100644 index 00000000..308f0559 --- /dev/null +++ b/internal/domain/main-entities/midwife/dto.go @@ -0,0 +1,69 @@ +package midwife + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/employee" +) + +type CreateDto struct { + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty"` + IHS_Number *string `json:"ihs_number"` +} + +func (d Midwife) ToResponse() ResponseDto { + resp := ResponseDto{ + Employee_Id: d.Employee_Id, + Employee: d.Employee, + IHS_Number: d.IHS_Number, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Midwife) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/midwife/entity.go b/internal/domain/main-entities/midwife/entity.go new file mode 100644 index 00000000..f98ba553 --- /dev/null +++ b/internal/domain/main-entities/midwife/entity.go @@ -0,0 +1,13 @@ +package midwife + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/employee" +) + +type Midwife struct { + ecore.Main // adjust this according to the needs + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` + IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` +} diff --git a/internal/domain/main-entities/person-address/entity.go b/internal/domain/main-entities/person-address/entity.go index 960b32a9..eacfd9f0 100644 --- a/internal/domain/main-entities/person-address/entity.go +++ b/internal/domain/main-entities/person-address/entity.go @@ -10,5 +10,6 @@ type PersonAddress struct { Address string `json:"address" gorm:"size:150"` Rt string `json:"rt" gorm:"size:2"` Rw string `json:"rw" gorm:"size:2"` + PostalCode string `json:"postalCode" gorm:"size:6"` Village_Code string `json:"village_code" gorm:"size:10"` } diff --git a/internal/domain/references/organization/organization.go b/internal/domain/references/organization/organization.go index 68edc332..bf11fbd6 100644 --- a/internal/domain/references/organization/organization.go +++ b/internal/domain/references/organization/organization.go @@ -31,12 +31,14 @@ const ( ITGCEmpFee ItemGroupCode = "employee-fee" ITGCDocFee ItemGroupCode = "doctor-fee" - IFGCBuilding InfraGroupCode = "building" // Bangunan - IFGCFloor InfraGroupCode = "floor" // Lantai - IFGCRoom InfraGroupCode = "room" // Ruang - IFGCChamber InfraGroupCode = "chamber" // Kamar - IFGCBed InfraGroupCode = "bed" // Ranjang - IFGCWarehouse InfraGroupCode = "warehouse" // Gudang/Depo + IFGCBuilding InfraGroupCode = "building" // Bangunan + IFGCFloor InfraGroupCode = "floor" // Lantai + IFGCRoom InfraGroupCode = "room" // Ruang + IFGCChamber InfraGroupCode = "chamber" // Kamar + IFGCBed InfraGroupCode = "bed" // Ranjang + IFGCWarehouse InfraGroupCode = "warehouse" // Gudang/Depo + IFGCCounter InfraGroupCode = "counter" // Counter + IFGCPubScreen InfraGroupCode = "public-screen" // Public Screen UTCReg UnitTypeCode = "reg" // Registrasi UTCExa UnitTypeCode = "exa" // Pemeriksaan diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 4d0f79c1..9711c6bd 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -47,6 +47,7 @@ import ( medicinemethod "simrs-vx/internal/domain/main-entities/medicine-method" medicinemix "simrs-vx/internal/domain/main-entities/medicine-mix" medicinemixitem "simrs-vx/internal/domain/main-entities/medicine-mix-item" + midwife "simrs-vx/internal/domain/main-entities/midwife" nurse "simrs-vx/internal/domain/main-entities/nurse" nutritionist "simrs-vx/internal/domain/main-entities/nutritionist" patient "simrs-vx/internal/domain/main-entities/patient" @@ -147,5 +148,6 @@ func getMainEntities() []any { &mcuordersubitem.McuOrderSubItem{}, &consultation.Consultation{}, &chemo.Chemo{}, + &midwife.Midwife{}, } } From 6c47a8e1761af41963f20b200d9ce8546724dbc7 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 10:25:58 +0700 Subject: [PATCH 113/190] feat (person-address): add postalCode --- internal/domain/main-entities/person-address/dto.go | 3 +++ internal/use-case/main-use-case/person-address/helper.go | 1 + 2 files changed, 4 insertions(+) diff --git a/internal/domain/main-entities/person-address/dto.go b/internal/domain/main-entities/person-address/dto.go index 0fcd52df..821cf788 100644 --- a/internal/domain/main-entities/person-address/dto.go +++ b/internal/domain/main-entities/person-address/dto.go @@ -10,6 +10,7 @@ type CreateDto struct { Rt string `json:"rt" validate:"maxLength=2"` Rw string `json:"rw" validate:"maxLength=2"` Village_Code string `json:"village_code" validate:"maxLength=10"` + PostalCode string `json:"postalCode" validate:"maxLength=6"` } type ReadListDto struct { @@ -43,6 +44,7 @@ type ResponseDto struct { Rt string `json:"rt"` Rw string `json:"rw"` Village_Code string `json:"village_code"` + PostalCode string `json:"postalCode"` } func (d PersonAddress) ToResponse() ResponseDto { @@ -52,6 +54,7 @@ func (d PersonAddress) ToResponse() ResponseDto { Rt: d.Rt, Rw: d.Rw, Village_Code: d.Village_Code, + PostalCode: d.PostalCode, } resp.Main = d.Main return resp diff --git a/internal/use-case/main-use-case/person-address/helper.go b/internal/use-case/main-use-case/person-address/helper.go index a09c7b57..f3197d76 100644 --- a/internal/use-case/main-use-case/person-address/helper.go +++ b/internal/use-case/main-use-case/person-address/helper.go @@ -22,4 +22,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PersonAddress) { data.Rt = inputSrc.Rt data.Rw = inputSrc.Rw data.Village_Code = inputSrc.Village_Code + data.PostalCode = inputSrc.PostalCode } From 2b0c5ac577dff5c190626d2ec1a32b5e6de69e77 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 10:26:19 +0700 Subject: [PATCH 114/190] feat (midwife): add crud, user + midwife --- .../use-case/main-use-case/midwife/case.go | 279 ++++++++++++++++++ .../use-case/main-use-case/midwife/helper.go | 22 ++ .../use-case/main-use-case/midwife/lib.go | 157 ++++++++++ .../midwife/middleware-runner.go | 103 +++++++ .../main-use-case/midwife/middleware.go | 9 + .../use-case/main-use-case/midwife/tycovar.go | 44 +++ internal/use-case/main-use-case/user/case.go | 30 ++ 7 files changed, 644 insertions(+) create mode 100644 internal/use-case/main-use-case/midwife/case.go create mode 100644 internal/use-case/main-use-case/midwife/helper.go create mode 100644 internal/use-case/main-use-case/midwife/lib.go create mode 100644 internal/use-case/main-use-case/midwife/middleware-runner.go create mode 100644 internal/use-case/main-use-case/midwife/middleware.go create mode 100644 internal/use-case/main-use-case/midwife/tycovar.go diff --git a/internal/use-case/main-use-case/midwife/case.go b/internal/use-case/main-use-case/midwife/case.go new file mode 100644 index 00000000..908c0363 --- /dev/null +++ b/internal/use-case/main-use-case/midwife/case.go @@ -0,0 +1,279 @@ +package midwife + +import ( + e "simrs-vx/internal/domain/main-entities/midwife" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "midwife" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.Midwife{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.Midwife + var dataList []e.Midwife + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.Midwife + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Midwife + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.Midwife + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/midwife/helper.go b/internal/use-case/main-use-case/midwife/helper.go new file mode 100644 index 00000000..5be74b86 --- /dev/null +++ b/internal/use-case/main-use-case/midwife/helper.go @@ -0,0 +1,22 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package midwife + +import ( + e "simrs-vx/internal/domain/main-entities/midwife" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Midwife) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Employee_Id = inputSrc.Employee_Id + data.IHS_Number = inputSrc.IHS_Number +} diff --git a/internal/use-case/main-use-case/midwife/lib.go b/internal/use-case/main-use-case/midwife/lib.go new file mode 100644 index 00000000..b7b366d7 --- /dev/null +++ b/internal/use-case/main-use-case/midwife/lib.go @@ -0,0 +1,157 @@ +package midwife + +import ( + e "simrs-vx/internal/domain/main-entities/midwife" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Midwife, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.Midwife{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Midwife, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.Midwife{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.Midwife{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Midwife, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.Midwife{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if input.Employee_Id != nil { + tx = tx.Where("\"Employee_Id\" = ?", *input.Employee_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 + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.Midwife, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.Midwife, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/midwife/middleware-runner.go b/internal/use-case/main-use-case/midwife/middleware-runner.go new file mode 100644 index 00000000..dae4e27b --- /dev/null +++ b/internal/use-case/main-use-case/midwife/middleware-runner.go @@ -0,0 +1,103 @@ +package midwife + +import ( + e "simrs-vx/internal/domain/main-entities/midwife" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Midwife) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Midwife) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Midwife) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Midwife) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Midwife) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/midwife/middleware.go b/internal/use-case/main-use-case/midwife/middleware.go new file mode 100644 index 00000000..c7afa001 --- /dev/null +++ b/internal/use-case/main-use-case/midwife/middleware.go @@ -0,0 +1,9 @@ +package midwife + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/midwife/tycovar.go b/internal/use-case/main-use-case/midwife/tycovar.go new file mode 100644 index 00000000..953d8e20 --- /dev/null +++ b/internal/use-case/main-use-case/midwife/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package midwife + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/midwife" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.Midwife, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Midwife, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.Midwife, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index f33286bb..24f9c6da 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -9,6 +9,7 @@ import ( ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/employee" el "simrs-vx/internal/domain/main-entities/laborant" + em "simrs-vx/internal/domain/main-entities/midwife" en "simrs-vx/internal/domain/main-entities/nurse" et "simrs-vx/internal/domain/main-entities/nutritionist" ep "simrs-vx/internal/domain/main-entities/pharmacist" @@ -18,6 +19,7 @@ import ( ud "simrs-vx/internal/use-case/main-use-case/doctor" ue "simrs-vx/internal/use-case/main-use-case/employee" ul "simrs-vx/internal/use-case/main-use-case/laborant" + um "simrs-vx/internal/use-case/main-use-case/midwife" un "simrs-vx/internal/use-case/main-use-case/nurse" ut "simrs-vx/internal/use-case/main-use-case/nutritionist" upe "simrs-vx/internal/use-case/main-use-case/person" @@ -150,6 +152,14 @@ func Create(input e.CreateDto) (*d.Data, error) { if _, err := ul.CreateData(createLaborant, &event, tx); err != nil { return err } + case ero.UPCMwi: + createMidwife := em.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if _, err := um.CreateData(em.CreateDto(createMidwife), &event, tx); err != nil { + return err + } default: return errors.New("invalid employee position") } @@ -475,6 +485,26 @@ func Update(input e.UpdateDto) (*d.Data, error) { if _, err := ul.CreateData(createLab, &event, tx); err != nil { return err } + case ero.UPCMwi: + readMidwife := em.ReadDetailDto{Employee_Id: &employeeData.Id} + readMidwifeData, err := um.ReadDetailData(readMidwife, &event, tx) + if err != nil { + return err + } + createMidwife := em.CreateDto{ + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + } + if readMidwifeData != nil { + if err := um.UpdateData(em.UpdateDto{CreateDto: createMidwife}, readMidwifeData, &event, tx); err != nil { + return err + } + return nil + } + + if _, err := um.CreateData(createMidwife, &event, tx); err != nil { + return err + } default: return errors.New("invalid employee position") } From e9b262175d22d0c2ba2da1055471f6cd675496d4 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 11:41:53 +0700 Subject: [PATCH 115/190] fix (area): fix pagination area data source --- internal/domain/main-entities/district/dto.go | 9 ++++++- internal/domain/main-entities/province/dto.go | 25 +++++++++++-------- internal/domain/main-entities/regency/dto.go | 9 ++++++- internal/domain/main-entities/uom/dto.go | 12 ++++++--- internal/domain/main-entities/village/dto.go | 9 ++++++- .../use-case/main-use-case/district/case.go | 3 +++ .../use-case/main-use-case/district/lib.go | 10 +++++++- .../use-case/main-use-case/province/case.go | 3 +++ .../use-case/main-use-case/province/lib.go | 10 +++++++- .../use-case/main-use-case/regency/case.go | 3 +++ .../use-case/main-use-case/regency/lib.go | 10 +++++++- internal/use-case/main-use-case/uom/case.go | 3 +++ internal/use-case/main-use-case/uom/lib.go | 8 +++++- .../use-case/main-use-case/village/case.go | 3 +++ .../use-case/main-use-case/village/lib.go | 10 +++++++- 15 files changed, 106 insertions(+), 21 deletions(-) diff --git a/internal/domain/main-entities/district/dto.go b/internal/domain/main-entities/district/dto.go index be0f6c01..ee81aeec 100644 --- a/internal/domain/main-entities/district/dto.go +++ b/internal/domain/main-entities/district/dto.go @@ -12,10 +12,17 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination +} + +type FilterDto struct { Regency_Code string `json:"regency-code"` Code string `json:"code"` Name string `json:"name"` - Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/province/dto.go b/internal/domain/main-entities/province/dto.go index d2cfc1ca..595db5a4 100644 --- a/internal/domain/main-entities/province/dto.go +++ b/internal/domain/main-entities/province/dto.go @@ -2,6 +2,7 @@ package province import ( ecore "simrs-vx/internal/domain/base-entities/core" + er "simrs-vx/internal/domain/main-entities/regency" ) type CreateDto struct { @@ -10,11 +11,18 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + type ReadDetailDto struct { Id int16 `json:"id"` Code *string `json:"code"` @@ -36,17 +44,14 @@ type MetaDto struct { } type ResponseDto struct { - Id int16 `json:"id"` - Code string `json:"code"` - Name string `json:"name"` + Id int16 `json:"id"` + Code string `json:"code"` + Name string `json:"name"` + Regencies []*er.Regency `json:"regencies,omitempty"` } func (d Province) ToResponse() ResponseDto { - resp := ResponseDto{ - Id: d.Id, - Code: d.Code, - Name: d.Name, - } + resp := ResponseDto(d) return resp } diff --git a/internal/domain/main-entities/regency/dto.go b/internal/domain/main-entities/regency/dto.go index 61c131fe..9408096b 100644 --- a/internal/domain/main-entities/regency/dto.go +++ b/internal/domain/main-entities/regency/dto.go @@ -12,10 +12,17 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination +} + +type FilterDto struct { Province_Code string `json:"province-code"` Code string `json:"code"` Name string `json:"name"` - Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/uom/dto.go b/internal/domain/main-entities/uom/dto.go index ef50ea4b..30df9752 100644 --- a/internal/domain/main-entities/uom/dto.go +++ b/internal/domain/main-entities/uom/dto.go @@ -10,12 +10,18 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - Search string `json:"search"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + type ReadDetailDto struct { Id uint16 `json:"id"` Code *string `json:"code"` diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index 842a1cb6..85448959 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -11,10 +11,17 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination +} + +type FilterDto struct { District_Code string `json:"district-code"` Code string `json:"code"` Name string `json:"name"` - Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/use-case/main-use-case/district/case.go b/internal/use-case/main-use-case/district/case.go index b7a4b1a0..8ab41024 100644 --- a/internal/use-case/main-use-case/district/case.go +++ b/internal/use-case/main-use-case/district/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/district/lib.go b/internal/use-case/main-use-case/district/lib.go index 26f6cf07..b0454716 100644 --- a/internal/use-case/main-use-case/district/lib.go +++ b/internal/use-case/main-use-case/district/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.District{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)) diff --git a/internal/use-case/main-use-case/province/case.go b/internal/use-case/main-use-case/province/case.go index 50d5e7ab..8c29ab2c 100644 --- a/internal/use-case/main-use-case/province/case.go +++ b/internal/use-case/main-use-case/province/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index 9955b076..2314459d 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Province{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)) diff --git a/internal/use-case/main-use-case/regency/case.go b/internal/use-case/main-use-case/regency/case.go index c6ed4b4f..c0ca1475 100644 --- a/internal/use-case/main-use-case/regency/case.go +++ b/internal/use-case/main-use-case/regency/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/regency/lib.go b/internal/use-case/main-use-case/regency/lib.go index 4f66c9c0..fb049908 100644 --- a/internal/use-case/main-use-case/regency/lib.go +++ b/internal/use-case/main-use-case/regency/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Re tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Regency{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)) diff --git a/internal/use-case/main-use-case/uom/case.go b/internal/use-case/main-use-case/uom/case.go index 29c4516b..66b932c0 100644 --- a/internal/use-case/main-use-case/uom/case.go +++ b/internal/use-case/main-use-case/uom/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/uom/lib.go b/internal/use-case/main-use-case/uom/lib.go index 3658faf2..9c524c8d 100644 --- a/internal/use-case/main-use-case/uom/lib.go +++ b/internal/use-case/main-use-case/uom/lib.go @@ -47,11 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Uo tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Uom{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/village/case.go b/internal/use-case/main-use-case/village/case.go index 787fdb12..375cf605 100644 --- a/internal/use-case/main-use-case/village/case.go +++ b/internal/use-case/main-use-case/village/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/village/lib.go b/internal/use-case/main-use-case/village/lib.go index 1c6a48e3..de30dc9d 100644 --- a/internal/use-case/main-use-case/village/lib.go +++ b/internal/use-case/main-use-case/village/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Vi tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Village{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)) From 7940c895b1575c2ae529d55183d13181e99517c3 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 12:21:42 +0700 Subject: [PATCH 116/190] fix pagination and search --- internal/domain/main-entities/diagnose-src/dto.go | 13 ++++++++++--- .../domain/main-entities/division-position/dto.go | 1 + internal/domain/main-entities/ethnic/dto.go | 12 +++++++++--- .../domain/main-entities/insurance-company/dto.go | 1 + internal/domain/main-entities/item/dto.go | 1 + internal/domain/main-entities/language/dto.go | 10 ++++++++-- .../domain/main-entities/mcu-src-category/dto.go | 9 ++++++++- .../domain/main-entities/medicine-group/dto.go | 11 +++++++++-- .../domain/main-entities/medicine-method/dto.go | 11 +++++++++-- .../domain/main-entities/pharmacy-company/dto.go | 9 ++++++++- internal/domain/main-entities/procedure-src/dto.go | 14 ++++++++++---- internal/use-case/main-use-case/device/lib.go | 2 +- .../use-case/main-use-case/diagnose-src/case.go | 3 +++ .../use-case/main-use-case/diagnose-src/lib.go | 10 +++++++++- .../main-use-case/division-position/lib.go | 2 ++ internal/use-case/main-use-case/division/lib.go | 2 +- internal/use-case/main-use-case/ethnic/case.go | 3 +++ internal/use-case/main-use-case/ethnic/lib.go | 4 ++-- internal/use-case/main-use-case/infra/lib.go | 2 +- .../use-case/main-use-case/installation/lib.go | 2 +- .../main-use-case/insurance-company/lib.go | 2 ++ internal/use-case/main-use-case/item/lib.go | 2 ++ internal/use-case/main-use-case/language/case.go | 3 +++ internal/use-case/main-use-case/language/lib.go | 2 +- .../main-use-case/mcu-src-category/case.go | 3 +++ .../use-case/main-use-case/mcu-src-category/lib.go | 10 +++++++++- internal/use-case/main-use-case/mcu-src/lib.go | 2 +- internal/use-case/main-use-case/mcu-sub-src/lib.go | 2 +- .../main-use-case/medical-action-src/lib.go | 2 +- .../use-case/main-use-case/medicine-group/case.go | 3 +++ .../use-case/main-use-case/medicine-group/lib.go | 10 +++++++++- .../use-case/main-use-case/medicine-method/case.go | 3 +++ .../use-case/main-use-case/medicine-method/lib.go | 10 +++++++++- internal/use-case/main-use-case/medicine/lib.go | 4 ++-- .../main-use-case/pharmacy-company/case.go | 3 +++ .../use-case/main-use-case/pharmacy-company/lib.go | 10 +++++++++- .../use-case/main-use-case/procedure-src/case.go | 3 +++ .../use-case/main-use-case/procedure-src/lib.go | 4 ++-- internal/use-case/main-use-case/province/lib.go | 4 ++-- internal/use-case/main-use-case/regency/lib.go | 2 +- internal/use-case/main-use-case/specialist/lib.go | 2 +- .../use-case/main-use-case/subspecialist/lib.go | 2 +- internal/use-case/main-use-case/unit/lib.go | 2 +- internal/use-case/main-use-case/uom/lib.go | 2 +- internal/use-case/main-use-case/village/lib.go | 2 +- pkg/lib-helper/lib-helper.go | 6 ++++-- 46 files changed, 175 insertions(+), 47 deletions(-) diff --git a/internal/domain/main-entities/diagnose-src/dto.go b/internal/domain/main-entities/diagnose-src/dto.go index 2f135368..5182b522 100644 --- a/internal/domain/main-entities/diagnose-src/dto.go +++ b/internal/domain/main-entities/diagnose-src/dto.go @@ -11,12 +11,19 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - IndName string `json:"indName"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` + IndName string `json:"indName"` +} + type ReadDetailDto struct { Id uint16 `json:"id"` Code *string `json:"code"` diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index 5fefe554..d746d855 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -17,6 +17,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/ethnic/dto.go b/internal/domain/main-entities/ethnic/dto.go index a25ced65..2fac2e81 100644 --- a/internal/domain/main-entities/ethnic/dto.go +++ b/internal/domain/main-entities/ethnic/dto.go @@ -10,12 +10,18 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - Search string `json:"search"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + type ReadDetailDto struct { Id uint16 `json:"id"` Code *string `json:"code"` diff --git a/internal/domain/main-entities/insurance-company/dto.go b/internal/domain/main-entities/insurance-company/dto.go index 93966c71..b42137b5 100644 --- a/internal/domain/main-entities/insurance-company/dto.go +++ b/internal/domain/main-entities/insurance-company/dto.go @@ -17,6 +17,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/item/dto.go b/internal/domain/main-entities/item/dto.go index 3d48e2bb..7a7aba50 100644 --- a/internal/domain/main-entities/item/dto.go +++ b/internal/domain/main-entities/item/dto.go @@ -19,6 +19,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/language/dto.go b/internal/domain/main-entities/language/dto.go index 79ae648c..30bf9eaf 100644 --- a/internal/domain/main-entities/language/dto.go +++ b/internal/domain/main-entities/language/dto.go @@ -10,12 +10,18 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` + FilterDto + Includes string `json:"includes"` + Preloads []string Search string `json:"search"` Pagination ecore.Pagination } +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + type ReadDetailDto struct { Id uint16 `json:"id"` Code string `json:"code"` diff --git a/internal/domain/main-entities/mcu-src-category/dto.go b/internal/domain/main-entities/mcu-src-category/dto.go index bf2deb4a..34d6463c 100644 --- a/internal/domain/main-entities/mcu-src-category/dto.go +++ b/internal/domain/main-entities/mcu-src-category/dto.go @@ -13,10 +13,17 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination +} + +type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Scope_Code *ere.CheckupScopeCode `json:"scope-code"` - Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medicine-group/dto.go b/internal/domain/main-entities/medicine-group/dto.go index c392e46f..91b52eaa 100644 --- a/internal/domain/main-entities/medicine-group/dto.go +++ b/internal/domain/main-entities/medicine-group/dto.go @@ -10,11 +10,18 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + type ReadDetailDto struct { Id uint16 `json:"id"` Code *string `json:"code"` diff --git a/internal/domain/main-entities/medicine-method/dto.go b/internal/domain/main-entities/medicine-method/dto.go index 337eb6e6..2c1018ac 100644 --- a/internal/domain/main-entities/medicine-method/dto.go +++ b/internal/domain/main-entities/medicine-method/dto.go @@ -10,11 +10,18 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` +} + type ReadDetailDto struct { Id uint16 `json:"id"` Code *string `json:"code"` diff --git a/internal/domain/main-entities/pharmacy-company/dto.go b/internal/domain/main-entities/pharmacy-company/dto.go index ed61fd61..19c128fa 100644 --- a/internal/domain/main-entities/pharmacy-company/dto.go +++ b/internal/domain/main-entities/pharmacy-company/dto.go @@ -11,10 +11,17 @@ type CreateDto struct { } type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` + Pagination ecore.Pagination +} + +type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Regency_Code string `json:"regency-code"` - Pagination ecore.Pagination } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/procedure-src/dto.go b/internal/domain/main-entities/procedure-src/dto.go index f047fba1..e608e7c7 100644 --- a/internal/domain/main-entities/procedure-src/dto.go +++ b/internal/domain/main-entities/procedure-src/dto.go @@ -11,13 +11,19 @@ type CreateDto struct { } type ReadListDto struct { - Code string `json:"code"` - Name string `json:"name"` - IndName string `json:"indName"` - Search string `json:"search"` + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Search string `json:"search"` Pagination ecore.Pagination } +type FilterDto struct { + Code string `json:"code"` + Name string `json:"name"` + IndName string `json:"indName"` +} + type ReadDetailDto struct { Id uint16 `json:"id"` Code *string `json:"code"` diff --git a/internal/use-case/main-use-case/device/lib.go b/internal/use-case/main-use-case/device/lib.go index c606b645..a3455000 100644 --- a/internal/use-case/main-use-case/device/lib.go +++ b/internal/use-case/main-use-case/device/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Device{}). diff --git a/internal/use-case/main-use-case/diagnose-src/case.go b/internal/use-case/main-use-case/diagnose-src/case.go index 184e68a8..587305ba 100644 --- a/internal/use-case/main-use-case/diagnose-src/case.go +++ b/internal/use-case/main-use-case/diagnose-src/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/diagnose-src/lib.go b/internal/use-case/main-use-case/diagnose-src/lib.go index c572a35d..eedce90a 100644 --- a/internal/use-case/main-use-case/diagnose-src/lib.go +++ b/internal/use-case/main-use-case/diagnose-src/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.DiagnoseSrc{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/division-position/lib.go b/internal/use-case/main-use-case/division-position/lib.go index 322e5593..d7d191e9 100644 --- a/internal/use-case/main-use-case/division-position/lib.go +++ b/internal/use-case/main-use-case/division-position/lib.go @@ -53,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di } } + tx = plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.DivisionPosition{}). Preload("Division"). diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index e8713508..2d431013 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) if input.OnlyHaveChildren { tx = tx.Where(` diff --git a/internal/use-case/main-use-case/ethnic/case.go b/internal/use-case/main-use-case/ethnic/case.go index c8ca95a1..5885f742 100644 --- a/internal/use-case/main-use-case/ethnic/case.go +++ b/internal/use-case/main-use-case/ethnic/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/ethnic/lib.go b/internal/use-case/main-use-case/ethnic/lib.go index 716da183..294cf020 100644 --- a/internal/use-case/main-use-case/ethnic/lib.go +++ b/internal/use-case/main-use-case/ethnic/lib.go @@ -47,11 +47,11 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Et tx = dg.I } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Ethnic{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index 303fce88..2189ce89 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) if input.OnlyHaveChildren { tx = tx.Where(` diff --git a/internal/use-case/main-use-case/installation/lib.go b/internal/use-case/main-use-case/installation/lib.go index 7178cd18..b491bdb7 100644 --- a/internal/use-case/main-use-case/installation/lib.go +++ b/internal/use-case/main-use-case/installation/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Installation{}). diff --git a/internal/use-case/main-use-case/insurance-company/lib.go b/internal/use-case/main-use-case/insurance-company/lib.go index 4dc5bb6f..72d8185b 100644 --- a/internal/use-case/main-use-case/insurance-company/lib.go +++ b/internal/use-case/main-use-case/insurance-company/lib.go @@ -53,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In } } + tx = plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.InsuranceCompany{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/item/lib.go b/internal/use-case/main-use-case/item/lib.go index c5b937ce..c02dd4aa 100644 --- a/internal/use-case/main-use-case/item/lib.go +++ b/internal/use-case/main-use-case/item/lib.go @@ -53,6 +53,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.It } } + tx = plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.Item{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/language/case.go b/internal/use-case/main-use-case/language/case.go index 885bcfeb..24061c86 100644 --- a/internal/use-case/main-use-case/language/case.go +++ b/internal/use-case/main-use-case/language/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/language/lib.go b/internal/use-case/main-use-case/language/lib.go index 24544b3f..d6bfd489 100644 --- a/internal/use-case/main-use-case/language/lib.go +++ b/internal/use-case/main-use-case/language/lib.go @@ -51,7 +51,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La tx = tx. Model(&e.Language{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/mcu-src-category/case.go b/internal/use-case/main-use-case/mcu-src-category/case.go index c105603c..c8e53edc 100644 --- a/internal/use-case/main-use-case/mcu-src-category/case.go +++ b/internal/use-case/main-use-case/mcu-src-category/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/mcu-src-category/lib.go b/internal/use-case/main-use-case/mcu-src-category/lib.go index aef1fcf5..86be685a 100644 --- a/internal/use-case/main-use-case/mcu-src-category/lib.go +++ b/internal/use-case/main-use-case/mcu-src-category/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.McuSrcCategory{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/mcu-src/lib.go b/internal/use-case/main-use-case/mcu-src/lib.go index 246c4ccf..1d8016cb 100644 --- a/internal/use-case/main-use-case/mcu-src/lib.go +++ b/internal/use-case/main-use-case/mcu-src/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.McuSrc{}). diff --git a/internal/use-case/main-use-case/mcu-sub-src/lib.go b/internal/use-case/main-use-case/mcu-sub-src/lib.go index 43433380..5c1f8057 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/lib.go +++ b/internal/use-case/main-use-case/mcu-sub-src/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.McuSubSrc{}). diff --git a/internal/use-case/main-use-case/medical-action-src/lib.go b/internal/use-case/main-use-case/medical-action-src/lib.go index 9bb9d762..2551cc16 100644 --- a/internal/use-case/main-use-case/medical-action-src/lib.go +++ b/internal/use-case/main-use-case/medical-action-src/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.MedicalActionSrc{}). diff --git a/internal/use-case/main-use-case/medicine-group/case.go b/internal/use-case/main-use-case/medicine-group/case.go index 180c6e00..f7d17e01 100644 --- a/internal/use-case/main-use-case/medicine-group/case.go +++ b/internal/use-case/main-use-case/medicine-group/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medicine-group/lib.go b/internal/use-case/main-use-case/medicine-group/lib.go index ac269a85..0de470fb 100644 --- a/internal/use-case/main-use-case/medicine-group/lib.go +++ b/internal/use-case/main-use-case/medicine-group/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.MedicineGroup{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/medicine-method/case.go b/internal/use-case/main-use-case/medicine-method/case.go index 012b77b0..a6ed76c7 100644 --- a/internal/use-case/main-use-case/medicine-method/case.go +++ b/internal/use-case/main-use-case/medicine-method/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medicine-method/lib.go b/internal/use-case/main-use-case/medicine-method/lib.go index 56907327..4e708a5b 100644 --- a/internal/use-case/main-use-case/medicine-method/lib.go +++ b/internal/use-case/main-use-case/medicine-method/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.MedicineMethod{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/medicine/lib.go b/internal/use-case/main-use-case/medicine/lib.go index b4ea21f6..f6b48196 100644 --- a/internal/use-case/main-use-case/medicine/lib.go +++ b/internal/use-case/main-use-case/medicine/lib.go @@ -53,9 +53,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. + tx = tx.Debug(). Model(&e.Medicine{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). diff --git a/internal/use-case/main-use-case/pharmacy-company/case.go b/internal/use-case/main-use-case/pharmacy-company/case.go index cce54750..1ef9a7bf 100644 --- a/internal/use-case/main-use-case/pharmacy-company/case.go +++ b/internal/use-case/main-use-case/pharmacy-company/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/pharmacy-company/lib.go b/internal/use-case/main-use-case/pharmacy-company/lib.go index b0e9c146..efc03283 100644 --- a/internal/use-case/main-use-case/pharmacy-company/lib.go +++ b/internal/use-case/main-use-case/pharmacy-company/lib.go @@ -47,9 +47,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ph tx = dg.I } + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = plh.SearchCodeOrName(input.Search, tx) + tx = tx. Model(&e.PharmacyCompany{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/procedure-src/case.go b/internal/use-case/main-use-case/procedure-src/case.go index 1b91f6bb..c41e47d6 100644 --- a/internal/use-case/main-use-case/procedure-src/case.go +++ b/internal/use-case/main-use-case/procedure-src/case.go @@ -87,6 +87,9 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/procedure-src/lib.go b/internal/use-case/main-use-case/procedure-src/lib.go index 6cd2b7dd..cbf2e086 100644 --- a/internal/use-case/main-use-case/procedure-src/lib.go +++ b/internal/use-case/main-use-case/procedure-src/lib.go @@ -47,11 +47,11 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.ProcedureSrc{}). - Scopes(gh.Filter(input)). + Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index 2314459d..c55dce15 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -53,9 +53,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. + tx = tx.Debug(). Model(&e.Province{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). diff --git a/internal/use-case/main-use-case/regency/lib.go b/internal/use-case/main-use-case/regency/lib.go index fb049908..91c8007a 100644 --- a/internal/use-case/main-use-case/regency/lib.go +++ b/internal/use-case/main-use-case/regency/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Re } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Regency{}). diff --git a/internal/use-case/main-use-case/specialist/lib.go b/internal/use-case/main-use-case/specialist/lib.go index 04b1b552..caf2a34d 100644 --- a/internal/use-case/main-use-case/specialist/lib.go +++ b/internal/use-case/main-use-case/specialist/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Specialist{}). diff --git a/internal/use-case/main-use-case/subspecialist/lib.go b/internal/use-case/main-use-case/subspecialist/lib.go index 428c0a5f..88849600 100644 --- a/internal/use-case/main-use-case/subspecialist/lib.go +++ b/internal/use-case/main-use-case/subspecialist/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Su } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Subspecialist{}). diff --git a/internal/use-case/main-use-case/unit/lib.go b/internal/use-case/main-use-case/unit/lib.go index 2924b7df..63cddccc 100644 --- a/internal/use-case/main-use-case/unit/lib.go +++ b/internal/use-case/main-use-case/unit/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Unit{}). diff --git a/internal/use-case/main-use-case/uom/lib.go b/internal/use-case/main-use-case/uom/lib.go index 9c524c8d..1cd00f62 100644 --- a/internal/use-case/main-use-case/uom/lib.go +++ b/internal/use-case/main-use-case/uom/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Uo } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Uom{}). diff --git a/internal/use-case/main-use-case/village/lib.go b/internal/use-case/main-use-case/village/lib.go index de30dc9d..0e29ff17 100644 --- a/internal/use-case/main-use-case/village/lib.go +++ b/internal/use-case/main-use-case/village/lib.go @@ -53,7 +53,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Vi } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) tx = tx. Model(&e.Village{}). diff --git a/pkg/lib-helper/lib-helper.go b/pkg/lib-helper/lib-helper.go index b24c1004..1131447a 100644 --- a/pkg/lib-helper/lib-helper.go +++ b/pkg/lib-helper/lib-helper.go @@ -8,10 +8,12 @@ import ( "gorm.io/gorm" ) -func SearchCodeOrName(search string, tx *gorm.DB) { +func SearchCodeOrName(search string, tx *gorm.DB) *gorm.DB { if search != "" { - tx.Where("\"Code\" ILIKE ? OR \"Name\" ILIKE ?", "%"+search+"%", "%"+search+"%") + tx = tx.Where("\"Code\" ILIKE ? OR \"Name\" ILIKE ?", "%"+search+"%", "%"+search+"%") } + + return tx } func HandleCreateError(input any, event *pl.Event, err error) error { From 7452acfa7d5c6f84ec45c5da1acae5856fa2d11f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 12:24:14 +0700 Subject: [PATCH 117/190] add headstatus into divisionPosition --- cmd/main-migration/migrations/20251008052346.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 7 ++++--- internal/domain/main-entities/division-position/entity.go | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 cmd/main-migration/migrations/20251008052346.sql diff --git a/cmd/main-migration/migrations/20251008052346.sql b/cmd/main-migration/migrations/20251008052346.sql new file mode 100644 index 00000000..d664f92d --- /dev/null +++ b/cmd/main-migration/migrations/20251008052346.sql @@ -0,0 +1,2 @@ +-- Modify "DivisionPosition" table +ALTER TABLE "public"."DivisionPosition" ADD COLUMN "HeadStatus" boolean NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 34db99e7..b9b32c7e 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:ggc8pOi/e+U1WtE8F5K1QjGB3iuTm2Xr71jLLMn7LJc= +h1:+Bnziu7HqAI3VE4WAD5kHgKMKpTnOOy/BEpKYk4D17I= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -28,5 +28,6 @@ h1:ggc8pOi/e+U1WtE8F5K1QjGB3iuTm2Xr71jLLMn7LJc= 20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= 20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= 20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:IYmKye5jNMkepsnEcUzaB0lLWDGzn7dO9zT3dZxIhgY= -20251008031554.sql h1:zqUmpXDFfFgDi7I8I/izxPG6D4SPeF8B3WfpnT6mo4Y= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:kkRzCo2vImbvmG/HMhYcvUQ22IaaYqVSCIaYXtglia8= diff --git a/internal/domain/main-entities/division-position/entity.go b/internal/domain/main-entities/division-position/entity.go index 27614764..3d1d2eca 100644 --- a/internal/domain/main-entities/division-position/entity.go +++ b/internal/domain/main-entities/division-position/entity.go @@ -12,6 +12,7 @@ type DivisionPosition struct { Division *ed.Division `json:"division" gorm:"foreignKey:Division_Id"` Code string `json:"code" gorm:"unique;size:10"` Name string `json:"name" gorm:"size:50"` + HeadStatus bool `json:"head_status"` Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` } From 37264756427ba79f92db9b53937e8ce6d6bbab64 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 12:25:39 +0700 Subject: [PATCH 118/190] feat (division-position): add head status --- internal/domain/main-entities/division-position/dto.go | 4 ++++ internal/use-case/main-use-case/division-position/helper.go | 1 + 2 files changed, 5 insertions(+) diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index d746d855..d5bfa15b 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -10,6 +10,7 @@ type CreateDto struct { Division_Id *uint16 `json:"division_id"` Code string `json:"code" validate:"maxLength=10"` Name string `json:"name" validate:"maxLength=50"` + HeadStatus bool `json:"head_status"` Employee_Id *uint `json:"employee_id"` } @@ -25,6 +26,7 @@ type FilterDto struct { Division_Id *uint16 `json:"division-id"` Code string `json:"code"` Name string `json:"name"` + HeadStatus *bool `json:"head-status"` Employee_Id *uint `json:"employee-id"` } @@ -54,6 +56,7 @@ type ResponseDto struct { Division *ed.Division `json:"division,omitempty"` Code string `json:"code"` Name string `json:"name"` + HeadStatus bool `json:"head_status"` Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty"` } @@ -63,6 +66,7 @@ func (d DivisionPosition) ToResponse() ResponseDto { Division_Id: d.Division_Id, Code: d.Code, Name: d.Name, + HeadStatus: d.HeadStatus, Employee_Id: d.Employee_Id, Employee: d.Employee, } diff --git a/internal/use-case/main-use-case/division-position/helper.go b/internal/use-case/main-use-case/division-position/helper.go index 97f2f26c..482dbc4e 100644 --- a/internal/use-case/main-use-case/division-position/helper.go +++ b/internal/use-case/main-use-case/division-position/helper.go @@ -20,5 +20,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.DivisionPosition) { data.Division_Id = inputSrc.Division_Id data.Code = inputSrc.Code data.Name = inputSrc.Name + data.HeadStatus = inputSrc.HeadStatus data.Employee_Id = inputSrc.Employee_Id } From 983a68d906b2f61fe9c0f27e23b4367f97988ef4 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 12:26:16 +0700 Subject: [PATCH 119/190] fix naming convention --- internal/domain/main-entities/division-position/dto.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index d5bfa15b..48287959 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -10,7 +10,7 @@ type CreateDto struct { Division_Id *uint16 `json:"division_id"` Code string `json:"code" validate:"maxLength=10"` Name string `json:"name" validate:"maxLength=50"` - HeadStatus bool `json:"head_status"` + HeadStatus bool `json:"headStatus"` Employee_Id *uint `json:"employee_id"` } @@ -56,7 +56,7 @@ type ResponseDto struct { Division *ed.Division `json:"division,omitempty"` Code string `json:"code"` Name string `json:"name"` - HeadStatus bool `json:"head_status"` + HeadStatus bool `json:"headStatus"` Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty"` } From 1c58708cd7f8e3eb2869ee465edc49409278242e Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Wed, 8 Oct 2025 12:28:33 +0700 Subject: [PATCH 120/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 66 ++++++++++++------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index b9b32c7e..e7e6145a 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,33 +1,33 @@ -h1:+Bnziu7HqAI3VE4WAD5kHgKMKpTnOOy/BEpKYk4D17I= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= -20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= -20251008052346.sql h1:kkRzCo2vImbvmG/HMhYcvUQ22IaaYqVSCIaYXtglia8= +h1:cox4tXoMZIz+NXoQ2UU2CTQIKyem43QOMR974GrcccY= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= +20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= +20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= From bd7ff974b127b0587d31f61f62d967d1e692ba6f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 12:57:51 +0700 Subject: [PATCH 121/190] change page-no-limit into bool and remove debug mode --- internal/domain/base-entities/core/dto.go | 6 +++--- internal/use-case/main-use-case/medicine/lib.go | 2 +- internal/use-case/main-use-case/province/lib.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/internal/domain/base-entities/core/dto.go b/internal/domain/base-entities/core/dto.go index f0bfc6b0..a325bd15 100644 --- a/internal/domain/base-entities/core/dto.go +++ b/internal/domain/base-entities/core/dto.go @@ -1,7 +1,7 @@ package core type Pagination struct { - PageNumber int `json:"page-number"` - PageSize int `json:"page-size"` - PageNoLimit int `json:"page-no-limit"` + PageNumber int `json:"page-number"` + PageSize int `json:"page-size"` + PageNoLimit bool `json:"page-no-limit"` } diff --git a/internal/use-case/main-use-case/medicine/lib.go b/internal/use-case/main-use-case/medicine/lib.go index f6b48196..357b188e 100644 --- a/internal/use-case/main-use-case/medicine/lib.go +++ b/internal/use-case/main-use-case/medicine/lib.go @@ -55,7 +55,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx.Debug(). + tx = tx. Model(&e.Medicine{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index c55dce15..e4ca32cd 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -55,7 +55,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx.Debug(). + tx = tx. Model(&e.Province{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). From a8c79238d52d2343218f579625085643e68c6301 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 13:25:04 +0700 Subject: [PATCH 122/190] add sort --- internal/domain/main-entities/district/dto.go | 1 + internal/domain/main-entities/province/dto.go | 1 + internal/domain/main-entities/regency/dto.go | 1 + internal/domain/main-entities/village/dto.go | 1 + .../use-case/main-use-case/district/lib.go | 4 +- .../use-case/main-use-case/province/lib.go | 2 + .../use-case/main-use-case/regency/lib.go | 2 + .../use-case/main-use-case/village/lib.go | 2 + pkg/lib-helper/lib-helper.go | 55 +++++++++++++++++++ 9 files changed, 68 insertions(+), 1 deletion(-) diff --git a/internal/domain/main-entities/district/dto.go b/internal/domain/main-entities/district/dto.go index ee81aeec..7205c2b0 100644 --- a/internal/domain/main-entities/district/dto.go +++ b/internal/domain/main-entities/district/dto.go @@ -16,6 +16,7 @@ type ReadListDto struct { Includes string `json:"includes"` Preloads []string `json:"-"` Search string `json:"search"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/province/dto.go b/internal/domain/main-entities/province/dto.go index 595db5a4..b4b13cfe 100644 --- a/internal/domain/main-entities/province/dto.go +++ b/internal/domain/main-entities/province/dto.go @@ -15,6 +15,7 @@ type ReadListDto struct { Includes string `json:"includes"` Preloads []string `json:"-"` Search string `json:"search"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/regency/dto.go b/internal/domain/main-entities/regency/dto.go index 9408096b..09e44e66 100644 --- a/internal/domain/main-entities/regency/dto.go +++ b/internal/domain/main-entities/regency/dto.go @@ -16,6 +16,7 @@ type ReadListDto struct { Includes string `json:"includes"` Preloads []string `json:"-"` Search string `json:"search"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index 85448959..f8bc7ab1 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -15,6 +15,7 @@ type ReadListDto struct { Includes string `json:"includes"` Preloads []string `json:"-"` Search string `json:"search"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/use-case/main-use-case/district/lib.go b/internal/use-case/main-use-case/district/lib.go index b0454716..18cadab7 100644 --- a/internal/use-case/main-use-case/district/lib.go +++ b/internal/use-case/main-use-case/district/lib.go @@ -53,7 +53,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di } } - plh.SearchCodeOrName(input.Search, tx) + tx = plh.SearchCodeOrName(input.Search, tx) + + tx = plh.Sort(input.Sort, tx) tx = tx. Model(&e.District{}). diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index e4ca32cd..311cdad7 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -55,6 +55,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = plh.SearchCodeOrName(input.Search, tx) + tx = plh.Sort(input.Sort, tx) + tx = tx. Model(&e.Province{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/regency/lib.go b/internal/use-case/main-use-case/regency/lib.go index 91c8007a..df2bb790 100644 --- a/internal/use-case/main-use-case/regency/lib.go +++ b/internal/use-case/main-use-case/regency/lib.go @@ -55,6 +55,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Re tx = plh.SearchCodeOrName(input.Search, tx) + tx = plh.Sort(input.Sort, tx) + tx = tx. Model(&e.Regency{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/main-use-case/village/lib.go b/internal/use-case/main-use-case/village/lib.go index 0e29ff17..059aa6d3 100644 --- a/internal/use-case/main-use-case/village/lib.go +++ b/internal/use-case/main-use-case/village/lib.go @@ -55,6 +55,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Vi tx = plh.SearchCodeOrName(input.Search, tx) + tx = plh.Sort(input.Sort, tx) + tx = tx. Model(&e.Village{}). Scopes(gh.Filter(input.FilterDto)). diff --git a/pkg/lib-helper/lib-helper.go b/pkg/lib-helper/lib-helper.go index 1131447a..1453e1b4 100644 --- a/pkg/lib-helper/lib-helper.go +++ b/pkg/lib-helper/lib-helper.go @@ -3,6 +3,8 @@ package libhelper import ( "fmt" pl "simrs-vx/pkg/logger" + "strings" + "unicode" "github.com/jackc/pgx/v5/pgconn" "gorm.io/gorm" @@ -16,6 +18,59 @@ func SearchCodeOrName(search string, tx *gorm.DB) *gorm.DB { return tx } +func Sort(sort string, tx *gorm.DB) *gorm.DB { + if sort == "" { + return tx + } + + pairs := strings.Split(sort, ",") + for _, pair := range pairs { + parts := strings.Split(strings.TrimSpace(pair), "=") + if len(parts) != 2 { + continue // skip invalid format + } + + field := strings.TrimSpace(parts[0]) + direction := strings.ToUpper(strings.TrimSpace(parts[1])) + + if direction != "ASC" && direction != "DESC" { + continue + } + + field = normalizeColumnName(field) + + tx = tx.Order(fmt.Sprintf("\"%s\" %s", field, direction)) + } + + return tx +} + +func normalizeColumnName(input string) string { + if input == "" { + return input + } + + input = strings.ReplaceAll(input, "-", "_") + + runes := []rune(input) + var out []rune + upperNext := true + for _, r := range runes { + if r == '_' { + out = append(out, r) + upperNext = true + continue + } + if upperNext { + out = append(out, unicode.ToUpper(r)) + upperNext = false + } else { + out = append(out, r) + } + } + return string(out) +} + func HandleCreateError(input any, event *pl.Event, err error) error { e, ok := err.(*pgconn.PgError) if !ok { From 53e805502d9c4699b6fc25c14645c9fd024cd3e0 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 13:47:26 +0700 Subject: [PATCH 123/190] change delimeter --- pkg/lib-helper/lib-helper.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/lib-helper/lib-helper.go b/pkg/lib-helper/lib-helper.go index 1453e1b4..f9f865a5 100644 --- a/pkg/lib-helper/lib-helper.go +++ b/pkg/lib-helper/lib-helper.go @@ -25,7 +25,7 @@ func Sort(sort string, tx *gorm.DB) *gorm.DB { pairs := strings.Split(sort, ",") for _, pair := range pairs { - parts := strings.Split(strings.TrimSpace(pair), "=") + parts := strings.Split(strings.TrimSpace(pair), ":") if len(parts) != 2 { continue // skip invalid format } From 1c57fac2bf3ae4dced6455332f29556a5ae911cd Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 14:36:58 +0700 Subject: [PATCH 124/190] expand infragroup_code size to 15 --- .../migrations/20251008073620.sql | 2 + cmd/main-migration/migrations/atlas.sum | 67 ++++++++++--------- internal/domain/main-entities/infra/entity.go | 2 +- 3 files changed, 37 insertions(+), 34 deletions(-) create mode 100644 cmd/main-migration/migrations/20251008073620.sql diff --git a/cmd/main-migration/migrations/20251008073620.sql b/cmd/main-migration/migrations/20251008073620.sql new file mode 100644 index 00000000..f3d9cf60 --- /dev/null +++ b/cmd/main-migration/migrations/20251008073620.sql @@ -0,0 +1,2 @@ +-- Modify "Infra" table +ALTER TABLE "public"."Infra" ALTER COLUMN "InfraGroup_Code" TYPE character varying(15); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index e7e6145a..8f761dda 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,33 +1,34 @@ -h1:cox4tXoMZIz+NXoQ2UU2CTQIKyem43QOMR974GrcccY= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= -20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= -20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= -20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= +h1:0qY4nZCVOPv845mNYtp5SB1QLfOqalYeVj9mR2hKkxk= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= +20251008073620.sql h1:sWMk2hpF2wagSjgYlsiou8XCzVMC2MOtfkfWJU2LcZg= diff --git a/internal/domain/main-entities/infra/entity.go b/internal/domain/main-entities/infra/entity.go index dcda82fb..3d8c6f99 100644 --- a/internal/domain/main-entities/infra/entity.go +++ b/internal/domain/main-entities/infra/entity.go @@ -12,7 +12,7 @@ type Infra struct { ecore.SmallMain // adjust this according to the needs Code string `json:"code" gorm:"unique;size:10"` Name string `json:"name" gorm:"size:50"` - InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" gorm:"size:10"` + InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" gorm:"size:15"` Parent_Id *uint16 `json:"parent_id"` Parent *Infra `json:"parent" gorm:"foreignKey:Parent_Id;references:Id"` Childrens []Infra `json:"childrens" gorm:"foreignKey:Parent_Id"` // may need references to self From 3dbd640aac447f1c90ac9aebe02319942b4908db Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 14:38:54 +0700 Subject: [PATCH 125/190] change maxlength infragrup_code dto --- internal/domain/main-entities/infra/dto.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index 938ac42a..f350bf43 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -11,7 +11,7 @@ import ( type CreateDto struct { Code string `json:"code" validate:"maxLength=10"` Name string `json:"name" validate:"maxLength=50"` - InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" validate:"maxLength=10"` + InfraGroup_Code ero.InfraGroupCode `json:"infraGroup_code" validate:"maxLength=15"` Parent_Id *uint16 `json:"parent_id"` Item_Id *uint `json:"item_id"` Unit_Id *uint16 `json:"unit_id"` From 6440680486187267187ff9261d8c8e9b0580ca6a Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Wed, 8 Oct 2025 14:40:50 +0700 Subject: [PATCH 126/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 68 ++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 8f761dda..2e277aab 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,34 +1,34 @@ -h1:0qY4nZCVOPv845mNYtp5SB1QLfOqalYeVj9mR2hKkxk= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= -20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= -20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= -20251008073620.sql h1:sWMk2hpF2wagSjgYlsiou8XCzVMC2MOtfkfWJU2LcZg= +h1:wdilGmaNGlpLWwpFErWUStZtsHTs6GEZAJewEjTYLlc= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= +20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= +20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= +20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= From d9a79efd8815b4ed0beb8c85a2e3dede9586244c Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Wed, 8 Oct 2025 13:38:12 +0700 Subject: [PATCH 127/190] dev: chore, added README --- README-APP.md | 39 +++++++++++++++++++++++++++++++++++- README.md | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/README-APP.md b/README-APP.md index a31fed54..4da56232 100644 --- a/README-APP.md +++ b/README-APP.md @@ -1 +1,38 @@ -# APP DESIGN CONVENTION \ No newline at end of file +# APP DESIGN CONVENTION + +## Implementing Clean Architecture (later called CA) in the layout +1. The CA can be implemented simply by using directory structures to represent the layers +2. The CA directories will be inside the "internal" directory due to its nature that the codes inside it is basically intended for the business model +3. The CA will have the following directories: + 1. `domain`, with sub-directories: + 1. `references`, for common type, const, variabel + 2. `main-entities`, for the main models + 3. `bpjs-entities`, for the bpjs models. Good to know that this was intitially added but later being stripped for its busines model. This still can be unstriped later. + 4. `satusehat-entities`, for the satusehat models + 5. ... + 2. `application`, with sub-directories: + 1. `helpers`, some general helper + 2. `main-cases`, for the main flows + 3. `bpjs-cases`, the expansion flows for the bpjs + 4. `satusehat-cases`, the expansion flows for the satusehat + 5. ... + 3. `interface`, with sub-directories: + 1. `main-handler` + 2. `jkn-handler` + 3. `main-migration` + 4. `satusehat-migration` + 5. .... + 4. `infra` has no specific-grouping directories, instead, it will have several directories related to each purpose directly like: + 1. `jkn`, to connect with jkn service + 2. `satusehat`, to connect with satusehat service and satusehat local db + 3. `minio`, to connect with minio service + 4. .... +4. Several used libraries might have their own infra-purposed feature which will be outside the infra directory. + +## ERD to Entity +All of the MainERD, SSERD, and ExtRefERD will be the entities in the implementation. There will be at least 2 databases: main and satusehat. bpjs is still in the consideration. + +## Middlewared Use-Case +1. To make the applcation have more dynamic flows, each use-case can implement the midlewared model +2. The idea is to make its basic process of use case clean, adding more flows can be done outside it +3. This method relatively makes the code easier to maintain in the future diff --git a/README.md b/README.md index a186c2f0..93fd84c7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,55 @@ -# SIMRS-VX +# RSSA SIMRS-VX BACKEND +Or in english Hospital Information Management System (HIMS), is a system that +manages the information of the hospitals and the patients. + +## Stacks +- Language : Golang
+ Link: https://go.dev +- Framework : No Framework
+ Why? Go (Golang) applications often do not require full-fledged frameworks + due to several key aspects of the language and its ecosystem: + - Comprehensive Standard Library: Go's standard library is exceptionally + robust and provides much of the functionality that would typically be found + in frameworks in other languages. + - Simplicity and Explicit Design: Go emphasizes simplicity and clarity. + Frameworks often introduce a degree of "magic" or hidden complexity + through inversion of control, where the framework dictates the + application's flow + - Modular Libraries: Instead of a single, all-encompassing framework, the Go + community favors small, modular libraries that perform specific tasks well. + - Performance and Efficiency: Go is designed for performance and efficiency. + Frameworks can sometimes introduce performance overhead due to their layers + of abstraction. + + So? No framewok is the best framework. +- Database : PostgreSQL
+ Link: https://www.postgresql.org +- Cache : Redis
+ Link: https://redis.io +- File Server : Minio
+ Link: https://www.min.io + +## Libraries +- Routing Helper: Apem
+ Link: https://github.com/karincake/apem +- ORM: GORM
+ Link: https://gorm.io +- Database Migration: Atlas
+ Link: https://atlasgo.io/guides/orms/gorm/program + +## Others +- Project Layout: Golang Standards Project Layout
+ Link: https://github.com/golang-standards/project-layout +- Architecture: Clean Architecture
+ Link: https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html + +## Commands +- Main api: + - go to the ./cmd/main-api + - run `go run .` to run in debug mode + - run `go build` to build the binary +- Main migration: + - go to the ./cmd/main-migration + - run `go run .` to run in debug mode + - run `go build` to build the binary From 1d4fc794f57745b1bc03770d4b5141c25a15c7d5 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 16:13:27 +0700 Subject: [PATCH 128/190] change structure room --- cmd/main-migration/migrations/atlas.sum | 68 +++++++++---------- .../domain/main-entities/room/base/entity.go | 16 +++-- internal/domain/main-entities/room/entity.go | 8 +-- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 2e277aab..5ef938c0 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,34 +1,34 @@ -h1:wdilGmaNGlpLWwpFErWUStZtsHTs6GEZAJewEjTYLlc= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= -20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= -20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= -20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= -20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= +h1:8cWwLjbT/RIIeLTxM5t9O3pCbmZZFVud4a6PrqIPqT8= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= +20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= diff --git a/internal/domain/main-entities/room/base/entity.go b/internal/domain/main-entities/room/base/entity.go index 614e611c..bbf87db8 100644 --- a/internal/domain/main-entities/room/base/entity.go +++ b/internal/domain/main-entities/room/base/entity.go @@ -2,12 +2,18 @@ package base import ( ecore "simrs-vx/internal/domain/base-entities/core" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" + eu "simrs-vx/internal/domain/main-entities/unit" ) type Basic struct { - ecore.SmallMain // adjust this according to the needs - Infra_Id *uint16 `json:"infra_id"` - Unit_Id *uint16 `json:"unit_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` + ecore.SmallMain // adjust this according to the needs + Infra_Id *uint16 `json:"infra_id"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` } diff --git a/internal/domain/main-entities/room/entity.go b/internal/domain/main-entities/room/entity.go index cfa7ec05..346c7741 100644 --- a/internal/domain/main-entities/room/entity.go +++ b/internal/domain/main-entities/room/entity.go @@ -3,15 +3,9 @@ package room import ( ei "simrs-vx/internal/domain/main-entities/infra" ebase "simrs-vx/internal/domain/main-entities/room/base" - es "simrs-vx/internal/domain/main-entities/specialist" - ess "simrs-vx/internal/domain/main-entities/subspecialist" - eu "simrs-vx/internal/domain/main-entities/unit" ) type Room struct { ebase.Basic - Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id"` - Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Id"` - Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id"` + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Id"` } From 16906b0899c3981e513ec51200c0074eccd39398 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 8 Oct 2025 16:17:02 +0700 Subject: [PATCH 129/190] feat (infra): add preload for get detail --- internal/use-case/main-use-case/infra/lib.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index 2189ce89..7757f83f 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -104,6 +104,14 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e tx = dg.I } + tx = tx.Preload("Parent"). + Preload("Childrens"). + Preload("Item"). + Preload("Rooms"). + Preload("Rooms.Specialist"). + Preload("Rooms.Subspecialist"). + Preload("Rooms.Unit") + if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr From 8b9fabd5e12e9d098f35835e0b035b4df061fd04 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Wed, 8 Oct 2025 16:18:59 +0700 Subject: [PATCH 130/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 68 ++++++++++++------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 5ef938c0..2e277aab 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,34 +1,34 @@ -h1:8cWwLjbT/RIIeLTxM5t9O3pCbmZZFVud4a6PrqIPqT8= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= -20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= -20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= -20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= +h1:wdilGmaNGlpLWwpFErWUStZtsHTs6GEZAJewEjTYLlc= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= +20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= +20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= +20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= From 76614abc326a3c5f2b760ec7297f3dc862aae32b Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 9 Oct 2025 06:32:09 +0700 Subject: [PATCH 131/190] adjust dto --- internal/domain/main-entities/device/dto.go | 2 +- internal/domain/main-entities/diagnose-src/dto.go | 2 +- internal/domain/main-entities/district/dto.go | 2 +- internal/domain/main-entities/division-position/dto.go | 2 +- internal/domain/main-entities/division/dto.go | 2 +- internal/domain/main-entities/ethnic/dto.go | 6 +++--- internal/domain/main-entities/infra/dto.go | 2 +- internal/domain/main-entities/installation/dto.go | 2 +- internal/domain/main-entities/insurance-company/dto.go | 2 +- internal/domain/main-entities/item/dto.go | 2 +- internal/domain/main-entities/language/dto.go | 6 +++--- internal/domain/main-entities/material/dto.go | 2 +- internal/domain/main-entities/mcu-src-category/dto.go | 2 +- internal/domain/main-entities/mcu-src/dto.go | 2 +- internal/domain/main-entities/mcu-sub-src/dto.go | 2 +- internal/domain/main-entities/medical-action-src/dto.go | 2 +- internal/domain/main-entities/medicine-group/dto.go | 6 +++--- internal/domain/main-entities/medicine-method/dto.go | 6 +++--- internal/domain/main-entities/medicine/dto.go | 2 +- internal/domain/main-entities/pharmacy-company/dto.go | 2 +- internal/domain/main-entities/procedure-src/dto.go | 2 +- internal/domain/main-entities/province/dto.go | 6 +++--- internal/domain/main-entities/regency/dto.go | 2 +- internal/domain/main-entities/specialist/dto.go | 2 +- internal/domain/main-entities/subspecialist/dto.go | 2 +- internal/domain/main-entities/unit/dto.go | 2 +- internal/domain/main-entities/uom/dto.go | 6 +++--- internal/domain/main-entities/village/dto.go | 2 +- internal/use-case/main-use-case/province/lib.go | 7 ++----- 29 files changed, 42 insertions(+), 45 deletions(-) diff --git a/internal/domain/main-entities/device/dto.go b/internal/domain/main-entities/device/dto.go index 5a00ca18..14da4c6c 100644 --- a/internal/domain/main-entities/device/dto.go +++ b/internal/domain/main-entities/device/dto.go @@ -19,7 +19,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -29,6 +28,7 @@ type FilterDto struct { Uom_Code string `json:"uom-code"` Infra_Id *uint16 `json:"infra-id"` Item_Id *uint `json:"item-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/diagnose-src/dto.go b/internal/domain/main-entities/diagnose-src/dto.go index 5182b522..5e98ce21 100644 --- a/internal/domain/main-entities/diagnose-src/dto.go +++ b/internal/domain/main-entities/diagnose-src/dto.go @@ -14,7 +14,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -22,6 +21,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` IndName string `json:"indName"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/district/dto.go b/internal/domain/main-entities/district/dto.go index 7205c2b0..f126867d 100644 --- a/internal/domain/main-entities/district/dto.go +++ b/internal/domain/main-entities/district/dto.go @@ -15,7 +15,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Sort string `json:"sort"` Pagination ecore.Pagination } @@ -24,6 +23,7 @@ type FilterDto struct { Regency_Code string `json:"regency-code"` Code string `json:"code"` Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index 48287959..923e0c06 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -18,7 +18,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -28,6 +27,7 @@ type FilterDto struct { Name string `json:"name"` HeadStatus *bool `json:"head-status"` Employee_Id *uint `json:"employee-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index 87f1a5f7..ef2f5306 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -14,7 +14,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination OnlyHaveChildren bool `json:"only-have-children"` } @@ -23,6 +22,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Parent_Id *uint16 `json:"parent-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/ethnic/dto.go b/internal/domain/main-entities/ethnic/dto.go index 2fac2e81..a1560d8b 100644 --- a/internal/domain/main-entities/ethnic/dto.go +++ b/internal/domain/main-entities/ethnic/dto.go @@ -13,13 +13,13 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index f350bf43..591cb32e 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -24,7 +24,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination OnlyHaveChildren bool `json:"only-have-children"` } @@ -35,6 +34,7 @@ type FilterDto struct { InfraGroup_Code ero.InfraGroupCode `json:"infraGroup-code"` Parent_Id *uint16 `json:"parent-id"` Item_Id *uint `json:"item-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index 591c7a6d..062b92a1 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -16,7 +16,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -24,6 +23,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` EncounterClass_Code ere.EncounterClassCode `json:"encounterClass-code"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/insurance-company/dto.go b/internal/domain/main-entities/insurance-company/dto.go index b42137b5..af2f5c63 100644 --- a/internal/domain/main-entities/insurance-company/dto.go +++ b/internal/domain/main-entities/insurance-company/dto.go @@ -17,7 +17,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -27,6 +26,7 @@ type FilterDto struct { Regency_Code *string `json:"regency-code"` Address string `json:"address"` PhoneNumber string `json:"phoneNumber"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/item/dto.go b/internal/domain/main-entities/item/dto.go index 7a7aba50..11d4c0e9 100644 --- a/internal/domain/main-entities/item/dto.go +++ b/internal/domain/main-entities/item/dto.go @@ -19,7 +19,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -30,6 +29,7 @@ type FilterDto struct { Uom_Code *string `json:"uom-code"` Infra_Id *uint16 `json:"infra-id"` Stock *int `json:"stock"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/language/dto.go b/internal/domain/main-entities/language/dto.go index 30bf9eaf..6857980c 100644 --- a/internal/domain/main-entities/language/dto.go +++ b/internal/domain/main-entities/language/dto.go @@ -13,13 +13,13 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string - Search string `json:"search"` Pagination ecore.Pagination } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/material/dto.go b/internal/domain/main-entities/material/dto.go index 695b3d11..d93309e0 100644 --- a/internal/domain/main-entities/material/dto.go +++ b/internal/domain/main-entities/material/dto.go @@ -20,7 +20,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -31,6 +30,7 @@ type FilterDto struct { Infra_Id *uint16 `json:"infra-id"` Stock *int `json:"stock"` Item_Id *uint `json:"item-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/mcu-src-category/dto.go b/internal/domain/main-entities/mcu-src-category/dto.go index 34d6463c..d8b76724 100644 --- a/internal/domain/main-entities/mcu-src-category/dto.go +++ b/internal/domain/main-entities/mcu-src-category/dto.go @@ -16,7 +16,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -24,6 +23,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Scope_Code *ere.CheckupScopeCode `json:"scope-code"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index be1c14bf..81622cd7 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -16,7 +16,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -24,6 +23,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` McuSrcCategory_Code *string `json:"mcuSrcCategory-code"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go index 0a3f52a9..499e59e5 100644 --- a/internal/domain/main-entities/mcu-sub-src/dto.go +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -17,7 +17,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -25,6 +24,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` CheckupCategory_Code *string `json:"checkupCategory-code"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index 509f5b49..e95d25df 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -15,7 +15,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -23,6 +22,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Item_Id *uint `json:"item-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medicine-group/dto.go b/internal/domain/main-entities/medicine-group/dto.go index 91b52eaa..6ccde818 100644 --- a/internal/domain/main-entities/medicine-group/dto.go +++ b/internal/domain/main-entities/medicine-group/dto.go @@ -13,13 +13,13 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medicine-method/dto.go b/internal/domain/main-entities/medicine-method/dto.go index 2c1018ac..485e43b0 100644 --- a/internal/domain/main-entities/medicine-method/dto.go +++ b/internal/domain/main-entities/medicine-method/dto.go @@ -13,13 +13,13 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/medicine/dto.go b/internal/domain/main-entities/medicine/dto.go index 6b6517f9..2e59d1f4 100644 --- a/internal/domain/main-entities/medicine/dto.go +++ b/internal/domain/main-entities/medicine/dto.go @@ -25,7 +25,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -39,6 +38,7 @@ type FilterDto struct { Infra_Id *uint16 `json:"infra-id"` Stock *int `json:"stock"` Item_Id *uint `json:"item-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/pharmacy-company/dto.go b/internal/domain/main-entities/pharmacy-company/dto.go index 19c128fa..8acab0ed 100644 --- a/internal/domain/main-entities/pharmacy-company/dto.go +++ b/internal/domain/main-entities/pharmacy-company/dto.go @@ -14,7 +14,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -22,6 +21,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Regency_Code string `json:"regency-code"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/procedure-src/dto.go b/internal/domain/main-entities/procedure-src/dto.go index e608e7c7..d6c6e6c9 100644 --- a/internal/domain/main-entities/procedure-src/dto.go +++ b/internal/domain/main-entities/procedure-src/dto.go @@ -14,7 +14,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -22,6 +21,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` IndName string `json:"indName"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/province/dto.go b/internal/domain/main-entities/province/dto.go index b4b13cfe..cf49cd43 100644 --- a/internal/domain/main-entities/province/dto.go +++ b/internal/domain/main-entities/province/dto.go @@ -14,14 +14,14 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Sort string `json:"sort"` Pagination ecore.Pagination } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/regency/dto.go b/internal/domain/main-entities/regency/dto.go index 09e44e66..0bc7ca51 100644 --- a/internal/domain/main-entities/regency/dto.go +++ b/internal/domain/main-entities/regency/dto.go @@ -15,7 +15,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Sort string `json:"sort"` Pagination ecore.Pagination } @@ -24,6 +23,7 @@ type FilterDto struct { Province_Code string `json:"province-code"` Code string `json:"code"` Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index a7dc48e9..e331871b 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -14,7 +14,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -22,6 +21,7 @@ type FilterDto struct { Code string `json:"code"` Name string `json:"name"` Unit_Id *uint16 `json:"unit-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go index 1a98906f..d0966011 100644 --- a/internal/domain/main-entities/subspecialist/dto.go +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -14,7 +14,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -22,6 +21,7 @@ type FilterDto struct { Code *string `json:"code"` Name *string `json:"name"` Specialist_Id *uint16 `json:"specialist-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go index 6f11f849..afe3a741 100644 --- a/internal/domain/main-entities/unit/dto.go +++ b/internal/domain/main-entities/unit/dto.go @@ -15,7 +15,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } @@ -23,6 +22,7 @@ type FilterDto struct { Installation_Id *uint16 `json:"installation-id"` Code string `json:"code"` Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/uom/dto.go b/internal/domain/main-entities/uom/dto.go index 30df9752..0cc3beef 100644 --- a/internal/domain/main-entities/uom/dto.go +++ b/internal/domain/main-entities/uom/dto.go @@ -13,13 +13,13 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Pagination ecore.Pagination } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index f8bc7ab1..70b738df 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -14,7 +14,6 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` - Search string `json:"search"` Sort string `json:"sort"` Pagination ecore.Pagination } @@ -23,6 +22,7 @@ type FilterDto struct { District_Code string `json:"district-code"` Code string `json:"code"` Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index 311cdad7..2662a1bd 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -53,15 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr } } - tx = plh.SearchCodeOrName(input.Search, tx) - - tx = plh.Sort(input.Sort, tx) - - tx = tx. + tx = tx.Debug(). Model(&e.Province{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)) + // Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { From 496fccd249f2278d960dfe24d478d19c935ce686 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 9 Oct 2025 10:25:40 +0700 Subject: [PATCH 132/190] adjust after getuk updated --- go.mod | 2 +- go.sum | 4 ++-- internal/domain/main-entities/device/dto.go | 1 + internal/domain/main-entities/diagnose-src/dto.go | 1 + internal/domain/main-entities/division-position/dto.go | 1 + internal/domain/main-entities/division/dto.go | 1 + internal/domain/main-entities/ethnic/dto.go | 1 + internal/domain/main-entities/infra/dto.go | 1 + internal/domain/main-entities/installation/dto.go | 1 + internal/domain/main-entities/insurance-company/dto.go | 1 + internal/domain/main-entities/item/dto.go | 1 + internal/domain/main-entities/language/dto.go | 1 + internal/domain/main-entities/material/dto.go | 1 + internal/domain/main-entities/mcu-src-category/dto.go | 1 + internal/domain/main-entities/mcu-src/dto.go | 1 + internal/domain/main-entities/mcu-sub-src/dto.go | 1 + internal/domain/main-entities/medical-action-src/dto.go | 1 + internal/domain/main-entities/medicine-group/dto.go | 1 + internal/domain/main-entities/medicine-method/dto.go | 1 + internal/domain/main-entities/medicine/dto.go | 1 + internal/domain/main-entities/pharmacy-company/dto.go | 1 + internal/domain/main-entities/procedure-src/dto.go | 1 + internal/domain/main-entities/specialist/dto.go | 1 + internal/domain/main-entities/subspecialist/dto.go | 1 + internal/domain/main-entities/unit/dto.go | 1 + internal/domain/main-entities/uom/dto.go | 1 + internal/use-case/main-use-case/device/lib.go | 4 +--- internal/use-case/main-use-case/diagnose-src/lib.go | 4 +--- internal/use-case/main-use-case/district/lib.go | 7 ++----- internal/use-case/main-use-case/division-position/lib.go | 4 +--- internal/use-case/main-use-case/division/lib.go | 4 +--- internal/use-case/main-use-case/ethnic/lib.go | 4 +--- internal/use-case/main-use-case/infra/lib.go | 4 +--- internal/use-case/main-use-case/installation/lib.go | 4 +--- internal/use-case/main-use-case/insurance-company/lib.go | 4 +--- internal/use-case/main-use-case/item/lib.go | 4 +--- internal/use-case/main-use-case/language/lib.go | 4 +--- internal/use-case/main-use-case/material/lib.go | 4 +--- internal/use-case/main-use-case/mcu-src-category/lib.go | 4 +--- internal/use-case/main-use-case/mcu-src/lib.go | 4 +--- internal/use-case/main-use-case/mcu-sub-src/lib.go | 4 +--- internal/use-case/main-use-case/medical-action-src/lib.go | 4 +--- internal/use-case/main-use-case/medicine-group/lib.go | 4 +--- internal/use-case/main-use-case/medicine-method/lib.go | 4 +--- internal/use-case/main-use-case/medicine/lib.go | 4 +--- internal/use-case/main-use-case/pharmacy-company/lib.go | 4 +--- internal/use-case/main-use-case/procedure-src/lib.go | 4 +--- internal/use-case/main-use-case/province/lib.go | 6 +++--- internal/use-case/main-use-case/regency/lib.go | 7 ++----- internal/use-case/main-use-case/specialist/lib.go | 4 +--- internal/use-case/main-use-case/subspecialist/lib.go | 4 +--- internal/use-case/main-use-case/unit/lib.go | 4 +--- internal/use-case/main-use-case/uom/lib.go | 4 +--- internal/use-case/main-use-case/village/lib.go | 7 ++----- 54 files changed, 60 insertions(+), 93 deletions(-) diff --git a/go.mod b/go.mod index 26a41b29..7fd2a149 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/jackc/pgx/v5 v5.5.5 github.com/karincake/apem v0.0.17 github.com/karincake/dodol v0.0.1 - github.com/karincake/getuk v0.1.1 + github.com/karincake/getuk v0.2.1 github.com/karincake/hongkue v0.0.4 github.com/karincake/lepet v0.0.1 github.com/karincake/risoles v0.0.3 diff --git a/go.sum b/go.sum index b0534e4d..f2176a71 100644 --- a/go.sum +++ b/go.sum @@ -79,8 +79,8 @@ github.com/karincake/apem v0.0.17 h1:y3WXCr9GWLFFFH4Qyq/VWlWWpijHh5zpTc3Lm96twa4 github.com/karincake/apem v0.0.17/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM= github.com/karincake/dodol v0.0.1 h1:jUXmJh1r0Ei4fmHPZ6IUkoplW/V9d27L63JEl6zudL0= github.com/karincake/dodol v0.0.1/go.mod h1:2f1NcvkvY0J3GMUkwILNDYVvRUpz0W3lpPp/Ha/Ld24= -github.com/karincake/getuk v0.1.1 h1:zygZ9N5tk+sWwiRSo1SmlNwcAdl+qQVxmOG6jbQ7X1g= -github.com/karincake/getuk v0.1.1/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c= +github.com/karincake/getuk v0.2.1 h1:l9qaoSE1ttwzNbGTRNGYn61EZ9/rb/V+TjdY8XPeswU= +github.com/karincake/getuk v0.2.1/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c= github.com/karincake/hongkue v0.0.4 h1:oWthq6cDg5DvDm1Z3e7mCLOATQf+oAdtHxN9OPnCfA8= github.com/karincake/hongkue v0.0.4/go.mod h1:YVi5Lyh3DE+GRHx2OSODOr7FwvLi8U4idvcPHO7yeag= github.com/karincake/lepet v0.0.1 h1:eq/cwn5BBg0jWZ1c/MmvhFIBma0zBpVs2LwkfDOncy4= diff --git a/internal/domain/main-entities/device/dto.go b/internal/domain/main-entities/device/dto.go index 14da4c6c..f10ccc86 100644 --- a/internal/domain/main-entities/device/dto.go +++ b/internal/domain/main-entities/device/dto.go @@ -19,6 +19,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/diagnose-src/dto.go b/internal/domain/main-entities/diagnose-src/dto.go index 5e98ce21..d8af8e24 100644 --- a/internal/domain/main-entities/diagnose-src/dto.go +++ b/internal/domain/main-entities/diagnose-src/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index 923e0c06..c316c196 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -18,6 +18,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index ef2f5306..bf0fd6c8 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination OnlyHaveChildren bool `json:"only-have-children"` } diff --git a/internal/domain/main-entities/ethnic/dto.go b/internal/domain/main-entities/ethnic/dto.go index a1560d8b..d21a1519 100644 --- a/internal/domain/main-entities/ethnic/dto.go +++ b/internal/domain/main-entities/ethnic/dto.go @@ -13,6 +13,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index 591cb32e..97675eaa 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -24,6 +24,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination OnlyHaveChildren bool `json:"only-have-children"` } diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index 062b92a1..df0469b2 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -16,6 +16,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/insurance-company/dto.go b/internal/domain/main-entities/insurance-company/dto.go index af2f5c63..6e51ca0c 100644 --- a/internal/domain/main-entities/insurance-company/dto.go +++ b/internal/domain/main-entities/insurance-company/dto.go @@ -17,6 +17,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/item/dto.go b/internal/domain/main-entities/item/dto.go index 11d4c0e9..c60d68f2 100644 --- a/internal/domain/main-entities/item/dto.go +++ b/internal/domain/main-entities/item/dto.go @@ -19,6 +19,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/language/dto.go b/internal/domain/main-entities/language/dto.go index 6857980c..744fefb4 100644 --- a/internal/domain/main-entities/language/dto.go +++ b/internal/domain/main-entities/language/dto.go @@ -13,6 +13,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/material/dto.go b/internal/domain/main-entities/material/dto.go index d93309e0..a9705cf8 100644 --- a/internal/domain/main-entities/material/dto.go +++ b/internal/domain/main-entities/material/dto.go @@ -20,6 +20,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-src-category/dto.go b/internal/domain/main-entities/mcu-src-category/dto.go index d8b76724..a7ea9763 100644 --- a/internal/domain/main-entities/mcu-src-category/dto.go +++ b/internal/domain/main-entities/mcu-src-category/dto.go @@ -16,6 +16,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index 81622cd7..f0d0b8a0 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -16,6 +16,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go index 499e59e5..ef68edd1 100644 --- a/internal/domain/main-entities/mcu-sub-src/dto.go +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -17,6 +17,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index e95d25df..4fa6d833 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -15,6 +15,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medicine-group/dto.go b/internal/domain/main-entities/medicine-group/dto.go index 6ccde818..5894558e 100644 --- a/internal/domain/main-entities/medicine-group/dto.go +++ b/internal/domain/main-entities/medicine-group/dto.go @@ -13,6 +13,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medicine-method/dto.go b/internal/domain/main-entities/medicine-method/dto.go index 485e43b0..48685259 100644 --- a/internal/domain/main-entities/medicine-method/dto.go +++ b/internal/domain/main-entities/medicine-method/dto.go @@ -13,6 +13,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medicine/dto.go b/internal/domain/main-entities/medicine/dto.go index 2e59d1f4..4c29fdb3 100644 --- a/internal/domain/main-entities/medicine/dto.go +++ b/internal/domain/main-entities/medicine/dto.go @@ -25,6 +25,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/pharmacy-company/dto.go b/internal/domain/main-entities/pharmacy-company/dto.go index 8acab0ed..42c512bf 100644 --- a/internal/domain/main-entities/pharmacy-company/dto.go +++ b/internal/domain/main-entities/pharmacy-company/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/procedure-src/dto.go b/internal/domain/main-entities/procedure-src/dto.go index d6c6e6c9..2e26164f 100644 --- a/internal/domain/main-entities/procedure-src/dto.go +++ b/internal/domain/main-entities/procedure-src/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index e331871b..e6d2dfa1 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go index d0966011..797b089c 100644 --- a/internal/domain/main-entities/subspecialist/dto.go +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -14,6 +14,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go index afe3a741..06724859 100644 --- a/internal/domain/main-entities/unit/dto.go +++ b/internal/domain/main-entities/unit/dto.go @@ -15,6 +15,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/uom/dto.go b/internal/domain/main-entities/uom/dto.go index 0cc3beef..4cfac41c 100644 --- a/internal/domain/main-entities/uom/dto.go +++ b/internal/domain/main-entities/uom/dto.go @@ -13,6 +13,7 @@ type ReadListDto struct { FilterDto Includes string `json:"includes"` Preloads []string `json:"-"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/use-case/main-use-case/device/lib.go b/internal/use-case/main-use-case/device/lib.go index a3455000..94410c61 100644 --- a/internal/use-case/main-use-case/device/lib.go +++ b/internal/use-case/main-use-case/device/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Device{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/diagnose-src/lib.go b/internal/use-case/main-use-case/diagnose-src/lib.go index eedce90a..66de0020 100644 --- a/internal/use-case/main-use-case/diagnose-src/lib.go +++ b/internal/use-case/main-use-case/diagnose-src/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.DiagnoseSrc{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/district/lib.go b/internal/use-case/main-use-case/district/lib.go index 18cadab7..ccc7b775 100644 --- a/internal/use-case/main-use-case/district/lib.go +++ b/internal/use-case/main-use-case/district/lib.go @@ -53,15 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di } } - tx = plh.SearchCodeOrName(input.Search, tx) - - tx = plh.Sort(input.Sort, tx) - tx = tx. Model(&e.District{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). - Scopes(gh.Paginate(input, &pagination)) + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/division-position/lib.go b/internal/use-case/main-use-case/division-position/lib.go index d7d191e9..3a9b8d78 100644 --- a/internal/use-case/main-use-case/division-position/lib.go +++ b/internal/use-case/main-use-case/division-position/lib.go @@ -53,15 +53,13 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.DivisionPosition{}). Preload("Division"). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index 2d431013..d098490d 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -53,8 +53,6 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di } } - tx = plh.SearchCodeOrName(input.Search, tx) - if input.OnlyHaveChildren { tx = tx.Where(` EXISTS ( @@ -70,7 +68,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/ethnic/lib.go b/internal/use-case/main-use-case/ethnic/lib.go index 294cf020..9b7a3cf4 100644 --- a/internal/use-case/main-use-case/ethnic/lib.go +++ b/internal/use-case/main-use-case/ethnic/lib.go @@ -47,14 +47,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Et tx = dg.I } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Ethnic{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index 7757f83f..73b3e977 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -53,8 +53,6 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In } } - tx = plh.SearchCodeOrName(input.Search, tx) - if input.OnlyHaveChildren { tx = tx.Where(` EXISTS ( @@ -70,7 +68,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/installation/lib.go b/internal/use-case/main-use-case/installation/lib.go index b491bdb7..6ef39b29 100644 --- a/internal/use-case/main-use-case/installation/lib.go +++ b/internal/use-case/main-use-case/installation/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Installation{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/insurance-company/lib.go b/internal/use-case/main-use-case/insurance-company/lib.go index 72d8185b..abcca36f 100644 --- a/internal/use-case/main-use-case/insurance-company/lib.go +++ b/internal/use-case/main-use-case/insurance-company/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.InsuranceCompany{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/item/lib.go b/internal/use-case/main-use-case/item/lib.go index c02dd4aa..0f01e82b 100644 --- a/internal/use-case/main-use-case/item/lib.go +++ b/internal/use-case/main-use-case/item/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.It } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Item{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/language/lib.go b/internal/use-case/main-use-case/language/lib.go index d6bfd489..f8277d06 100644 --- a/internal/use-case/main-use-case/language/lib.go +++ b/internal/use-case/main-use-case/language/lib.go @@ -47,14 +47,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La tx = dg.I } - plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Language{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/material/lib.go b/internal/use-case/main-use-case/material/lib.go index b4b32440..da43d109 100644 --- a/internal/use-case/main-use-case/material/lib.go +++ b/internal/use-case/main-use-case/material/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma } } - plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Material{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/mcu-src-category/lib.go b/internal/use-case/main-use-case/mcu-src-category/lib.go index 86be685a..70321ff4 100644 --- a/internal/use-case/main-use-case/mcu-src-category/lib.go +++ b/internal/use-case/main-use-case/mcu-src-category/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.McuSrcCategory{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/mcu-src/lib.go b/internal/use-case/main-use-case/mcu-src/lib.go index 1d8016cb..dd95f7d3 100644 --- a/internal/use-case/main-use-case/mcu-src/lib.go +++ b/internal/use-case/main-use-case/mcu-src/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.McuSrc{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/mcu-sub-src/lib.go b/internal/use-case/main-use-case/mcu-sub-src/lib.go index 5c1f8057..a39649ba 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/lib.go +++ b/internal/use-case/main-use-case/mcu-sub-src/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.McuSubSrc{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/medical-action-src/lib.go b/internal/use-case/main-use-case/medical-action-src/lib.go index 2551cc16..42637607 100644 --- a/internal/use-case/main-use-case/medical-action-src/lib.go +++ b/internal/use-case/main-use-case/medical-action-src/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.MedicalActionSrc{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/medicine-group/lib.go b/internal/use-case/main-use-case/medicine-group/lib.go index 0de470fb..56e9d58c 100644 --- a/internal/use-case/main-use-case/medicine-group/lib.go +++ b/internal/use-case/main-use-case/medicine-group/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.MedicineGroup{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/medicine-method/lib.go b/internal/use-case/main-use-case/medicine-method/lib.go index 4e708a5b..45d13da8 100644 --- a/internal/use-case/main-use-case/medicine-method/lib.go +++ b/internal/use-case/main-use-case/medicine-method/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.MedicineMethod{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/medicine/lib.go b/internal/use-case/main-use-case/medicine/lib.go index 357b188e..452bfbd8 100644 --- a/internal/use-case/main-use-case/medicine/lib.go +++ b/internal/use-case/main-use-case/medicine/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Medicine{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/pharmacy-company/lib.go b/internal/use-case/main-use-case/pharmacy-company/lib.go index efc03283..1b3bfcc3 100644 --- a/internal/use-case/main-use-case/pharmacy-company/lib.go +++ b/internal/use-case/main-use-case/pharmacy-company/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ph } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.PharmacyCompany{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/procedure-src/lib.go b/internal/use-case/main-use-case/procedure-src/lib.go index cbf2e086..dd71e652 100644 --- a/internal/use-case/main-use-case/procedure-src/lib.go +++ b/internal/use-case/main-use-case/procedure-src/lib.go @@ -47,14 +47,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.ProcedureSrc{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index 2662a1bd..7fd22953 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -53,12 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr } } - tx = tx.Debug(). + tx = tx. Model(&e.Province{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). - Scopes(gh.Paginate(input, &pagination)) - // Scopes(gh.Sort(input.Sort)) + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/regency/lib.go b/internal/use-case/main-use-case/regency/lib.go index df2bb790..979ac109 100644 --- a/internal/use-case/main-use-case/regency/lib.go +++ b/internal/use-case/main-use-case/regency/lib.go @@ -53,15 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Re } } - tx = plh.SearchCodeOrName(input.Search, tx) - - tx = plh.Sort(input.Sort, tx) - tx = tx. Model(&e.Regency{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). - Scopes(gh.Paginate(input, &pagination)) + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/specialist/lib.go b/internal/use-case/main-use-case/specialist/lib.go index caf2a34d..31829946 100644 --- a/internal/use-case/main-use-case/specialist/lib.go +++ b/internal/use-case/main-use-case/specialist/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Specialist{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/subspecialist/lib.go b/internal/use-case/main-use-case/subspecialist/lib.go index 88849600..071c23c5 100644 --- a/internal/use-case/main-use-case/subspecialist/lib.go +++ b/internal/use-case/main-use-case/subspecialist/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Su } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Subspecialist{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/unit/lib.go b/internal/use-case/main-use-case/unit/lib.go index 63cddccc..76511a35 100644 --- a/internal/use-case/main-use-case/unit/lib.go +++ b/internal/use-case/main-use-case/unit/lib.go @@ -53,15 +53,13 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Unit{}). Preload("Installation"). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/uom/lib.go b/internal/use-case/main-use-case/uom/lib.go index 1cd00f62..6e8d0f1b 100644 --- a/internal/use-case/main-use-case/uom/lib.go +++ b/internal/use-case/main-use-case/uom/lib.go @@ -53,14 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Uo } } - tx = plh.SearchCodeOrName(input.Search, tx) - tx = tx. Model(&e.Uom{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). - Order("\"CreatedAt\" DESC") + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { diff --git a/internal/use-case/main-use-case/village/lib.go b/internal/use-case/main-use-case/village/lib.go index 059aa6d3..4ef4596c 100644 --- a/internal/use-case/main-use-case/village/lib.go +++ b/internal/use-case/main-use-case/village/lib.go @@ -53,15 +53,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Vi } } - tx = plh.SearchCodeOrName(input.Search, tx) - - tx = plh.Sort(input.Sort, tx) - tx = tx. Model(&e.Village{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). - Scopes(gh.Paginate(input, &pagination)) + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) if err := tx.Find(&data).Error; err != nil { if err == gorm.ErrRecordNotFound { From 55993113ccf6e35238056fc9345e97694ffd4010 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 9 Oct 2025 11:04:59 +0700 Subject: [PATCH 133/190] feat (infra): remove preloaded data on update --- internal/use-case/main-use-case/infra/lib.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index 73b3e977..1b51a98a 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -130,6 +130,10 @@ func UpdateData(input e.UpdateDto, data *e.Infra, event *pl.Event, dbx ...*gorm. } else { tx = dg.I } + data.Parent = nil + data.Childrens = nil + data.Item = nil + data.Rooms = nil if err := tx.Save(&data).Error; err != nil { event.Status = "failed" From 63d2f2342cfa6bfd7ca593f384d4b7645f5d7835 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 9 Oct 2025 11:29:49 +0700 Subject: [PATCH 134/190] add postalcode --- .../migrations/20251009042854.sql | 9 +++ cmd/main-migration/migrations/atlas.sum | 69 ++++++++++--------- .../domain/main-entities/postal-code/dto.go | 60 ++++++++++++++++ .../main-entities/postal-code/entity.go | 7 ++ internal/domain/main-entities/village/dto.go | 10 +-- .../domain/main-entities/village/entity.go | 13 ++-- internal/interface/migration/main-entities.go | 2 + 7 files changed, 128 insertions(+), 42 deletions(-) create mode 100644 cmd/main-migration/migrations/20251009042854.sql create mode 100644 internal/domain/main-entities/postal-code/dto.go create mode 100644 internal/domain/main-entities/postal-code/entity.go diff --git a/cmd/main-migration/migrations/20251009042854.sql b/cmd/main-migration/migrations/20251009042854.sql new file mode 100644 index 00000000..c8b5ec23 --- /dev/null +++ b/cmd/main-migration/migrations/20251009042854.sql @@ -0,0 +1,9 @@ +-- Create "PostalCode" table +CREATE TABLE "public"."PostalCode" ( + "Id" bigserial NOT NULL, + "Code" character varying(5) NULL, + "Village_Code" character varying(10) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_PostalCode_Code" UNIQUE ("Code"), + CONSTRAINT "fk_Village_PostalCodes" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 2e277aab..5bb0447a 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,34 +1,35 @@ -h1:wdilGmaNGlpLWwpFErWUStZtsHTs6GEZAJewEjTYLlc= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= -20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= -20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= -20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= -20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= +h1:CAMxY9M2WLkhsnD/5ItPa0kDPKJwprjDft26U+FW3vE= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= +20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= +20251009042854.sql h1:vK7bDqUDTxjHMSh1wrQiKITeqbB/7aqkWaPut8nGA68= diff --git a/internal/domain/main-entities/postal-code/dto.go b/internal/domain/main-entities/postal-code/dto.go new file mode 100644 index 00000000..cb1e3d39 --- /dev/null +++ b/internal/domain/main-entities/postal-code/dto.go @@ -0,0 +1,60 @@ +package postalcode + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Code string `json:"code" validate:"numeric;maxLength=10"` + Village_Code string `json:"district_code" validate:"numeric;maxLength=10"` +} + +type ReadListDto struct { + District_Code string `json:"district_code"` + Code string `json:"code"` + Name string `json:"name"` + Pagination ecore.Pagination +} + +type ReadDetailDto struct { + Id uint32 `json:"id"` + Code *string `json:"code"` +} + +type UpdateDto struct { + Id uint32 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint32 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + Id uint32 `json:"id"` + Village_Code string `json:"village_code"` + Code string `json:"code"` +} + +func (d PostalCode) ToResponse() ResponseDto { + resp := ResponseDto{ + Id: d.Id, + Village_Code: d.Village_Code, + Code: d.Code, + } + return resp +} + +func ToResponseList(data []PostalCode) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/postal-code/entity.go b/internal/domain/main-entities/postal-code/entity.go new file mode 100644 index 00000000..ceb2174c --- /dev/null +++ b/internal/domain/main-entities/postal-code/entity.go @@ -0,0 +1,7 @@ +package postalcode + +type PostalCode struct { + Id uint32 `json:"id" gorm:"primaryKey"` + Code string `json:"code" gorm:"unique;size:5"` + Village_Code string `json:"village_code" gorm:"size:10"` +} diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index ca42f073..148138cd 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -2,6 +2,7 @@ package village import ( ecore "simrs-vx/internal/domain/base-entities/core" + ep "simrs-vx/internal/domain/main-entities/postal-code" ) type CreateDto struct { @@ -38,10 +39,11 @@ type MetaDto struct { } type ResponseDto struct { - Id uint32 `json:"id"` - District_Code string `json:"district_code"` - Code string `json:"code"` - Name string `json:"name"` + Id uint32 `json:"id"` + District_Code string `json:"district_code"` + Code string `json:"code"` + Name string `json:"name"` + PostalCodes []ep.PostalCode `json:"postalCodes,omitempty"` } func (d Village) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/village/entity.go b/internal/domain/main-entities/village/entity.go index aae0caf5..7078534f 100644 --- a/internal/domain/main-entities/village/entity.go +++ b/internal/domain/main-entities/village/entity.go @@ -1,8 +1,13 @@ package village +import ( + ep "simrs-vx/internal/domain/main-entities/postal-code" +) + type Village struct { - Id uint32 `json:"id" gorm:"primaryKey"` - District_Code string `json:"district_code" gorm:"size:6"` // NOT: THE PROPER SIZE IS 6 - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` + Id uint32 `json:"id" gorm:"primaryKey"` + District_Code string `json:"district_code" gorm:"size:6"` // NOT: THE PROPER SIZE IS 6 + Code string `json:"code" gorm:"unique;size:10"` + Name string `json:"name" gorm:"size:50"` + PostalCodes []ep.PostalCode `json:"postalCodes,omitempty" gorm:"foreignKey:Village_Code;references:Code"` } diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 9711c6bd..fcb3db9e 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -57,6 +57,7 @@ import ( personrelative "simrs-vx/internal/domain/main-entities/person-relative" pharmacist "simrs-vx/internal/domain/main-entities/pharmacist" pharmacycompany "simrs-vx/internal/domain/main-entities/pharmacy-company" + postalcode "simrs-vx/internal/domain/main-entities/postal-code" practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" prescription "simrs-vx/internal/domain/main-entities/prescription" prescriptionitem "simrs-vx/internal/domain/main-entities/prescription-item" @@ -149,5 +150,6 @@ func getMainEntities() []any { &consultation.Consultation{}, &chemo.Chemo{}, &midwife.Midwife{}, + &postalcode.PostalCode{}, } } From 601bbd5a0a87f44e00f7f54f98d39a3c43ea47e7 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 9 Oct 2025 12:27:56 +0700 Subject: [PATCH 135/190] restructure area --- .../migrations/20251009052657.sql | 8 ++++++++ cmd/main-migration/migrations/atlas.sum | 3 ++- .../main-entities/district/base/entity.go | 8 ++++++++ internal/domain/main-entities/district/dto.go | 12 ++++++------ .../domain/main-entities/district/entity.go | 14 ++++++++------ .../main-entities/postal-code/base/entity.go | 7 +++++++ .../domain/main-entities/postal-code/entity.go | 10 +++++++--- internal/domain/main-entities/province/dto.go | 15 +++++++++------ .../domain/main-entities/province/entity.go | 10 +++++----- .../main-entities/regency/base/entitiy.go | 8 ++++++++ internal/domain/main-entities/regency/dto.go | 18 +++++++++++------- .../domain/main-entities/regency/entity.go | 14 ++++++++------ .../main-entities/village/base/entity.go | 8 ++++++++ internal/domain/main-entities/village/dto.go | 18 +++++++++++------- .../domain/main-entities/village/entity.go | 12 ++++++------ 15 files changed, 112 insertions(+), 53 deletions(-) create mode 100644 cmd/main-migration/migrations/20251009052657.sql create mode 100644 internal/domain/main-entities/district/base/entity.go create mode 100644 internal/domain/main-entities/postal-code/base/entity.go create mode 100644 internal/domain/main-entities/regency/base/entitiy.go create mode 100644 internal/domain/main-entities/village/base/entity.go diff --git a/cmd/main-migration/migrations/20251009052657.sql b/cmd/main-migration/migrations/20251009052657.sql new file mode 100644 index 00000000..5655a577 --- /dev/null +++ b/cmd/main-migration/migrations/20251009052657.sql @@ -0,0 +1,8 @@ +-- Modify "Regency" table +ALTER TABLE "public"."Regency" DROP CONSTRAINT "fk_Province_Regencies", ALTER COLUMN "Id" TYPE bigint, ADD CONSTRAINT "fk_Regency_Province" FOREIGN KEY ("Province_Code") REFERENCES "public"."Province" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "District" table +ALTER TABLE "public"."District" DROP CONSTRAINT "fk_Regency_Districts", ADD CONSTRAINT "fk_District_Regency" FOREIGN KEY ("Regency_Code") REFERENCES "public"."Regency" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "Village" table +ALTER TABLE "public"."Village" DROP CONSTRAINT "fk_District_Villages", ADD CONSTRAINT "fk_Village_District" FOREIGN KEY ("District_Code") REFERENCES "public"."District" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "PostalCode" table +ALTER TABLE "public"."PostalCode" DROP CONSTRAINT "fk_Village_PostalCodes", ADD CONSTRAINT "fk_PostalCode_Village" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 5bb0447a..e06784b3 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:CAMxY9M2WLkhsnD/5ItPa0kDPKJwprjDft26U+FW3vE= +h1:TrdoKKXrICvDA283WGDf33WtWHglk1twvjDpYrNwc8o= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -33,3 +33,4 @@ h1:CAMxY9M2WLkhsnD/5ItPa0kDPKJwprjDft26U+FW3vE= 20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= 20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= 20251009042854.sql h1:vK7bDqUDTxjHMSh1wrQiKITeqbB/7aqkWaPut8nGA68= +20251009052657.sql h1:I0rBPBg1o6zuRaxqWqCh82rI+NN7Gr6C//8ItUaLmtY= diff --git a/internal/domain/main-entities/district/base/entity.go b/internal/domain/main-entities/district/base/entity.go new file mode 100644 index 00000000..c7429490 --- /dev/null +++ b/internal/domain/main-entities/district/base/entity.go @@ -0,0 +1,8 @@ +package base + +type Basic struct { + Id uint32 `json:"id" gorm:"primaryKey"` + Regency_Code string `json:"regency_code" gorm:"size:4"` + Code string `json:"code" gorm:"unique;size:6"` // NOTE: THE PROPER SIZE IS 6 + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/district/dto.go b/internal/domain/main-entities/district/dto.go index 869aa9c2..64761713 100644 --- a/internal/domain/main-entities/district/dto.go +++ b/internal/domain/main-entities/district/dto.go @@ -2,7 +2,9 @@ package district import ( ecore "simrs-vx/internal/domain/base-entities/core" - ev "simrs-vx/internal/domain/main-entities/village" + edb "simrs-vx/internal/domain/main-entities/district/base" + er "simrs-vx/internal/domain/main-entities/regency" + evb "simrs-vx/internal/domain/main-entities/village/base" ) type CreateDto struct { @@ -39,11 +41,9 @@ type MetaDto struct { } type ResponseDto struct { - Id uint32 `json:"id"` - Regency_Code string `json:"regency_code"` - Code string `json:"code"` - Name string `json:"name"` - Villages []*ev.Village `json:"villages,omitempty"` + edb.Basic + Regency *er.Regency `json:"regency,omitempty"` + Villages []*evb.Basic `json:"villages,omitempty"` } func (d District) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/district/entity.go b/internal/domain/main-entities/district/entity.go index a3ad27e7..b9cb89c3 100644 --- a/internal/domain/main-entities/district/entity.go +++ b/internal/domain/main-entities/district/entity.go @@ -1,11 +1,13 @@ package district -import ev "simrs-vx/internal/domain/main-entities/village" +import ( + edb "simrs-vx/internal/domain/main-entities/district/base" + er "simrs-vx/internal/domain/main-entities/regency" + evb "simrs-vx/internal/domain/main-entities/village/base" +) type District struct { - Id uint32 `json:"id" gorm:"primaryKey"` - Regency_Code string `json:"regency_code" gorm:"size:4"` - Code string `json:"code" gorm:"unique;size:6"` // NOTE: THE PROPER SIZE IS 6 - Name string `json:"name" gorm:"size:50"` - Villages []*ev.Village `json:"villages,omitempty" gorm:"foreignKey:District_Code;references:Code"` + edb.Basic + Regency *er.Regency `json:"regency,omitempty" gorm:"foreignKey:Regency_Code;references:Code"` + Villages []*evb.Basic `json:"villages,omitempty" gorm:"foreignKey:District_Code;references:Code"` } diff --git a/internal/domain/main-entities/postal-code/base/entity.go b/internal/domain/main-entities/postal-code/base/entity.go new file mode 100644 index 00000000..814e4e72 --- /dev/null +++ b/internal/domain/main-entities/postal-code/base/entity.go @@ -0,0 +1,7 @@ +package base + +type Basic struct { + Id uint32 `json:"id" gorm:"primaryKey"` + Village_Code string `json:"village_code" gorm:"size:10"` + Code string `json:"code" gorm:"unique;size:5"` +} diff --git a/internal/domain/main-entities/postal-code/entity.go b/internal/domain/main-entities/postal-code/entity.go index ceb2174c..2825db9c 100644 --- a/internal/domain/main-entities/postal-code/entity.go +++ b/internal/domain/main-entities/postal-code/entity.go @@ -1,7 +1,11 @@ package postalcode +import ( + ep "simrs-vx/internal/domain/main-entities/postal-code/base" + ev "simrs-vx/internal/domain/main-entities/village" +) + type PostalCode struct { - Id uint32 `json:"id" gorm:"primaryKey"` - Code string `json:"code" gorm:"unique;size:5"` - Village_Code string `json:"village_code" gorm:"size:10"` + ep.Basic + Village *ev.Village `json:"village,omitempty" gorm:"foreignKey:Village_Code;references:Code"` } diff --git a/internal/domain/main-entities/province/dto.go b/internal/domain/main-entities/province/dto.go index d2cfc1ca..e2ac504b 100644 --- a/internal/domain/main-entities/province/dto.go +++ b/internal/domain/main-entities/province/dto.go @@ -2,6 +2,7 @@ package province import ( ecore "simrs-vx/internal/domain/base-entities/core" + erb "simrs-vx/internal/domain/main-entities/regency/base" ) type CreateDto struct { @@ -36,16 +37,18 @@ type MetaDto struct { } type ResponseDto struct { - Id int16 `json:"id"` - Code string `json:"code"` - Name string `json:"name"` + Id int16 `json:"id"` + Code string `json:"code"` + Name string `json:"name"` + Regencies []erb.Basic `json:"regencies,omitempty"` } func (d Province) ToResponse() ResponseDto { resp := ResponseDto{ - Id: d.Id, - Code: d.Code, - Name: d.Name, + Id: d.Id, + Code: d.Code, + Name: d.Name, + Regencies: d.Regencies, } return resp } diff --git a/internal/domain/main-entities/province/entity.go b/internal/domain/main-entities/province/entity.go index ab024b22..198cf4a4 100644 --- a/internal/domain/main-entities/province/entity.go +++ b/internal/domain/main-entities/province/entity.go @@ -1,10 +1,10 @@ package province -import er "simrs-vx/internal/domain/main-entities/regency" +import erb "simrs-vx/internal/domain/main-entities/regency/base" type Province struct { - Id int16 `json:"id" gorm:"primaryKey"` - Code string `json:"code" gorm:"unique;size:2"` - Name string `json:"name" gorm:"size:50"` - Regencies []*er.Regency `json:"regencies,omitempty" gorm:"foreignKey:Province_Code;references:Code"` + Id int16 `json:"id" gorm:"primaryKey"` + Code string `json:"code" gorm:"unique;size:2"` + Name string `json:"name" gorm:"size:50"` + Regencies []erb.Basic `json:"regencies,omitempty" gorm:"foreignKey:Province_Code;references:Code"` } diff --git a/internal/domain/main-entities/regency/base/entitiy.go b/internal/domain/main-entities/regency/base/entitiy.go new file mode 100644 index 00000000..b6c982ec --- /dev/null +++ b/internal/domain/main-entities/regency/base/entitiy.go @@ -0,0 +1,8 @@ +package base + +type Basic struct { + Id uint32 `json:"id" gorm:"primaryKey"` + Province_Code string `json:"province_code" gorm:"size:2"` + Code string `json:"code" gorm:"unique;size:4"` + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/regency/dto.go b/internal/domain/main-entities/regency/dto.go index e4d76df2..da6213df 100644 --- a/internal/domain/main-entities/regency/dto.go +++ b/internal/domain/main-entities/regency/dto.go @@ -2,7 +2,9 @@ package regency import ( ecore "simrs-vx/internal/domain/base-entities/core" - ed "simrs-vx/internal/domain/main-entities/district" + edb "simrs-vx/internal/domain/main-entities/district/base" + ep "simrs-vx/internal/domain/main-entities/province" + erb "simrs-vx/internal/domain/main-entities/regency/base" ) type CreateDto struct { @@ -39,15 +41,17 @@ type MetaDto struct { } type ResponseDto struct { - Id uint16 `json:"id"` - Province_Code string `json:"province_code"` - Code string `json:"code"` - Name string `json:"name"` - Districts []*ed.District `json:"districts,omitempty"` + erb.Basic + Province *ep.Province `json:"province,omitempty"` + Districts []*edb.Basic `json:"districts,omitempty"` } func (d Regency) ToResponse() ResponseDto { - resp := ResponseDto(d) + resp := ResponseDto{ + Basic: d.Basic, + Province: d.Province, + Districts: d.Districts, + } return resp } diff --git a/internal/domain/main-entities/regency/entity.go b/internal/domain/main-entities/regency/entity.go index 3bdcf934..bf58e37b 100644 --- a/internal/domain/main-entities/regency/entity.go +++ b/internal/domain/main-entities/regency/entity.go @@ -1,11 +1,13 @@ package regency -import ed "simrs-vx/internal/domain/main-entities/district" +import ( + edb "simrs-vx/internal/domain/main-entities/district/base" + ep "simrs-vx/internal/domain/main-entities/province" + erb "simrs-vx/internal/domain/main-entities/regency/base" +) type Regency struct { - Id uint16 `json:"id" gorm:"primaryKey"` - Province_Code string `json:"province_code" gorm:"size:2"` - Code string `json:"code" gorm:"unique;size:4"` - Name string `json:"name" gorm:"size:50"` - Districts []*ed.District `json:"districts,omitempty" gorm:"foreignKey:Regency_Code;references:Code"` + erb.Basic + Province *ep.Province `json:"province,omitempty" gorm:"foreignKey:Province_Code;references:Code"` + Districts []*edb.Basic `json:"districts,omitempty" gorm:"foreignKey:Regency_Code;references:Code"` } diff --git a/internal/domain/main-entities/village/base/entity.go b/internal/domain/main-entities/village/base/entity.go new file mode 100644 index 00000000..45cba2ba --- /dev/null +++ b/internal/domain/main-entities/village/base/entity.go @@ -0,0 +1,8 @@ +package base + +type Basic struct { + Id uint32 `json:"id" gorm:"primaryKey"` + District_Code string `json:"district_code" gorm:"size:6"` + Code string `json:"code" gorm:"unique;size:10"` + Name string `json:"name" gorm:"size:50"` +} diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index 148138cd..50f44a07 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -2,7 +2,9 @@ package village import ( ecore "simrs-vx/internal/domain/base-entities/core" - ep "simrs-vx/internal/domain/main-entities/postal-code" + ed "simrs-vx/internal/domain/main-entities/district" + epb "simrs-vx/internal/domain/main-entities/postal-code/base" + evb "simrs-vx/internal/domain/main-entities/village/base" ) type CreateDto struct { @@ -39,15 +41,17 @@ type MetaDto struct { } type ResponseDto struct { - Id uint32 `json:"id"` - District_Code string `json:"district_code"` - Code string `json:"code"` - Name string `json:"name"` - PostalCodes []ep.PostalCode `json:"postalCodes,omitempty"` + evb.Basic + District *ed.District `json:"district,omitempty"` + PostalCodes []epb.Basic `json:"postalCodes,omitempty"` } func (d Village) ToResponse() ResponseDto { - resp := ResponseDto(d) + resp := ResponseDto{ + Basic: d.Basic, + District: d.District, + PostalCodes: d.PostalCodes, + } return resp } diff --git a/internal/domain/main-entities/village/entity.go b/internal/domain/main-entities/village/entity.go index 7078534f..d7c549bc 100644 --- a/internal/domain/main-entities/village/entity.go +++ b/internal/domain/main-entities/village/entity.go @@ -1,13 +1,13 @@ package village import ( - ep "simrs-vx/internal/domain/main-entities/postal-code" + ed "simrs-vx/internal/domain/main-entities/district" + epb "simrs-vx/internal/domain/main-entities/postal-code/base" + evb "simrs-vx/internal/domain/main-entities/village/base" ) type Village struct { - Id uint32 `json:"id" gorm:"primaryKey"` - District_Code string `json:"district_code" gorm:"size:6"` // NOT: THE PROPER SIZE IS 6 - Code string `json:"code" gorm:"unique;size:10"` - Name string `json:"name" gorm:"size:50"` - PostalCodes []ep.PostalCode `json:"postalCodes,omitempty" gorm:"foreignKey:Village_Code;references:Code"` + evb.Basic + District *ed.District `json:"district,omitempty" gorm:"foreignKey:District_Code;references:Code"` + PostalCodes []epb.Basic `json:"postalCodes,omitempty" gorm:"foreignKey:Village_Code;references:Code"` } From 9a68982afa503011caaceae171ecaaa1e2886cf8 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 9 Oct 2025 12:49:19 +0700 Subject: [PATCH 136/190] feat (postal-code): add crud for postal-code --- .../main-entities/district/base/entity.go | 4 + .../main-entities/postal-code/base/entity.go | 4 + .../domain/main-entities/postal-code/dto.go | 28 +- .../main-entities/regency/base/entitiy.go | 4 + .../main-entities/village/base/entity.go | 4 + .../interface/main-handler/main-handler.go | 2 + .../main-handler/postal-code/handler.go | 71 +++++ .../main-use-case/postal-code/case.go | 279 ++++++++++++++++++ .../main-use-case/postal-code/helper.go | 21 ++ .../use-case/main-use-case/postal-code/lib.go | 156 ++++++++++ .../postal-code/middleware-runner.go | 103 +++++++ .../main-use-case/postal-code/middleware.go | 9 + .../main-use-case/postal-code/tycovar.go | 44 +++ 13 files changed, 720 insertions(+), 9 deletions(-) create mode 100644 internal/interface/main-handler/postal-code/handler.go create mode 100644 internal/use-case/main-use-case/postal-code/case.go create mode 100644 internal/use-case/main-use-case/postal-code/helper.go create mode 100644 internal/use-case/main-use-case/postal-code/lib.go create mode 100644 internal/use-case/main-use-case/postal-code/middleware-runner.go create mode 100644 internal/use-case/main-use-case/postal-code/middleware.go create mode 100644 internal/use-case/main-use-case/postal-code/tycovar.go diff --git a/internal/domain/main-entities/district/base/entity.go b/internal/domain/main-entities/district/base/entity.go index c7429490..40af0fc3 100644 --- a/internal/domain/main-entities/district/base/entity.go +++ b/internal/domain/main-entities/district/base/entity.go @@ -6,3 +6,7 @@ type Basic struct { Code string `json:"code" gorm:"unique;size:6"` // NOTE: THE PROPER SIZE IS 6 Name string `json:"name" gorm:"size:50"` } + +func (Basic) TableName() string { + return "District" +} diff --git a/internal/domain/main-entities/postal-code/base/entity.go b/internal/domain/main-entities/postal-code/base/entity.go index 814e4e72..0ceeada7 100644 --- a/internal/domain/main-entities/postal-code/base/entity.go +++ b/internal/domain/main-entities/postal-code/base/entity.go @@ -5,3 +5,7 @@ type Basic struct { Village_Code string `json:"village_code" gorm:"size:10"` Code string `json:"code" gorm:"unique;size:5"` } + +func (Basic) TableName() string { + return "PostalCode" +} diff --git a/internal/domain/main-entities/postal-code/dto.go b/internal/domain/main-entities/postal-code/dto.go index cb1e3d39..ff32c827 100644 --- a/internal/domain/main-entities/postal-code/dto.go +++ b/internal/domain/main-entities/postal-code/dto.go @@ -2,18 +2,26 @@ package postalcode import ( ecore "simrs-vx/internal/domain/base-entities/core" + ev "simrs-vx/internal/domain/main-entities/village" ) type CreateDto struct { - Code string `json:"code" validate:"numeric;maxLength=10"` - Village_Code string `json:"district_code" validate:"numeric;maxLength=10"` + Code string `json:"code" validate:"numeric;maxLength=5"` + Village_Code string `json:"village_code" validate:"numeric;maxLength=10"` } type ReadListDto struct { - District_Code string `json:"district_code"` - Code string `json:"code"` - Name string `json:"name"` - Pagination ecore.Pagination + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Village_Code string `json:"village-code"` + Code string `json:"code"` + Search string `json:"search" gormhelper:"searchColumns=Code"` } type ReadDetailDto struct { @@ -37,15 +45,17 @@ type MetaDto struct { } type ResponseDto struct { - Id uint32 `json:"id"` - Village_Code string `json:"village_code"` - Code string `json:"code"` + Id uint32 `json:"id"` + Village_Code string `json:"village_code"` + Village *ev.Village `json:"village,omitempty"` + Code string `json:"code"` } func (d PostalCode) ToResponse() ResponseDto { resp := ResponseDto{ Id: d.Id, Village_Code: d.Village_Code, + Village: d.Village, Code: d.Code, } return resp diff --git a/internal/domain/main-entities/regency/base/entitiy.go b/internal/domain/main-entities/regency/base/entitiy.go index b6c982ec..9e824923 100644 --- a/internal/domain/main-entities/regency/base/entitiy.go +++ b/internal/domain/main-entities/regency/base/entitiy.go @@ -6,3 +6,7 @@ type Basic struct { Code string `json:"code" gorm:"unique;size:4"` Name string `json:"name" gorm:"size:50"` } + +func (Basic) TableName() string { + return "Regency" +} diff --git a/internal/domain/main-entities/village/base/entity.go b/internal/domain/main-entities/village/base/entity.go index 45cba2ba..97f5347f 100644 --- a/internal/domain/main-entities/village/base/entity.go +++ b/internal/domain/main-entities/village/base/entity.go @@ -6,3 +6,7 @@ type Basic struct { Code string `json:"code" gorm:"unique;size:10"` Name string `json:"name" gorm:"size:50"` } + +func (Basic) TableName() string { + return "Village" +} diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index f718697d..0d9fd969 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -87,6 +87,7 @@ import ( uom "simrs-vx/internal/interface/main-handler/uom" district "simrs-vx/internal/interface/main-handler/district" + postalcode "simrs-vx/internal/interface/main-handler/postal-code" province "simrs-vx/internal/interface/main-handler/province" regency "simrs-vx/internal/interface/main-handler/regency" village "simrs-vx/internal/interface/main-handler/village" @@ -292,6 +293,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/district", district.O) hc.RegCrud(r, "/v1/regency", regency.O) hc.RegCrud(r, "/v1/province", province.O) + hc.RegCrud(r, "/v1/postal-code", postalcode.O) ///// return cmw.SetCors(handlerlogger.SetLog(r)) diff --git a/internal/interface/main-handler/postal-code/handler.go b/internal/interface/main-handler/postal-code/handler.go new file mode 100644 index 00000000..d6c3dc1e --- /dev/null +++ b/internal/interface/main-handler/postal-code/handler.go @@ -0,0 +1,71 @@ +package postalcode + +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/postal-code" + u "simrs-vx/internal/use-case/main-use-case/postal-code" +) + +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 = uint32(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 = uint32(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 = uint32(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/postal-code/case.go b/internal/use-case/main-use-case/postal-code/case.go new file mode 100644 index 00000000..0bdefae5 --- /dev/null +++ b/internal/use-case/main-use-case/postal-code/case.go @@ -0,0 +1,279 @@ +package postalcode + +import ( + e "simrs-vx/internal/domain/main-entities/postal-code" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "postal-code" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.PostalCode{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.PostalCode + var dataList []e.PostalCode + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if len(input.Includes) > 0 { + input.Preloads = pu.GetPreloads(input.Includes) + } + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.PostalCode + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.PostalCode + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.PostalCode + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/postal-code/helper.go b/internal/use-case/main-use-case/postal-code/helper.go new file mode 100644 index 00000000..1217f5e9 --- /dev/null +++ b/internal/use-case/main-use-case/postal-code/helper.go @@ -0,0 +1,21 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package postalcode + +import ( + e "simrs-vx/internal/domain/main-entities/postal-code" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PostalCode) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + data.Village_Code = inputSrc.Village_Code + data.Code = inputSrc.Code +} diff --git a/internal/use-case/main-use-case/postal-code/lib.go b/internal/use-case/main-use-case/postal-code/lib.go new file mode 100644 index 00000000..abead91a --- /dev/null +++ b/internal/use-case/main-use-case/postal-code/lib.go @@ -0,0 +1,156 @@ +package postalcode + +import ( + e "simrs-vx/internal/domain/main-entities/postal-code" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PostalCode, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.PostalCode{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.PostalCode, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.PostalCode{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if len(input.Preloads) > 0 { + for _, preload := range input.Preloads { + tx = tx.Preload(preload) + } + } + + tx = tx. + Model(&e.PostalCode{}). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.PostalCode, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.PostalCode{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx.Preload("Village"). + Preload("Village.District"). + Preload("Village.District.Regency"). + Preload("Village.District.Regency.Province") + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.PostalCode, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.PostalCode, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/main-use-case/postal-code/middleware-runner.go b/internal/use-case/main-use-case/postal-code/middleware-runner.go new file mode 100644 index 00000000..b06faf2b --- /dev/null +++ b/internal/use-case/main-use-case/postal-code/middleware-runner.go @@ -0,0 +1,103 @@ +package postalcode + +import ( + e "simrs-vx/internal/domain/main-entities/postal-code" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.PostalCode) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.PostalCode) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalCode) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalCode) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalCode) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/postal-code/middleware.go b/internal/use-case/main-use-case/postal-code/middleware.go new file mode 100644 index 00000000..a11c3e01 --- /dev/null +++ b/internal/use-case/main-use-case/postal-code/middleware.go @@ -0,0 +1,9 @@ +package postalcode + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/postal-code/tycovar.go b/internal/use-case/main-use-case/postal-code/tycovar.go new file mode 100644 index 00000000..2c307323 --- /dev/null +++ b/internal/use-case/main-use-case/postal-code/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package postalcode + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/postal-code" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.PostalCode, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.PostalCode, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.PostalCode, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From 080c90fc5d323aac001aa2c4061bceacdb8f6137 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Thu, 9 Oct 2025 12:53:19 +0700 Subject: [PATCH 137/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 72 ++++++++++++------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index e06784b3..f5ccb400 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,36 +1,36 @@ -h1:TrdoKKXrICvDA283WGDf33WtWHglk1twvjDpYrNwc8o= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= -20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= -20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= -20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= -20251009042854.sql h1:vK7bDqUDTxjHMSh1wrQiKITeqbB/7aqkWaPut8nGA68= -20251009052657.sql h1:I0rBPBg1o6zuRaxqWqCh82rI+NN7Gr6C//8ItUaLmtY= +h1:orFicJSDFEBqic7Unz4dLWmm4iFjdXDq8Hcx1e06hCw= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= +20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= +20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= +20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= +20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= +20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= From 5ef168a53231764aa536c2cee322720126704b2a Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 10 Oct 2025 10:18:33 +0700 Subject: [PATCH 138/190] add fk postalcode in person address, and regency in person --- .../migrations/20251010031743.sql | 6 ++ cmd/main-migration/migrations/atlas.sum | 73 ++++++++++--------- .../main-entities/person-address/entity.go | 16 ++-- .../domain/main-entities/person/entity.go | 3 + 4 files changed, 55 insertions(+), 43 deletions(-) create mode 100644 cmd/main-migration/migrations/20251010031743.sql diff --git a/cmd/main-migration/migrations/20251010031743.sql b/cmd/main-migration/migrations/20251010031743.sql new file mode 100644 index 00000000..1dea016a --- /dev/null +++ b/cmd/main-migration/migrations/20251010031743.sql @@ -0,0 +1,6 @@ +-- Modify "Person" table +ALTER TABLE "public"."Person" ADD CONSTRAINT "fk_Person_BirthRegency" FOREIGN KEY ("BirthRegency_Code") REFERENCES "public"."Regency" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Rename a column from "PostalCode" to "PostalCode_Code" +ALTER TABLE "public"."PersonAddress" RENAME COLUMN "PostalCode" TO "PostalCode_Code"; +-- Modify "PersonAddress" table +ALTER TABLE "public"."PersonAddress" ADD CONSTRAINT "fk_PersonAddress_PostalCode" FOREIGN KEY ("PostalCode_Code") REFERENCES "public"."PostalCode" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index f5ccb400..fed6c077 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,36 +1,37 @@ -h1:orFicJSDFEBqic7Unz4dLWmm4iFjdXDq8Hcx1e06hCw= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= -20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= -20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= -20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= -20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= -20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= -20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= +h1:tvJWAAI1ENRhCwoYTUekIO7b9RxtkQllUFwCYQ/S17w= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= +20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= +20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= +20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= +20251010031743.sql h1:XGl/0//kV22jCXS+k+qZASm/zN6uapZjOCPBAGg7+yo= diff --git a/internal/domain/main-entities/person-address/entity.go b/internal/domain/main-entities/person-address/entity.go index eacfd9f0..f3fc3bac 100644 --- a/internal/domain/main-entities/person-address/entity.go +++ b/internal/domain/main-entities/person-address/entity.go @@ -2,14 +2,16 @@ package personaddress import ( ecore "simrs-vx/internal/domain/base-entities/core" + epc "simrs-vx/internal/domain/main-entities/postal-code" ) type PersonAddress struct { - ecore.Main // adjust this according to the needs - Person_Id uint `json:"person_id"` - Address string `json:"address" gorm:"size:150"` - Rt string `json:"rt" gorm:"size:2"` - Rw string `json:"rw" gorm:"size:2"` - PostalCode string `json:"postalCode" gorm:"size:6"` - Village_Code string `json:"village_code" gorm:"size:10"` + ecore.Main // adjust this according to the needs + Person_Id uint `json:"person_id"` + Address string `json:"address" gorm:"size:150"` + Rt string `json:"rt" gorm:"size:2"` + Rw string `json:"rw" gorm:"size:2"` + PostalCode_Code string `json:"postalCode_code" gorm:"size:6"` + PostalCode *epc.PostalCode `json:"postalCode,omitempty" gorm:"foreignKey:PostalCode_Code;references:Code"` + Village_Code string `json:"village_code" gorm:"size:10"` } diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index 91b2462e..8639df25 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -7,6 +7,8 @@ import ( epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" epr "simrs-vx/internal/domain/main-entities/person-relative" + er "simrs-vx/internal/domain/main-entities/regency" + erp "simrs-vx/internal/domain/references/person" "time" @@ -19,6 +21,7 @@ type Person struct { EndTitle *string `json:"endTitle" gorm:"size:50"` BirthDate *time.Time `json:"birthDate,omitempty"` BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` + BirthRegency *er.Regency `json:"birthRegency,omitempty" gorm:"foreignKey:BirthRegency_Code;references:Code"` Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"unique;size:16"` PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"` From fa2f7b745c96261c449a8ed21577ea5560f4e27b Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 10 Oct 2025 10:46:48 +0700 Subject: [PATCH 139/190] feat (patient): more detail on preloading object --- .../main-entities/person-address/dto.go | 39 ++++++++++--------- internal/domain/main-entities/person/dto.go | 3 ++ .../domain/main-entities/person/entity.go | 6 +-- .../use-case/main-use-case/patient/lib.go | 10 +++-- .../main-use-case/person-address/helper.go | 2 +- 5 files changed, 35 insertions(+), 25 deletions(-) diff --git a/internal/domain/main-entities/person-address/dto.go b/internal/domain/main-entities/person-address/dto.go index 821cf788..915f2b7f 100644 --- a/internal/domain/main-entities/person-address/dto.go +++ b/internal/domain/main-entities/person-address/dto.go @@ -2,15 +2,16 @@ package personaddress import ( ecore "simrs-vx/internal/domain/base-entities/core" + epc "simrs-vx/internal/domain/main-entities/postal-code" ) type CreateDto struct { - Person_Id uint `json:"person_id"` - Address string `json:"address" validate:"maxLength=150"` - Rt string `json:"rt" validate:"maxLength=2"` - Rw string `json:"rw" validate:"maxLength=2"` - Village_Code string `json:"village_code" validate:"maxLength=10"` - PostalCode string `json:"postalCode" validate:"maxLength=6"` + Person_Id uint `json:"person_id"` + Address string `json:"address" validate:"maxLength=150"` + Rt string `json:"rt" validate:"maxLength=2"` + Rw string `json:"rw" validate:"maxLength=2"` + Village_Code string `json:"village_code" validate:"maxLength=10"` + PostalCode_Code string `json:"postalCode_code" validate:"maxLength=6"` } type ReadListDto struct { @@ -39,22 +40,24 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Person_Id uint `json:"person_id"` - Address string `json:"address"` - Rt string `json:"rt"` - Rw string `json:"rw"` - Village_Code string `json:"village_code"` - PostalCode string `json:"postalCode"` + Person_Id uint `json:"person_id"` + Address string `json:"address"` + Rt string `json:"rt"` + Rw string `json:"rw"` + Village_Code string `json:"village_code"` + PostalCode_Code string `json:"postalCode_code"` + PostalCode *epc.PostalCode `json:"postalCode,omitempty"` } func (d PersonAddress) ToResponse() ResponseDto { resp := ResponseDto{ - Person_Id: d.Person_Id, - Address: d.Address, - Rt: d.Rt, - Rw: d.Rw, - Village_Code: d.Village_Code, - PostalCode: d.PostalCode, + Person_Id: d.Person_Id, + Address: d.Address, + Rt: d.Rt, + Rw: d.Rw, + Village_Code: d.Village_Code, + PostalCode_Code: d.PostalCode_Code, + PostalCode: d.PostalCode, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/person/dto.go b/internal/domain/main-entities/person/dto.go index 85617706..dfba0115 100644 --- a/internal/domain/main-entities/person/dto.go +++ b/internal/domain/main-entities/person/dto.go @@ -8,6 +8,7 @@ import ( epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" epr "simrs-vx/internal/domain/main-entities/person-relative" + er "simrs-vx/internal/domain/main-entities/regency" erp "simrs-vx/internal/domain/references/person" ) @@ -91,6 +92,7 @@ type ResponseDto struct { EndTitle *string `json:"endTitle"` BirthDate *time.Time `json:"birthDate,omitempty"` BirthRegency_Code *string `json:"birthRegency_code"` + BirthRegency *er.Regency `json:"birthRegency,omitempty"` Gender_Code *erp.GenderCode `json:"gender_code"` ResidentIdentityNumber *string `json:"residentIdentityNumber"` PassportNumber *string `json:"passportNumber"` @@ -121,6 +123,7 @@ func (d *Person) ToResponse() ResponseDto { EndTitle: d.EndTitle, BirthDate: d.BirthDate, BirthRegency_Code: d.BirthRegency_Code, + BirthRegency: d.BirthRegency, Gender_Code: d.Gender_Code, ResidentIdentityNumber: d.ResidentIdentityNumber, PassportNumber: d.PassportNumber, diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index 8639df25..4dd9bcd4 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -33,9 +33,6 @@ type Person struct { Nationality *string `json:"nationality": gorm:"size:50"` Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` - Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` - Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` - Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` Language_Code *string `json:"language_code" gorm:"size:10"` Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` CommunicationIssueStatus bool `json:"communicationIssueStatus"` @@ -44,6 +41,9 @@ type Person struct { PassportFileUrl *string `json:"passportFileUrl" gorm:"size:1024"` DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl" gorm:"size:1024"` FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl" gorm:"size:1024"` + Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` + Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` + Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` } func (d Person) IsSameResidentIdentityNumber(input *string) bool { diff --git a/internal/use-case/main-use-case/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index 8f6148ee..fb864f84 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -96,9 +96,13 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e } tx = tx.Preload(clause.Associations) - tx = tx.Preload("Person.Addresses") - tx = tx.Preload("Person.Contacts") - tx = tx.Preload("Person.Relatives") + tx = tx.Preload("Person.BirthRegency.Province"). + Preload("Person.Ethnic"). + Preload("Person.Language"). + Preload("Person.Contacts"). + Preload("Person.Relatives.Village.District.Regency.Province"). + Preload("Person.Addresses"). + Preload("Person.Addresses.PostalCode.Village.District.Regency.Province") if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { diff --git a/internal/use-case/main-use-case/person-address/helper.go b/internal/use-case/main-use-case/person-address/helper.go index f3197d76..60712837 100644 --- a/internal/use-case/main-use-case/person-address/helper.go +++ b/internal/use-case/main-use-case/person-address/helper.go @@ -22,5 +22,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PersonAddress) { data.Rt = inputSrc.Rt data.Rw = inputSrc.Rw data.Village_Code = inputSrc.Village_Code - data.PostalCode = inputSrc.PostalCode + data.PostalCode_Code = inputSrc.PostalCode_Code } From f64b8e2c6e8f450324f64408df1b28fb9e809d79 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 10 Oct 2025 10:58:23 +0700 Subject: [PATCH 140/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 74 ++++++++++++------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index fed6c077..741f4b48 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,37 +1,37 @@ -h1:tvJWAAI1ENRhCwoYTUekIO7b9RxtkQllUFwCYQ/S17w= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= -20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= -20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= -20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= -20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= -20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= -20251010031743.sql h1:XGl/0//kV22jCXS+k+qZASm/zN6uapZjOCPBAGg7+yo= +h1:xVhAIbHPOq5Fwkwi6TwtefKLWPqyyF3MQYD9VUB0gsM= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= +20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= +20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= +20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= +20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= +20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= +20251010031743.sql h1:SgHNY/lQ88G2F4nZyMfiOkDntb+gtOR+nEQLqXBTwv4= From 738ee5b5173507b345597b319eb0e2129597282a Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 10 Oct 2025 14:05:59 +0700 Subject: [PATCH 141/190] change from postatlcode into postalregion, add location type into person address --- .../main-entities/division-position/entity.go | 2 +- .../main-entities/person-address/entity.go | 21 +++++++++++-------- .../base/entity.go | 0 .../{postal-code => postal-region}/dto.go | 6 +++--- .../{postal-code => postal-region}/entity.go | 6 +++--- internal/domain/main-entities/village/dto.go | 12 +++++------ .../domain/main-entities/village/entity.go | 6 +++--- internal/domain/references/person/person.go | 4 ++++ internal/interface/migration/main-entities.go | 4 ++-- 9 files changed, 34 insertions(+), 27 deletions(-) rename internal/domain/main-entities/{postal-code => postal-region}/base/entity.go (100%) rename internal/domain/main-entities/{postal-code => postal-region}/dto.go (89%) rename internal/domain/main-entities/{postal-code => postal-region}/entity.go (60%) diff --git a/internal/domain/main-entities/division-position/entity.go b/internal/domain/main-entities/division-position/entity.go index 3d1d2eca..5bb3160a 100644 --- a/internal/domain/main-entities/division-position/entity.go +++ b/internal/domain/main-entities/division-position/entity.go @@ -12,7 +12,7 @@ type DivisionPosition struct { Division *ed.Division `json:"division" gorm:"foreignKey:Division_Id"` Code string `json:"code" gorm:"unique;size:10"` Name string `json:"name" gorm:"size:50"` - HeadStatus bool `json:"head_status"` + HeadStatus bool `json:"headStatus"` Employee_Id *uint `json:"employee_id"` Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` } diff --git a/internal/domain/main-entities/person-address/entity.go b/internal/domain/main-entities/person-address/entity.go index f3fc3bac..47c3d6e4 100644 --- a/internal/domain/main-entities/person-address/entity.go +++ b/internal/domain/main-entities/person-address/entity.go @@ -2,16 +2,19 @@ package personaddress import ( ecore "simrs-vx/internal/domain/base-entities/core" - epc "simrs-vx/internal/domain/main-entities/postal-code" + epr "simrs-vx/internal/domain/main-entities/postal-region" + + erp "simrs-vx/internal/domain/references/person" ) type PersonAddress struct { - ecore.Main // adjust this according to the needs - Person_Id uint `json:"person_id"` - Address string `json:"address" gorm:"size:150"` - Rt string `json:"rt" gorm:"size:2"` - Rw string `json:"rw" gorm:"size:2"` - PostalCode_Code string `json:"postalCode_code" gorm:"size:6"` - PostalCode *epc.PostalCode `json:"postalCode,omitempty" gorm:"foreignKey:PostalCode_Code;references:Code"` - Village_Code string `json:"village_code" gorm:"size:10"` + ecore.Main // adjust this according to the needs + Person_Id uint `json:"person_id"` + Address string `json:"address" gorm:"size:150"` + LocationType_Code erp.AddressLocationTypeCode `json:"locationType_code" gorm:"size:10"` + Rt string `json:"rt" gorm:"size:2"` + Rw string `json:"rw" gorm:"size:2"` + PostalRegion_Code string `json:"postalRegion_code" gorm:"size:6"` + PostalRegion *epr.PostalRegion `json:"postalRegion,omitempty" gorm:"foreignKey:PostalRegion_Code;references:Code"` + Village_Code string `json:"village_code" gorm:"size:10"` } diff --git a/internal/domain/main-entities/postal-code/base/entity.go b/internal/domain/main-entities/postal-region/base/entity.go similarity index 100% rename from internal/domain/main-entities/postal-code/base/entity.go rename to internal/domain/main-entities/postal-region/base/entity.go diff --git a/internal/domain/main-entities/postal-code/dto.go b/internal/domain/main-entities/postal-region/dto.go similarity index 89% rename from internal/domain/main-entities/postal-code/dto.go rename to internal/domain/main-entities/postal-region/dto.go index cb1e3d39..cb113c35 100644 --- a/internal/domain/main-entities/postal-code/dto.go +++ b/internal/domain/main-entities/postal-region/dto.go @@ -1,4 +1,4 @@ -package postalcode +package postalregion import ( ecore "simrs-vx/internal/domain/base-entities/core" @@ -42,7 +42,7 @@ type ResponseDto struct { Code string `json:"code"` } -func (d PostalCode) ToResponse() ResponseDto { +func (d PostalRegion) ToResponse() ResponseDto { resp := ResponseDto{ Id: d.Id, Village_Code: d.Village_Code, @@ -51,7 +51,7 @@ func (d PostalCode) ToResponse() ResponseDto { return resp } -func ToResponseList(data []PostalCode) []ResponseDto { +func ToResponseList(data []PostalRegion) []ResponseDto { resp := make([]ResponseDto, len(data)) for i, u := range data { resp[i] = u.ToResponse() diff --git a/internal/domain/main-entities/postal-code/entity.go b/internal/domain/main-entities/postal-region/entity.go similarity index 60% rename from internal/domain/main-entities/postal-code/entity.go rename to internal/domain/main-entities/postal-region/entity.go index 2825db9c..43f5971f 100644 --- a/internal/domain/main-entities/postal-code/entity.go +++ b/internal/domain/main-entities/postal-region/entity.go @@ -1,11 +1,11 @@ -package postalcode +package postalregion import ( - ep "simrs-vx/internal/domain/main-entities/postal-code/base" + ep "simrs-vx/internal/domain/main-entities/postal-region/base" ev "simrs-vx/internal/domain/main-entities/village" ) -type PostalCode struct { +type PostalRegion struct { ep.Basic Village *ev.Village `json:"village,omitempty" gorm:"foreignKey:Village_Code;references:Code"` } diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index 50f44a07..c56e60a5 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -3,7 +3,7 @@ package village import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/district" - epb "simrs-vx/internal/domain/main-entities/postal-code/base" + epb "simrs-vx/internal/domain/main-entities/postal-region/base" evb "simrs-vx/internal/domain/main-entities/village/base" ) @@ -42,15 +42,15 @@ type MetaDto struct { type ResponseDto struct { evb.Basic - District *ed.District `json:"district,omitempty"` - PostalCodes []epb.Basic `json:"postalCodes,omitempty"` + District *ed.District `json:"district,omitempty"` + PostalRegions []epb.Basic `json:"postalRegions,omitempty"` } func (d Village) ToResponse() ResponseDto { resp := ResponseDto{ - Basic: d.Basic, - District: d.District, - PostalCodes: d.PostalCodes, + Basic: d.Basic, + District: d.District, + PostalRegions: d.PostalRegions, } return resp } diff --git a/internal/domain/main-entities/village/entity.go b/internal/domain/main-entities/village/entity.go index d7c549bc..ca5fb4af 100644 --- a/internal/domain/main-entities/village/entity.go +++ b/internal/domain/main-entities/village/entity.go @@ -2,12 +2,12 @@ package village import ( ed "simrs-vx/internal/domain/main-entities/district" - epb "simrs-vx/internal/domain/main-entities/postal-code/base" + epb "simrs-vx/internal/domain/main-entities/postal-region/base" evb "simrs-vx/internal/domain/main-entities/village/base" ) type Village struct { evb.Basic - District *ed.District `json:"district,omitempty" gorm:"foreignKey:District_Code;references:Code"` - PostalCodes []epb.Basic `json:"postalCodes,omitempty" gorm:"foreignKey:Village_Code;references:Code"` + District *ed.District `json:"district,omitempty" gorm:"foreignKey:District_Code;references:Code"` + PostalRegions []epb.Basic `json:"postalRegions,omitempty" gorm:"foreignKey:Village_Code;references:Code"` } diff --git a/internal/domain/references/person/person.go b/internal/domain/references/person/person.go index d21399d2..02d0f97e 100644 --- a/internal/domain/references/person/person.go +++ b/internal/domain/references/person/person.go @@ -12,6 +12,7 @@ type ( RelativeCode string ContactTypeCode string RelationshipCode string + AddressLocationTypeCode string ) const ( @@ -109,6 +110,9 @@ const ( RCNephew RelationshipCode = "nephew" // Keponakan RCGdChild RelationshipCode = "gd-child" // Cucu RCOther RelationshipCode = "other" // Lainnya + + ALTCIdn AddressLocationTypeCode = "identity" // Sesuai Identitas + ALTCDom AddressLocationTypeCode = "domicile" // Sesuai Domisili ) // func GetGenderCodes() map[GenderCode]string { diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index fcb3db9e..fc3161fa 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -57,7 +57,7 @@ import ( personrelative "simrs-vx/internal/domain/main-entities/person-relative" pharmacist "simrs-vx/internal/domain/main-entities/pharmacist" pharmacycompany "simrs-vx/internal/domain/main-entities/pharmacy-company" - postalcode "simrs-vx/internal/domain/main-entities/postal-code" + postalregion "simrs-vx/internal/domain/main-entities/postal-region" practiceschedule "simrs-vx/internal/domain/main-entities/practice-schedule" prescription "simrs-vx/internal/domain/main-entities/prescription" prescriptionitem "simrs-vx/internal/domain/main-entities/prescription-item" @@ -150,6 +150,6 @@ func getMainEntities() []any { &consultation.Consultation{}, &chemo.Chemo{}, &midwife.Midwife{}, - &postalcode.PostalCode{}, + &postalregion.PostalRegion{}, } } From a298f192d5f9f5f55336b0223a97739ae987577d Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 10 Oct 2025 14:12:05 +0700 Subject: [PATCH 142/190] switch fk for personaddress --- .../migrations/20251010070721.sql | 15 ++++ cmd/main-migration/migrations/atlas.sum | 75 ++++++++++--------- .../main-entities/person-address/dto.go | 20 ++--- .../main-entities/person-address/entity.go | 4 +- 4 files changed, 65 insertions(+), 49 deletions(-) create mode 100644 cmd/main-migration/migrations/20251010070721.sql diff --git a/cmd/main-migration/migrations/20251010070721.sql b/cmd/main-migration/migrations/20251010070721.sql new file mode 100644 index 00000000..ee030931 --- /dev/null +++ b/cmd/main-migration/migrations/20251010070721.sql @@ -0,0 +1,15 @@ +-- Create "PostalRegion" table +CREATE TABLE "public"."PostalRegion" ( + "Id" bigserial NOT NULL, + "Village_Code" character varying(10) NULL, + "Code" character varying(5) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_PostalRegion_Code" UNIQUE ("Code"), + CONSTRAINT "fk_PostalRegion_Village" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Rename a column from "PostalCode_Code" to "PostalRegion_Code" +ALTER TABLE "public"."PersonAddress" RENAME COLUMN "PostalCode_Code" TO "PostalRegion_Code"; +-- Modify "PersonAddress" table +ALTER TABLE "public"."PersonAddress" DROP CONSTRAINT "fk_PersonAddress_PostalCode", ADD COLUMN "LocationType_Code" character varying(10) NULL, ADD CONSTRAINT "fk_PersonAddress_PostalRegion" FOREIGN KEY ("PostalRegion_Code") REFERENCES "public"."PostalRegion" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Drop "PostalCode" table +DROP TABLE "public"."PostalCode"; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 741f4b48..57b78283 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,37 +1,38 @@ -h1:xVhAIbHPOq5Fwkwi6TwtefKLWPqyyF3MQYD9VUB0gsM= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= -20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= -20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= -20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= -20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= -20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= -20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= -20251010031743.sql h1:SgHNY/lQ88G2F4nZyMfiOkDntb+gtOR+nEQLqXBTwv4= +h1:4FXkpgFh3UpHN247wDhhSP9RpYGEvS0rwSbd5mEeFZ4= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= +20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= +20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= +20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= +20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= +20251010070721.sql h1:+tKik0+V3yNWiLX4rW3pxw93ceBCCtqXDFqSHyzwnXo= diff --git a/internal/domain/main-entities/person-address/dto.go b/internal/domain/main-entities/person-address/dto.go index 0fcd52df..3d91355b 100644 --- a/internal/domain/main-entities/person-address/dto.go +++ b/internal/domain/main-entities/person-address/dto.go @@ -5,11 +5,11 @@ import ( ) type CreateDto struct { - Person_Id uint `json:"person_id"` - Address string `json:"address" validate:"maxLength=150"` - Rt string `json:"rt" validate:"maxLength=2"` - Rw string `json:"rw" validate:"maxLength=2"` - Village_Code string `json:"village_code" validate:"maxLength=10"` + Person_Id uint `json:"person_id"` + Address string `json:"address" validate:"maxLength=150"` + Rt string `json:"rt" validate:"maxLength=2"` + Rw string `json:"rw" validate:"maxLength=2"` + Village_Code *string `json:"village_code" validate:"maxLength=10"` } type ReadListDto struct { @@ -38,11 +38,11 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Person_Id uint `json:"person_id"` - Address string `json:"address"` - Rt string `json:"rt"` - Rw string `json:"rw"` - Village_Code string `json:"village_code"` + Person_Id uint `json:"person_id"` + Address string `json:"address"` + Rt string `json:"rt"` + Rw string `json:"rw"` + Village_Code *string `json:"village_code"` } func (d PersonAddress) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/person-address/entity.go b/internal/domain/main-entities/person-address/entity.go index 47c3d6e4..4b05634c 100644 --- a/internal/domain/main-entities/person-address/entity.go +++ b/internal/domain/main-entities/person-address/entity.go @@ -14,7 +14,7 @@ type PersonAddress struct { LocationType_Code erp.AddressLocationTypeCode `json:"locationType_code" gorm:"size:10"` Rt string `json:"rt" gorm:"size:2"` Rw string `json:"rw" gorm:"size:2"` - PostalRegion_Code string `json:"postalRegion_code" gorm:"size:6"` + PostalRegion_Code *string `json:"postalRegion_code" gorm:"size:6"` PostalRegion *epr.PostalRegion `json:"postalRegion,omitempty" gorm:"foreignKey:PostalRegion_Code;references:Code"` - Village_Code string `json:"village_code" gorm:"size:10"` + Village_Code *string `json:"village_code" gorm:"size:10"` } From dc0b4929519a86452d0e3bc157b5da0e7a4d6a71 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 10 Oct 2025 14:26:15 +0700 Subject: [PATCH 143/190] wip --- .../main-entities/person-address/dto.go | 43 +++++++++++-------- .../postal-region/base/entity.go | 2 +- .../interface/main-handler/main-handler.go | 4 +- .../{postal-code => postal-region}/handler.go | 6 +-- .../use-case/main-use-case/patient/lib.go | 2 +- .../main-use-case/person-address/helper.go | 2 +- .../{postal-code => postal-region}/case.go | 18 ++++---- .../{postal-code => postal-region}/helper.go | 6 +-- .../{postal-code => postal-region}/lib.go | 22 +++++----- .../middleware-runner.go | 14 +++--- .../middleware.go | 2 +- .../{postal-code => postal-region}/tycovar.go | 10 ++--- 12 files changed, 70 insertions(+), 61 deletions(-) rename internal/interface/main-handler/{postal-code => postal-region}/handler.go (91%) rename internal/use-case/main-use-case/{postal-code => postal-region}/case.go (95%) rename internal/use-case/main-use-case/{postal-code => postal-region}/helper.go (81%) rename internal/use-case/main-use-case/{postal-code => postal-region}/lib.go (86%) rename internal/use-case/main-use-case/{postal-code => postal-region}/middleware-runner.go (86%) rename internal/use-case/main-use-case/{postal-code => postal-region}/middleware.go (90%) rename internal/use-case/main-use-case/{postal-code => postal-region}/tycovar.go (76%) diff --git a/internal/domain/main-entities/person-address/dto.go b/internal/domain/main-entities/person-address/dto.go index 82577910..271ec944 100644 --- a/internal/domain/main-entities/person-address/dto.go +++ b/internal/domain/main-entities/person-address/dto.go @@ -2,14 +2,19 @@ package personaddress import ( ecore "simrs-vx/internal/domain/base-entities/core" + epr "simrs-vx/internal/domain/main-entities/postal-region" + + erp "simrs-vx/internal/domain/references/person" ) type CreateDto struct { - Person_Id uint `json:"person_id"` - Address string `json:"address" validate:"maxLength=150"` - Rt string `json:"rt" validate:"maxLength=2"` - Rw string `json:"rw" validate:"maxLength=2"` - Village_Code *string `json:"village_code" validate:"maxLength=10"` + Person_Id uint `json:"person_id"` + LocationType_Code erp.AddressLocationTypeCode `json:"locationType_code" validate:"maxLength=10"` + Address string `json:"address" validate:"maxLength=150"` + Rt string `json:"rt" validate:"maxLength=2"` + Rw string `json:"rw" validate:"maxLength=2"` + PostalRegion_Code *string `json:"postalRegion_code" validate:"maxLength=6"` + Village_Code *string `json:"village_code" validate:"maxLength=10"` } type ReadListDto struct { @@ -38,22 +43,26 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Person_Id uint `json:"person_id"` - Address string `json:"address"` - Rt string `json:"rt"` - Rw string `json:"rw"` - Village_Code *string `json:"village_code"` + Person_Id uint `json:"person_id"` + LocationType_Code erp.AddressLocationTypeCode `json:"locationType_code"` + Address string `json:"address"` + Rt string `json:"rt"` + Rw string `json:"rw"` + PostalRegion_Code *string `json:"postalRegion_code"` + PostalRegion *epr.PostalRegion `json:"postalRegion,omitempty"` + Village_Code *string `json:"village_code"` } func (d PersonAddress) ToResponse() ResponseDto { resp := ResponseDto{ - Person_Id: d.Person_Id, - Address: d.Address, - Rt: d.Rt, - Rw: d.Rw, - Village_Code: d.Village_Code, - PostalCode_Code: d.PostalCode_Code, - PostalCode: d.PostalCode, + Person_Id: d.Person_Id, + LocationType_Code: d.LocationType_Code, + Address: d.Address, + Rt: d.Rt, + Rw: d.Rw, + Village_Code: d.Village_Code, + PostalRegion_Code: d.PostalRegion_Code, + PostalRegion: d.PostalRegion, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/postal-region/base/entity.go b/internal/domain/main-entities/postal-region/base/entity.go index 0ceeada7..6cec2766 100644 --- a/internal/domain/main-entities/postal-region/base/entity.go +++ b/internal/domain/main-entities/postal-region/base/entity.go @@ -7,5 +7,5 @@ type Basic struct { } func (Basic) TableName() string { - return "PostalCode" + return "PostalRegion" } diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 0d9fd969..590aa27b 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -87,7 +87,7 @@ import ( uom "simrs-vx/internal/interface/main-handler/uom" district "simrs-vx/internal/interface/main-handler/district" - postalcode "simrs-vx/internal/interface/main-handler/postal-code" + postalregion "simrs-vx/internal/interface/main-handler/postal-region" province "simrs-vx/internal/interface/main-handler/province" regency "simrs-vx/internal/interface/main-handler/regency" village "simrs-vx/internal/interface/main-handler/village" @@ -293,7 +293,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/district", district.O) hc.RegCrud(r, "/v1/regency", regency.O) hc.RegCrud(r, "/v1/province", province.O) - hc.RegCrud(r, "/v1/postal-code", postalcode.O) + hc.RegCrud(r, "/v1/postal-code", postalregion.O) ///// return cmw.SetCors(handlerlogger.SetLog(r)) diff --git a/internal/interface/main-handler/postal-code/handler.go b/internal/interface/main-handler/postal-region/handler.go similarity index 91% rename from internal/interface/main-handler/postal-code/handler.go rename to internal/interface/main-handler/postal-region/handler.go index d6c3dc1e..baf3b2d6 100644 --- a/internal/interface/main-handler/postal-code/handler.go +++ b/internal/interface/main-handler/postal-region/handler.go @@ -1,4 +1,4 @@ -package postalcode +package postalregion import ( "net/http" @@ -8,8 +8,8 @@ import ( // ua "github.com/karincake/tumpeng/auth/svc" - e "simrs-vx/internal/domain/main-entities/postal-code" - u "simrs-vx/internal/use-case/main-use-case/postal-code" + e "simrs-vx/internal/domain/main-entities/postal-region" + u "simrs-vx/internal/use-case/main-use-case/postal-region" ) type myBase struct{} diff --git a/internal/use-case/main-use-case/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index fb864f84..b7d2d966 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -102,7 +102,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e Preload("Person.Contacts"). Preload("Person.Relatives.Village.District.Regency.Province"). Preload("Person.Addresses"). - Preload("Person.Addresses.PostalCode.Village.District.Regency.Province") + Preload("Person.Addresses.PostalRegion.Village.District.Regency.Province") if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { diff --git a/internal/use-case/main-use-case/person-address/helper.go b/internal/use-case/main-use-case/person-address/helper.go index 60712837..537afeac 100644 --- a/internal/use-case/main-use-case/person-address/helper.go +++ b/internal/use-case/main-use-case/person-address/helper.go @@ -22,5 +22,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PersonAddress) { data.Rt = inputSrc.Rt data.Rw = inputSrc.Rw data.Village_Code = inputSrc.Village_Code - data.PostalCode_Code = inputSrc.PostalCode_Code + data.PostalRegion_Code = inputSrc.PostalRegion_Code } diff --git a/internal/use-case/main-use-case/postal-code/case.go b/internal/use-case/main-use-case/postal-region/case.go similarity index 95% rename from internal/use-case/main-use-case/postal-code/case.go rename to internal/use-case/main-use-case/postal-region/case.go index 0bdefae5..1c175e42 100644 --- a/internal/use-case/main-use-case/postal-code/case.go +++ b/internal/use-case/main-use-case/postal-region/case.go @@ -1,7 +1,7 @@ -package postalcode +package postalregion import ( - e "simrs-vx/internal/domain/main-entities/postal-code" + e "simrs-vx/internal/domain/main-entities/postal-region" "strconv" dg "github.com/karincake/apem/db-gorm-pg" @@ -13,10 +13,10 @@ import ( "gorm.io/gorm" ) -const source = "postal-code" +const source = "postal-region" func Create(input e.CreateDto) (*d.Data, error) { - data := e.PostalCode{} + data := e.PostalRegion{} event := pl.Event{ Feature: "Create", @@ -66,8 +66,8 @@ func Create(input e.CreateDto) (*d.Data, error) { } func ReadList(input e.ReadListDto) (*d.Data, error) { - var data *e.PostalCode - var dataList []e.PostalCode + var data *e.PostalRegion + var dataList []e.PostalRegion var metaList *e.MetaDto var err error @@ -122,7 +122,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { } func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { - var data *e.PostalCode + var data *e.PostalRegion var err error event := pl.Event{ @@ -170,7 +170,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { func Update(input e.UpdateDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id} - var data *e.PostalCode + var data *e.PostalRegion var err error event := pl.Event{ @@ -226,7 +226,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { func Delete(input e.DeleteDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id} - var data *e.PostalCode + var data *e.PostalRegion var err error event := pl.Event{ diff --git a/internal/use-case/main-use-case/postal-code/helper.go b/internal/use-case/main-use-case/postal-region/helper.go similarity index 81% rename from internal/use-case/main-use-case/postal-code/helper.go rename to internal/use-case/main-use-case/postal-region/helper.go index 1217f5e9..65114fbe 100644 --- a/internal/use-case/main-use-case/postal-code/helper.go +++ b/internal/use-case/main-use-case/postal-region/helper.go @@ -2,13 +2,13 @@ DESCRIPTION: Any functions that are used internally by the use-case */ -package postalcode +package postalregion import ( - e "simrs-vx/internal/domain/main-entities/postal-code" + e "simrs-vx/internal/domain/main-entities/postal-region" ) -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PostalCode) { +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PostalRegion) { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT diff --git a/internal/use-case/main-use-case/postal-code/lib.go b/internal/use-case/main-use-case/postal-region/lib.go similarity index 86% rename from internal/use-case/main-use-case/postal-code/lib.go rename to internal/use-case/main-use-case/postal-region/lib.go index abead91a..c6d2e998 100644 --- a/internal/use-case/main-use-case/postal-code/lib.go +++ b/internal/use-case/main-use-case/postal-region/lib.go @@ -1,7 +1,7 @@ -package postalcode +package postalregion import ( - e "simrs-vx/internal/domain/main-entities/postal-code" + e "simrs-vx/internal/domain/main-entities/postal-region" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" @@ -12,10 +12,10 @@ import ( "gorm.io/gorm" ) -func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PostalCode, error) { +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PostalRegion, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := e.PostalCode{} + data := e.PostalRegion{} setData(&input, &data) var tx *gorm.DB @@ -33,9 +33,9 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PostalC return &data, nil } -func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.PostalCode, *e.MetaDto, error) { +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.PostalRegion, *e.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") - data := []e.PostalCode{} + data := []e.PostalRegion{} pagination := gh.Pagination{} count := int64(0) meta := e.MetaDto{} @@ -54,7 +54,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Po } tx = tx. - Model(&e.PostalCode{}). + Model(&e.PostalRegion{}). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -81,9 +81,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Po return data, &meta, nil } -func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.PostalCode, error) { +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.PostalRegion, error) { pl.SetLogInfo(event, input, "started", "DBReadDetail") - data := e.PostalCode{} + data := e.PostalRegion{} var tx *gorm.DB if len(dbx) > 0 { @@ -107,7 +107,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(input e.UpdateDto, data *e.PostalCode, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateData(input e.UpdateDto, data *e.PostalRegion, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") setData(&input, data) @@ -132,7 +132,7 @@ func UpdateData(input e.UpdateDto, data *e.PostalCode, event *pl.Event, dbx ...* return nil } -func DeleteData(data *e.PostalCode, event *pl.Event, dbx ...*gorm.DB) error { +func DeleteData(data *e.PostalRegion, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBDelete") var tx *gorm.DB if len(dbx) > 0 { diff --git a/internal/use-case/main-use-case/postal-code/middleware-runner.go b/internal/use-case/main-use-case/postal-region/middleware-runner.go similarity index 86% rename from internal/use-case/main-use-case/postal-code/middleware-runner.go rename to internal/use-case/main-use-case/postal-region/middleware-runner.go index b06faf2b..8686be7d 100644 --- a/internal/use-case/main-use-case/postal-code/middleware-runner.go +++ b/internal/use-case/main-use-case/postal-region/middleware-runner.go @@ -1,7 +1,7 @@ -package postalcode +package postalregion import ( - e "simrs-vx/internal/domain/main-entities/postal-code" + e "simrs-vx/internal/domain/main-entities/postal-region" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -23,7 +23,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.PostalCode) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.PostalRegion) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -38,7 +38,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e return nil } -func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.PostalCode) error { +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.PostalRegion) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -53,7 +53,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu return nil } -func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalCode) error { +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalRegion) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -68,7 +68,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalCode) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalRegion) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -83,7 +83,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalCode) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PostalRegion) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) diff --git a/internal/use-case/main-use-case/postal-code/middleware.go b/internal/use-case/main-use-case/postal-region/middleware.go similarity index 90% rename from internal/use-case/main-use-case/postal-code/middleware.go rename to internal/use-case/main-use-case/postal-region/middleware.go index a11c3e01..d96a57d3 100644 --- a/internal/use-case/main-use-case/postal-code/middleware.go +++ b/internal/use-case/main-use-case/postal-region/middleware.go @@ -1,4 +1,4 @@ -package postalcode +package postalregion // example of middleware // func init() { diff --git a/internal/use-case/main-use-case/postal-code/tycovar.go b/internal/use-case/main-use-case/postal-region/tycovar.go similarity index 76% rename from internal/use-case/main-use-case/postal-code/tycovar.go rename to internal/use-case/main-use-case/postal-region/tycovar.go index 2c307323..71278f43 100644 --- a/internal/use-case/main-use-case/postal-code/tycovar.go +++ b/internal/use-case/main-use-case/postal-region/tycovar.go @@ -6,27 +6,27 @@ In this sample it also provides type and variable regarding the needs of the middleware to separate from main use-case which has the basic CRUD functionality. The purpose of this is to make the code more maintainable. */ -package postalcode +package postalregion import ( "gorm.io/gorm" - e "simrs-vx/internal/domain/main-entities/postal-code" + e "simrs-vx/internal/domain/main-entities/postal-region" ) type createMw struct { Name string - Func func(input *e.CreateDto, data *e.PostalCode, tx *gorm.DB) error + Func func(input *e.CreateDto, data *e.PostalRegion, tx *gorm.DB) error } type readListMw struct { Name string - Func func(input *e.ReadListDto, data *e.PostalCode, tx *gorm.DB) error + Func func(input *e.ReadListDto, data *e.PostalRegion, tx *gorm.DB) error } type readDetailMw struct { Name string - Func func(input *e.ReadDetailDto, data *e.PostalCode, tx *gorm.DB) error + Func func(input *e.ReadDetailDto, data *e.PostalRegion, tx *gorm.DB) error } type UpdateMw = readDetailMw From 1cc9ef024e1e21a5a64322544384a98e0e1ccd52 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 10 Oct 2025 14:28:44 +0700 Subject: [PATCH 144/190] add fk village into person-address --- cmd/main-migration/migrations/20251010072711.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 5 +++-- internal/domain/main-entities/person-address/entity.go | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 cmd/main-migration/migrations/20251010072711.sql diff --git a/cmd/main-migration/migrations/20251010072711.sql b/cmd/main-migration/migrations/20251010072711.sql new file mode 100644 index 00000000..f4b24a4f --- /dev/null +++ b/cmd/main-migration/migrations/20251010072711.sql @@ -0,0 +1,2 @@ +-- Modify "PersonAddress" table +ALTER TABLE "public"."PersonAddress" ADD CONSTRAINT "fk_PersonAddress_Village" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 57b78283..a57cdcab 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:4FXkpgFh3UpHN247wDhhSP9RpYGEvS0rwSbd5mEeFZ4= +h1:ZNIY96E0dkcsqT7l3071AqNKR/aee/WJFYKwNWcL+pw= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -35,4 +35,5 @@ h1:4FXkpgFh3UpHN247wDhhSP9RpYGEvS0rwSbd5mEeFZ4= 20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= 20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= 20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= -20251010070721.sql h1:+tKik0+V3yNWiLX4rW3pxw93ceBCCtqXDFqSHyzwnXo= +20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= +20251010072711.sql h1:0xPdW7LNs9vb0g6H4rkNlF4yjjP4rIT6a5rZnDxWBxM= diff --git a/internal/domain/main-entities/person-address/entity.go b/internal/domain/main-entities/person-address/entity.go index 4b05634c..65d71912 100644 --- a/internal/domain/main-entities/person-address/entity.go +++ b/internal/domain/main-entities/person-address/entity.go @@ -3,6 +3,7 @@ package personaddress import ( ecore "simrs-vx/internal/domain/base-entities/core" epr "simrs-vx/internal/domain/main-entities/postal-region" + ev "simrs-vx/internal/domain/main-entities/village" erp "simrs-vx/internal/domain/references/person" ) @@ -17,4 +18,5 @@ type PersonAddress struct { PostalRegion_Code *string `json:"postalRegion_code" gorm:"size:6"` PostalRegion *epr.PostalRegion `json:"postalRegion,omitempty" gorm:"foreignKey:PostalRegion_Code;references:Code"` Village_Code *string `json:"village_code" gorm:"size:10"` + Village *ev.Village `json:"village,omitempty" gorm:"foreignKey:Village_Code;references:Code"` } From 0b93070217cb9df566d7f7766d42e4341db88090 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 10 Oct 2025 14:38:14 +0700 Subject: [PATCH 145/190] feat (patient): adjust read detail after postalcode renamed --- internal/domain/main-entities/person-address/dto.go | 5 ++++- internal/interface/main-handler/main-handler.go | 2 +- internal/use-case/main-use-case/patient/lib.go | 2 +- internal/use-case/main-use-case/person-address/helper.go | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/internal/domain/main-entities/person-address/dto.go b/internal/domain/main-entities/person-address/dto.go index 271ec944..64be2822 100644 --- a/internal/domain/main-entities/person-address/dto.go +++ b/internal/domain/main-entities/person-address/dto.go @@ -3,6 +3,7 @@ package personaddress import ( ecore "simrs-vx/internal/domain/base-entities/core" epr "simrs-vx/internal/domain/main-entities/postal-region" + ev "simrs-vx/internal/domain/main-entities/village" erp "simrs-vx/internal/domain/references/person" ) @@ -51,6 +52,7 @@ type ResponseDto struct { PostalRegion_Code *string `json:"postalRegion_code"` PostalRegion *epr.PostalRegion `json:"postalRegion,omitempty"` Village_Code *string `json:"village_code"` + Village *ev.Village `json:"village,omitempty"` } func (d PersonAddress) ToResponse() ResponseDto { @@ -60,9 +62,10 @@ func (d PersonAddress) ToResponse() ResponseDto { Address: d.Address, Rt: d.Rt, Rw: d.Rw, - Village_Code: d.Village_Code, PostalRegion_Code: d.PostalRegion_Code, PostalRegion: d.PostalRegion, + Village_Code: d.Village_Code, + Village: d.Village, } resp.Main = d.Main return resp diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 590aa27b..5eb85084 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -293,7 +293,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/district", district.O) hc.RegCrud(r, "/v1/regency", regency.O) hc.RegCrud(r, "/v1/province", province.O) - hc.RegCrud(r, "/v1/postal-code", postalregion.O) + hc.RegCrud(r, "/v1/postal-region", postalregion.O) ///// return cmw.SetCors(handlerlogger.SetLog(r)) diff --git a/internal/use-case/main-use-case/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index b7d2d966..4ead199c 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -101,7 +101,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e Preload("Person.Language"). Preload("Person.Contacts"). Preload("Person.Relatives.Village.District.Regency.Province"). - Preload("Person.Addresses"). + Preload("Person.Addresses.Village.District.Regency.Province"). Preload("Person.Addresses.PostalRegion.Village.District.Regency.Province") if err := tx.First(&data, input.Id).Error; err != nil { diff --git a/internal/use-case/main-use-case/person-address/helper.go b/internal/use-case/main-use-case/person-address/helper.go index 537afeac..f9b880b7 100644 --- a/internal/use-case/main-use-case/person-address/helper.go +++ b/internal/use-case/main-use-case/person-address/helper.go @@ -18,6 +18,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PersonAddress) { } data.Person_Id = inputSrc.Person_Id + data.LocationType_Code = inputSrc.LocationType_Code data.Address = inputSrc.Address data.Rt = inputSrc.Rt data.Rw = inputSrc.Rw From 8a1635981edea65bd3ef5fb99d3624b37de75dd7 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 10 Oct 2025 14:44:41 +0700 Subject: [PATCH 146/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 78 ++++++++++++------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index a57cdcab..a192025a 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,39 +1,39 @@ -h1:ZNIY96E0dkcsqT7l3071AqNKR/aee/WJFYKwNWcL+pw= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= -20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= -20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= -20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= -20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= -20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= -20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= -20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= -20251010072711.sql h1:0xPdW7LNs9vb0g6H4rkNlF4yjjP4rIT6a5rZnDxWBxM= +h1:IJbvAMMv47bOtI09AJew68Buh1nnFvsc9lgpX+BrUYA= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= +20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= +20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= +20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= +20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= +20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= +20251010031743.sql h1:SgHNY/lQ88G2F4nZyMfiOkDntb+gtOR+nEQLqXBTwv4= +20251010070721.sql h1:AnJnhXsMzDvK4AFgYw6B16Kpo/hljrZtcpc9m2VOSHQ= +20251010072711.sql h1:aXPTtNwLcTuw8C/yAxwxvqs0ayEjNzI1uuE0vE3ERa8= From 5f88e912c8c88f3aa0ecefd1f882fbe556be0ebc Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sat, 11 Oct 2025 08:07:00 +0700 Subject: [PATCH 147/190] feat (user): add several position --- internal/use-case/main-use-case/user/case.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/use-case/main-use-case/user/case.go b/internal/use-case/main-use-case/user/case.go index 24f9c6da..ba5859ee 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -160,6 +160,8 @@ func Create(input e.CreateDto) (*d.Data, error) { if _, err := um.CreateData(em.CreateDto(createMidwife), &event, tx); err != nil { return err } + case ero.UPCReg, ero.UPCHur, ero.UPCGea, ero.UPCMan: + // do nothing default: return errors.New("invalid employee position") } @@ -505,6 +507,8 @@ func Update(input e.UpdateDto) (*d.Data, error) { if _, err := um.CreateData(createMidwife, &event, tx); err != nil { return err } + case ero.UPCReg, ero.UPCHur, ero.UPCGea, ero.UPCMan: + // do nothing default: return errors.New("invalid employee position") } From 1e77a82866c61144b8e8148fc21f01ad78d0a779 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sat, 11 Oct 2025 10:34:52 +0700 Subject: [PATCH 148/190] adjust after getuk updated --- assets/language/en/data.json | 1 + go.mod | 4 +- internal/domain/main-entities/adime/dto.go | 3 +- .../domain/main-entities/ambulatory/dto.go | 3 +- internal/domain/main-entities/chemo/dto.go | 3 +- .../domain/main-entities/consultation/dto.go | 3 +- .../main-entities/device-order-item/dto.go | 3 +- .../domain/main-entities/device-order/dto.go | 3 +- internal/domain/main-entities/device/dto.go | 5 +- .../domain/main-entities/diagnose-src/dto.go | 5 +- internal/domain/main-entities/district/dto.go | 5 +- .../main-entities/division-position/dto.go | 5 +- internal/domain/main-entities/division/dto.go | 5 +- .../domain/main-entities/doctor-fee/dto.go | 3 +- internal/domain/main-entities/doctor/dto.go | 3 +- .../domain/main-entities/emergency/dto.go | 3 +- internal/domain/main-entities/employee/dto.go | 3 +- .../domain/main-entities/encounter/dto.go | 3 +- internal/domain/main-entities/ethnic/dto.go | 5 +- internal/domain/main-entities/infra/dto.go | 5 +- .../domain/main-entities/inpatient/dto.go | 3 +- .../domain/main-entities/installation/dto.go | 5 +- .../main-entities/insurance-company/dto.go | 5 +- .../domain/main-entities/item-price/dto.go | 3 +- internal/domain/main-entities/item/dto.go | 5 +- internal/domain/main-entities/laborant/dto.go | 3 +- internal/domain/main-entities/language/dto.go | 1 - .../main-entities/material-order-item/dto.go | 3 +- .../main-entities/material-order/dto.go | 3 +- internal/domain/main-entities/material/dto.go | 5 +- .../main-entities/mcu-order-item/dto.go | 3 +- .../main-entities/mcu-order-sub-item/dto.go | 3 +- .../domain/main-entities/mcu-order/dto.go | 3 +- .../main-entities/mcu-src-category/dto.go | 5 +- internal/domain/main-entities/mcu-src/dto.go | 5 +- .../domain/main-entities/mcu-sub-src/dto.go | 5 +- .../medical-action-src-item/dto.go | 3 +- .../main-entities/medical-action-src/dto.go | 5 +- .../main-entities/medication-item-dist/dto.go | 3 +- .../domain/main-entities/medication/dto.go | 3 +- .../main-entities/medicine-group/dto.go | 5 +- .../main-entities/medicine-method/dto.go | 5 +- .../main-entities/medicine-mix-item/dto.go | 3 +- internal/domain/main-entities/medicine/dto.go | 5 +- internal/domain/main-entities/midwife/dto.go | 3 +- internal/domain/main-entities/nurse/dto.go | 3 +- .../domain/main-entities/nutritionist/dto.go | 3 +- internal/domain/main-entities/patient/dto.go | 3 +- internal/domain/main-entities/person/dto.go | 3 +- .../domain/main-entities/pharmacist/dto.go | 3 +- .../main-entities/pharmacy-company/dto.go | 5 +- .../domain/main-entities/postal-region/dto.go | 5 +- .../main-entities/practice-schedule/dto.go | 3 +- .../main-entities/prescription-item/dto.go | 3 +- .../domain/main-entities/prescription/dto.go | 3 +- .../domain/main-entities/procedure-src/dto.go | 5 +- internal/domain/main-entities/province/dto.go | 5 +- internal/domain/main-entities/regency/dto.go | 5 +- internal/domain/main-entities/room/dto.go | 3 +- internal/domain/main-entities/sbar/dto.go | 3 +- internal/domain/main-entities/soapi/dto.go | 3 +- .../main-entities/specialist-intern/dto.go | 3 +- .../domain/main-entities/specialist/dto.go | 5 +- .../domain/main-entities/subspecialist/dto.go | 5 +- internal/domain/main-entities/unit/dto.go | 5 +- internal/domain/main-entities/uom/dto.go | 5 +- internal/domain/main-entities/village/dto.go | 5 +- internal/use-case/main-use-case/adime/case.go | 3 -- internal/use-case/main-use-case/adime/lib.go | 17 ++---- .../use-case/main-use-case/ambulatory/case.go | 3 -- .../use-case/main-use-case/ambulatory/lib.go | 17 ++---- internal/use-case/main-use-case/chemo/case.go | 3 -- internal/use-case/main-use-case/chemo/lib.go | 17 ++---- .../main-use-case/consultation/case.go | 3 -- .../main-use-case/consultation/lib.go | 17 ++---- .../use-case/main-use-case/counter/lib.go | 10 +--- .../main-use-case/device-order-item/case.go | 3 -- .../main-use-case/device-order-item/lib.go | 17 ++---- .../main-use-case/device-order/case.go | 3 -- .../main-use-case/device-order/lib.go | 17 ++---- .../use-case/main-use-case/device/case.go | 3 -- internal/use-case/main-use-case/device/lib.go | 17 ++---- .../main-use-case/diagnose-src/case.go | 3 -- .../main-use-case/diagnose-src/lib.go | 17 ++---- .../use-case/main-use-case/district/case.go | 3 -- .../use-case/main-use-case/district/lib.go | 17 ++---- .../main-use-case/division-position/case.go | 3 -- .../main-use-case/division-position/lib.go | 18 ++----- .../use-case/main-use-case/division/case.go | 3 -- .../use-case/main-use-case/division/lib.go | 17 ++---- .../use-case/main-use-case/doctor-fee/case.go | 3 -- .../use-case/main-use-case/doctor-fee/lib.go | 17 ++---- .../use-case/main-use-case/doctor/case.go | 3 -- internal/use-case/main-use-case/doctor/lib.go | 17 ++---- .../use-case/main-use-case/emergency/case.go | 3 -- .../use-case/main-use-case/emergency/lib.go | 17 ++---- .../use-case/main-use-case/employee/case.go | 3 -- .../use-case/main-use-case/employee/lib.go | 17 ++---- .../use-case/main-use-case/encounter/case.go | 3 -- .../use-case/main-use-case/encounter/lib.go | 17 ++---- .../use-case/main-use-case/ethnic/case.go | 3 -- internal/use-case/main-use-case/ethnic/lib.go | 11 ++-- internal/use-case/main-use-case/infra/case.go | 3 -- internal/use-case/main-use-case/infra/lib.go | 17 ++---- .../use-case/main-use-case/inpatient/case.go | 3 -- .../use-case/main-use-case/inpatient/lib.go | 17 ++---- .../main-use-case/installation/case.go | 3 -- .../main-use-case/installation/lib.go | 17 ++---- .../main-use-case/insurance-company/case.go | 3 -- .../main-use-case/insurance-company/lib.go | 17 ++---- .../use-case/main-use-case/item-price/case.go | 3 -- .../use-case/main-use-case/item-price/lib.go | 17 ++---- internal/use-case/main-use-case/item/case.go | 3 -- internal/use-case/main-use-case/item/lib.go | 17 ++---- .../use-case/main-use-case/laborant/case.go | 3 -- .../use-case/main-use-case/laborant/lib.go | 17 ++---- .../use-case/main-use-case/language/case.go | 3 -- .../use-case/main-use-case/language/lib.go | 11 ++-- .../main-use-case/material-order-item/case.go | 3 -- .../main-use-case/material-order-item/lib.go | 17 ++---- .../main-use-case/material-order/case.go | 3 -- .../main-use-case/material-order/lib.go | 17 ++---- .../use-case/main-use-case/material/case.go | 3 -- .../use-case/main-use-case/material/lib.go | 17 ++---- .../main-use-case/mcu-order-item/case.go | 3 -- .../main-use-case/mcu-order-item/lib.go | 17 ++---- .../main-use-case/mcu-order-sub-item/case.go | 3 -- .../main-use-case/mcu-order-sub-item/lib.go | 17 ++---- .../use-case/main-use-case/mcu-order/case.go | 3 -- .../use-case/main-use-case/mcu-order/lib.go | 17 ++---- .../main-use-case/mcu-src-category/case.go | 3 -- .../main-use-case/mcu-src-category/lib.go | 17 ++---- .../use-case/main-use-case/mcu-src/case.go | 3 -- .../use-case/main-use-case/mcu-src/lib.go | 17 ++---- .../main-use-case/mcu-sub-src/case.go | 3 -- .../use-case/main-use-case/mcu-sub-src/lib.go | 17 ++---- .../medical-action-src-item/case.go | 3 -- .../medical-action-src-item/lib.go | 17 ++---- .../main-use-case/medical-action-src/case.go | 3 -- .../main-use-case/medical-action-src/lib.go | 17 ++---- .../medication-item-dist/case.go | 3 -- .../main-use-case/medication-item-dist/lib.go | 17 ++---- .../main-use-case/medication-item/case.go | 3 -- .../main-use-case/medication-item/lib.go | 17 ++---- .../use-case/main-use-case/medication/case.go | 3 -- .../use-case/main-use-case/medication/lib.go | 17 ++---- .../main-use-case/medicine-group/case.go | 3 -- .../main-use-case/medicine-group/lib.go | 17 ++---- .../main-use-case/medicine-method/case.go | 3 -- .../main-use-case/medicine-method/lib.go | 17 ++---- .../main-use-case/medicine-mix-item/case.go | 3 -- .../main-use-case/medicine-mix-item/lib.go | 17 ++---- .../use-case/main-use-case/medicine/case.go | 3 -- .../use-case/main-use-case/medicine/lib.go | 17 ++---- .../use-case/main-use-case/midwife/case.go | 3 -- .../use-case/main-use-case/midwife/lib.go | 17 ++---- internal/use-case/main-use-case/nurse/case.go | 3 -- internal/use-case/main-use-case/nurse/lib.go | 17 ++---- .../main-use-case/nutritionist/case.go | 3 -- .../main-use-case/nutritionist/lib.go | 17 ++---- .../use-case/main-use-case/patient/case.go | 3 -- .../use-case/main-use-case/patient/lib.go | 17 ++---- .../use-case/main-use-case/person/case.go | 3 -- internal/use-case/main-use-case/person/lib.go | 17 ++---- .../use-case/main-use-case/pharmacist/case.go | 3 -- .../use-case/main-use-case/pharmacist/lib.go | 17 ++---- .../main-use-case/pharmacy-company/case.go | 3 -- .../main-use-case/pharmacy-company/lib.go | 17 ++---- .../main-use-case/postal-region/case.go | 3 -- .../main-use-case/postal-region/lib.go | 17 ++---- .../main-use-case/practice-schedule/case.go | 3 -- .../main-use-case/practice-schedule/lib.go | 17 ++---- .../main-use-case/prescription-item/case.go | 3 -- .../main-use-case/prescription-item/lib.go | 19 ++----- .../main-use-case/prescription/case.go | 3 -- .../main-use-case/prescription/lib.go | 17 ++---- .../main-use-case/procedure-src/case.go | 3 -- .../main-use-case/procedure-src/lib.go | 11 ++-- .../use-case/main-use-case/province/case.go | 3 -- .../use-case/main-use-case/province/lib.go | 17 ++---- .../use-case/main-use-case/regency/case.go | 3 -- .../use-case/main-use-case/regency/lib.go | 17 ++---- internal/use-case/main-use-case/room/case.go | 3 -- internal/use-case/main-use-case/room/lib.go | 17 ++---- internal/use-case/main-use-case/sbar/case.go | 3 -- internal/use-case/main-use-case/sbar/lib.go | 17 ++---- internal/use-case/main-use-case/soapi/case.go | 3 -- internal/use-case/main-use-case/soapi/lib.go | 17 ++---- .../main-use-case/specialist-intern/case.go | 3 -- .../main-use-case/specialist-intern/lib.go | 17 ++---- .../use-case/main-use-case/specialist/case.go | 3 -- .../use-case/main-use-case/specialist/lib.go | 17 ++---- .../main-use-case/subspecialist/case.go | 3 -- .../main-use-case/subspecialist/lib.go | 17 ++---- internal/use-case/main-use-case/unit/case.go | 3 -- internal/use-case/main-use-case/unit/lib.go | 18 ++----- internal/use-case/main-use-case/uom/case.go | 3 -- internal/use-case/main-use-case/uom/lib.go | 17 ++---- .../use-case/main-use-case/village/case.go | 3 -- .../use-case/main-use-case/village/lib.go | 17 ++---- pkg/lib-helper/lib-helper.go | 52 +++++++++++++++++++ 201 files changed, 347 insertions(+), 1275 deletions(-) diff --git a/assets/language/en/data.json b/assets/language/en/data.json index d78f3424..ffea29e2 100644 --- a/assets/language/en/data.json +++ b/assets/language/en/data.json @@ -27,6 +27,7 @@ "data-notFound": "data or resource can not be found", "data-notFound-condition": "\"%v\" with %v \"%v\" can not be found", "data-get-fail": "get data failed, %v", + "data-get-invalid-relation": "database get failed, invalid relation", "data-update-fail": "failed to update data", "data-delete-success": "data has been deleted", "data-delete-fail": "failed to delete data", diff --git a/go.mod b/go.mod index 7fd2a149..d6f7fbe8 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/jackc/pgx/v5 v5.5.5 github.com/karincake/apem v0.0.17 github.com/karincake/dodol v0.0.1 - github.com/karincake/getuk v0.2.1 + github.com/karincake/getuk v0.3.1 github.com/karincake/hongkue v0.0.4 github.com/karincake/lepet v0.0.1 github.com/karincake/risoles v0.0.3 @@ -61,4 +61,4 @@ require ( gorm.io/driver/postgres v1.5.11 // indirect gorm.io/driver/sqlite v1.5.7 // indirect gorm.io/driver/sqlserver v1.5.4 // indirect -) +) \ No newline at end of file diff --git a/internal/domain/main-entities/adime/dto.go b/internal/domain/main-entities/adime/dto.go index d121c24b..49257154 100644 --- a/internal/domain/main-entities/adime/dto.go +++ b/internal/domain/main-entities/adime/dto.go @@ -21,8 +21,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/ambulatory/dto.go b/internal/domain/main-entities/ambulatory/dto.go index 79a69807..455f7f02 100644 --- a/internal/domain/main-entities/ambulatory/dto.go +++ b/internal/domain/main-entities/ambulatory/dto.go @@ -13,8 +13,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index dd432d43..19e5f803 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -21,8 +21,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/consultation/dto.go b/internal/domain/main-entities/consultation/dto.go index ea141ace..1b0e3cc5 100644 --- a/internal/domain/main-entities/consultation/dto.go +++ b/internal/domain/main-entities/consultation/dto.go @@ -20,8 +20,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/device-order-item/dto.go b/internal/domain/main-entities/device-order-item/dto.go index 7206e7db..e89d5fad 100644 --- a/internal/domain/main-entities/device-order-item/dto.go +++ b/internal/domain/main-entities/device-order-item/dto.go @@ -14,8 +14,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/device-order/dto.go b/internal/domain/main-entities/device-order/dto.go index e1c5c1ea..01ef34b2 100644 --- a/internal/domain/main-entities/device-order/dto.go +++ b/internal/domain/main-entities/device-order/dto.go @@ -20,8 +20,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/device/dto.go b/internal/domain/main-entities/device/dto.go index f10ccc86..1c874576 100644 --- a/internal/domain/main-entities/device/dto.go +++ b/internal/domain/main-entities/device/dto.go @@ -17,9 +17,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/diagnose-src/dto.go b/internal/domain/main-entities/diagnose-src/dto.go index d8af8e24..6266484a 100644 --- a/internal/domain/main-entities/diagnose-src/dto.go +++ b/internal/domain/main-entities/diagnose-src/dto.go @@ -12,9 +12,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/district/dto.go b/internal/domain/main-entities/district/dto.go index 1f3c4494..ae818d45 100644 --- a/internal/domain/main-entities/district/dto.go +++ b/internal/domain/main-entities/district/dto.go @@ -15,9 +15,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/division-position/dto.go b/internal/domain/main-entities/division-position/dto.go index c316c196..b93e0e98 100644 --- a/internal/domain/main-entities/division-position/dto.go +++ b/internal/domain/main-entities/division-position/dto.go @@ -16,9 +16,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index bf0fd6c8..95ea9119 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -12,9 +12,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination OnlyHaveChildren bool `json:"only-have-children"` } diff --git a/internal/domain/main-entities/doctor-fee/dto.go b/internal/domain/main-entities/doctor-fee/dto.go index 4bec752e..baaf5cbf 100644 --- a/internal/domain/main-entities/doctor-fee/dto.go +++ b/internal/domain/main-entities/doctor-fee/dto.go @@ -16,8 +16,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/doctor/dto.go b/internal/domain/main-entities/doctor/dto.go index 4f298795..62d5f5b4 100644 --- a/internal/domain/main-entities/doctor/dto.go +++ b/internal/domain/main-entities/doctor/dto.go @@ -19,8 +19,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/emergency/dto.go b/internal/domain/main-entities/emergency/dto.go index e37ba95d..99628b88 100644 --- a/internal/domain/main-entities/emergency/dto.go +++ b/internal/domain/main-entities/emergency/dto.go @@ -13,8 +13,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/employee/dto.go b/internal/domain/main-entities/employee/dto.go index d7b723f9..00891cc6 100644 --- a/internal/domain/main-entities/employee/dto.go +++ b/internal/domain/main-entities/employee/dto.go @@ -19,8 +19,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index b9057610..34b74d6a 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -33,8 +33,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/ethnic/dto.go b/internal/domain/main-entities/ethnic/dto.go index d21a1519..a8277e27 100644 --- a/internal/domain/main-entities/ethnic/dto.go +++ b/internal/domain/main-entities/ethnic/dto.go @@ -11,9 +11,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/infra/dto.go b/internal/domain/main-entities/infra/dto.go index 97675eaa..de566fad 100644 --- a/internal/domain/main-entities/infra/dto.go +++ b/internal/domain/main-entities/infra/dto.go @@ -22,9 +22,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination OnlyHaveChildren bool `json:"only-have-children"` } diff --git a/internal/domain/main-entities/inpatient/dto.go b/internal/domain/main-entities/inpatient/dto.go index c2191c6b..d92232dd 100644 --- a/internal/domain/main-entities/inpatient/dto.go +++ b/internal/domain/main-entities/inpatient/dto.go @@ -16,8 +16,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index df0469b2..55981981 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -14,9 +14,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/insurance-company/dto.go b/internal/domain/main-entities/insurance-company/dto.go index 6e51ca0c..e4104bf7 100644 --- a/internal/domain/main-entities/insurance-company/dto.go +++ b/internal/domain/main-entities/insurance-company/dto.go @@ -15,9 +15,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/item-price/dto.go b/internal/domain/main-entities/item-price/dto.go index 1a4ca2a4..5adde2e1 100644 --- a/internal/domain/main-entities/item-price/dto.go +++ b/internal/domain/main-entities/item-price/dto.go @@ -14,8 +14,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/item/dto.go b/internal/domain/main-entities/item/dto.go index c60d68f2..22be4c1a 100644 --- a/internal/domain/main-entities/item/dto.go +++ b/internal/domain/main-entities/item/dto.go @@ -17,9 +17,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/laborant/dto.go b/internal/domain/main-entities/laborant/dto.go index 3648455c..4397d2f1 100644 --- a/internal/domain/main-entities/laborant/dto.go +++ b/internal/domain/main-entities/laborant/dto.go @@ -12,8 +12,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/language/dto.go b/internal/domain/main-entities/language/dto.go index 744fefb4..069fbf50 100644 --- a/internal/domain/main-entities/language/dto.go +++ b/internal/domain/main-entities/language/dto.go @@ -12,7 +12,6 @@ type CreateDto struct { type ReadListDto struct { FilterDto Includes string `json:"includes"` - Preloads []string Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/material-order-item/dto.go b/internal/domain/main-entities/material-order-item/dto.go index 74b1f05f..b76792bf 100644 --- a/internal/domain/main-entities/material-order-item/dto.go +++ b/internal/domain/main-entities/material-order-item/dto.go @@ -14,8 +14,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/material-order/dto.go b/internal/domain/main-entities/material-order/dto.go index d2971a85..5485d2dd 100644 --- a/internal/domain/main-entities/material-order/dto.go +++ b/internal/domain/main-entities/material-order/dto.go @@ -20,8 +20,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/material/dto.go b/internal/domain/main-entities/material/dto.go index a9705cf8..18a93723 100644 --- a/internal/domain/main-entities/material/dto.go +++ b/internal/domain/main-entities/material/dto.go @@ -18,9 +18,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-order-item/dto.go b/internal/domain/main-entities/mcu-order-item/dto.go index 06ebd781..64e56a85 100644 --- a/internal/domain/main-entities/mcu-order-item/dto.go +++ b/internal/domain/main-entities/mcu-order-item/dto.go @@ -18,8 +18,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-order-sub-item/dto.go b/internal/domain/main-entities/mcu-order-sub-item/dto.go index a38376d3..615b0ee9 100644 --- a/internal/domain/main-entities/mcu-order-sub-item/dto.go +++ b/internal/domain/main-entities/mcu-order-sub-item/dto.go @@ -16,8 +16,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-order/dto.go b/internal/domain/main-entities/mcu-order/dto.go index a5e09f5e..caf3ef58 100644 --- a/internal/domain/main-entities/mcu-order/dto.go +++ b/internal/domain/main-entities/mcu-order/dto.go @@ -27,8 +27,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-src-category/dto.go b/internal/domain/main-entities/mcu-src-category/dto.go index a7ea9763..278c5e5c 100644 --- a/internal/domain/main-entities/mcu-src-category/dto.go +++ b/internal/domain/main-entities/mcu-src-category/dto.go @@ -14,9 +14,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-src/dto.go b/internal/domain/main-entities/mcu-src/dto.go index f0d0b8a0..96586057 100644 --- a/internal/domain/main-entities/mcu-src/dto.go +++ b/internal/domain/main-entities/mcu-src/dto.go @@ -14,9 +14,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/mcu-sub-src/dto.go b/internal/domain/main-entities/mcu-sub-src/dto.go index ef68edd1..f1b6d3bb 100644 --- a/internal/domain/main-entities/mcu-sub-src/dto.go +++ b/internal/domain/main-entities/mcu-sub-src/dto.go @@ -15,9 +15,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medical-action-src-item/dto.go b/internal/domain/main-entities/medical-action-src-item/dto.go index e60a12ed..540a6ca5 100644 --- a/internal/domain/main-entities/medical-action-src-item/dto.go +++ b/internal/domain/main-entities/medical-action-src-item/dto.go @@ -15,8 +15,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index 4fa6d833..c67a2429 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -13,9 +13,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medication-item-dist/dto.go b/internal/domain/main-entities/medication-item-dist/dto.go index 5186b99c..9790895a 100644 --- a/internal/domain/main-entities/medication-item-dist/dto.go +++ b/internal/domain/main-entities/medication-item-dist/dto.go @@ -18,8 +18,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medication/dto.go b/internal/domain/main-entities/medication/dto.go index abf91fc7..c2cf9d14 100644 --- a/internal/domain/main-entities/medication/dto.go +++ b/internal/domain/main-entities/medication/dto.go @@ -21,8 +21,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medicine-group/dto.go b/internal/domain/main-entities/medicine-group/dto.go index 5894558e..1f71debe 100644 --- a/internal/domain/main-entities/medicine-group/dto.go +++ b/internal/domain/main-entities/medicine-group/dto.go @@ -11,9 +11,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medicine-method/dto.go b/internal/domain/main-entities/medicine-method/dto.go index 48685259..4840fd27 100644 --- a/internal/domain/main-entities/medicine-method/dto.go +++ b/internal/domain/main-entities/medicine-method/dto.go @@ -11,9 +11,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medicine-mix-item/dto.go b/internal/domain/main-entities/medicine-mix-item/dto.go index 1790a207..e834e7ec 100644 --- a/internal/domain/main-entities/medicine-mix-item/dto.go +++ b/internal/domain/main-entities/medicine-mix-item/dto.go @@ -14,8 +14,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/medicine/dto.go b/internal/domain/main-entities/medicine/dto.go index 4c29fdb3..82431fc1 100644 --- a/internal/domain/main-entities/medicine/dto.go +++ b/internal/domain/main-entities/medicine/dto.go @@ -23,9 +23,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/midwife/dto.go b/internal/domain/main-entities/midwife/dto.go index 308f0559..d1adfdaf 100644 --- a/internal/domain/main-entities/midwife/dto.go +++ b/internal/domain/main-entities/midwife/dto.go @@ -12,8 +12,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/nurse/dto.go b/internal/domain/main-entities/nurse/dto.go index 11d4bfb8..1707f212 100644 --- a/internal/domain/main-entities/nurse/dto.go +++ b/internal/domain/main-entities/nurse/dto.go @@ -16,8 +16,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/nutritionist/dto.go b/internal/domain/main-entities/nutritionist/dto.go index f48160a2..df6365bf 100644 --- a/internal/domain/main-entities/nutritionist/dto.go +++ b/internal/domain/main-entities/nutritionist/dto.go @@ -12,8 +12,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index 26cac97e..d1d32324 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -27,8 +27,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/person/dto.go b/internal/domain/main-entities/person/dto.go index dfba0115..7fb6a235 100644 --- a/internal/domain/main-entities/person/dto.go +++ b/internal/domain/main-entities/person/dto.go @@ -36,8 +36,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/pharmacist/dto.go b/internal/domain/main-entities/pharmacist/dto.go index fd1bde79..4a04f8d2 100644 --- a/internal/domain/main-entities/pharmacist/dto.go +++ b/internal/domain/main-entities/pharmacist/dto.go @@ -12,8 +12,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/pharmacy-company/dto.go b/internal/domain/main-entities/pharmacy-company/dto.go index 42c512bf..2bb7e1ac 100644 --- a/internal/domain/main-entities/pharmacy-company/dto.go +++ b/internal/domain/main-entities/pharmacy-company/dto.go @@ -12,9 +12,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/postal-region/dto.go b/internal/domain/main-entities/postal-region/dto.go index f8e36c6a..bc3a0fdc 100644 --- a/internal/domain/main-entities/postal-region/dto.go +++ b/internal/domain/main-entities/postal-region/dto.go @@ -12,9 +12,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/practice-schedule/dto.go b/internal/domain/main-entities/practice-schedule/dto.go index 48f61543..00eea2ad 100644 --- a/internal/domain/main-entities/practice-schedule/dto.go +++ b/internal/domain/main-entities/practice-schedule/dto.go @@ -15,8 +15,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/prescription-item/dto.go b/internal/domain/main-entities/prescription-item/dto.go index 91922664..64b5f78f 100644 --- a/internal/domain/main-entities/prescription-item/dto.go +++ b/internal/domain/main-entities/prescription-item/dto.go @@ -25,8 +25,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/prescription/dto.go b/internal/domain/main-entities/prescription/dto.go index e05db349..431f1e2d 100644 --- a/internal/domain/main-entities/prescription/dto.go +++ b/internal/domain/main-entities/prescription/dto.go @@ -19,8 +19,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/procedure-src/dto.go b/internal/domain/main-entities/procedure-src/dto.go index 2e26164f..477a9885 100644 --- a/internal/domain/main-entities/procedure-src/dto.go +++ b/internal/domain/main-entities/procedure-src/dto.go @@ -12,9 +12,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/province/dto.go b/internal/domain/main-entities/province/dto.go index e8ea71ce..a7cc5a70 100644 --- a/internal/domain/main-entities/province/dto.go +++ b/internal/domain/main-entities/province/dto.go @@ -12,9 +12,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/regency/dto.go b/internal/domain/main-entities/regency/dto.go index f709f001..40682f43 100644 --- a/internal/domain/main-entities/regency/dto.go +++ b/internal/domain/main-entities/regency/dto.go @@ -15,9 +15,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/room/dto.go b/internal/domain/main-entities/room/dto.go index 808e1ee2..0ca2e8d4 100644 --- a/internal/domain/main-entities/room/dto.go +++ b/internal/domain/main-entities/room/dto.go @@ -17,8 +17,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/sbar/dto.go b/internal/domain/main-entities/sbar/dto.go index 4e3317a8..46cf69a8 100644 --- a/internal/domain/main-entities/sbar/dto.go +++ b/internal/domain/main-entities/sbar/dto.go @@ -21,8 +21,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/soapi/dto.go b/internal/domain/main-entities/soapi/dto.go index 2a431942..418a7fb8 100644 --- a/internal/domain/main-entities/soapi/dto.go +++ b/internal/domain/main-entities/soapi/dto.go @@ -24,8 +24,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/specialist-intern/dto.go b/internal/domain/main-entities/specialist-intern/dto.go index 1090793c..2d01c861 100644 --- a/internal/domain/main-entities/specialist-intern/dto.go +++ b/internal/domain/main-entities/specialist-intern/dto.go @@ -17,8 +17,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` + Includes string `json:"includes"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index e6d2dfa1..f1338c19 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -12,9 +12,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go index 797b089c..e28f96ae 100644 --- a/internal/domain/main-entities/subspecialist/dto.go +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -12,9 +12,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go index 06724859..10960609 100644 --- a/internal/domain/main-entities/unit/dto.go +++ b/internal/domain/main-entities/unit/dto.go @@ -13,9 +13,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/uom/dto.go b/internal/domain/main-entities/uom/dto.go index 4cfac41c..4feb5746 100644 --- a/internal/domain/main-entities/uom/dto.go +++ b/internal/domain/main-entities/uom/dto.go @@ -11,9 +11,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/domain/main-entities/village/dto.go b/internal/domain/main-entities/village/dto.go index 86a08055..bfa8cfc3 100644 --- a/internal/domain/main-entities/village/dto.go +++ b/internal/domain/main-entities/village/dto.go @@ -15,9 +15,8 @@ type CreateDto struct { type ReadListDto struct { FilterDto - Includes string `json:"includes"` - Preloads []string `json:"-"` - Sort string `json:"sort"` + Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } diff --git a/internal/use-case/main-use-case/adime/case.go b/internal/use-case/main-use-case/adime/case.go index 5d07ab13..01d101ae 100644 --- a/internal/use-case/main-use-case/adime/case.go +++ b/internal/use-case/main-use-case/adime/case.go @@ -107,9 +107,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/adime/lib.go b/internal/use-case/main-use-case/adime/lib.go index 5b0574fe..f198829d 100644 --- a/internal/use-case/main-use-case/adime/lib.go +++ b/internal/use-case/main-use-case/adime/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ad tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Adime{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ad if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/ambulatory/case.go b/internal/use-case/main-use-case/ambulatory/case.go index 312a9376..7a2bef47 100644 --- a/internal/use-case/main-use-case/ambulatory/case.go +++ b/internal/use-case/main-use-case/ambulatory/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/ambulatory/lib.go b/internal/use-case/main-use-case/ambulatory/lib.go index 2a68a980..6b89b0c7 100644 --- a/internal/use-case/main-use-case/ambulatory/lib.go +++ b/internal/use-case/main-use-case/ambulatory/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Am tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Ambulatory{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Am if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/chemo/case.go b/internal/use-case/main-use-case/chemo/case.go index 7167588b..541faa04 100644 --- a/internal/use-case/main-use-case/chemo/case.go +++ b/internal/use-case/main-use-case/chemo/case.go @@ -91,9 +91,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/chemo/lib.go b/internal/use-case/main-use-case/chemo/lib.go index 0fa1d51e..39679170 100644 --- a/internal/use-case/main-use-case/chemo/lib.go +++ b/internal/use-case/main-use-case/chemo/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Chemo{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/consultation/case.go b/internal/use-case/main-use-case/consultation/case.go index 1b20d463..3cda31d9 100644 --- a/internal/use-case/main-use-case/consultation/case.go +++ b/internal/use-case/main-use-case/consultation/case.go @@ -97,9 +97,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/consultation/lib.go b/internal/use-case/main-use-case/consultation/lib.go index 2cb2753b..4ff9e7e2 100644 --- a/internal/use-case/main-use-case/consultation/lib.go +++ b/internal/use-case/main-use-case/consultation/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Co tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Consultation{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Co if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/counter/lib.go b/internal/use-case/main-use-case/counter/lib.go index 1a28e29a..022fa622 100644 --- a/internal/use-case/main-use-case/counter/lib.go +++ b/internal/use-case/main-use-case/counter/lib.go @@ -58,15 +58,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Co if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/device-order-item/case.go b/internal/use-case/main-use-case/device-order-item/case.go index 11cd88ab..1765e52a 100644 --- a/internal/use-case/main-use-case/device-order-item/case.go +++ b/internal/use-case/main-use-case/device-order-item/case.go @@ -88,9 +88,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/device-order-item/lib.go b/internal/use-case/main-use-case/device-order-item/lib.go index 5861f403..70ccc5d7 100644 --- a/internal/use-case/main-use-case/device-order-item/lib.go +++ b/internal/use-case/main-use-case/device-order-item/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.DeviceOrderItem{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize 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 d8f52238..89466ead 100644 --- a/internal/use-case/main-use-case/device-order/case.go +++ b/internal/use-case/main-use-case/device-order/case.go @@ -119,9 +119,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/device-order/lib.go b/internal/use-case/main-use-case/device-order/lib.go index d8a9c8f3..996dfc86 100644 --- a/internal/use-case/main-use-case/device-order/lib.go +++ b/internal/use-case/main-use-case/device-order/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.DeviceOrder{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/device/case.go b/internal/use-case/main-use-case/device/case.go index 3e97fe6c..ff548a4b 100644 --- a/internal/use-case/main-use-case/device/case.go +++ b/internal/use-case/main-use-case/device/case.go @@ -90,9 +90,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/device/lib.go b/internal/use-case/main-use-case/device/lib.go index 94410c61..664db248 100644 --- a/internal/use-case/main-use-case/device/lib.go +++ b/internal/use-case/main-use-case/device/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Device{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.De if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/diagnose-src/case.go b/internal/use-case/main-use-case/diagnose-src/case.go index 587305ba..184e68a8 100644 --- a/internal/use-case/main-use-case/diagnose-src/case.go +++ b/internal/use-case/main-use-case/diagnose-src/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/diagnose-src/lib.go b/internal/use-case/main-use-case/diagnose-src/lib.go index 66de0020..d45f6bb3 100644 --- a/internal/use-case/main-use-case/diagnose-src/lib.go +++ b/internal/use-case/main-use-case/diagnose-src/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.DiagnoseSrc{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/district/case.go b/internal/use-case/main-use-case/district/case.go index 8ab41024..b7a4b1a0 100644 --- a/internal/use-case/main-use-case/district/case.go +++ b/internal/use-case/main-use-case/district/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/district/lib.go b/internal/use-case/main-use-case/district/lib.go index ccc7b775..4c8ac32f 100644 --- a/internal/use-case/main-use-case/district/lib.go +++ b/internal/use-case/main-use-case/district/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.District{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/division-position/case.go b/internal/use-case/main-use-case/division-position/case.go index 2ab963e5..159e9edc 100644 --- a/internal/use-case/main-use-case/division-position/case.go +++ b/internal/use-case/main-use-case/division-position/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/division-position/lib.go b/internal/use-case/main-use-case/division-position/lib.go index 3a9b8d78..d1327d47 100644 --- a/internal/use-case/main-use-case/division-position/lib.go +++ b/internal/use-case/main-use-case/division-position/lib.go @@ -47,15 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.DivisionPosition{}). - Preload("Division"). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -65,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/division/case.go b/internal/use-case/main-use-case/division/case.go index 885d5724..daabd2f8 100644 --- a/internal/use-case/main-use-case/division/case.go +++ b/internal/use-case/main-use-case/division/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index d098490d..828395e7 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -47,12 +47,6 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - if input.OnlyHaveChildren { tx = tx.Where(` EXISTS ( @@ -65,6 +59,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di tx = tx. Model(&e.Division{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -74,15 +69,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Di if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/doctor-fee/case.go b/internal/use-case/main-use-case/doctor-fee/case.go index 6a93b57d..94b57da5 100644 --- a/internal/use-case/main-use-case/doctor-fee/case.go +++ b/internal/use-case/main-use-case/doctor-fee/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/doctor-fee/lib.go b/internal/use-case/main-use-case/doctor-fee/lib.go index 17c8a86d..e657537a 100644 --- a/internal/use-case/main-use-case/doctor-fee/lib.go +++ b/internal/use-case/main-use-case/doctor-fee/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Do tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.DoctorFee{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Do if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/doctor/case.go b/internal/use-case/main-use-case/doctor/case.go index e09376b7..74337056 100644 --- a/internal/use-case/main-use-case/doctor/case.go +++ b/internal/use-case/main-use-case/doctor/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/doctor/lib.go b/internal/use-case/main-use-case/doctor/lib.go index 859a2bd6..3355bb3c 100644 --- a/internal/use-case/main-use-case/doctor/lib.go +++ b/internal/use-case/main-use-case/doctor/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Do tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Doctor{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Do if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/emergency/case.go b/internal/use-case/main-use-case/emergency/case.go index 0a9e48e7..88f662db 100644 --- a/internal/use-case/main-use-case/emergency/case.go +++ b/internal/use-case/main-use-case/emergency/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/emergency/lib.go b/internal/use-case/main-use-case/emergency/lib.go index 414deba7..df7812f4 100644 --- a/internal/use-case/main-use-case/emergency/lib.go +++ b/internal/use-case/main-use-case/emergency/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Em tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Emergency{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Em if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/employee/case.go b/internal/use-case/main-use-case/employee/case.go index c68fd7cf..b59eae18 100644 --- a/internal/use-case/main-use-case/employee/case.go +++ b/internal/use-case/main-use-case/employee/case.go @@ -82,9 +82,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/employee/lib.go b/internal/use-case/main-use-case/employee/lib.go index 020328b5..e36dacee 100644 --- a/internal/use-case/main-use-case/employee/lib.go +++ b/internal/use-case/main-use-case/employee/lib.go @@ -48,14 +48,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Em tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Employee{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -65,15 +60,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Em if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index cdd3beb2..7d209041 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -159,9 +159,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index bfc62fdc..e1bcc630 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Encounter{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/ethnic/case.go b/internal/use-case/main-use-case/ethnic/case.go index 5885f742..c8ca95a1 100644 --- a/internal/use-case/main-use-case/ethnic/case.go +++ b/internal/use-case/main-use-case/ethnic/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/ethnic/lib.go b/internal/use-case/main-use-case/ethnic/lib.go index 9b7a3cf4..0bc91e3f 100644 --- a/internal/use-case/main-use-case/ethnic/lib.go +++ b/internal/use-case/main-use-case/ethnic/lib.go @@ -49,6 +49,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Et tx = tx. Model(&e.Ethnic{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -58,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Et if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/infra/case.go b/internal/use-case/main-use-case/infra/case.go index 52e594a5..7c227e8b 100644 --- a/internal/use-case/main-use-case/infra/case.go +++ b/internal/use-case/main-use-case/infra/case.go @@ -112,9 +112,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/infra/lib.go b/internal/use-case/main-use-case/infra/lib.go index 1b51a98a..234104bb 100644 --- a/internal/use-case/main-use-case/infra/lib.go +++ b/internal/use-case/main-use-case/infra/lib.go @@ -47,12 +47,6 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - if input.OnlyHaveChildren { tx = tx.Where(` EXISTS ( @@ -65,6 +59,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In tx = tx. Model(&e.Infra{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -74,15 +69,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/inpatient/case.go b/internal/use-case/main-use-case/inpatient/case.go index 3548a908..05982b0d 100644 --- a/internal/use-case/main-use-case/inpatient/case.go +++ b/internal/use-case/main-use-case/inpatient/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/inpatient/lib.go b/internal/use-case/main-use-case/inpatient/lib.go index f70b2add..157fe511 100644 --- a/internal/use-case/main-use-case/inpatient/lib.go +++ b/internal/use-case/main-use-case/inpatient/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Inpatient{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/installation/case.go b/internal/use-case/main-use-case/installation/case.go index 234681e8..5e1339da 100644 --- a/internal/use-case/main-use-case/installation/case.go +++ b/internal/use-case/main-use-case/installation/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/installation/lib.go b/internal/use-case/main-use-case/installation/lib.go index 6ef39b29..fd0158ee 100644 --- a/internal/use-case/main-use-case/installation/lib.go +++ b/internal/use-case/main-use-case/installation/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Installation{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/insurance-company/case.go b/internal/use-case/main-use-case/insurance-company/case.go index 3d55fa1f..29aed939 100644 --- a/internal/use-case/main-use-case/insurance-company/case.go +++ b/internal/use-case/main-use-case/insurance-company/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/insurance-company/lib.go b/internal/use-case/main-use-case/insurance-company/lib.go index abcca36f..262a99d9 100644 --- a/internal/use-case/main-use-case/insurance-company/lib.go +++ b/internal/use-case/main-use-case/insurance-company/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.InsuranceCompany{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.In if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/item-price/case.go b/internal/use-case/main-use-case/item-price/case.go index 9c916875..e6be1800 100644 --- a/internal/use-case/main-use-case/item-price/case.go +++ b/internal/use-case/main-use-case/item-price/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/item-price/lib.go b/internal/use-case/main-use-case/item-price/lib.go index 32b387ea..91744132 100644 --- a/internal/use-case/main-use-case/item-price/lib.go +++ b/internal/use-case/main-use-case/item-price/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.It tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.ItemPrice{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.It if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/item/case.go b/internal/use-case/main-use-case/item/case.go index be9f6b16..914d777f 100644 --- a/internal/use-case/main-use-case/item/case.go +++ b/internal/use-case/main-use-case/item/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/item/lib.go b/internal/use-case/main-use-case/item/lib.go index 0f01e82b..56c4c915 100644 --- a/internal/use-case/main-use-case/item/lib.go +++ b/internal/use-case/main-use-case/item/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.It tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Item{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.It if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/laborant/case.go b/internal/use-case/main-use-case/laborant/case.go index 79a9ba32..f8696b9a 100644 --- a/internal/use-case/main-use-case/laborant/case.go +++ b/internal/use-case/main-use-case/laborant/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/laborant/lib.go b/internal/use-case/main-use-case/laborant/lib.go index a02889bb..efe8bb37 100644 --- a/internal/use-case/main-use-case/laborant/lib.go +++ b/internal/use-case/main-use-case/laborant/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Laborant{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/language/case.go b/internal/use-case/main-use-case/language/case.go index 24061c86..885bcfeb 100644 --- a/internal/use-case/main-use-case/language/case.go +++ b/internal/use-case/main-use-case/language/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/language/lib.go b/internal/use-case/main-use-case/language/lib.go index f8277d06..11992794 100644 --- a/internal/use-case/main-use-case/language/lib.go +++ b/internal/use-case/main-use-case/language/lib.go @@ -49,6 +49,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La tx = tx. Model(&e.Language{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -58,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.La if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/material-order-item/case.go b/internal/use-case/main-use-case/material-order-item/case.go index b1a6f61d..d1e3ffe8 100644 --- a/internal/use-case/main-use-case/material-order-item/case.go +++ b/internal/use-case/main-use-case/material-order-item/case.go @@ -96,9 +96,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/material-order-item/lib.go b/internal/use-case/main-use-case/material-order-item/lib.go index 121d2360..f6533ecb 100644 --- a/internal/use-case/main-use-case/material-order-item/lib.go +++ b/internal/use-case/main-use-case/material-order-item/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MaterialOrderItem{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize 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 558c55f6..713f64c0 100644 --- a/internal/use-case/main-use-case/material-order/case.go +++ b/internal/use-case/main-use-case/material-order/case.go @@ -115,9 +115,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/material-order/lib.go b/internal/use-case/main-use-case/material-order/lib.go index 333628c2..c38e9fa6 100644 --- a/internal/use-case/main-use-case/material-order/lib.go +++ b/internal/use-case/main-use-case/material-order/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MaterialOrder{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/material/case.go b/internal/use-case/main-use-case/material/case.go index 3462971c..42346dc6 100644 --- a/internal/use-case/main-use-case/material/case.go +++ b/internal/use-case/main-use-case/material/case.go @@ -90,9 +90,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/material/lib.go b/internal/use-case/main-use-case/material/lib.go index da43d109..3f9adc9a 100644 --- a/internal/use-case/main-use-case/material/lib.go +++ b/internal/use-case/main-use-case/material/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Material{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ma if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/mcu-order-item/case.go b/internal/use-case/main-use-case/mcu-order-item/case.go index a2149006..9037b771 100644 --- a/internal/use-case/main-use-case/mcu-order-item/case.go +++ b/internal/use-case/main-use-case/mcu-order-item/case.go @@ -98,9 +98,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/mcu-order-item/lib.go b/internal/use-case/main-use-case/mcu-order-item/lib.go index 3fab2d62..e53f1c2f 100644 --- a/internal/use-case/main-use-case/mcu-order-item/lib.go +++ b/internal/use-case/main-use-case/mcu-order-item/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.McuOrderItem{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/case.go b/internal/use-case/main-use-case/mcu-order-sub-item/case.go index d7fd5af5..b2676390 100644 --- a/internal/use-case/main-use-case/mcu-order-sub-item/case.go +++ b/internal/use-case/main-use-case/mcu-order-sub-item/case.go @@ -98,9 +98,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/mcu-order-sub-item/lib.go b/internal/use-case/main-use-case/mcu-order-sub-item/lib.go index 45b45645..d7073573 100644 --- a/internal/use-case/main-use-case/mcu-order-sub-item/lib.go +++ b/internal/use-case/main-use-case/mcu-order-sub-item/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.McuOrderSubItem{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/mcu-order/case.go b/internal/use-case/main-use-case/mcu-order/case.go index 1d3d43dc..19b34cbe 100644 --- a/internal/use-case/main-use-case/mcu-order/case.go +++ b/internal/use-case/main-use-case/mcu-order/case.go @@ -115,9 +115,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/mcu-order/lib.go b/internal/use-case/main-use-case/mcu-order/lib.go index b269e559..ccb63db9 100644 --- a/internal/use-case/main-use-case/mcu-order/lib.go +++ b/internal/use-case/main-use-case/mcu-order/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.McuOrder{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/mcu-src-category/case.go b/internal/use-case/main-use-case/mcu-src-category/case.go index c8e53edc..c105603c 100644 --- a/internal/use-case/main-use-case/mcu-src-category/case.go +++ b/internal/use-case/main-use-case/mcu-src-category/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/mcu-src-category/lib.go b/internal/use-case/main-use-case/mcu-src-category/lib.go index 70321ff4..0cd44cfd 100644 --- a/internal/use-case/main-use-case/mcu-src-category/lib.go +++ b/internal/use-case/main-use-case/mcu-src-category/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.McuSrcCategory{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/mcu-src/case.go b/internal/use-case/main-use-case/mcu-src/case.go index 9509b219..564a582b 100644 --- a/internal/use-case/main-use-case/mcu-src/case.go +++ b/internal/use-case/main-use-case/mcu-src/case.go @@ -91,9 +91,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/mcu-src/lib.go b/internal/use-case/main-use-case/mcu-src/lib.go index dd95f7d3..e74d5ce8 100644 --- a/internal/use-case/main-use-case/mcu-src/lib.go +++ b/internal/use-case/main-use-case/mcu-src/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.McuSrc{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/mcu-sub-src/case.go b/internal/use-case/main-use-case/mcu-sub-src/case.go index 1463facd..ba533bc4 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/case.go +++ b/internal/use-case/main-use-case/mcu-sub-src/case.go @@ -91,9 +91,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/mcu-sub-src/lib.go b/internal/use-case/main-use-case/mcu-sub-src/lib.go index a39649ba..96684fef 100644 --- a/internal/use-case/main-use-case/mcu-sub-src/lib.go +++ b/internal/use-case/main-use-case/mcu-sub-src/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.McuSubSrc{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mc if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/medical-action-src-item/case.go b/internal/use-case/main-use-case/medical-action-src-item/case.go index 74af5873..7a1eefb7 100644 --- a/internal/use-case/main-use-case/medical-action-src-item/case.go +++ b/internal/use-case/main-use-case/medical-action-src-item/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medical-action-src-item/lib.go b/internal/use-case/main-use-case/medical-action-src-item/lib.go index 20fc526d..723e615d 100644 --- a/internal/use-case/main-use-case/medical-action-src-item/lib.go +++ b/internal/use-case/main-use-case/medical-action-src-item/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MedicalActionSrcItem{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/medical-action-src/case.go b/internal/use-case/main-use-case/medical-action-src/case.go index 059c15be..d3fb840b 100644 --- a/internal/use-case/main-use-case/medical-action-src/case.go +++ b/internal/use-case/main-use-case/medical-action-src/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medical-action-src/lib.go b/internal/use-case/main-use-case/medical-action-src/lib.go index 42637607..31492861 100644 --- a/internal/use-case/main-use-case/medical-action-src/lib.go +++ b/internal/use-case/main-use-case/medical-action-src/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MedicalActionSrc{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize 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 550cc67c..ff54c775 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 @@ -91,9 +91,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medication-item-dist/lib.go b/internal/use-case/main-use-case/medication-item-dist/lib.go index dd732cd2..88638d2f 100644 --- a/internal/use-case/main-use-case/medication-item-dist/lib.go +++ b/internal/use-case/main-use-case/medication-item-dist/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MedicationItemDist{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize 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 498df263..0e04b6b0 100644 --- a/internal/use-case/main-use-case/medication-item/case.go +++ b/internal/use-case/main-use-case/medication-item/case.go @@ -89,9 +89,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medication-item/lib.go b/internal/use-case/main-use-case/medication-item/lib.go index c54e9db5..f918878b 100644 --- a/internal/use-case/main-use-case/medication-item/lib.go +++ b/internal/use-case/main-use-case/medication-item/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MedicationItem{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/medication/case.go b/internal/use-case/main-use-case/medication/case.go index 4662f4c3..652f2010 100644 --- a/internal/use-case/main-use-case/medication/case.go +++ b/internal/use-case/main-use-case/medication/case.go @@ -93,9 +93,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medication/lib.go b/internal/use-case/main-use-case/medication/lib.go index a420a677..b11e7f6a 100644 --- a/internal/use-case/main-use-case/medication/lib.go +++ b/internal/use-case/main-use-case/medication/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Medication{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/medicine-group/case.go b/internal/use-case/main-use-case/medicine-group/case.go index f7d17e01..180c6e00 100644 --- a/internal/use-case/main-use-case/medicine-group/case.go +++ b/internal/use-case/main-use-case/medicine-group/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medicine-group/lib.go b/internal/use-case/main-use-case/medicine-group/lib.go index 56e9d58c..9c3214a9 100644 --- a/internal/use-case/main-use-case/medicine-group/lib.go +++ b/internal/use-case/main-use-case/medicine-group/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MedicineGroup{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/medicine-method/case.go b/internal/use-case/main-use-case/medicine-method/case.go index a6ed76c7..012b77b0 100644 --- a/internal/use-case/main-use-case/medicine-method/case.go +++ b/internal/use-case/main-use-case/medicine-method/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medicine-method/lib.go b/internal/use-case/main-use-case/medicine-method/lib.go index 45d13da8..a9206cbe 100644 --- a/internal/use-case/main-use-case/medicine-method/lib.go +++ b/internal/use-case/main-use-case/medicine-method/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MedicineMethod{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/medicine-mix-item/case.go b/internal/use-case/main-use-case/medicine-mix-item/case.go index 30932664..6dbb8331 100644 --- a/internal/use-case/main-use-case/medicine-mix-item/case.go +++ b/internal/use-case/main-use-case/medicine-mix-item/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medicine-mix-item/lib.go b/internal/use-case/main-use-case/medicine-mix-item/lib.go index 077b1346..8851cc5d 100644 --- a/internal/use-case/main-use-case/medicine-mix-item/lib.go +++ b/internal/use-case/main-use-case/medicine-mix-item/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.MedicineMixItem{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/medicine/case.go b/internal/use-case/main-use-case/medicine/case.go index 22e052ab..5855d33c 100644 --- a/internal/use-case/main-use-case/medicine/case.go +++ b/internal/use-case/main-use-case/medicine/case.go @@ -90,9 +90,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/medicine/lib.go b/internal/use-case/main-use-case/medicine/lib.go index 452bfbd8..3b9d2fa1 100644 --- a/internal/use-case/main-use-case/medicine/lib.go +++ b/internal/use-case/main-use-case/medicine/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Medicine{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Me if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/midwife/case.go b/internal/use-case/main-use-case/midwife/case.go index 908c0363..42047c6e 100644 --- a/internal/use-case/main-use-case/midwife/case.go +++ b/internal/use-case/main-use-case/midwife/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/midwife/lib.go b/internal/use-case/main-use-case/midwife/lib.go index b7b366d7..5e247c34 100644 --- a/internal/use-case/main-use-case/midwife/lib.go +++ b/internal/use-case/main-use-case/midwife/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mi tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Midwife{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Mi if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/nurse/case.go b/internal/use-case/main-use-case/nurse/case.go index a683bfda..6201e15b 100644 --- a/internal/use-case/main-use-case/nurse/case.go +++ b/internal/use-case/main-use-case/nurse/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/nurse/lib.go b/internal/use-case/main-use-case/nurse/lib.go index 3d4465d6..a59cc692 100644 --- a/internal/use-case/main-use-case/nurse/lib.go +++ b/internal/use-case/main-use-case/nurse/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Nu tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Nurse{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Nu if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/nutritionist/case.go b/internal/use-case/main-use-case/nutritionist/case.go index cc5b2163..8be3a320 100644 --- a/internal/use-case/main-use-case/nutritionist/case.go +++ b/internal/use-case/main-use-case/nutritionist/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/nutritionist/lib.go b/internal/use-case/main-use-case/nutritionist/lib.go index 89d96e94..1f7c72b3 100644 --- a/internal/use-case/main-use-case/nutritionist/lib.go +++ b/internal/use-case/main-use-case/nutritionist/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Nu tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Nutritionist{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Nu if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 590183e4..9736ee09 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -121,9 +121,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index 4ead199c..e126ec0d 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -50,14 +50,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pa tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Patient{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -67,15 +62,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pa if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/person/case.go b/internal/use-case/main-use-case/person/case.go index bb8ee7fb..1d9d94c8 100644 --- a/internal/use-case/main-use-case/person/case.go +++ b/internal/use-case/main-use-case/person/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/person/lib.go b/internal/use-case/main-use-case/person/lib.go index f12c6fac..a49fdd00 100644 --- a/internal/use-case/main-use-case/person/lib.go +++ b/internal/use-case/main-use-case/person/lib.go @@ -51,14 +51,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pe tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Person{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -68,15 +63,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pe if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/pharmacist/case.go b/internal/use-case/main-use-case/pharmacist/case.go index b8a9d063..132987be 100644 --- a/internal/use-case/main-use-case/pharmacist/case.go +++ b/internal/use-case/main-use-case/pharmacist/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/pharmacist/lib.go b/internal/use-case/main-use-case/pharmacist/lib.go index 6e7358cb..365ba118 100644 --- a/internal/use-case/main-use-case/pharmacist/lib.go +++ b/internal/use-case/main-use-case/pharmacist/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ph tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Pharmacist{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ph if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/pharmacy-company/case.go b/internal/use-case/main-use-case/pharmacy-company/case.go index 1ef9a7bf..cce54750 100644 --- a/internal/use-case/main-use-case/pharmacy-company/case.go +++ b/internal/use-case/main-use-case/pharmacy-company/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/pharmacy-company/lib.go b/internal/use-case/main-use-case/pharmacy-company/lib.go index 1b3bfcc3..08b0ff64 100644 --- a/internal/use-case/main-use-case/pharmacy-company/lib.go +++ b/internal/use-case/main-use-case/pharmacy-company/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ph tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.PharmacyCompany{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ph if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/postal-region/case.go b/internal/use-case/main-use-case/postal-region/case.go index 1c175e42..513b0d49 100644 --- a/internal/use-case/main-use-case/postal-region/case.go +++ b/internal/use-case/main-use-case/postal-region/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/postal-region/lib.go b/internal/use-case/main-use-case/postal-region/lib.go index c6d2e998..53070293 100644 --- a/internal/use-case/main-use-case/postal-region/lib.go +++ b/internal/use-case/main-use-case/postal-region/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Po tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.PostalRegion{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Po if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/practice-schedule/case.go b/internal/use-case/main-use-case/practice-schedule/case.go index bb2be8d0..47ae2a8e 100644 --- a/internal/use-case/main-use-case/practice-schedule/case.go +++ b/internal/use-case/main-use-case/practice-schedule/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/practice-schedule/lib.go b/internal/use-case/main-use-case/practice-schedule/lib.go index 3dd0fd69..1f373ece 100644 --- a/internal/use-case/main-use-case/practice-schedule/lib.go +++ b/internal/use-case/main-use-case/practice-schedule/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.PracticeSchedule{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/prescription-item/case.go b/internal/use-case/main-use-case/prescription-item/case.go index ae4c15f6..f8111454 100644 --- a/internal/use-case/main-use-case/prescription-item/case.go +++ b/internal/use-case/main-use-case/prescription-item/case.go @@ -90,9 +90,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/prescription-item/lib.go b/internal/use-case/main-use-case/prescription-item/lib.go index 83a8fca8..aa6f97bf 100644 --- a/internal/use-case/main-use-case/prescription-item/lib.go +++ b/internal/use-case/main-use-case/prescription-item/lib.go @@ -47,16 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } - tx = tx.Preload("MedicineMix").Preload("MedicineMix.MixItems") - - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.PrescriptionItem{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -66,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/prescription/case.go b/internal/use-case/main-use-case/prescription/case.go index e7666dd2..fa68ec44 100644 --- a/internal/use-case/main-use-case/prescription/case.go +++ b/internal/use-case/main-use-case/prescription/case.go @@ -91,9 +91,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/prescription/lib.go b/internal/use-case/main-use-case/prescription/lib.go index af559fb8..013952f8 100644 --- a/internal/use-case/main-use-case/prescription/lib.go +++ b/internal/use-case/main-use-case/prescription/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Prescription{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/procedure-src/case.go b/internal/use-case/main-use-case/procedure-src/case.go index c41e47d6..1b91f6bb 100644 --- a/internal/use-case/main-use-case/procedure-src/case.go +++ b/internal/use-case/main-use-case/procedure-src/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/procedure-src/lib.go b/internal/use-case/main-use-case/procedure-src/lib.go index dd71e652..5e0e9685 100644 --- a/internal/use-case/main-use-case/procedure-src/lib.go +++ b/internal/use-case/main-use-case/procedure-src/lib.go @@ -49,6 +49,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = tx. Model(&e.ProcedureSrc{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -58,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/province/case.go b/internal/use-case/main-use-case/province/case.go index 8c29ab2c..50d5e7ab 100644 --- a/internal/use-case/main-use-case/province/case.go +++ b/internal/use-case/main-use-case/province/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/province/lib.go b/internal/use-case/main-use-case/province/lib.go index 7fd22953..84b06235 100644 --- a/internal/use-case/main-use-case/province/lib.go +++ b/internal/use-case/main-use-case/province/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Province{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/regency/case.go b/internal/use-case/main-use-case/regency/case.go index c0ca1475..c6ed4b4f 100644 --- a/internal/use-case/main-use-case/regency/case.go +++ b/internal/use-case/main-use-case/regency/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/regency/lib.go b/internal/use-case/main-use-case/regency/lib.go index 979ac109..e59dae52 100644 --- a/internal/use-case/main-use-case/regency/lib.go +++ b/internal/use-case/main-use-case/regency/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Re tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Regency{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Re if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/room/case.go b/internal/use-case/main-use-case/room/case.go index 36bf3aa5..eeb1cce1 100644 --- a/internal/use-case/main-use-case/room/case.go +++ b/internal/use-case/main-use-case/room/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/room/lib.go b/internal/use-case/main-use-case/room/lib.go index a37485e0..5e586248 100644 --- a/internal/use-case/main-use-case/room/lib.go +++ b/internal/use-case/main-use-case/room/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ro tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Room{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ro if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/sbar/case.go b/internal/use-case/main-use-case/sbar/case.go index e7571e75..6c92f2b0 100644 --- a/internal/use-case/main-use-case/sbar/case.go +++ b/internal/use-case/main-use-case/sbar/case.go @@ -107,9 +107,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/sbar/lib.go b/internal/use-case/main-use-case/sbar/lib.go index da6fc10a..6d7b57b7 100644 --- a/internal/use-case/main-use-case/sbar/lib.go +++ b/internal/use-case/main-use-case/sbar/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sb tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Sbar{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sb if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index b589e946..fd06e140 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -107,9 +107,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/soapi/lib.go b/internal/use-case/main-use-case/soapi/lib.go index 8f58b55a..7e551505 100644 --- a/internal/use-case/main-use-case/soapi/lib.go +++ b/internal/use-case/main-use-case/soapi/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.So tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Soapi{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.So if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/specialist-intern/case.go b/internal/use-case/main-use-case/specialist-intern/case.go index 0a189e3d..f737b5ee 100644 --- a/internal/use-case/main-use-case/specialist-intern/case.go +++ b/internal/use-case/main-use-case/specialist-intern/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/specialist-intern/lib.go b/internal/use-case/main-use-case/specialist-intern/lib.go index 7c2dadd9..03e8a67a 100644 --- a/internal/use-case/main-use-case/specialist-intern/lib.go +++ b/internal/use-case/main-use-case/specialist-intern/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.SpecialistIntern{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/specialist/case.go b/internal/use-case/main-use-case/specialist/case.go index 91e06eb3..229544be 100644 --- a/internal/use-case/main-use-case/specialist/case.go +++ b/internal/use-case/main-use-case/specialist/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/specialist/lib.go b/internal/use-case/main-use-case/specialist/lib.go index 31829946..10f62ced 100644 --- a/internal/use-case/main-use-case/specialist/lib.go +++ b/internal/use-case/main-use-case/specialist/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Specialist{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Sp if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/subspecialist/case.go b/internal/use-case/main-use-case/subspecialist/case.go index 5e633047..50498b2a 100644 --- a/internal/use-case/main-use-case/subspecialist/case.go +++ b/internal/use-case/main-use-case/subspecialist/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/subspecialist/lib.go b/internal/use-case/main-use-case/subspecialist/lib.go index 071c23c5..5843086f 100644 --- a/internal/use-case/main-use-case/subspecialist/lib.go +++ b/internal/use-case/main-use-case/subspecialist/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Su tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Subspecialist{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Su if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/unit/case.go b/internal/use-case/main-use-case/unit/case.go index 2c07bed7..e11dbd21 100644 --- a/internal/use-case/main-use-case/unit/case.go +++ b/internal/use-case/main-use-case/unit/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/unit/lib.go b/internal/use-case/main-use-case/unit/lib.go index 76511a35..c79c1373 100644 --- a/internal/use-case/main-use-case/unit/lib.go +++ b/internal/use-case/main-use-case/unit/lib.go @@ -47,15 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Unit{}). - Preload("Installation"). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -65,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/uom/case.go b/internal/use-case/main-use-case/uom/case.go index 66b932c0..29c4516b 100644 --- a/internal/use-case/main-use-case/uom/case.go +++ b/internal/use-case/main-use-case/uom/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/uom/lib.go b/internal/use-case/main-use-case/uom/lib.go index 6e8d0f1b..05c22be1 100644 --- a/internal/use-case/main-use-case/uom/lib.go +++ b/internal/use-case/main-use-case/uom/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Uo tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Uom{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Uo if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/internal/use-case/main-use-case/village/case.go b/internal/use-case/main-use-case/village/case.go index 375cf605..787fdb12 100644 --- a/internal/use-case/main-use-case/village/case.go +++ b/internal/use-case/main-use-case/village/case.go @@ -87,9 +87,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } - if len(input.Includes) > 0 { - input.Preloads = pu.GetPreloads(input.Includes) - } if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/village/lib.go b/internal/use-case/main-use-case/village/lib.go index 4ef4596c..21ca8e6c 100644 --- a/internal/use-case/main-use-case/village/lib.go +++ b/internal/use-case/main-use-case/village/lib.go @@ -47,14 +47,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Vi tx = dg.I } - if len(input.Preloads) > 0 { - for _, preload := range input.Preloads { - tx = tx.Preload(preload) - } - } - tx = tx. Model(&e.Village{}). + Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). Scopes(gh.Paginate(input, &pagination)). @@ -64,15 +59,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Vi if err == gorm.ErrRecordNotFound { return nil, &meta, nil } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "Database get failed", - Raw: err, - } - return nil, nil, pl.SetLogError(event, input) - + return nil, nil, plh.HandleListError(input, event, err) } + meta.Count = int(count) meta.PageNumber = pagination.PageNumber meta.PageSize = pagination.PageSize diff --git a/pkg/lib-helper/lib-helper.go b/pkg/lib-helper/lib-helper.go index f9f865a5..fcced797 100644 --- a/pkg/lib-helper/lib-helper.go +++ b/pkg/lib-helper/lib-helper.go @@ -2,6 +2,7 @@ package libhelper import ( "fmt" + "regexp" pl "simrs-vx/pkg/logger" "strings" "unicode" @@ -113,3 +114,54 @@ func HandleCreateError(input any, event *pl.Event, err error) error { return pl.SetLogError(event, input) } } + +func HandleListError(input any, event *pl.Event, err error) error { + if err == nil { + return nil + } + + e, ok := err.(*pgconn.PgError) + if !ok { + // fallback if it's not a pg error + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-list-fail", + Detail: fmt.Sprintf("database list failed: %s", err.Error()), + Raw: err, + } + return pl.SetLogError(event, input) + } + + re := regexp.MustCompile(`^([^:]+):\s*unsupported relations for schema\s+(\S+)`) + if matches := re.FindStringSubmatch(e.Message); len(matches) == 3 { + relation := strings.TrimSpace(matches[1]) + schema := strings.TrimSpace(matches[2]) + + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "invalid-relation", + Detail: fmt.Sprintf("Invalid relation '%s' for schema '%s' — check the relation name.", relation, schema), + Raw: e, + } + return pl.SetLogError(event, input) + } + + if strings.Contains(e.Message, "unsupported relations for schema") { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "invalid-relation", + Detail: fmt.Sprintf("Unsupported relation detected: %s", e.Message), + Raw: e, + } + return pl.SetLogError(event, input) + } + + // Generic pg error fallback + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "pg-error", + Detail: fmt.Sprintf("PostgreSQL error: %s", e.Message), + Raw: e, + } + return pl.SetLogError(event, input) +} From 03ad68e5f09cfba3a5cc9829580675ed78d95a60 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Sat, 11 Oct 2025 11:09:13 +0700 Subject: [PATCH 149/190] go mod tidy for getuk --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d6f7fbe8..132d6e88 100644 --- a/go.mod +++ b/go.mod @@ -61,4 +61,4 @@ require ( gorm.io/driver/postgres v1.5.11 // indirect gorm.io/driver/sqlite v1.5.7 // indirect gorm.io/driver/sqlserver v1.5.4 // indirect -) \ No newline at end of file +) diff --git a/go.sum b/go.sum index f2176a71..555dac70 100644 --- a/go.sum +++ b/go.sum @@ -79,8 +79,8 @@ github.com/karincake/apem v0.0.17 h1:y3WXCr9GWLFFFH4Qyq/VWlWWpijHh5zpTc3Lm96twa4 github.com/karincake/apem v0.0.17/go.mod h1:cQP2sJfDrLRIiwWoaLWw/z8uAya+DWu/FpmYeinMQXM= github.com/karincake/dodol v0.0.1 h1:jUXmJh1r0Ei4fmHPZ6IUkoplW/V9d27L63JEl6zudL0= github.com/karincake/dodol v0.0.1/go.mod h1:2f1NcvkvY0J3GMUkwILNDYVvRUpz0W3lpPp/Ha/Ld24= -github.com/karincake/getuk v0.2.1 h1:l9qaoSE1ttwzNbGTRNGYn61EZ9/rb/V+TjdY8XPeswU= -github.com/karincake/getuk v0.2.1/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c= +github.com/karincake/getuk v0.3.1 h1:yRqBTrwpnjYcZD3gPDoSxFlsLgI9/GKCr3ZCsS4TtYQ= +github.com/karincake/getuk v0.3.1/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c= github.com/karincake/hongkue v0.0.4 h1:oWthq6cDg5DvDm1Z3e7mCLOATQf+oAdtHxN9OPnCfA8= github.com/karincake/hongkue v0.0.4/go.mod h1:YVi5Lyh3DE+GRHx2OSODOr7FwvLi8U4idvcPHO7yeag= github.com/karincake/lepet v0.0.1 h1:eq/cwn5BBg0jWZ1c/MmvhFIBma0zBpVs2LwkfDOncy4= From b4a2317fc7fd07f5fb75e6e258c8b608fa843e55 Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 13 Oct 2025 11:50:00 +0700 Subject: [PATCH 150/190] add entity checkout-polies --- .../migrations/20251013044536.sql | 14 ++++ cmd/main-migration/migrations/atlas.sum | 79 ++++++++++--------- .../main-entities/checkout-polies/entity.go | 1 + 3 files changed, 55 insertions(+), 39 deletions(-) create mode 100644 cmd/main-migration/migrations/20251013044536.sql create mode 100644 internal/domain/main-entities/checkout-polies/entity.go diff --git a/cmd/main-migration/migrations/20251013044536.sql b/cmd/main-migration/migrations/20251013044536.sql new file mode 100644 index 00000000..84bdf0b0 --- /dev/null +++ b/cmd/main-migration/migrations/20251013044536.sql @@ -0,0 +1,14 @@ +-- Create "CheckoutPolies" table +CREATE TABLE "public"."CheckoutPolies" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Unit_Id" integer NULL, + "Doctor_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_CheckoutPolies_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_CheckoutPolies_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_CheckoutPolies_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index a192025a..b19f0f35 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,39 +1,40 @@ -h1:IJbvAMMv47bOtI09AJew68Buh1nnFvsc9lgpX+BrUYA= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= -20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= -20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= -20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= -20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= -20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= -20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= -20251010031743.sql h1:SgHNY/lQ88G2F4nZyMfiOkDntb+gtOR+nEQLqXBTwv4= -20251010070721.sql h1:AnJnhXsMzDvK4AFgYw6B16Kpo/hljrZtcpc9m2VOSHQ= -20251010072711.sql h1:aXPTtNwLcTuw8C/yAxwxvqs0ayEjNzI1uuE0vE3ERa8= +h1:1Md58y00YaMKvxP3SPN5IpMe7XoTocmR8cqgbGthr7g= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= +20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= +20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= +20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= +20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= +20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= +20251010072711.sql h1:ZJNqR2piyu8xJhBvVABSlnGEoKSKae3wuEs+wshPe4k= +20251013044536.sql h1:u0+H4gf+Z36drMXkq/L0r9gBTtTQfhYIm3oj+FqQ/+I= diff --git a/internal/domain/main-entities/checkout-polies/entity.go b/internal/domain/main-entities/checkout-polies/entity.go new file mode 100644 index 00000000..cf4849bc --- /dev/null +++ b/internal/domain/main-entities/checkout-polies/entity.go @@ -0,0 +1 @@ +package checkout_polies From 958884ecd6cd3dc8d0d0e28fcb6fcf5924f41996 Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 13 Oct 2025 11:51:49 +0700 Subject: [PATCH 151/190] add entity checkout-polies --- .idea/.gitignore | 8 ++++++++ .idea/dataSources.xml | 17 +++++++++++++++++ .idea/modules.xml | 8 ++++++++ .idea/simrs-be.iml | 9 +++++++++ .idea/vcs.xml | 6 ++++++ .../main-entities/checkout-polies/entity.go | 17 +++++++++++++++++ internal/interface/migration/main-entities.go | 2 ++ 7 files changed, 67 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/dataSources.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/simrs-be.iml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 00000000..bc2609b6 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,17 @@ + + + + + postgresql + true + org.postgresql.Driver + jdbc:postgresql://localhost:5432/SIMRS + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..f4b37a51 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/simrs-be.iml b/.idea/simrs-be.iml new file mode 100644 index 00000000..5e764c4f --- /dev/null +++ b/.idea/simrs-be.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/internal/domain/main-entities/checkout-polies/entity.go b/internal/domain/main-entities/checkout-polies/entity.go index cf4849bc..d329fc52 100644 --- a/internal/domain/main-entities/checkout-polies/entity.go +++ b/internal/domain/main-entities/checkout-polies/entity.go @@ -1 +1,18 @@ package checkout_polies + +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" + eu "simrs-vx/internal/domain/main-entities/unit" +) + +type CheckoutPolies struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Id;references:Id"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Id;references:Id"` +} diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index fc3161fa..b1875a8f 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -4,6 +4,7 @@ import ( adime "simrs-vx/internal/domain/main-entities/adime" ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" appointment "simrs-vx/internal/domain/main-entities/appointment" + checkoutpolies "simrs-vx/internal/domain/main-entities/checkout-polies" chemo "simrs-vx/internal/domain/main-entities/chemo" consultation "simrs-vx/internal/domain/main-entities/consultation" counter "simrs-vx/internal/domain/main-entities/counter" @@ -151,5 +152,6 @@ func getMainEntities() []any { &chemo.Chemo{}, &midwife.Midwife{}, &postalregion.PostalRegion{}, + &checkoutpolies.CheckoutPolies{}, } } From b2eb8344f3270778772aff44802c6071a7837071 Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 13 Oct 2025 11:52:47 +0700 Subject: [PATCH 152/190] add entity checkout-polies --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5f88f352..7800ac94 100644 --- a/.gitignore +++ b/.gitignore @@ -31,5 +31,5 @@ config.yml !**/atlas.hcl.example # Editor/IDE -# .idea/ +.idea/ .vscode/* From de7fa4d4b10ce1abab9ba2344542197116155db4 Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 13 Oct 2025 11:56:12 +0700 Subject: [PATCH 153/190] stop tracking .idea folder --- .idea/.gitignore | 8 -------- .idea/dataSources.xml | 17 ----------------- .idea/modules.xml | 8 -------- .idea/simrs-be.iml | 9 --------- .idea/vcs.xml | 6 ------ 5 files changed, 48 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/dataSources.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/simrs-be.iml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b81..00000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml deleted file mode 100644 index bc2609b6..00000000 --- a/.idea/dataSources.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - postgresql - true - org.postgresql.Driver - jdbc:postgresql://localhost:5432/SIMRS - - - - - - $ProjectFileDir$ - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index f4b37a51..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/simrs-be.iml b/.idea/simrs-be.iml deleted file mode 100644 index 5e764c4f..00000000 --- a/.idea/simrs-be.iml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1ddf..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From 378fd93b2d736c3e7157cfb8513047f6e4c08eaa Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 13 Oct 2025 12:15:21 +0700 Subject: [PATCH 154/190] update conlist for dischargemethod and update its size in encounter --- .../migrations/20251013051438.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 5 +++-- .../domain/main-entities/encounter/entity.go | 2 +- .../domain/references/encounter/encounter.go | 19 ++++++++++++------- 4 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 cmd/main-migration/migrations/20251013051438.sql diff --git a/cmd/main-migration/migrations/20251013051438.sql b/cmd/main-migration/migrations/20251013051438.sql new file mode 100644 index 00000000..791f3384 --- /dev/null +++ b/cmd/main-migration/migrations/20251013051438.sql @@ -0,0 +1,2 @@ +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" ALTER COLUMN "DischargeMethod_Code" TYPE character varying(16); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index b19f0f35..d8f19f7d 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:1Md58y00YaMKvxP3SPN5IpMe7XoTocmR8cqgbGthr7g= +h1:0s0nd0srbuZbIdiQHvRt1PALWD+XDaCk7Qg/iAk4wY0= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -37,4 +37,5 @@ h1:1Md58y00YaMKvxP3SPN5IpMe7XoTocmR8cqgbGthr7g= 20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= 20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= 20251010072711.sql h1:ZJNqR2piyu8xJhBvVABSlnGEoKSKae3wuEs+wshPe4k= -20251013044536.sql h1:u0+H4gf+Z36drMXkq/L0r9gBTtTQfhYIm3oj+FqQ/+I= +20251013044536.sql h1:0Xjw8fNILiT8nnfrJDZgQnPf3dntmIoilbapnih8AE4= +20251013051438.sql h1:aREcqpdUTiA2T9/f1HOtfa4BUiPRa50RATZ4ETu1syk= diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 0a685611..87833b37 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -30,7 +30,7 @@ type Encounter struct { Appointment_Doctor *ed.Doctor `json:"appointment_doctor,omitempty" gorm:"foreignKey:Appointment_Doctor_Id;references:Id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty" gorm:"foreignKey:Responsible_Doctor_Id;references:Id"` - DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code" gorm:"size:10"` + DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code" gorm:"size:16"` RefSource_Name *string `json:"refSource_name" gorm:"size:100"` Appointment_Id *uint `json:"appointment_id"` Appointment *ea.Appointment `json:"appointment,omitempty" gorm:"foreignKey:Appointment_Id;references:Id"` diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 585a5035..7e6bcf8c 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -25,13 +25,18 @@ const ( QSCCancel QueueStatusCode = "cancel" // Dibatalkan QSCSkip QueueStatusCode = "skip" // Dilewati - DMCHome DischargeMethodCode = "home" // Rumah - DMCHomeReq DischargeMethodCode = "home-request" // Rumah (Dibutuhkan) - DMCConsulation DischargeMethodCode = "consulation" // Konsultasi Lanjutan - DMCInpatient DischargeMethodCode = "inpatient" // Inpatient - DMCExtRef DischargeMethodCode = "external-ref" // Rujuk Eksternal - DMCIntRef DischargeMethodCode = "internal-ref" // Rujuk Internal - DMCDeath DischargeMethodCode = "death" // Meninggal + DMCHome DischargeMethodCode = "home" // Pulang + DMCHomeReq DischargeMethodCode = "home-request" // Pulang Atas Permintaan Sendiri + DMCConsulBack DischargeMethodCode = "consul-back" // Konsultasi Balik / Lanjutan + DMCConsulPoly DischargeMethodCode = "consul-poly" // Konsultasi Poliklinik Lain + DMCConsulExecutive DischargeMethodCode = "consul-executive" // Konsultasi Antar Dokter Eksekutif + DMCConsulChDay DischargeMethodCode = "consul-ch-day" // Konsultasi Hari Lain + DMCEmergency DischargeMethodCode = "emergency" // Rujuk IGD + DMCEmergencyCovid DischargeMethodCode = "emergency-covid" // Rujuk IGD Covid + DMCInpatient DischargeMethodCode = "inpatient" // Rujuk Rawat Inap + DMCExtRef DischargeMethodCode = "external" // Rujuk Faskes Lain + DMCDeath DischargeMethodCode = "death" // Meninggal + DMCDeathOnArrival DischargeMethodCode = "death-on-arrival" // Meninggal Saat Tiba TCAmbulance TransportationCode = "ambulance" // Ambulans TCCar TransportationCode = "car" // Mobil From 17e7875d4f8c789764542aa03a05315ba40a2781 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 13 Oct 2025 12:17:03 +0700 Subject: [PATCH 155/190] feat (encounter): update validation maxlength dischargeMethod_code --- internal/domain/main-entities/encounter/dto.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 34b74d6a..608d26dd 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -77,7 +77,7 @@ type MetaDto struct { } type DischargeDto struct { Id uint `json:"id"` - DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code" validate:"maxLength=10"` + DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code" validate:"maxLength=16"` EarlyEducation *string `json:"earlyEducation"` MedicalDischargeEducation *string `json:"medicalDischargeEducation"` AdmDischargeEducation *string `json:"admDischargeEducation"` From 73e044c6f0a9763002186ba48de32433c19a8825 Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 13 Oct 2025 15:07:00 +0700 Subject: [PATCH 156/190] add create internal reference --- .../main-entities/checkout-polies/dto.go | 76 +++++ .../main-handler/checkout-polies/handler.go | 69 ++++ .../interface/main-handler/main-handler.go | 3 + .../main-use-case/checkout-polies/case.go | 92 ++++++ .../main-use-case/checkout-polies/helper.go | 302 ++++++++++++++++++ .../main-use-case/checkout-polies/lib.go | 31 ++ .../checkout-polies/middleware-runner.go | 103 ++++++ .../checkout-polies/middleware.go | 9 + .../main-use-case/checkout-polies/tycovar.go | 44 +++ 9 files changed, 729 insertions(+) create mode 100644 internal/domain/main-entities/checkout-polies/dto.go create mode 100644 internal/interface/main-handler/checkout-polies/handler.go create mode 100644 internal/use-case/main-use-case/checkout-polies/case.go create mode 100644 internal/use-case/main-use-case/checkout-polies/helper.go create mode 100644 internal/use-case/main-use-case/checkout-polies/lib.go create mode 100644 internal/use-case/main-use-case/checkout-polies/middleware-runner.go create mode 100644 internal/use-case/main-use-case/checkout-polies/middleware.go create mode 100644 internal/use-case/main-use-case/checkout-polies/tycovar.go diff --git a/internal/domain/main-entities/checkout-polies/dto.go b/internal/domain/main-entities/checkout-polies/dto.go new file mode 100644 index 00000000..448efa46 --- /dev/null +++ b/internal/domain/main-entities/checkout-polies/dto.go @@ -0,0 +1,76 @@ +package checkout_polies + +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" + eu "simrs-vx/internal/domain/main-entities/unit" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Unit_Id *uint16 `json:"unit_id"` + Doctor_Id *uint `json:"doctor_Id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter-id"` + Unit_Id *uint `json:"unit-id"` + Doctor_Id *uint `json:"doctor-id"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Unit_Id *uint16 `json:"unit_id"` + Unit *eu.Unit `json:"unit,omitempty"` + Doctor_Id *uint `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty"` +} + +func (d CheckoutPolies) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Unit_Id: d.Unit_Id, + Unit: d.Unit, + Doctor_Id: d.Doctor_Id, + Doctor: d.Doctor, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []CheckoutPolies) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/interface/main-handler/checkout-polies/handler.go b/internal/interface/main-handler/checkout-polies/handler.go new file mode 100644 index 00000000..f7833032 --- /dev/null +++ b/internal/interface/main-handler/checkout-polies/handler.go @@ -0,0 +1,69 @@ +package checkout_polies + +import ( + "net/http" + + ecp "simrs-vx/internal/domain/main-entities/checkout-polies" + ucp "simrs-vx/internal/use-case/main-use-case/checkout-polies" + + rw "github.com/karincake/risoles" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := ecp.CreateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + + res, err := ucp.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 = uint16(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 = uint16(id) + //res, err := u.Delete(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 5eb85084..c54a449c 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -6,6 +6,7 @@ import ( /******************** main / transaction ********************/ adime "simrs-vx/internal/interface/main-handler/adime" auth "simrs-vx/internal/interface/main-handler/authentication" + checkoutpolies "simrs-vx/internal/interface/main-handler/checkout-polies" chemo "simrs-vx/internal/interface/main-handler/chemo" consultation "simrs-vx/internal/interface/main-handler/consultation" counter "simrs-vx/internal/interface/main-handler/counter" @@ -232,6 +233,8 @@ func SetRoutes() http.Handler { "PATCH /{id}/reject": chemo.O.Reject, }) + hc.RegCrud(r, "/v1/checkout-poly", checkoutpolies.O) + /******************** actor ********************/ hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) diff --git a/internal/use-case/main-use-case/checkout-polies/case.go b/internal/use-case/main-use-case/checkout-polies/case.go new file mode 100644 index 00000000..48bf9046 --- /dev/null +++ b/internal/use-case/main-use-case/checkout-polies/case.go @@ -0,0 +1,92 @@ +package checkout_polies + +import ( + + // main entities + cp "simrs-vx/internal/domain/main-entities/checkout-polies" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + eu "simrs-vx/internal/domain/main-entities/unit" + + // main use case + ud "simrs-vx/internal/use-case/main-use-case/doctor" + ue "simrs-vx/internal/use-case/main-use-case/encounter" + uu "simrs-vx/internal/use-case/main-use-case/unit" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + "gorm.io/gorm" +) + +const source = "checkout-polies" + +func Create(input cp.CreateDto) (*d.Data, error) { + data := cp.CheckoutPolies{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + // Validate Encounter Id + _, err := ue.ReadDetail(ee.ReadDetailDto{Id: uint16(*input.Encounter_Id)}) + if err != nil { + return err + } + + // Validate Unit Id + _, err = uu.ReadDetail(eu.ReadDetailDto{Id: *input.Unit_Id}) + if err != nil { + return err + } + + // Validate Doctor Id + _, err = ud.ReadDetail(ed.ReadDetailDto{Id: uint16(*input.Doctor_Id)}) + if err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} diff --git a/internal/use-case/main-use-case/checkout-polies/helper.go b/internal/use-case/main-use-case/checkout-polies/helper.go new file mode 100644 index 00000000..884e6cca --- /dev/null +++ b/internal/use-case/main-use-case/checkout-polies/helper.go @@ -0,0 +1,302 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package checkout_polies + +import ( + "errors" + "fmt" + cp "simrs-vx/internal/domain/main-entities/checkout-polies" + "strings" + + e "simrs-vx/internal/domain/main-entities/encounter" + es "simrs-vx/internal/domain/main-entities/soapi" + + edo "simrs-vx/internal/domain/main-entities/device-order" + emo "simrs-vx/internal/domain/main-entities/material-order" + emco "simrs-vx/internal/domain/main-entities/mcu-order" + em "simrs-vx/internal/domain/main-entities/medication" + emei "simrs-vx/internal/domain/main-entities/medication-item" + emi "simrs-vx/internal/domain/main-entities/medicine-mix" + emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" + ep "simrs-vx/internal/domain/main-entities/prescription" + epi "simrs-vx/internal/domain/main-entities/prescription-item" + + // udo "simrs-vx/internal/use-case/main-use-case/device-order" + um "simrs-vx/internal/use-case/main-use-case/medication" + umei "simrs-vx/internal/use-case/main-use-case/medication-item" + umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" + ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item" + up "simrs-vx/internal/use-case/main-use-case/prescription" + upi "simrs-vx/internal/use-case/main-use-case/prescription-item" + + 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" + + "gorm.io/gorm" +) + +func setData[T *cp.CreateDto | *cp.UpdateDto](input T, data *cp.CheckoutPolies) { + var inputSrc *cp.CreateDto + if inputT, ok := any(input).(*cp.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*cp.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Unit_Id = inputSrc.Unit_Id + data.Doctor_Id = inputSrc.Doctor_Id +} + +func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { + dst.Appointment_Doctor_Id = src.Appointment_Doctor_Id + dst.Responsible_Doctor_Id = src.Responsible_Doctor_Id + dst.Unit_Id = src.Unit_Id + dst.Specialist_Id = src.Specialist_Id + dst.Subspecialist_Id = src.Subspecialist_Id + dst.VisitDate = src.VisitDate +} + +func setDataDischarge(src e.DischargeDto, dst *e.Encounter) { + dst.DischargeMethod_Code = src.DischargeMethod_Code + dst.EarlyEducation = src.EarlyEducation + dst.MedicalDischargeEducation = src.MedicalDischargeEducation + dst.AdmDischargeEducation = src.AdmDischargeEducation + dst.DischargeReason = src.DischargeReason + dst.Status_Code = erc.DSCDone +} + +func checkSoapiByDocExists(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "checkSoapiByDocExists") + var soapies []es.Soapi + err := tx. + Preload("Employee"). + Preload("Employee.User"). + Where("\"Encounter_Id\" = ?", encounter_id).Find(&soapies).Error + if err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get soapi failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(soapies) == 0 { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-notFound", + Detail: "no soapi found for encounter", + Raw: errors.New("soapi not found"), + } + return pl.SetLogError(event, nil) + } + + for _, s := range soapies { + if s.Employee != nil && s.Employee.User != nil && s.Employee.User.Position_Code == ero.UPCDoc { + return nil + } + } + + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-update-fail", + Detail: "no soapi written by a doctor found", + Raw: errors.New("all soapi employees are not doctors"), + } + 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{Encounter_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(), + Status_Code: erc.DSCNew, + } + medication, err := um.CreateData(medicationCreate, event, tx) + if err != nil { + return err + } + + for _, prescriptionItem := range prescriptionItem { + if prescriptionItem.IsMix { + medMix_id, err := createMedicineMixAndItem(*prescriptionItem.MedicineMix, event, tx) + if err != nil { + return err + } + prescriptionItem.MedicineMix_Id = medMix_id + } + err := createMedicationItem(medication.Id, prescriptionItem, event, tx) + if err != nil { + return err + } + } + return nil +} + +func createMedicineMixAndItem(input emi.MedicineMix, event *pl.Event, tx *gorm.DB) (*uint, error) { + pl.SetLogInfo(event, nil, "started", "createMedicineMix") + + medicineMixCreate := emi.CreateDto{ + Name: input.Name, + Uom_Code: input.Uom_Code, + } + medicineMix, err := umi.CreateData(medicineMixCreate, event, tx) + if err != nil { + return nil, err + } + + // recreate medicineMixItem with new medicineMix_id to keep medMixItem remain the same for prescriptionItem that is created + for _, medicineMixItem := range input.MixItems { + medicineMixItemCreate := emmi.CreateDto{ + MedicineMix_Id: &medicineMix.Id, + Medicine_Id: medicineMixItem.Medicine_Id, + Dose: medicineMixItem.Dose, + } + _, err := ummi.CreateData(medicineMixItemCreate, event, tx) + if err != nil { + return nil, err + } + + } + return &medicineMix.Id, nil +} + +func createMedicationItem(medication_id uint, input epi.PrescriptionItem, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "createMedicationItem") + + medicationItemCreate := emei.CreateDto{ + Medication_Id: &medication_id, + IsMix: input.IsMix, + Medicine_Id: input.Medicine_Id, + MedicineMix_Id: input.MedicineMix_Id, + Usage: input.Usage, + Interval: input.Interval, + IntervalUnit_Code: input.IntervalUnit_Code, + Quantity: input.Quantity, + } + + _, err := umei.CreateData(medicationItemCreate, event, tx) + if err != nil { + return err + } + + return nil +} + +func checkNewOrdersExist(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "CheckNewOrdersExist") + var errs []string + if err := getDeviceOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if err := getMaterialOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if err := getMcuOrders(encounter_id, event, tx); err != nil { + errs = append(errs, err.Error()) + } + + if len(errs) > 0 { + return fmt.Errorf("encounter has open orders: %s", strings.Join(errs, "; ")) + } + + return nil +} + +func getDeviceOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getDeviceOrders") + var orders []edo.DeviceOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get device order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d device orders", len(orders)) + } + + return nil +} + +func getMaterialOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getMaterialOrders") + var orders []emo.MaterialOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get material order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d material orders", len(orders)) + } + + return nil +} + +func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { + pl.SetLogInfo(event, nil, "started", "getMcuOrders") + var orders []emco.McuOrder + err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error + if err != nil { + if err == gorm.ErrRecordNotFound { + return nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "get mcu order failed", + Raw: err, + } + return pl.SetLogError(event, nil) + } + + if len(orders) > 0 { + return fmt.Errorf("encounter has %d mcu orders", len(orders)) + } + + return nil +} diff --git a/internal/use-case/main-use-case/checkout-polies/lib.go b/internal/use-case/main-use-case/checkout-polies/lib.go new file mode 100644 index 00000000..5525e906 --- /dev/null +++ b/internal/use-case/main-use-case/checkout-polies/lib.go @@ -0,0 +1,31 @@ +package checkout_polies + +import ( + cp "simrs-vx/internal/domain/main-entities/checkout-polies" + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + + dg "github.com/karincake/apem/db-gorm-pg" + "gorm.io/gorm" +) + +func CreateData(input cp.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*cp.CheckoutPolies, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := cp.CheckoutPolies{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/main-use-case/checkout-polies/middleware-runner.go b/internal/use-case/main-use-case/checkout-polies/middleware-runner.go new file mode 100644 index 00000000..2da2dcca --- /dev/null +++ b/internal/use-case/main-use-case/checkout-polies/middleware-runner.go @@ -0,0 +1,103 @@ +package checkout_polies + +import ( + cp "simrs-vx/internal/domain/main-entities/checkout-polies" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *cp.CreateDto, data *cp.CheckoutPolies) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *cp.ReadListDto, data *cp.CheckoutPolies) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *cp.ReadDetailDto, data *cp.CheckoutPolies) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *cp.ReadDetailDto, data *cp.CheckoutPolies) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *cp.ReadDetailDto, data *cp.CheckoutPolies) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/checkout-polies/middleware.go b/internal/use-case/main-use-case/checkout-polies/middleware.go new file mode 100644 index 00000000..ebd4cff8 --- /dev/null +++ b/internal/use-case/main-use-case/checkout-polies/middleware.go @@ -0,0 +1,9 @@ +package checkout_polies + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/checkout-polies/tycovar.go b/internal/use-case/main-use-case/checkout-polies/tycovar.go new file mode 100644 index 00000000..a6978f08 --- /dev/null +++ b/internal/use-case/main-use-case/checkout-polies/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package checkout_polies + +import ( + "gorm.io/gorm" + + cp "simrs-vx/internal/domain/main-entities/checkout-polies" +) + +type createMw struct { + Name string + Func func(input *cp.CreateDto, data *cp.CheckoutPolies, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *cp.ReadListDto, data *cp.CheckoutPolies, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *cp.ReadDetailDto, data *cp.CheckoutPolies, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From 8abead652f8914d60d5f8b791868c8bd4a0ebf7d Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 13 Oct 2025 15:20:24 +0700 Subject: [PATCH 157/190] rename table to internal reference --- cmd/main-migration/migrations/20251013081808.sql | 16 ++++++++++++++++ cmd/main-migration/migrations/atlas.sum | 5 +++-- .../entity.go | 4 ++-- internal/interface/migration/main-entities.go | 4 ++-- 4 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 cmd/main-migration/migrations/20251013081808.sql rename internal/domain/main-entities/{checkout-polies => internal-reference}/entity.go (91%) diff --git a/cmd/main-migration/migrations/20251013081808.sql b/cmd/main-migration/migrations/20251013081808.sql new file mode 100644 index 00000000..03bf02ce --- /dev/null +++ b/cmd/main-migration/migrations/20251013081808.sql @@ -0,0 +1,16 @@ +-- Create "InternalReference" table +CREATE TABLE "public"."InternalReference" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Unit_Id" integer NULL, + "Doctor_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_InternalReference_Doctor" FOREIGN KEY ("Doctor_Id") REFERENCES "public"."Doctor" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_InternalReference_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_InternalReference_Unit" FOREIGN KEY ("Unit_Id") REFERENCES "public"."Unit" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Drop "CheckoutPolies" table +DROP TABLE "public"."CheckoutPolies"; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index d8f19f7d..4d946518 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:0s0nd0srbuZbIdiQHvRt1PALWD+XDaCk7Qg/iAk4wY0= +h1:oj0SGm9EAjoGuXcWbue8k9Uqy/W1N7iFjPky7Cg7G6s= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -38,4 +38,5 @@ h1:0s0nd0srbuZbIdiQHvRt1PALWD+XDaCk7Qg/iAk4wY0= 20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= 20251010072711.sql h1:ZJNqR2piyu8xJhBvVABSlnGEoKSKae3wuEs+wshPe4k= 20251013044536.sql h1:0Xjw8fNILiT8nnfrJDZgQnPf3dntmIoilbapnih8AE4= -20251013051438.sql h1:aREcqpdUTiA2T9/f1HOtfa4BUiPRa50RATZ4ETu1syk= +20251013051438.sql h1:lfSuw5mgJnePBJamvhZ81osFIouXeiIEiSZ/evdwo48= +20251013081808.sql h1:AqNqfPWEI8fgozZ+EhIT1pKsbN+0R8njTTu++rF6dKA= diff --git a/internal/domain/main-entities/checkout-polies/entity.go b/internal/domain/main-entities/internal-reference/entity.go similarity index 91% rename from internal/domain/main-entities/checkout-polies/entity.go rename to internal/domain/main-entities/internal-reference/entity.go index d329fc52..56dcdc19 100644 --- a/internal/domain/main-entities/checkout-polies/entity.go +++ b/internal/domain/main-entities/internal-reference/entity.go @@ -1,4 +1,4 @@ -package checkout_polies +package internal_reference import ( ecore "simrs-vx/internal/domain/base-entities/core" @@ -7,7 +7,7 @@ import ( eu "simrs-vx/internal/domain/main-entities/unit" ) -type CheckoutPolies struct { +type InternalReference struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index b1875a8f..41bb18db 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -4,7 +4,6 @@ import ( adime "simrs-vx/internal/domain/main-entities/adime" ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" appointment "simrs-vx/internal/domain/main-entities/appointment" - checkoutpolies "simrs-vx/internal/domain/main-entities/checkout-polies" chemo "simrs-vx/internal/domain/main-entities/chemo" consultation "simrs-vx/internal/domain/main-entities/consultation" counter "simrs-vx/internal/domain/main-entities/counter" @@ -25,6 +24,7 @@ import ( inpatient "simrs-vx/internal/domain/main-entities/inpatient" installation "simrs-vx/internal/domain/main-entities/installation" insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" + internalreference "simrs-vx/internal/domain/main-entities/internal-reference" item "simrs-vx/internal/domain/main-entities/item" itemprice "simrs-vx/internal/domain/main-entities/item-price" laborant "simrs-vx/internal/domain/main-entities/laborant" @@ -152,6 +152,6 @@ func getMainEntities() []any { &chemo.Chemo{}, &midwife.Midwife{}, &postalregion.PostalRegion{}, - &checkoutpolies.CheckoutPolies{}, + &internalreference.InternalReference{}, } } From bd6c76fee9b742ae58b6e6ef54af169660e96b92 Mon Sep 17 00:00:00 2001 From: vanilia Date: Mon, 13 Oct 2025 16:25:30 +0700 Subject: [PATCH 158/190] add list internal-reference --- .../dto.go | 6 +- .../entity.go | 4 +- .../handler.go | 19 +- .../interface/main-handler/main-handler.go | 4 +- internal/interface/migration/main-entities.go | 2 +- .../main-use-case/checkout-polies/helper.go | 302 ------------------ .../main-use-case/checkout-polies/lib.go | 31 -- .../case.go | 64 +++- .../internal-reference/helper.go | 23 ++ .../main-use-case/internal-reference/lib.go | 70 ++++ .../middleware-runner.go | 14 +- .../middleware.go | 2 +- .../tycovar.go | 10 +- 13 files changed, 183 insertions(+), 368 deletions(-) rename internal/domain/main-entities/{checkout-polies => internal-reference}/dto.go (91%) rename internal/domain/main-entities/{checkout-polies => internal-reference}/entity.go (91%) rename internal/interface/main-handler/{checkout-polies => internal-reference}/handler.go (76%) delete mode 100644 internal/use-case/main-use-case/checkout-polies/helper.go delete mode 100644 internal/use-case/main-use-case/checkout-polies/lib.go rename internal/use-case/main-use-case/{checkout-polies => internal-reference}/case.go (54%) create mode 100644 internal/use-case/main-use-case/internal-reference/helper.go create mode 100644 internal/use-case/main-use-case/internal-reference/lib.go rename internal/use-case/main-use-case/{checkout-polies => internal-reference}/middleware-runner.go (85%) rename internal/use-case/main-use-case/{checkout-polies => internal-reference}/middleware.go (88%) rename internal/use-case/main-use-case/{checkout-polies => internal-reference}/tycovar.go (73%) diff --git a/internal/domain/main-entities/checkout-polies/dto.go b/internal/domain/main-entities/internal-reference/dto.go similarity index 91% rename from internal/domain/main-entities/checkout-polies/dto.go rename to internal/domain/main-entities/internal-reference/dto.go index 448efa46..5ac439b9 100644 --- a/internal/domain/main-entities/checkout-polies/dto.go +++ b/internal/domain/main-entities/internal-reference/dto.go @@ -1,4 +1,4 @@ -package checkout_polies +package internal_reference import ( ecore "simrs-vx/internal/domain/base-entities/core" @@ -54,7 +54,7 @@ type ResponseDto struct { Doctor *ed.Doctor `json:"doctor,omitempty"` } -func (d CheckoutPolies) ToResponse() ResponseDto { +func (d InternalReference) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, @@ -67,7 +67,7 @@ func (d CheckoutPolies) ToResponse() ResponseDto { return resp } -func ToResponseList(data []CheckoutPolies) []ResponseDto { +func ToResponseList(data []InternalReference) []ResponseDto { resp := make([]ResponseDto, len(data)) for i, u := range data { resp[i] = u.ToResponse() diff --git a/internal/domain/main-entities/checkout-polies/entity.go b/internal/domain/main-entities/internal-reference/entity.go similarity index 91% rename from internal/domain/main-entities/checkout-polies/entity.go rename to internal/domain/main-entities/internal-reference/entity.go index d329fc52..56dcdc19 100644 --- a/internal/domain/main-entities/checkout-polies/entity.go +++ b/internal/domain/main-entities/internal-reference/entity.go @@ -1,4 +1,4 @@ -package checkout_polies +package internal_reference import ( ecore "simrs-vx/internal/domain/base-entities/core" @@ -7,7 +7,7 @@ import ( eu "simrs-vx/internal/domain/main-entities/unit" ) -type CheckoutPolies struct { +type InternalReference struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` diff --git a/internal/interface/main-handler/checkout-polies/handler.go b/internal/interface/main-handler/internal-reference/handler.go similarity index 76% rename from internal/interface/main-handler/checkout-polies/handler.go rename to internal/interface/main-handler/internal-reference/handler.go index f7833032..ca5afdc9 100644 --- a/internal/interface/main-handler/checkout-polies/handler.go +++ b/internal/interface/main-handler/internal-reference/handler.go @@ -1,12 +1,13 @@ -package checkout_polies +package internal_reference import ( "net/http" - ecp "simrs-vx/internal/domain/main-entities/checkout-polies" - ucp "simrs-vx/internal/use-case/main-use-case/checkout-polies" + eir "simrs-vx/internal/domain/main-entities/internal-reference" + uir "simrs-vx/internal/use-case/main-use-case/internal-reference" rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" ) type myBase struct{} @@ -14,20 +15,20 @@ type myBase struct{} var O myBase func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { - dto := ecp.CreateDto{} + dto := eir.CreateDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - res, err := ucp.Create(dto) + res, err := uir.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) + dto := eir.ReadListDto{} + sf.UrlQueryParam(&dto, *r.URL) + res, err := uir.ReadList(dto) + rw.DataResponse(w, res, err) } func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index c54a449c..63448f21 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -6,13 +6,13 @@ import ( /******************** main / transaction ********************/ adime "simrs-vx/internal/interface/main-handler/adime" auth "simrs-vx/internal/interface/main-handler/authentication" - checkoutpolies "simrs-vx/internal/interface/main-handler/checkout-polies" chemo "simrs-vx/internal/interface/main-handler/chemo" consultation "simrs-vx/internal/interface/main-handler/consultation" counter "simrs-vx/internal/interface/main-handler/counter" deviceorder "simrs-vx/internal/interface/main-handler/device-order" deviceorderitem "simrs-vx/internal/interface/main-handler/device-order-item" encounter "simrs-vx/internal/interface/main-handler/encounter" + internalreference "simrs-vx/internal/interface/main-handler/internal-reference" materialorder "simrs-vx/internal/interface/main-handler/material-order" materialorderitem "simrs-vx/internal/interface/main-handler/material-order-item" mcuorder "simrs-vx/internal/interface/main-handler/mcu-order" @@ -233,7 +233,7 @@ func SetRoutes() http.Handler { "PATCH /{id}/reject": chemo.O.Reject, }) - hc.RegCrud(r, "/v1/checkout-poly", checkoutpolies.O) + hc.RegCrud(r, "/v1/internal-reference", internalreference.O) /******************** actor ********************/ hc.RegCrud(r, "/v1/person", person.O) diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index b1875a8f..3821e982 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -4,7 +4,6 @@ import ( adime "simrs-vx/internal/domain/main-entities/adime" ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" appointment "simrs-vx/internal/domain/main-entities/appointment" - checkoutpolies "simrs-vx/internal/domain/main-entities/checkout-polies" chemo "simrs-vx/internal/domain/main-entities/chemo" consultation "simrs-vx/internal/domain/main-entities/consultation" counter "simrs-vx/internal/domain/main-entities/counter" @@ -25,6 +24,7 @@ import ( inpatient "simrs-vx/internal/domain/main-entities/inpatient" installation "simrs-vx/internal/domain/main-entities/installation" insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" + checkoutpolies "simrs-vx/internal/domain/main-entities/internal-reference" item "simrs-vx/internal/domain/main-entities/item" itemprice "simrs-vx/internal/domain/main-entities/item-price" laborant "simrs-vx/internal/domain/main-entities/laborant" diff --git a/internal/use-case/main-use-case/checkout-polies/helper.go b/internal/use-case/main-use-case/checkout-polies/helper.go deleted file mode 100644 index 884e6cca..00000000 --- a/internal/use-case/main-use-case/checkout-polies/helper.go +++ /dev/null @@ -1,302 +0,0 @@ -/* -DESCRIPTION: -Any functions that are used internally by the use-case -*/ -package checkout_polies - -import ( - "errors" - "fmt" - cp "simrs-vx/internal/domain/main-entities/checkout-polies" - "strings" - - e "simrs-vx/internal/domain/main-entities/encounter" - es "simrs-vx/internal/domain/main-entities/soapi" - - edo "simrs-vx/internal/domain/main-entities/device-order" - emo "simrs-vx/internal/domain/main-entities/material-order" - emco "simrs-vx/internal/domain/main-entities/mcu-order" - em "simrs-vx/internal/domain/main-entities/medication" - emei "simrs-vx/internal/domain/main-entities/medication-item" - emi "simrs-vx/internal/domain/main-entities/medicine-mix" - emmi "simrs-vx/internal/domain/main-entities/medicine-mix-item" - ep "simrs-vx/internal/domain/main-entities/prescription" - epi "simrs-vx/internal/domain/main-entities/prescription-item" - - // udo "simrs-vx/internal/use-case/main-use-case/device-order" - um "simrs-vx/internal/use-case/main-use-case/medication" - umei "simrs-vx/internal/use-case/main-use-case/medication-item" - umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" - ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item" - up "simrs-vx/internal/use-case/main-use-case/prescription" - upi "simrs-vx/internal/use-case/main-use-case/prescription-item" - - 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" - - "gorm.io/gorm" -) - -func setData[T *cp.CreateDto | *cp.UpdateDto](input T, data *cp.CheckoutPolies) { - var inputSrc *cp.CreateDto - if inputT, ok := any(input).(*cp.CreateDto); ok { - inputSrc = inputT - } else { - inputTemp := any(input).(*cp.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - data.Encounter_Id = inputSrc.Encounter_Id - data.Unit_Id = inputSrc.Unit_Id - data.Doctor_Id = inputSrc.Doctor_Id -} - -func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { - dst.Appointment_Doctor_Id = src.Appointment_Doctor_Id - dst.Responsible_Doctor_Id = src.Responsible_Doctor_Id - dst.Unit_Id = src.Unit_Id - dst.Specialist_Id = src.Specialist_Id - dst.Subspecialist_Id = src.Subspecialist_Id - dst.VisitDate = src.VisitDate -} - -func setDataDischarge(src e.DischargeDto, dst *e.Encounter) { - dst.DischargeMethod_Code = src.DischargeMethod_Code - dst.EarlyEducation = src.EarlyEducation - dst.MedicalDischargeEducation = src.MedicalDischargeEducation - dst.AdmDischargeEducation = src.AdmDischargeEducation - dst.DischargeReason = src.DischargeReason - dst.Status_Code = erc.DSCDone -} - -func checkSoapiByDocExists(encounter_id uint, event *pl.Event, tx *gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "checkSoapiByDocExists") - var soapies []es.Soapi - err := tx. - Preload("Employee"). - Preload("Employee.User"). - Where("\"Encounter_Id\" = ?", encounter_id).Find(&soapies).Error - if err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "get soapi failed", - Raw: err, - } - return pl.SetLogError(event, nil) - } - - if len(soapies) == 0 { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-notFound", - Detail: "no soapi found for encounter", - Raw: errors.New("soapi not found"), - } - return pl.SetLogError(event, nil) - } - - for _, s := range soapies { - if s.Employee != nil && s.Employee.User != nil && s.Employee.User.Position_Code == ero.UPCDoc { - return nil - } - } - - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-update-fail", - Detail: "no soapi written by a doctor found", - Raw: errors.New("all soapi employees are not doctors"), - } - 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{Encounter_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(), - Status_Code: erc.DSCNew, - } - medication, err := um.CreateData(medicationCreate, event, tx) - if err != nil { - return err - } - - for _, prescriptionItem := range prescriptionItem { - if prescriptionItem.IsMix { - medMix_id, err := createMedicineMixAndItem(*prescriptionItem.MedicineMix, event, tx) - if err != nil { - return err - } - prescriptionItem.MedicineMix_Id = medMix_id - } - err := createMedicationItem(medication.Id, prescriptionItem, event, tx) - if err != nil { - return err - } - } - return nil -} - -func createMedicineMixAndItem(input emi.MedicineMix, event *pl.Event, tx *gorm.DB) (*uint, error) { - pl.SetLogInfo(event, nil, "started", "createMedicineMix") - - medicineMixCreate := emi.CreateDto{ - Name: input.Name, - Uom_Code: input.Uom_Code, - } - medicineMix, err := umi.CreateData(medicineMixCreate, event, tx) - if err != nil { - return nil, err - } - - // recreate medicineMixItem with new medicineMix_id to keep medMixItem remain the same for prescriptionItem that is created - for _, medicineMixItem := range input.MixItems { - medicineMixItemCreate := emmi.CreateDto{ - MedicineMix_Id: &medicineMix.Id, - Medicine_Id: medicineMixItem.Medicine_Id, - Dose: medicineMixItem.Dose, - } - _, err := ummi.CreateData(medicineMixItemCreate, event, tx) - if err != nil { - return nil, err - } - - } - return &medicineMix.Id, nil -} - -func createMedicationItem(medication_id uint, input epi.PrescriptionItem, event *pl.Event, tx *gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "createMedicationItem") - - medicationItemCreate := emei.CreateDto{ - Medication_Id: &medication_id, - IsMix: input.IsMix, - Medicine_Id: input.Medicine_Id, - MedicineMix_Id: input.MedicineMix_Id, - Usage: input.Usage, - Interval: input.Interval, - IntervalUnit_Code: input.IntervalUnit_Code, - Quantity: input.Quantity, - } - - _, err := umei.CreateData(medicationItemCreate, event, tx) - if err != nil { - return err - } - - return nil -} - -func checkNewOrdersExist(encounter_id uint, event *pl.Event, tx *gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "CheckNewOrdersExist") - var errs []string - if err := getDeviceOrders(encounter_id, event, tx); err != nil { - errs = append(errs, err.Error()) - } - - if err := getMaterialOrders(encounter_id, event, tx); err != nil { - errs = append(errs, err.Error()) - } - - if err := getMcuOrders(encounter_id, event, tx); err != nil { - errs = append(errs, err.Error()) - } - - if len(errs) > 0 { - return fmt.Errorf("encounter has open orders: %s", strings.Join(errs, "; ")) - } - - return nil -} - -func getDeviceOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "getDeviceOrders") - var orders []edo.DeviceOrder - err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error - if err != nil { - if err == gorm.ErrRecordNotFound { - return nil - } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "get device order failed", - Raw: err, - } - return pl.SetLogError(event, nil) - } - - if len(orders) > 0 { - return fmt.Errorf("encounter has %d device orders", len(orders)) - } - - return nil -} - -func getMaterialOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "getMaterialOrders") - var orders []emo.MaterialOrder - err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error - if err != nil { - if err == gorm.ErrRecordNotFound { - return nil - } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "get material order failed", - Raw: err, - } - return pl.SetLogError(event, nil) - } - - if len(orders) > 0 { - return fmt.Errorf("encounter has %d material orders", len(orders)) - } - - return nil -} - -func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "getMcuOrders") - var orders []emco.McuOrder - err := tx.Where("\"Encounter_Id\" = ? AND \"Status_Code\" = ?", encounter_id, erc.DSCNew).Find(&orders).Error - if err != nil { - if err == gorm.ErrRecordNotFound { - return nil - } - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-get-fail", - Detail: "get mcu order failed", - Raw: err, - } - return pl.SetLogError(event, nil) - } - - if len(orders) > 0 { - return fmt.Errorf("encounter has %d mcu orders", len(orders)) - } - - return nil -} diff --git a/internal/use-case/main-use-case/checkout-polies/lib.go b/internal/use-case/main-use-case/checkout-polies/lib.go deleted file mode 100644 index 5525e906..00000000 --- a/internal/use-case/main-use-case/checkout-polies/lib.go +++ /dev/null @@ -1,31 +0,0 @@ -package checkout_polies - -import ( - cp "simrs-vx/internal/domain/main-entities/checkout-polies" - plh "simrs-vx/pkg/lib-helper" - pl "simrs-vx/pkg/logger" - - dg "github.com/karincake/apem/db-gorm-pg" - "gorm.io/gorm" -) - -func CreateData(input cp.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*cp.CheckoutPolies, error) { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - data := cp.CheckoutPolies{} - setData(&input, &data) - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - if err := tx.Create(&data).Error; err != nil { - return nil, plh.HandleCreateError(input, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} diff --git a/internal/use-case/main-use-case/checkout-polies/case.go b/internal/use-case/main-use-case/internal-reference/case.go similarity index 54% rename from internal/use-case/main-use-case/checkout-polies/case.go rename to internal/use-case/main-use-case/internal-reference/case.go index 48bf9046..ccb2a5fe 100644 --- a/internal/use-case/main-use-case/checkout-polies/case.go +++ b/internal/use-case/main-use-case/internal-reference/case.go @@ -1,12 +1,13 @@ -package checkout_polies +package internal_reference import ( // main entities - cp "simrs-vx/internal/domain/main-entities/checkout-polies" ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/encounter" + eir "simrs-vx/internal/domain/main-entities/internal-reference" eu "simrs-vx/internal/domain/main-entities/unit" + "strconv" // main use case ud "simrs-vx/internal/use-case/main-use-case/doctor" @@ -21,10 +22,10 @@ import ( "gorm.io/gorm" ) -const source = "checkout-polies" +const source = "internal-reference" -func Create(input cp.CreateDto) (*d.Data, error) { - data := cp.CheckoutPolies{} +func Create(input eir.CreateDto) (*d.Data, error) { + data := eir.InternalReference{} event := pl.Event{ Feature: "Create", @@ -90,3 +91,56 @@ func Create(input cp.CreateDto) (*d.Data, error) { Data: data.ToResponse(), }, nil } + +func ReadList(input eir.ReadListDto) (*d.Data, error) { + var data *eir.InternalReference + var dataList []eir.InternalReference + var metaList *eir.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: eir.ToResponseList(dataList), + }, nil +} diff --git a/internal/use-case/main-use-case/internal-reference/helper.go b/internal/use-case/main-use-case/internal-reference/helper.go new file mode 100644 index 00000000..aaef382a --- /dev/null +++ b/internal/use-case/main-use-case/internal-reference/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package internal_reference + +import ( + ir "simrs-vx/internal/domain/main-entities/internal-reference" +) + +func setData[T *ir.CreateDto | *ir.UpdateDto](input T, data *ir.InternalReference) { + var inputSrc *ir.CreateDto + if inputT, ok := any(input).(*ir.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*ir.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Encounter_Id = inputSrc.Encounter_Id + data.Unit_Id = inputSrc.Unit_Id + data.Doctor_Id = inputSrc.Doctor_Id +} diff --git a/internal/use-case/main-use-case/internal-reference/lib.go b/internal/use-case/main-use-case/internal-reference/lib.go new file mode 100644 index 00000000..2c338f92 --- /dev/null +++ b/internal/use-case/main-use-case/internal-reference/lib.go @@ -0,0 +1,70 @@ +package internal_reference + +import ( + "errors" + ir "simrs-vx/internal/domain/main-entities/internal-reference" + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input ir.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*ir.InternalReference, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := ir.InternalReference{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input ir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]ir.InternalReference, *ir.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []ir.InternalReference{} + pagination := gh.Pagination{} + count := int64(0) + meta := ir.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&ir.InternalReference{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} diff --git a/internal/use-case/main-use-case/checkout-polies/middleware-runner.go b/internal/use-case/main-use-case/internal-reference/middleware-runner.go similarity index 85% rename from internal/use-case/main-use-case/checkout-polies/middleware-runner.go rename to internal/use-case/main-use-case/internal-reference/middleware-runner.go index 2da2dcca..f677b66f 100644 --- a/internal/use-case/main-use-case/checkout-polies/middleware-runner.go +++ b/internal/use-case/main-use-case/internal-reference/middleware-runner.go @@ -1,7 +1,7 @@ -package checkout_polies +package internal_reference import ( - cp "simrs-vx/internal/domain/main-entities/checkout-polies" + ir "simrs-vx/internal/domain/main-entities/internal-reference" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -23,7 +23,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { } // ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *cp.CreateDto, data *cp.CheckoutPolies) error { +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *ir.CreateDto, data *ir.InternalReference) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -38,7 +38,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *c return nil } -func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *cp.ReadListDto, data *cp.CheckoutPolies) error { +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *ir.ReadListDto, data *ir.InternalReference) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -53,7 +53,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu return nil } -func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *cp.ReadDetailDto, data *cp.CheckoutPolies) error { +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *ir.ReadDetailDto, data *ir.InternalReference) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -68,7 +68,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, return nil } -func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *cp.ReadDetailDto, data *cp.CheckoutPolies) error { +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *ir.ReadDetailDto, data *ir.InternalReference) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) @@ -83,7 +83,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu return nil } -func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *cp.ReadDetailDto, data *cp.CheckoutPolies) error { +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *ir.ReadDetailDto, data *ir.InternalReference) error { for _, middleware := range middlewares { logData := pu.GetLogData(input, data) diff --git a/internal/use-case/main-use-case/checkout-polies/middleware.go b/internal/use-case/main-use-case/internal-reference/middleware.go similarity index 88% rename from internal/use-case/main-use-case/checkout-polies/middleware.go rename to internal/use-case/main-use-case/internal-reference/middleware.go index ebd4cff8..2afd1eaf 100644 --- a/internal/use-case/main-use-case/checkout-polies/middleware.go +++ b/internal/use-case/main-use-case/internal-reference/middleware.go @@ -1,4 +1,4 @@ -package checkout_polies +package internal_reference // example of middleware // func init() { diff --git a/internal/use-case/main-use-case/checkout-polies/tycovar.go b/internal/use-case/main-use-case/internal-reference/tycovar.go similarity index 73% rename from internal/use-case/main-use-case/checkout-polies/tycovar.go rename to internal/use-case/main-use-case/internal-reference/tycovar.go index a6978f08..10efa497 100644 --- a/internal/use-case/main-use-case/checkout-polies/tycovar.go +++ b/internal/use-case/main-use-case/internal-reference/tycovar.go @@ -6,27 +6,27 @@ In this sample it also provides type and variable regarding the needs of the middleware to separate from main use-case which has the basic CRUD functionality. The purpose of this is to make the code more maintainable. */ -package checkout_polies +package internal_reference import ( "gorm.io/gorm" - cp "simrs-vx/internal/domain/main-entities/checkout-polies" + ir "simrs-vx/internal/domain/main-entities/internal-reference" ) type createMw struct { Name string - Func func(input *cp.CreateDto, data *cp.CheckoutPolies, tx *gorm.DB) error + Func func(input *ir.CreateDto, data *ir.InternalReference, tx *gorm.DB) error } type readListMw struct { Name string - Func func(input *cp.ReadListDto, data *cp.CheckoutPolies, tx *gorm.DB) error + Func func(input *ir.ReadListDto, data *ir.InternalReference, tx *gorm.DB) error } type readDetailMw struct { Name string - Func func(input *cp.ReadDetailDto, data *cp.CheckoutPolies, tx *gorm.DB) error + Func func(input *ir.ReadDetailDto, data *ir.InternalReference, tx *gorm.DB) error } type UpdateMw = readDetailMw From 973af63bf6dd847bef7f2c53eae7fdf357ec263d Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 14 Oct 2025 10:56:25 +0700 Subject: [PATCH 159/190] add delete and update internal reference --- .../internal-reference/handler.go | 58 ++--- .../main-use-case/internal-reference/case.go | 207 ++++++++++++++++-- .../internal-reference/helper.go | 12 + .../main-use-case/internal-reference/lib.go | 90 +++++++- 4 files changed, 316 insertions(+), 51 deletions(-) diff --git a/internal/interface/main-handler/internal-reference/handler.go b/internal/interface/main-handler/internal-reference/handler.go index ca5afdc9..297cf357 100644 --- a/internal/interface/main-handler/internal-reference/handler.go +++ b/internal/interface/main-handler/internal-reference/handler.go @@ -32,39 +32,39 @@ func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { } 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) + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + dto := eir.ReadDetailDto{} + dto.Id = uint16(id) + res, err := uir.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 = uint16(id) - //res, err := u.Update(dto) - //rw.DataResponse(w, res, err) + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := eir.UpdateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint16(id) + res, err := uir.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 = uint16(id) - //res, err := u.Delete(dto) - //rw.DataResponse(w, res, err) + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := eir.DeleteDto{} + dto.Id = uint16(id) + res, err := uir.Delete(dto) + rw.DataResponse(w, res, err) } diff --git a/internal/use-case/main-use-case/internal-reference/case.go b/internal/use-case/main-use-case/internal-reference/case.go index ccb2a5fe..44bcd79e 100644 --- a/internal/use-case/main-use-case/internal-reference/case.go +++ b/internal/use-case/main-use-case/internal-reference/case.go @@ -43,21 +43,8 @@ func Create(input eir.CreateDto) (*d.Data, error) { return err } - // Validate Encounter Id - _, err := ue.ReadDetail(ee.ReadDetailDto{Id: uint16(*input.Encounter_Id)}) - if err != nil { - return err - } - - // Validate Unit Id - _, err = uu.ReadDetail(eu.ReadDetailDto{Id: *input.Unit_Id}) - if err != nil { - return err - } - - // Validate Doctor Id - _, err = ud.ReadDetail(ed.ReadDetailDto{Id: uint16(*input.Doctor_Id)}) - if err != nil { + // Validate Request + if err := validateRequest(input); err != nil { return err } @@ -144,3 +131,193 @@ func ReadList(input eir.ReadListDto) (*d.Data, error) { Data: eir.ToResponseList(dataList), }, nil } + +func ReadDetail(input eir.ReadDetailDto) (*d.Data, error) { + var data *eir.InternalReference + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func validateRequest(input eir.CreateDto) (err error) { + + // Validate Encounter Id + _, err = ue.ReadDetail(ee.ReadDetailDto{Id: uint16(*input.Encounter_Id)}) + if err != nil { + return err + } + + // Validate Unit Id + _, err = uu.ReadDetail(eu.ReadDetailDto{Id: *input.Unit_Id}) + if err != nil { + return err + } + + // Validate Doctor Id + _, err = ud.ReadDetail(ed.ReadDetailDto{Id: uint16(*input.Doctor_Id)}) + if err != nil { + return err + } + + return +} + +func Update(input eir.UpdateDto) (*d.Data, error) { + rdDto := eir.ReadDetailDto{Id: input.Id} + var data *eir.InternalReference + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + // Validate Request + if err := validateRequest(input.CreateDto); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + // Get Updated Data + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input eir.DeleteDto) (*d.Data, error) { + rdDto := eir.ReadDetailDto{Id: input.Id} + var data *eir.InternalReference + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/internal-reference/helper.go b/internal/use-case/main-use-case/internal-reference/helper.go index aaef382a..7b7f3d2b 100644 --- a/internal/use-case/main-use-case/internal-reference/helper.go +++ b/internal/use-case/main-use-case/internal-reference/helper.go @@ -5,6 +5,7 @@ Any functions that are used internally by the use-case package internal_reference import ( + "simrs-vx/internal/domain/base-entities/core" ir "simrs-vx/internal/domain/main-entities/internal-reference" ) @@ -21,3 +22,14 @@ func setData[T *ir.CreateDto | *ir.UpdateDto](input T, data *ir.InternalReferenc data.Unit_Id = inputSrc.Unit_Id data.Doctor_Id = inputSrc.Doctor_Id } + +func setDataUpdate(src ir.UpdateDto) *ir.InternalReference { + return &ir.InternalReference{ + Main: core.Main{ + Id: uint(src.Id), + }, + Encounter_Id: src.Encounter_Id, + Unit_Id: src.Unit_Id, + Doctor_Id: src.Doctor_Id, + } +} diff --git a/internal/use-case/main-use-case/internal-reference/lib.go b/internal/use-case/main-use-case/internal-reference/lib.go index 2c338f92..dee874ba 100644 --- a/internal/use-case/main-use-case/internal-reference/lib.go +++ b/internal/use-case/main-use-case/internal-reference/lib.go @@ -2,19 +2,20 @@ package internal_reference import ( "errors" - ir "simrs-vx/internal/domain/main-entities/internal-reference" + eir "simrs-vx/internal/domain/main-entities/internal-reference" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" dg "github.com/karincake/apem/db-gorm-pg" gh "github.com/karincake/getuk" "gorm.io/gorm" ) -func CreateData(input ir.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*ir.InternalReference, error) { +func CreateData(input eir.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*eir.InternalReference, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := ir.InternalReference{} + data := eir.InternalReference{} setData(&input, &data) var tx *gorm.DB @@ -32,12 +33,12 @@ func CreateData(input ir.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*ir.Inter return &data, nil } -func ReadListData(input ir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]ir.InternalReference, *ir.MetaDto, error) { +func ReadListData(input eir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]eir.InternalReference, *eir.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") - data := []ir.InternalReference{} + data := []eir.InternalReference{} pagination := gh.Pagination{} count := int64(0) - meta := ir.MetaDto{} + meta := eir.MetaDto{} var tx *gorm.DB if len(dbx) > 0 { @@ -47,7 +48,7 @@ func ReadListData(input ir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]ir. } tx = tx. - Model(&ir.InternalReference{}). + Model(&eir.InternalReference{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). @@ -68,3 +69,78 @@ func ReadListData(input ir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]ir. pl.SetLogInfo(event, nil, "complete") return data, &meta, nil } + +func ReadDetailData(input eir.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*eir.InternalReference, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := eir.InternalReference{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + preload := "encounter,unit,doctor" + + if err := tx. + Scopes(gh.Preload(preload)). + First(&data, input.Id). + Error; err != nil { + + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input eir.UpdateDto, data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + data = setDataUpdate(input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} From 6c6ad16af9177c30acbaa3c3ffac77b4c24c4eb2 Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 14 Oct 2025 10:56:25 +0700 Subject: [PATCH 160/190] add delete and update internal reference --- .../internal-reference/handler.go | 58 ++--- internal/interface/migration/main-entities.go | 4 +- .../main-use-case/internal-reference/case.go | 207 ++++++++++++++++-- .../internal-reference/helper.go | 9 + .../main-use-case/internal-reference/lib.go | 90 +++++++- 5 files changed, 315 insertions(+), 53 deletions(-) diff --git a/internal/interface/main-handler/internal-reference/handler.go b/internal/interface/main-handler/internal-reference/handler.go index ca5afdc9..297cf357 100644 --- a/internal/interface/main-handler/internal-reference/handler.go +++ b/internal/interface/main-handler/internal-reference/handler.go @@ -32,39 +32,39 @@ func (obj myBase) GetList(w http.ResponseWriter, r *http.Request) { } 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) + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + dto := eir.ReadDetailDto{} + dto.Id = uint16(id) + res, err := uir.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 = uint16(id) - //res, err := u.Update(dto) - //rw.DataResponse(w, res, err) + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := eir.UpdateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint16(id) + res, err := uir.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 = uint16(id) - //res, err := u.Delete(dto) - //rw.DataResponse(w, res, err) + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := eir.DeleteDto{} + dto.Id = uint16(id) + res, err := uir.Delete(dto) + rw.DataResponse(w, res, err) } diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 3821e982..41bb18db 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -24,7 +24,7 @@ import ( inpatient "simrs-vx/internal/domain/main-entities/inpatient" installation "simrs-vx/internal/domain/main-entities/installation" insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" - checkoutpolies "simrs-vx/internal/domain/main-entities/internal-reference" + internalreference "simrs-vx/internal/domain/main-entities/internal-reference" item "simrs-vx/internal/domain/main-entities/item" itemprice "simrs-vx/internal/domain/main-entities/item-price" laborant "simrs-vx/internal/domain/main-entities/laborant" @@ -152,6 +152,6 @@ func getMainEntities() []any { &chemo.Chemo{}, &midwife.Midwife{}, &postalregion.PostalRegion{}, - &checkoutpolies.CheckoutPolies{}, + &internalreference.InternalReference{}, } } diff --git a/internal/use-case/main-use-case/internal-reference/case.go b/internal/use-case/main-use-case/internal-reference/case.go index ccb2a5fe..44bcd79e 100644 --- a/internal/use-case/main-use-case/internal-reference/case.go +++ b/internal/use-case/main-use-case/internal-reference/case.go @@ -43,21 +43,8 @@ func Create(input eir.CreateDto) (*d.Data, error) { return err } - // Validate Encounter Id - _, err := ue.ReadDetail(ee.ReadDetailDto{Id: uint16(*input.Encounter_Id)}) - if err != nil { - return err - } - - // Validate Unit Id - _, err = uu.ReadDetail(eu.ReadDetailDto{Id: *input.Unit_Id}) - if err != nil { - return err - } - - // Validate Doctor Id - _, err = ud.ReadDetail(ed.ReadDetailDto{Id: uint16(*input.Doctor_Id)}) - if err != nil { + // Validate Request + if err := validateRequest(input); err != nil { return err } @@ -144,3 +131,193 @@ func ReadList(input eir.ReadListDto) (*d.Data, error) { Data: eir.ToResponseList(dataList), }, nil } + +func ReadDetail(input eir.ReadDetailDto) (*d.Data, error) { + var data *eir.InternalReference + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func validateRequest(input eir.CreateDto) (err error) { + + // Validate Encounter Id + _, err = ue.ReadDetail(ee.ReadDetailDto{Id: uint16(*input.Encounter_Id)}) + if err != nil { + return err + } + + // Validate Unit Id + _, err = uu.ReadDetail(eu.ReadDetailDto{Id: *input.Unit_Id}) + if err != nil { + return err + } + + // Validate Doctor Id + _, err = ud.ReadDetail(ed.ReadDetailDto{Id: uint16(*input.Doctor_Id)}) + if err != nil { + return err + } + + return +} + +func Update(input eir.UpdateDto) (*d.Data, error) { + rdDto := eir.ReadDetailDto{Id: input.Id} + var data *eir.InternalReference + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + // Validate Request + if err := validateRequest(input.CreateDto); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + // Get Updated Data + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input eir.DeleteDto) (*d.Data, error) { + rdDto := eir.ReadDetailDto{Id: input.Id} + var data *eir.InternalReference + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/internal-reference/helper.go b/internal/use-case/main-use-case/internal-reference/helper.go index aaef382a..39dbe199 100644 --- a/internal/use-case/main-use-case/internal-reference/helper.go +++ b/internal/use-case/main-use-case/internal-reference/helper.go @@ -21,3 +21,12 @@ func setData[T *ir.CreateDto | *ir.UpdateDto](input T, data *ir.InternalReferenc data.Unit_Id = inputSrc.Unit_Id data.Doctor_Id = inputSrc.Doctor_Id } + +func setDataUpdate(src ir.UpdateDto, dst *ir.InternalReference) *ir.InternalReference { + return &ir.InternalReference{ + Main: dst.Main, + Encounter_Id: src.Encounter_Id, + Unit_Id: src.Unit_Id, + Doctor_Id: src.Doctor_Id, + } +} diff --git a/internal/use-case/main-use-case/internal-reference/lib.go b/internal/use-case/main-use-case/internal-reference/lib.go index 2c338f92..54b862ae 100644 --- a/internal/use-case/main-use-case/internal-reference/lib.go +++ b/internal/use-case/main-use-case/internal-reference/lib.go @@ -2,19 +2,20 @@ package internal_reference import ( "errors" - ir "simrs-vx/internal/domain/main-entities/internal-reference" + eir "simrs-vx/internal/domain/main-entities/internal-reference" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" dg "github.com/karincake/apem/db-gorm-pg" gh "github.com/karincake/getuk" "gorm.io/gorm" ) -func CreateData(input ir.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*ir.InternalReference, error) { +func CreateData(input eir.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*eir.InternalReference, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := ir.InternalReference{} + data := eir.InternalReference{} setData(&input, &data) var tx *gorm.DB @@ -32,12 +33,12 @@ func CreateData(input ir.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*ir.Inter return &data, nil } -func ReadListData(input ir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]ir.InternalReference, *ir.MetaDto, error) { +func ReadListData(input eir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]eir.InternalReference, *eir.MetaDto, error) { pl.SetLogInfo(event, input, "started", "DBReadList") - data := []ir.InternalReference{} + data := []eir.InternalReference{} pagination := gh.Pagination{} count := int64(0) - meta := ir.MetaDto{} + meta := eir.MetaDto{} var tx *gorm.DB if len(dbx) > 0 { @@ -47,7 +48,7 @@ func ReadListData(input ir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]ir. } tx = tx. - Model(&ir.InternalReference{}). + Model(&eir.InternalReference{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). @@ -68,3 +69,78 @@ func ReadListData(input ir.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]ir. pl.SetLogInfo(event, nil, "complete") return data, &meta, nil } + +func ReadDetailData(input eir.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*eir.InternalReference, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := eir.InternalReference{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + preload := "encounter,unit,doctor" + + if err := tx. + Scopes(gh.Preload(preload)). + First(&data, input.Id). + Error; err != nil { + + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input eir.UpdateDto, data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + data = setDataUpdate(input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} From ec08939fa81068c761430e39508992762eaa57fe Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 14 Oct 2025 13:03:26 +0700 Subject: [PATCH 161/190] add sever table for vclaim, update encounter --- cmd/bpjs-api/config.yml-example | 66 +++++++++++++++++++ cmd/bpjs-api/main.go | 14 ++++ .../migrations/20251014060047.sql | 36 ++++++++++ cmd/main-migration/migrations/atlas.sum | 5 +- .../bpjs-entities/vclaim-sep-hist/dto.go | 1 + .../bpjs-entities/vclaim-sep-hist/entitiy.go | 12 ++++ .../bpjs-entities/vclaim-sep-print/dto.go | 1 + .../bpjs-entities/vclaim-sep-print/entity.go | 13 ++++ .../domain/bpjs-entities/vclaim-sep/dto.go | 1 + .../bpjs-entities/vclaim-sep/entitiy.go | 11 ++++ .../domain/main-entities/encounter/entity.go | 13 ++++ .../interface/bpjs-handler/bpjs-handler.go | 52 +++++++++++++++ internal/interface/migration/main-entities.go | 8 +++ 13 files changed, 231 insertions(+), 2 deletions(-) create mode 100644 cmd/bpjs-api/config.yml-example create mode 100644 cmd/bpjs-api/main.go create mode 100644 cmd/main-migration/migrations/20251014060047.sql create mode 100644 internal/domain/bpjs-entities/vclaim-sep-hist/dto.go create mode 100644 internal/domain/bpjs-entities/vclaim-sep-hist/entitiy.go create mode 100644 internal/domain/bpjs-entities/vclaim-sep-print/dto.go create mode 100644 internal/domain/bpjs-entities/vclaim-sep-print/entity.go create mode 100644 internal/domain/bpjs-entities/vclaim-sep/dto.go create mode 100644 internal/domain/bpjs-entities/vclaim-sep/entitiy.go create mode 100644 internal/interface/bpjs-handler/bpjs-handler.go diff --git a/cmd/bpjs-api/config.yml-example b/cmd/bpjs-api/config.yml-example new file mode 100644 index 00000000..f131a725 --- /dev/null +++ b/cmd/bpjs-api/config.yml-example @@ -0,0 +1,66 @@ +appCfg: + fullName: BPJS Bridge + codeName: simrs-vx + version: 0.1.0 + env: development + lang: en + +httpCfg: + host: + port: + +dbCfg: + dsn: + maxOpenConns: 5 + maxIdleConns: 5 + maxIdleTime: 100 + +multiDbCfg: + - dbs : + name: + dsn: + maxOpenConns: + maxIdleConns: + maxIdleTime: + - bpjs + name: bpjs + dsn: + maxOpenConns: + maxIdleConns: + maxIdleTime: + +loggerCfg: + hideTime: + hideLevel: + +msCfg: + dsn: + +langCfg: + active: + path: + fileName: + +minioCfg: + endpoint: + region: + accessKey: + secretKey: + useSsl: + bucketName: + - patient + +corsCfg: + allowedOrigin: + allowedMethod: + +satuSehatCfg: + host: localhost:8200 + +bpjsCfg: + host: localhost:8200 + +corsCfg: + allowedOrigins: + - http://example.com + allowedMethod: \ No newline at end of file diff --git a/cmd/bpjs-api/main.go b/cmd/bpjs-api/main.go new file mode 100644 index 00000000..74be3afd --- /dev/null +++ b/cmd/bpjs-api/main.go @@ -0,0 +1,14 @@ +package main + +import ( + a "github.com/karincake/apem" + d "github.com/karincake/apem/db-gorm-pg" + l "github.com/karincake/apem/logger-zerolog" + m "github.com/karincake/apem/ms-redis" + + h "simrs-vx/internal/interface/main-handler" +) + +func main() { + a.Run(h.SetRoutes(), &l.O, &m.O, &d.O) +} diff --git a/cmd/main-migration/migrations/20251014060047.sql b/cmd/main-migration/migrations/20251014060047.sql new file mode 100644 index 00000000..1d13853a --- /dev/null +++ b/cmd/main-migration/migrations/20251014060047.sql @@ -0,0 +1,36 @@ +-- Create "VClaimSepHist" table +CREATE TABLE "public"."VClaimSepHist" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "RequestPayload" text NULL, + "ResponseBody" text NULL, + "Message" text NULL, + PRIMARY KEY ("Id") +); +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" ADD COLUMN "PaymentMethod_Code" character varying(10) NULL, ADD COLUMN "InsuranceCompany_Id" bigint NULL, ADD COLUMN "Member_Number" character varying(20) NULL, ADD COLUMN "Ref_Number" character varying(20) NULL, ADD COLUMN "Trx_Number" character varying(20) NULL, ADD COLUMN "Adm_Employee_Id" bigint NULL, ADD CONSTRAINT "uni_Encounter_Member_Number" UNIQUE ("Member_Number"), ADD CONSTRAINT "uni_Encounter_Ref_Number" UNIQUE ("Ref_Number"), ADD CONSTRAINT "uni_Encounter_Trx_Number" UNIQUE ("Trx_Number"), ADD CONSTRAINT "fk_Encounter_Adm_Employee" FOREIGN KEY ("Adm_Employee_Id") REFERENCES "public"."Employee" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_Encounter_InsuranceCompany" FOREIGN KEY ("InsuranceCompany_Id") REFERENCES "public"."InsuranceCompany" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Create "VClaimSep" table +CREATE TABLE "public"."VClaimSep" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Number" character varying(19) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_VClaimSep_Number" UNIQUE ("Number"), + CONSTRAINT "fk_Encounter_VclaimSep" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "VClaimSepPrint" table +CREATE TABLE "public"."VClaimSepPrint" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "VclaimSep_Number" character varying(19) NULL, + "Counter" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_VClaimSepPrint_VclaimSep" FOREIGN KEY ("VclaimSep_Number") REFERENCES "public"."VClaimSep" ("Number") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 4d946518..5b2a1d8a 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:oj0SGm9EAjoGuXcWbue8k9Uqy/W1N7iFjPky7Cg7G6s= +h1:awmI0os0fmaoSemyQuKI5+2Xb4eCH+Jgqm8dZIsXskw= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -39,4 +39,5 @@ h1:oj0SGm9EAjoGuXcWbue8k9Uqy/W1N7iFjPky7Cg7G6s= 20251010072711.sql h1:ZJNqR2piyu8xJhBvVABSlnGEoKSKae3wuEs+wshPe4k= 20251013044536.sql h1:0Xjw8fNILiT8nnfrJDZgQnPf3dntmIoilbapnih8AE4= 20251013051438.sql h1:lfSuw5mgJnePBJamvhZ81osFIouXeiIEiSZ/evdwo48= -20251013081808.sql h1:AqNqfPWEI8fgozZ+EhIT1pKsbN+0R8njTTu++rF6dKA= +20251013081808.sql h1:ijgjNX08G6GBjA/ks8EKtb7P7Y7Cg7zbhqEOruGnv6M= +20251014060047.sql h1:sX9aIpf35MbyclzP4+ULVabPTMV8E9G+6caCsg4WWbQ= diff --git a/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go b/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go new file mode 100644 index 00000000..778154cb --- /dev/null +++ b/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go @@ -0,0 +1 @@ +package vclaimsephist diff --git a/internal/domain/bpjs-entities/vclaim-sep-hist/entitiy.go b/internal/domain/bpjs-entities/vclaim-sep-hist/entitiy.go new file mode 100644 index 00000000..a5a22da3 --- /dev/null +++ b/internal/domain/bpjs-entities/vclaim-sep-hist/entitiy.go @@ -0,0 +1,12 @@ +package vclaimsephist + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type VClaimSepHist struct { + ecore.Main + RequestPayload *string `json:"requestPayload"` + ResponseBody *string `json:"responseBody"` + Message *string `json:"message"` +} diff --git a/internal/domain/bpjs-entities/vclaim-sep-print/dto.go b/internal/domain/bpjs-entities/vclaim-sep-print/dto.go new file mode 100644 index 00000000..b975dd96 --- /dev/null +++ b/internal/domain/bpjs-entities/vclaim-sep-print/dto.go @@ -0,0 +1 @@ +package vclaimsepprint diff --git a/internal/domain/bpjs-entities/vclaim-sep-print/entity.go b/internal/domain/bpjs-entities/vclaim-sep-print/entity.go new file mode 100644 index 00000000..d1a0a156 --- /dev/null +++ b/internal/domain/bpjs-entities/vclaim-sep-print/entity.go @@ -0,0 +1,13 @@ +package vclaimsepprint + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + evs "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" +) + +type VClaimSepPrint struct { + ecore.Main + VclaimSep_Number *string `json:"vclaimSep_number"` + VclaimSep *evs.VClaimSep `json:"vclaimSep,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"` + Counter *uint `json:"counter"` +} diff --git a/internal/domain/bpjs-entities/vclaim-sep/dto.go b/internal/domain/bpjs-entities/vclaim-sep/dto.go new file mode 100644 index 00000000..ce4c6f55 --- /dev/null +++ b/internal/domain/bpjs-entities/vclaim-sep/dto.go @@ -0,0 +1 @@ +package vclaimsep diff --git a/internal/domain/bpjs-entities/vclaim-sep/entitiy.go b/internal/domain/bpjs-entities/vclaim-sep/entitiy.go new file mode 100644 index 00000000..8cbdfce6 --- /dev/null +++ b/internal/domain/bpjs-entities/vclaim-sep/entitiy.go @@ -0,0 +1,11 @@ +package vclaimsep + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type VClaimSep struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Number *string `json:"number" gorm:"unique;size:19"` +} diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 87833b37..321e838f 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -2,12 +2,16 @@ package encounter import ( ecore "simrs-vx/internal/domain/base-entities/core" + evs "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" ea "simrs-vx/internal/domain/main-entities/appointment" ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/employee" + ei "simrs-vx/internal/domain/main-entities/insurance-company" ep "simrs-vx/internal/domain/main-entities/patient" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" eu "simrs-vx/internal/domain/main-entities/unit" + erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" "time" @@ -26,8 +30,16 @@ type Encounter struct { Subspecialist_Id *uint16 `json:"subspecialist_id"` Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Id;references:Id"` VisitDate time.Time `json:"visitDate"` + PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` + InsuranceCompany_Id *uint `json:"insuranceCompany_id"` + Member_Number *string `json:"memberNumber" gorm:"unique;size:20"` + Ref_Number *string `json:"refNumber" gorm:"unique;size:20"` + Trx_Number *string `json:"trxNumber" gorm:"unique;size:20"` + InsuranceCompany *ei.InsuranceCompany `json:"insuranceCompany,omitempty" gorm:"foreignKey:InsuranceCompany_Id;references:Id"` Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` Appointment_Doctor *ed.Doctor `json:"appointment_doctor,omitempty" gorm:"foreignKey:Appointment_Doctor_Id;references:Id"` + Adm_Employee_Id *uint `json:"admEmployee_id"` + Adm_Employee *ee.Employee `json:"admEmployee,omitempty" gorm:"foreignKey:Adm_Employee_Id;references:Id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty" gorm:"foreignKey:Responsible_Doctor_Id;references:Id"` DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code" gorm:"size:16"` @@ -39,6 +51,7 @@ type Encounter struct { AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:10"` + VclaimSep *evs.VClaimSep `json:"vclaimSep,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` } func (d Encounter) IsDone() bool { diff --git a/internal/interface/bpjs-handler/bpjs-handler.go b/internal/interface/bpjs-handler/bpjs-handler.go new file mode 100644 index 00000000..a3d86116 --- /dev/null +++ b/internal/interface/bpjs-handler/bpjs-handler.go @@ -0,0 +1,52 @@ +package bpjshandler + +import ( + "net/http" + + /******************** main / transaction ********************/ + + /******************** actor ********************/ + + /******************** external ********************/ + a "github.com/karincake/apem" + + /******************** infra ********************/ + gs "simrs-vx/internal/infra/gorm-setting" + minio "simrs-vx/internal/infra/minio" + ssdb "simrs-vx/internal/infra/ss-db" + + /******************** pkg ********************/ + cmw "simrs-vx/pkg/cors-manager-mw" + lh "simrs-vx/pkg/lang-helper" + handlerlogger "simrs-vx/pkg/middleware/handler-logger" + mh "simrs-vx/pkg/minio-helper" + zlc "simrs-vx/pkg/zerolog-ctx" + + /******************** sources ********************/ + ///// Internal + validation "simrs-vx/internal/interface/main-handler/helper/validation" + "simrs-vx/internal/interface/main-handler/home" +) + +// One place route to relatively easier to manage, ESPECIALLY in tracking +func SetRoutes() http.Handler { + ///// + a.RegisterExtCall(gs.Adjust) + a.RegisterExtCall(zlc.Adjust) + a.RegisterExtCall(ssdb.SetInstance) + a.RegisterExtCall(lh.Populate) + a.RegisterExtCall(minio.Connect) + a.RegisterExtCall(mh.I.SetClient) + a.RegisterExtCall(validation.RegisterValidation) + + r := http.NewServeMux() + + /******************** Main ********************/ + r.HandleFunc("/", home.Home) + + /******************** actor ********************/ + + /******************** sources ********************/ + + return cmw.SetCors(handlerlogger.SetLog(r)) +} diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 41bb18db..82b14f23 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -75,6 +75,11 @@ import ( uom "simrs-vx/internal/domain/main-entities/uom" user "simrs-vx/internal/domain/main-entities/user" village "simrs-vx/internal/domain/main-entities/village" + + ///BPJS + vclaimsep "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + vclaimsephist "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" + vclaimsepprint "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" ) func getMainEntities() []any { @@ -123,6 +128,7 @@ func getMainEntities() []any { &personrelative.PersonRelative{}, &patient.Patient{}, &appointment.Appointment{}, + &vclaimsep.VClaimSep{}, &encounter.Encounter{}, &laborant.Laborant{}, &specialist.Specialist{}, @@ -153,5 +159,7 @@ func getMainEntities() []any { &midwife.Midwife{}, &postalregion.PostalRegion{}, &internalreference.InternalReference{}, + &vclaimsephist.VClaimSepHist{}, + &vclaimsepprint.VClaimSepPrint{}, } } From 9c49b90bb6939173fe97627b0de85424d2cdb9dd Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 14 Oct 2025 13:23:58 +0700 Subject: [PATCH 162/190] feat (encounter): update entity and adjust --- .../domain/main-entities/encounter/dto.go | 24 +++++++++++++++++++ .../domain/main-entities/encounter/entity.go | 6 ++--- .../main-use-case/encounter/helper.go | 6 +++++ 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 608d26dd..93685899 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -4,8 +4,10 @@ import ( "time" ecore "simrs-vx/internal/domain/base-entities/core" + evs "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" ea "simrs-vx/internal/domain/main-entities/appointment" ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/employee" ep "simrs-vx/internal/domain/main-entities/patient" es "simrs-vx/internal/domain/main-entities/specialist" ess "simrs-vx/internal/domain/main-entities/subspecialist" @@ -25,7 +27,13 @@ type CreateDto struct { Specialist_Id *uint16 `json:"specialist_id"` Subspecialist_Id *uint16 `json:"subspecialist_id"` VisitDate time.Time `json:"visitDate"` + PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` + InsuranceCompany_Id *uint `json:"insuranceCompany_id"` + Member_Number *string `json:"memberNumber" validate:"maxLength=20"` + Ref_Number *string `json:"refNumber" validate:"maxLength=20"` + Trx_Number *string `json:"trxNumber" validate:"maxLength=20"` Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` + Adm_Employee_Id *uint `json:"adm_employee_id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` Appointment_Id *uint `json:"appointment_id"` @@ -97,10 +105,17 @@ type ResponseDto struct { Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` Unit *eu.Unit `json:"unit,omitempty"` VisitDate time.Time `json:"visitDate"` + PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code"` + InsuranceCompany_Id *uint `json:"insuranceCompany_id"` + Member_Number *string `json:"memberNumber"` + Ref_Number *string `json:"refNumber"` + Trx_Number *string `json:"trxNumber"` Appointment_Doctor_Id *uint `json:"assignment_doctor_id"` Appointment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty"` + Adm_Employee_Id *uint `json:"adm_employee_id"` + Adm_Employee *ee.Employee `json:"adm_employee,omitempty"` DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code"` RefSource_Name *string `json:"refSource_name"` Appointment_Id *uint `json:"appointment_id"` @@ -110,6 +125,7 @@ type ResponseDto struct { AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` Status_Code erc.DataStatusCode `json:"status_code"` + VclaimSep *evs.VClaimSep `json:"vclaimSep,omitempty"` } func (d Encounter) ToResponse() ResponseDto { @@ -125,8 +141,15 @@ func (d Encounter) ToResponse() ResponseDto { Subspecialist_Id: d.Subspecialist_Id, Subspecialist: d.Subspecialist, VisitDate: d.VisitDate, + PaymentMethod_Code: d.PaymentMethod_Code, + InsuranceCompany_Id: d.InsuranceCompany_Id, + Member_Number: d.Member_Number, + Ref_Number: d.Ref_Number, + Trx_Number: d.Trx_Number, Appointment_Doctor_Id: d.Appointment_Doctor_Id, Appointment_Doctor: d.Appointment_Doctor, + Adm_Employee_Id: d.Adm_Employee_Id, + Adm_Employee: d.Adm_Employee, Responsible_Doctor_Id: d.Responsible_Doctor_Id, Responsible_Doctor: d.Responsible_Doctor, DischargeMethod_Code: d.DischargeMethod_Code, @@ -138,6 +161,7 @@ func (d Encounter) ToResponse() ResponseDto { AdmDischargeEducation: d.AdmDischargeEducation, DischargeReason: d.DischargeReason, Status_Code: d.Status_Code, + VclaimSep: d.VclaimSep, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 321e838f..50080a37 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -32,14 +32,14 @@ type Encounter struct { VisitDate time.Time `json:"visitDate"` PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` InsuranceCompany_Id *uint `json:"insuranceCompany_id"` + InsuranceCompany *ei.InsuranceCompany `json:"insuranceCompany,omitempty" gorm:"foreignKey:InsuranceCompany_Id;references:Id"` Member_Number *string `json:"memberNumber" gorm:"unique;size:20"` Ref_Number *string `json:"refNumber" gorm:"unique;size:20"` Trx_Number *string `json:"trxNumber" gorm:"unique;size:20"` - InsuranceCompany *ei.InsuranceCompany `json:"insuranceCompany,omitempty" gorm:"foreignKey:InsuranceCompany_Id;references:Id"` Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` Appointment_Doctor *ed.Doctor `json:"appointment_doctor,omitempty" gorm:"foreignKey:Appointment_Doctor_Id;references:Id"` - Adm_Employee_Id *uint `json:"admEmployee_id"` - Adm_Employee *ee.Employee `json:"admEmployee,omitempty" gorm:"foreignKey:Adm_Employee_Id;references:Id"` + Adm_Employee_Id *uint `json:"adm_employee_id"` + Adm_Employee *ee.Employee `json:"adm_employee,omitempty" gorm:"foreignKey:Adm_Employee_Id;references:Id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` Responsible_Doctor *ed.Doctor `json:"responsible_doctor,omitempty" gorm:"foreignKey:Responsible_Doctor_Id;references:Id"` DischargeMethod_Code *ere.DischargeMethodCode `json:"dischargeMethod_code" gorm:"size:16"` diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 8d9ea44d..9b8f5999 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -55,7 +55,13 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { data.Specialist_Id = inputSrc.Specialist_Id data.Subspecialist_Id = inputSrc.Subspecialist_Id data.VisitDate = inputSrc.VisitDate + data.PaymentMethod_Code = inputSrc.PaymentMethod_Code + data.InsuranceCompany_Id = inputSrc.InsuranceCompany_Id + data.Member_Number = inputSrc.Member_Number + data.Ref_Number = inputSrc.Ref_Number + data.Trx_Number = inputSrc.Trx_Number data.Appointment_Doctor_Id = inputSrc.Appointment_Doctor_Id + data.Adm_Employee_Id = inputSrc.Adm_Employee_Id data.Responsible_Doctor_Id = inputSrc.Responsible_Doctor_Id data.RefSource_Name = inputSrc.RefSource_Name data.Appointment_Id = inputSrc.Appointment_Id From 3976f74556ff6e223ba5dc4115f5ad6b17e524dc Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 14 Oct 2025 13:34:20 +0700 Subject: [PATCH 163/190] wip --- .../bpjs-entities/vclaim-sep-hist/dto.go | 66 +++++ .../bpjs-entities/vclaim-sep-print/dto.go | 60 ++++ .../domain/bpjs-entities/vclaim-sep/dto.go | 61 ++++ .../use-case/bpjs-use-case/vclaim-sep/case.go | 279 ++++++++++++++++++ .../bpjs-use-case/vclaim-sep/helper.go | 25 ++ .../use-case/bpjs-use-case/vclaim-sep/lib.go | 140 +++++++++ .../vclaim-sep/middleware-runner.go | 103 +++++++ .../bpjs-use-case/vclaim-sep/middleware.go | 9 + .../bpjs-use-case/vclaim-sep/tycovar.go | 44 +++ 9 files changed, 787 insertions(+) create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep/case.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep/helper.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep/lib.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep/middleware-runner.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep/middleware.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep/tycovar.go diff --git a/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go b/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go index 778154cb..83a389cc 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go @@ -1 +1,67 @@ package vclaimsephist + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + RequestPayload *string `json:"requestPayload"` + ResponseBody *string `json:"responseBody"` + Message *string `json:"message"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + RequestPayload *string `json:"requestPayload"` + ResponseBody *string `json:"responseBody"` + Message *string `json:"message"` +} + +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + RequestPayload *string `json:"requestPayload"` + ResponseBody *string `json:"responseBody"` + Message *string `json:"message"` +} + +func (d VClaimSepHist) ToResponse() ResponseDto { + resp := ResponseDto{ + RequestPayload: d.RequestPayload, + ResponseBody: d.ResponseBody, + Message: d.Message, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []VClaimSepHist) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/bpjs-entities/vclaim-sep-print/dto.go b/internal/domain/bpjs-entities/vclaim-sep-print/dto.go index b975dd96..b3383ff9 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-print/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep-print/dto.go @@ -1 +1,61 @@ package vclaimsepprint + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + VclaimSep_Number *string `json:"vclaimSep_number"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + VclaimSep_Number *string `json:"vclaimSep_number"` +} + +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + VclaimSep_Number *string `json:"vclaimSep_number"` + Counter *uint `json:"counter"` +} + +func (d VClaimSepPrint) ToResponse() ResponseDto { + resp := ResponseDto{ + VclaimSep_Number: d.VclaimSep_Number, + Counter: d.Counter, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []VClaimSepPrint) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/bpjs-entities/vclaim-sep/dto.go b/internal/domain/bpjs-entities/vclaim-sep/dto.go index ce4c6f55..1ea32bff 100644 --- a/internal/domain/bpjs-entities/vclaim-sep/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep/dto.go @@ -1 +1,62 @@ package vclaimsep + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" +) + +type CreateDto struct { + Encounter_Id *uint `json:"encounter_id"` + Number *string `json:"number" validate:"maxLength=19"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Number *string `json:"number"` +} + +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Encounter_Id *uint `json:"encounter_id"` + Number *string `json:"number"` +} + +func (d VClaimSep) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Number: d.Number, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []VClaimSep) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/case.go b/internal/use-case/bpjs-use-case/vclaim-sep/case.go new file mode 100644 index 00000000..01a47536 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep/case.go @@ -0,0 +1,279 @@ +package vclaimsep + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "vclaim-sep" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.VclaimSep{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if err := createItem(&input, &event, tx); err != nil { + return err + } + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.VclaimSep + var dataList []e.VclaimSep + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.VclaimSep + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.VclaimSep + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + var data *e.VclaimSep + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/helper.go b/internal/use-case/bpjs-use-case/vclaim-sep/helper.go new file mode 100644 index 00000000..8e5949dd --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep/helper.go @@ -0,0 +1,25 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package vclaimsep + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSep) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Code = inputSrc.Code + data.Name = inputSrc.Name + data.Uom_Code = inputSrc.Uom_Code + data.Item_Id = inputSrc.Item_Id + data.Infra_Id = inputSrc.Infra_Id +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/lib.go b/internal/use-case/bpjs-use-case/vclaim-sep/lib.go new file mode 100644 index 00000000..c80b5c7b --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep/lib.go @@ -0,0 +1,140 @@ +package vclaimsep + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.VclaimSep, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.VclaimSep{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.VclaimSep, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.VclaimSep{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.VclaimSep{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.VclaimSep, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.VclaimSep{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.VclaimSep, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.VclaimSep, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/middleware-runner.go b/internal/use-case/bpjs-use-case/vclaim-sep/middleware-runner.go new file mode 100644 index 00000000..dee35276 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep/middleware-runner.go @@ -0,0 +1,103 @@ +package vclaimsep + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.VclaimSep) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.VclaimSep) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSep) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSep) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSep) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/middleware.go b/internal/use-case/bpjs-use-case/vclaim-sep/middleware.go new file mode 100644 index 00000000..6edc2873 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep/middleware.go @@ -0,0 +1,9 @@ +package vclaimsep + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/tycovar.go b/internal/use-case/bpjs-use-case/vclaim-sep/tycovar.go new file mode 100644 index 00000000..932bc355 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package vclaimsep + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.VclaimSep, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.VclaimSep, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.VclaimSep, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From 1b1f641c2c048fb6bcf1e4a82e2a33f7246fa0d2 Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 14 Oct 2025 13:35:48 +0700 Subject: [PATCH 164/190] revised lib and usecase update --- internal/domain/main-entities/internal-reference/dto.go | 3 ++- .../interface/main-handler/internal-reference/handler.go | 2 ++ .../use-case/main-use-case/internal-reference/case.go | 2 ++ .../use-case/main-use-case/internal-reference/helper.go | 9 --------- .../use-case/main-use-case/internal-reference/lib.go | 7 +++---- 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/internal/domain/main-entities/internal-reference/dto.go b/internal/domain/main-entities/internal-reference/dto.go index 5ac439b9..6c71e6f1 100644 --- a/internal/domain/main-entities/internal-reference/dto.go +++ b/internal/domain/main-entities/internal-reference/dto.go @@ -26,7 +26,8 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint16 `json:"id"` + Includes string `json:"includes"` } type UpdateDto struct { diff --git a/internal/interface/main-handler/internal-reference/handler.go b/internal/interface/main-handler/internal-reference/handler.go index 297cf357..c46c974d 100644 --- a/internal/interface/main-handler/internal-reference/handler.go +++ b/internal/interface/main-handler/internal-reference/handler.go @@ -36,7 +36,9 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { if id <= 0 { return } + dto := eir.ReadDetailDto{} + sf.UrlQueryParam(&dto, *r.URL) dto.Id = uint16(id) res, err := uir.ReadDetail(dto) rw.DataResponse(w, res, err) diff --git a/internal/use-case/main-use-case/internal-reference/case.go b/internal/use-case/main-use-case/internal-reference/case.go index 44bcd79e..a71699e2 100644 --- a/internal/use-case/main-use-case/internal-reference/case.go +++ b/internal/use-case/main-use-case/internal-reference/case.go @@ -152,6 +152,7 @@ func ReadDetail(input eir.ReadDetailDto) (*d.Data, error) { return err } + //input.Includes = "encounter,unit,doctor" if data, err = ReadDetailData(input, &event, tx); err != nil { return err } @@ -238,6 +239,7 @@ func Update(input eir.UpdateDto) (*d.Data, error) { } // Get Updated Data + rdDto.Includes = "encounter,unit,doctor" if data, err = ReadDetailData(rdDto, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/internal-reference/helper.go b/internal/use-case/main-use-case/internal-reference/helper.go index 39dbe199..aaef382a 100644 --- a/internal/use-case/main-use-case/internal-reference/helper.go +++ b/internal/use-case/main-use-case/internal-reference/helper.go @@ -21,12 +21,3 @@ func setData[T *ir.CreateDto | *ir.UpdateDto](input T, data *ir.InternalReferenc data.Unit_Id = inputSrc.Unit_Id data.Doctor_Id = inputSrc.Doctor_Id } - -func setDataUpdate(src ir.UpdateDto, dst *ir.InternalReference) *ir.InternalReference { - return &ir.InternalReference{ - Main: dst.Main, - Encounter_Id: src.Encounter_Id, - Unit_Id: src.Unit_Id, - Doctor_Id: src.Doctor_Id, - } -} diff --git a/internal/use-case/main-use-case/internal-reference/lib.go b/internal/use-case/main-use-case/internal-reference/lib.go index 54b862ae..44db86c5 100644 --- a/internal/use-case/main-use-case/internal-reference/lib.go +++ b/internal/use-case/main-use-case/internal-reference/lib.go @@ -81,10 +81,8 @@ func ReadDetailData(input eir.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) ( tx = dg.I } - preload := "encounter,unit,doctor" - if err := tx. - Scopes(gh.Preload(preload)). + Scopes(gh.Preload(input.Includes)). First(&data, input.Id). Error; err != nil { @@ -99,7 +97,8 @@ func ReadDetailData(input eir.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) ( func UpdateData(input eir.UpdateDto, data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - data = setDataUpdate(input, data) + setData(&input, data) + //data = setDataUpdate(input, data) var tx *gorm.DB if len(dbx) > 0 { From f93621ac2b3627aa12065bc3f84c61d42c1d30a2 Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 14 Oct 2025 13:35:48 +0700 Subject: [PATCH 165/190] revised lib and usecase update --- internal/domain/main-entities/internal-reference/dto.go | 3 ++- .../interface/main-handler/internal-reference/handler.go | 2 ++ .../use-case/main-use-case/internal-reference/case.go | 1 + .../use-case/main-use-case/internal-reference/helper.go | 9 --------- .../use-case/main-use-case/internal-reference/lib.go | 6 ++---- 5 files changed, 7 insertions(+), 14 deletions(-) diff --git a/internal/domain/main-entities/internal-reference/dto.go b/internal/domain/main-entities/internal-reference/dto.go index 5ac439b9..6c71e6f1 100644 --- a/internal/domain/main-entities/internal-reference/dto.go +++ b/internal/domain/main-entities/internal-reference/dto.go @@ -26,7 +26,8 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint16 `json:"id"` + Includes string `json:"includes"` } type UpdateDto struct { diff --git a/internal/interface/main-handler/internal-reference/handler.go b/internal/interface/main-handler/internal-reference/handler.go index 297cf357..c46c974d 100644 --- a/internal/interface/main-handler/internal-reference/handler.go +++ b/internal/interface/main-handler/internal-reference/handler.go @@ -36,7 +36,9 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { if id <= 0 { return } + dto := eir.ReadDetailDto{} + sf.UrlQueryParam(&dto, *r.URL) dto.Id = uint16(id) res, err := uir.ReadDetail(dto) rw.DataResponse(w, res, err) diff --git a/internal/use-case/main-use-case/internal-reference/case.go b/internal/use-case/main-use-case/internal-reference/case.go index 44bcd79e..1681bf26 100644 --- a/internal/use-case/main-use-case/internal-reference/case.go +++ b/internal/use-case/main-use-case/internal-reference/case.go @@ -238,6 +238,7 @@ func Update(input eir.UpdateDto) (*d.Data, error) { } // Get Updated Data + rdDto.Includes = "encounter,unit,doctor" if data, err = ReadDetailData(rdDto, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/internal-reference/helper.go b/internal/use-case/main-use-case/internal-reference/helper.go index 39dbe199..aaef382a 100644 --- a/internal/use-case/main-use-case/internal-reference/helper.go +++ b/internal/use-case/main-use-case/internal-reference/helper.go @@ -21,12 +21,3 @@ func setData[T *ir.CreateDto | *ir.UpdateDto](input T, data *ir.InternalReferenc data.Unit_Id = inputSrc.Unit_Id data.Doctor_Id = inputSrc.Doctor_Id } - -func setDataUpdate(src ir.UpdateDto, dst *ir.InternalReference) *ir.InternalReference { - return &ir.InternalReference{ - Main: dst.Main, - Encounter_Id: src.Encounter_Id, - Unit_Id: src.Unit_Id, - Doctor_Id: src.Doctor_Id, - } -} diff --git a/internal/use-case/main-use-case/internal-reference/lib.go b/internal/use-case/main-use-case/internal-reference/lib.go index 54b862ae..a50d594c 100644 --- a/internal/use-case/main-use-case/internal-reference/lib.go +++ b/internal/use-case/main-use-case/internal-reference/lib.go @@ -81,10 +81,8 @@ func ReadDetailData(input eir.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) ( tx = dg.I } - preload := "encounter,unit,doctor" - if err := tx. - Scopes(gh.Preload(preload)). + Scopes(gh.Preload(input.Includes)). First(&data, input.Id). Error; err != nil { @@ -99,7 +97,7 @@ func ReadDetailData(input eir.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) ( func UpdateData(input eir.UpdateDto, data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - data = setDataUpdate(input, data) + setData(&input, data) var tx *gorm.DB if len(dbx) > 0 { From 869837271df6ba4c5a71cdd431988fcb8c96867b Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 14 Oct 2025 13:40:24 +0700 Subject: [PATCH 166/190] rename vclaim table --- .../migrations/20251014063537.sql | 16 ++++++++++++ .../migrations/20251014063720.sql | 26 +++++++++++++++++++ cmd/main-migration/migrations/atlas.sum | 6 +++-- .../bpjs-entities/vclaim-sep-hist/entitiy.go | 2 +- .../bpjs-entities/vclaim-sep-print/entity.go | 4 +-- .../bpjs-entities/vclaim-sep/entitiy.go | 2 +- .../domain/main-entities/encounter/entity.go | 2 +- internal/interface/migration/main-entities.go | 6 ++--- 8 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 cmd/main-migration/migrations/20251014063537.sql create mode 100644 cmd/main-migration/migrations/20251014063720.sql diff --git a/cmd/main-migration/migrations/20251014063537.sql b/cmd/main-migration/migrations/20251014063537.sql new file mode 100644 index 00000000..7b77b3d9 --- /dev/null +++ b/cmd/main-migration/migrations/20251014063537.sql @@ -0,0 +1,16 @@ +-- Create "VclaimSep" table +CREATE TABLE "public"."VclaimSep" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Number" character varying(19) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_VclaimSep_Number" UNIQUE ("Number"), + CONSTRAINT "fk_Encounter_VclaimSep" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Modify "VClaimSepPrint" table +ALTER TABLE "public"."VClaimSepPrint" DROP CONSTRAINT "fk_VClaimSepPrint_VclaimSep", ADD CONSTRAINT "fk_VClaimSepPrint_VclaimSep" FOREIGN KEY ("VclaimSep_Number") REFERENCES "public"."VclaimSep" ("Number") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Drop "VClaimSep" table +DROP TABLE "public"."VClaimSep"; diff --git a/cmd/main-migration/migrations/20251014063720.sql b/cmd/main-migration/migrations/20251014063720.sql new file mode 100644 index 00000000..0763c12b --- /dev/null +++ b/cmd/main-migration/migrations/20251014063720.sql @@ -0,0 +1,26 @@ +-- Create "VclaimSepHist" table +CREATE TABLE "public"."VclaimSepHist" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "RequestPayload" text NULL, + "ResponseBody" text NULL, + "Message" text NULL, + PRIMARY KEY ("Id") +); +-- Create "VclaimSepPrint" table +CREATE TABLE "public"."VclaimSepPrint" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "VclaimSep_Number" character varying(19) NULL, + "Counter" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_VclaimSepPrint_VclaimSep" FOREIGN KEY ("VclaimSep_Number") REFERENCES "public"."VclaimSep" ("Number") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Drop "VClaimSepHist" table +DROP TABLE "public"."VClaimSepHist"; +-- Drop "VClaimSepPrint" table +DROP TABLE "public"."VClaimSepPrint"; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 5b2a1d8a..77b5524c 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:awmI0os0fmaoSemyQuKI5+2Xb4eCH+Jgqm8dZIsXskw= +h1:u4hCgNdaO4s4HQqAyPwS2ejbRhJtLvpU/wUJGtGrxsI= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -40,4 +40,6 @@ h1:awmI0os0fmaoSemyQuKI5+2Xb4eCH+Jgqm8dZIsXskw= 20251013044536.sql h1:0Xjw8fNILiT8nnfrJDZgQnPf3dntmIoilbapnih8AE4= 20251013051438.sql h1:lfSuw5mgJnePBJamvhZ81osFIouXeiIEiSZ/evdwo48= 20251013081808.sql h1:ijgjNX08G6GBjA/ks8EKtb7P7Y7Cg7zbhqEOruGnv6M= -20251014060047.sql h1:sX9aIpf35MbyclzP4+ULVabPTMV8E9G+6caCsg4WWbQ= +20251014060047.sql h1:0jqj49WTtneEIMQDBoo4c095ZGi8sCrA8NnHBrPU6D8= +20251014063537.sql h1:H9ZLr86pgDcDpRJmTwy8TIOVot9QcN7+i3HwT4Vmi5s= +20251014063720.sql h1:eiHNzJIdBpuazPI5MAgtc3yI83u4SvYyr7dJd3Ptxdo= diff --git a/internal/domain/bpjs-entities/vclaim-sep-hist/entitiy.go b/internal/domain/bpjs-entities/vclaim-sep-hist/entitiy.go index a5a22da3..46880159 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-hist/entitiy.go +++ b/internal/domain/bpjs-entities/vclaim-sep-hist/entitiy.go @@ -4,7 +4,7 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ) -type VClaimSepHist struct { +type VclaimSepHist struct { ecore.Main RequestPayload *string `json:"requestPayload"` ResponseBody *string `json:"responseBody"` diff --git a/internal/domain/bpjs-entities/vclaim-sep-print/entity.go b/internal/domain/bpjs-entities/vclaim-sep-print/entity.go index d1a0a156..1bd5e9fc 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-print/entity.go +++ b/internal/domain/bpjs-entities/vclaim-sep-print/entity.go @@ -5,9 +5,9 @@ import ( evs "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" ) -type VClaimSepPrint struct { +type VclaimSepPrint struct { ecore.Main VclaimSep_Number *string `json:"vclaimSep_number"` - VclaimSep *evs.VClaimSep `json:"vclaimSep,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"` + VclaimSep *evs.VclaimSep `json:"vclaimSep,omitempty" gorm:"foreignKey:VclaimSep_Number;references:Number"` Counter *uint `json:"counter"` } diff --git a/internal/domain/bpjs-entities/vclaim-sep/entitiy.go b/internal/domain/bpjs-entities/vclaim-sep/entitiy.go index 8cbdfce6..e23106d8 100644 --- a/internal/domain/bpjs-entities/vclaim-sep/entitiy.go +++ b/internal/domain/bpjs-entities/vclaim-sep/entitiy.go @@ -4,7 +4,7 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ) -type VClaimSep struct { +type VclaimSep struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Number *string `json:"number" gorm:"unique;size:19"` diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 321e838f..c9f81712 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -51,7 +51,7 @@ type Encounter struct { AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` Status_Code erc.DataStatusCode `json:"status_code" gorm:"size:10"` - VclaimSep *evs.VClaimSep `json:"vclaimSep,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + VclaimSep *evs.VclaimSep `json:"vclaimSep,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` } func (d Encounter) IsDone() bool { diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 82b14f23..034495c3 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -128,7 +128,7 @@ func getMainEntities() []any { &personrelative.PersonRelative{}, &patient.Patient{}, &appointment.Appointment{}, - &vclaimsep.VClaimSep{}, + &vclaimsep.VclaimSep{}, &encounter.Encounter{}, &laborant.Laborant{}, &specialist.Specialist{}, @@ -159,7 +159,7 @@ func getMainEntities() []any { &midwife.Midwife{}, &postalregion.PostalRegion{}, &internalreference.InternalReference{}, - &vclaimsephist.VClaimSepHist{}, - &vclaimsepprint.VClaimSepPrint{}, + &vclaimsephist.VclaimSepHist{}, + &vclaimsepprint.VclaimSepPrint{}, } } From 2d813408e47f8271bd78288c4025d48a87a77abe Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 14 Oct 2025 14:25:09 +0700 Subject: [PATCH 167/190] wip --- .../bpjs-entities/vclaim-sep-hist/dto.go | 5 +- .../bpjs-entities/vclaim-sep-print/dto.go | 5 +- .../domain/bpjs-entities/vclaim-sep/dto.go | 10 +- .../domain/main-entities/encounter/dto.go | 2 +- .../bpjs-handler/vclaim-sep/handler.go | 75 +++++ .../bpjs-use-case/vclaim-sep-hist/case.go | 277 ++++++++++++++++++ .../bpjs-use-case/vclaim-sep-hist/helper.go | 23 ++ .../bpjs-use-case/vclaim-sep-hist/lib.go | 140 +++++++++ .../vclaim-sep-hist/middleware-runner.go | 103 +++++++ .../vclaim-sep-hist/middleware.go | 9 + .../bpjs-use-case/vclaim-sep-hist/tycovar.go | 44 +++ .../bpjs-use-case/vclaim-sep-print/case.go | 277 ++++++++++++++++++ .../bpjs-use-case/vclaim-sep-print/helper.go | 21 ++ .../bpjs-use-case/vclaim-sep-print/lib.go | 148 ++++++++++ .../vclaim-sep-print/middleware-runner.go | 103 +++++++ .../vclaim-sep-print/middleware.go | 9 + .../bpjs-use-case/vclaim-sep-print/tycovar.go | 44 +++ .../use-case/bpjs-use-case/vclaim-sep/case.go | 10 +- .../bpjs-use-case/vclaim-sep/helper.go | 7 +- 19 files changed, 1292 insertions(+), 20 deletions(-) create mode 100644 internal/interface/bpjs-handler/vclaim-sep/handler.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-hist/case.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-hist/helper.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-hist/lib.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-hist/middleware-runner.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-hist/middleware.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-hist/tycovar.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-print/case.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-print/helper.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-print/lib.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-print/middleware-runner.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-print/middleware.go create mode 100644 internal/use-case/bpjs-use-case/vclaim-sep-print/tycovar.go diff --git a/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go b/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go index 83a389cc..dc7fce78 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go @@ -13,6 +13,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } @@ -48,7 +49,7 @@ type ResponseDto struct { Message *string `json:"message"` } -func (d VClaimSepHist) ToResponse() ResponseDto { +func (d VclaimSepHist) ToResponse() ResponseDto { resp := ResponseDto{ RequestPayload: d.RequestPayload, ResponseBody: d.ResponseBody, @@ -58,7 +59,7 @@ func (d VClaimSepHist) ToResponse() ResponseDto { return resp } -func ToResponseList(data []VClaimSepHist) []ResponseDto { +func ToResponseList(data []VclaimSepHist) []ResponseDto { resp := make([]ResponseDto, len(data)) for i, u := range data { resp[i] = u.ToResponse() diff --git a/internal/domain/bpjs-entities/vclaim-sep-print/dto.go b/internal/domain/bpjs-entities/vclaim-sep-print/dto.go index b3383ff9..17650e40 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-print/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep-print/dto.go @@ -11,6 +11,7 @@ type CreateDto struct { type ReadListDto struct { FilterDto Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } @@ -43,7 +44,7 @@ type ResponseDto struct { Counter *uint `json:"counter"` } -func (d VClaimSepPrint) ToResponse() ResponseDto { +func (d VclaimSepPrint) ToResponse() ResponseDto { resp := ResponseDto{ VclaimSep_Number: d.VclaimSep_Number, Counter: d.Counter, @@ -52,7 +53,7 @@ func (d VClaimSepPrint) ToResponse() ResponseDto { return resp } -func ToResponseList(data []VClaimSepPrint) []ResponseDto { +func ToResponseList(data []VclaimSepPrint) []ResponseDto { resp := make([]ResponseDto, len(data)) for i, u := range data { resp[i] = u.ToResponse() diff --git a/internal/domain/bpjs-entities/vclaim-sep/dto.go b/internal/domain/bpjs-entities/vclaim-sep/dto.go index 1ea32bff..ce62b758 100644 --- a/internal/domain/bpjs-entities/vclaim-sep/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep/dto.go @@ -5,13 +5,15 @@ import ( ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Number *string `json:"number" validate:"maxLength=19"` + Encounter_Id *uint `json:"encounter_id"` + Number *string `json:"number" validate:"maxLength=19"` + RequestPayload []byte `json:"requestPayload" validate:"maxLength=1024"` } type ReadListDto struct { FilterDto Includes string `json:"includes"` + Sort string `json:"sort"` Pagination ecore.Pagination } @@ -44,7 +46,7 @@ type ResponseDto struct { Number *string `json:"number"` } -func (d VClaimSep) ToResponse() ResponseDto { +func (d VclaimSep) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Number: d.Number, @@ -53,7 +55,7 @@ func (d VClaimSep) ToResponse() ResponseDto { return resp } -func ToResponseList(data []VClaimSep) []ResponseDto { +func ToResponseList(data []VclaimSep) []ResponseDto { resp := make([]ResponseDto, len(data)) for i, u := range data { resp[i] = u.ToResponse() diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 93685899..4d752e9a 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -125,7 +125,7 @@ type ResponseDto struct { AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` Status_Code erc.DataStatusCode `json:"status_code"` - VclaimSep *evs.VClaimSep `json:"vclaimSep,omitempty"` + VclaimSep *evs.VclaimSep `json:"vclaimSep,omitempty"` } func (d Encounter) ToResponse() ResponseDto { diff --git a/internal/interface/bpjs-handler/vclaim-sep/handler.go b/internal/interface/bpjs-handler/vclaim-sep/handler.go new file mode 100644 index 00000000..93d87fc8 --- /dev/null +++ b/internal/interface/bpjs-handler/vclaim-sep/handler.go @@ -0,0 +1,75 @@ +package vclaimsep + +import ( + "io" + "net/http" + + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + u "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := e.CreateDto{} + body, err := io.ReadAll(r.Body) + if err != nil { + http.Error(w, "failed to read body", http.StatusBadRequest) + return + } + defer r.Body.Close() + + dto.RequestPayload = body + 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 = uint(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/bpjs-use-case/vclaim-sep-hist/case.go b/internal/use-case/bpjs-use-case/vclaim-sep-hist/case.go new file mode 100644 index 00000000..0d2e77d0 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-hist/case.go @@ -0,0 +1,277 @@ +package vclaimsephist + +import ( + "strconv" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "vclaim-sep-hist" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.VclaimSepHist{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.VclaimSepHist + var dataList []e.VclaimSepHist + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.VclaimSepHist + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.VclaimSepHist + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.VclaimSepHist + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-hist/helper.go b/internal/use-case/bpjs-use-case/vclaim-sep-hist/helper.go new file mode 100644 index 00000000..fe13d47c --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-hist/helper.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package vclaimsephist + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSepHist) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.RequestPayload = inputSrc.RequestPayload + data.ResponseBody = inputSrc.ResponseBody + data.Message = inputSrc.Message +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-hist/lib.go b/internal/use-case/bpjs-use-case/vclaim-sep-hist/lib.go new file mode 100644 index 00000000..13104e36 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-hist/lib.go @@ -0,0 +1,140 @@ +package vclaimsephist + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.VclaimSepHist, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.VclaimSepHist{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.VclaimSepHist, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.VclaimSepHist{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.VclaimSepHist{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.VclaimSepHist, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.VclaimSepHist{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.VclaimSepHist, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.VclaimSepHist, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-hist/middleware-runner.go b/internal/use-case/bpjs-use-case/vclaim-sep-hist/middleware-runner.go new file mode 100644 index 00000000..315a358e --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-hist/middleware-runner.go @@ -0,0 +1,103 @@ +package vclaimsephist + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.VclaimSepHist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.VclaimSepHist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSepHist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSepHist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSepHist) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-hist/middleware.go b/internal/use-case/bpjs-use-case/vclaim-sep-hist/middleware.go new file mode 100644 index 00000000..16cf95b9 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-hist/middleware.go @@ -0,0 +1,9 @@ +package vclaimsephist + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-hist/tycovar.go b/internal/use-case/bpjs-use-case/vclaim-sep-hist/tycovar.go new file mode 100644 index 00000000..f525303a --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-hist/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package vclaimsephist + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.VclaimSepHist, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.VclaimSepHist, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.VclaimSepHist, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-print/case.go b/internal/use-case/bpjs-use-case/vclaim-sep-print/case.go new file mode 100644 index 00000000..e1f26e10 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-print/case.go @@ -0,0 +1,277 @@ +package vclaimsepprint + +import ( + "strconv" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "vclaim-sep-print" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.VclaimSepPrint{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.VclaimSepPrint + var dataList []e.VclaimSepPrint + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.VclaimSepPrint + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.VclaimSepPrint + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.VclaimSepPrint + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-print/helper.go b/internal/use-case/bpjs-use-case/vclaim-sep-print/helper.go new file mode 100644 index 00000000..5a89f7a9 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-print/helper.go @@ -0,0 +1,21 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package vclaimsepprint + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSepPrint) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.VclaimSep_Number = inputSrc.VclaimSep_Number +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-print/lib.go b/internal/use-case/bpjs-use-case/vclaim-sep-print/lib.go new file mode 100644 index 00000000..12bdad69 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-print/lib.go @@ -0,0 +1,148 @@ +package vclaimsepprint + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.VclaimSepPrint, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.VclaimSepPrint{} + var maxCounter uint + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + err := tx.Model(&data). + Where("VclaimSep_Number = ?", input.VclaimSep_Number). + Select("COALESCE(MAX(Counter), 0)"). + Scan(&maxCounter).Error + if err != nil { + return nil, err + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.VclaimSepPrint, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.VclaimSepPrint{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.VclaimSepPrint{}). + Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Scopes(gh.Sort(input.Sort)) + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + return nil, nil, plh.HandleListError(input, event, err) + } + + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.VclaimSepPrint, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.VclaimSepPrint{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.VclaimSepPrint, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.VclaimSepPrint, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-print/middleware-runner.go b/internal/use-case/bpjs-use-case/vclaim-sep-print/middleware-runner.go new file mode 100644 index 00000000..47db3773 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-print/middleware-runner.go @@ -0,0 +1,103 @@ +package vclaimsepprint + +import ( + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.VclaimSepPrint) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.VclaimSepPrint) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSepPrint) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSepPrint) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.VclaimSepPrint) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-print/middleware.go b/internal/use-case/bpjs-use-case/vclaim-sep-print/middleware.go new file mode 100644 index 00000000..ae857af4 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-print/middleware.go @@ -0,0 +1,9 @@ +package vclaimsepprint + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-print/tycovar.go b/internal/use-case/bpjs-use-case/vclaim-sep-print/tycovar.go new file mode 100644 index 00000000..9566a7e0 --- /dev/null +++ b/internal/use-case/bpjs-use-case/vclaim-sep-print/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package vclaimsepprint + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.VclaimSepPrint, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.VclaimSepPrint, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.VclaimSepPrint, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/case.go b/internal/use-case/bpjs-use-case/vclaim-sep/case.go index 01a47536..84ccd109 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep/case.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep/case.go @@ -1,9 +1,10 @@ package vclaimsep import ( - e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" "strconv" + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -34,9 +35,6 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } - if err := createItem(&input, &event, tx); err != nil { - return err - } if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -169,7 +167,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + rdDto := e.ReadDetailDto{Id: input.Id} var data *e.VclaimSep var err error @@ -225,7 +223,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: uint16(input.Id)} + rdDto := e.ReadDetailDto{Id: input.Id} var data *e.VclaimSep var err error diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/helper.go b/internal/use-case/bpjs-use-case/vclaim-sep/helper.go index 8e5949dd..7760d854 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep/helper.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep/helper.go @@ -17,9 +17,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSep) { inputSrc = &inputTemp.CreateDto } - data.Code = inputSrc.Code - data.Name = inputSrc.Name - data.Uom_Code = inputSrc.Uom_Code - data.Item_Id = inputSrc.Item_Id - data.Infra_Id = inputSrc.Infra_Id + data.Encounter_Id = inputSrc.Encounter_Id + data.Number = inputSrc.Number } From d3f441dd56ea55af13ca139e787c205d71cd8fc6 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 14 Oct 2025 14:31:40 +0700 Subject: [PATCH 168/190] wip --- internal/domain/bpjs-entities/vclaim-sep/dto.go | 3 +++ internal/use-case/bpjs-plugin/vclaim-sep/plugin.go | 1 + 2 files changed, 4 insertions(+) create mode 100644 internal/use-case/bpjs-plugin/vclaim-sep/plugin.go diff --git a/internal/domain/bpjs-entities/vclaim-sep/dto.go b/internal/domain/bpjs-entities/vclaim-sep/dto.go index ce62b758..e8b6871b 100644 --- a/internal/domain/bpjs-entities/vclaim-sep/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep/dto.go @@ -2,12 +2,15 @@ package vclaimsep import ( ecore "simrs-vx/internal/domain/base-entities/core" + evsh "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" ) type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Number *string `json:"number" validate:"maxLength=19"` RequestPayload []byte `json:"requestPayload" validate:"maxLength=1024"` + + VclaimSepHist evsh.CreateDto } type ReadListDto struct { diff --git a/internal/use-case/bpjs-plugin/vclaim-sep/plugin.go b/internal/use-case/bpjs-plugin/vclaim-sep/plugin.go new file mode 100644 index 00000000..ce4c6f55 --- /dev/null +++ b/internal/use-case/bpjs-plugin/vclaim-sep/plugin.go @@ -0,0 +1 @@ +package vclaimsep From 3e4ce7d1bf1dbf54156c3881cea6a45e06fccec1 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 14 Oct 2025 16:39:28 +0700 Subject: [PATCH 169/190] almost done, not tested yet --- cmd/bpjs-api/config.yml-example | 5 +- .../bpjs-entities/vclaim-sep-hist/dto.go | 6 +- .../domain/bpjs-entities/vclaim-sep/dto.go | 10 +++- internal/infra/bpjs/bpjs.go | 9 +++ internal/infra/bpjs/tycovar.go | 7 +++ .../interface/bpjs-handler/bpjs-handler.go | 26 +++++++-- .../bpjs-handler/vclaim-sep-hist/handler.go | 22 +++++++ .../bpjs-handler/vclaim-sep-print/handler.go | 23 ++++++++ .../bpjs-handler/vclaim-sep/handler.go | 46 +++++++-------- .../use-case/bpjs-plugin/vclaim-sep/plugin.go | 57 +++++++++++++++++++ .../bpjs-plugin/vclaim-sep/tycovar.go | 12 ++++ .../bpjs-use-case/vclaim-sep-hist/helper.go | 6 +- .../use-case/bpjs-use-case/vclaim-sep/case.go | 15 ++++- .../use-case/bpjs-use-case/vclaim-sep/lib.go | 9 ++- .../bpjs-use-case/vclaim-sep/middleware.go | 16 ++++-- 15 files changed, 221 insertions(+), 48 deletions(-) create mode 100644 internal/infra/bpjs/bpjs.go create mode 100644 internal/infra/bpjs/tycovar.go create mode 100644 internal/interface/bpjs-handler/vclaim-sep-hist/handler.go create mode 100644 internal/interface/bpjs-handler/vclaim-sep-print/handler.go create mode 100644 internal/use-case/bpjs-plugin/vclaim-sep/tycovar.go diff --git a/cmd/bpjs-api/config.yml-example b/cmd/bpjs-api/config.yml-example index f131a725..60b1644c 100644 --- a/cmd/bpjs-api/config.yml-example +++ b/cmd/bpjs-api/config.yml-example @@ -63,4 +63,7 @@ bpjsCfg: corsCfg: allowedOrigins: - http://example.com - allowedMethod: \ No newline at end of file + allowedMethod: + +bpjsCfg: + baseUrl: \ No newline at end of file diff --git a/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go b/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go index dc7fce78..d58eaf6e 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep-hist/dto.go @@ -5,9 +5,9 @@ import ( ) type CreateDto struct { - RequestPayload *string `json:"requestPayload"` - ResponseBody *string `json:"responseBody"` - Message *string `json:"message"` + RequestPayload string `json:"requestPayload"` + ResponseBody string `json:"responseBody"` + Message string `json:"message"` } type ReadListDto struct { diff --git a/internal/domain/bpjs-entities/vclaim-sep/dto.go b/internal/domain/bpjs-entities/vclaim-sep/dto.go index e8b6871b..8a174688 100644 --- a/internal/domain/bpjs-entities/vclaim-sep/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep/dto.go @@ -25,7 +25,8 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint `json:"id"` + Id uint `json:"id"` + Number *string `json:"number"` } type UpdateDto struct { @@ -34,7 +35,8 @@ type UpdateDto struct { } type DeleteDto struct { - Id uint `json:"id"` + Id uint `json:"id"` + Number *string `json:"number"` } type MetaDto struct { @@ -65,3 +67,7 @@ func ToResponseList(data []VclaimSep) []ResponseDto { } return resp } + +func (c CreateDto) IsMessageSuccess() bool { + return c.VclaimSepHist.Message == "Sukses" +} diff --git a/internal/infra/bpjs/bpjs.go b/internal/infra/bpjs/bpjs.go new file mode 100644 index 00000000..68d1b877 --- /dev/null +++ b/internal/infra/bpjs/bpjs.go @@ -0,0 +1,9 @@ +package bpjs + +import ( + a "github.com/karincake/apem" +) + +func SetConfig() { + a.ParseSingleCfg(&O) +} diff --git a/internal/infra/bpjs/tycovar.go b/internal/infra/bpjs/tycovar.go new file mode 100644 index 00000000..54e45a63 --- /dev/null +++ b/internal/infra/bpjs/tycovar.go @@ -0,0 +1,7 @@ +package bpjs + +var O BpjsCfg = BpjsCfg{} + +type BpjsCfg struct { + BaseUrl string `yaml:"baseUrl"` +} diff --git a/internal/interface/bpjs-handler/bpjs-handler.go b/internal/interface/bpjs-handler/bpjs-handler.go index a3d86116..7f34b7cc 100644 --- a/internal/interface/bpjs-handler/bpjs-handler.go +++ b/internal/interface/bpjs-handler/bpjs-handler.go @@ -4,22 +4,24 @@ import ( "net/http" /******************** main / transaction ********************/ + vclaimsep "simrs-vx/internal/interface/bpjs-handler/vclaim-sep" + vclaimsephist "simrs-vx/internal/interface/bpjs-handler/vclaim-sep-hist" + vclaimsepprint "simrs-vx/internal/interface/bpjs-handler/vclaim-sep-print" /******************** actor ********************/ /******************** external ********************/ a "github.com/karincake/apem" + hk "github.com/karincake/hongkue" /******************** infra ********************/ + ibpjs "simrs-vx/internal/infra/bpjs" gs "simrs-vx/internal/infra/gorm-setting" - minio "simrs-vx/internal/infra/minio" - ssdb "simrs-vx/internal/infra/ss-db" /******************** pkg ********************/ cmw "simrs-vx/pkg/cors-manager-mw" lh "simrs-vx/pkg/lang-helper" handlerlogger "simrs-vx/pkg/middleware/handler-logger" - mh "simrs-vx/pkg/minio-helper" zlc "simrs-vx/pkg/zerolog-ctx" /******************** sources ********************/ @@ -33,10 +35,8 @@ func SetRoutes() http.Handler { ///// a.RegisterExtCall(gs.Adjust) a.RegisterExtCall(zlc.Adjust) - a.RegisterExtCall(ssdb.SetInstance) a.RegisterExtCall(lh.Populate) - a.RegisterExtCall(minio.Connect) - a.RegisterExtCall(mh.I.SetClient) + a.RegisterExtCall(ibpjs.SetConfig) a.RegisterExtCall(validation.RegisterValidation) r := http.NewServeMux() @@ -44,6 +44,20 @@ func SetRoutes() http.Handler { /******************** Main ********************/ r.HandleFunc("/", home.Home) + hk.GroupRoutes("/v1/vclaim-sep", r, hk.MapHandlerFunc{ + "POST /": vclaimsep.O.Create, + "PATCH /{id}": vclaimsep.O.Update, + "DELETE /{id}": vclaimsep.O.Delete, + }) + + hk.GroupRoutes("/v1/vclaim-sep-hist", r, hk.MapHandlerFunc{ + "GET /": vclaimsephist.O.GetList, + }) + + hk.GroupRoutes("/v1/vclaim-sep-print", r, hk.MapHandlerFunc{ + "POST /": vclaimsepprint.O.Create, + }) + /******************** actor ********************/ /******************** sources ********************/ diff --git a/internal/interface/bpjs-handler/vclaim-sep-hist/handler.go b/internal/interface/bpjs-handler/vclaim-sep-hist/handler.go new file mode 100644 index 00000000..73c2c4e2 --- /dev/null +++ b/internal/interface/bpjs-handler/vclaim-sep-hist/handler.go @@ -0,0 +1,22 @@ +package vclaimsephist + +import ( + "net/http" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" + u "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-hist" + + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" +) + +type myBase struct{} + +var O myBase + +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) +} diff --git a/internal/interface/bpjs-handler/vclaim-sep-print/handler.go b/internal/interface/bpjs-handler/vclaim-sep-print/handler.go new file mode 100644 index 00000000..838bc65b --- /dev/null +++ b/internal/interface/bpjs-handler/vclaim-sep-print/handler.go @@ -0,0 +1,23 @@ +package vclaimsepprint + +import ( + "net/http" + + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-print" + u "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-print" + + rw "github.com/karincake/risoles" +) + +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) +} diff --git a/internal/interface/bpjs-handler/vclaim-sep/handler.go b/internal/interface/bpjs-handler/vclaim-sep/handler.go index 93d87fc8..c90cf9fc 100644 --- a/internal/interface/bpjs-handler/vclaim-sep/handler.go +++ b/internal/interface/bpjs-handler/vclaim-sep/handler.go @@ -5,7 +5,6 @@ import ( "net/http" rw "github.com/karincake/risoles" - sf "github.com/karincake/semprit" e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" u "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep" @@ -29,27 +28,27 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { 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) 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 = uint(id) - res, err := u.ReadDetail(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 = uint(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 { + number := rw.ValidateString(w, "number", r.PathValue("number")) + if number <= "" { return } @@ -57,19 +56,18 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - dto.Id = uint(id) + dto.Number = &number 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 { + number := rw.ValidateString(w, "number", r.PathValue("number")) + if number <= "" { return } - dto := e.DeleteDto{} - dto.Id = uint(id) + dto.Number = &number res, err := u.Delete(dto) rw.DataResponse(w, res, err) } diff --git a/internal/use-case/bpjs-plugin/vclaim-sep/plugin.go b/internal/use-case/bpjs-plugin/vclaim-sep/plugin.go index ce4c6f55..fd18763f 100644 --- a/internal/use-case/bpjs-plugin/vclaim-sep/plugin.go +++ b/internal/use-case/bpjs-plugin/vclaim-sep/plugin.go @@ -1 +1,58 @@ package vclaimsep + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + + ibpjs "simrs-vx/internal/infra/bpjs" + + "gorm.io/gorm" +) + +func CreateSep(input *e.CreateDto, data *e.VclaimSep, tx *gorm.DB) error { + req, err := http.NewRequest("POST", ibpjs.O.BaseUrl+"/sep", bytes.NewReader(input.RequestPayload)) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + var vresp vclaimResponse + if err := json.Unmarshal(body, &vresp); err != nil { + return fmt.Errorf("failed to parse response JSON: %w", err) + } + + msg := vresp.MetaData.Message + + if err := json.Unmarshal(body, data); err != nil { + return fmt.Errorf("failed to unmarshal into VclaimSep: %w", err) + } + + // Save request/response details in DTO for further use + input.VclaimSepHist.RequestPayload = string(input.RequestPayload) + input.VclaimSepHist.ResponseBody = string(body) + input.VclaimSepHist.Message = msg + input.Number = func() *string { + number := "" + if vresp.Response != nil && vresp.Response.Sep != nil { + number = vresp.Response.Sep.NoSep + } + return &number + }() + + return nil +} diff --git a/internal/use-case/bpjs-plugin/vclaim-sep/tycovar.go b/internal/use-case/bpjs-plugin/vclaim-sep/tycovar.go new file mode 100644 index 00000000..f057726e --- /dev/null +++ b/internal/use-case/bpjs-plugin/vclaim-sep/tycovar.go @@ -0,0 +1,12 @@ +package vclaimsep + +type vclaimResponse struct { + MetaData struct { + Message string `json:"message"` + } `json:"metaData"` + Response *struct { + Sep *struct { + NoSep string `json:"noSep"` + } `json:"sep"` + } `json:"response"` +} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-hist/helper.go b/internal/use-case/bpjs-use-case/vclaim-sep-hist/helper.go index fe13d47c..038983bb 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep-hist/helper.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep-hist/helper.go @@ -17,7 +17,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSepHist) { inputSrc = &inputTemp.CreateDto } - data.RequestPayload = inputSrc.RequestPayload - data.ResponseBody = inputSrc.ResponseBody - data.Message = inputSrc.Message + data.RequestPayload = &inputSrc.RequestPayload + data.ResponseBody = &inputSrc.ResponseBody + data.Message = &inputSrc.Message } diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/case.go b/internal/use-case/bpjs-use-case/vclaim-sep/case.go index 84ccd109..ac72d648 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep/case.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep/case.go @@ -4,6 +4,9 @@ import ( "strconv" e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" + // evsh "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" + + uvsh "simrs-vx/internal/use-case/bpjs-use-case/vclaim-sep-hist" dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -35,6 +38,14 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if _, err := uvsh.CreateData(input.VclaimSepHist, &event, tx); err != nil { + return err + } + + if !input.IsMessageSuccess() { + return nil + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -167,7 +178,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { } func Update(input e.UpdateDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} + rdDto := e.ReadDetailDto{Number: input.Number} var data *e.VclaimSep var err error @@ -223,7 +234,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { } func Delete(input e.DeleteDto) (*d.Data, error) { - rdDto := e.ReadDetailDto{Id: input.Id} + rdDto := e.ReadDetailDto{Number: input.Number} var data *e.VclaimSep var err error diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/lib.go b/internal/use-case/bpjs-use-case/vclaim-sep/lib.go index c80b5c7b..817c357c 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep/lib.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep/lib.go @@ -81,7 +81,14 @@ 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.Number != nil { + tx = tx.Where("\"Number\" = ?", *input.Number) + } + 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 } diff --git a/internal/use-case/bpjs-use-case/vclaim-sep/middleware.go b/internal/use-case/bpjs-use-case/vclaim-sep/middleware.go index 6edc2873..1ad0a853 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep/middleware.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep/middleware.go @@ -1,9 +1,13 @@ package vclaimsep +import ( + pvs "simrs-vx/internal/use-case/bpjs-plugin/vclaim-sep" +) + // example of middleware -// func init() { -// createPreMw = append(createPreMw, -// CreateMw{Name: "modif-input", Func: pm.ModifInput}, -// CreateMw{Name: "check-data", Func: pm.CheckData}, -// ) -// } +func init() { + createPreMw = append(createPreMw, + createMw{Name: "create-sep", Func: pvs.CreateSep}, + ) + +} From b42dca81a5e90b8b8a589df23e1a8d2fba47bb9c Mon Sep 17 00:00:00 2001 From: vanilia Date: Wed, 15 Oct 2025 11:57:12 +0700 Subject: [PATCH 170/190] add column in chemo table --- cmd/main-migration/migrations/20251015045455.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 7 ++++--- internal/domain/main-entities/chemo/entity.go | 2 ++ internal/domain/references/encounter/encounter.go | 4 ++++ 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 cmd/main-migration/migrations/20251015045455.sql diff --git a/cmd/main-migration/migrations/20251015045455.sql b/cmd/main-migration/migrations/20251015045455.sql new file mode 100644 index 00000000..f2b6be7a --- /dev/null +++ b/cmd/main-migration/migrations/20251015045455.sql @@ -0,0 +1,2 @@ +-- Modify "Chemo" table +ALTER TABLE "public"."Chemo" ADD COLUMN "ClassCode" text NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 77b5524c..e3172704 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:u4hCgNdaO4s4HQqAyPwS2ejbRhJtLvpU/wUJGtGrxsI= +h1:Y15nC3Bp3DWNym7hAvXkF9zFwkHh8nQDpxcNrxQgYhE= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -41,5 +41,6 @@ h1:u4hCgNdaO4s4HQqAyPwS2ejbRhJtLvpU/wUJGtGrxsI= 20251013051438.sql h1:lfSuw5mgJnePBJamvhZ81osFIouXeiIEiSZ/evdwo48= 20251013081808.sql h1:ijgjNX08G6GBjA/ks8EKtb7P7Y7Cg7zbhqEOruGnv6M= 20251014060047.sql h1:0jqj49WTtneEIMQDBoo4c095ZGi8sCrA8NnHBrPU6D8= -20251014063537.sql h1:H9ZLr86pgDcDpRJmTwy8TIOVot9QcN7+i3HwT4Vmi5s= -20251014063720.sql h1:eiHNzJIdBpuazPI5MAgtc3yI83u4SvYyr7dJd3Ptxdo= +20251014063537.sql h1:VZLXol0PTsTW21Epg6vBPsztWkDtcxup9F/z88EGgIg= +20251014063720.sql h1:2HVUyCV0ud3BJJDH2GEKZN/+IWLFPCsN1KqhP6csO14= +20251015045455.sql h1:v120CzYYiFWmW81VmKWsjmjRiBIv5aFnPZXwQaQxqes= diff --git a/internal/domain/main-entities/chemo/entity.go b/internal/domain/main-entities/chemo/entity.go index 2ba83990..f838c27d 100644 --- a/internal/domain/main-entities/chemo/entity.go +++ b/internal/domain/main-entities/chemo/entity.go @@ -9,6 +9,7 @@ import ( eus "simrs-vx/internal/domain/main-entities/user" erc "simrs-vx/internal/domain/references/common" + ere "simrs-vx/internal/domain/references/encounter" ) type Chemo struct { @@ -21,4 +22,5 @@ type Chemo struct { VerifiedBy *eus.User `json:"verifiedBy,omitempty" gorm:"foreignKey:VerifiedBy_User_Id;references:Id"` SrcUnit_Id *uint `json:"src_unit_id"` SrcUnit *eun.Unit `json:"src_unit,omitempty" gorm:"foreignKey:SrcUnit_Id;references:Id"` + ClassCode ere.ChemoClassCode `json:"class_code"` } diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 7e6bcf8c..93c49a33 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -12,6 +12,7 @@ type ( AmbulatoryClassCode string InpatientClassCode string UploadCode string + ChemoClassCode string ) const ( @@ -78,6 +79,9 @@ const ( UCPP UploadCode = "person-passport" // Person Passport UCPFC UploadCode = "person-family-card" // Person Family Card UCMIR UploadCode = "mcu-item-result" // Mcu Item Result + + CCCAdm ChemoClassCode = "adm" // Administrasi + CCCAct ChemoClassCode = "act" // Tindakan ) func (ec EncounterClassCode) Code() string { From 0b864d8cd71c2a22f586c93860ce2c7c8bc46eb7 Mon Sep 17 00:00:00 2001 From: vanilia Date: Wed, 15 Oct 2025 12:11:11 +0700 Subject: [PATCH 171/190] resolve typo name class code --- internal/domain/main-entities/chemo/entity.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/domain/main-entities/chemo/entity.go b/internal/domain/main-entities/chemo/entity.go index f838c27d..4052ea72 100644 --- a/internal/domain/main-entities/chemo/entity.go +++ b/internal/domain/main-entities/chemo/entity.go @@ -22,5 +22,5 @@ type Chemo struct { VerifiedBy *eus.User `json:"verifiedBy,omitempty" gorm:"foreignKey:VerifiedBy_User_Id;references:Id"` SrcUnit_Id *uint `json:"src_unit_id"` SrcUnit *eun.Unit `json:"src_unit,omitempty" gorm:"foreignKey:SrcUnit_Id;references:Id"` - ClassCode ere.ChemoClassCode `json:"class_code"` + Class_Code ere.ChemoClassCode `json:"class_code"` } From da6539363370a98e0e12b77305ca5d9916f52361 Mon Sep 17 00:00:00 2001 From: vanilia Date: Wed, 15 Oct 2025 13:59:04 +0700 Subject: [PATCH 172/190] enhancement update encounter status code --- .../domain/main-entities/encounter/dto.go | 5 ++ .../main-handler/encounter/handler.go | 62 +++++++++++++++++ .../interface/main-handler/main-handler.go | 4 ++ .../use-case/main-use-case/encounter/case.go | 66 +++++++++++++++++++ .../main-use-case/encounter/helper.go | 4 ++ .../use-case/main-use-case/encounter/lib.go | 25 +++++++ 6 files changed, 166 insertions(+) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 608d26dd..bd630857 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -66,6 +66,11 @@ type UpdateDto struct { CreateDto } +type UpdateStatusDto struct { + Id uint16 `json:"id"` + StatusCode erc.DataStatusCode `json:"status_code"` +} + type DeleteDto struct { Id uint16 `json:"id"` } diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index 7484b302..3c0d2da4 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -10,6 +10,8 @@ import ( e "simrs-vx/internal/domain/main-entities/encounter" u "simrs-vx/internal/use-case/main-use-case/encounter" + + erc "simrs-vx/internal/domain/references/common" ) type myBase struct{} @@ -83,3 +85,63 @@ func (obj myBase) CheckOut(w http.ResponseWriter, r *http.Request) { res, err := u.CheckOut(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Process(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateStatusDto{ + Id: uint16(id), + StatusCode: erc.DSCProcess, + } + + res, err := u.UpdateStatusCode(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Cancel(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateStatusDto{ + Id: uint16(id), + StatusCode: erc.DSCCancel, + } + + res, err := u.UpdateStatusCode(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Reject(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateStatusDto{ + Id: uint16(id), + StatusCode: erc.DSCRejected, + } + + res, err := u.UpdateStatusCode(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Skip(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateStatusDto{ + Id: uint16(id), + StatusCode: erc.DSCSkipped, + } + + res, err := u.UpdateStatusCode(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 63448f21..3b31e2e5 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -168,6 +168,10 @@ func SetRoutes() http.Handler { "PATCH /{id}": encounter.O.Update, "DELETE /{id}": encounter.O.Delete, "PATCH /{id}/checkout": encounter.O.CheckOut, + "PATCH /{id}/proccess": encounter.O.Process, + "PATCH /{id}/cancel": encounter.O.Cancel, + "PATCH /{id}/reject": encounter.O.Reject, + "PATCH /{id}/skip": encounter.O.Skip, }) hk.GroupRoutes("/v1/medication", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": medication.O.GetList, diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 7d209041..453ea6cb 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -421,3 +421,69 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { Data: data.ToResponse(), }, nil } + +func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Encounter + var err error + + event := pl.Event{ + Feature: "Update Status Code", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if data.IsDone() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "encounter is done", + Raw: errors.New("encounter is done"), + } + return pl.SetLogError(&event, input) + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateStatusData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 8d9ea44d..51d990b0 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -308,3 +308,7 @@ func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { return nil } + +func setDataUpdateStatus(src e.UpdateStatusDto, dst *e.Encounter) { + dst.Status_Code = src.StatusCode +} diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index e1bcc630..2f4d69fa 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -187,3 +187,28 @@ func IsDone(encounter_id uint, event *pl.Event, dbx ...*gorm.DB) bool { pl.SetLogInfo(event, nil, "complete") return data.IsDone() } + +func UpdateStatusData(input e.UpdateStatusDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setDataUpdateStatus(input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} From 360543cfa7ec71b57b6f2e96bf99e3257ddc73e4 Mon Sep 17 00:00:00 2001 From: vanilia Date: Wed, 15 Oct 2025 13:59:04 +0700 Subject: [PATCH 173/190] enhancement update encounter status code --- .../domain/main-entities/encounter/dto.go | 5 ++ .../main-handler/encounter/handler.go | 62 +++++++++++++++++ .../interface/main-handler/main-handler.go | 4 ++ .../use-case/main-use-case/encounter/case.go | 66 +++++++++++++++++++ .../main-use-case/encounter/helper.go | 6 +- .../use-case/main-use-case/encounter/lib.go | 25 +++++++ 6 files changed, 167 insertions(+), 1 deletion(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 608d26dd..bd630857 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -66,6 +66,11 @@ type UpdateDto struct { CreateDto } +type UpdateStatusDto struct { + Id uint16 `json:"id"` + StatusCode erc.DataStatusCode `json:"status_code"` +} + type DeleteDto struct { Id uint16 `json:"id"` } diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index 7484b302..3c0d2da4 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -10,6 +10,8 @@ import ( e "simrs-vx/internal/domain/main-entities/encounter" u "simrs-vx/internal/use-case/main-use-case/encounter" + + erc "simrs-vx/internal/domain/references/common" ) type myBase struct{} @@ -83,3 +85,63 @@ func (obj myBase) CheckOut(w http.ResponseWriter, r *http.Request) { res, err := u.CheckOut(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) Process(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateStatusDto{ + Id: uint16(id), + StatusCode: erc.DSCProcess, + } + + res, err := u.UpdateStatusCode(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Cancel(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateStatusDto{ + Id: uint16(id), + StatusCode: erc.DSCCancel, + } + + res, err := u.UpdateStatusCode(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Reject(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateStatusDto{ + Id: uint16(id), + StatusCode: erc.DSCRejected, + } + + res, err := u.UpdateStatusCode(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Skip(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateStatusDto{ + Id: uint16(id), + StatusCode: erc.DSCSkipped, + } + + res, err := u.UpdateStatusCode(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 63448f21..3b31e2e5 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -168,6 +168,10 @@ func SetRoutes() http.Handler { "PATCH /{id}": encounter.O.Update, "DELETE /{id}": encounter.O.Delete, "PATCH /{id}/checkout": encounter.O.CheckOut, + "PATCH /{id}/proccess": encounter.O.Process, + "PATCH /{id}/cancel": encounter.O.Cancel, + "PATCH /{id}/reject": encounter.O.Reject, + "PATCH /{id}/skip": encounter.O.Skip, }) hk.GroupRoutes("/v1/medication", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": medication.O.GetList, diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 7d209041..453ea6cb 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -421,3 +421,69 @@ func CheckOut(input e.DischargeDto) (*d.Data, error) { Data: data.ToResponse(), }, nil } + +func UpdateStatusCode(input e.UpdateStatusDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.Encounter + var err error + + event := pl.Event{ + Feature: "Update Status Code", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + if data.IsDone() { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-state-mismatch", + Detail: "encounter is done", + Raw: errors.New("encounter is done"), + } + return pl.SetLogError(&event, input) + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateStatusData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 8d9ea44d..448f7be7 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -59,7 +59,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Encounter) { data.Responsible_Doctor_Id = inputSrc.Responsible_Doctor_Id data.RefSource_Name = inputSrc.RefSource_Name data.Appointment_Id = inputSrc.Appointment_Id - data.Status_Code = erc.DSCNew + data.Status_Code = erc.DSCProcess } func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { @@ -308,3 +308,7 @@ func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { return nil } + +func setDataUpdateStatus(src e.UpdateStatusDto, dst *e.Encounter) { + dst.Status_Code = src.StatusCode +} diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index e1bcc630..2f4d69fa 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -187,3 +187,28 @@ func IsDone(encounter_id uint, event *pl.Event, dbx ...*gorm.DB) bool { pl.SetLogInfo(event, nil, "complete") return data.IsDone() } + +func UpdateStatusData(input e.UpdateStatusDto, data *e.Encounter, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setDataUpdateStatus(input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} From 7871998c98c687ab77d96d7bd44915e71230d042 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 15 Oct 2025 15:49:05 +0700 Subject: [PATCH 174/190] feat (reference): done --- .vscode/launch.json | 7 + cmd/bpjs-api/main.go | 2 +- .../domain/bpjs-entities/reference/dto.go | 22 ++++ .../domain/bpjs-entities/reference/entity.go | 23 ++++ internal/infra/bpjs/bpjs.go | 5 + .../interface/bpjs-handler/bpjs-handler.go | 13 ++ .../bpjs-handler/reference/handler.go | 123 ++++++++++++++++++ .../bpjs-handler/vclaim-sep/handler.go | 4 +- .../use-case/bpjs-plugin/reference/helper.go | 35 +++++ .../use-case/bpjs-plugin/reference/plugin.go | 37 ++++++ .../use-case/bpjs-use-case/reference/case.go | 56 ++++++++ .../bpjs-use-case/reference/helper.go | 22 ++++ .../use-case/bpjs-use-case/reference/lib.go | 1 + .../reference/middleware-runner.go | 42 ++++++ .../bpjs-use-case/reference/middleware.go | 12 ++ .../bpjs-use-case/reference/tycovar.go | 23 ++++ 16 files changed, 424 insertions(+), 3 deletions(-) create mode 100644 internal/domain/bpjs-entities/reference/dto.go create mode 100644 internal/domain/bpjs-entities/reference/entity.go create mode 100644 internal/interface/bpjs-handler/reference/handler.go create mode 100644 internal/use-case/bpjs-plugin/reference/helper.go create mode 100644 internal/use-case/bpjs-plugin/reference/plugin.go create mode 100644 internal/use-case/bpjs-use-case/reference/case.go create mode 100644 internal/use-case/bpjs-use-case/reference/helper.go create mode 100644 internal/use-case/bpjs-use-case/reference/lib.go create mode 100644 internal/use-case/bpjs-use-case/reference/middleware-runner.go create mode 100644 internal/use-case/bpjs-use-case/reference/middleware.go create mode 100644 internal/use-case/bpjs-use-case/reference/tycovar.go diff --git a/.vscode/launch.json b/.vscode/launch.json index 7098c42c..fddb0d29 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,6 +7,13 @@ "mode": "auto", "program": "${workspaceFolder}/cmd/main-api" }, + { + "name": "Launch Package bpjs API", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}/cmd/bpjs-api" + }, { "name": "Launch Package migratioon", "type": "go", diff --git a/cmd/bpjs-api/main.go b/cmd/bpjs-api/main.go index 74be3afd..e1cb2468 100644 --- a/cmd/bpjs-api/main.go +++ b/cmd/bpjs-api/main.go @@ -6,7 +6,7 @@ import ( l "github.com/karincake/apem/logger-zerolog" m "github.com/karincake/apem/ms-redis" - h "simrs-vx/internal/interface/main-handler" + h "simrs-vx/internal/interface/bpjs-handler" ) func main() { diff --git a/internal/domain/bpjs-entities/reference/dto.go b/internal/domain/bpjs-entities/reference/dto.go new file mode 100644 index 00000000..9be2ab5b --- /dev/null +++ b/internal/domain/bpjs-entities/reference/dto.go @@ -0,0 +1,22 @@ +package reference + +type ReadListDto struct { + ReferenceType ReferenceType `json:"-"` + PathValue1 string `json:"-"` + PathValue2 string `json:"-"` + PathValue3 string `json:"-"` +} + +type ReferenceType string + +const ( + RTProvince ReferenceType = "province" + RTDistrict ReferenceType = "district" + RTCities ReferenceType = "cities" + RTDiagnose ReferenceType = "diagnose" + RTDiagnosePrb ReferenceType = "diagnose-prb" + RTMedicinePrb ReferenceType = "medicine-prb" + RTUnit ReferenceType = "unit" + RTHealthcare ReferenceType = "healthcare" + RTDoctor ReferenceType = "doctor" +) diff --git a/internal/domain/bpjs-entities/reference/entity.go b/internal/domain/bpjs-entities/reference/entity.go new file mode 100644 index 00000000..bfcbb66e --- /dev/null +++ b/internal/domain/bpjs-entities/reference/entity.go @@ -0,0 +1,23 @@ +package reference + +type Response struct { + MetaData MetaData `json:"metaData"` + Response *CodeNameList `json:"response"` // pointer to handle possible null +} + +type MetaData struct { + Code string `json:"code"` + Message string `json:"message"` +} + +type CodeNameList struct { + List []CodeName `json:"list,omitempty"` + Diagnosa []CodeName `json:"diagnosa,omitempty"` + Poli []CodeName `json:"poli,omitempty"` + Faskes []CodeName `json:"faskes,omitempty"` +} + +type CodeName struct { + Kode string `json:"kode"` + Nama string `json:"nama"` +} diff --git a/internal/infra/bpjs/bpjs.go b/internal/infra/bpjs/bpjs.go index 68d1b877..36935c74 100644 --- a/internal/infra/bpjs/bpjs.go +++ b/internal/infra/bpjs/bpjs.go @@ -2,8 +2,13 @@ package bpjs import ( a "github.com/karincake/apem" + lo "github.com/karincake/apem/loggero" ) func SetConfig() { a.ParseSingleCfg(&O) + if O.BaseUrl == "" { + panic("config bpjs base url empty") + } + lo.I.Println("Bpjs config loaded, status: DONE!!") } diff --git a/internal/interface/bpjs-handler/bpjs-handler.go b/internal/interface/bpjs-handler/bpjs-handler.go index 7f34b7cc..5d5673df 100644 --- a/internal/interface/bpjs-handler/bpjs-handler.go +++ b/internal/interface/bpjs-handler/bpjs-handler.go @@ -4,6 +4,7 @@ import ( "net/http" /******************** main / transaction ********************/ + reference "simrs-vx/internal/interface/bpjs-handler/reference" vclaimsep "simrs-vx/internal/interface/bpjs-handler/vclaim-sep" vclaimsephist "simrs-vx/internal/interface/bpjs-handler/vclaim-sep-hist" vclaimsepprint "simrs-vx/internal/interface/bpjs-handler/vclaim-sep-print" @@ -58,6 +59,18 @@ func SetRoutes() http.Handler { "POST /": vclaimsepprint.O.Create, }) + hk.GroupRoutes("/v1/reference", r, hk.MapHandlerFunc{ + "GET /province": reference.GetListProvince, + "GET /regency/{provinceCode}": reference.GetListCities, + "GET /district/{regencyCode}": reference.GetListDistrict, + "GET /diagnose/{keyword}": reference.GetListDiagnose, + "GET /diagnose-prb": reference.GetListDiagnosePrb, + "GET /medicine-prb/{keyword}": reference.GetListMedicinePrb, + "GET /unit/{unitCode}": reference.GetListUnit, + "GET /healthcare/{healthcare}/{healthcareType}": reference.GetListHealthcare, + "GET /responsible-doctor/{serviceType}/{serviceDate}/{specialistCode}": reference.GetListDoctor, + }) + /******************** actor ********************/ /******************** sources ********************/ diff --git a/internal/interface/bpjs-handler/reference/handler.go b/internal/interface/bpjs-handler/reference/handler.go new file mode 100644 index 00000000..d452ebc4 --- /dev/null +++ b/internal/interface/bpjs-handler/reference/handler.go @@ -0,0 +1,123 @@ +package reference + +import ( + "net/http" + e "simrs-vx/internal/domain/bpjs-entities/reference" + u "simrs-vx/internal/use-case/bpjs-use-case/reference" + + d "github.com/karincake/dodol" + rw "github.com/karincake/risoles" +) + +func GetListProvince(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + dto.ReferenceType = e.RTProvince + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListCities(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue := rw.ValidateString(w, "provinceCode", r.PathValue("provinceCode")) + if pValue == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "provinceCode is required"}, nil) + } + dto.ReferenceType = e.RTCities + dto.PathValue1 = pValue + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListDistrict(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue := rw.ValidateString(w, "regencyCode", r.PathValue("regencyCode")) + if pValue == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "regencyCode is required"}, nil) + } + dto.ReferenceType = e.RTDistrict + dto.PathValue1 = pValue + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListDiagnose(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue := rw.ValidateString(w, "keyword", r.PathValue("keyword")) + if pValue == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "keyword is required"}, nil) + } + dto.ReferenceType = e.RTDiagnose + dto.PathValue1 = pValue + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListDiagnosePrb(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + dto.ReferenceType = e.RTDiagnosePrb + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListMedicinePrb(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue := rw.ValidateString(w, "keyword", r.PathValue("keyword")) + if pValue == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "keyword is required"}, nil) + } + dto.ReferenceType = e.RTMedicinePrb + dto.PathValue1 = pValue + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListUnit(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue := rw.ValidateString(w, "unitCode", r.PathValue("unitCode")) + if pValue == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "unitCode is required"}, nil) + } + dto.ReferenceType = e.RTUnit + dto.PathValue1 = pValue + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListHealthcare(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue1 := rw.ValidateString(w, "healthcare", r.PathValue("healthcare")) + if pValue1 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "healthcare is required"}, nil) + } + pValue2 := rw.ValidateString(w, "healthcareType", r.PathValue("healthcareType")) + if pValue2 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "healthcareType is required"}, nil) + } + dto.ReferenceType = e.RTHealthcare + dto.PathValue1 = pValue1 + dto.PathValue2 = pValue2 + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListDoctor(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue1 := rw.ValidateString(w, "serviceType", r.PathValue("serviceType")) + if pValue1 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "serviceType is required"}, nil) + } + pValue2 := rw.ValidateString(w, "serviceDate", r.PathValue("serviceDate")) + if pValue2 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "serviceDate is required"}, nil) + } + pValue3 := rw.ValidateString(w, "specialistCode", r.PathValue("specialistCode")) + if pValue3 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "specialistCode is required"}, nil) + } + dto.PathValue1 = pValue1 + dto.PathValue2 = pValue2 + dto.PathValue3 = pValue3 + dto.ReferenceType = e.RTDoctor + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/bpjs-handler/vclaim-sep/handler.go b/internal/interface/bpjs-handler/vclaim-sep/handler.go index c90cf9fc..d40c76e9 100644 --- a/internal/interface/bpjs-handler/vclaim-sep/handler.go +++ b/internal/interface/bpjs-handler/vclaim-sep/handler.go @@ -48,7 +48,7 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { number := rw.ValidateString(w, "number", r.PathValue("number")) - if number <= "" { + if number != "" { return } @@ -63,7 +63,7 @@ func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { number := rw.ValidateString(w, "number", r.PathValue("number")) - if number <= "" { + if number != "" { return } dto := e.DeleteDto{} diff --git a/internal/use-case/bpjs-plugin/reference/helper.go b/internal/use-case/bpjs-plugin/reference/helper.go new file mode 100644 index 00000000..834ba4e5 --- /dev/null +++ b/internal/use-case/bpjs-plugin/reference/helper.go @@ -0,0 +1,35 @@ +package reference + +import ( + "fmt" + e "simrs-vx/internal/domain/bpjs-entities/reference" + ibpjs "simrs-vx/internal/infra/bpjs" +) + +func endpointMapper(input *e.ReadListDto) string { + switch input.ReferenceType { + case e.RTProvince: + return ibpjs.O.BaseUrl + "provinces" + case e.RTCities: + return ibpjs.O.BaseUrl + "cities/" + input.PathValue1 + case e.RTDistrict: + return ibpjs.O.BaseUrl + "districts/" + input.PathValue1 + case e.RTDiagnose: + return ibpjs.O.BaseUrl + "diagnosa/" + input.PathValue1 + case e.RTDiagnosePrb: + return ibpjs.O.BaseUrl + "diagnosaprb" + case e.RTMedicinePrb: + return ibpjs.O.BaseUrl + "obatprb/" + input.PathValue1 + case e.RTUnit: + if input.QParam == "" { + return ibpjs.O.BaseUrl + "referensi/poli" + } + return ibpjs.O.BaseUrl + "referensi/poli/" + input.QParam + case e.RTHealthcare: + return fmt.Sprintf("%sreferensi/faskes?faskes=%s&jenis-faskes=%s", ibpjs.O.BaseUrl, input.PathValue1, input.PathValue2) + case e.RTDoctor: + return fmt.Sprintf("%sreferensi/dokter-dpjp?jenis-pelayanan=%s&tgl-pelayanan=%s&kode-spesialis=%s", ibpjs.O.BaseUrl, input.PathValue1, input.PathValue2, input.PathValue3) + default: + return "" + } +} diff --git a/internal/use-case/bpjs-plugin/reference/plugin.go b/internal/use-case/bpjs-plugin/reference/plugin.go new file mode 100644 index 00000000..f4d4098e --- /dev/null +++ b/internal/use-case/bpjs-plugin/reference/plugin.go @@ -0,0 +1,37 @@ +package reference + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + e "simrs-vx/internal/domain/bpjs-entities/reference" + + "gorm.io/gorm" +) + +func ReadList(input *e.ReadListDto, data *e.Response, tx *gorm.DB) error { + endpoint := endpointMapper(input) + req, err := http.NewRequest("GET", endpoint, nil) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + if err := json.Unmarshal(body, &data); err != nil { + return fmt.Errorf("failed to parse response JSON: %w", err) + } + + return nil +} diff --git a/internal/use-case/bpjs-use-case/reference/case.go b/internal/use-case/bpjs-use-case/reference/case.go new file mode 100644 index 00000000..d753a955 --- /dev/null +++ b/internal/use-case/bpjs-use-case/reference/case.go @@ -0,0 +1,56 @@ +package reference + +import ( + e "simrs-vx/internal/domain/bpjs-entities/reference" + // evsh "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" + + dg "github.com/karincake/apem/db-gorm-pg" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "reference" + +func ReadList(input e.ReadListDto) (*e.Response, error) { + var data e.Response + // var dataList []e.Response + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, &data); err != nil { + return err + } + + // if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + // return err + // } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, &data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &data, nil +} diff --git a/internal/use-case/bpjs-use-case/reference/helper.go b/internal/use-case/bpjs-use-case/reference/helper.go new file mode 100644 index 00000000..5f664320 --- /dev/null +++ b/internal/use-case/bpjs-use-case/reference/helper.go @@ -0,0 +1,22 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package reference + +// import ( +// e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" +// ) + +// func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSep) { +// var inputSrc *e.CreateDto +// if inputT, ok := any(input).(*e.CreateDto); ok { +// inputSrc = inputT +// } else { +// inputTemp := any(input).(*e.UpdateDto) +// inputSrc = &inputTemp.CreateDto +// } + +// data.Encounter_Id = inputSrc.Encounter_Id +// data.Number = inputSrc.Number +// } diff --git a/internal/use-case/bpjs-use-case/reference/lib.go b/internal/use-case/bpjs-use-case/reference/lib.go new file mode 100644 index 00000000..bccaf5df --- /dev/null +++ b/internal/use-case/bpjs-use-case/reference/lib.go @@ -0,0 +1 @@ +package reference diff --git a/internal/use-case/bpjs-use-case/reference/middleware-runner.go b/internal/use-case/bpjs-use-case/reference/middleware-runner.go new file mode 100644 index 00000000..0d13c083 --- /dev/null +++ b/internal/use-case/bpjs-use-case/reference/middleware-runner.go @@ -0,0 +1,42 @@ +package reference + +import ( + e "simrs-vx/internal/domain/bpjs-entities/reference" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Response) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/bpjs-use-case/reference/middleware.go b/internal/use-case/bpjs-use-case/reference/middleware.go new file mode 100644 index 00000000..f7680ffd --- /dev/null +++ b/internal/use-case/bpjs-use-case/reference/middleware.go @@ -0,0 +1,12 @@ +package reference + +import ( + pr "simrs-vx/internal/use-case/bpjs-plugin/reference" +) + +func init() { + readListPreMw = append(readListPreMw, + readListMw{Name: "readList-reference", Func: pr.ReadList}, + ) + +} diff --git a/internal/use-case/bpjs-use-case/reference/tycovar.go b/internal/use-case/bpjs-use-case/reference/tycovar.go new file mode 100644 index 00000000..51df4160 --- /dev/null +++ b/internal/use-case/bpjs-use-case/reference/tycovar.go @@ -0,0 +1,23 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package reference + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/bpjs-entities/reference" +) + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Response, tx *gorm.DB) error +} + +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. From 7f279d8c8ab929a286f12a3021b377938f231543 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Wed, 15 Oct 2025 15:52:25 +0700 Subject: [PATCH 175/190] adjust after qParam removed --- internal/use-case/bpjs-plugin/reference/helper.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/internal/use-case/bpjs-plugin/reference/helper.go b/internal/use-case/bpjs-plugin/reference/helper.go index 834ba4e5..3e87089b 100644 --- a/internal/use-case/bpjs-plugin/reference/helper.go +++ b/internal/use-case/bpjs-plugin/reference/helper.go @@ -21,10 +21,7 @@ func endpointMapper(input *e.ReadListDto) string { case e.RTMedicinePrb: return ibpjs.O.BaseUrl + "obatprb/" + input.PathValue1 case e.RTUnit: - if input.QParam == "" { - return ibpjs.O.BaseUrl + "referensi/poli" - } - return ibpjs.O.BaseUrl + "referensi/poli/" + input.QParam + return ibpjs.O.BaseUrl + "referensi/poli/" + input.PathValue1 case e.RTHealthcare: return fmt.Sprintf("%sreferensi/faskes?faskes=%s&jenis-faskes=%s", ibpjs.O.BaseUrl, input.PathValue1, input.PathValue2) case e.RTDoctor: From a8e41f055c746a32100248f22d09b461e44a1f87 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 16 Oct 2025 08:12:54 +0700 Subject: [PATCH 176/190] add person-insurance, adjust person --- .../migrations/20251016010845.sql | 2 + .../migrations/20251016011023.sql | 17 ++++++ cmd/main-migration/migrations/atlas.sum | 6 +- .../domain/main-entities/encounter/entity.go | 2 +- .../main-entities/person-insurance/dto.go | 1 + .../main-entities/person-insurance/entity.go | 15 +++++ .../domain/main-entities/person/entity.go | 60 ++++++++++--------- internal/interface/migration/main-entities.go | 2 + 8 files changed, 73 insertions(+), 32 deletions(-) create mode 100644 cmd/main-migration/migrations/20251016010845.sql create mode 100644 cmd/main-migration/migrations/20251016011023.sql create mode 100644 internal/domain/main-entities/person-insurance/dto.go create mode 100644 internal/domain/main-entities/person-insurance/entity.go diff --git a/cmd/main-migration/migrations/20251016010845.sql b/cmd/main-migration/migrations/20251016010845.sql new file mode 100644 index 00000000..edbbb414 --- /dev/null +++ b/cmd/main-migration/migrations/20251016010845.sql @@ -0,0 +1,2 @@ +-- Rename a column from "ClassCode" to "Class_Code" +ALTER TABLE "public"."Chemo" RENAME COLUMN "ClassCode" TO "Class_Code"; diff --git a/cmd/main-migration/migrations/20251016011023.sql b/cmd/main-migration/migrations/20251016011023.sql new file mode 100644 index 00000000..12e51e7d --- /dev/null +++ b/cmd/main-migration/migrations/20251016011023.sql @@ -0,0 +1,17 @@ +-- Create "PersonInsurance" table +CREATE TABLE "public"."PersonInsurance" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Person_Id" bigint NULL, + "InsuranceCompany_Id" bigint NULL, + "Ref_Number" character varying(20) NULL, + "DefaultStatus" boolean NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_PersonInsurance_Ref_Number" UNIQUE ("Ref_Number"), + CONSTRAINT "fk_PersonInsurance_InsuranceCompany" FOREIGN KEY ("InsuranceCompany_Id") REFERENCES "public"."InsuranceCompany" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Person_Insurances" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create index "idx_person_insurance" to table: "PersonInsurance" +CREATE UNIQUE INDEX "idx_person_insurance" ON "public"."PersonInsurance" ("Person_Id", "DefaultStatus"); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index e3172704..05c66cea 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:Y15nC3Bp3DWNym7hAvXkF9zFwkHh8nQDpxcNrxQgYhE= +h1:qfP77w9XYWpAFDON1lo+vpqIYCSiPkVEyHXcYFC52Hk= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -43,4 +43,6 @@ h1:Y15nC3Bp3DWNym7hAvXkF9zFwkHh8nQDpxcNrxQgYhE= 20251014060047.sql h1:0jqj49WTtneEIMQDBoo4c095ZGi8sCrA8NnHBrPU6D8= 20251014063537.sql h1:VZLXol0PTsTW21Epg6vBPsztWkDtcxup9F/z88EGgIg= 20251014063720.sql h1:2HVUyCV0ud3BJJDH2GEKZN/+IWLFPCsN1KqhP6csO14= -20251015045455.sql h1:v120CzYYiFWmW81VmKWsjmjRiBIv5aFnPZXwQaQxqes= +20251015045455.sql h1:MeLWmMhAOAz8b15Dd7IAQnt6JxjSml02XCXK22C0Lpg= +20251016010845.sql h1:MSUh26glEDyZ5BFiteYOm9mUCWw7aG9vv5TxYY+EidU= +20251016011023.sql h1:8oUBzIpzAYTo03yex+wLKacv32YjXmn4MsXtBFiQtzY= diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index c9f81712..3e888356 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -32,10 +32,10 @@ type Encounter struct { VisitDate time.Time `json:"visitDate"` PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` InsuranceCompany_Id *uint `json:"insuranceCompany_id"` + InsuranceCompany *ei.InsuranceCompany `json:"insuranceCompany,omitempty" gorm:"foreignKey:InsuranceCompany_Id;references:Id"` Member_Number *string `json:"memberNumber" gorm:"unique;size:20"` Ref_Number *string `json:"refNumber" gorm:"unique;size:20"` Trx_Number *string `json:"trxNumber" gorm:"unique;size:20"` - InsuranceCompany *ei.InsuranceCompany `json:"insuranceCompany,omitempty" gorm:"foreignKey:InsuranceCompany_Id;references:Id"` Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` Appointment_Doctor *ed.Doctor `json:"appointment_doctor,omitempty" gorm:"foreignKey:Appointment_Doctor_Id;references:Id"` Adm_Employee_Id *uint `json:"admEmployee_id"` diff --git a/internal/domain/main-entities/person-insurance/dto.go b/internal/domain/main-entities/person-insurance/dto.go new file mode 100644 index 00000000..5a2ee2a1 --- /dev/null +++ b/internal/domain/main-entities/person-insurance/dto.go @@ -0,0 +1 @@ +package personinsurance diff --git a/internal/domain/main-entities/person-insurance/entity.go b/internal/domain/main-entities/person-insurance/entity.go new file mode 100644 index 00000000..64057835 --- /dev/null +++ b/internal/domain/main-entities/person-insurance/entity.go @@ -0,0 +1,15 @@ +package personinsurance + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/insurance-company" +) + +type PersonInsurance struct { + ecore.Main + Person_Id *uint `json:"person_id" gorm:"uniqueIndex:idx_person_insurance"` + InsuranceCompany_Id *uint `json:"insurance_id"` + InsuranceCompany *ei.InsuranceCompany `json:"insurance,omitempty" gorm:"foreignKey:InsuranceCompany_Id;references:Id"` + Ref_Number *string `json:"ref_number" gorm:"unique;size:20"` + DefaultStatus *bool `json:"default_status" gorm:"uniqueIndex:idx_person_insurance"` +} diff --git a/internal/domain/main-entities/person/entity.go b/internal/domain/main-entities/person/entity.go index 8639df25..8932ca1b 100644 --- a/internal/domain/main-entities/person/entity.go +++ b/internal/domain/main-entities/person/entity.go @@ -6,6 +6,7 @@ import ( el "simrs-vx/internal/domain/main-entities/language" epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" + epi "simrs-vx/internal/domain/main-entities/person-insurance" epr "simrs-vx/internal/domain/main-entities/person-relative" er "simrs-vx/internal/domain/main-entities/regency" @@ -15,35 +16,36 @@ import ( ) type Person struct { - ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"not null;size:150"` - FrontTitle *string `json:"frontTitle" gorm:"size:50"` - EndTitle *string `json:"endTitle" gorm:"size:50"` - BirthDate *time.Time `json:"birthDate,omitempty"` - BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` - BirthRegency *er.Regency `json:"birthRegency,omitempty" gorm:"foreignKey:BirthRegency_Code;references:Code"` - Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` - ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"unique;size:16"` - PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"` - DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"unique;size:20"` - Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` - Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` - Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` - Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` - Nationality *string `json:"nationality": gorm:"size:50"` - Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` - Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` - Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` - Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` - Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` - Language_Code *string `json:"language_code" gorm:"size:10"` - Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` - CommunicationIssueStatus bool `json:"communicationIssueStatus"` - Disability *string `json:"disability" gorm:"size:100"` - ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl" gorm:"size:1024"` - PassportFileUrl *string `json:"passportFileUrl" gorm:"size:1024"` - DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl" gorm:"size:1024"` - FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl" gorm:"size:1024"` + ecore.Main // adjust this according to the needs + Name string `json:"name" gorm:"not null;size:150"` + FrontTitle *string `json:"frontTitle" gorm:"size:50"` + EndTitle *string `json:"endTitle" gorm:"size:50"` + BirthDate *time.Time `json:"birthDate,omitempty"` + BirthRegency_Code *string `json:"birthRegency_code" gorm:"size:4"` + BirthRegency *er.Regency `json:"birthRegency,omitempty" gorm:"foreignKey:BirthRegency_Code;references:Code"` + Gender_Code *erp.GenderCode `json:"gender_code" gorm:"size:10"` + ResidentIdentityNumber *string `json:"residentIdentityNumber" gorm:"unique;size:16"` + PassportNumber *string `json:"passportNumber" gorm:"unique;size:20"` + DrivingLicenseNumber *string `json:"drivingLicenseNumber" gorm:"unique;size:20"` + Religion_Code *erp.ReligionCode `json:"religion_code" gorm:"size:10"` + Education_Code *erp.EducationCode `json:"education_code" gorm:"size:10"` + Ocupation_Code *erp.OcupationCode `json:"occupation_code" gorm:"size:15"` + Ocupation_Name *string `json:"occupation_name" gorm:"size:50"` + Nationality *string `json:"nationality": gorm:"size:50"` + Ethnic_Code *string `json:"ethnic_code" gorm:"size:20"` + Ethnic *ee.Ethnic `json:"ethnic,omitempty" gorm:"foreignKey:Ethnic_Code;references:Code"` + Language_Code *string `json:"language_code" gorm:"size:10"` + Language *el.Language `json:"language,omitempty" gorm:"foreignKey:Language_Code;references:Code"` + CommunicationIssueStatus bool `json:"communicationIssueStatus"` + Disability *string `json:"disability" gorm:"size:100"` + ResidentIdentityFileUrl *string `json:"residentIdentityFileUrl" gorm:"size:1024"` + PassportFileUrl *string `json:"passportFileUrl" gorm:"size:1024"` + DrivingLicenseFileUrl *string `json:"drivingLicenseFileUrl" gorm:"size:1024"` + FamilyIdentityFileUrl *string `json:"familyIdentityFileUrl" gorm:"size:1024"` + Addresses *[]epa.PersonAddress `json:"addresses" gorm:"foreignKey:Person_Id"` + Contacts *[]epc.PersonContact `json:"contacts" gorm:"foreignKey:Person_Id"` + Relatives *[]epr.PersonRelative `json:"relatives" gorm:"foreignKey:Person_Id"` + Insurances *[]epi.PersonInsurance `json:"insurances" gorm:"foreignKey:Person_Id"` } func (d Person) IsSameResidentIdentityNumber(input *string) bool { diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 034495c3..ea8ec1c0 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -55,6 +55,7 @@ import ( person "simrs-vx/internal/domain/main-entities/person" personaddress "simrs-vx/internal/domain/main-entities/person-address" personcontact "simrs-vx/internal/domain/main-entities/person-contact" + personinsurance "simrs-vx/internal/domain/main-entities/person-insurance" personrelative "simrs-vx/internal/domain/main-entities/person-relative" pharmacist "simrs-vx/internal/domain/main-entities/pharmacist" pharmacycompany "simrs-vx/internal/domain/main-entities/pharmacy-company" @@ -96,6 +97,7 @@ func getMainEntities() []any { &person.Person{}, &personaddress.PersonAddress{}, &personcontact.PersonContact{}, + &personinsurance.PersonInsurance{}, &pharmacycompany.PharmacyCompany{}, &diagnosesrc.DiagnoseSrc{}, &proceduresrc.ProcedureSrc{}, From 609119c3060ae9435e675d16d0595076bdb6f06f Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 16 Oct 2025 08:39:22 +0700 Subject: [PATCH 177/190] add person-insurance --- internal/domain/main-entities/patient/dto.go | 18 +- .../main-entities/person-insurance/dto.go | 74 +++++ .../interface/main-handler/main-handler.go | 2 + .../main-handler/person-insurance/handler.go | 71 +++++ .../use-case/main-use-case/patient/case.go | 16 + .../main-use-case/person-insurance/case.go | 276 ++++++++++++++++++ .../main-use-case/person-insurance/helper.go | 24 ++ .../main-use-case/person-insurance/lib.go | 193 ++++++++++++ .../person-insurance/middleware-runner.go | 103 +++++++ .../person-insurance/middleware.go | 9 + .../main-use-case/person-insurance/tycovar.go | 44 +++ 11 files changed, 822 insertions(+), 8 deletions(-) create mode 100644 internal/interface/main-handler/person-insurance/handler.go create mode 100644 internal/use-case/main-use-case/person-insurance/case.go create mode 100644 internal/use-case/main-use-case/person-insurance/helper.go create mode 100644 internal/use-case/main-use-case/person-insurance/lib.go create mode 100644 internal/use-case/main-use-case/person-insurance/middleware-runner.go create mode 100644 internal/use-case/main-use-case/person-insurance/middleware.go create mode 100644 internal/use-case/main-use-case/person-insurance/tycovar.go diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index d1d32324..1374eb97 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -8,6 +8,7 @@ import ( ep "simrs-vx/internal/domain/main-entities/person" epa "simrs-vx/internal/domain/main-entities/person-address" epc "simrs-vx/internal/domain/main-entities/person-contact" + epi "simrs-vx/internal/domain/main-entities/person-insurance" epr "simrs-vx/internal/domain/main-entities/person-relative" erc "simrs-vx/internal/domain/references/common" @@ -15,14 +16,15 @@ import ( ) type CreateDto struct { - Person_Id *uint `json:"-"` - Person *ep.UpdateDto `json:"person"` - NewBornStatus bool `json:"newBornStatus"` - PersonAddresses []epa.UpdateDto `json:"personAddresses"` - PersonContacts []epc.UpdateDto `json:"personContacts"` - PersonRelatives []epr.UpdateDto `json:"personRelatives"` - RegisteredAt *time.Time `json:"registeredAt"` - Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` + Person_Id *uint `json:"-"` + Person *ep.UpdateDto `json:"person"` + NewBornStatus bool `json:"newBornStatus"` + PersonAddresses []epa.UpdateDto `json:"personAddresses"` + PersonContacts []epc.UpdateDto `json:"personContacts"` + PersonRelatives []epr.UpdateDto `json:"personRelatives"` + PersonInsurances []epi.UpdateDto `json:"personInsurances"` + RegisteredAt *time.Time `json:"registeredAt"` + Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` } type ReadListDto struct { diff --git a/internal/domain/main-entities/person-insurance/dto.go b/internal/domain/main-entities/person-insurance/dto.go index 5a2ee2a1..e811023d 100644 --- a/internal/domain/main-entities/person-insurance/dto.go +++ b/internal/domain/main-entities/person-insurance/dto.go @@ -1 +1,75 @@ package personinsurance + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/insurance-company" +) + +type CreateDto struct { + Person_Id uint `json:"person_id"` + InsuranceCompany_Id *uint `json:"insurance_id"` + Ref_Number *string `json:"ref_number" gorm:"unique;size:20"` + DefaultStatus *bool `json:"default_status" gorm:"uniqueIndex:idx_person_insurance"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Person_Id *uint `json:"person-id"` + InsuranceCompany_Id *uint `json:"insurance-company-id"` + Ref_Number *string `json:"ref-number"` + DefaultStatus *bool `json:"default-status"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` +} + +type UpdateDto struct { + Id uint16 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint16 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Person_Id *uint `json:"person_id"` + InsuranceCompany_Id *uint `json:"insuranceCompany_id"` + InsuranceCompany *ei.InsuranceCompany `json:"insuranceCompany,omitempty"` + Ref_Number *string `json:"ref_number"` + DefaultStatus *bool `json:"defaultStatus"` +} + +func (d PersonInsurance) ToResponse() ResponseDto { + resp := ResponseDto{ + Person_Id: d.Person_Id, + InsuranceCompany_Id: d.InsuranceCompany_Id, + InsuranceCompany: d.InsuranceCompany, + Ref_Number: d.Ref_Number, + DefaultStatus: d.DefaultStatus, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []PersonInsurance) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 63448f21..7af27137 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -38,6 +38,7 @@ import ( person "simrs-vx/internal/interface/main-handler/person" personaddress "simrs-vx/internal/interface/main-handler/person-address" personcontact "simrs-vx/internal/interface/main-handler/person-contact" + personinsurance "simrs-vx/internal/interface/main-handler/person-insurance" pharmacist "simrs-vx/internal/interface/main-handler/pharmacist" user "simrs-vx/internal/interface/main-handler/user" @@ -239,6 +240,7 @@ func SetRoutes() http.Handler { hc.RegCrud(r, "/v1/person", person.O) hc.RegCrud(r, "/v1/person-address", personaddress.O) hc.RegCrud(r, "/v1/person-contact", personcontact.O) + hc.RegCrud(r, "/v1/person-insurance", personinsurance.O) hc.RegCrud(r, "/v1/employee", employee.O) hc.RegCrud(r, "/v1/doctor", doctor.O) hc.RegCrud(r, "/v1/nurse", nurse.O) diff --git a/internal/interface/main-handler/person-insurance/handler.go b/internal/interface/main-handler/person-insurance/handler.go new file mode 100644 index 00000000..d5e42f7b --- /dev/null +++ b/internal/interface/main-handler/person-insurance/handler.go @@ -0,0 +1,71 @@ +package personinsurance + +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/person-insurance" + u "simrs-vx/internal/use-case/main-use-case/person-insurance" +) + +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 = uint16(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 = uint16(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 9736ee09..fd17d7fb 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -9,6 +9,7 @@ import ( upe "simrs-vx/internal/use-case/main-use-case/person" upa "simrs-vx/internal/use-case/main-use-case/person-address" upc "simrs-vx/internal/use-case/main-use-case/person-contact" + upi "simrs-vx/internal/use-case/main-use-case/person-insurance" upr "simrs-vx/internal/use-case/main-use-case/person-relative" ere "simrs-vx/internal/domain/references/encounter" @@ -47,6 +48,7 @@ func Create(input e.CreateDto) (*d.Data, error) { } else { input.Person_Id = person_id } + for idx := range input.PersonAddresses { input.PersonAddresses[idx].Person_Id = *input.Person_Id } @@ -68,6 +70,13 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + for idx := range input.PersonInsurances { + input.PersonInsurances[idx].Person_Id = *input.Person_Id + } + if err := upi.CreateOrUpdateBatch(input.PersonInsurances, &event, tx); err != nil { + return err + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { @@ -252,6 +261,13 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } + for idx := range input.PersonInsurances { + input.PersonInsurances[idx].Person_Id = *input.Person_Id + } + if err := upi.CreateOrUpdateBatch(input.PersonInsurances, &event, tx); err != nil { + return err + } + if err := UpdateData(input, data, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/person-insurance/case.go b/internal/use-case/main-use-case/person-insurance/case.go new file mode 100644 index 00000000..e9595137 --- /dev/null +++ b/internal/use-case/main-use-case/person-insurance/case.go @@ -0,0 +1,276 @@ +package personinsurance + +import ( + e "simrs-vx/internal/domain/main-entities/person-insurance" + "strconv" + + dg "github.com/karincake/apem/db-gorm-pg" + d "github.com/karincake/dodol" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "person-insurance" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.PersonInsurance{} + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + err := dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { + return err + } + + if resData, err := CreateData(input, &event, tx); err != nil { + return err + } else { + data = *resData + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunCreateMiddleware(createPostMw, &input, &data); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: data.ToResponse(), + }, nil +} + +func ReadList(input e.ReadListDto) (*d.Data, error) { + var data *e.PersonInsurance + var dataList []e.PersonInsurance + var metaList *e.MetaDto + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, data); err != nil { + return err + } + + if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "list-data", + "status": "fetched", + "page_number": strconv.Itoa(metaList.PageNumber), + "page_size": strconv.Itoa(metaList.PageSize), + "record_totalCount": strconv.Itoa(metaList.Count), + "record_currentCount": strconv.Itoa(len(dataList)), + }, + Data: e.ToResponseList(dataList), + }, nil +} + +func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { + var data *e.PersonInsurance + var err error + + event := pl.Event{ + Feature: "ReadDetail", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readDetail") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPreMw, &input, data); err != nil { + return err + } + + if data, err = ReadDetailData(input, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { + return err + } + + 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 +} + +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.PersonInsurance + var err error + + event := pl.Event{ + Feature: "Update", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "update") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := UpdateData(input, data, &event, tx); err != nil { + return err + } + + pl.SetLogInfo(&event, nil, "complete") + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunUpdateMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + 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 + +} + +func Delete(input e.DeleteDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.PersonInsurance + var err error + + event := pl.Event{ + Feature: "Delete", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "delete") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { + return err + } + + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPreMw, &rdDto, data); err != nil { + return err + } + + if err := DeleteData(data, &event, tx); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunDeleteMiddleware(readDetailPostMw, &rdDto, data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &d.Data{ + Meta: d.IS{ + "source": source, + "structure": "single-data", + "status": "deleted", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/person-insurance/helper.go b/internal/use-case/main-use-case/person-insurance/helper.go new file mode 100644 index 00000000..e9352119 --- /dev/null +++ b/internal/use-case/main-use-case/person-insurance/helper.go @@ -0,0 +1,24 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package personinsurance + +import ( + e "simrs-vx/internal/domain/main-entities/person-insurance" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PersonInsurance) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Person_Id = &inputSrc.Person_Id + data.InsuranceCompany_Id = inputSrc.InsuranceCompany_Id + data.Ref_Number = inputSrc.Ref_Number + data.DefaultStatus = inputSrc.DefaultStatus +} diff --git a/internal/use-case/main-use-case/person-insurance/lib.go b/internal/use-case/main-use-case/person-insurance/lib.go new file mode 100644 index 00000000..86c6dc83 --- /dev/null +++ b/internal/use-case/main-use-case/person-insurance/lib.go @@ -0,0 +1,193 @@ +package personinsurance + +import ( + e "simrs-vx/internal/domain/main-entities/person-insurance" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + "gorm.io/gorm" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.PersonInsurance, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.PersonInsurance{} + setData(&input, &data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Create(&data).Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.PersonInsurance, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.PersonInsurance{} + pagination := gh.Pagination{} + count := int64(0) + meta := e.MetaDto{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx. + Model(&e.PersonInsurance{}). + Scopes(gh.Filter(input)). + Count(&count). + Scopes(gh.Paginate(input, &pagination)). + Order("\"CreatedAt\" DESC") + + if err := tx.Find(&data).Error; err != nil { + if err == gorm.ErrRecordNotFound { + return nil, &meta, nil + } + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return nil, nil, pl.SetLogError(event, input) + + } + meta.Count = int(count) + meta.PageNumber = pagination.PageNumber + meta.PageSize = pagination.PageSize + + pl.SetLogInfo(event, nil, "complete") + return data, &meta, nil +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.PersonInsurance, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.PersonInsurance{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.First(&data, input.Id).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.PersonInsurance, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setData(&input, data) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 +} + +func DeleteData(data *e.PersonInsurance, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBDelete") + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if err := tx.Delete(&data).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-delete-fail", + Detail: "Database delete failed", + Raw: err, + } + return pl.SetLogError(event, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func CreateOrUpdateBatch(input []e.UpdateDto, event *pl.Event, tx ...*gorm.DB) error { + var data = make([]e.PersonInsurance, len(input)) + var dbx *gorm.DB + if len(tx) > 0 { + dbx = tx[0] + } else { + dbx = dg.I + } + + for idx := range input { + if input[idx].Id > 0 { + if err := dbx.Where("\"Id\" = ? AND \"Person_Id\" = ?", input[idx].Id, input[idx].Person_Id).First(&data[idx]).Error; err == nil { + setData(&input[idx], &data[idx]) + if err := dbx.Save(&data[idx]).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) + } + } else if err != gorm.ErrRecordNotFound { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-get-fail", + Detail: "Database get failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + continue + } + setData(&input[idx], &data[idx]) + if err := dbx.Create(&data[idx]).Error; err != nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-create-fail", + Detail: "Database insert failed", + Raw: err, + } + return pl.SetLogError(event, input) + } + } + + return nil +} diff --git a/internal/use-case/main-use-case/person-insurance/middleware-runner.go b/internal/use-case/main-use-case/person-insurance/middleware-runner.go new file mode 100644 index 00000000..ce9ff869 --- /dev/null +++ b/internal/use-case/main-use-case/person-insurance/middleware-runner.go @@ -0,0 +1,103 @@ +package personinsurance + +import ( + e "simrs-vx/internal/domain/main-entities/person-insurance" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +// ExecuteCreateMiddleware executes create middleware +func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.PersonInsurance) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.PersonInsurance) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PersonInsurance) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PersonInsurance) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.PersonInsurance) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/main-use-case/person-insurance/middleware.go b/internal/use-case/main-use-case/person-insurance/middleware.go new file mode 100644 index 00000000..a190f067 --- /dev/null +++ b/internal/use-case/main-use-case/person-insurance/middleware.go @@ -0,0 +1,9 @@ +package personinsurance + +// example of middleware +// func init() { +// createPreMw = append(createPreMw, +// CreateMw{Name: "modif-input", Func: pm.ModifInput}, +// CreateMw{Name: "check-data", Func: pm.CheckData}, +// ) +// } diff --git a/internal/use-case/main-use-case/person-insurance/tycovar.go b/internal/use-case/main-use-case/person-insurance/tycovar.go new file mode 100644 index 00000000..2cc94930 --- /dev/null +++ b/internal/use-case/main-use-case/person-insurance/tycovar.go @@ -0,0 +1,44 @@ +/* +DESCRIPTION: +A sample, part of the package that contains type, constants, and/or variables. + +In this sample it also provides type and variable regarding the needs of the +middleware to separate from main use-case which has the basic CRUD +functionality. The purpose of this is to make the code more maintainable. +*/ +package personinsurance + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/person-insurance" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.PersonInsurance, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.PersonInsurance, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.PersonInsurance, tx *gorm.DB) error +} + +type UpdateMw = readDetailMw +type DeleteMw = readDetailMw + +var createPreMw []createMw // preprocess middleware +var createPostMw []createMw // postprocess middleware +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. +var readDetailPreMw []readDetailMw +var readDetailPostMw []readDetailMw +var updatePreMw []readDetailMw +var updatePostMw []readDetailMw +var deletePreMw []readDetailMw +var deletePostMw []readDetailMw From b4a433450451953d246bae033b49ba24b22936f6 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 16 Oct 2025 08:55:07 +0700 Subject: [PATCH 178/190] feat (encounter): fix naming dto conventioon --- internal/domain/main-entities/encounter/dto.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 4d752e9a..7062d92a 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -29,9 +29,9 @@ type CreateDto struct { VisitDate time.Time `json:"visitDate"` PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code" gorm:"size:10"` InsuranceCompany_Id *uint `json:"insuranceCompany_id"` - Member_Number *string `json:"memberNumber" validate:"maxLength=20"` - Ref_Number *string `json:"refNumber" validate:"maxLength=20"` - Trx_Number *string `json:"trxNumber" validate:"maxLength=20"` + Member_Number *string `json:"member_number" validate:"maxLength=20"` + Ref_Number *string `json:"ref_number" validate:"maxLength=20"` + Trx_Number *string `json:"trx_number" validate:"maxLength=20"` Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` Adm_Employee_Id *uint `json:"adm_employee_id"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` @@ -49,7 +49,7 @@ type FilterDto struct { Patient_Id *uint `json:"patient-id"` Patient *ep.Patient `json:"patient,omitempty"` RegisteredAt *time.Time `json:"registeredAt"` - Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` + Class_Code ere.EncounterClassCode `json:"class-code" validate:"maxLength=10"` Unit_Id *uint `json:"unit-id"` Specialist_Id *uint16 `json:"specialist-id"` Subspecialist_Id *uint16 `json:"subspecialist-id"` @@ -107,9 +107,9 @@ type ResponseDto struct { VisitDate time.Time `json:"visitDate"` PaymentMethod_Code erc.PaymentMethodCode `json:"paymentMethod_code"` InsuranceCompany_Id *uint `json:"insuranceCompany_id"` - Member_Number *string `json:"memberNumber"` - Ref_Number *string `json:"refNumber"` - Trx_Number *string `json:"trxNumber"` + Member_Number *string `json:"member_number"` + Ref_Number *string `json:"ref_number"` + Trx_Number *string `json:"trx_number"` Appointment_Doctor_Id *uint `json:"assignment_doctor_id"` Appointment_Doctor *ed.Doctor `json:"assignment_doctor,omitempty"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` From c009a34f5e7d15a46afb6f1c89a6eb0d4f3565c3 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 16 Oct 2025 09:50:40 +0700 Subject: [PATCH 179/190] member, nik ok, bpjs tested but failed from 3rd party --- internal/domain/bpjs-entities/member/dto.go | 14 ++++ .../domain/bpjs-entities/member/entity.go | 78 +++++++++++++++++++ .../interface/bpjs-handler/bpjs-handler.go | 6 ++ .../interface/bpjs-handler/member/handler.go | 45 +++++++++++ .../bpjs-handler/reference/handler.go | 1 + .../use-case/bpjs-plugin/member/helper.go | 18 +++++ .../use-case/bpjs-plugin/member/plugin.go | 37 +++++++++ .../use-case/bpjs-use-case/member/case.go | 50 ++++++++++++ .../bpjs-use-case/member/middleware-runner.go | 42 ++++++++++ .../bpjs-use-case/member/middleware.go | 12 +++ .../use-case/bpjs-use-case/member/tycovar.go | 18 +++++ .../use-case/bpjs-use-case/reference/case.go | 6 -- .../bpjs-use-case/reference/helper.go | 22 ------ .../use-case/bpjs-use-case/reference/lib.go | 1 - 14 files changed, 321 insertions(+), 29 deletions(-) create mode 100644 internal/domain/bpjs-entities/member/dto.go create mode 100644 internal/domain/bpjs-entities/member/entity.go create mode 100644 internal/interface/bpjs-handler/member/handler.go create mode 100644 internal/use-case/bpjs-plugin/member/helper.go create mode 100644 internal/use-case/bpjs-plugin/member/plugin.go create mode 100644 internal/use-case/bpjs-use-case/member/case.go create mode 100644 internal/use-case/bpjs-use-case/member/middleware-runner.go create mode 100644 internal/use-case/bpjs-use-case/member/middleware.go create mode 100644 internal/use-case/bpjs-use-case/member/tycovar.go delete mode 100644 internal/use-case/bpjs-use-case/reference/helper.go delete mode 100644 internal/use-case/bpjs-use-case/reference/lib.go diff --git a/internal/domain/bpjs-entities/member/dto.go b/internal/domain/bpjs-entities/member/dto.go new file mode 100644 index 00000000..e61a9f74 --- /dev/null +++ b/internal/domain/bpjs-entities/member/dto.go @@ -0,0 +1,14 @@ +package member + +type ReadListDto struct { + ReferenceType ReferenceType `json:"-"` + PathValue1 string `json:"-"` + PathValue2 string `json:"-"` +} + +type ReferenceType string + +const ( + RTNik ReferenceType = "nik" + RTBpjs ReferenceType = "bpjs" +) diff --git a/internal/domain/bpjs-entities/member/entity.go b/internal/domain/bpjs-entities/member/entity.go new file mode 100644 index 00000000..b6c4f0d7 --- /dev/null +++ b/internal/domain/bpjs-entities/member/entity.go @@ -0,0 +1,78 @@ +package member + +type Response struct { + MetaData *MetaData `json:"metaData"` + Response *BPJSDataRes `json:"response"` +} + +type MetaData struct { + Code string `json:"code"` + Message string `json:"message"` +} + +type BPJSDataRes struct { + Peserta *Peserta `json:"peserta"` +} + +type Peserta struct { + Cob *COB `json:"cob"` + HakKelas *HakKelas `json:"hakKelas"` + Informasi *Informasi `json:"informasi"` + JenisPeserta *JenisPeserta `json:"jenisPeserta"` + Mr *MR `json:"mr"` + Nama *string `json:"nama"` + Nik *string `json:"nik"` + NoKartu *string `json:"noKartu"` + Pisa *string `json:"pisa"` + ProvUmum *ProvUmum `json:"provUmum"` + Sex *string `json:"sex"` + StatusPeserta *StatusPeserta `json:"statusPeserta"` + TglCetakKartu *string `json:"tglCetakKartu"` + TglLahir *string `json:"tglLahir"` + TglTAT *string `json:"tglTAT"` + TglTMT *string `json:"tglTMT"` + Umur *Umur `json:"umur"` +} + +type COB struct { + NmAsuransi *string `json:"nmAsuransi"` + NoAsuransi *string `json:"noAsuransi"` + TglTAT *string `json:"tglTAT"` + TglTMT *string `json:"tglTMT"` +} + +type HakKelas struct { + Keterangan *string `json:"keterangan"` + Kode *string `json:"kode"` +} + +type Informasi struct { + Dinsos *string `json:"dinsos"` + NoSKTM *string `json:"noSKTM"` + ProlanisPRB *string `json:"prolanisPRB"` +} + +type JenisPeserta struct { + Keterangan *string `json:"keterangan"` + Kode *string `json:"kode"` +} + +type MR struct { + NoMR *string `json:"noMR"` + NoTelepon *string `json:"noTelepon"` +} + +type ProvUmum struct { + KdProvider *string `json:"kdProvider"` + NmProvider *string `json:"nmProvider"` +} + +type StatusPeserta struct { + Keterangan *string `json:"keterangan"` + Kode *string `json:"kode"` +} + +type Umur struct { + UmurSaatPelayanan *string `json:"umurSaatPelayanan"` + UmurSekarang *string `json:"umurSekarang"` +} diff --git a/internal/interface/bpjs-handler/bpjs-handler.go b/internal/interface/bpjs-handler/bpjs-handler.go index 5d5673df..b1a2c80a 100644 --- a/internal/interface/bpjs-handler/bpjs-handler.go +++ b/internal/interface/bpjs-handler/bpjs-handler.go @@ -4,6 +4,7 @@ import ( "net/http" /******************** main / transaction ********************/ + member "simrs-vx/internal/interface/bpjs-handler/member" reference "simrs-vx/internal/interface/bpjs-handler/reference" vclaimsep "simrs-vx/internal/interface/bpjs-handler/vclaim-sep" vclaimsephist "simrs-vx/internal/interface/bpjs-handler/vclaim-sep-hist" @@ -71,6 +72,11 @@ func SetRoutes() http.Handler { "GET /responsible-doctor/{serviceType}/{serviceDate}/{specialistCode}": reference.GetListDoctor, }) + hk.GroupRoutes("/v1/member", r, hk.MapHandlerFunc{ + "GET /bpjs/{cardNumber}/{sepDate}": member.GetListByBpjsNumber, + "GET /nik/{nik}/{sepDate}": member.GetListByNik, + }) + /******************** actor ********************/ /******************** sources ********************/ diff --git a/internal/interface/bpjs-handler/member/handler.go b/internal/interface/bpjs-handler/member/handler.go new file mode 100644 index 00000000..80881ee3 --- /dev/null +++ b/internal/interface/bpjs-handler/member/handler.go @@ -0,0 +1,45 @@ +package member + +import ( + "net/http" + + e "simrs-vx/internal/domain/bpjs-entities/member" + u "simrs-vx/internal/use-case/bpjs-use-case/member" + + d "github.com/karincake/dodol" + rw "github.com/karincake/risoles" +) + +func GetListByBpjsNumber(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue1 := rw.ValidateString(w, "cardNumber", r.PathValue("cardNumber")) + if pValue1 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "cardNumber is required"}, nil) + } + pValue2 := rw.ValidateString(w, "sepDate", r.PathValue("sepDate")) + if pValue2 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "sepDate is required"}, nil) + } + dto.ReferenceType = e.RTBpjs + dto.PathValue1 = pValue1 + dto.PathValue2 = pValue2 + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListByNik(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue1 := rw.ValidateString(w, "nik", r.PathValue("nik")) + if pValue1 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "nik is required"}, nil) + } + pValue2 := rw.ValidateString(w, "sepDate", r.PathValue("sepDate")) + if pValue2 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "sepDate is required"}, nil) + } + dto.ReferenceType = e.RTNik + dto.PathValue1 = pValue1 + dto.PathValue2 = pValue2 + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/bpjs-handler/reference/handler.go b/internal/interface/bpjs-handler/reference/handler.go index d452ebc4..fb972af1 100644 --- a/internal/interface/bpjs-handler/reference/handler.go +++ b/internal/interface/bpjs-handler/reference/handler.go @@ -2,6 +2,7 @@ package reference import ( "net/http" + e "simrs-vx/internal/domain/bpjs-entities/reference" u "simrs-vx/internal/use-case/bpjs-use-case/reference" diff --git a/internal/use-case/bpjs-plugin/member/helper.go b/internal/use-case/bpjs-plugin/member/helper.go new file mode 100644 index 00000000..f5e2bc0e --- /dev/null +++ b/internal/use-case/bpjs-plugin/member/helper.go @@ -0,0 +1,18 @@ +package member + +import ( + "fmt" + e "simrs-vx/internal/domain/bpjs-entities/member" + ibpjs "simrs-vx/internal/infra/bpjs" +) + +func endpointMapper(input *e.ReadListDto) string { + switch input.ReferenceType { + case e.RTBpjs: + return fmt.Sprintf("%speserta/nokartu?noKartu=%s&tglpelayanan=%s", ibpjs.O.BaseUrl, input.PathValue1, input.PathValue2) + case e.RTNik: + return fmt.Sprintf("%speserta/nik?nik=%s&tglpelayanan=%s", ibpjs.O.BaseUrl, input.PathValue1, input.PathValue2) + default: + return "" + } +} diff --git a/internal/use-case/bpjs-plugin/member/plugin.go b/internal/use-case/bpjs-plugin/member/plugin.go new file mode 100644 index 00000000..7610a5ac --- /dev/null +++ b/internal/use-case/bpjs-plugin/member/plugin.go @@ -0,0 +1,37 @@ +package member + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + e "simrs-vx/internal/domain/bpjs-entities/member" + + "gorm.io/gorm" +) + +func ReadList(input *e.ReadListDto, data *e.Response, tx *gorm.DB) error { + endpoint := endpointMapper(input) + req, err := http.NewRequest("GET", endpoint, nil) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + if err := json.Unmarshal(body, &data); err != nil { + return fmt.Errorf("failed to parse response JSON: %w", err) + } + + return nil +} diff --git a/internal/use-case/bpjs-use-case/member/case.go b/internal/use-case/bpjs-use-case/member/case.go new file mode 100644 index 00000000..7c50ea76 --- /dev/null +++ b/internal/use-case/bpjs-use-case/member/case.go @@ -0,0 +1,50 @@ +package member + +import ( + e "simrs-vx/internal/domain/bpjs-entities/member" + + dg "github.com/karincake/apem/db-gorm-pg" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "member" + +func ReadList(input e.ReadListDto) (*e.Response, error) { + var data e.Response + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, &data); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, &data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &data, nil +} diff --git a/internal/use-case/bpjs-use-case/member/middleware-runner.go b/internal/use-case/bpjs-use-case/member/middleware-runner.go new file mode 100644 index 00000000..71061a1b --- /dev/null +++ b/internal/use-case/bpjs-use-case/member/middleware-runner.go @@ -0,0 +1,42 @@ +package member + +import ( + e "simrs-vx/internal/domain/bpjs-entities/member" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Response) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/bpjs-use-case/member/middleware.go b/internal/use-case/bpjs-use-case/member/middleware.go new file mode 100644 index 00000000..e2fd5584 --- /dev/null +++ b/internal/use-case/bpjs-use-case/member/middleware.go @@ -0,0 +1,12 @@ +package member + +import ( + pm "simrs-vx/internal/use-case/bpjs-plugin/member" +) + +func init() { + readListPreMw = append(readListPreMw, + readListMw{Name: "readList-member", Func: pm.ReadList}, + ) + +} diff --git a/internal/use-case/bpjs-use-case/member/tycovar.go b/internal/use-case/bpjs-use-case/member/tycovar.go new file mode 100644 index 00000000..7d04363f --- /dev/null +++ b/internal/use-case/bpjs-use-case/member/tycovar.go @@ -0,0 +1,18 @@ +/* +member is peserta +*/ +package member + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/bpjs-entities/member" +) + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Response, tx *gorm.DB) error +} + +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. diff --git a/internal/use-case/bpjs-use-case/reference/case.go b/internal/use-case/bpjs-use-case/reference/case.go index d753a955..bc9bb5d6 100644 --- a/internal/use-case/bpjs-use-case/reference/case.go +++ b/internal/use-case/bpjs-use-case/reference/case.go @@ -2,7 +2,6 @@ package reference import ( e "simrs-vx/internal/domain/bpjs-entities/reference" - // evsh "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-hist" dg "github.com/karincake/apem/db-gorm-pg" @@ -16,7 +15,6 @@ const source = "reference" func ReadList(input e.ReadListDto) (*e.Response, error) { var data e.Response - // var dataList []e.Response var err error event := pl.Event{ @@ -35,10 +33,6 @@ func ReadList(input e.ReadListDto) (*e.Response, error) { return err } - // if dataList, metaList, err = ReadListData(input, &event, tx); err != nil { - // return err - // } - mwRunner.setMwType(pu.MWTPost) // Run post-middleware if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, &data); err != nil { diff --git a/internal/use-case/bpjs-use-case/reference/helper.go b/internal/use-case/bpjs-use-case/reference/helper.go deleted file mode 100644 index 5f664320..00000000 --- a/internal/use-case/bpjs-use-case/reference/helper.go +++ /dev/null @@ -1,22 +0,0 @@ -/* -DESCRIPTION: -Any functions that are used internally by the use-case -*/ -package reference - -// import ( -// e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep" -// ) - -// func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSep) { -// var inputSrc *e.CreateDto -// if inputT, ok := any(input).(*e.CreateDto); ok { -// inputSrc = inputT -// } else { -// inputTemp := any(input).(*e.UpdateDto) -// inputSrc = &inputTemp.CreateDto -// } - -// data.Encounter_Id = inputSrc.Encounter_Id -// data.Number = inputSrc.Number -// } diff --git a/internal/use-case/bpjs-use-case/reference/lib.go b/internal/use-case/bpjs-use-case/reference/lib.go deleted file mode 100644 index bccaf5df..00000000 --- a/internal/use-case/bpjs-use-case/reference/lib.go +++ /dev/null @@ -1 +0,0 @@ -package reference From 2fb47d0d4856d2503324470214e959734323e1f4 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 16 Oct 2025 11:26:09 +0700 Subject: [PATCH 180/190] monitoring done --- internal/domain/bpjs-entities/member/dto.go | 1 + .../domain/bpjs-entities/monitoring/dto.go | 15 ++++++ .../domain/bpjs-entities/monitoring/entity.go | 43 ++++++++++++++++ .../interface/bpjs-handler/bpjs-handler.go | 6 +++ .../bpjs-handler/monitoring/handler.go | 50 +++++++++++++++++++ .../use-case/bpjs-plugin/monitoring/helper.go | 18 +++++++ .../use-case/bpjs-plugin/monitoring/plugin.go | 37 ++++++++++++++ .../use-case/bpjs-use-case/monitoring/case.go | 50 +++++++++++++++++++ .../monitoring/middleware-runner.go | 42 ++++++++++++++++ .../bpjs-use-case/monitoring/middleware.go | 12 +++++ .../bpjs-use-case/monitoring/tycovar.go | 18 +++++++ 11 files changed, 292 insertions(+) create mode 100644 internal/domain/bpjs-entities/monitoring/dto.go create mode 100644 internal/domain/bpjs-entities/monitoring/entity.go create mode 100644 internal/interface/bpjs-handler/monitoring/handler.go create mode 100644 internal/use-case/bpjs-plugin/monitoring/helper.go create mode 100644 internal/use-case/bpjs-plugin/monitoring/plugin.go create mode 100644 internal/use-case/bpjs-use-case/monitoring/case.go create mode 100644 internal/use-case/bpjs-use-case/monitoring/middleware-runner.go create mode 100644 internal/use-case/bpjs-use-case/monitoring/middleware.go create mode 100644 internal/use-case/bpjs-use-case/monitoring/tycovar.go diff --git a/internal/domain/bpjs-entities/member/dto.go b/internal/domain/bpjs-entities/member/dto.go index e61a9f74..f9c95655 100644 --- a/internal/domain/bpjs-entities/member/dto.go +++ b/internal/domain/bpjs-entities/member/dto.go @@ -4,6 +4,7 @@ type ReadListDto struct { ReferenceType ReferenceType `json:"-"` PathValue1 string `json:"-"` PathValue2 string `json:"-"` + PathValue3 string `json:"-"` } type ReferenceType string diff --git a/internal/domain/bpjs-entities/monitoring/dto.go b/internal/domain/bpjs-entities/monitoring/dto.go new file mode 100644 index 00000000..c5c1e0d1 --- /dev/null +++ b/internal/domain/bpjs-entities/monitoring/dto.go @@ -0,0 +1,15 @@ +package monitoring + +type ReadListDto struct { + ReferenceType ReferenceType `json:"-"` + PathValue1 string `json:"-"` + PathValue2 string `json:"-"` + PathValue3 string `json:"-"` +} + +type ReferenceType string + +const ( + RTVisit ReferenceType = "visit" + RTHist ReferenceType = "hist" +) diff --git a/internal/domain/bpjs-entities/monitoring/entity.go b/internal/domain/bpjs-entities/monitoring/entity.go new file mode 100644 index 00000000..eb604942 --- /dev/null +++ b/internal/domain/bpjs-entities/monitoring/entity.go @@ -0,0 +1,43 @@ +package monitoring + +type Response struct { + MetaData MetaData `json:"metaData"` + Response *BPJSDataRes `json:"response"` +} + +type MetaData struct { + Code string `json:"code"` + Message string `json:"message"` +} + +type BPJSDataRes struct { + Sep []Sep `json:"sep"` + Histori []Histori `json:"histori"` +} + +type Sep struct { + Diagnosa string `json:"diagnosa"` + JnsPelayanan string `json:"jnsPelayanan"` + KelasRawat string `json:"kelasRawat"` + Nama string `json:"nama"` + NoKartu string `json:"noKartu"` + NoSep string `json:"noSep"` + NoRujukan string `json:"noRujukan"` + Poli *string `json:"poli"` + TglPlgSep string `json:"tglPlgSep"` + TglSep string `json:"tglSep"` +} + +type Histori struct { + Diagnosa string `json:"diagnosa"` + JnsPelayanan string `json:"jnsPelayanan"` + KelasRawat *string `json:"kelasRawat"` + NamaPeserta string `json:"namaPeserta"` + NoKartu string `json:"noKartu"` + NoSep string `json:"noSep"` + NoRujukan string `json:"noRujukan"` + Poli string `json:"poli"` + PpkPelayanan string `json:"ppkPelayanan"` + TglPlgSep string `json:"tglPlgSep"` + TglSep string `json:"tglSep"` +} diff --git a/internal/interface/bpjs-handler/bpjs-handler.go b/internal/interface/bpjs-handler/bpjs-handler.go index b1a2c80a..175bb667 100644 --- a/internal/interface/bpjs-handler/bpjs-handler.go +++ b/internal/interface/bpjs-handler/bpjs-handler.go @@ -5,6 +5,7 @@ import ( /******************** main / transaction ********************/ member "simrs-vx/internal/interface/bpjs-handler/member" + monitoring "simrs-vx/internal/interface/bpjs-handler/monitoring" reference "simrs-vx/internal/interface/bpjs-handler/reference" vclaimsep "simrs-vx/internal/interface/bpjs-handler/vclaim-sep" vclaimsephist "simrs-vx/internal/interface/bpjs-handler/vclaim-sep-hist" @@ -77,6 +78,11 @@ func SetRoutes() http.Handler { "GET /nik/{nik}/{sepDate}": member.GetListByNik, }) + hk.GroupRoutes("/v1/monitoring", r, hk.MapHandlerFunc{ + "GET /visit/{date}/{serviceType}": monitoring.GetListVisit, + "GET /hist/{cardNumber}/{startDate}/{endDate}": monitoring.GetListHist, + }) + /******************** actor ********************/ /******************** sources ********************/ diff --git a/internal/interface/bpjs-handler/monitoring/handler.go b/internal/interface/bpjs-handler/monitoring/handler.go new file mode 100644 index 00000000..cf82a5b9 --- /dev/null +++ b/internal/interface/bpjs-handler/monitoring/handler.go @@ -0,0 +1,50 @@ +package monitoring + +import ( + "net/http" + + e "simrs-vx/internal/domain/bpjs-entities/monitoring" + u "simrs-vx/internal/use-case/bpjs-use-case/monitoring" + + d "github.com/karincake/dodol" + rw "github.com/karincake/risoles" +) + +func GetListVisit(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue1 := rw.ValidateString(w, "date", r.PathValue("date")) + if pValue1 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "date is required"}, nil) + } + pValue2 := rw.ValidateString(w, "serviceType", r.PathValue("serviceType")) + if pValue2 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "serviceType is required"}, nil) + } + dto.ReferenceType = e.RTVisit + dto.PathValue1 = pValue1 + dto.PathValue2 = pValue2 + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} + +func GetListHist(w http.ResponseWriter, r *http.Request) { + dto := e.ReadListDto{} + pValue1 := rw.ValidateString(w, "cardNumber", r.PathValue("cardNumber")) + if pValue1 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "cardNumber is required"}, nil) + } + pValue2 := rw.ValidateString(w, "startDate", r.PathValue("startDate")) + if pValue2 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "startDate is required"}, nil) + } + pValue3 := rw.ValidateString(w, "endDate", r.PathValue("endDate")) + if pValue3 == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "endDate is required"}, nil) + } + dto.ReferenceType = e.RTHist + dto.PathValue1 = pValue1 + dto.PathValue2 = pValue2 + dto.PathValue3 = pValue3 + res, err := u.ReadList(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/bpjs-plugin/monitoring/helper.go b/internal/use-case/bpjs-plugin/monitoring/helper.go new file mode 100644 index 00000000..8f6d2c88 --- /dev/null +++ b/internal/use-case/bpjs-plugin/monitoring/helper.go @@ -0,0 +1,18 @@ +package monitoring + +import ( + "fmt" + e "simrs-vx/internal/domain/bpjs-entities/monitoring" + ibpjs "simrs-vx/internal/infra/bpjs" +) + +func endpointMapper(input *e.ReadListDto) string { + switch input.ReferenceType { + case e.RTHist: + return fmt.Sprintf("%smonitoring/history/%s?tglawal=%s&tglakhir=%s", ibpjs.O.BaseUrl, input.PathValue1, input.PathValue2, input.PathValue3) + case e.RTVisit: + return fmt.Sprintf("%smonitoring/kunjungan?tglpelayanan=%s&jnspelayanan=%s", ibpjs.O.BaseUrl, input.PathValue1, input.PathValue2) + default: + return "" + } +} diff --git a/internal/use-case/bpjs-plugin/monitoring/plugin.go b/internal/use-case/bpjs-plugin/monitoring/plugin.go new file mode 100644 index 00000000..2450e4e9 --- /dev/null +++ b/internal/use-case/bpjs-plugin/monitoring/plugin.go @@ -0,0 +1,37 @@ +package monitoring + +import ( + "encoding/json" + "fmt" + "io" + "net/http" + e "simrs-vx/internal/domain/bpjs-entities/monitoring" + + "gorm.io/gorm" +) + +func ReadList(input *e.ReadListDto, data *e.Response, tx *gorm.DB) error { + endpoint := endpointMapper(input) + req, err := http.NewRequest("GET", endpoint, nil) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + if err := json.Unmarshal(body, &data); err != nil { + return fmt.Errorf("failed to parse response JSON: %w", err) + } + + return nil +} diff --git a/internal/use-case/bpjs-use-case/monitoring/case.go b/internal/use-case/bpjs-use-case/monitoring/case.go new file mode 100644 index 00000000..43109cca --- /dev/null +++ b/internal/use-case/bpjs-use-case/monitoring/case.go @@ -0,0 +1,50 @@ +package monitoring + +import ( + e "simrs-vx/internal/domain/bpjs-entities/monitoring" + + dg "github.com/karincake/apem/db-gorm-pg" + + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +const source = "monitoring" + +func ReadList(input e.ReadListDto) (*e.Response, error) { + var data e.Response + var err error + + event := pl.Event{ + Feature: "ReadList", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "readList") + + err = dg.I.Transaction(func(tx *gorm.DB) error { + mwRunner := newMiddlewareRunner(&event, tx) + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunReadListMiddleware(readListPreMw, &input, &data); err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPost) + // Run post-middleware + if err := mwRunner.RunReadListMiddleware(readListPostMw, &input, &data); err != nil { + return err + } + + return nil + }) + + if err != nil { + return nil, err + } + + return &data, nil +} diff --git a/internal/use-case/bpjs-use-case/monitoring/middleware-runner.go b/internal/use-case/bpjs-use-case/monitoring/middleware-runner.go new file mode 100644 index 00000000..49bc5efe --- /dev/null +++ b/internal/use-case/bpjs-use-case/monitoring/middleware-runner.go @@ -0,0 +1,42 @@ +package monitoring + +import ( + e "simrs-vx/internal/domain/bpjs-entities/monitoring" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" +) + +type middlewareRunner struct { + Event *pl.Event + Tx *gorm.DB + MwType pu.MWType +} + +// NewMiddlewareExecutor creates a new middleware executor +func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner { + return &middlewareRunner{ + Event: event, + Tx: tx, + } +} + +func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Response) error { + for _, middleware := range middlewares { + logData := pu.GetLogData(input, data) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input, data, me.Tx); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} + +func (me *middlewareRunner) setMwType(mwType pu.MWType) { + me.MwType = mwType +} diff --git a/internal/use-case/bpjs-use-case/monitoring/middleware.go b/internal/use-case/bpjs-use-case/monitoring/middleware.go new file mode 100644 index 00000000..d5e77655 --- /dev/null +++ b/internal/use-case/bpjs-use-case/monitoring/middleware.go @@ -0,0 +1,12 @@ +package monitoring + +import ( + pm "simrs-vx/internal/use-case/bpjs-plugin/monitoring" +) + +func init() { + readListPreMw = append(readListPreMw, + readListMw{Name: "readList-monitoring", Func: pm.ReadList}, + ) + +} diff --git a/internal/use-case/bpjs-use-case/monitoring/tycovar.go b/internal/use-case/bpjs-use-case/monitoring/tycovar.go new file mode 100644 index 00000000..463109c7 --- /dev/null +++ b/internal/use-case/bpjs-use-case/monitoring/tycovar.go @@ -0,0 +1,18 @@ +/* +member is peserta +*/ +package monitoring + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/bpjs-entities/monitoring" +) + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.Response, tx *gorm.DB) error +} + +var readListPreMw []readListMw // .. +var readListPostMw []readListMw // .. From d4806d90fbc8d688eab9d1453304f56bd2f0fc3b Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 16 Oct 2025 12:16:51 +0700 Subject: [PATCH 181/190] feat (encounter): add flow to insert adm employee --- internal/domain/main-entities/encounter/dto.go | 6 +++++- internal/interface/main-handler/encounter/handler.go | 9 +++++++++ internal/interface/main-handler/main-handler.go | 2 +- internal/use-case/main-use-case/encounter/case.go | 8 ++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 7062d92a..269dccbe 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -15,6 +15,8 @@ import ( erc "simrs-vx/internal/domain/references/common" ere "simrs-vx/internal/domain/references/encounter" + + pa "simrs-vx/pkg/auth-helper" ) type CreateDto struct { @@ -33,10 +35,12 @@ type CreateDto struct { Ref_Number *string `json:"ref_number" validate:"maxLength=20"` Trx_Number *string `json:"trx_number" validate:"maxLength=20"` Appointment_Doctor_Id *uint `json:"appointment_doctor_id"` - Adm_Employee_Id *uint `json:"adm_employee_id"` + Adm_Employee_Id *uint `json:"-"` Responsible_Doctor_Id *uint `json:"responsible_doctor_id"` RefSource_Name *string `json:"refSource_name" validate:"maxLength=100"` Appointment_Id *uint `json:"appointment_id"` + + pa.AuthInfo } type ReadListDto struct { diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index 7484b302..41414394 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -10,6 +10,10 @@ import ( e "simrs-vx/internal/domain/main-entities/encounter" u "simrs-vx/internal/use-case/main-use-case/encounter" + + pa "simrs-vx/pkg/auth-helper" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -17,10 +21,15 @@ type myBase struct{} var O myBase func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + authInfo, err := pa.GetAuthInfo(r) + if err != nil { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) + } dto := e.CreateDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } + dto.AuthInfo = *authInfo res, err := u.Create(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 7af27137..d3951e7b 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -162,7 +162,7 @@ func SetRoutes() http.Handler { "DELETE /{id}": mcuordersubitem.O.Delete, "PATCH /{id}/complete": mcuordersubitem.O.Complete, }) - hk.GroupRoutes("/v1/encounter", r, hk.MapHandlerFunc{ + hk.GroupRoutes("/v1/encounter", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": encounter.O.GetList, "GET /{id}": encounter.O.GetDetail, "POST /": encounter.O.Create, diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 7d209041..2e89d83d 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -7,12 +7,14 @@ import ( ea "simrs-vx/internal/domain/main-entities/ambulatory" ec "simrs-vx/internal/domain/main-entities/chemo" ee "simrs-vx/internal/domain/main-entities/emergency" + eem "simrs-vx/internal/domain/main-entities/employee" e "simrs-vx/internal/domain/main-entities/encounter" ei "simrs-vx/internal/domain/main-entities/inpatient" ua "simrs-vx/internal/use-case/main-use-case/ambulatory" uc "simrs-vx/internal/use-case/main-use-case/chemo" ue "simrs-vx/internal/use-case/main-use-case/emergency" + uem "simrs-vx/internal/use-case/main-use-case/employee" ui "simrs-vx/internal/use-case/main-use-case/inpatient" erc "simrs-vx/internal/domain/references/common" @@ -48,6 +50,12 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if emp, err := uem.ReadDetailData(eem.ReadDetailDto{User_Id: &input.AuthInfo.User_Id}, &event, tx); err != nil { + return err + } else { + input.Adm_Employee_Id = &emp.Id + } + if resData, err := CreateData(input, &event, tx); err != nil { return err } else { From e663fa0451bec53c3366be01110d43d812fead54 Mon Sep 17 00:00:00 2001 From: vanilia Date: Thu, 16 Oct 2025 13:31:51 +0700 Subject: [PATCH 182/190] add entity for vehicle, vehicle-hist, ambulancetransportreq --- .../migrations/20251016062912.sql | 54 +++++++++++++++++++ cmd/main-migration/migrations/atlas.sum | 7 +-- .../ambulance-transport-req/entity.go | 45 ++++++++++++++++ .../main-entities/vehicle-hist/entity.go | 17 ++++++ .../domain/main-entities/vehicle/entity.go | 15 ++++++ .../domain/references/clinical/clinical.go | 12 +++++ internal/domain/references/common/common.go | 5 ++ .../domain/references/encounter/encounter.go | 32 ++++++----- internal/interface/migration/main-entities.go | 6 +++ 9 files changed, 178 insertions(+), 15 deletions(-) create mode 100644 cmd/main-migration/migrations/20251016062912.sql create mode 100644 internal/domain/main-entities/ambulance-transport-req/entity.go create mode 100644 internal/domain/main-entities/vehicle-hist/entity.go create mode 100644 internal/domain/main-entities/vehicle/entity.go diff --git a/cmd/main-migration/migrations/20251016062912.sql b/cmd/main-migration/migrations/20251016062912.sql new file mode 100644 index 00000000..b9208471 --- /dev/null +++ b/cmd/main-migration/migrations/20251016062912.sql @@ -0,0 +1,54 @@ +-- Create "AmbulanceTransportReq" table +CREATE TABLE "public"."AmbulanceTransportReq" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Patient_Id" bigint NULL, + "Diagnoses" character varying(1024) NULL, + "RequestData" timestamptz NULL, + "UsageDate" timestamptz NULL, + "Address" character varying(100) NULL, + "RtRw" character varying(10) NULL, + "Province_Code" character varying(2) NULL, + "Regency_Code" character varying(4) NULL, + "District_Code" character varying(6) NULL, + "Village_Code" character varying(10) NULL, + "Facility_Code" character varying(10) NULL, + "Needs_Code" character varying(10) NULL, + "Contact_Name" character varying(100) NULL, + "Contact_Relationship_Code" character varying(10) NULL, + "Contact_PhoneNumber" character varying(20) NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_AmbulanceTransportReq_District" FOREIGN KEY ("District_Code") REFERENCES "public"."District" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_AmbulanceTransportReq_Patient" FOREIGN KEY ("Patient_Id") REFERENCES "public"."Patient" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_AmbulanceTransportReq_Province" FOREIGN KEY ("Province_Code") REFERENCES "public"."Province" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_AmbulanceTransportReq_Regency" FOREIGN KEY ("Regency_Code") REFERENCES "public"."Regency" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_AmbulanceTransportReq_Village" FOREIGN KEY ("Village_Code") REFERENCES "public"."Village" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "Vehicle" table +CREATE TABLE "public"."Vehicle" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Type_Code" text NULL, + "PoliceNumber" text NULL, + "FrameNumber" text NULL, + "RegNumber" text NULL, + "AvailableStatus" boolean NULL, + PRIMARY KEY ("Id") +); +-- Create "VehicleHist" table +CREATE TABLE "public"."VehicleHist" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Vehicle_Id" bigint NULL, + "Date" timestamptz NULL, + "Data" text NULL, + "Crud_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_VehicleHist_Vehicle" FOREIGN KEY ("Vehicle_Id") REFERENCES "public"."Vehicle" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 05c66cea..bb5cb4b0 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:qfP77w9XYWpAFDON1lo+vpqIYCSiPkVEyHXcYFC52Hk= +h1:5BOKtrJDl7mHDO/coJzV0ot0hVU9OVg5eP5Wg+zsIGo= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -44,5 +44,6 @@ h1:qfP77w9XYWpAFDON1lo+vpqIYCSiPkVEyHXcYFC52Hk= 20251014063537.sql h1:VZLXol0PTsTW21Epg6vBPsztWkDtcxup9F/z88EGgIg= 20251014063720.sql h1:2HVUyCV0ud3BJJDH2GEKZN/+IWLFPCsN1KqhP6csO14= 20251015045455.sql h1:MeLWmMhAOAz8b15Dd7IAQnt6JxjSml02XCXK22C0Lpg= -20251016010845.sql h1:MSUh26glEDyZ5BFiteYOm9mUCWw7aG9vv5TxYY+EidU= -20251016011023.sql h1:8oUBzIpzAYTo03yex+wLKacv32YjXmn4MsXtBFiQtzY= +20251016010845.sql h1:4BncQdDOasRZJkzVJrSJJA7091A9VPNVx/faUCUPhBM= +20251016011023.sql h1:9JB9eFZKURK5RoCVDKR6glSvdJ8NTXrN7K/4q51zkz4= +20251016062912.sql h1:v21euwdu/4JCN3E2LFO4Iav4d7FEiAVH0dyEltmIeMw= diff --git a/internal/domain/main-entities/ambulance-transport-req/entity.go b/internal/domain/main-entities/ambulance-transport-req/entity.go new file mode 100644 index 00000000..4392c4f6 --- /dev/null +++ b/internal/domain/main-entities/ambulance-transport-req/entity.go @@ -0,0 +1,45 @@ +package ambulance_transport_req + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + eds "simrs-vx/internal/domain/main-entities/district" + ept "simrs-vx/internal/domain/main-entities/patient" + epr "simrs-vx/internal/domain/main-entities/province" + erg "simrs-vx/internal/domain/main-entities/regency" + evl "simrs-vx/internal/domain/main-entities/village" + "time" + + eren "simrs-vx/internal/domain/references/encounter" + erp "simrs-vx/internal/domain/references/person" +) + +type AmbulanceTransportReq struct { + ecore.Main + Patient_Id *uint `json:"patient_id"` + Patient *ept.Patient `json:"patient,omitempty" gorm:"foreignKey:Patient_Id;references:Id"` + + Diagnoses *string `json:"diagnoses" gorm:"size:1024"` + RequestData *time.Time `json:"requestData"` + UsageDate *time.Time `json:"usageDate"` + + Address *string `json:"address" gorm:"size:100"` + RtRw *string `json:"rtRw" gorm:"size:10"` + + Province_Code *string `json:"province_code" gorm:"size:2"` + Province *epr.Province `json:"province,omitempty" gorm:"foreignKey:Province_Code;references:Code"` + + Regency_Code *string `json:"regency_code" gorm:"size:4"` + Regency *erg.Regency `json:"regency,omitempty" gorm:"foreignKey:Regency_Code;references:Code"` + + District_Code *string `json:"district_code" gorm:"size:6"` + District *eds.District `json:"district,omitempty" gorm:"foreignKey:District_Code;references:Code"` + + Village_Code *string `json:"village_code" gorm:"size:10"` + Village *evl.Village `json:"village,omitempty" gorm:"foreignKey:Village_Code;references:Code"` + + Facility_Code *eren.AmbulanceFacilityCode `json:"facility_code" gorm:"size:10"` + Needs_Code *eren.AmbulanceNeedsCode `json:"needs_code" gorm:"size:10"` + Contact_Name *string `json:"contact_name" gorm:"size:100"` + Contact_Relationship_Code *erp.RelationshipCode `json:"contact_relationship_code" gorm:"size:10"` + Contact_PhoneNumber *string `json:"contact_phoneNumber" gorm:"size:20"` +} diff --git a/internal/domain/main-entities/vehicle-hist/entity.go b/internal/domain/main-entities/vehicle-hist/entity.go new file mode 100644 index 00000000..0d91267d --- /dev/null +++ b/internal/domain/main-entities/vehicle-hist/entity.go @@ -0,0 +1,17 @@ +package vehicle_hist + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ev "simrs-vx/internal/domain/main-entities/vehicle" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type VehicleHist struct { + ecore.Main // adjust this according to the needs + Vehicle_Id *uint `json:"vehicle_id"` + Vehicle *ev.Vehicle `json:"vehicle,omitempty" gorm:"foreignKey:Vehicle_Id;references:Id"` + Date *time.Time `json:"date"` + Data *string `json:"data"` + Crud_Code *erc.CrudCode `json:"crud_code"` +} diff --git a/internal/domain/main-entities/vehicle/entity.go b/internal/domain/main-entities/vehicle/entity.go new file mode 100644 index 00000000..89661781 --- /dev/null +++ b/internal/domain/main-entities/vehicle/entity.go @@ -0,0 +1,15 @@ +package vehicle + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ercl "simrs-vx/internal/domain/references/clinical" +) + +type Vehicle struct { + ecore.Main // adjust this according to the needs + Type_Code *ercl.VehicleTypeCode `json:"type_code"` + PoliceNumber *string `json:"policeNumber"` + FrameNumber *string `json:"frameNumber"` + RegNumber *string `json:"regNumber"` + AvailableStatus bool `json:"availableStatus"` +} diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index 5a9fc280..47872aa5 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -10,6 +10,8 @@ type ( HeadToToeCode string McuUrgencyLevelCode string SoapiTypeCode string + MedicalAction string + VehicleTypeCode string ) const ( @@ -101,6 +103,16 @@ const ( STCEarlyRehab SoapiTypeCode = "early-rehab" // Kajian Awal Rehab Medik STCFunc SoapiTypeCode = "function" // Assessment Fungsi STCProgress SoapiTypeCode = "progress" // CPPT + + MAChemo MedicalAction = "chemo" + MAHemo MedicalAction = "hemo" + MAThalasemia MedicalAction = "thalasemia" + MAEchocardio MedicalAction = "echocardio" + MASpirometry MedicalAction = "spirometry" + + VTCAmbulance VehicleTypeCode = "ambulance" // Ambulans + VTCTransport VehicleTypeCode = "transport" // Transport + VTCHearse VehicleTypeCode = "hearse" // Jenazah ) type Soapi struct { diff --git a/internal/domain/references/common/common.go b/internal/domain/references/common/common.go index 2970e2a8..9e532b14 100644 --- a/internal/domain/references/common/common.go +++ b/internal/domain/references/common/common.go @@ -14,6 +14,7 @@ type ( PaymentMethodCode string DataAvailabilityCode string DataVerifiedCode string + CrudCode string ) const ( @@ -91,6 +92,10 @@ const ( PMCInsurance PaymentMethodCode = "insurance" // Asuransi PMCMembership PaymentMethodCode = "membership" // Member + CCCreate CrudCode = "c" // Create + CCRead CrudCode = "r" // Read + CCUpdate CrudCode = "u" // Update + CCDelete CrudCode = "d" // Delete ) func GetDayCodes() map[DayCode]string { diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 93c49a33..5b9515ec 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -1,18 +1,20 @@ package encounter type ( - EncounterClassCode string - QueueStatusCode string - DischargeMethodCode string - TransportationCode string - PersonConditionCode string - EmergencyClassCode string - OutpatientClassCode string - CheckupScopeCode string - AmbulatoryClassCode string - InpatientClassCode string - UploadCode string - ChemoClassCode string + EncounterClassCode string + QueueStatusCode string + DischargeMethodCode string + TransportationCode string + PersonConditionCode string + EmergencyClassCode string + OutpatientClassCode string + CheckupScopeCode string + AmbulatoryClassCode string + InpatientClassCode string + UploadCode string + ChemoClassCode string + AmbulanceFacilityCode string + AmbulanceNeedsCode string ) const ( @@ -82,6 +84,12 @@ const ( CCCAdm ChemoClassCode = "adm" // Administrasi CCCAct ChemoClassCode = "act" // Tindakan + + AFCStd AmbulanceFacilityCode = "std" // Standar + AFCIcu AmbulanceFacilityCode = "icu" // ICU + + ANCAssist AmbulanceNeedsCode = "assist" // Dengan Pendampingan + ANCNonassist AmbulanceNeedsCode = "non-assist" // Tanpa Pendampingan ) func (ec EncounterClassCode) Code() string { diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index ea8ec1c0..ae155e9c 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -2,6 +2,7 @@ package migration import ( adime "simrs-vx/internal/domain/main-entities/adime" + ambulancetransportreq "simrs-vx/internal/domain/main-entities/ambulance-transport-req" ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" appointment "simrs-vx/internal/domain/main-entities/appointment" chemo "simrs-vx/internal/domain/main-entities/chemo" @@ -75,6 +76,8 @@ import ( unit "simrs-vx/internal/domain/main-entities/unit" uom "simrs-vx/internal/domain/main-entities/uom" user "simrs-vx/internal/domain/main-entities/user" + vehicle "simrs-vx/internal/domain/main-entities/vehicle" + vehiclehist "simrs-vx/internal/domain/main-entities/vehicle-hist" village "simrs-vx/internal/domain/main-entities/village" ///BPJS @@ -163,5 +166,8 @@ func getMainEntities() []any { &internalreference.InternalReference{}, &vclaimsephist.VclaimSepHist{}, &vclaimsepprint.VclaimSepPrint{}, + &vehicle.Vehicle{}, + &vehiclehist.VehicleHist{}, + &ambulancetransportreq.AmbulanceTransportReq{}, } } From 319da694afa164d74b480e8ed263e203ed4c15f2 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 17 Oct 2025 13:04:43 +0700 Subject: [PATCH 183/190] feat (patient): add search by identifier and nik only --- internal/domain/main-entities/patient/dto.go | 3 +- .../domain/main-entities/patient/tycovar.go | 8 +++++ .../interface/main-handler/main-handler.go | 15 +++++----- .../interface/main-handler/patient/handler.go | 15 ++++++++++ .../use-case/main-use-case/patient/lib.go | 30 +++++++++++++------ 5 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 internal/domain/main-entities/patient/tycovar.go diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index 1374eb97..00134b6e 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -57,7 +57,8 @@ type DeleteDto struct { } type SearchDto struct { - Search string `json:"search"` + Search string `json:"search"` + Mode SearchMode `json:"mode"` } type UploadDto struct { diff --git a/internal/domain/main-entities/patient/tycovar.go b/internal/domain/main-entities/patient/tycovar.go new file mode 100644 index 00000000..aa419b57 --- /dev/null +++ b/internal/domain/main-entities/patient/tycovar.go @@ -0,0 +1,8 @@ +package patient + +type SearchMode string + +const ( + SMNik SearchMode = "resident-identity" + SMIdent SearchMode = "identifier" +) diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 3a7f0374..bc4b0fa0 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -260,13 +260,14 @@ func SetRoutes() http.Handler { "PATCH /{id}/active": user.O.Active, }) hk.GroupRoutes("/v1/patient", r, hk.MapHandlerFunc{ - "GET /": patient.O.GetList, - "GET /{id}": patient.O.GetDetail, - "POST /": patient.O.Create, - "PATCH /{id}": patient.O.Update, - "DELETE /{id}": patient.O.Delete, - "GET /by-identifier": patient.O.Search, - "POST /{id}/upload": patient.O.Upload, + "GET /": patient.O.GetList, + "GET /{id}": patient.O.GetDetail, + "POST /": patient.O.Create, + "PATCH /{id}": patient.O.Update, + "DELETE /{id}": patient.O.Delete, + "GET /search/{keyword}": patient.O.Search, + "GET /by-resident-identity": patient.O.SearchByResidentIdentity, + "POST /{id}/upload": patient.O.Upload, }) /******************** sources ********************/ diff --git a/internal/interface/main-handler/patient/handler.go b/internal/interface/main-handler/patient/handler.go index 1bcdacee..2c5fcb5b 100644 --- a/internal/interface/main-handler/patient/handler.go +++ b/internal/interface/main-handler/patient/handler.go @@ -12,6 +12,8 @@ import ( u "simrs-vx/internal/use-case/main-use-case/patient" ere "simrs-vx/internal/domain/references/encounter" + + d "github.com/karincake/dodol" ) type myBase struct{} @@ -73,8 +75,21 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { } func (obj myBase) Search(w http.ResponseWriter, r *http.Request) { + dto := e.SearchDto{} + keyword := rw.ValidateString(w, "keyword", r.PathValue("keyword")) + if keyword == "" { + rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": "keyword is required"}, nil) + } + dto.Mode = e.SMIdent + dto.Search = keyword + res, err := u.Search(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) SearchByResidentIdentity(w http.ResponseWriter, r *http.Request) { dto := e.SearchDto{} sf.UrlQueryParam(&dto, *r.URL) + dto.Mode = e.SMNik res, err := u.Search(dto) rw.DataResponse(w, res, err) } diff --git a/internal/use-case/main-use-case/patient/lib.go b/internal/use-case/main-use-case/patient/lib.go index e126ec0d..f35e3853 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -91,7 +91,8 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e Preload("Person.Contacts"). Preload("Person.Relatives.Village.District.Regency.Province"). Preload("Person.Addresses.Village.District.Regency.Province"). - Preload("Person.Addresses.PostalRegion.Village.District.Regency.Province") + Preload("Person.Addresses.PostalRegion.Village.District.Regency.Province"). + Preload("Person.Insurances.InsuranceCompany") if err := tx.First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { @@ -157,6 +158,7 @@ func SearchData(input e.SearchDto, event *pl.Event, dbx ...*gorm.DB) (*e.Patient pl.SetLogInfo(event, input, "started", "DBSearch") var patient e.Patient + var err error var tx *gorm.DB if len(dbx) > 0 { @@ -167,15 +169,25 @@ func SearchData(input e.SearchDto, event *pl.Event, dbx ...*gorm.DB) (*e.Patient // Preload associations for complete data tx = tx.Preload(clause.Associations) - tx = tx.Preload("Person.Addresses") - tx = tx.Preload("Person.Contacts") - tx = tx.Preload("Person.Relatives") + tx = tx.Preload("Person.Addresses"). + Preload("Person.Contacts"). + Preload("Person.Relatives"). + Preload("Person.Insurances") - // Search by patient number OR person's resident identity number (exact match) - err := tx.Joins("JOIN \"Person\" ON \"Patient\".\"Person_Id\" = \"Person\".\"Id\""). - Where("\"Patient\".\"Number\" = ? OR \"Person\".\"ResidentIdentityNumber\" = ?", - input.Search, input.Search). - First(&patient).Error + switch input.Mode { + case e.SMIdent: + // Search by patient number OR person's resident identity number (exact match) OR person's name (partial match) + err = tx.Joins("JOIN \"Person\" ON \"Patient\".\"Person_Id\" = \"Person\".\"Id\""). + Where("\"Patient\".\"Number\" = ? OR \"Person\".\"ResidentIdentityNumber\" = ? OR \"Person\".\"Name\" ILIKE ?", + input.Search, input.Search, "%"+input.Search+"%"). + First(&patient).Error + case e.SMNik: + // Search by patient person's resident identity number (exact match) + err = tx.Joins("JOIN \"Person\" ON \"Patient\".\"Person_Id\" = \"Person\".\"Id\""). + Where("\"Person\".\"ResidentIdentityNumber\" = ?", + input.Search). + First(&patient).Error + } if err != nil { if processedErr := pu.HandleSearchError(err, event, source, input.Search, patient); processedErr != nil { From 0ff8c571d0243fe415d7936507dc9b9f8cfedf5c Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 17 Oct 2025 13:06:49 +0700 Subject: [PATCH 184/190] add type_code into medicalactionsrc --- cmd/main-migration/migrations/20251017060617.sql | 2 ++ cmd/main-migration/migrations/atlas.sum | 5 +++-- internal/domain/main-entities/medical-action-src/entity.go | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 cmd/main-migration/migrations/20251017060617.sql diff --git a/cmd/main-migration/migrations/20251017060617.sql b/cmd/main-migration/migrations/20251017060617.sql new file mode 100644 index 00000000..8e3acbd2 --- /dev/null +++ b/cmd/main-migration/migrations/20251017060617.sql @@ -0,0 +1,2 @@ +-- Modify "MedicalActionSrc" table +ALTER TABLE "public"."MedicalActionSrc" ADD COLUMN "Type_Code" character varying(20) NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index bb5cb4b0..1f920b2d 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:5BOKtrJDl7mHDO/coJzV0ot0hVU9OVg5eP5Wg+zsIGo= +h1:sU0SrZhFKtCYoF46RbBCtQHOoDtvLJtLcIfBvmeawkg= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -46,4 +46,5 @@ h1:5BOKtrJDl7mHDO/coJzV0ot0hVU9OVg5eP5Wg+zsIGo= 20251015045455.sql h1:MeLWmMhAOAz8b15Dd7IAQnt6JxjSml02XCXK22C0Lpg= 20251016010845.sql h1:4BncQdDOasRZJkzVJrSJJA7091A9VPNVx/faUCUPhBM= 20251016011023.sql h1:9JB9eFZKURK5RoCVDKR6glSvdJ8NTXrN7K/4q51zkz4= -20251016062912.sql h1:v21euwdu/4JCN3E2LFO4Iav4d7FEiAVH0dyEltmIeMw= +20251016062912.sql h1:ACNn0fe+EMqUt3hoY+Dr3uqAV/QICBa1+mIW7fUc9Fk= +20251017060617.sql h1:KzIbA9fYORIK9aGWMMf0te5/8oThYFCCCSQVktGO0K0= diff --git a/internal/domain/main-entities/medical-action-src/entity.go b/internal/domain/main-entities/medical-action-src/entity.go index fbbbdb28..60f15816 100644 --- a/internal/domain/main-entities/medical-action-src/entity.go +++ b/internal/domain/main-entities/medical-action-src/entity.go @@ -9,6 +9,7 @@ type MedicalActionSrc struct { ecore.Main // adjust this according to the needs Code string `json:"code" gorm:"unique;size:20"` Name string `json:"name" gorm:"size:50"` + Type_Code string `json:"type_code" gorm:"size:20"` Item_Id *uint `json:"item_id"` Item *ei.Item `json:"item,omitempty" gorm:"foreignKey:Item_Id;references:Id"` } From 9ead9b7e763776bead8e1a03777cc6d43e036339 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 17 Oct 2025 13:08:58 +0700 Subject: [PATCH 185/190] feat (medical-action-src): add type code --- .../main-entities/medical-action-src/dto.go | 34 +++++++++++-------- .../medical-action-src/helper.go | 1 + 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index c67a2429..a4796a75 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -6,9 +6,10 @@ import ( ) type CreateDto struct { - Code string `json:"code" validate:"maxLength=20"` - Name string `json:"name" validate:"maxLength=50"` - Item_Id *uint `json:"item_id"` + Code string `json:"code" validate:"maxLength=20"` + Name string `json:"name" validate:"maxLength=50"` + Type_Code string `json:"type_code" validate:"maxLength:20"` + Item_Id *uint `json:"item_id"` } type ReadListDto struct { @@ -19,10 +20,11 @@ type ReadListDto struct { } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` - Item_Id *uint `json:"item-id"` - Search string `json:"search" gormhelper:"searchColumns=Code,Name"` + Code string `json:"code"` + Name string `json:"name"` + Type_Code string `json:"type_code"` + Item_Id *uint `json:"item-id"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { @@ -47,18 +49,20 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Code string `json:"code"` - Name string `json:"name"` - Item_Id *uint `json:"item_id"` - Item *ei.Item `json:"item,omitempty"` + Code string `json:"code"` + Name string `json:"name"` + Type_Code string `json:"type_code"` + Item_Id *uint `json:"item_id"` + Item *ei.Item `json:"item,omitempty"` } func (d MedicalActionSrc) ToResponse() ResponseDto { resp := ResponseDto{ - Code: d.Code, - Name: d.Name, - Item_Id: d.Item_Id, - Item: d.Item, + Code: d.Code, + Name: d.Name, + Type_Code: d.Type_Code, + Item_Id: d.Item_Id, + Item: d.Item, } resp.Main = d.Main return resp diff --git a/internal/use-case/main-use-case/medical-action-src/helper.go b/internal/use-case/main-use-case/medical-action-src/helper.go index 22c0d26d..3e54a3eb 100644 --- a/internal/use-case/main-use-case/medical-action-src/helper.go +++ b/internal/use-case/main-use-case/medical-action-src/helper.go @@ -19,5 +19,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicalActionSrc) { data.Code = inputSrc.Code data.Name = inputSrc.Name + data.Type_Code = inputSrc.Type_Code data.Item_Id = inputSrc.Item_Id } From 063c511777db36a2aa4fdd5d29bed7bb313799d3 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 17 Oct 2025 13:12:34 +0700 Subject: [PATCH 186/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 100 ++++++++++++------------ 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 1f920b2d..de419662 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,50 +1,50 @@ -h1:sU0SrZhFKtCYoF46RbBCtQHOoDtvLJtLcIfBvmeawkg= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= -20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= -20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= -20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= -20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= -20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= -20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= -20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= -20251010072711.sql h1:ZJNqR2piyu8xJhBvVABSlnGEoKSKae3wuEs+wshPe4k= -20251013044536.sql h1:0Xjw8fNILiT8nnfrJDZgQnPf3dntmIoilbapnih8AE4= -20251013051438.sql h1:lfSuw5mgJnePBJamvhZ81osFIouXeiIEiSZ/evdwo48= -20251013081808.sql h1:ijgjNX08G6GBjA/ks8EKtb7P7Y7Cg7zbhqEOruGnv6M= -20251014060047.sql h1:0jqj49WTtneEIMQDBoo4c095ZGi8sCrA8NnHBrPU6D8= -20251014063537.sql h1:VZLXol0PTsTW21Epg6vBPsztWkDtcxup9F/z88EGgIg= -20251014063720.sql h1:2HVUyCV0ud3BJJDH2GEKZN/+IWLFPCsN1KqhP6csO14= -20251015045455.sql h1:MeLWmMhAOAz8b15Dd7IAQnt6JxjSml02XCXK22C0Lpg= -20251016010845.sql h1:4BncQdDOasRZJkzVJrSJJA7091A9VPNVx/faUCUPhBM= -20251016011023.sql h1:9JB9eFZKURK5RoCVDKR6glSvdJ8NTXrN7K/4q51zkz4= -20251016062912.sql h1:ACNn0fe+EMqUt3hoY+Dr3uqAV/QICBa1+mIW7fUc9Fk= -20251017060617.sql h1:KzIbA9fYORIK9aGWMMf0te5/8oThYFCCCSQVktGO0K0= +h1:PWJpriYcc0hEbY3oTjYgrBDS1qxSmoXkz+7K8JPowf8= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= +20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= +20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= +20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= +20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= +20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= +20251010031743.sql h1:SgHNY/lQ88G2F4nZyMfiOkDntb+gtOR+nEQLqXBTwv4= +20251010070721.sql h1:AnJnhXsMzDvK4AFgYw6B16Kpo/hljrZtcpc9m2VOSHQ= +20251010072711.sql h1:aXPTtNwLcTuw8C/yAxwxvqs0ayEjNzI1uuE0vE3ERa8= +20251013044536.sql h1:7Pq6JcvTpPBYDCW2dz3HdgUwY65HlhEVWy9TiG8iONE= +20251013051438.sql h1:X6t8bkqpUYYokBunSufMQUe5vCg0VyO6dxbm7ngosUc= +20251013081808.sql h1:495pLguXL2Ozh+ycn4UYZgZbn6WbjXNbyZUc3JU8qhI= +20251014060047.sql h1:nCgImMRGHhziiW57O1ofWaXCAPGaCOHN7PldQ3OSmM4= +20251014063537.sql h1:2cLmID79jP6cuQ1YJaWTtghFiM1GtHMC0ZQl30Hpy1M= +20251014063720.sql h1:bzLKKVAjSHgDFoiI/glj7t1ETlSAKx+AlsIAaP0ru2g= +20251015045455.sql h1:S547+UugQhlTRcn1Lm1IfqT5RNPttIWIiD+RTx69YaE= +20251016010845.sql h1:c9DUvxl17pUkf0azdYGM/YDzYxIJkLcfZOcMI4rL+R0= +20251016011023.sql h1:u3ivg83bXgYHBbojbWpemLxPE9Dmmj53B6LXo664jxw= +20251016062912.sql h1:W9n1hWchfYkqNX9LO9uxFxEXAb/iY+Pexjnhmp6PbgI= +20251017060617.sql h1:VU6yZ2+LfHpDZ3+TIH40t3F5YXPCpTppuF9+uSqa4b8= From ded271dc6d980b576f0a7612e86bd540e9344395 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 17 Oct 2025 15:19:43 +0700 Subject: [PATCH 187/190] feat (medical-action-src): add create item --- .../main-entities/medical-action-src/dto.go | 2 +- .../references/organization/organization.go | 1 + .../main-use-case/medical-action-src/case.go | 3 +++ .../medical-action-src/helper.go | 25 +++++++++++++++++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/internal/domain/main-entities/medical-action-src/dto.go b/internal/domain/main-entities/medical-action-src/dto.go index a4796a75..32e248d8 100644 --- a/internal/domain/main-entities/medical-action-src/dto.go +++ b/internal/domain/main-entities/medical-action-src/dto.go @@ -8,7 +8,7 @@ import ( type CreateDto struct { Code string `json:"code" validate:"maxLength=20"` Name string `json:"name" validate:"maxLength=50"` - Type_Code string `json:"type_code" validate:"maxLength:20"` + Type_Code string `json:"type_code" validate:"maxLength=20"` Item_Id *uint `json:"item_id"` } diff --git a/internal/domain/references/organization/organization.go b/internal/domain/references/organization/organization.go index bf11fbd6..04c4fa2a 100644 --- a/internal/domain/references/organization/organization.go +++ b/internal/domain/references/organization/organization.go @@ -30,6 +30,7 @@ const ( ITGCMCUSub ItemGroupCode = "mcuSub" ITGCEmpFee ItemGroupCode = "employee-fee" ITGCDocFee ItemGroupCode = "doctor-fee" + ITGCMedAct ItemGroupCode = "medical-action" IFGCBuilding InfraGroupCode = "building" // Bangunan IFGCFloor InfraGroupCode = "floor" // Lantai diff --git a/internal/use-case/main-use-case/medical-action-src/case.go b/internal/use-case/main-use-case/medical-action-src/case.go index d3fb840b..cd42766c 100644 --- a/internal/use-case/main-use-case/medical-action-src/case.go +++ b/internal/use-case/main-use-case/medical-action-src/case.go @@ -34,6 +34,9 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + if err := createItem(&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/medical-action-src/helper.go b/internal/use-case/main-use-case/medical-action-src/helper.go index 3e54a3eb..c955274d 100644 --- a/internal/use-case/main-use-case/medical-action-src/helper.go +++ b/internal/use-case/main-use-case/medical-action-src/helper.go @@ -5,7 +5,17 @@ Any functions that are used internally by the use-case package medicalactionsrc import ( + ei "simrs-vx/internal/domain/main-entities/item" e "simrs-vx/internal/domain/main-entities/medical-action-src" + + ero "simrs-vx/internal/domain/references/organization" + + ui "simrs-vx/internal/use-case/main-use-case/item" + + 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.MedicalActionSrc) { @@ -22,3 +32,18 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.MedicalActionSrc) { data.Type_Code = inputSrc.Type_Code data.Item_Id = inputSrc.Item_Id } + +func createItem(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { + itemCreate := ei.CreateDto{ + Code: pu.AddPrefix("medAct-", input.Code), + Name: input.Name, + ItemGroup_Code: ero.ITGCMedAct, + } + item, err := ui.CreateData(itemCreate, event, tx) + if err != nil { + return err + } + + input.Item_Id = &item.Id + return nil +} From 3bfabc9e4c8ba4b67e070a70fe8035a332465827 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 17 Oct 2025 15:22:24 +0700 Subject: [PATCH 188/190] update size item group code --- .../migrations/20251017082207.sql | 2 + cmd/main-migration/migrations/atlas.sum | 101 +++++++++--------- internal/domain/main-entities/item/entity.go | 2 +- 3 files changed, 54 insertions(+), 51 deletions(-) create mode 100644 cmd/main-migration/migrations/20251017082207.sql diff --git a/cmd/main-migration/migrations/20251017082207.sql b/cmd/main-migration/migrations/20251017082207.sql new file mode 100644 index 00000000..732c8d71 --- /dev/null +++ b/cmd/main-migration/migrations/20251017082207.sql @@ -0,0 +1,2 @@ +-- Modify "Item" table +ALTER TABLE "public"."Item" ALTER COLUMN "ItemGroup_Code" TYPE character varying(15); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index de419662..77732bde 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,50 +1,51 @@ -h1:PWJpriYcc0hEbY3oTjYgrBDS1qxSmoXkz+7K8JPowf8= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= -20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= -20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= -20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= -20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= -20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= -20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= -20251010031743.sql h1:SgHNY/lQ88G2F4nZyMfiOkDntb+gtOR+nEQLqXBTwv4= -20251010070721.sql h1:AnJnhXsMzDvK4AFgYw6B16Kpo/hljrZtcpc9m2VOSHQ= -20251010072711.sql h1:aXPTtNwLcTuw8C/yAxwxvqs0ayEjNzI1uuE0vE3ERa8= -20251013044536.sql h1:7Pq6JcvTpPBYDCW2dz3HdgUwY65HlhEVWy9TiG8iONE= -20251013051438.sql h1:X6t8bkqpUYYokBunSufMQUe5vCg0VyO6dxbm7ngosUc= -20251013081808.sql h1:495pLguXL2Ozh+ycn4UYZgZbn6WbjXNbyZUc3JU8qhI= -20251014060047.sql h1:nCgImMRGHhziiW57O1ofWaXCAPGaCOHN7PldQ3OSmM4= -20251014063537.sql h1:2cLmID79jP6cuQ1YJaWTtghFiM1GtHMC0ZQl30Hpy1M= -20251014063720.sql h1:bzLKKVAjSHgDFoiI/glj7t1ETlSAKx+AlsIAaP0ru2g= -20251015045455.sql h1:S547+UugQhlTRcn1Lm1IfqT5RNPttIWIiD+RTx69YaE= -20251016010845.sql h1:c9DUvxl17pUkf0azdYGM/YDzYxIJkLcfZOcMI4rL+R0= -20251016011023.sql h1:u3ivg83bXgYHBbojbWpemLxPE9Dmmj53B6LXo664jxw= -20251016062912.sql h1:W9n1hWchfYkqNX9LO9uxFxEXAb/iY+Pexjnhmp6PbgI= -20251017060617.sql h1:VU6yZ2+LfHpDZ3+TIH40t3F5YXPCpTppuF9+uSqa4b8= +h1:/NZRnBd4SNPxw+Sv7Fhn/VBxN0wRNU4OldkTUn6GtbI= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= +20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= +20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= +20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= +20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= +20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= +20251010072711.sql h1:ZJNqR2piyu8xJhBvVABSlnGEoKSKae3wuEs+wshPe4k= +20251013044536.sql h1:0Xjw8fNILiT8nnfrJDZgQnPf3dntmIoilbapnih8AE4= +20251013051438.sql h1:lfSuw5mgJnePBJamvhZ81osFIouXeiIEiSZ/evdwo48= +20251013081808.sql h1:ijgjNX08G6GBjA/ks8EKtb7P7Y7Cg7zbhqEOruGnv6M= +20251014060047.sql h1:0jqj49WTtneEIMQDBoo4c095ZGi8sCrA8NnHBrPU6D8= +20251014063537.sql h1:VZLXol0PTsTW21Epg6vBPsztWkDtcxup9F/z88EGgIg= +20251014063720.sql h1:2HVUyCV0ud3BJJDH2GEKZN/+IWLFPCsN1KqhP6csO14= +20251015045455.sql h1:MeLWmMhAOAz8b15Dd7IAQnt6JxjSml02XCXK22C0Lpg= +20251016010845.sql h1:4BncQdDOasRZJkzVJrSJJA7091A9VPNVx/faUCUPhBM= +20251016011023.sql h1:9JB9eFZKURK5RoCVDKR6glSvdJ8NTXrN7K/4q51zkz4= +20251016062912.sql h1:ACNn0fe+EMqUt3hoY+Dr3uqAV/QICBa1+mIW7fUc9Fk= +20251017060617.sql h1:4T3t9ifWrEQTPMSM0XJ98pF7Qdt+UfgtMui17bhrnWI= +20251017082207.sql h1:M3k5WPGt8gxv/4kB71di+78L/FyXrxhgGtXxGedwEps= diff --git a/internal/domain/main-entities/item/entity.go b/internal/domain/main-entities/item/entity.go index 9ac471ad..e0ff4e21 100644 --- a/internal/domain/main-entities/item/entity.go +++ b/internal/domain/main-entities/item/entity.go @@ -11,7 +11,7 @@ type Item struct { ecore.Main // adjust this according to the needs Code string `json:"code" gorm:"unique;size:50"` Name string `json:"name" gorm:"size:100"` - ItemGroup_Code ero.ItemGroupCode `json:"itemGroup_code" gorm:"size:10"` + ItemGroup_Code ero.ItemGroupCode `json:"itemGroup_code" gorm:"size:15"` Uom_Code *string `json:"uom_code" gorm:"size:10"` Uom *eu.Uom `json:"uom,omitempty" gorm:"foreignKey:Uom_Code;references:Code"` Infra_Id *uint16 `json:"infra_id"` From c82ee6a96c26682df623255c36fd6489be6cddbc Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Fri, 17 Oct 2025 15:29:56 +0700 Subject: [PATCH 189/190] migration from server --- cmd/main-migration/migrations/atlas.sum | 102 ++++++++++++------------ 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 77732bde..42636d28 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,51 +1,51 @@ -h1:/NZRnBd4SNPxw+Sv7Fhn/VBxN0wRNU4OldkTUn6GtbI= -20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= -20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= -20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= -20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= -20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= -20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= -20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= -20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= -20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= -20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= -20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= -20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= -20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= -20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= -20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= -20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= -20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= -20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= -20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= -20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= -20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= -20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= -20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= -20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= -20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= -20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= -20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= -20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= -20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= -20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= -20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= -20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= -20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= -20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= -20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= -20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= -20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= -20251010072711.sql h1:ZJNqR2piyu8xJhBvVABSlnGEoKSKae3wuEs+wshPe4k= -20251013044536.sql h1:0Xjw8fNILiT8nnfrJDZgQnPf3dntmIoilbapnih8AE4= -20251013051438.sql h1:lfSuw5mgJnePBJamvhZ81osFIouXeiIEiSZ/evdwo48= -20251013081808.sql h1:ijgjNX08G6GBjA/ks8EKtb7P7Y7Cg7zbhqEOruGnv6M= -20251014060047.sql h1:0jqj49WTtneEIMQDBoo4c095ZGi8sCrA8NnHBrPU6D8= -20251014063537.sql h1:VZLXol0PTsTW21Epg6vBPsztWkDtcxup9F/z88EGgIg= -20251014063720.sql h1:2HVUyCV0ud3BJJDH2GEKZN/+IWLFPCsN1KqhP6csO14= -20251015045455.sql h1:MeLWmMhAOAz8b15Dd7IAQnt6JxjSml02XCXK22C0Lpg= -20251016010845.sql h1:4BncQdDOasRZJkzVJrSJJA7091A9VPNVx/faUCUPhBM= -20251016011023.sql h1:9JB9eFZKURK5RoCVDKR6glSvdJ8NTXrN7K/4q51zkz4= -20251016062912.sql h1:ACNn0fe+EMqUt3hoY+Dr3uqAV/QICBa1+mIW7fUc9Fk= -20251017060617.sql h1:4T3t9ifWrEQTPMSM0XJ98pF7Qdt+UfgtMui17bhrnWI= -20251017082207.sql h1:M3k5WPGt8gxv/4kB71di+78L/FyXrxhgGtXxGedwEps= +h1:8zie3PyS55y+G80bxoc2K/aE8n0tDc8iH3Tc+FUB4o8= +20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= +20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= +20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= +20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= +20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= +20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= +20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= +20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= +20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= +20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= +20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= +20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= +20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= +20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= +20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= +20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= +20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= +20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= +20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= +20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= +20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= +20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= +20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= +20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= +20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= +20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= +20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= +20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= +20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= +20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= +20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= +20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= +20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= +20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= +20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= +20251010031743.sql h1:SgHNY/lQ88G2F4nZyMfiOkDntb+gtOR+nEQLqXBTwv4= +20251010070721.sql h1:AnJnhXsMzDvK4AFgYw6B16Kpo/hljrZtcpc9m2VOSHQ= +20251010072711.sql h1:aXPTtNwLcTuw8C/yAxwxvqs0ayEjNzI1uuE0vE3ERa8= +20251013044536.sql h1:7Pq6JcvTpPBYDCW2dz3HdgUwY65HlhEVWy9TiG8iONE= +20251013051438.sql h1:X6t8bkqpUYYokBunSufMQUe5vCg0VyO6dxbm7ngosUc= +20251013081808.sql h1:495pLguXL2Ozh+ycn4UYZgZbn6WbjXNbyZUc3JU8qhI= +20251014060047.sql h1:nCgImMRGHhziiW57O1ofWaXCAPGaCOHN7PldQ3OSmM4= +20251014063537.sql h1:2cLmID79jP6cuQ1YJaWTtghFiM1GtHMC0ZQl30Hpy1M= +20251014063720.sql h1:bzLKKVAjSHgDFoiI/glj7t1ETlSAKx+AlsIAaP0ru2g= +20251015045455.sql h1:S547+UugQhlTRcn1Lm1IfqT5RNPttIWIiD+RTx69YaE= +20251016010845.sql h1:c9DUvxl17pUkf0azdYGM/YDzYxIJkLcfZOcMI4rL+R0= +20251016011023.sql h1:u3ivg83bXgYHBbojbWpemLxPE9Dmmj53B6LXo664jxw= +20251016062912.sql h1:W9n1hWchfYkqNX9LO9uxFxEXAb/iY+Pexjnhmp6PbgI= +20251017060617.sql h1:VU6yZ2+LfHpDZ3+TIH40t3F5YXPCpTppuF9+uSqa4b8= +20251017082207.sql h1:QshZslfedckz7iDpSGmPyY9sP6dy6ckHbs8L1TuXIA4= From 3d165447f52d8fccbec9f5b15f5528a0e6737524 Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Sun, 19 Oct 2025 07:09:48 +0700 Subject: [PATCH 190/190] migration: + added intern + updated employee + updated user --- .../migrations/20251018032635.sql | 4 + .../migrations/20251018040322.sql | 13 +++ cmd/main-migration/migrations/atlas.sum | 104 +++++++++--------- .../domain/main-entities/employee/entity.go | 20 ++-- internal/domain/main-entities/intern/dto.go | 81 ++++++++++++++ .../domain/main-entities/intern/entity.go | 17 +++ internal/domain/main-entities/user/dto.go | 43 ++++---- internal/domain/main-entities/user/entity.go | 19 ++-- internal/interface/migration/main-entities.go | 2 + 9 files changed, 213 insertions(+), 90 deletions(-) create mode 100644 cmd/main-migration/migrations/20251018032635.sql create mode 100644 cmd/main-migration/migrations/20251018040322.sql create mode 100644 internal/domain/main-entities/intern/dto.go create mode 100644 internal/domain/main-entities/intern/entity.go diff --git a/cmd/main-migration/migrations/20251018032635.sql b/cmd/main-migration/migrations/20251018032635.sql new file mode 100644 index 00000000..d8c5a2c9 --- /dev/null +++ b/cmd/main-migration/migrations/20251018032635.sql @@ -0,0 +1,4 @@ +-- Modify "Employee" table +ALTER TABLE "public"."Employee" ADD COLUMN "Position_Code" character varying(20) NULL; +-- Rename a column from "Position_Code" to "ContractPosition_Code" +ALTER TABLE "public"."User" RENAME COLUMN "Position_Code" TO "ContractPosition_Code"; diff --git a/cmd/main-migration/migrations/20251018040322.sql b/cmd/main-migration/migrations/20251018040322.sql new file mode 100644 index 00000000..d35e9199 --- /dev/null +++ b/cmd/main-migration/migrations/20251018040322.sql @@ -0,0 +1,13 @@ +-- Create "Intern" table +CREATE TABLE "public"."Intern" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Person_Id" bigint NULL, + "Position_Code" character varying(20) NULL, + "User_Id" bigint NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_Intern_Person" FOREIGN KEY ("Person_Id") REFERENCES "public"."Person" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_Intern_User" FOREIGN KEY ("User_Id") REFERENCES "public"."User" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index 42636d28..bf732e89 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,51 +1,53 @@ -h1:8zie3PyS55y+G80bxoc2K/aE8n0tDc8iH3Tc+FUB4o8= -20250904105930.sql h1:Vv4vCurl7m7/ZB6TjRpkubHpQ4RYwSUn0QHdzfoGpzY= -20250904141448.sql h1:FYCHH9Os4KkrZMDu/jR8FMP+wLMRW+Mb0PkLU/9BRDg= -20250908062237.sql h1:oanBpKZd+akPu2I/xYhUSbd0G5tAFbXzKLER/Zs8ENI= -20250908062323.sql h1:miNG9COddXkD1jGTgaROMAZ618eT6oiLGiJhXWnQwhE= -20250908073811.sql h1:gOi5cnGG1htlpfizybYmUIT0vYjZTBfXiI0nPSYK2u8= -20250908073839.sql h1:cWNDA4YikjoOteAJuNLFILjQUJPFB6o8Wxreiek4QyI= -20250910055902.sql h1:nxxOGnU0BbH/v3IPgeIOXOwH8d3tKomw7h6FTeMnnBs= -20250915123412.sql h1:mz7SiWfrdf0qE1VTSAAnA/147d6gyp6ry5vZ2bR9SH0= -20250916043819.sql h1:RHXVtmMkB6wfv06HfPyHMBmUfIpFt1xveafNz0kwKnE= -20250917040616.sql h1:MYVDht+akBlzQGKNu2hTTTLPEcH1bxT/Q8MK6WEtuhs= -20250917040751.sql h1:J79YyS2JzWgh5oKXMTgh67uo3gLxKaAsxRiZmSIfjBs= -20250917045138.sql h1:/SM1N4O8X3yxpoJgMEARmS1uOkuLKsTOy4PLsRCOKaQ= -20250917093645.sql h1:PNBTGZ7s10e5b5+Tie8YfVQBN0zKtJ5T34oK1iOUEb4= -20250918073552.sql h1:jG7+g3i8ODYaJdcdZz12v3nbsZ5mB9wG6kWnGyTQIRI= -20250918073742.sql h1:j+rgw7puxE7s+phqPVZHmPk0af3rcaA56Itp86y1suY= -20250918074745.sql h1:rPmP4DXs6OnY4Vp+xO/z9jFpJt/RrJ52SJJjIIxeDvc= -20250923025134.sql h1:2r6pcwnBSU5Y9Czk1OHBoh4yZXiMtEca9X8843fTEX0= -20250924051317.sql h1:iUAk2gsGoEGIPQ0lEEUp8maMSId8emNbP+kP712ABIA= -20250929034321.sql h1:UlpALNVmdi95zOIT0yc6ZyTj9bBjQEIpZhvgrc52M+k= -20250929034428.sql h1:feF+H4nDyHh5bdx48Oiz0A1qecZfi6v3qTTdjzJ45Dg= -20250930025550.sql h1:6XT1kXI3Z3ZIxxmvT7poufZWWCW0QiejZPaFV5wBnjI= -20250930140351.sql h1:HxnmAbh9gCy8jwl/9ycGktiByaUripsjFFvohofY2CY= -20251002085604.sql h1:SjLPi+ZN6qDccK3DaEQCgNsZpPwr5kynWXwbwEsziCI= -20251003032030.sql h1:oHfxNSuqTxU8Zaf9H+h8TuUb1Da03wcyc6hZjDrUQ2s= -20251005060450.sql h1:GIuCcrd4MwjmXpvbzDzPYL18BV3QaZZ+Y2FmEzjvi0E= -20251006041122.sql h1:uNDQbSw0M08lYoMvUNlQtS3iDzpPM1ixT13ugSAoWjE= -20251006045658.sql h1:z+t7yCK54Q4SSiF9kUyUhkYB2F+kzSW9TB7ogxd9wzw= -20251006045928.sql h1:1lATLFLp4BWwGZqAjZdP0Dc6ypNXiYcwjoNkqGa8NFE= -20251007022859.sql h1:HXXwWrkyvzJzJGAt9mGskCRBBV/c1JfPmfjDocmJhQ4= -20251008031337.sql h1:Ln5pCF3Hxa5foHZLcds+z/us2eH6VAhhEj3w0TAGlVs= -20251008031554.sql h1:aB4MUS2lmqG0//4HKUWorcPSpWya0VC4QItvGyskEVI= -20251008052346.sql h1:MI3AZgU5XcwZT2OvvlWAxdRtL0eJ3jjRwt56IY1+pRU= -20251008073620.sql h1:sztWXuSNYwpEraaSapSsYwno75LO5H/N7ob7OJQ8X/A= -20251009042854.sql h1:TnPXj+dCJls3IU//cuqJZymyBzZMKs7ayazfgtAFRxM= -20251009052657.sql h1:leXbs0CP8r5dRilmYyLRk1MICqak3ea1/LWMtFrijqQ= -20251010031743.sql h1:SgHNY/lQ88G2F4nZyMfiOkDntb+gtOR+nEQLqXBTwv4= -20251010070721.sql h1:AnJnhXsMzDvK4AFgYw6B16Kpo/hljrZtcpc9m2VOSHQ= -20251010072711.sql h1:aXPTtNwLcTuw8C/yAxwxvqs0ayEjNzI1uuE0vE3ERa8= -20251013044536.sql h1:7Pq6JcvTpPBYDCW2dz3HdgUwY65HlhEVWy9TiG8iONE= -20251013051438.sql h1:X6t8bkqpUYYokBunSufMQUe5vCg0VyO6dxbm7ngosUc= -20251013081808.sql h1:495pLguXL2Ozh+ycn4UYZgZbn6WbjXNbyZUc3JU8qhI= -20251014060047.sql h1:nCgImMRGHhziiW57O1ofWaXCAPGaCOHN7PldQ3OSmM4= -20251014063537.sql h1:2cLmID79jP6cuQ1YJaWTtghFiM1GtHMC0ZQl30Hpy1M= -20251014063720.sql h1:bzLKKVAjSHgDFoiI/glj7t1ETlSAKx+AlsIAaP0ru2g= -20251015045455.sql h1:S547+UugQhlTRcn1Lm1IfqT5RNPttIWIiD+RTx69YaE= -20251016010845.sql h1:c9DUvxl17pUkf0azdYGM/YDzYxIJkLcfZOcMI4rL+R0= -20251016011023.sql h1:u3ivg83bXgYHBbojbWpemLxPE9Dmmj53B6LXo664jxw= -20251016062912.sql h1:W9n1hWchfYkqNX9LO9uxFxEXAb/iY+Pexjnhmp6PbgI= -20251017060617.sql h1:VU6yZ2+LfHpDZ3+TIH40t3F5YXPCpTppuF9+uSqa4b8= -20251017082207.sql h1:QshZslfedckz7iDpSGmPyY9sP6dy6ckHbs8L1TuXIA4= +h1:S3ggQSrIa2Lwhkx+yWmD9N2hZxRuVwCMZcEpsk83PJY= +20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= +20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= +20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= +20250908062323.sql h1:oXl6Z143tOpIl4EfP4B8JNU8LrMvVmHEtCgAfiB4gs8= +20250908073811.sql h1:m2aNXfnGxnLq1+rVWrh4f60q7fhyhV3gEwNu/OIqQlE= +20250908073839.sql h1:cPk54xjLdMs26uY8ZHjNWLuyfAMzV7Zb0/9oJQrsw04= +20250910055902.sql h1:5xwjAV6QbtZT9empTJKfhyAjdknbHzb15B0Ku5dzqtQ= +20250915123412.sql h1:D83xaU2YlDEd21HLup/YQpQ2easMToYCyy/oK6AFgQs= +20250916043819.sql h1:ekoTJsBqQZ8G8n0qJ03d13+eoNoc7sAUEQGA5D/CCxk= +20250917040616.sql h1:zoCnmcXuM7AVv85SmN7RmFglCgJnoDmpRWExH0LAc9Q= +20250917040751.sql h1:J1xyRrh32y1+lezwAyNwPcUQ6ABBSgbvzNLva4SVdQU= +20250917045138.sql h1:jKe1Z0uOLG4SGBYM+S/3P+/zMPztmgoderD5swnMuCg= +20250917093645.sql h1:cNI3Pbz1R3LxvIXLuexafJFCXUXrmuFCgXXJ2sG+FW0= +20250918073552.sql h1:RJ1SvMzP6aeWnoPVD3eVAmIQOkcp6Php8z3QRri6v4g= +20250918073742.sql h1:+cEsnJTJFybe2fR69ZoOiX2R6c6iITl4m6WTZ1hjyzY= +20250918074745.sql h1:2hNVQCXF/dVYXAh+T/7oBFgERGWxzVb2FXJjwkFWGCI= +20250923025134.sql h1:Ykz/qpHiGDXPsCsWTjydQFVSibZP2D+h2fIeb2h2JGA= +20250924051317.sql h1:yQuW6SwJxIOM5fcxeAaie5lSm1oLysU/C2hH2xNCVoQ= +20250929034321.sql h1:101FJ8VH12mrZWlt/X1gvKUGOhoiF8tFbjiapAjnHzg= +20250929034428.sql h1:i+pROD9p+g5dOmmZma6WF/0Hw5g3Ha28NN85iTo1K34= +20250930025550.sql h1:+F+CsCUXD/ql0tHGEow70GhPBX1ZybVn+bh/T4YMh7Y= +20250930140351.sql h1:9AAEG1AnOAH+o0+oHL5G7I8vqlWOhwRlCGyyCpT/y1Q= +20251002085604.sql h1:3xZ68eYp4urXRnvotNH1XvG2mYOSDV/j3zHEZ/txg5E= +20251003032030.sql h1:HB+mQ2lXMNomHDpaRhB/9IwYI9/YiDO5eOJ+nAQH/jw= +20251005060450.sql h1:LbtCE2b+8osM3CvnmQJH1uCPtn+d7WchsslBOz8bL3Q= +20251006041122.sql h1:MlS7f21z06sutnf9dIekt5fuHJr4lgcQ4uCuCXAGsfc= +20251006045658.sql h1:3FmGCPCzjgMPdWDRodZTsx3KVaodd9zB9ilib69aewk= +20251006045928.sql h1:Z5g31PmnzNwk/OKdODcxZGm8fjJQdMFK32Xfnt3bRHg= +20251007022859.sql h1:FO03zEfaNEk/aXwY81d5Lp3MoBB9kPQuXlXJ4BPiSR8= +20251008031337.sql h1:l+sxUAGvcTfj3I6kAFHo+T6AYodC9k9GkR+jaKO2xXc= +20251008031554.sql h1:AqrVfIhSzY3PCy8ZlP5W91wn2iznfIuj5qQfubp6/94= +20251008052346.sql h1:nxnXmooIJ6r1mmzwnw+6efxLfc/k9h2aE6RMptPRons= +20251008073620.sql h1:6YsJp1W4SmQJ1lxpqF27BBlDC1zqhw7Yhc7pLzQTY6M= +20251009042854.sql h1:nkBV+R6j0fg7/JY6wH3eb5Vv0asJLnXmb6lINfT/GLQ= +20251009052657.sql h1:EPvdsib5rzCGPryd10HShGKvFPwM/R5S2lIVwtYxpms= +20251010031743.sql h1:T8IZmx8/btRFKLzTe78MzcBsPJNodnLvB0tby9QkirQ= +20251010070721.sql h1:5NQUk/yOV6sABLCB7swx++YIOyJe6MnU+yt1nRzde5w= +20251010072711.sql h1:ZJNqR2piyu8xJhBvVABSlnGEoKSKae3wuEs+wshPe4k= +20251013044536.sql h1:0Xjw8fNILiT8nnfrJDZgQnPf3dntmIoilbapnih8AE4= +20251013051438.sql h1:lfSuw5mgJnePBJamvhZ81osFIouXeiIEiSZ/evdwo48= +20251013081808.sql h1:ijgjNX08G6GBjA/ks8EKtb7P7Y7Cg7zbhqEOruGnv6M= +20251014060047.sql h1:0jqj49WTtneEIMQDBoo4c095ZGi8sCrA8NnHBrPU6D8= +20251014063537.sql h1:VZLXol0PTsTW21Epg6vBPsztWkDtcxup9F/z88EGgIg= +20251014063720.sql h1:2HVUyCV0ud3BJJDH2GEKZN/+IWLFPCsN1KqhP6csO14= +20251015045455.sql h1:MeLWmMhAOAz8b15Dd7IAQnt6JxjSml02XCXK22C0Lpg= +20251016010845.sql h1:4BncQdDOasRZJkzVJrSJJA7091A9VPNVx/faUCUPhBM= +20251016011023.sql h1:9JB9eFZKURK5RoCVDKR6glSvdJ8NTXrN7K/4q51zkz4= +20251016062912.sql h1:ACNn0fe+EMqUt3hoY+Dr3uqAV/QICBa1+mIW7fUc9Fk= +20251017060617.sql h1:4T3t9ifWrEQTPMSM0XJ98pF7Qdt+UfgtMui17bhrnWI= +20251017082207.sql h1:8vLG1l/saRRMHXkyA4nelJyjaSddhZd6r7R+Uo4JS/c= +20251018032635.sql h1:UltiY1Jm1KjAyBx/oRbhKzwEl3Aqh3o+eaOIfWdroJ8= +20251018040322.sql h1:24VgOPgO2pxfwTcAv7xCv8BHiRPqmIbHUCXNLyvrGfc= diff --git a/internal/domain/main-entities/employee/entity.go b/internal/domain/main-entities/employee/entity.go index 8113fc96..2e8cd953 100644 --- a/internal/domain/main-entities/employee/entity.go +++ b/internal/domain/main-entities/employee/entity.go @@ -6,16 +6,18 @@ import ( ep "simrs-vx/internal/domain/main-entities/person" eu "simrs-vx/internal/domain/main-entities/user" erc "simrs-vx/internal/domain/references/common" + erg "simrs-vx/internal/domain/references/organization" ) type Employee struct { - ecore.Main // adjust this according to the needs - User_Id *uint `json:"user_id"` - User *eu.User `json:"user,omitempty" gorm:"foreignKey:User_Id;references:Id"` - Person_Id *uint `json:"person_id"` - Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id;references:Id"` - Division_Code *string `json:"division_code"` - Division *ed.Division `json:"division,omitempty" gorm:"foreignKey:Division_Code;references:Code"` - Number *string `json:"number" gorm:"size:20"` - Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` + ecore.Main // adjust this according to the needs + User_Id *uint `json:"user_id"` + User *eu.User `json:"user,omitempty" gorm:"foreignKey:User_Id;references:Id"` + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id;references:Id"` + Position_Code *erg.EmployeePosisitionCode `json:"position_code" gorm:"size:20"` + Division_Code *string `json:"division_code"` + Division *ed.Division `json:"division,omitempty" gorm:"foreignKey:Division_Code;references:Code"` + Number *string `json:"number" gorm:"size:20"` + Status_Code erc.ActiveStatusCode `json:"status_code" gorm:"not null;size:10"` } diff --git a/internal/domain/main-entities/intern/dto.go b/internal/domain/main-entities/intern/dto.go new file mode 100644 index 00000000..b8c60aee --- /dev/null +++ b/internal/domain/main-entities/intern/dto.go @@ -0,0 +1,81 @@ +package intern + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ep "simrs-vx/internal/domain/main-entities/person" + es "simrs-vx/internal/domain/main-entities/specialist" + ess "simrs-vx/internal/domain/main-entities/subspecialist" + eu "simrs-vx/internal/domain/main-entities/user" +) + +type CreateDto struct { + Person_Id *uint `json:"person_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + User_Id *uint `json:"user_id"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Preloads []string `json:"-"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Person_Id *uint `json:"person_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + User_Id *uint `json:"user_id"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + User_Id *uint `json:"user_id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.Main + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty"` + Specialist_Id *uint16 `json:"specialist_id"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` + Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` + User_Id *uint `json:"user_id"` + User *eu.User `json:"user,omitempty"` +} + +func (d Intern) ToResponse() ResponseDto { + resp := ResponseDto{ + Person_Id: d.Person_Id, + Person: d.Person, + User_Id: d.User_Id, + User: d.User, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []Intern) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/intern/entity.go b/internal/domain/main-entities/intern/entity.go new file mode 100644 index 00000000..5ac2df49 --- /dev/null +++ b/internal/domain/main-entities/intern/entity.go @@ -0,0 +1,17 @@ +package intern + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ep "simrs-vx/internal/domain/main-entities/person" + eu "simrs-vx/internal/domain/main-entities/user" + erg "simrs-vx/internal/domain/references/organization" +) + +type Intern struct { + ecore.Main // adjust this according to the needs + Person_Id *uint `json:"person_id"` + Person *ep.Person `json:"person,omitempty" gorm:"foreignKey:Person_Id"` + Position_Code *erg.InternPosisitionCode `json:"position_code" gorm:"size:20"` + User_Id *uint `json:"user_id"` + User *eu.User `json:"user,omitempty" gorm:"foreignKey:User_Id"` +} diff --git a/internal/domain/main-entities/user/dto.go b/internal/domain/main-entities/user/dto.go index 62a0c587..21f16c3f 100644 --- a/internal/domain/main-entities/user/dto.go +++ b/internal/domain/main-entities/user/dto.go @@ -13,21 +13,21 @@ import ( ) type CreateDto struct { - Name string `json:"name" validate:"maxLength=25"` - Password string `json:"password" validate:"maxLength=255"` - Status_Code erc.UserStatusCode `json:"status_code" validate:"maxLength=10"` - Position_Code ero.UserPosisitionCode `json:"position_code" validate:"maxLength=20"` - Person_Id *uint `json:"-"` - Person *ep.UpdateDto `json:"person"` - PersonAddresses []epa.UpdateDto `json:"personAddresses"` - PersonContacts []epc.UpdateDto `json:"personContacts"` - Employee *EmployeUpdateDto `json:"employee"` - IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` - SIP_Number *string `json:"sip_number" validate:"maxLength=20"` - Unit_Id *uint16 `json:"unit_id"` - Infra_Id *uint16 `json:"infra_id"` - Specialist_Id *uint16 `json:"specialist_id"` - Subspecialist_Id *uint16 `json:"subspecialist_id"` + Name string `json:"name" validate:"maxLength=25"` + Password string `json:"password" validate:"maxLength=255"` + Status_Code erc.UserStatusCode `json:"status_code" validate:"maxLength=10"` + ContractPosition_Code ero.ContractPositionCode `json:"contractPosition_code" validate:"maxLength=20"` + Person_Id *uint `json:"-"` + Person *ep.UpdateDto `json:"person"` + PersonAddresses []epa.UpdateDto `json:"personAddresses"` + PersonContacts []epc.UpdateDto `json:"personContacts"` + Employee *EmployeUpdateDto `json:"employee"` + IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` + SIP_Number *string `json:"sip_number" validate:"maxLength=20"` + Unit_Id *uint16 `json:"unit_id"` + Infra_Id *uint16 `json:"infra_id"` + Specialist_Id *uint16 `json:"specialist_id"` + Subspecialist_Id *uint16 `json:"subspecialist_id"` } type ReadListDto struct { @@ -84,12 +84,13 @@ func (d *User) ToResponse() ResponseDto { } type EmployeUpdateDto struct { - Id uint `json:"id"` - User_Id *uint `json:"-"` - Person_Id *uint `json:"-"` - Division_Code *string `json:"division_code"` - Number *string `json:"number" validate:"maxLength=20"` - Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` + Id uint `json:"id"` + User_Id *uint `json:"-"` + Person_Id *uint `json:"-"` + Division_Code *string `json:"division_code"` + Number *string `json:"number" validate:"maxLength=20"` + Position_Code ero.EmployeePosisitionCode `json:"status_code" validate:"maxLength=10"` + Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` } func ToResponseList(data []User) []ResponseDto { diff --git a/internal/domain/main-entities/user/entity.go b/internal/domain/main-entities/user/entity.go index 4f7d8792..7a644262 100644 --- a/internal/domain/main-entities/user/entity.go +++ b/internal/domain/main-entities/user/entity.go @@ -9,13 +9,14 @@ import ( ) type User struct { - ecore.Main // adjust this according to the needs - Name string `json:"name" gorm:"unique;not null;size:25"` - Password string `json:"password" gorm:"not null;size:255"` - Status_Code erc.UserStatusCode `json:"status_code" gorm:"not null;size:10"` - FailedLoginCount uint8 `json:"failedLoginCount" gorm:"type:smallint"` - Position_Code ero.UserPosisitionCode `json:"position_code" gorm:"not null;size:20"` - LoginAttemptCount int `json:"-"` - LastSuccessLogin *time.Time `json:"lastSuccessLogin,omitempty"` - LastAllowdLogin *time.Time `json:"lastAllowdLogin,omitempty"` + ecore.Main // adjust this according to the needs + Name string `json:"name" gorm:"unique;not null;size:25"` + Password string `json:"password" gorm:"not null;size:255"` + Status_Code erc.UserStatusCode `json:"status_code" gorm:"not null;size:10"` + FailedLoginCount uint8 `json:"failedLoginCount" gorm:"type:smallint"` + // Position_Code ero.EmployeePosisitionCode `json:"position_code" gorm:"not null;size:20"` + ContractPosition_Code ero.ContractPositionCode `json:"contractPosition_Code" gorm:"not null;size:20"` + LoginAttemptCount int `json:"-"` + LastSuccessLogin *time.Time `json:"lastSuccessLogin,omitempty"` + LastAllowdLogin *time.Time `json:"lastAllowdLogin,omitempty"` } diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index ae155e9c..131b2972 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -25,6 +25,7 @@ import ( inpatient "simrs-vx/internal/domain/main-entities/inpatient" installation "simrs-vx/internal/domain/main-entities/installation" insurancecompany "simrs-vx/internal/domain/main-entities/insurance-company" + intern "simrs-vx/internal/domain/main-entities/intern" internalreference "simrs-vx/internal/domain/main-entities/internal-reference" item "simrs-vx/internal/domain/main-entities/item" itemprice "simrs-vx/internal/domain/main-entities/item-price" @@ -105,6 +106,7 @@ func getMainEntities() []any { &diagnosesrc.DiagnoseSrc{}, &proceduresrc.ProcedureSrc{}, &employee.Employee{}, + &intern.Intern{}, &doctor.Doctor{}, &nurse.Nurse{}, &nutritionist.Nutritionist{},