From cdae478152a8b8e6229871fc3f6f9b79a0b142f8 Mon Sep 17 00:00:00 2001 From: vanilia Date: Fri, 24 Oct 2025 14:41:41 +0700 Subject: [PATCH] adjustment detail division --- internal/domain/main-entities/division/dto.go | 49 +++++++++++++++---- .../domain/main-entities/installation/dto.go | 5 +- internal/domain/main-entities/unit/dto.go | 1 + .../main-handler/division/handler.go | 2 + .../use-case/main-use-case/division/case.go | 46 +++++++++++++++-- .../use-case/main-use-case/division/lib.go | 4 +- 6 files changed, 91 insertions(+), 16 deletions(-) diff --git a/internal/domain/main-entities/division/dto.go b/internal/domain/main-entities/division/dto.go index 95ea9119..d82380a0 100644 --- a/internal/domain/main-entities/division/dto.go +++ b/internal/domain/main-entities/division/dto.go @@ -2,6 +2,10 @@ package division 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" + erc "simrs-vx/internal/domain/references/common" + erg "simrs-vx/internal/domain/references/organization" ) type CreateDto struct { @@ -26,8 +30,9 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` - Code *string `json:"code"` + Id uint16 `json:"id"` + Code *string `json:"code"` + Includes string `json:"includes"` } type UpdateDto struct { @@ -47,14 +52,36 @@ type MetaDto struct { type ResponseDto struct { ecore.SmallMain - Code string `json:"code"` - Name string `json:"name"` - Parent_Id *uint16 `json:"parent_id"` - Parent *Division `json:"parent,omitempty"` - Childrens []Division `json:"childrens,omitempty"` + Code string `json:"code"` + Name string `json:"name"` + Parent_Id *uint16 `json:"parent_id"` + Parent *Division `json:"parent,omitempty"` + Childrens []Division `json:"childrens,omitempty"` + DivisionPosition []ResponseDivisionPosition `json:"divisionPositions,omitempty"` } -func (d Division) ToResponse() ResponseDto { +type ResponseDivisionPosition struct { + ecore.SmallMain // adjust this according to the needs + Division_Id *uint16 `json:"division_id"` + Code string `json:"code"` + Name string `json:"name"` + HeadStatus bool `json:"headStatus"` + Employee_Id *uint `json:"employee_id"` + Employee ResponseDivisionEmployee `json:"employee"` +} + +type ResponseDivisionEmployee struct { + ecore.Main // adjust this according to the needs + 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 *erg.EmployeePositionCode `json:"position_code"` + Number *string `json:"number"` + Status_Code erc.ActiveStatusCode `json:"status_code"` +} + +func (d Division) ToResponse(divPos []ResponseDivisionPosition) ResponseDto { resp := ResponseDto{ Code: d.Code, Name: d.Name, @@ -63,13 +90,17 @@ func (d Division) ToResponse() ResponseDto { Childrens: d.Childrens, } resp.SmallMain = d.SmallMain + + if divPos != nil { + resp.DivisionPosition = divPos + } return resp } func ToResponseList(data []Division) []ResponseDto { resp := make([]ResponseDto, len(data)) for i, u := range data { - resp[i] = u.ToResponse() + resp[i] = u.ToResponse(nil) } return resp } diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index 55981981..24c75beb 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -27,8 +27,9 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` - Code *string `json:"code"` + Id uint16 `json:"id"` + Code *string `json:"code"` + Includes string `json:"includes"` } type UpdateDto struct { diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go index 10960609..e294d950 100644 --- a/internal/domain/main-entities/unit/dto.go +++ b/internal/domain/main-entities/unit/dto.go @@ -29,6 +29,7 @@ type ReadDetailDto struct { Id uint16 `json:"id"` Installation_Id *uint16 `json:"installation_id"` Code *string `json:"code"` + Includes string `json:"includes"` } type UpdateDto struct { diff --git a/internal/interface/main-handler/division/handler.go b/internal/interface/main-handler/division/handler.go index 94940f55..ee4cbea5 100644 --- a/internal/interface/main-handler/division/handler.go +++ b/internal/interface/main-handler/division/handler.go @@ -37,7 +37,9 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { if id <= 0 { return } + dto := e.ReadDetailDto{} + sf.UrlQueryParam(&dto, *r.URL) dto.Id = uint16(id) res, err := u.ReadDetail(dto) rw.DataResponse(w, res, err) diff --git a/internal/use-case/main-use-case/division/case.go b/internal/use-case/main-use-case/division/case.go index daabd2f8..3f0353ae 100644 --- a/internal/use-case/main-use-case/division/case.go +++ b/internal/use-case/main-use-case/division/case.go @@ -2,8 +2,11 @@ package division import ( e "simrs-vx/internal/domain/main-entities/division" + edp "simrs-vx/internal/domain/main-entities/division-position" "strconv" + udp "simrs-vx/internal/use-case/main-use-case/division-position" + dg "github.com/karincake/apem/db-gorm-pg" d "github.com/karincake/dodol" @@ -61,7 +64,7 @@ func Create(input e.CreateDto) (*d.Data, error) { "structure": "single-data", "status": "created", }, - Data: data.ToResponse(), + Data: data.ToResponse(nil), }, nil } @@ -121,6 +124,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { var data *e.Division var err error + var dataDP []e.ResponseDivisionPosition event := pl.Event{ Feature: "ReadDetail", @@ -142,6 +146,40 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { return err } + // get data divisionPositions + dataDivisionPosition, err := udp.ReadList(edp.ReadListDto{ + FilterDto: edp.FilterDto{ + Division_Id: &input.Id, + }, + Includes: "employee,employee.User", + }) + if err != nil { + return err + } + + list, _ := dataDivisionPosition.Data.([]edp.ResponseDto) + if len(list) > 0 { + for _, dp := range list { + dataDP = append(dataDP, e.ResponseDivisionPosition{ + SmallMain: dp.SmallMain, + Division_Id: &dp.Id, + Code: dp.Code, + Name: dp.Name, + HeadStatus: dp.HeadStatus, + Employee_Id: dp.Employee_Id, + Employee: e.ResponseDivisionEmployee{ + Main: dp.Employee.Main, + User_Id: dp.Employee.User_Id, + User: dp.Employee.User, + Person_Id: dp.Employee.Person_Id, + Person: dp.Employee.Person, + Number: dp.Employee.Number, + Status_Code: dp.Employee.Status_Code, + }, + }) + } + } + mwRunner.setMwType(pu.MWTPost) // Run post-middleware if err := mwRunner.RunReadDetailMiddleware(readDetailPostMw, &input, data); err != nil { @@ -161,7 +199,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { "structure": "single-data", "status": "fetched", }, - Data: data.ToResponse(), + Data: data.ToResponse(dataDP), }, nil } @@ -216,7 +254,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { "structure": "single-data", "status": "updated", }, - Data: data.ToResponse(), + Data: data.ToResponse(nil), }, nil } @@ -270,7 +308,7 @@ func Delete(input e.DeleteDto) (*d.Data, error) { "structure": "single-data", "status": "deleted", }, - Data: data.ToResponse(), + Data: data.ToResponse(nil), }, nil } diff --git a/internal/use-case/main-use-case/division/lib.go b/internal/use-case/main-use-case/division/lib.go index 828395e7..56ce34f7 100644 --- a/internal/use-case/main-use-case/division/lib.go +++ b/internal/use-case/main-use-case/division/lib.go @@ -91,7 +91,9 @@ 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 err := tx. + Scopes(gh.Preload(input.Includes)). + First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr }