diff --git a/internal/domain/main-entities/employee/dto.go b/internal/domain/main-entities/employee/dto.go index 61b560db..66de6b25 100644 --- a/internal/domain/main-entities/employee/dto.go +++ b/internal/domain/main-entities/employee/dto.go @@ -11,13 +11,16 @@ import ( type CreateDto struct { User_Id *uint `json:"user_id"` - UserRequest *eu.CreateDto `json:"user_request"` + User *eu.CreateDto `json:"user"` Person_Id *uint `json:"person_id"` - PersonRequest *ep.CreateDto `json:"person_request"` + Person *ep.CreateDto `json:"person"` Position_Code ero.EmployeePosisitionCode `json:"position_code"` Division_Code *string `json:"division_code"` Number *string `json:"number"` Status_Code erc.ActiveStatusCode `json:"status_code"` + IHS_Number *string `json:"ihs_number"` + SIP_Number *string `json:"sip_number"` + Unit_Id *uint `json:"unit_id"` } type ReadListDto struct { @@ -99,6 +102,6 @@ func ToResponseList(data []Employee) []ResponseDto { func (c CreateDto) Sanitize() CreateDto { sanitized := c - sanitized.UserRequest.Password = "[REDACTED]" + sanitized.User.Password = "[REDACTED]" return sanitized } diff --git a/internal/use-case/main-use-case/employee/case.go b/internal/use-case/main-use-case/employee/case.go index 5d77ded2..0acc1e60 100644 --- a/internal/use-case/main-use-case/employee/case.go +++ b/internal/use-case/main-use-case/employee/case.go @@ -1,15 +1,25 @@ package employee import ( + ed "simrs-vx/internal/domain/main-entities/doctor" e "simrs-vx/internal/domain/main-entities/employee" + en "simrs-vx/internal/domain/main-entities/nurse" + et "simrs-vx/internal/domain/main-entities/nutritionist" + ep "simrs-vx/internal/domain/main-entities/pharmacist" "strconv" - dg "github.com/karincake/apem/db-gorm-pg" - d "github.com/karincake/dodol" + ud "simrs-vx/internal/use-case/main-use-case/doctor" + un "simrs-vx/internal/use-case/main-use-case/nurse" + ut "simrs-vx/internal/use-case/main-use-case/nutritionist" + up "simrs-vx/internal/use-case/main-use-case/pharmacist" + + ero "simrs-vx/internal/domain/references/organization" 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" ) @@ -34,11 +44,10 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } - if input.Person_Id == nil { - if err := createPerson(&input, &event, tx); err != nil { - return err - } + if err := createOrUpdatePerson(&input, &event, tx); err != nil { + return err } + if err := createUser(&input, &event, tx); err != nil { return err } @@ -49,6 +58,43 @@ func Create(input e.CreateDto) (*d.Data, error) { 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 + } + } + 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/employee/helper.go b/internal/use-case/main-use-case/employee/helper.go index 8eca2b26..48d658be 100644 --- a/internal/use-case/main-use-case/employee/helper.go +++ b/internal/use-case/main-use-case/employee/helper.go @@ -7,11 +7,14 @@ package employee import ( "errors" e "simrs-vx/internal/domain/main-entities/employee" - pl "simrs-vx/pkg/logger" + ep "simrs-vx/internal/domain/main-entities/person" + "strconv" up "simrs-vx/internal/use-case/main-use-case/person" uu "simrs-vx/internal/use-case/main-use-case/user" + pl "simrs-vx/pkg/logger" + "gorm.io/gorm" ) @@ -33,7 +36,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Employee) { } func createUser(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { - if input.UserRequest == nil { + if input.User == nil { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "data-create-fail", @@ -42,7 +45,7 @@ func createUser(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { } return pl.SetLogError(event, input) } - user, err := uu.CreateData(*input.UserRequest, event, tx) + user, err := uu.CreateData(*input.User, event, tx) if err != nil { return err } @@ -50,21 +53,33 @@ func createUser(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { return nil } -func createPerson(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { - if input.PersonRequest == nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-create-fail", - Detail: "person request is required", - Raw: errors.New("person request is required"), +func createOrUpdatePerson(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error { + if input.Person_Id == nil { + person, err := up.CreateData(*input.Person, event, tx) + if err != nil { + return err } - return pl.SetLogError(event, input) + input.Person_Id = &person.Id + return nil } - person, err := up.CreateData(*input.PersonRequest, event, tx) + + person, err := up.ReadDetailData(ep.ReadDetailDto{Id: *input.Person_Id}, event, tx) if err != nil { return err } - input.Person_Id = &person.Id - return nil + if person == nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-notFound", + Detail: "person with ID " + strconv.Itoa(int(*input.Person_Id)) + " not found", + Raw: errors.New("person with ID " + strconv.Itoa(int(*input.Person_Id)) + " not found"), + } + return pl.SetLogError(event, input) + } + + if err := up.UpdateData(ep.UpdateDto{CreateDto: *input.Person}, person, event, tx); err != nil { + return err + } + return nil }