feat (employee): add create feat doctor, nurse, nutritionist, pharmacy

This commit is contained in:
dpurbosakti
2025-09-01 18:44:57 +07:00
parent b289831e6c
commit 4f3dee37fa
3 changed files with 87 additions and 23 deletions
@@ -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
}
@@ -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 {
@@ -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
}