From d5583eaf15b8335b5687e8ea6f12a05ad97f6c64 Mon Sep 17 00:00:00 2001 From: hasyim_kai Date: Tue, 2 Dec 2025 16:13:31 +0700 Subject: [PATCH 01/31] Feat: add Vaccine Data CRUD API --- .../domain/main-entities/vaccine-data/dto.go | 101 ++++++ .../main-entities/vaccine-data/entity.go | 21 ++ .../interface/main-handler/main-handler.go | 2 + .../main-handler/vaccine-data/handler.go | 72 +++++ internal/interface/migration/main-entities.go | 2 + .../main-use-case/vaccine-data/case.go | 303 ++++++++++++++++++ .../main-use-case/vaccine-data/helper.go | 28 ++ .../main-use-case/vaccine-data/lib.go | 144 +++++++++ .../vaccine-data/middleware-runner.go | 103 ++++++ .../main-use-case/vaccine-data/middleware.go | 9 + .../main-use-case/vaccine-data/tycovar.go | 44 +++ 11 files changed, 829 insertions(+) create mode 100644 internal/domain/main-entities/vaccine-data/dto.go create mode 100644 internal/domain/main-entities/vaccine-data/entity.go create mode 100644 internal/interface/main-handler/vaccine-data/handler.go create mode 100644 internal/use-case/main-use-case/vaccine-data/case.go create mode 100644 internal/use-case/main-use-case/vaccine-data/helper.go create mode 100644 internal/use-case/main-use-case/vaccine-data/lib.go create mode 100644 internal/use-case/main-use-case/vaccine-data/middleware-runner.go create mode 100644 internal/use-case/main-use-case/vaccine-data/middleware.go create mode 100644 internal/use-case/main-use-case/vaccine-data/tycovar.go diff --git a/internal/domain/main-entities/vaccine-data/dto.go b/internal/domain/main-entities/vaccine-data/dto.go new file mode 100644 index 00000000..38222604 --- /dev/null +++ b/internal/domain/main-entities/vaccine-data/dto.go @@ -0,0 +1,101 @@ +package vaccinedata + +import ( + // std + "time" + + // internal - lib + + // internal - domain - base-entities + ecore "simrs-vx/internal/domain/base-entities/core" + + // internal - domain - main-entities + + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type CreateDto struct { + Vaccine_type_Code *string `json:"vaccine_type_code"` + Encounter_Id *uint `json:"encounter_id"` + Vaccine_batch_number *uint `json:"vaccine_batch_number"` + Vaccine_dose *uint `json:"vaccine_dose"` + Dose_order *uint `json:"dose_order"` + Injection_location *string `json:"injection_location"` + Vaccination_datetime *time.Time `json:"vaccination_datetime"` + Vaccine_expiration_date *time.Time `json:"vaccine_expiration_date"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id *uint `json:"encounter-id"` + Date *time.Time `json:"date"` + Vaccine_type_Code *string `json:"vaccine-type-code"` + Vaccine_batch_number *uint `json:"vaccine_batch_number"` + Vaccine_dose *uint `json:"vaccine_dose"` + Dose_order *uint `json:"dose_order"` + Injection_location *string `json:"injection_location"` + Vaccination_datetime *time.Time `json:"vaccination_datetime"` + Vaccine_expiration_date *time.Time `json:"vaccine_expiration_date"` +} + +type ReadDetailDto struct { + Id uint16 `json:"id"` + Includes string `json:"includes"` +} + +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 + Vaccine_type_Code *string `json:"vaccine_type_code"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter" gorm:"foreignKey:Encounter_Id;references:Id"` + Vaccine_batch_number *uint `json:"vaccine_batch_number"` + Vaccine_dose *uint `json:"vaccine_dose"` + Dose_order *uint `json:"dose_order"` + Injection_location *string `json:"injection_location"` + Vaccination_datetime *time.Time `json:"vaccination_datetime"` + Vaccine_expiration_date *time.Time `json:"vaccine_expiration_date"` +} + +func (d VaccineData) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Vaccine_type_Code: d.Vaccine_type_Code, + Vaccine_batch_number: d.Vaccine_batch_number, + Vaccine_dose: d.Vaccine_dose, + Dose_order: d.Dose_order, + Injection_location: d.Injection_location, + Vaccination_datetime: d.Vaccination_datetime, + Vaccine_expiration_date: d.Vaccine_expiration_date, + } + resp.Main = d.Main + return resp +} + +func ToResponseList(data []VaccineData) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/vaccine-data/entity.go b/internal/domain/main-entities/vaccine-data/entity.go new file mode 100644 index 00000000..7eb4a023 --- /dev/null +++ b/internal/domain/main-entities/vaccine-data/entity.go @@ -0,0 +1,21 @@ +package vaccinedata + +import ( + "time" + + ecore "simrs-vx/internal/domain/base-entities/core" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type VaccineData struct { + ecore.Main // adjust this according to the needs + Vaccine_type_Code *string `json:"vaccine_type_code"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter" gorm:"foreignKey:Encounter_Id;references:Id"` + Vaccine_batch_number *uint `json:"vaccine_batch_number"` + Vaccine_dose *uint `json:"vaccine_dose"` + Dose_order *uint `json:"dose_order"` + Injection_location *string `json:"injection_location"` + Vaccination_datetime *time.Time `json:"vaccination_datetime"` + Vaccine_expiration_date *time.Time `json:"vaccine_expiration_date"` +} diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index dd025d0e..15430791 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -39,6 +39,7 @@ import ( sbar "simrs-vx/internal/interface/main-handler/sbar" soapi "simrs-vx/internal/interface/main-handler/soapi" uploadfile "simrs-vx/internal/interface/main-handler/upload-file" + vaccineData "simrs-vx/internal/interface/main-handler/vaccine-data" /******************** actor ********************/ authpartner "simrs-vx/internal/interface/main-handler/auth-partner" @@ -300,6 +301,7 @@ func SetRoutes() http.Handler { }) hc.RegCrud(r, "/v1/chemo-protocol", chemoprotocol.O) hc.RegCrud(r, "/v1/upload-file", uploadfile.O) + hc.RegCrud(r, "/v1/vaccine-data", vaccineData.O) hc.RegCrud(r, "/v1/encounter-document", encounterdocument.O) hc.RegCrud(r, "/v1/general-consent", generalconsent.O) r.HandleFunc("POST /v1/generate-file", generatefile.Generate) diff --git a/internal/interface/main-handler/vaccine-data/handler.go b/internal/interface/main-handler/vaccine-data/handler.go new file mode 100644 index 00000000..1aa163ba --- /dev/null +++ b/internal/interface/main-handler/vaccine-data/handler.go @@ -0,0 +1,72 @@ +package vaccinedata + +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/vaccine-data" + u "simrs-vx/internal/use-case/main-use-case/vaccine-data" +) + +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{} + sf.UrlQueryParam(&dto, *r.URL) + dto.Id = uint16(id) + res, err := u.ReadDetail(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.UpdateDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + dto.Id = uint(id) + res, err := u.Update(dto) + rw.DataResponse(w, res, err) +} + +func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.DeleteDto{} + dto.Id = uint(id) + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index bed0c18c..16128e5a 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -99,6 +99,7 @@ import ( uom "simrs-vx/internal/domain/main-entities/uom" user "simrs-vx/internal/domain/main-entities/user" userfes "simrs-vx/internal/domain/main-entities/user-fes" + vaccinedata "simrs-vx/internal/domain/main-entities/vaccine-data" 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" @@ -214,6 +215,7 @@ func getMainEntities() []any { &vclaimmember.VclaimMember{}, &controlletter.ControlLetter{}, &rehab.Rehab{}, + &vaccinedata.VaccineData{}, &chemoprotocol.ChemoProtocol{}, &fileattachemnt.EncounterDocument{}, &vclaimsepcontrolletter.VclaimSepControlLetter{}, diff --git a/internal/use-case/main-use-case/vaccine-data/case.go b/internal/use-case/main-use-case/vaccine-data/case.go new file mode 100644 index 00000000..dbe76f96 --- /dev/null +++ b/internal/use-case/main-use-case/vaccine-data/case.go @@ -0,0 +1,303 @@ +package vaccinedata + +import ( + "errors" + "strconv" + + e "simrs-vx/internal/domain/main-entities/vaccine-data" + ue "simrs-vx/internal/use-case/main-use-case/encounter" + + 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 = "vaccine-data" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.VaccineData{} + + 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 pu.IsDateBeforeNow(input.Vaccination_datetime) { + return errors.New("vaccination date is in the past") + } + if pu.IsDateBeforeNow(input.Vaccine_expiration_date) { + return errors.New("vaccine expiration date is in the past") + } + + // 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.VaccineData + var dataList []e.VaccineData + 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.VaccineData + 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.VaccineData + 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 pu.IsDateBeforeNow(input.Vaccination_datetime) { + return errors.New("vaccination date is in the past") + } + if pu.IsDateBeforeNow(input.Vaccine_expiration_date) { + return errors.New("vaccine expiration date is in the past") + } + + // check if encounter is done + if ue.IsDone(*input.Encounter_Id, &event, tx) { + return errors.New("encounter is already done") + } + + 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.VaccineData + 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/vaccine-data/helper.go b/internal/use-case/main-use-case/vaccine-data/helper.go new file mode 100644 index 00000000..a2b423ec --- /dev/null +++ b/internal/use-case/main-use-case/vaccine-data/helper.go @@ -0,0 +1,28 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package vaccinedata + +import ( + e "simrs-vx/internal/domain/main-entities/vaccine-data" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VaccineData) { + 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.Vaccine_type_Code = inputSrc.Vaccine_type_Code + data.Vaccine_batch_number = inputSrc.Vaccine_batch_number + data.Vaccine_dose = inputSrc.Vaccine_dose + data.Dose_order = inputSrc.Dose_order + data.Injection_location = inputSrc.Injection_location + data.Vaccination_datetime = inputSrc.Vaccination_datetime + data.Vaccine_expiration_date = inputSrc.Vaccine_expiration_date +} diff --git a/internal/use-case/main-use-case/vaccine-data/lib.go b/internal/use-case/main-use-case/vaccine-data/lib.go new file mode 100644 index 00000000..e9d0a5e2 --- /dev/null +++ b/internal/use-case/main-use-case/vaccine-data/lib.go @@ -0,0 +1,144 @@ +package vaccinedata + +import ( + e "simrs-vx/internal/domain/main-entities/vaccine-data" + + 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.VaccineData, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.VaccineData{} + 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.VaccineData, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.VaccineData{} + 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.VaccineData{}). + 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 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.VaccineData, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.VaccineData{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + if input.Includes != "" { + tx = tx.Scopes(gh.Preload(input.Includes)) + } + + 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.VaccineData, 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.VaccineData, 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/vaccine-data/middleware-runner.go b/internal/use-case/main-use-case/vaccine-data/middleware-runner.go new file mode 100644 index 00000000..985cb6d9 --- /dev/null +++ b/internal/use-case/main-use-case/vaccine-data/middleware-runner.go @@ -0,0 +1,103 @@ +package vaccinedata + +import ( + e "simrs-vx/internal/domain/main-entities/vaccine-data" + 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.VaccineData) 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.VaccineData) 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.VaccineData) 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.VaccineData) 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.VaccineData) 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/vaccine-data/middleware.go b/internal/use-case/main-use-case/vaccine-data/middleware.go new file mode 100644 index 00000000..02c0cda6 --- /dev/null +++ b/internal/use-case/main-use-case/vaccine-data/middleware.go @@ -0,0 +1,9 @@ +package vaccinedata + +// 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/vaccine-data/tycovar.go b/internal/use-case/main-use-case/vaccine-data/tycovar.go new file mode 100644 index 00000000..d32700e1 --- /dev/null +++ b/internal/use-case/main-use-case/vaccine-data/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 vaccinedata + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/vaccine-data" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.VaccineData, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.VaccineData, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.VaccineData, 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 b454f52039301decbdc8da3b4c4d11ade97f5a71 Mon Sep 17 00:00:00 2001 From: vanilia Date: Sat, 6 Dec 2025 04:40:13 +0700 Subject: [PATCH 02/31] on going --- internal/domain/main-entities/chemo/dto.go | 1 + .../main-use-case/chemo-protocol/helper.go | 2 +- internal/use-case/main-use-case/chemo/case.go | 29 ++++++++++++++++--- internal/use-case/main-use-case/chemo/lib.go | 3 ++ 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index 602bb711..8fc65ef2 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -35,6 +35,7 @@ type FilterDto struct { Status_Code *erc.DataVerifiedCode `json:"status-code"` VerifiedBy_User_Id *uint `json:"verifiedBy-user-id"` SrcUnit_Code *string `json:"srcUnit-code"` + Patient_Id *uint `json:"patient-id"` } type ReadDetailDto struct { diff --git a/internal/use-case/main-use-case/chemo-protocol/helper.go b/internal/use-case/main-use-case/chemo-protocol/helper.go index 351bf872..fd70130b 100644 --- a/internal/use-case/main-use-case/chemo-protocol/helper.go +++ b/internal/use-case/main-use-case/chemo-protocol/helper.go @@ -46,7 +46,7 @@ func getChemoEncounterReg(event *pl.Event) (*ec.Chemo, error) { if err := tx.Model(&ec.Chemo{}). Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). Joins(`LEFT JOIN "Ambulatory" "a" ON "a"."Encounter_Id" = "e"."Id"`). - Where(`"Chemo"."Status_Code" = ? AND a"."Class_Code" = ?`, erc.DVCVerified, ere.ACCReg). + Where(`"Chemo"."Status_Code" = ? AND "a"."Class_Code" = ?`, erc.DVCVerified, ere.ACCReg). Order("\"CreatedAt\" DESC"). First(&data). Error; err != nil { diff --git a/internal/use-case/main-use-case/chemo/case.go b/internal/use-case/main-use-case/chemo/case.go index d466feef..8e456dc1 100644 --- a/internal/use-case/main-use-case/chemo/case.go +++ b/internal/use-case/main-use-case/chemo/case.go @@ -4,10 +4,6 @@ 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" @@ -15,6 +11,13 @@ import ( pu "simrs-vx/pkg/use-case-helper" "gorm.io/gorm" + + erc "simrs-vx/internal/domain/references/common" + + e "simrs-vx/internal/domain/main-entities/chemo" + ee "simrs-vx/internal/domain/main-entities/encounter" + + ue "simrs-vx/internal/use-case/main-use-case/encounter" ) const source = "chemo" @@ -83,6 +86,15 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "readList") + if input.Encounter_Id == nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-validation-fail", + Detail: "Encounter-Id is required", + } + return nil, pl.SetLogError(&event, input) + } + err = dg.I.Transaction(func(tx *gorm.DB) error { mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) @@ -91,6 +103,15 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { return err } + // Get Encounter + dataEncounter, err := ue.ReadDetailData(ee.ReadDetailDto{Id: *input.Encounter_Id}, &event) + if err != nil { + return err + } + + input.Patient_Id = dataEncounter.Patient_Id + input.Encounter_Id = nil + 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 4a7accbb..4ebdb321 100644 --- a/internal/use-case/main-use-case/chemo/lib.go +++ b/internal/use-case/main-use-case/chemo/lib.go @@ -49,6 +49,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch tx = tx. Model(&e.Chemo{}). + Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). + Joins(`LEFT JOIN "Patient" "p" ON "e"."Patient_Id" = "p"."Id"`). + Where(`"p"."Id" = ?`, input.Patient_Id). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). Count(&count). From cb950e63e925c114bb073a031aaae03b72b957ef Mon Sep 17 00:00:00 2001 From: vanilia Date: Sat, 6 Dec 2025 05:06:58 +0700 Subject: [PATCH 03/31] ongoing --- .../main-entities/chemo-protocol/dto.go | 3 +- internal/domain/main-entities/chemo/dto.go | 1 + .../use-case/main-use-case/chemo-plan/case.go | 359 ++++++++++++++++++ .../main-use-case/chemo-plan/helper.go | 104 +++++ .../use-case/main-use-case/chemo-plan/lib.go | 147 +++++++ .../chemo-plan/middleware-runner.go | 103 +++++ .../main-use-case/chemo-plan/middleware.go | 9 + .../main-use-case/chemo-plan/tycovar.go | 44 +++ .../main-use-case/chemo-protocol/case.go | 37 +- .../main-use-case/chemo-protocol/helper.go | 1 + internal/use-case/main-use-case/chemo/case.go | 18 +- internal/use-case/main-use-case/chemo/lib.go | 1 + 12 files changed, 805 insertions(+), 22 deletions(-) create mode 100644 internal/use-case/main-use-case/chemo-plan/case.go create mode 100644 internal/use-case/main-use-case/chemo-plan/helper.go create mode 100644 internal/use-case/main-use-case/chemo-plan/lib.go create mode 100644 internal/use-case/main-use-case/chemo-plan/middleware-runner.go create mode 100644 internal/use-case/main-use-case/chemo-plan/middleware.go create mode 100644 internal/use-case/main-use-case/chemo-plan/tycovar.go diff --git a/internal/domain/main-entities/chemo-protocol/dto.go b/internal/domain/main-entities/chemo-protocol/dto.go index 8964f451..e329cf67 100644 --- a/internal/domain/main-entities/chemo-protocol/dto.go +++ b/internal/domain/main-entities/chemo-protocol/dto.go @@ -16,7 +16,7 @@ import ( type CreateDto struct { Encounter_Id *uint `json:"encounter_id" validate:"required"` - Chemo_Id *uint `json:"chemo_id"` + Chemo_Id *uint `json:"chemo_id" validate:"required"` Patient_Weight *float32 `json:"patient_weight"` Patient_Height *float32 `json:"patient_height"` Diagnoses *string `json:"diagnoses" validate:"required"` @@ -26,6 +26,7 @@ type CreateDto struct { StartDate *time.Time `json:"startDate"` EndDate *time.Time `json:"endDate"` Status_Code erc.DataVerifiedCode `json:"-"` + Patient_Id *uint `json:"patient_id"` } type ReadListDto struct { diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index 8fc65ef2..abe82dde 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -41,6 +41,7 @@ type FilterDto struct { type ReadDetailDto struct { Id uint16 `json:"id"` Includes string `json:"includes"` + FilterDto } type UpdateDto struct { diff --git a/internal/use-case/main-use-case/chemo-plan/case.go b/internal/use-case/main-use-case/chemo-plan/case.go new file mode 100644 index 00000000..7b1ffeb9 --- /dev/null +++ b/internal/use-case/main-use-case/chemo-plan/case.go @@ -0,0 +1,359 @@ +package chemo_plan + +import ( + "errors" + erc "simrs-vx/internal/domain/references/common" + "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" + + e "simrs-vx/internal/domain/main-entities/chemo-protocol" +) + +const source = "chemo-protocol" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.ChemoProtocol{} + + 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 + } + + //// get chemo data from encounter + //dataChemo, err := getChemoEncounter(input.Encounter_Id, &event) + //if err != nil { + // return err + //} + // + //input.Chemo_Id = &dataChemo.Id + + // determine status code chemo-protocol + //switch dataChemo.Encounter.Ambulatory.Class_Code { + //case ere.ACCChemo: + // input.Status_Code = erc.DVCVerified + //default: + // input.Status_Code = erc.DVCNew + //} + + input.Status_Code = erc.DVCNew + + 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.ChemoProtocol + var dataList []e.ChemoProtocol + 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.ChemoProtocol + 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.ChemoProtocol + 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.ChemoProtocol + 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.ChemoProtocol + 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 = erc.DVCVerified + 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 &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-plan/helper.go b/internal/use-case/main-use-case/chemo-plan/helper.go new file mode 100644 index 00000000..a06f5f20 --- /dev/null +++ b/internal/use-case/main-use-case/chemo-plan/helper.go @@ -0,0 +1,104 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package chemo_plan + +import ( + ec "simrs-vx/internal/domain/main-entities/chemo" + e "simrs-vx/internal/domain/main-entities/chemo-plan" + erc "simrs-vx/internal/domain/references/common" + ere "simrs-vx/internal/domain/references/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" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ChemoPlan) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Chemo_Id = inputSrc.Chemo_Id + data.Patient_Weight = inputSrc.Patient_Weight + data.Patient_Height = inputSrc.Patient_Height + data.Diagnoses = inputSrc.Diagnoses + data.Interval = inputSrc.Interval + data.Cycle = inputSrc.Cycle + data.Series = inputSrc.Series + data.StartDate = inputSrc.StartDate + data.EndDate = inputSrc.EndDate + data.Status_Code = inputSrc.Status_Code +} + +func getChemoEncounterReg(event *pl.Event) (*ec.Chemo, error) { + pl.SetLogInfo(event, nil, "started", "DBReadChemoEncounterReg") + data := ec.Chemo{} + + var tx = dg.I + + if err := tx.Model(&ec.Chemo{}). + Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). + Joins(`LEFT JOIN "Ambulatory" "a" ON "a"."Encounter_Id" = "e"."Id"`). + Where(`"Chemo"."Status_Code" = ? AND "a"."Class_Code" = ?`, erc.DVCVerified, ere.ACCReg). + Order("\"CreatedAt\" DESC"). + First(&data). + Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func getChemoFromLatestEncounter(event *pl.Event) (*ec.Chemo, error) { + pl.SetLogInfo(event, nil, "started", "DBReadChemoFromLatestEncounter") + data := ec.Chemo{} + + var tx = dg.I + + if err := tx.Model(&ec.Chemo{}). + Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). + Joins(`LEFT JOIN "Ambulatory" "a" ON "a"."Encounter_Id" = "e"."Id"`). + Where(`"a"."Class_Code" IN (?)"`, []string{string(ere.ACCReg), string(ere.ACCChemo)}). + Where(`"Chemo"."Status_Code" = ?`, erc.DVCVerified). + Scopes(gh.Preload("Encounter.Ambulatory")). + Order("\"Chemo\".\"CreatedAt\" DESC"). + First(&data). + Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func getChemoEncounter(encounterId *uint, event *pl.Event) (*ec.Chemo, error) { + pl.SetLogInfo(event, encounterId, "started", "DBReadChemoEncounter") + data := ec.Chemo{} + + var tx = dg.I + + if err := tx.Model(&ec.Chemo{}). + Where(`"Encounter_Id" = ? AND "Status_Code"`, encounterId, erc.DVCVerified). + Scopes(gh.Preload("Encounter.Ambulatory")). + First(&data). + Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/main-use-case/chemo-plan/lib.go b/internal/use-case/main-use-case/chemo-plan/lib.go new file mode 100644 index 00000000..1b05a81b --- /dev/null +++ b/internal/use-case/main-use-case/chemo-plan/lib.go @@ -0,0 +1,147 @@ +package chemo_plan + +import ( + "errors" + + plh "simrs-vx/pkg/lib-helper" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + + "gorm.io/gorm" + + dg "github.com/karincake/apem/db-gorm-pg" + gh "github.com/karincake/getuk" + + e "simrs-vx/internal/domain/main-entities/chemo-protocol" +) + +func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ChemoProtocol, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.ChemoProtocol{} + 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.ChemoProtocol, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.ChemoProtocol{} + 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.ChemoProtocol{}). + 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 +} + +func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ChemoProtocol, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.ChemoProtocol{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + 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 + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func UpdateData(input e.UpdateDto, data *e.ChemoProtocol, 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.ChemoProtocol, 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-plan/middleware-runner.go b/internal/use-case/main-use-case/chemo-plan/middleware-runner.go new file mode 100644 index 00000000..406b109d --- /dev/null +++ b/internal/use-case/main-use-case/chemo-plan/middleware-runner.go @@ -0,0 +1,103 @@ +package chemo_plan + +import ( + e "simrs-vx/internal/domain/main-entities/chemo-plan" + 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.ChemoPlan) 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.ChemoPlan) 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.ChemoPlan) 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.ChemoPlan) 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.ChemoPlan) 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-plan/middleware.go b/internal/use-case/main-use-case/chemo-plan/middleware.go new file mode 100644 index 00000000..10e658f5 --- /dev/null +++ b/internal/use-case/main-use-case/chemo-plan/middleware.go @@ -0,0 +1,9 @@ +package chemo_plan + +// 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-plan/tycovar.go b/internal/use-case/main-use-case/chemo-plan/tycovar.go new file mode 100644 index 00000000..c438e2de --- /dev/null +++ b/internal/use-case/main-use-case/chemo-plan/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_plan + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/chemo-plan" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.ChemoPlan, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.ChemoPlan, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.ChemoPlan, 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/chemo-protocol/case.go b/internal/use-case/main-use-case/chemo-protocol/case.go index f434b900..ab481b34 100644 --- a/internal/use-case/main-use-case/chemo-protocol/case.go +++ b/internal/use-case/main-use-case/chemo-protocol/case.go @@ -3,7 +3,6 @@ package chemo_protocol import ( "errors" erc "simrs-vx/internal/domain/references/common" - ere "simrs-vx/internal/domain/references/encounter" "strconv" dg "github.com/karincake/apem/db-gorm-pg" @@ -15,6 +14,9 @@ import ( "gorm.io/gorm" e "simrs-vx/internal/domain/main-entities/chemo-protocol" + ee "simrs-vx/internal/domain/main-entities/encounter" + + ue "simrs-vx/internal/use-case/main-use-case/encounter" ) const source = "chemo-protocol" @@ -38,22 +40,33 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } - // get chemo data from latest encounter - dataChemo, err := getChemoEncounter(input.Encounter_Id, &event) - if err != nil { - return err + if input.Patient_Id == nil { + // get encounter + dataEncounter, err := ue.ReadDetailData(ee.ReadDetailDto{Id: *input.Encounter_Id}, &event) + if err != nil { + return err + } + + input.Patient_Id = dataEncounter.Patient_Id } - input.Chemo_Id = &dataChemo.Id + // get chemo data from encounter + //dataChemo, err := getChemoEncounter(input.Encounter_Id, &event) + //if err != nil { + // return err + //} + + //input.Chemo_Id = &dataChemo.Id // determine status code chemo-protocol - switch dataChemo.Encounter.Ambulatory.Class_Code { - case ere.ACCChemo: - input.Status_Code = erc.DVCVerified - default: - input.Status_Code = erc.DVCNew + //switch dataChemo.Encounter.Ambulatory.Class_Code { + //case ere.ACCChemo: + // input.Status_Code = erc.DVCVerified + //default: + // input.Status_Code = erc.DVCNew + //} - } + input.Status_Code = erc.DVCNew if resData, err := CreateData(input, &event, tx); err != nil { return err diff --git a/internal/use-case/main-use-case/chemo-protocol/helper.go b/internal/use-case/main-use-case/chemo-protocol/helper.go index fd70130b..49711bed 100644 --- a/internal/use-case/main-use-case/chemo-protocol/helper.go +++ b/internal/use-case/main-use-case/chemo-protocol/helper.go @@ -35,6 +35,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ChemoProtocol) { data.StartDate = inputSrc.StartDate data.EndDate = inputSrc.EndDate data.Status_Code = inputSrc.Status_Code + data } func getChemoEncounterReg(event *pl.Event) (*ec.Chemo, error) { diff --git a/internal/use-case/main-use-case/chemo/case.go b/internal/use-case/main-use-case/chemo/case.go index 8e456dc1..1a0851ff 100644 --- a/internal/use-case/main-use-case/chemo/case.go +++ b/internal/use-case/main-use-case/chemo/case.go @@ -86,15 +86,6 @@ func ReadList(input e.ReadListDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "readList") - if input.Encounter_Id == nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-validation-fail", - Detail: "Encounter-Id is required", - } - return nil, pl.SetLogError(&event, input) - } - err = dg.I.Transaction(func(tx *gorm.DB) error { mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) @@ -155,6 +146,15 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { // Start log pl.SetLogInfo(&event, input, "started", "readDetail") + if input.Encounter_Id == nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-validation-fail", + Detail: "Encounter-Id is required", + } + return nil, pl.SetLogError(&event, input) + } + err = dg.I.Transaction(func(tx *gorm.DB) error { mwRunner := newMiddlewareRunner(&event, tx) mwRunner.setMwType(pu.MWTPre) diff --git a/internal/use-case/main-use-case/chemo/lib.go b/internal/use-case/main-use-case/chemo/lib.go index 4ebdb321..4b049c13 100644 --- a/internal/use-case/main-use-case/chemo/lib.go +++ b/internal/use-case/main-use-case/chemo/lib.go @@ -86,6 +86,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e if err := tx. Scopes(gh.Preload(input.Includes)). + Scopes(gh.Filter(input.FilterDto)). First(&data, input.Id).Error; err != nil { if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil { return nil, processedErr From befc121563c760cec743cd77e1498e0fd894702b Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 9 Dec 2025 09:04:51 +0700 Subject: [PATCH 04/31] on going chemo therapy --- .../migrations/20251207020537.sql | 22 ++ .../migrations/20251207212015.sql | 99 +++++++ .../migrations/20251207221222.sql | 8 + cmd/main-migration/migrations/atlas.sum | 8 +- .../main-entities/ap-mcu-order/base/dto.go | 23 ++ .../main-entities/ap-mcu-order/base/entity.go | 25 ++ .../domain/main-entities/ap-mcu-order/dto.go | 96 ++++++ .../main-entities/ap-mcu-order/entity.go | 26 ++ .../main-entities/chemo-protocol/dto.go | 55 ++-- internal/domain/main-entities/chemo/dto.go | 8 +- .../cp-mcu-order-item/base/dto.go | 6 + .../cp-mcu-order-item/base/entity.go | 17 ++ .../main-entities/cp-mcu-order-item/dto.go | 80 +++++ .../main-entities/cp-mcu-order-item/entity.go | 17 ++ .../main-entities/cp-mcu-order/base/entity.go | 21 ++ .../domain/main-entities/cp-mcu-order/dto.go | 84 ++++++ .../main-entities/cp-mcu-order/entity.go | 28 ++ .../micro-mcu-order-item/base/dto.go | 6 + .../micro-mcu-order-item/base/entity.go | 17 ++ .../main-entities/micro-mcu-order-item/dto.go | 80 +++++ .../micro-mcu-order-item/entity.go | 18 ++ .../micro-mcu-order/base/entity.go | 18 ++ .../main-entities/micro-mcu-order/dto.go | 86 ++++++ .../main-entities/micro-mcu-order/entity.go | 28 ++ .../radiology-mcu-order-item/base/dto.go | 6 + .../radiology-mcu-order-item/base/entity.go | 17 ++ .../radiology-mcu-order-item/dto.go | 80 +++++ .../radiology-mcu-order-item/entity.go | 17 ++ .../radiology-mcu-order/base/entity.go | 17 ++ .../main-entities/radiology-mcu-order/dto.go | 88 ++++++ .../radiology-mcu-order/entity.go | 28 ++ .../domain/references/clinical/clinical.go | 4 + .../interface/main-handler/chemo/handler.go | 10 +- internal/interface/migration/main-entities.go | 14 + .../main-use-case/ap-mcu-order/case.go | 276 ++++++++++++++++++ .../main-use-case/ap-mcu-order/helper.go | 27 ++ .../main-use-case/ap-mcu-order/lib.go | 140 +++++++++ .../ap-mcu-order/middleware-runner.go | 103 +++++++ .../main-use-case/ap-mcu-order/middleware.go | 9 + .../main-use-case/ap-mcu-order/tycovar.go | 44 +++ .../use-case/main-use-case/chemo-plan/case.go | 10 +- .../main-use-case/chemo-plan/helper.go | 35 +-- .../use-case/main-use-case/chemo-plan/lib.go | 7 +- .../main-use-case/chemo-protocol/case.go | 18 ++ .../main-use-case/chemo-protocol/helper.go | 24 -- .../main-use-case/chemo-protocol/lib.go | 3 +- internal/use-case/main-use-case/soapi/case.go | 31 +- .../use-case/main-use-case/soapi/helper.go | 108 +++++++ 48 files changed, 1897 insertions(+), 95 deletions(-) create mode 100644 cmd/main-migration/migrations/20251207020537.sql create mode 100644 cmd/main-migration/migrations/20251207212015.sql create mode 100644 cmd/main-migration/migrations/20251207221222.sql create mode 100644 internal/domain/main-entities/ap-mcu-order/base/dto.go create mode 100644 internal/domain/main-entities/ap-mcu-order/base/entity.go create mode 100644 internal/domain/main-entities/ap-mcu-order/dto.go create mode 100644 internal/domain/main-entities/ap-mcu-order/entity.go create mode 100644 internal/domain/main-entities/cp-mcu-order-item/base/dto.go create mode 100644 internal/domain/main-entities/cp-mcu-order-item/base/entity.go create mode 100644 internal/domain/main-entities/cp-mcu-order-item/dto.go create mode 100644 internal/domain/main-entities/cp-mcu-order-item/entity.go create mode 100644 internal/domain/main-entities/cp-mcu-order/base/entity.go create mode 100644 internal/domain/main-entities/cp-mcu-order/dto.go create mode 100644 internal/domain/main-entities/cp-mcu-order/entity.go create mode 100644 internal/domain/main-entities/micro-mcu-order-item/base/dto.go create mode 100644 internal/domain/main-entities/micro-mcu-order-item/base/entity.go create mode 100644 internal/domain/main-entities/micro-mcu-order-item/dto.go create mode 100644 internal/domain/main-entities/micro-mcu-order-item/entity.go create mode 100644 internal/domain/main-entities/micro-mcu-order/base/entity.go create mode 100644 internal/domain/main-entities/micro-mcu-order/dto.go create mode 100644 internal/domain/main-entities/micro-mcu-order/entity.go create mode 100644 internal/domain/main-entities/radiology-mcu-order-item/base/dto.go create mode 100644 internal/domain/main-entities/radiology-mcu-order-item/base/entity.go create mode 100644 internal/domain/main-entities/radiology-mcu-order-item/dto.go create mode 100644 internal/domain/main-entities/radiology-mcu-order-item/entity.go create mode 100644 internal/domain/main-entities/radiology-mcu-order/base/entity.go create mode 100644 internal/domain/main-entities/radiology-mcu-order/dto.go create mode 100644 internal/domain/main-entities/radiology-mcu-order/entity.go create mode 100644 internal/use-case/main-use-case/ap-mcu-order/case.go create mode 100644 internal/use-case/main-use-case/ap-mcu-order/helper.go create mode 100644 internal/use-case/main-use-case/ap-mcu-order/lib.go create mode 100644 internal/use-case/main-use-case/ap-mcu-order/middleware-runner.go create mode 100644 internal/use-case/main-use-case/ap-mcu-order/middleware.go create mode 100644 internal/use-case/main-use-case/ap-mcu-order/tycovar.go diff --git a/cmd/main-migration/migrations/20251207020537.sql b/cmd/main-migration/migrations/20251207020537.sql new file mode 100644 index 00000000..14142cb0 --- /dev/null +++ b/cmd/main-migration/migrations/20251207020537.sql @@ -0,0 +1,22 @@ +-- Create "ApMcuOrder" table +CREATE TABLE "public"."ApMcuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "McuOrder_Id" smallint NULL, + "Substances" text NULL, + "Fictations" text NULL, + "Localization" text NULL, + "ClinicalDiagnoses" text NULL, + "Stadium" text NULL, + "ClinicalNotes" text NULL, + "PastHistory" text NULL, + "CurrentHistory" text NULL, + "PrevApMcu" text NULL, + "PrevApMcuNotes" text NULL, + "SupportingExams" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_ApMcuOrder_McuOrder_Id" UNIQUE ("McuOrder_Id"), + CONSTRAINT "fk_ApMcuOrder_McuOrder" FOREIGN KEY ("McuOrder_Id") REFERENCES "public"."McuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/20251207212015.sql b/cmd/main-migration/migrations/20251207212015.sql new file mode 100644 index 00000000..c551aa8c --- /dev/null +++ b/cmd/main-migration/migrations/20251207212015.sql @@ -0,0 +1,99 @@ +-- Modify "ApMcuOrder" table +ALTER TABLE "public"."ApMcuOrder" DROP COLUMN "McuOrder_Id", ADD COLUMN "Encounter_Id" bigint NULL, ADD COLUMN "Number" bigint NULL, ADD COLUMN "Doctor_Code" character varying(20) NULL, ADD CONSTRAINT "uni_ApMcuOrder_Doctor_Code" UNIQUE ("Doctor_Code"), ADD CONSTRAINT "fk_ApMcuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_ApMcuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Create "CpMcuOrder" table +CREATE TABLE "public"."CpMcuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Number" bigint NULL, + "Doctor_Code" character varying(20) NULL, + "UrgencyLevel_Code" character varying(15) NOT NULL, + "OtherNotes" text NULL, + "ExamScheduleDate" timestamptz NULL, + "Resume" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_CpMcuOrder_Doctor_Code" UNIQUE ("Doctor_Code"), + CONSTRAINT "fk_CpMcuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_CpMcuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "CpMcuOrderItem" table +CREATE TABLE "public"."CpMcuOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "CpMcuOrder_Id" bigint NULL, + "McuSrc_Code" character varying(20) NULL, + "Note" character varying(1024) NULL, + "Result" text NULL, + "Status_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_CpMcuOrderItem_CpMcuOrder" FOREIGN KEY ("CpMcuOrder_Id") REFERENCES "public"."CpMcuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_CpMcuOrderItem_McuSrc" FOREIGN KEY ("McuSrc_Code") REFERENCES "public"."McuSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MicroMcuOrder" table +CREATE TABLE "public"."MicroMcuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Number" bigint NULL, + "Doctor_Code" character varying(20) NULL, + "Stage_Code" character varying(10) NOT NULL, + "AxillaryTemp" numeric NULL, + "OtherNotes" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_MicroMcuOrder_Doctor_Code" UNIQUE ("Doctor_Code"), + CONSTRAINT "fk_MicroMcuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_MicroMcuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "MicroMcuOrderItem" table +CREATE TABLE "public"."MicroMcuOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "MicroMcuOrder_Id" bigint NULL, + "McuSrc_Code" character varying(20) NULL, + "Note" character varying(1024) NULL, + "Result" text NULL, + "Status_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_MicroMcuOrderItem_McuSrc" FOREIGN KEY ("McuSrc_Code") REFERENCES "public"."McuSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_MicroMcuOrderItem_MicroMcuOrder" FOREIGN KEY ("MicroMcuOrder_Id") REFERENCES "public"."MicroMcuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "RadiologyMcuOrder" table +CREATE TABLE "public"."RadiologyMcuOrder" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "Encounter_Id" bigint NULL, + "Number" bigint NULL, + "Doctor_Code" character varying(20) NULL, + "ClinicalNotes" text NULL, + "OtherNotes" text NULL, + "Resume" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "uni_RadiologyMcuOrder_Doctor_Code" UNIQUE ("Doctor_Code"), + CONSTRAINT "fk_RadiologyMcuOrder_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_RadiologyMcuOrder_Encounter" FOREIGN KEY ("Encounter_Id") REFERENCES "public"."Encounter" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); +-- Create "RadiologyMcuOrderItem" table +CREATE TABLE "public"."RadiologyMcuOrderItem" ( + "Id" bigserial NOT NULL, + "CreatedAt" timestamptz NULL, + "UpdatedAt" timestamptz NULL, + "DeletedAt" timestamptz NULL, + "RadiologyMcuOrder_Id" bigint NULL, + "McuSrc_Code" character varying(20) NULL, + "Note" character varying(1024) NULL, + "Result" text NULL, + "Status_Code" text NULL, + PRIMARY KEY ("Id"), + CONSTRAINT "fk_RadiologyMcuOrderItem_McuSrc" FOREIGN KEY ("McuSrc_Code") REFERENCES "public"."McuSrc" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, + CONSTRAINT "fk_RadiologyMcuOrderItem_RadiologyMcuOrder" FOREIGN KEY ("RadiologyMcuOrder_Id") REFERENCES "public"."RadiologyMcuOrder" ("Id") ON UPDATE NO ACTION ON DELETE NO ACTION +); diff --git a/cmd/main-migration/migrations/20251207221222.sql b/cmd/main-migration/migrations/20251207221222.sql new file mode 100644 index 00000000..3c806128 --- /dev/null +++ b/cmd/main-migration/migrations/20251207221222.sql @@ -0,0 +1,8 @@ +-- Modify "ApMcuOrder" table +ALTER TABLE "public"."ApMcuOrder" ADD COLUMN "Status_Code" character varying(10) NOT NULL; +-- Modify "CpMcuOrder" table +ALTER TABLE "public"."CpMcuOrder" ADD COLUMN "Status_Code" character varying(10) NOT NULL; +-- Modify "MicroMcuOrder" table +ALTER TABLE "public"."MicroMcuOrder" ADD COLUMN "Status_Code" character varying(10) NOT NULL; +-- Modify "RadiologyMcuOrder" table +ALTER TABLE "public"."RadiologyMcuOrder" ADD COLUMN "Status_Code" character varying(10) NOT NULL; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index d1f6820b..3880e01e 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:BsDkwn1AzNdKnOPVb6PkonyiXM7nTdVcjRdw62i/NlQ= +h1:o4jOACV/QY64oiqrbnZvGei0J65px0JBwAXakl8h+Oc= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -144,8 +144,10 @@ h1:BsDkwn1AzNdKnOPVb6PkonyiXM7nTdVcjRdw62i/NlQ= 20251202160848.sql h1:Kd2/TziKSMezrt4XgbjQcYvY/Lo9rX0qw7/Lz0/oyKk= 20251202180207.sql h1:IHmSMIO3ia+YV5GULixbdlV1joaUAWtnjQHPd8+HKiM= 20251202231005.sql h1:lua0KKoeBptSfs/6ehZE6Azo6YUlNkOJwGFyb1HQWkY= -20251203205052.sql h1:az/hGpk7u4YKT7gU+UuEw9guqB9AqdckPF1cYavQ3CA= -20251205073858.sql h1:GD692c2jC2mFr6esv3eQmxEpWOeIA860TGctwHAldfM= +20251203205052.sql h1:nk0VK2Uv4bHE3SBfHo/aevVZxtHzr7zAzvmMU8TCCtk= +20251207020537.sql h1:uqqIQaBoZGoOXVQKkalNXwF2awcA+rhjNVevWEzIIok= +20251207212015.sql h1:muRdWqRKfJQFMfezj2B4n0E6bbjIz1GrzHEyhoxy2mk= +20251207221222.sql h1:+mU/25n3hQLRU6MK8B+Uwzl9YBRezX3xWDtIKnweN78= 20251205073858.sql h1:Ep03jQ9hJAJILDJfKVcmi3Z6fqmTHSq9gKQtwf070PE= 20251205211957.sql h1:zRHcvLY+nfLdUyMcfpgI8vYQcPzJUWbfjkc4cK0QGHU= 20251205214433.sql h1:tgHB/fNy9XwAOWIqNI6GCqGXeJgSuZs2aHiCEj3BHZA= diff --git a/internal/domain/main-entities/ap-mcu-order/base/dto.go b/internal/domain/main-entities/ap-mcu-order/base/dto.go new file mode 100644 index 00000000..447bc771 --- /dev/null +++ b/internal/domain/main-entities/ap-mcu-order/base/dto.go @@ -0,0 +1,23 @@ +package apmcuorder + +type CreateDto struct { + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"-"` + Substances string `json:"substances"` + Fictations string `json:"fictations"` + Localization string `json:"localization"` + ClinicalDiagnoses string `json:"clinicalDiagnoses"` + Stadium string `json:"stadium"` + ClinicalNotes string `json:"clinicalNotes"` + CurrentHistory string `json:"currentHistory"` + PastHistory string `json:"pastHistory"` + PrevApMcu string `json:"prevApMcu"` + PrevApMcuNotes string `json:"prevApMcuNotes"` + SupportingExams string `json:"supportingExams"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} diff --git a/internal/domain/main-entities/ap-mcu-order/base/entity.go b/internal/domain/main-entities/ap-mcu-order/base/entity.go new file mode 100644 index 00000000..d098fcfd --- /dev/null +++ b/internal/domain/main-entities/ap-mcu-order/base/entity.go @@ -0,0 +1,25 @@ +package apmcuorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + erc "simrs-vx/internal/domain/references/common" +) + +type ApMcuOrder struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code" gorm:"unique;size:20"` + Substances string `json:"substances"` + Fictations string `json:"fictations"` + Localization string `json:"localization"` + ClinicalDiagnoses string `json:"clinicalDiagnoses"` + Stadium string `json:"stadium"` + ClinicalNotes *string `json:"clinicalNotes"` + CurrentHistory string `json:"currentHistory"` + PastHistory string `json:"pastHistory"` + PrevApMcu *string `json:"prevApMcu"` + PrevApMcuNotes *string `json:"prevApMcuNotes"` + SupportingExams *string `json:"supportingExams"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` +} diff --git a/internal/domain/main-entities/ap-mcu-order/dto.go b/internal/domain/main-entities/ap-mcu-order/dto.go new file mode 100644 index 00000000..80b0b447 --- /dev/null +++ b/internal/domain/main-entities/ap-mcu-order/dto.go @@ -0,0 +1,96 @@ +package apmcuorder + +import ( + la "simrs-vx/internal/lib/auth" + + ecore "simrs-vx/internal/domain/base-entities/core" + eamob "simrs-vx/internal/domain/main-entities/ap-mcu-order/base" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type CreateDto struct { + eamob.CreateDto + la.AuthInfo +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + McuOrder_Id string `json:"mcu-order-id"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Encounter *ee.Encounter + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code"` + Doctor *ed.Doctor + Substances string `json:"substances"` + Fictations string `json:"fictations"` + Localization string `json:"localization"` + ClinicalDiagnoses string `json:"clinicalDiagnoses"` + Stadium string `json:"stadium"` + ClinicalNotes *string `json:"clinicalNotes"` + PastHistory string `json:"pastHistory"` + CurrentHistory string `json:"currentHistory"` + PrevApMcu *string `json:"prevApMcu"` + PrevApMcuNotes *string `json:"prevApMcuNotes"` + SupportingExams *string `json:"supportingExams"` +} + +func (d ApMcuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Number: d.Number, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + Substances: d.Substances, + Fictations: d.Fictations, + Localization: d.Localization, + ClinicalDiagnoses: d.ClinicalDiagnoses, + Stadium: d.Stadium, + ClinicalNotes: d.ClinicalNotes, + PastHistory: d.PastHistory, + CurrentHistory: d.CurrentHistory, + PrevApMcu: d.PrevApMcu, + PrevApMcuNotes: d.PrevApMcuNotes, + SupportingExams: d.SupportingExams, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []ApMcuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/ap-mcu-order/entity.go b/internal/domain/main-entities/ap-mcu-order/entity.go new file mode 100644 index 00000000..361d0948 --- /dev/null +++ b/internal/domain/main-entities/ap-mcu-order/entity.go @@ -0,0 +1,26 @@ +package apmcuorder + +import ( + eamob "simrs-vx/internal/domain/main-entities/ap-mcu-order/base" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + erc "simrs-vx/internal/domain/references/common" +) + +type ApMcuOrder struct { + eamob.ApMcuOrder + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` +} + +func (d ApMcuOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} + +func (d ApMcuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} + +func (d ApMcuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == *doctor_code +} diff --git a/internal/domain/main-entities/chemo-protocol/dto.go b/internal/domain/main-entities/chemo-protocol/dto.go index e485770a..7156b846 100644 --- a/internal/domain/main-entities/chemo-protocol/dto.go +++ b/internal/domain/main-entities/chemo-protocol/dto.go @@ -1,6 +1,7 @@ package chemo_protocol import ( + eus "simrs-vx/internal/domain/main-entities/user" pa "simrs-vx/internal/lib/auth" // std "time" @@ -73,32 +74,42 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Chemo_Id *uint `json:"chemo_id"` - Chemo *ec.Chemo `json:"chemo,omitempty"` - Patient_Weight *float32 `json:"patient_weight"` - Patient_Height *float32 `json:"patient_height"` - Diagnoses *string `json:"diagnoses"` - Interval *uint `json:"interval"` - Cycle *uint `json:"cycle"` - Series *uint16 `json:"series"` - StartDate *time.Time `json:"startDate"` - EndDate *time.Time `json:"endDate"` - Status_Code erc.DataVerifiedCode `json:"status_code"` + Chemo_Id *uint `json:"chemo_id"` + Chemo *ec.Chemo `json:"chemo,omitempty"` + Patient_Weight *float32 `json:"patient_weight"` + Patient_Height *float32 `json:"patient_height"` + Diagnoses *string `json:"diagnoses"` + Interval *uint `json:"interval"` + Cycle *uint `json:"cycle"` + Series *uint16 `json:"series"` + StartDate *time.Time `json:"startDate"` + EndDate *time.Time `json:"endDate"` + 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"` + ChemoPlans *[]ep.ChemoPlan `json:"chemoPlans,omitempty"` + Patient_Id *uint `json:"patient_id"` } func (d ChemoProtocol) ToResponse() ResponseDto { resp := ResponseDto{ - Chemo_Id: d.Chemo_Id, - Chemo: d.Chemo, - Patient_Weight: d.Patient_Weight, - Patient_Height: d.Patient_Height, - Diagnoses: d.Diagnoses, - Interval: d.Interval, - Cycle: d.Cycle, - Series: d.Series, - StartDate: d.StartDate, - EndDate: d.EndDate, - Status_Code: d.Status_Code, + Chemo_Id: d.Chemo_Id, + Chemo: d.Chemo, + Patient_Weight: d.Patient_Weight, + Patient_Height: d.Patient_Height, + Diagnoses: d.Diagnoses, + Interval: d.Interval, + Cycle: d.Cycle, + Series: d.Series, + StartDate: d.StartDate, + EndDate: d.EndDate, + Status_Code: d.Status_Code, + VerifiedAt: d.VerifiedAt, + VerifiedBy_User_Id: d.VerifiedBy_User_Id, + VerifiedBy: d.VerifiedBy, + ChemoPlans: d.ChemoPlans, + Patient_Id: d.Patient_Id, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index abe82dde..695c1ca7 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -39,22 +39,22 @@ type FilterDto struct { } type ReadDetailDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` Includes string `json:"includes"` FilterDto } type UpdateDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` CreateDto } type DeleteDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` } type VerifyDto struct { - Id uint16 `json:"id"` + Id uint `json:"id"` Status_Code erc.DataVerifiedCode `json:"status_code"` Bed *string `json:"bed"` Needs *string `json:"needs"` diff --git a/internal/domain/main-entities/cp-mcu-order-item/base/dto.go b/internal/domain/main-entities/cp-mcu-order-item/base/dto.go new file mode 100644 index 00000000..2510f9a0 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order-item/base/dto.go @@ -0,0 +1,6 @@ +package cpmcuorderitem + +type SubCreateDto struct { + McuSrc_Code string `json:"mcuSrc_code" validate:"required"` + Note string `json:"note"` +} diff --git a/internal/domain/main-entities/cp-mcu-order-item/base/entity.go b/internal/domain/main-entities/cp-mcu-order-item/base/entity.go new file mode 100644 index 00000000..5abb8494 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order-item/base/entity.go @@ -0,0 +1,17 @@ +package cpmcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" +) + +type CpMcuOrderItem struct { + ecore.BigMain // adjust this according to the needs + CpMcuOrder_Id uint64 `json:"cpMcuOrder_id" gorm:"uniqueIndex:idx_order_src"` + McuSrc_Code string `json:"mcuSrc_code" gorm:"uniqueIndex:idx_order_src"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` + Note *string `json:"note" gorm:"size:1024"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} diff --git a/internal/domain/main-entities/cp-mcu-order-item/dto.go b/internal/domain/main-entities/cp-mcu-order-item/dto.go new file mode 100644 index 00000000..a0979186 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order-item/dto.go @@ -0,0 +1,80 @@ +package cpmcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + emro "simrs-vx/internal/domain/main-entities/cp-mcu-order" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type CreateDto struct { + CpMcuOrder_Id uint64 `json:"cpMcuOrder_id"` + McuSrc_Code string `json:"mcuSrc_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + CpMcuOrder_Id *uint64 `json:"cp-mcu-order-id"` + McuSrc_Code *string `json:"mcu-src-code"` + Status_Code erc.DataStatusCode `json:"status-code"` +} +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type SetScheduleDto struct { + Id uint `json:"id"` + ExaminationDate *time.Time `json:"examinationDate"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + CpMcuOrder_Id uint64 `json:"cpMcuOrder_id"` + CpMcuOrder *emro.CpMcuOrder `json:"cpMcuOrder,omitempty"` + McuSrc_Code string `json:"mcuSrc_code"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +func (d CpMcuOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + CpMcuOrder_Id: d.CpMcuOrder_Id, + CpMcuOrder: d.CpMcuOrder, + McuSrc_Code: d.McuSrc_Code, + McuSrc: d.McuSrc, + Result: d.Result, + Status_Code: d.Status_Code, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []CpMcuOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/cp-mcu-order-item/entity.go b/internal/domain/main-entities/cp-mcu-order-item/entity.go new file mode 100644 index 00000000..5858ab58 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order-item/entity.go @@ -0,0 +1,17 @@ +package cpmcuorderitem + +import ( + emo "simrs-vx/internal/domain/main-entities/cp-mcu-order" + emoib "simrs-vx/internal/domain/main-entities/cp-mcu-order-item/base" + + erc "simrs-vx/internal/domain/references/common" +) + +type CpMcuOrderItem struct { + emoib.CpMcuOrderItem + CpMcuOrder *emo.CpMcuOrder `json:"cpMcuOrder,omitempty" gorm:"foreignKey:CpMcuOrder_Id;references:Id"` +} + +func (d CpMcuOrderItem) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/cp-mcu-order/base/entity.go b/internal/domain/main-entities/cp-mcu-order/base/entity.go new file mode 100644 index 00000000..e9531e22 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order/base/entity.go @@ -0,0 +1,21 @@ +package cpmcuorder + +import ( + "time" + + ecore "simrs-vx/internal/domain/base-entities/core" + ercl "simrs-vx/internal/domain/references/clinical" + erc "simrs-vx/internal/domain/references/common" +) + +type CpMcuOrder struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code" gorm:"unique;size:20"` + UrgencyLevel_Code ercl.McuUrgencyLevelCode `json:"urgencyLevel_code" gorm:"not null;size:15"` + OtherNotes *string `json:"otherNotes"` + ExamScheduleDate *time.Time `json:"examinationDate"` + Resume *string `json:"resume"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` +} diff --git a/internal/domain/main-entities/cp-mcu-order/dto.go b/internal/domain/main-entities/cp-mcu-order/dto.go new file mode 100644 index 00000000..afccfb20 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order/dto.go @@ -0,0 +1,84 @@ +package cpmcuorder + +import ( + la "simrs-vx/internal/lib/auth" + + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" +) + +type CreateDto struct { + Encounter_Id uint `json:"encounter_id" validate:"required"` + Number uint64 `json:"number"` // SHOULD BE AUTOMATIC WITHOUT SYNC + UrgencyLevel_Code string `json:"urgencyLevel_code" validate:"required"` + OtherNotes string `json:"otherNotes"` + la.AuthInfo +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id uint `json:"encounter-id"` + Doctor_Code string `json:"doctor-code"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint + Encounter *ee.Encounter + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code"` + Doctor *ed.Doctor + UrgencyLevel_Code string `json:"urgencyLevel_code" gorm:"not null;size:15"` + OtherNotes *string `json:"otherNotes"` + Resume *string `json:"resume"` +} + +func (d CpMcuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Number: d.Number, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + UrgencyLevel_Code: string(d.UrgencyLevel_Code), + OtherNotes: d.OtherNotes, + Resume: d.Resume, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []CpMcuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/cp-mcu-order/entity.go b/internal/domain/main-entities/cp-mcu-order/entity.go new file mode 100644 index 00000000..08a3d927 --- /dev/null +++ b/internal/domain/main-entities/cp-mcu-order/entity.go @@ -0,0 +1,28 @@ +package cpmcuorder + +import ( + ecmoi "simrs-vx/internal/domain/main-entities/cp-mcu-order-item/base" + eamob "simrs-vx/internal/domain/main-entities/cp-mcu-order/base" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + erc "simrs-vx/internal/domain/references/common" +) + +type CpMcuOrder struct { + eamob.CpMcuOrder + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Items []*ecmoi.CpMcuOrderItem `json:"items" gorm:"foreignKey:CpMcuOrder_Id;references:Id"` +} + +func (d CpMcuOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} + +func (d CpMcuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} + +func (d CpMcuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == *doctor_code +} diff --git a/internal/domain/main-entities/micro-mcu-order-item/base/dto.go b/internal/domain/main-entities/micro-mcu-order-item/base/dto.go new file mode 100644 index 00000000..56827131 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order-item/base/dto.go @@ -0,0 +1,6 @@ +package micromcuorderitem + +type SubCreateDto struct { + McuSrc_Code string `json:"mcuSrc_code" validate:"required"` + Note string `json:"note"` +} diff --git a/internal/domain/main-entities/micro-mcu-order-item/base/entity.go b/internal/domain/main-entities/micro-mcu-order-item/base/entity.go new file mode 100644 index 00000000..c9d91561 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order-item/base/entity.go @@ -0,0 +1,17 @@ +package micromcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" +) + +type MicroMcuOrderItem struct { + ecore.BigMain // adjust this according to the needs + MicroMcuOrder_Id uint64 `json:"microMcuOrder_id" gorm:"uniqueIndex:idx_order_src"` + McuSrc_Code string `json:"mcuSrc_code" gorm:"uniqueIndex:idx_order_src"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` + Note *string `json:"note" gorm:"size:1024"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} diff --git a/internal/domain/main-entities/micro-mcu-order-item/dto.go b/internal/domain/main-entities/micro-mcu-order-item/dto.go new file mode 100644 index 00000000..1d2ceaeb --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order-item/dto.go @@ -0,0 +1,80 @@ +package micromcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + emro "simrs-vx/internal/domain/main-entities/micro-mcu-order" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type CreateDto struct { + MicroMcuOrder_Id uint64 `json:"microMcuOrder_id"` + McuSrc_Code string `json:"mcuSrc_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + MicroMcuOrder_Id *uint64 `json:"micro-mcu-order-id"` + McuSrc_Code *string `json:"mcu-src-code"` + Status_Code erc.DataStatusCode `json:"status-code"` +} +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type SetScheduleDto struct { + Id uint `json:"id"` + ExaminationDate *time.Time `json:"examinationDate"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + MicroMcuOrder_Id uint64 `json:"microMcuOrder_id"` + MicroMcuOrder *emro.MicroMcuOrder `json:"microMcuOrder,omitempty"` + McuSrc_Code string `json:"mcuSrc_code"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +func (d MicroMcuOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + MicroMcuOrder_Id: d.MicroMcuOrder_Id, + MicroMcuOrder: d.MicroMcuOrder, + McuSrc_Code: d.McuSrc_Code, + McuSrc: d.McuSrc, + Result: d.Result, + Status_Code: d.Status_Code, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []MicroMcuOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/micro-mcu-order-item/entity.go b/internal/domain/main-entities/micro-mcu-order-item/entity.go new file mode 100644 index 00000000..64d701f7 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order-item/entity.go @@ -0,0 +1,18 @@ +package micromcuorderitem + +import ( + ems "simrs-vx/internal/domain/main-entities/mcu-src" + emo "simrs-vx/internal/domain/main-entities/micro-mcu-order" + emoib "simrs-vx/internal/domain/main-entities/micro-mcu-order-item/base" + erc "simrs-vx/internal/domain/references/common" +) + +type MicroMcuOrderItem struct { + emoib.MicroMcuOrderItem + MicroMcuOrder *emo.MicroMcuOrder `json:"microMcuOrder,omitempty" gorm:"foreignKey:MicroMcuOrder_Id;references:Id"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` +} + +func (d MicroMcuOrderItem) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/micro-mcu-order/base/entity.go b/internal/domain/main-entities/micro-mcu-order/base/entity.go new file mode 100644 index 00000000..3e611d81 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order/base/entity.go @@ -0,0 +1,18 @@ +package micromcuorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ercl "simrs-vx/internal/domain/references/clinical" + erc "simrs-vx/internal/domain/references/common" +) + +type MicroMcuOrder struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code" gorm:"unique;size:20"` + Stage_Code ercl.McuOrderStageCode `json:"stage_code" gorm:"not null;size:10"` + AxillaryTemp float64 `json:"axillaryTemp"` + OtherNotes *string `json:"otherNotes"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` +} diff --git a/internal/domain/main-entities/micro-mcu-order/dto.go b/internal/domain/main-entities/micro-mcu-order/dto.go new file mode 100644 index 00000000..008f219f --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order/dto.go @@ -0,0 +1,86 @@ +package micromcuorder + +import ( + la "simrs-vx/internal/lib/auth" + + 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" +) + +type CreateDto struct { + Encounter_Id uint `json:"encounter_id" validate:"required"` + Number uint64 `json:"number"` // SHOULD BE AUTOMATIC WITHOUT SYNC + OrderStage_Code string `json:"orderStage_code" gorm:"not null;size:10"` + AxillaryTemp float64 `json:"axillaryTemp"` + OtherNotes string `json:"otherNotes"` + la.AuthInfo +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id uint `json:"encounter-id"` + Doctor_Code string `json:"doctor-code"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint + Encounter *ee.Encounter + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code"` + Doctor *ed.Doctor + Stage_Code ercl.McuOrderStageCode `json:"stage_code" gorm:"not null;size:10"` + AxillaryTemp float64 `json:"axillaryTemp"` + OtherNotes *string `json:"otherNotes"` +} + +func (d MicroMcuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Number: d.Number, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + Stage_Code: d.Stage_Code, + AxillaryTemp: d.AxillaryTemp, + OtherNotes: d.OtherNotes, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []MicroMcuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/micro-mcu-order/entity.go b/internal/domain/main-entities/micro-mcu-order/entity.go new file mode 100644 index 00000000..57550c84 --- /dev/null +++ b/internal/domain/main-entities/micro-mcu-order/entity.go @@ -0,0 +1,28 @@ +package micromcuorder + +import ( + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + emmoi "simrs-vx/internal/domain/main-entities/micro-mcu-order-item/base" + eamob "simrs-vx/internal/domain/main-entities/micro-mcu-order/base" + erc "simrs-vx/internal/domain/references/common" +) + +type MicroMcuOrder struct { + eamob.MicroMcuOrder + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Items []*emmoi.MicroMcuOrderItem `json:"items" gorm:"foreignKey:MicroMcuOrder_Id;references:Id"` +} + +func (d MicroMcuOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} + +func (d MicroMcuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} + +func (d MicroMcuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == *doctor_code +} diff --git a/internal/domain/main-entities/radiology-mcu-order-item/base/dto.go b/internal/domain/main-entities/radiology-mcu-order-item/base/dto.go new file mode 100644 index 00000000..8ca6d02f --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order-item/base/dto.go @@ -0,0 +1,6 @@ +package radiologymcuorderitem + +type SubCreateDto struct { + McuSrc_Code string `json:"mcuSrc_code" validate:"required"` + Note string `json:"note"` +} diff --git a/internal/domain/main-entities/radiology-mcu-order-item/base/entity.go b/internal/domain/main-entities/radiology-mcu-order-item/base/entity.go new file mode 100644 index 00000000..1f3ff5a5 --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order-item/base/entity.go @@ -0,0 +1,17 @@ +package radiologymcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + erc "simrs-vx/internal/domain/references/common" +) + +type RadiologyMcuOrderItem struct { + ecore.BigMain // adjust this according to the needs + RadiologyMcuOrder_Id uint64 `json:"radiologyMcuOrder_id" gorm:"uniqueIndex:idx_order_src"` + McuSrc_Code string `json:"mcuSrc_code" gorm:"uniqueIndex:idx_order_src"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty" gorm:"foreignKey:McuSrc_Code;references:Code"` + Note *string `json:"note" gorm:"size:1024"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} diff --git a/internal/domain/main-entities/radiology-mcu-order-item/dto.go b/internal/domain/main-entities/radiology-mcu-order-item/dto.go new file mode 100644 index 00000000..99c65df3 --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order-item/dto.go @@ -0,0 +1,80 @@ +package radiologymcuorderitem + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + ems "simrs-vx/internal/domain/main-entities/mcu-src" + emro "simrs-vx/internal/domain/main-entities/radiology-mcu-order" + erc "simrs-vx/internal/domain/references/common" + "time" +) + +type CreateDto struct { + RadiologyMcuOrder_Id uint64 `json:"radiologyMcuOrder_id"` + McuSrc_Code string `json:"mcuSrc_code"` +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Pagination ecore.Pagination +} + +type FilterDto struct { + RadiologyMcuOrder_Id *uint64 `json:"radiology-mcu-order-id"` + McuSrc_Code *string `json:"mcu-src-code"` + Status_Code erc.DataStatusCode `json:"status-code"` +} +type ReadDetailDto struct { + Id uint `json:"id"` +} + +type UpdateDto struct { + Id uint `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint `json:"id"` +} + +type SetScheduleDto struct { + Id uint `json:"id"` + ExaminationDate *time.Time `json:"examinationDate"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + RadiologyMcuOrder_Id uint64 `json:"radiologyMcuOrder_id"` + RadiologyMcuOrder *emro.RadiologyMcuOrder `json:"radiologyMcuOrder,omitempty"` + McuSrc_Code string `json:"mcuSrc_code"` + McuSrc *ems.McuSrc `json:"mcuSrc,omitempty"` + Result *string `json:"result"` + Status_Code erc.DataStatusCode `json:"status_code"` +} + +func (d RadiologyMcuOrderItem) ToResponse() ResponseDto { + resp := ResponseDto{ + RadiologyMcuOrder_Id: d.RadiologyMcuOrder_Id, + RadiologyMcuOrder: d.RadiologyMcuOrder, + McuSrc_Code: d.McuSrc_Code, + McuSrc: d.McuSrc, + Result: d.Result, + Status_Code: d.Status_Code, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []RadiologyMcuOrderItem) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/radiology-mcu-order-item/entity.go b/internal/domain/main-entities/radiology-mcu-order-item/entity.go new file mode 100644 index 00000000..da20a56a --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order-item/entity.go @@ -0,0 +1,17 @@ +package radiologymcuorderitem + +import ( + emo "simrs-vx/internal/domain/main-entities/radiology-mcu-order" + emoib "simrs-vx/internal/domain/main-entities/radiology-mcu-order-item/base" + + erc "simrs-vx/internal/domain/references/common" +) + +type RadiologyMcuOrderItem struct { + emoib.RadiologyMcuOrderItem + RadiologyMcuOrder *emo.RadiologyMcuOrder `json:"radiologyMcuOrder,omitempty" gorm:"foreignKey:RadiologyMcuOrder_Id;references:Id"` +} + +func (d RadiologyMcuOrderItem) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} diff --git a/internal/domain/main-entities/radiology-mcu-order/base/entity.go b/internal/domain/main-entities/radiology-mcu-order/base/entity.go new file mode 100644 index 00000000..6871e689 --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order/base/entity.go @@ -0,0 +1,17 @@ +package radiologymcuorder + +import ( + ecore "simrs-vx/internal/domain/base-entities/core" + erc "simrs-vx/internal/domain/references/common" +) + +type RadiologyMcuOrder struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code" gorm:"unique;size:20"` + ClinicalNotes *string `json:"clinicalNotes"` + OtherNotes *string `json:"otherNotes"` + Resume *string `json:"resume"` + Status_Code erc.DataStatusCode `json:"status_code" gorm:"not null;size:10"` +} diff --git a/internal/domain/main-entities/radiology-mcu-order/dto.go b/internal/domain/main-entities/radiology-mcu-order/dto.go new file mode 100644 index 00000000..4250b4b0 --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order/dto.go @@ -0,0 +1,88 @@ +package radiologymcuorder + +import ( + la "simrs-vx/internal/lib/auth" + + ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + ermoi "simrs-vx/internal/domain/main-entities/radiology-mcu-order-item/base" +) + +type CreateDto struct { + Encounter_Id uint `json:"encounter_id"` + Number *uint64 `json:"number"` // SHOULD BE AUTOMATIC WITHOUT SYNC + Doctor_Code string `json:"-" validate:"required"` + ClinicalNotes *string `json:"clinicalNotes"` + OtherNotes *string `json:"otherNotes"` + Items []ermoi.SubCreateDto `json:"items" validate:"required"` + la.AuthInfo +} + +type ReadListDto struct { + FilterDto + Includes string `json:"includes"` + Sort string `json:"sort"` + Pagination ecore.Pagination +} + +type FilterDto struct { + Encounter_Id uint `json:"encounter-id"` + Doctor_Code string `json:"doctor-code"` +} + +type ReadDetailDto struct { + Id uint64 `json:"id"` + Includes string `json:"includes"` +} + +type UpdateDto struct { + Id uint64 `json:"id"` + CreateDto +} + +type DeleteDto struct { + Id uint64 `json:"id"` +} + +type MetaDto struct { + PageNumber int `json:"page_number"` + PageSize int `json:"page_size"` + Count int `json:"count"` +} + +type ResponseDto struct { + ecore.BigMain + Encounter_Id uint `json:"encounter_id"` + Encounter *ee.Encounter + Number uint64 `json:"number"` + Doctor_Code string `json:"doctor_code"` + Doctor *ed.Doctor + ClinicalNotes *string `json:"clinicalNotes"` + OtherNotes *string `json:"otherNotes"` + Resume *string `json:"resume"` + Items []*ermoi.RadiologyMcuOrderItem +} + +func (d RadiologyMcuOrder) ToResponse() ResponseDto { + resp := ResponseDto{ + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Number: d.Number, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + ClinicalNotes: d.ClinicalNotes, + OtherNotes: d.OtherNotes, + Resume: d.Resume, + } + resp.BigMain = d.BigMain + return resp +} + +func ToResponseList(data []RadiologyMcuOrder) []ResponseDto { + resp := make([]ResponseDto, len(data)) + for i, u := range data { + resp[i] = u.ToResponse() + } + return resp +} diff --git a/internal/domain/main-entities/radiology-mcu-order/entity.go b/internal/domain/main-entities/radiology-mcu-order/entity.go new file mode 100644 index 00000000..1ef8882d --- /dev/null +++ b/internal/domain/main-entities/radiology-mcu-order/entity.go @@ -0,0 +1,28 @@ +package radiologymcuorder + +import ( + ed "simrs-vx/internal/domain/main-entities/doctor" + ee "simrs-vx/internal/domain/main-entities/encounter" + ermoi "simrs-vx/internal/domain/main-entities/radiology-mcu-order-item/base" + eamob "simrs-vx/internal/domain/main-entities/radiology-mcu-order/base" + erc "simrs-vx/internal/domain/references/common" +) + +type RadiologyMcuOrder struct { + eamob.RadiologyMcuOrder + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Items []*ermoi.RadiologyMcuOrderItem `json:"items" gorm:"foreignKey:RadiologyMcuOrder_Id;references:Id"` +} + +func (d RadiologyMcuOrder) IsNotNew() bool { + return d.Status_Code != erc.DSCNew +} + +func (d RadiologyMcuOrder) IsCompleted() bool { + return d.Status_Code == erc.DSCDone +} + +func (d RadiologyMcuOrder) IsSameDoctor(doctor_code *string) bool { + return d.Doctor_Code == *doctor_code +} diff --git a/internal/domain/references/clinical/clinical.go b/internal/domain/references/clinical/clinical.go index 2cfdb3a5..a41f459d 100644 --- a/internal/domain/references/clinical/clinical.go +++ b/internal/domain/references/clinical/clinical.go @@ -9,6 +9,7 @@ type ( InstructionCode string HeadToToeCode string McuUrgencyLevelCode string + McuOrderStageCode string McuScopeCode string SoapiTypeCode string MedicalActionTypeCode string @@ -125,6 +126,9 @@ const ( MULCPF McuUrgencyLevelCode = "priority-form" // Form Prioritas MULCRT McuUrgencyLevelCode = "routine" // Pemeriksaan Rutin + MOSFirst McuOrderStageCode = "first" // Stage 1 + MOSSecond McuOrderStageCode = "repeat" // Stage 2 + STCEarlyNurse SoapiTypeCode = "early-nursery" // Kajian Awal Keperawatan STCEEarlyMedic SoapiTypeCode = "early-medic" // Kajian Awal Rehab Medis STCEarlyRehab SoapiTypeCode = "early-rehab" // Kajian Awal Rehab Medik diff --git a/internal/interface/main-handler/chemo/handler.go b/internal/interface/main-handler/chemo/handler.go index 5aa2be44..30535ac4 100644 --- a/internal/interface/main-handler/chemo/handler.go +++ b/internal/interface/main-handler/chemo/handler.go @@ -42,7 +42,7 @@ func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { } dto := e.ReadDetailDto{} sf.UrlQueryParam(&dto, *r.URL) - dto.Id = uint16(id) + dto.Id = uint(id) res, err := u.ReadDetail(dto) rw.DataResponse(w, res, err) } @@ -57,7 +57,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) } @@ -69,7 +69,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) } @@ -85,7 +85,7 @@ func (obj myBase) Verify(w http.ResponseWriter, r *http.Request) { return } - dto.Id = uint16(id) + dto.Id = uint(id) authInfo, err := pa.GetAuthInfo(r) if err != nil { rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) @@ -104,7 +104,7 @@ func (obj myBase) Reject(w http.ResponseWriter, r *http.Request) { } dto := e.VerifyDto{} - dto.Id = uint16(id) + dto.Id = uint(id) authInfo, err := pa.GetAuthInfo(r) if err != nil { rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index 4c182d22..745710a0 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -8,6 +8,7 @@ import ( ambulatory "simrs-vx/internal/domain/main-entities/ambulatory" antibioticinuse "simrs-vx/internal/domain/main-entities/antibiotic-in-use" antibioticsrccategory "simrs-vx/internal/domain/main-entities/antibiotic-src-category" + apmcuorder "simrs-vx/internal/domain/main-entities/ap-mcu-order" appointment "simrs-vx/internal/domain/main-entities/appointment" authpartner "simrs-vx/internal/domain/main-entities/auth-partner" chemo "simrs-vx/internal/domain/main-entities/chemo" @@ -16,6 +17,8 @@ import ( consultation "simrs-vx/internal/domain/main-entities/consultation" controlletter "simrs-vx/internal/domain/main-entities/control-letter" counter "simrs-vx/internal/domain/main-entities/counter" + cpmcuorder "simrs-vx/internal/domain/main-entities/cp-mcu-order" + cpmcuorderitem "simrs-vx/internal/domain/main-entities/cp-mcu-order-item" deathcause "simrs-vx/internal/domain/main-entities/death-cause" device "simrs-vx/internal/domain/main-entities/device" deviceorder "simrs-vx/internal/domain/main-entities/device-order" @@ -68,6 +71,8 @@ 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" + micromcuorder "simrs-vx/internal/domain/main-entities/micro-mcu-order" + micromcuorderitem "simrs-vx/internal/domain/main-entities/micro-mcu-order-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" @@ -88,6 +93,8 @@ import ( procedureroomorderitem "simrs-vx/internal/domain/main-entities/procedure-room-order-item" proceduresrc "simrs-vx/internal/domain/main-entities/procedure-src" province "simrs-vx/internal/domain/main-entities/province" + radiologymcuorder "simrs-vx/internal/domain/main-entities/radiology-mcu-order" + radiologymcuorderitem "simrs-vx/internal/domain/main-entities/radiology-mcu-order-item" regency "simrs-vx/internal/domain/main-entities/regency" rehab "simrs-vx/internal/domain/main-entities/rehab" responsibledoctorhist "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" @@ -201,6 +208,13 @@ func getMainEntities() []any { &mcuorderitem.McuOrderItem{}, &mcusubsrc.McuSubSrc{}, &mcuordersubitem.McuOrderSubItem{}, + &apmcuorder.ApMcuOrder{}, + &radiologymcuorder.RadiologyMcuOrder{}, + &radiologymcuorderitem.RadiologyMcuOrderItem{}, + &cpmcuorder.CpMcuOrder{}, + &cpmcuorderitem.CpMcuOrderItem{}, + µmcuorder.MicroMcuOrder{}, + µmcuorderitem.MicroMcuOrderItem{}, &antibioticsrccategory.AntibioticSrcCategory{}, &antibioticinuse.AntibioticInUse{}, &consultation.Consultation{}, diff --git a/internal/use-case/main-use-case/ap-mcu-order/case.go b/internal/use-case/main-use-case/ap-mcu-order/case.go new file mode 100644 index 00000000..845b8eeb --- /dev/null +++ b/internal/use-case/main-use-case/ap-mcu-order/case.go @@ -0,0 +1,276 @@ +package apmcuorder + +import ( + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" + "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 = "device" + +func Create(input e.CreateDto) (*d.Data, error) { + data := e.ApMcuOrder{} + + 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.ApMcuOrder + var dataList []e.ApMcuOrder + 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.ApMcuOrder + 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.ApMcuOrder + 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.ApMcuOrder + 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/ap-mcu-order/helper.go b/internal/use-case/main-use-case/ap-mcu-order/helper.go new file mode 100644 index 00000000..4b91b7aa --- /dev/null +++ b/internal/use-case/main-use-case/ap-mcu-order/helper.go @@ -0,0 +1,27 @@ +/* +DESCRIPTION: +Any functions that are used internally by the use-case +*/ +package apmcuorder + +import ( + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" +) + +func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ApMcuOrder) { + var inputSrc *e.CreateDto + if inputT, ok := any(input).(*e.CreateDto); ok { + inputSrc = inputT + } else { + inputTemp := any(input).(*e.UpdateDto) + inputSrc = &inputTemp.CreateDto + } + + data.Substances = inputSrc.Substances + data.Fictations = inputSrc.Fictations + data.Localization = inputSrc.Localization + data.ClinicalDiagnoses = inputSrc.ClinicalDiagnoses + data.Stadium = inputSrc.Stadium + data.PastHistory = inputSrc.PastHistory + data.CurrentHistory = inputSrc.CurrentHistory +} diff --git a/internal/use-case/main-use-case/ap-mcu-order/lib.go b/internal/use-case/main-use-case/ap-mcu-order/lib.go new file mode 100644 index 00000000..8b6d8a74 --- /dev/null +++ b/internal/use-case/main-use-case/ap-mcu-order/lib.go @@ -0,0 +1,140 @@ +package apmcuorder + +import ( + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" + + 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.ApMcuOrder, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + data := e.ApMcuOrder{} + 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.ApMcuOrder, *e.MetaDto, error) { + pl.SetLogInfo(event, input, "started", "DBReadList") + data := []e.ApMcuOrder{} + 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.ApMcuOrder{}). + 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.ApMcuOrder, error) { + pl.SetLogInfo(event, input, "started", "DBReadDetail") + data := e.ApMcuOrder{} + + 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.ApMcuOrder, 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.ApMcuOrder, 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/ap-mcu-order/middleware-runner.go b/internal/use-case/main-use-case/ap-mcu-order/middleware-runner.go new file mode 100644 index 00000000..dc7f2495 --- /dev/null +++ b/internal/use-case/main-use-case/ap-mcu-order/middleware-runner.go @@ -0,0 +1,103 @@ +package apmcuorder + +import ( + e "simrs-vx/internal/domain/main-entities/ap-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.ApMcuOrder) 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.ApMcuOrder) 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.ApMcuOrder) 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.ApMcuOrder) 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.ApMcuOrder) 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/ap-mcu-order/middleware.go b/internal/use-case/main-use-case/ap-mcu-order/middleware.go new file mode 100644 index 00000000..38161afe --- /dev/null +++ b/internal/use-case/main-use-case/ap-mcu-order/middleware.go @@ -0,0 +1,9 @@ +package apmcuorder + +// 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/ap-mcu-order/tycovar.go b/internal/use-case/main-use-case/ap-mcu-order/tycovar.go new file mode 100644 index 00000000..7f301ff1 --- /dev/null +++ b/internal/use-case/main-use-case/ap-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 apmcuorder + +import ( + "gorm.io/gorm" + + e "simrs-vx/internal/domain/main-entities/ap-mcu-order" +) + +type createMw struct { + Name string + Func func(input *e.CreateDto, data *e.ApMcuOrder, tx *gorm.DB) error +} + +type readListMw struct { + Name string + Func func(input *e.ReadListDto, data *e.ApMcuOrder, tx *gorm.DB) error +} + +type readDetailMw struct { + Name string + Func func(input *e.ReadDetailDto, data *e.ApMcuOrder, 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/chemo-plan/case.go b/internal/use-case/main-use-case/chemo-plan/case.go index eda5a526..f58f19ca 100644 --- a/internal/use-case/main-use-case/chemo-plan/case.go +++ b/internal/use-case/main-use-case/chemo-plan/case.go @@ -157,9 +157,9 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) { }, nil } -func Update(input ep.UpdateDto) (*d.Data, error) { - rdDto := e.ReadListDto{FilterDto: e.FilterDto{Parent_Id: &input.Id}} - var data []e.ChemoPlan +func Update(input e.UpdateDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.ChemoPlan var err error event := pl.Event{ @@ -172,7 +172,7 @@ func Update(input ep.UpdateDto) (*d.Data, error) { err = dg.I.Transaction(func(tx *gorm.DB) error { pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail") - if data, _, err = ReadListData(rdDto, &event, tx); err != nil { + if data, err = ReadDetailData(rdDto, &event, tx); err != nil { return err } @@ -194,7 +194,7 @@ func Update(input ep.UpdateDto) (*d.Data, error) { "structure": "single-data", "status": "updated", }, - Data: e.ToResponseList(data), + Data: data.ToResponse(), }, nil } diff --git a/internal/use-case/main-use-case/chemo-plan/helper.go b/internal/use-case/main-use-case/chemo-plan/helper.go index b9dcca60..6a072ea3 100644 --- a/internal/use-case/main-use-case/chemo-plan/helper.go +++ b/internal/use-case/main-use-case/chemo-plan/helper.go @@ -5,31 +5,32 @@ Any functions that are used internally by the use-case package chemo_plan import ( - ere "simrs-vx/internal/domain/references/encounter" - e "simrs-vx/internal/domain/main-entities/chemo-plan" ep "simrs-vx/internal/domain/main-entities/chemo-protocol" + ere "simrs-vx/internal/domain/references/encounter" + "time" ) -func setData[T *ep.CreateDto | *ep.UpdateDto](input T, data []e.ChemoPlan) { - var inputSrc *ep.CreateDto - if inputT, ok := any(input).(*ep.CreateDto); ok { - inputSrc = inputT - } else { - inputTemp := any(input).(*ep.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - for _, cp := range *inputSrc.ChemoPlans { +func setDataCreate(input *ep.CreateDto) (data []e.ChemoPlan) { + for _, c := range *input.ChemoPlans { data = append(data, e.ChemoPlan{ - Parent_Id: inputSrc.Chemo_Id, - Protocol_Id: inputSrc.Id, - SeriesNumber: cp.SeriesNumber, - CycleNumber: cp.CycleNumber, - PlanDate: cp.PlanDate, + Parent_Id: input.Chemo_Id, + Protocol_Id: input.Id, + SeriesNumber: c.SeriesNumber, + CycleNumber: c.CycleNumber, + PlanDate: c.PlanDate, }) } status := ere.SPCPlanned data[0].Status = &status + return +} + +func setDataUpdate(data *e.ChemoPlan) { + now := time.Now() + data.RealizationDate = &now + + status := ere.SPCComplete + data.Status = &status } diff --git a/internal/use-case/main-use-case/chemo-plan/lib.go b/internal/use-case/main-use-case/chemo-plan/lib.go index 3b40325a..3dee0130 100644 --- a/internal/use-case/main-use-case/chemo-plan/lib.go +++ b/internal/use-case/main-use-case/chemo-plan/lib.go @@ -19,8 +19,7 @@ import ( func CreateData(input *ep.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.ChemoPlan, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") - data := []e.ChemoPlan{} - setData(input, data) + data := setDataCreate(input) var tx *gorm.DB if len(dbx) > 0 { @@ -99,9 +98,9 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(input *ep.UpdateDto, data []e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateData(data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - setData(input, data) + setDataUpdate(data) var tx *gorm.DB if len(dbx) > 0 { diff --git a/internal/use-case/main-use-case/chemo-protocol/case.go b/internal/use-case/main-use-case/chemo-protocol/case.go index 793ab06b..38e6ba4b 100644 --- a/internal/use-case/main-use-case/chemo-protocol/case.go +++ b/internal/use-case/main-use-case/chemo-protocol/case.go @@ -14,9 +14,11 @@ import ( erc "simrs-vx/internal/domain/references/common" + ec "simrs-vx/internal/domain/main-entities/chemo" e "simrs-vx/internal/domain/main-entities/chemo-protocol" ee "simrs-vx/internal/domain/main-entities/encounter" + uc "simrs-vx/internal/use-case/main-use-case/chemo" ucp "simrs-vx/internal/use-case/main-use-case/chemo-plan" ue "simrs-vx/internal/use-case/main-use-case/encounter" ) @@ -46,6 +48,21 @@ func Create(input e.CreateDto) (*d.Data, error) { input.Status_Code = erc.DVCNew } + // get chemo + dataChemo, err := uc.ReadDetailData(ec.ReadDetailDto{Id: *input.Chemo_Id}, &event) + if err != nil { + return nil, err + } + + if dataChemo.Status_Code != erc.DVCVerified { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-validation-fail", + Detail: "chemo must be verified", + } + return nil, pl.SetLogError(&event, input) + } + err = dg.I.Transaction(func(tx *gorm.DB) error { // Insert Chemo-Protocol if resData, err := CreateData(input, &event, tx); err != nil { @@ -55,6 +72,7 @@ func Create(input e.CreateDto) (*d.Data, error) { } // Insert Chemo-Plans + input.Id = &data.Id if data.ChemoPlans, err = ucp.CreateData(&input, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/chemo-protocol/helper.go b/internal/use-case/main-use-case/chemo-protocol/helper.go index 28082ba9..b3989d98 100644 --- a/internal/use-case/main-use-case/chemo-protocol/helper.go +++ b/internal/use-case/main-use-case/chemo-protocol/helper.go @@ -60,30 +60,6 @@ func getChemoEncounterReg(event *pl.Event) (*ec.Chemo, error) { return &data, nil } -func getChemoFromLatestEncounter(event *pl.Event) (*ec.Chemo, error) { - pl.SetLogInfo(event, nil, "started", "DBReadChemoFromLatestEncounter") - data := ec.Chemo{} - - var tx = dg.I - - if err := tx.Model(&ec.Chemo{}). - Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). - Joins(`LEFT JOIN "Ambulatory" "a" ON "a"."Encounter_Id" = "e"."Id"`). - Where(`"a"."Class_Code" IN (?)"`, []string{string(ere.ACCReg), string(ere.ACCChemo)}). - Where(`"Chemo"."Status_Code" = ?`, erc.DVCVerified). - Scopes(gh.Preload("Encounter.Ambulatory")). - Order("\"Chemo\".\"CreatedAt\" DESC"). - First(&data). - Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - func getChemoEncounter(encounterId *uint, event *pl.Event) (*ec.Chemo, error) { pl.SetLogInfo(event, encounterId, "started", "DBReadChemoEncounter") data := ec.Chemo{} diff --git a/internal/use-case/main-use-case/chemo-protocol/lib.go b/internal/use-case/main-use-case/chemo-protocol/lib.go index 22e8808c..abb19224 100644 --- a/internal/use-case/main-use-case/chemo-protocol/lib.go +++ b/internal/use-case/main-use-case/chemo-protocol/lib.go @@ -2,7 +2,6 @@ package chemo_protocol import ( "errors" - plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -58,7 +57,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") - if err := tx.Find(&data).Error; err != nil { + if err := tx.Debug().Find(&data).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, &meta, nil } diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index ebf1c7d8..3bf68d7c 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -2,19 +2,20 @@ package soapi import ( "errors" - erc "simrs-vx/internal/domain/references/common" - esync "simrs-vx/internal/domain/sync-entities/log" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" "strconv" - e "simrs-vx/internal/domain/main-entities/soapi" - 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" + + erc "simrs-vx/internal/domain/references/common" + + e "simrs-vx/internal/domain/main-entities/soapi" + esync "simrs-vx/internal/domain/sync-entities/log" + + ucp "simrs-vx/internal/use-case/main-use-case/chemo-plan" ) const source = "soapi" @@ -41,13 +42,25 @@ func Create(input e.CreateDto) (*d.Data, error) { return nil, pl.SetLogError(&event, input) } - err := dg.I.Transaction(func(tx *gorm.DB) error { + chemoPlan, err := validateIfEncounterIsChemo(*input.Encounter_Id, &event) + if err != nil { + return nil, err + } + + err = dg.I.Transaction(func(tx *gorm.DB) error { if resData, err := CreateData(input, &event, tx); err != nil { return err } else { data = *resData } + // update chemoPlan + if chemoPlan != nil { + if err = ucp.UpdateData(chemoPlan, &event, tx); err != nil { + return err + } + } + // get detail for sync soapiData, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, diff --git a/internal/use-case/main-use-case/soapi/helper.go b/internal/use-case/main-use-case/soapi/helper.go index c42b95d0..dc251882 100644 --- a/internal/use-case/main-use-case/soapi/helper.go +++ b/internal/use-case/main-use-case/soapi/helper.go @@ -5,6 +5,21 @@ Any functions that are used internally by the use-case package soapi import ( + "errors" + "fmt" + erc "simrs-vx/internal/domain/references/common" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + "time" + + dg "github.com/karincake/apem/db-gorm-pg" + "gorm.io/gorm" + + ere "simrs-vx/internal/domain/references/encounter" + + ecpl "simrs-vx/internal/domain/main-entities/chemo-plan" + ecp "simrs-vx/internal/domain/main-entities/chemo-protocol" + ee "simrs-vx/internal/domain/main-entities/encounter" e "simrs-vx/internal/domain/main-entities/soapi" ) @@ -39,3 +54,96 @@ func setBulkData(input []e.CreateDto, encounterId uint) []e.Soapi { return data } + +func validateIfEncounterIsChemo(encounterId uint, event *pl.Event) (*ecpl.ChemoPlan, error) { + // get encounter + enc, err := getEncounter(encounterId, event) + if err != nil { + return nil, err + } + + // Encounter must be Ambulatory and NOT Rehab + a := enc.Ambulatory + if enc.Class_Code != ere.ECAmbulatory || a == nil || a.Class_Code == ere.ACCRehab { + return nil, nil + } + + // get chemo protocol + chemo, err := getChemo(*enc.Patient_Id, event) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, nil + } + return nil, pl.SetLogError(event, nil) + } + + if chemo.Status_Code != erc.DVCVerified { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-not-match", + Detail: fmt.Sprintf("protocol chemo not yet verified"), + } + } + + now := time.Now() + if now.Before(*chemo.StartDate) || now.After(*chemo.EndDate) { + return nil, nil + } + + // --- 3. Must have at least one ChemoPlan --- + if chemo.ChemoPlans == nil || len(*chemo.ChemoPlans) == 0 { + return nil, nil + } + + // Return the first chemo plan + return &(*chemo.ChemoPlans)[0], nil +} + +func getEncounter(encounterId uint, event *pl.Event) (*ee.Encounter, error) { + pl.SetLogInfo(event, nil, "started", "getEncounter") + data := ee.Encounter{} + + var tx = dg.I + + if err := tx.Model(&ee.Encounter{}). + Where(`"Encounter_Id" = ?`, encounterId). + Scopes(withConditionalAmbulatory()). + First(&data).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, nil, encounterId); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} + +func withConditionalAmbulatory() func(db *gorm.DB) *gorm.DB { + return func(db *gorm.DB) *gorm.DB { + return db.Preload(`"Ambulatory"`, func(db *gorm.DB) *gorm.DB { + return db.Joins(`JOIN "Encounter" e ON "e"."Id" = "Ambulatory"."Encounter_Id"`) + }) + } +} + +func getChemo(patientId uint, event *pl.Event) (*ecp.ChemoProtocol, error) { + pl.SetLogInfo(event, nil, "started", "getChemoFromEncounter") + data := ecp.ChemoProtocol{} + + var tx = dg.I + + tx = tx.Model(&ecp.ChemoProtocol{}). + Joins(`"ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`). + Where(`"Patient.Id" = ? AND (cp.Status = ? OR cp.Status IS NULL)`, patientId, ere.SPCPlanned). + Preload("ChemoPlans", func(db *gorm.DB) *gorm.DB { + return tx.Order(`"Id" ASC`).Limit(1) + }). + First(&data) + + if err := tx.Error; err != nil { + return nil, err + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} From 45d883e0b748dcc0809417899135e52e187609d1 Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 9 Dec 2025 12:11:05 +0700 Subject: [PATCH 05/31] fail chemo ongoing --- .../domain/main-entities/chemo-plan/dto.go | 8 +- internal/domain/main-entities/chemo/dto.go | 3 + .../domain/main-entities/encounter/dto.go | 2 +- .../use-case/main-use-case/chemo-plan/case.go | 4 +- .../main-use-case/chemo-plan/helper.go | 4 +- .../use-case/main-use-case/chemo-plan/lib.go | 2 +- .../main-use-case/encounter/helper.go | 231 +++--------------- .../use-case/main-use-case/encounter/lib.go | 8 +- internal/use-case/main-use-case/soapi/case.go | 3 +- .../use-case/main-use-case/soapi/helper.go | 2 +- 10 files changed, 62 insertions(+), 205 deletions(-) diff --git a/internal/domain/main-entities/chemo-plan/dto.go b/internal/domain/main-entities/chemo-plan/dto.go index 04be0ebc..d83af082 100644 --- a/internal/domain/main-entities/chemo-plan/dto.go +++ b/internal/domain/main-entities/chemo-plan/dto.go @@ -18,6 +18,7 @@ type CreateDto struct { RealizationDate *time.Time `json:"realizationDate"` Notes *string `json:"notes"` Status ere.StatusProtocolChemo `json:"status"` + Encounter_Id *uint `json:"encounter_id"` } type ReadListDto struct { @@ -45,6 +46,11 @@ type DeleteDto struct { Id uint `json:"id"` } +type FailDto struct { + Id uint `json:"id"` + Reasons *string `json:"reason"` +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` @@ -71,7 +77,7 @@ func (d ChemoPlan) ToResponse() ResponseDto { PlanDate: d.PlanDate, RealizationDate: d.RealizationDate, Notes: d.Notes, - Status: *d.Status, + Status: d.Status, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index 695c1ca7..a6cab3d7 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -2,6 +2,8 @@ package chemo import ( ed "simrs-vx/internal/domain/main-entities/doctor" + ere "simrs-vx/internal/domain/references/encounter" + // std "time" @@ -22,6 +24,7 @@ type CreateDto struct { Encounter_Id *uint `json:"encounter_id"` Status_Code erc.DataVerifiedCode `json:"status_code"` SrcUnit_Code *string `json:"srcUnit_code"` + Class_Code ere.ChemoClassCode `json:"class_code"` } type ReadListDto struct { diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 1a9aa2e6..35dc50dc 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -118,7 +118,7 @@ type FilterDto struct { MedicalDischargeEducation *string `json:"medicalDischargeEducation"` AdmDischargeEducation *string `json:"admDischargeEducation"` DischargeReason *string `json:"dischargeReason"` - SubProcess *string `json:"subProcess"` + ChemoClass *ere.ChemoClassCode `json:"chemo-class"` } type ReadDetailDto struct { diff --git a/internal/use-case/main-use-case/chemo-plan/case.go b/internal/use-case/main-use-case/chemo-plan/case.go index f58f19ca..99ef3a63 100644 --- a/internal/use-case/main-use-case/chemo-plan/case.go +++ b/internal/use-case/main-use-case/chemo-plan/case.go @@ -176,7 +176,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } - if err := UpdateData(&input, data, &event, tx); err != nil { + if err := UpdateData(data, &event, tx); err != nil { return err } @@ -252,3 +252,5 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Fail(i) diff --git a/internal/use-case/main-use-case/chemo-plan/helper.go b/internal/use-case/main-use-case/chemo-plan/helper.go index 6a072ea3..dedacfd8 100644 --- a/internal/use-case/main-use-case/chemo-plan/helper.go +++ b/internal/use-case/main-use-case/chemo-plan/helper.go @@ -23,7 +23,7 @@ func setDataCreate(input *ep.CreateDto) (data []e.ChemoPlan) { } status := ere.SPCPlanned - data[0].Status = &status + data[0].Status = status return } @@ -32,5 +32,5 @@ func setDataUpdate(data *e.ChemoPlan) { data.RealizationDate = &now status := ere.SPCComplete - data.Status = &status + data.Status = status } diff --git a/internal/use-case/main-use-case/chemo-plan/lib.go b/internal/use-case/main-use-case/chemo-plan/lib.go index 3dee0130..b90430cd 100644 --- a/internal/use-case/main-use-case/chemo-plan/lib.go +++ b/internal/use-case/main-use-case/chemo-plan/lib.go @@ -116,7 +116,7 @@ func UpdateData(data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { Detail: "Database update failed", Raw: err, } - return pl.SetLogError(event, input) + return pl.SetLogError(event, data) } pl.SetLogInfo(event, nil, "complete") diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 7f263bfe..6fc28632 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -7,7 +7,7 @@ package encounter import ( "errors" "fmt" - un "simrs-vx/internal/use-case/main-use-case/nurse" + "strings" "time" @@ -24,9 +24,9 @@ import ( ere "simrs-vx/internal/domain/references/encounter" erg "simrs-vx/internal/domain/references/organization" - eaeh "simrs-vx/internal/domain/main-entities/adm-employee-hist" ea "simrs-vx/internal/domain/main-entities/ambulatory" ec "simrs-vx/internal/domain/main-entities/chemo" + ecpl "simrs-vx/internal/domain/main-entities/chemo-plan" edo "simrs-vx/internal/domain/main-entities/device-order" ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/emergency" @@ -42,12 +42,9 @@ import ( ep "simrs-vx/internal/domain/main-entities/prescription" epi "simrs-vx/internal/domain/main-entities/prescription-item" er "simrs-vx/internal/domain/main-entities/rehab" - erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" es "simrs-vx/internal/domain/main-entities/soapi" eu "simrs-vx/internal/domain/main-entities/unit" - // udo "simrs-vx/internal/use-case/main-use-case/device-order" - uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist" ua "simrs-vx/internal/use-case/main-use-case/ambulatory" uc "simrs-vx/internal/use-case/main-use-case/chemo" ud "simrs-vx/internal/use-case/main-use-case/doctor" @@ -58,10 +55,10 @@ import ( umi "simrs-vx/internal/use-case/main-use-case/medicine-mix" ummi "simrs-vx/internal/use-case/main-use-case/medicine-mix-item" _ "simrs-vx/internal/use-case/main-use-case/nurse" + un "simrs-vx/internal/use-case/main-use-case/nurse" up "simrs-vx/internal/use-case/main-use-case/prescription" upi "simrs-vx/internal/use-case/main-use-case/prescription-item" ur "simrs-vx/internal/use-case/main-use-case/rehab" - urdh "simrs-vx/internal/use-case/main-use-case/responsible-doctor-hist" us "simrs-vx/internal/use-case/main-use-case/soapi" ) @@ -396,192 +393,6 @@ func getMcuOrders(encounter_id uint, event *pl.Event, tx *gorm.DB) error { return nil } -func upsertResponsibleDoctorHist(input erdh.CreateDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - var latest erdh.ResponsibleDoctorHist - err := tx. - Where("\"Encounter_Id\" = ?", input.Encounter_Id). - Order("\"CreatedAt\" DESC"). - Limit(1). - First(&latest).Error - - switch { - case errors.Is(err, gorm.ErrRecordNotFound): - // Insert - if _, err = urdh.CreateData(input, event, tx); err != nil { - return err - } - case err != nil: - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "read-fail", - Detail: "Failed to read responsible doctor history", - Raw: err, - } - return pl.SetLogError(event, input) - default: - // Update - if err := tx.Model(&latest).Updates(map[string]interface{}{ - "Doctor_Code": input.Doctor_Code, - "StartedAt": input.StartedAt, - "UpdatedAt": time.Now(), - }).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "update-fail", - Detail: "Failed to update responsible doctor history", - Raw: err, - } - return pl.SetLogError(event, input) - } - } - pl.SetLogInfo(event, input, "complete") - return nil -} - -func upsertAdmEmployeeHist(input eaeh.CreateDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - var latest eaeh.AdmEmployeeHist - err := tx. - Where("\"Encounter_Id\" = ?", input.Encounter_Id). - Order("\"CreatedAt\" DESC"). - Limit(1). - First(&latest).Error - - switch { - case errors.Is(err, gorm.ErrRecordNotFound): - // Insert - if _, err = uaeh.CreateData(input, event, tx); err != nil { - return err - } - case err != nil: - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "read-fail", - Detail: "Failed to read responsible doctor history", - Raw: err, - } - return pl.SetLogError(event, input) - - default: - // Update - if err := tx.Model(&latest).Updates(map[string]interface{}{ - "Employee_Id": input.Employee_Id, - "StartedAt": input.StartedAt, - "UpdatedAt": time.Now(), - }).Error; err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "update-fail", - Detail: "Failed to update responsible doctor history", - Raw: err, - } - return pl.SetLogError(event, input) - } - } - pl.SetLogInfo(event, input, "complete") - - return nil -} - -func updateLatestResponsibleDoctorHist(input e.CheckinDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, "started", "DBUpdate") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - subQuery := tx. - Select("\"Id\""). - Model(&erdh.ResponsibleDoctorHist{}). - Where("\"Encounter_Id\" = ?", input.Id). - Order("\"CreatedAt\" DESC"). - Limit(1) - - result := tx. - Model(&erdh.ResponsibleDoctorHist{}). - Where("\"Id\" = (?)", subQuery). - Update("\"FinishedAt\"", input.FinishedAt) - - if result.Error != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-update-fail", - Detail: "Database update failed", - Raw: result.Error, - } - return pl.SetLogError(event, input) - } - - if result.RowsAffected == 0 { - pl.SetLogInfo(event, input, "no previous data found to update") - return nil - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} - -func updateLatestAdmEmployeeHist(input e.CheckinDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, "started", "DBUpdate") - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - subQuery := tx. - Select("\"Id\""). - Model(&eaeh.AdmEmployeeHist{}). - Where("\"Encounter_Id\" = ?", input.Id). - Order("\"CreatedAt\" DESC"). - Limit(1) - - result := tx. - Model(&eaeh.AdmEmployeeHist{}). - Where("\"Id\" = (?)", subQuery). - Update("\"FinishedAt\"", input.FinishedAt) - - if result.Error != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-update-fail", - Detail: "Database update failed", - Raw: result.Error, - } - return pl.SetLogError(event, input) - } - - if result.RowsAffected == 0 { - pl.SetLogInfo(event, input, "no previous data found to update") - return nil - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} - func getSoapiByResponsibleDoctor(enc e.Encounter, event *pl.Event) (data []es.Soapi, err error) { pl.SetLogInfo(event, enc, "started", "DBReadList") @@ -856,6 +667,7 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e Encounter_Id: &input.Id, Status_Code: erc.DVCVerified, SrcUnit_Code: input.Unit_Code, + Class_Code: ere.CCCAct, } // create data chemo @@ -864,6 +676,12 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e return err } + // set chemo-plan to planned + _, err = updateChemoPlan(*input.Patient_Id, event, tx) + if err != nil { + return err + } + case subCode == ere.ACCRehab: rehabData := er.CreateDto{ Encounter_Id: &input.Id, @@ -1056,3 +874,32 @@ func validateDoctorCodes(doctorCodes map[string]struct{}, event *pl.Event) error return nil } + +func updateChemoPlan(patientId uint, event *pl.Event, dbx ...*gorm.DB) (*ecpl.ChemoPlan, error) { + pl.SetLogInfo(event, nil, "started", "getChemoFromEncounter") + data := ecpl.ChemoPlan{} + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + tx = tx.Model(&ecpl.ChemoPlan{}). + Joins(`"ChemoProtocol" cp ON cp."Id" = "ChemoPlan"."Protocol_Id"`). + Where(`cp."Patient_Id" = ? AND ("ChemoPlan"."Status" IS NULL OR "ChemoPlan"."Status" = ?)`, patientId, ere.SPCSchedule). + Order(`"Id" ASC`). + Limit(1).First(&data) + + if err := tx.Error; err != nil { + return nil, err + } + + if err := tx.Model(&data).Update(`"Status"`, ere.SPCPlanned).Error; err != nil { + return nil, err + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index 674a84a4..a54c2f03 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -93,11 +93,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En tx = tx.Where("\"Encounter\".\"PaymentMethod_Code\" = ?", *input.PaymentMethod_Code) } - if input.SubProcess != nil { - switch *input.SubProcess { - case "chemo": - tx = tx.Joins(`RIGHT JOIN "Chemo" "c" ON "c"."Encounter_Id" = "Encounter"."Id"`) - } + if input.ChemoClass != nil { + tx = tx.Joins(`RIGHT JOIN "Chemo" "c" ON "c"."Encounter_Id" = "Encounter"."Id"`). + Where(`"c"."Class_Code" = ?`, *input.ChemoClass) } // count diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index 3bf68d7c..6b93fd8a 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -56,11 +56,12 @@ func Create(input e.CreateDto) (*d.Data, error) { // update chemoPlan if chemoPlan != nil { + chemoPlan.Encounter_Id = input.Encounter_Id if err = ucp.UpdateData(chemoPlan, &event, tx); err != nil { return err } } - + // get detail for sync soapiData, err := ReadDetailData(e.ReadDetailDto{ Id: data.Id, diff --git a/internal/use-case/main-use-case/soapi/helper.go b/internal/use-case/main-use-case/soapi/helper.go index dc251882..7d5e7825 100644 --- a/internal/use-case/main-use-case/soapi/helper.go +++ b/internal/use-case/main-use-case/soapi/helper.go @@ -134,7 +134,7 @@ func getChemo(patientId uint, event *pl.Event) (*ecp.ChemoProtocol, error) { tx = tx.Model(&ecp.ChemoProtocol{}). Joins(`"ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`). - Where(`"Patient.Id" = ? AND (cp.Status = ? OR cp.Status IS NULL)`, patientId, ere.SPCPlanned). + Where(`"Patient.Id" = ? AND cp."Status" = ?`, patientId, ere.SPCPlanned). Preload("ChemoPlans", func(db *gorm.DB) *gorm.DB { return tx.Order(`"Id" ASC`).Limit(1) }). From ecdf270738b0eaf98694ed736bbb66888bcb8ce2 Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 9 Dec 2025 12:27:47 +0700 Subject: [PATCH 06/31] ongoing --- .../domain/main-entities/chemo-plan/dto.go | 4 ++ .../use-case/main-use-case/chemo-plan/case.go | 42 ++++++++++++++++++- .../main-use-case/chemo-plan/helper.go | 10 +++++ .../use-case/main-use-case/chemo-plan/lib.go | 25 +++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) diff --git a/internal/domain/main-entities/chemo-plan/dto.go b/internal/domain/main-entities/chemo-plan/dto.go index d83af082..1e8d4bb9 100644 --- a/internal/domain/main-entities/chemo-plan/dto.go +++ b/internal/domain/main-entities/chemo-plan/dto.go @@ -50,6 +50,10 @@ type FailDto struct { Id uint `json:"id"` Reasons *string `json:"reason"` } +type FailReason struct { + Date *time.Time `json:"date"` + FailReason *string `json:"failReason"` +} type MetaDto struct { PageNumber int `json:"page_number"` diff --git a/internal/use-case/main-use-case/chemo-plan/case.go b/internal/use-case/main-use-case/chemo-plan/case.go index 99ef3a63..6a4c426e 100644 --- a/internal/use-case/main-use-case/chemo-plan/case.go +++ b/internal/use-case/main-use-case/chemo-plan/case.go @@ -253,4 +253,44 @@ func Delete(input e.DeleteDto) (*d.Data, error) { } -func Fail(i) +func Fail(input e.FailDto) (*d.Data, error) { + rdDto := e.ReadDetailDto{Id: input.Id} + var data *e.ChemoPlan + var err error + + event := pl.Event{ + Feature: "Chemo-Fail", + 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 err := UpdateData(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": "updated", + }, + Data: data.ToResponse(), + }, nil + +} diff --git a/internal/use-case/main-use-case/chemo-plan/helper.go b/internal/use-case/main-use-case/chemo-plan/helper.go index dedacfd8..f1b6179d 100644 --- a/internal/use-case/main-use-case/chemo-plan/helper.go +++ b/internal/use-case/main-use-case/chemo-plan/helper.go @@ -5,6 +5,7 @@ Any functions that are used internally by the use-case package chemo_plan import ( + "encoding/json" e "simrs-vx/internal/domain/main-entities/chemo-plan" ep "simrs-vx/internal/domain/main-entities/chemo-protocol" ere "simrs-vx/internal/domain/references/encounter" @@ -34,3 +35,12 @@ func setDataUpdate(data *e.ChemoPlan) { status := ere.SPCComplete data.Status = status } + +func setDatafail(input e.FailDto, data *e.ChemoPlan) { + data.RealizationDate = nil + data.Status = ere.SPCSchedule + + var reasons []e.FailReason + + _ := json.Unmarshal(data.Re) +} diff --git a/internal/use-case/main-use-case/chemo-plan/lib.go b/internal/use-case/main-use-case/chemo-plan/lib.go index b90430cd..92d7c8eb 100644 --- a/internal/use-case/main-use-case/chemo-plan/lib.go +++ b/internal/use-case/main-use-case/chemo-plan/lib.go @@ -145,3 +145,28 @@ func DeleteData(data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func UpdateFailData(input e.FailDto, data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { + pl.SetLogInfo(event, data, "started", "DBUpdate") + setDataUpdate(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, data) + } + + pl.SetLogInfo(event, nil, "complete") + return nil +} From be34c66ffd643a9e628407e34421379fe3fb2a82 Mon Sep 17 00:00:00 2001 From: vanilia Date: Tue, 9 Dec 2025 15:07:01 +0700 Subject: [PATCH 07/31] on going chemo plan --- .../use-case/main-use-case/chemo-plan/case.go | 41 ++++++--- .../main-use-case/chemo-plan/helper.go | 50 +++++++++-- .../main-use-case/encounter/helper.go | 85 ++++++++++++++++--- .../use-case/main-use-case/soapi/helper.go | 39 ++++++--- 4 files changed, 172 insertions(+), 43 deletions(-) diff --git a/internal/use-case/main-use-case/chemo-plan/case.go b/internal/use-case/main-use-case/chemo-plan/case.go index 6a4c426e..7f74b6f7 100644 --- a/internal/use-case/main-use-case/chemo-plan/case.go +++ b/internal/use-case/main-use-case/chemo-plan/case.go @@ -1,17 +1,17 @@ package chemo_plan import ( - erc "simrs-vx/internal/domain/references/common" + ere "simrs-vx/internal/domain/references/encounter" + 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" - - pl "simrs-vx/pkg/logger" - pu "simrs-vx/pkg/use-case-helper" - "gorm.io/gorm" + erc "simrs-vx/internal/domain/references/common" + e "simrs-vx/internal/domain/main-entities/chemo-plan" ep "simrs-vx/internal/domain/main-entities/chemo-protocol" ) @@ -266,12 +266,33 @@ func Fail(input e.FailDto) (*d.Data, error) { // 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, err = ReadDetailData(rdDto, &event); err != nil { + return nil, err + } + dataSoapi, err := getSoapiByEncounterId(*data.Encounter_Id, &event) + if err != nil { + return nil, err + } + + if dataSoapi != nil && len(*dataSoapi) > 0 { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "soapi-exist", + Detail: "cancel soapi to proceed", + } + return nil, pl.SetLogError(&event, data) + } + + if data.Status != ere.SPCPlanned { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "invalid-chemo-status", + Detail: "only chemo plans with status 'planned' can be deleted.", + } + } + + err = dg.I.Transaction(func(tx *gorm.DB) error { if err := UpdateData(data, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/chemo-plan/helper.go b/internal/use-case/main-use-case/chemo-plan/helper.go index f1b6179d..5cf7ffd5 100644 --- a/internal/use-case/main-use-case/chemo-plan/helper.go +++ b/internal/use-case/main-use-case/chemo-plan/helper.go @@ -6,12 +6,21 @@ package chemo_plan import ( "encoding/json" + pl "simrs-vx/pkg/logger" + pu "simrs-vx/pkg/use-case-helper" + "time" + + dg "github.com/karincake/apem/db-gorm-pg" + + ere "simrs-vx/internal/domain/references/encounter" + e "simrs-vx/internal/domain/main-entities/chemo-plan" ep "simrs-vx/internal/domain/main-entities/chemo-protocol" - ere "simrs-vx/internal/domain/references/encounter" - "time" + es "simrs-vx/internal/domain/main-entities/soapi" ) +var now = time.Now() + func setDataCreate(input *ep.CreateDto) (data []e.ChemoPlan) { for _, c := range *input.ChemoPlans { data = append(data, e.ChemoPlan{ @@ -22,14 +31,10 @@ func setDataCreate(input *ep.CreateDto) (data []e.ChemoPlan) { PlanDate: c.PlanDate, }) } - - status := ere.SPCPlanned - data[0].Status = status return } func setDataUpdate(data *e.ChemoPlan) { - now := time.Now() data.RealizationDate = &now status := ere.SPCComplete @@ -42,5 +47,36 @@ func setDatafail(input e.FailDto, data *e.ChemoPlan) { var reasons []e.FailReason - _ := json.Unmarshal(data.Re) + if data.Reasons != nil { + json.Unmarshal([]byte(*data.Reasons), &reasons) + } + + reasons = append(reasons, e.FailReason{ + FailReason: input.Reasons, + Date: &now, + }) + + if b, err := json.Marshal(reasons); err == nil { + jsonStr := string(b) + data.Reasons = &jsonStr + } +} + +func getSoapiByEncounterId(encounterId uint, event *pl.Event) (*[]es.Soapi, error) { + pl.SetLogInfo(event, encounterId, "started", "DBReadDetail") + var data []es.Soapi + + var tx = dg.I + + if err := tx. + Model(&es.Soapi{}). + Where(`"Encounter_Id" = ?`, encounterId). + Find(&data).Error; err != nil { + if processedErr := pu.HandleReadError(err, event, source, encounterId, data); processedErr != nil { + return nil, processedErr + } + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil } diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 6fc28632..a4632296 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -7,7 +7,6 @@ package encounter import ( "errors" "fmt" - "strings" "time" @@ -27,6 +26,7 @@ import ( ea "simrs-vx/internal/domain/main-entities/ambulatory" ec "simrs-vx/internal/domain/main-entities/chemo" ecpl "simrs-vx/internal/domain/main-entities/chemo-plan" + ecp "simrs-vx/internal/domain/main-entities/chemo-protocol" edo "simrs-vx/internal/domain/main-entities/device-order" ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/emergency" @@ -663,6 +663,20 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e switch { case subCode == ere.ACCChemo: + // validate if encounter Chemo valid + chemoProtoc, err := validateChemoAdm(*input.Patient_Id, event) + if err != nil { + return err + } + + if chemoProtoc == nil { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-not-found", + Detail: "chemo plan not found", + } + } + chemoCreate := ec.CreateDto{ Encounter_Id: &input.Id, Status_Code: erc.DVCVerified, @@ -677,7 +691,7 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e } // set chemo-plan to planned - _, err = updateChemoPlan(*input.Patient_Id, event, tx) + err = updateChemoPlan(chemoProtoc, event, tx) if err != nil { return err } @@ -875,10 +889,8 @@ func validateDoctorCodes(doctorCodes map[string]struct{}, event *pl.Event) error return nil } -func updateChemoPlan(patientId uint, event *pl.Event, dbx ...*gorm.DB) (*ecpl.ChemoPlan, error) { +func updateChemoPlan(data *ecpl.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "started", "getChemoFromEncounter") - data := ecpl.ChemoPlan{} - var tx *gorm.DB if len(dbx) > 0 { tx = dbx[0] @@ -886,20 +898,65 @@ func updateChemoPlan(patientId uint, event *pl.Event, dbx ...*gorm.DB) (*ecpl.Ch tx = dg.I } - tx = tx.Model(&ecpl.ChemoPlan{}). - Joins(`"ChemoProtocol" cp ON cp."Id" = "ChemoPlan"."Protocol_Id"`). - Where(`cp."Patient_Id" = ? AND ("ChemoPlan"."Status" IS NULL OR "ChemoPlan"."Status" = ?)`, patientId, ere.SPCSchedule). - Order(`"Id" ASC`). - Limit(1).First(&data) - - if err := tx.Error; err != nil { - return nil, err + if err := tx.Model(&data).Update(`"Status"`, ere.SPCPlanned).Error; err != nil { + return err } - if err := tx.Model(&data).Update(`"Status"`, ere.SPCPlanned).Error; err != nil { + pl.SetLogInfo(event, nil, "complete") + return nil +} + +func getChemoProtocol(patientId uint, event *pl.Event) (*ecp.ChemoProtocol, error) { + pl.SetLogInfo(event, nil, "started", "getChemoProtocol") + data := ecp.ChemoProtocol{} + + var tx = dg.I + + tx = tx.Model(&ecp.ChemoProtocol{}). + Joins(`"ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`). + Where(`"Patient.Id" = ? AND cp."Status" IS NULL`, patientId). + Preload("ChemoPlans", func(db *gorm.DB) *gorm.DB { + return tx.Order(`"Id" ASC`).Limit(1) + }). + First(&data) + + if err := tx.Error; err != nil { return nil, err } pl.SetLogInfo(event, nil, "complete") return &data, nil } + +func validateChemoAdm(patientId uint, event *pl.Event) (*ecpl.ChemoPlan, error) { + // get chemo protocol + chemo, err := getChemoProtocol(patientId, event) + if err != nil { + return nil, err + } + + if chemo.Status_Code != erc.DVCVerified { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-not-match", + Detail: fmt.Sprintf("protocol chemo not yet verified"), + } + return nil, pl.SetLogError(event, chemo) + } + + if now.Before(*chemo.StartDate) || now.After(*chemo.EndDate) { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "invalid-date-range", + Detail: "chemo cannot be performed because the current date is outside the allowed treatment window.", + } + return nil, pl.SetLogError(event, chemo) + } + + if chemo.ChemoPlans == nil || len(*chemo.ChemoPlans) == 0 { + return nil, nil + } + + // Return the first chemo plan + return &(*chemo.ChemoPlans)[0], nil +} diff --git a/internal/use-case/main-use-case/soapi/helper.go b/internal/use-case/main-use-case/soapi/helper.go index 7d5e7825..24f87465 100644 --- a/internal/use-case/main-use-case/soapi/helper.go +++ b/internal/use-case/main-use-case/soapi/helper.go @@ -77,20 +77,10 @@ func validateIfEncounterIsChemo(encounterId uint, event *pl.Event) (*ecpl.ChemoP return nil, pl.SetLogError(event, nil) } - if chemo.Status_Code != erc.DVCVerified { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-not-match", - Detail: fmt.Sprintf("protocol chemo not yet verified"), - } + if err = chemoProtocoValidation(chemo, event); err != nil { + } - now := time.Now() - if now.Before(*chemo.StartDate) || now.After(*chemo.EndDate) { - return nil, nil - } - - // --- 3. Must have at least one ChemoPlan --- if chemo.ChemoPlans == nil || len(*chemo.ChemoPlans) == 0 { return nil, nil } @@ -99,6 +89,31 @@ func validateIfEncounterIsChemo(encounterId uint, event *pl.Event) (*ecpl.ChemoP return &(*chemo.ChemoPlans)[0], nil } +func chemoProtocoValidation(chemo *ecp.ChemoProtocol, event *pl.Event) error { + if chemo.Status_Code != erc.DVCVerified { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-not-match", + Detail: fmt.Sprintf("protocol chemo not yet verified"), + } + + return pl.SetLogError(event, chemo) + } + + now := time.Now() + if now.Before(*chemo.StartDate) || now.After(*chemo.EndDate) { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "invalid-date-range", + Detail: "chemo cannot be performed because the current date is outside the allowed treatment window.", + } + + return pl.SetLogError(event, chemo) + } + + return nil +} + func getEncounter(encounterId uint, event *pl.Event) (*ee.Encounter, error) { pl.SetLogInfo(event, nil, "started", "getEncounter") data := ee.Encounter{} From 2e70cd727c9eb5730bef2ac30c468c39ba5f7ccb Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 11 Dec 2025 15:29:01 +0700 Subject: [PATCH 08/31] feat (encounter): create-with-patient wip --- .../domain/main-entities/encounter/dto.go | 5 + .../main-handler/encounter/handler.go | 26 ++++ .../interface/main-handler/main-handler.go | 1 + .../use-case/main-use-case/encounter/case.go | 143 ++++++++++++++++++ .../encounter/middleware-runner.go | 19 +++ .../main-use-case/encounter/tycovar.go | 7 + .../use-case/main-use-case/patient/case.go | 27 ++-- 7 files changed, 218 insertions(+), 10 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 324501e4..9265978b 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -297,3 +297,8 @@ func ToResponseList(data []Encounter) []ResponseDto { } return resp } + +type CreateWithPatientDto struct { + Encounter CreateDto `json:"encounter"` + Patient ep.CreateDto `json:"patient"` +} diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index 7ac31393..c6a02ba9 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -312,3 +312,29 @@ func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) { res, err := u.CancelSwitchUnit(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) CreateWithPatient(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.CreateWithPatientDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + + // validate SubClass + if err := verifyClassCode(dto.Encounter); err != nil { + rw.DataResponse(w, nil, d.FieldError{ + Code: dataValidationFail, + Message: err.Error(), + }) + return + } + + dto.Encounter.AuthInfo = *authInfo + dto.Patient.AuthInfo = *authInfo + res, err := u.CreateWithPatient(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 f6f6bfce..c47ae37d 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -197,6 +197,7 @@ func SetRoutes() http.Handler { "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchUnit, "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchUnit, "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchUnit, + "POST /create-with-patient": encounter.O.CreateWithPatient, }) hk.GroupRoutes("/v1/mcu-order", r, auth.GuardMW, hk.MapHandlerFunc{ "GET /": mcuorder.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 62a7c992..3b966ef9 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -22,12 +22,14 @@ import ( edc "simrs-vx/internal/domain/main-entities/death-cause" e "simrs-vx/internal/domain/main-entities/encounter" eir "simrs-vx/internal/domain/main-entities/internal-reference" + ep "simrs-vx/internal/domain/main-entities/patient" es "simrs-vx/internal/domain/main-entities/soapi" esync "simrs-vx/internal/domain/sync-entities/log" uv "simrs-vx/internal/use-case/bpjs-use-case/vclaim-reference" udc "simrs-vx/internal/use-case/main-use-case/death-cause" uir "simrs-vx/internal/use-case/main-use-case/internal-reference" + up "simrs-vx/internal/use-case/main-use-case/patient" us "simrs-vx/internal/use-case/main-use-case/soapi" ) @@ -1075,3 +1077,144 @@ func validateAuth(a auth.AuthInfo, roleAllowed []string, action string, event *p return nil } + +func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) { + var ( + data e.Encounter + recentSoapiDataforCopy []es.CreateDto + err error + ) + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + + roleAllowed := []string{string(erg.EPCReg)} + err = validateAuth(input.Encounter.AuthInfo, roleAllowed, "create-encounter", &event) + if err != nil { + return nil, err + } + + // validate rehab by bpjs + if input.Encounter.RefTypeCode == ere.RTCBpjs && + input.Encounter.Class_Code == ere.ECAmbulatory && + ere.AmbulatoryClassCode(*input.Encounter.SubClass_Code) == ere.ACCRehab { + // get latest rehab data + recentRehabData, err := getLatestRehabData(input.Encounter, &event) + if err != nil { + return nil, err + } + + // If recentRehabData is nil, then visitMode_Code = "adm" + if recentRehabData != nil { + // If recentRehabData is not nil, determine the visitMode_Code: + // If the mode is "series", verify whether the visit count still remains + // and whether the series has not expired. + // If visitMode is "series", then get encounterAdm + input.Encounter.VisitMode_Code, input.Encounter.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input.Encounter, &event) + if err != nil { + return nil, err + } + } else { + input.Encounter.VisitMode_Code = ere.VMCAdm + } + + // When visitMode_Code is "series", load the associated SOAPI record to copy its values. + if input.Encounter.VisitMode_Code == ere.VMCSeries { + // get data soapi + recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.Encounter.RecentEncounterAdm, &event) + if err != nil { + return nil, err + } + } + } + + // check if patient is new in the hospital + input.Encounter.NewStatus, err = identifyPatientStatus(input.Encounter) + if err != nil { + return nil, err + } + input.Encounter.Adm_Employee_Id = input.Encounter.AuthInfo.Employee_Id + + mwRunner := newMiddlewareRunner(&event, input.Encounter.Sync) + + err = dg.I.Transaction(func(tx *gorm.DB) error { + // create patient + var patientId uint + patientData, err := up.Create(input.Patient, tx) + if err != nil { + return err + } + + if patientData != nil { + patientId = patientData.Data.(*ep.Patient).Id + } + + // create encounter + input.Encounter.Patient_Id = &patientId + if resData, err := CreateData(input.Encounter, &event, tx); err != nil { + return err + } else { + data = *resData + input.Encounter.Id = data.Id + } + + // insert ambulatory/emergency/inpatient + err = insertdataClassCode(input.Encounter, recentSoapiDataforCopy, &event, tx) + if err != nil { + return err + } + + // insert vclaimReference + if vr := input.Encounter.VclaimReference; vr != nil { + t, _ := time.Parse("2006-01-02", vr.TglRujukan) + _, err = uv.CreateData(ev.CreateDto{ + Encounter_Id: &data.Id, + Date: &t, + SrcCode: input.Encounter.Ref_Number, + SrcName: input.Encounter.RefSource_Name, + Number: &vr.NoSep}, &event, tx) + if err != nil { + return err + } + } + + dataEncounter, err := ReadDetailData(e.ReadDetailDto{ + Id: data.Id, + Includes: "Adm_Employee.User,Adm_Employee.Person," + + "Patient.Person.Relatives," + + "Patient.Person.VclaimMember,VclaimReference," + + "Patient.Person.Contacts,Patient.Person.Addresses"}, + &event, tx) + if err != nil { + return err + } + + mwRunner.setMwType(pu.MWTPre) + // Run pre-middleware + if err := mwRunner.RunCreateWithPatientMiddleware(createWithPatientPreMw, dataEncounter); err != nil { + return err + } + + return nil + }) + + if err = runLogMiddleware(err, input, mwRunner); err != nil { + return nil, err + } + + pl.SetLogInfo(&event, nil, "complete") + + 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/encounter/middleware-runner.go b/internal/use-case/main-use-case/encounter/middleware-runner.go index da62fdb6..3ee19355 100644 --- a/internal/use-case/main-use-case/encounter/middleware-runner.go +++ b/internal/use-case/main-use-case/encounter/middleware-runner.go @@ -259,3 +259,22 @@ func (me *middlewareRunner) RunCancelSwitchUnitMiddleware(middleware cancelSwitc func (me *middlewareRunner) setMwType(mwType pu.MWType) { me.MwType = mwType } + +func (me *middlewareRunner) RunCreateWithPatientMiddleware(middlewares []createWithPatientMw, input *e.Encounter) error { + if !me.SyncOn { + return nil + } + + for _, middleware := range middlewares { + logData := pu.GetLogData(input, nil) + + pl.SetLogInfo(me.Event, logData, "started", middleware.Name) + + if err := middleware.Func(input); err != nil { + return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + } + return nil +} diff --git a/internal/use-case/main-use-case/encounter/tycovar.go b/internal/use-case/main-use-case/encounter/tycovar.go index 2b268378..376baed8 100644 --- a/internal/use-case/main-use-case/encounter/tycovar.go +++ b/internal/use-case/main-use-case/encounter/tycovar.go @@ -74,6 +74,11 @@ type cancelSwitchUnitMw struct { Func func(input *e.ApproveCancelUnitDto) error } +type createWithPatientMw struct { + Name string + Func func(input *e.Encounter) error +} + type UpdateMw = updateMw type DeleteMw = deleteMw @@ -94,3 +99,5 @@ var updatestatusEncounter []updateStatusMw var requestSwitchEncounter requestSwitchUnitMw var approveSwitchEncounter approveSwitchUnitMw var cancelSwitchEncounter cancelSwitchUnitMw +var createWithPatientPreMw []createWithPatientMw +var createWithPatientPostMw []createWithPatientMw diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 5180137b..ec518fe4 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -27,7 +27,7 @@ import ( const source = "patient" -func Create(input e.CreateDto) (*d.Data, error) { +func Create(input e.CreateDto, dbx ...*gorm.DB) (*d.Data, error) { data := e.Patient{} event := pl.Event{ @@ -35,6 +35,13 @@ func Create(input e.CreateDto) (*d.Data, error) { Source: source, } + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + // Start log pl.SetLogInfo(&event, input, "started", "create") mwRunner := newMiddlewareRunner(&event, input.Sync) @@ -51,7 +58,7 @@ func Create(input e.CreateDto) (*d.Data, error) { input.RegisteredBy_User_Name = &input.AuthInfo.User_Name - err := dg.I.Transaction(func(tx *gorm.DB) error { + err := tx.Transaction(func(tx1 *gorm.DB) error { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil { @@ -65,14 +72,14 @@ func Create(input e.CreateDto) (*d.Data, error) { } input.Number = nomr - if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx); err != nil { + if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx1); err != nil { return err } else { input.Person_Id = person_id } if input.Person.VclaimMember_CardNumber != nil && input.Person.ResidentIdentityNumber != nil { - if err := uvm.CreateOrUpdateData(evm.CreateDto{CardNumber: input.Person.VclaimMember_CardNumber, Person_Id: input.Person_Id}, &event, tx); err != nil { + if err := uvm.CreateOrUpdateData(evm.CreateDto{CardNumber: input.Person.VclaimMember_CardNumber, Person_Id: input.Person_Id}, &event, tx1); err != nil { return err } } @@ -80,38 +87,38 @@ func Create(input e.CreateDto) (*d.Data, error) { for idx := range input.PersonAddresses { input.PersonAddresses[idx].Person_Id = *input.Person_Id } - if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx); err != nil { + if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx1); 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 { + if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx1); err != nil { return err } for idx := range input.PersonRelatives { input.PersonRelatives[idx].Person_Id = *input.Person_Id } - if err := upr.CreateOrUpdateBatch(input.PersonRelatives, &event, tx); err != nil { + if err := upr.CreateOrUpdateBatch(input.PersonRelatives, &event, tx1); err != nil { 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 { + if err := upi.CreateOrUpdateBatch(input.PersonInsurances, &event, tx1); err != nil { return err } - if resData, err := CreateData(input, &event, tx); err != nil { + if resData, err := CreateData(input, &event, tx1); err != nil { return err } else { data = *resData } - dataPatient, err := ReadDetailData(e.ReadDetailDto{Id: uint16(data.Id)}, &event, tx) + dataPatient, err := ReadDetailData(e.ReadDetailDto{Id: uint16(data.Id)}, &event, tx1) if err != nil { return err } From 4214bd00bd41a0453b78d12f5443c1857aca9423 Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Thu, 11 Dec 2025 15:40:07 +0700 Subject: [PATCH 09/31] feat/dockerize: added assets --- Dockerfile-main-api | 1 + Dockerfile-simgos-sync-api | 1 + 2 files changed, 2 insertions(+) diff --git a/Dockerfile-main-api b/Dockerfile-main-api index 0c75acfa..ea038869 100644 --- a/Dockerfile-main-api +++ b/Dockerfile-main-api @@ -7,6 +7,7 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/main-api/main-api ./cmd/main-api/ FROM alpine:latest WORKDIR /app +COPY --from=builder /src/assets . COPY --from=builder /src/cmd/main-api/main-api . COPY --from=builder /src/cmd/main-api/config.yml . EXPOSE 8000 diff --git a/Dockerfile-simgos-sync-api b/Dockerfile-simgos-sync-api index 35660a2f..efb675db 100644 --- a/Dockerfile-simgos-sync-api +++ b/Dockerfile-simgos-sync-api @@ -7,6 +7,7 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/simgos-sync-api/simgos-sync-api . FROM alpine:latest WORKDIR /app +COPY --from=builder /src/assets . COPY --from=builder /src/cmd/simgos-sync-api/simgos-sync-api . COPY --from=builder /src/cmd/simgos-sync-api/config.yml . EXPOSE 8000 From 4a62316548a22a9ea16f0b64c834532530f1a1b9 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Thu, 11 Dec 2025 15:51:55 +0700 Subject: [PATCH 10/31] feat (encounter): create-with-patient done, tested with positif case only --- internal/use-case/main-use-case/encounter/case.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 3b966ef9..b4001156 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -1151,7 +1151,7 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) { } if patientData != nil { - patientId = patientData.Data.(*ep.Patient).Id + patientId = patientData.Data.(ep.ResponseDto).Id } // create encounter From c7f2876e6e0e43fefbe54d477cb123c47b068805 Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Thu, 11 Dec 2025 16:43:14 +0700 Subject: [PATCH 11/31] dev: chore, moved Dockerfile* to example --- .gitignore | 2 ++ Dockerfile-main-api => Dockerfile-main-api-example | 2 +- Dockerfile-simgos-sync-api => Dockerfile-sync-api-example | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) rename Dockerfile-main-api => Dockerfile-main-api-example (96%) rename Dockerfile-simgos-sync-api => Dockerfile-sync-api-example (97%) diff --git a/.gitignore b/.gitignore index 7800ac94..4c10eb38 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,8 @@ go.work.sum # env file .env config.yml +Dockerfile-main-api +Dockerfile-sync-api **/atlas.hcl !**/atlas.hcl.example diff --git a/Dockerfile-main-api b/Dockerfile-main-api-example similarity index 96% rename from Dockerfile-main-api rename to Dockerfile-main-api-example index ea038869..cb8839b9 100644 --- a/Dockerfile-main-api +++ b/Dockerfile-main-api-example @@ -10,5 +10,5 @@ WORKDIR /app COPY --from=builder /src/assets . COPY --from=builder /src/cmd/main-api/main-api . COPY --from=builder /src/cmd/main-api/config.yml . -EXPOSE 8000 +EXPOSE 8010 CMD ["./main-api"] diff --git a/Dockerfile-simgos-sync-api b/Dockerfile-sync-api-example similarity index 97% rename from Dockerfile-simgos-sync-api rename to Dockerfile-sync-api-example index efb675db..5b32d522 100644 --- a/Dockerfile-simgos-sync-api +++ b/Dockerfile-sync-api-example @@ -10,5 +10,5 @@ WORKDIR /app COPY --from=builder /src/assets . COPY --from=builder /src/cmd/simgos-sync-api/simgos-sync-api . COPY --from=builder /src/cmd/simgos-sync-api/config.yml . -EXPOSE 8000 +EXPOSE 8011 CMD ["./simgos-sync-api"] From 261f3cdeb358c6d1f40dde804d1c2221ab921285 Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Thu, 11 Dec 2025 17:51:08 +0700 Subject: [PATCH 12/31] refactor/unit-dropping: done --- .../migrations/20251211101547.sql | 36 +++ cmd/main-migration/migrations/atlas.sum | 5 +- internal/domain/main-entities/chemo/dto.go | 19 +- internal/domain/main-entities/chemo/entity.go | 6 +- .../domain/main-entities/consultation/dto.go | 54 ++-- .../main-entities/consultation/entity.go | 16 +- .../main-entities/control-letter/dto.go | 5 - .../main-entities/control-letter/entity.go | 3 - internal/domain/main-entities/doctor/dto.go | 5 - .../domain/main-entities/doctor/entity.go | 3 - .../domain/main-entities/encounter/dto.go | 12 +- .../domain/main-entities/encounter/entity.go | 3 - .../main-entities/internal-reference/dto.go | 48 +-- .../internal-reference/entity.go | 26 +- internal/domain/main-entities/nurse/dto.go | 54 ++-- internal/domain/main-entities/nurse/entity.go | 20 +- .../main-entities/practice-schedule/dto.go | 40 +-- .../main-entities/practice-schedule/entity.go | 18 +- .../procedure-room/base/entity.go | 1 - .../main-entities/procedure-room/dto.go | 7 - .../main-entities/procedure-room/entity.go | 2 - .../domain/main-entities/specialist/dto.go | 20 +- .../domain/main-entities/specialist/entity.go | 16 +- .../unit-position/base/entity.go | 20 -- .../domain/main-entities/unit-position/dto.go | 85 ----- .../main-entities/unit-position/entity.go | 11 - internal/domain/main-entities/unit/dto.go | 82 ----- internal/domain/main-entities/unit/entity.go | 18 -- .../main-handler/encounter/handler.go | 20 +- .../encounter/request-validation.go | 4 +- .../interface/main-handler/main-handler.go | 10 +- .../main-handler/unit-position/handler.go | 71 ---- .../interface/main-handler/unit/handler.go | 73 ----- internal/interface/migration/main-entities.go | 4 - .../new/encounter/handler.go | 16 +- .../simgos-sync-handler/new/unit/handler.go | 67 ---- .../simgos-sync-handler.go | 8 +- .../main-use-case/authentication/helper.go | 40 +-- .../use-case/main-use-case/chemo/helper.go | 2 +- .../main-use-case/consultation/case.go | 4 +- .../main-use-case/consultation/helper.go | 2 +- .../main-use-case/control-letter/helper.go | 1 - .../use-case/main-use-case/doctor/helper.go | 1 - .../use-case/main-use-case/encounter/case.go | 32 +- .../main-use-case/encounter/helper.go | 24 +- .../use-case/main-use-case/encounter/lib.go | 8 +- .../encounter/middleware-runner.go | 6 +- .../main-use-case/encounter/middleware.go | 6 +- .../main-use-case/encounter/tycovar.go | 16 +- .../use-case/main-use-case/infra/helper.go | 1 - .../internal-reference/helper.go | 16 +- .../main-use-case/internal-reference/lib.go | 2 +- .../use-case/main-use-case/nurse/helper.go | 2 +- .../main-use-case/practice-schedule/helper.go | 2 +- .../main-use-case/procedure-room/helper.go | 1 - .../main-use-case/specialist/helper.go | 2 +- .../main-use-case/unit-position/case.go | 302 ------------------ .../main-use-case/unit-position/helper.go | 25 -- .../main-use-case/unit-position/lib.go | 156 --------- .../unit-position/middleware-runner.go | 103 ------ .../main-use-case/unit-position/middleware.go | 9 - .../main-use-case/unit-position/tycovar.go | 44 --- internal/use-case/main-use-case/unit/case.go | 280 ---------------- .../use-case/main-use-case/unit/helper.go | 23 -- internal/use-case/main-use-case/unit/lib.go | 149 --------- .../main-use-case/unit/middleware-runner.go | 148 --------- .../use-case/main-use-case/unit/middleware.go | 20 -- .../use-case/main-use-case/unit/tycovar.go | 61 ---- internal/use-case/main-use-case/user/case.go | 21 +- .../new/encounter/plugin.go | 6 +- .../simgos-sync-plugin/new/unit/plugin.go | 37 --- .../use-case/simgos-sync-plugin/old/.keep | 0 .../new/encounter/case.go | 18 +- .../new/encounter/helper.go | 4 +- .../new/internal-reference/helper.go | 6 +- .../new/internal-reference/lib.go | 2 +- .../simgos-sync-use-case/new/unit/case.go | 198 ------------ .../simgos-sync-use-case/new/unit/helper.go | 62 ---- .../simgos-sync-use-case/new/unit/lib.go | 188 ----------- .../new/unit/middleware-runner.go | 104 ------ .../new/unit/middleware.go | 9 - .../simgos-sync-use-case/new/unit/tycovar.go | 44 --- 82 files changed, 330 insertions(+), 2765 deletions(-) create mode 100644 cmd/main-migration/migrations/20251211101547.sql delete mode 100644 internal/domain/main-entities/unit-position/base/entity.go delete mode 100644 internal/domain/main-entities/unit-position/dto.go delete mode 100644 internal/domain/main-entities/unit-position/entity.go delete mode 100644 internal/domain/main-entities/unit/dto.go delete mode 100644 internal/domain/main-entities/unit/entity.go delete mode 100644 internal/interface/main-handler/unit-position/handler.go delete mode 100644 internal/interface/main-handler/unit/handler.go delete mode 100644 internal/interface/simgos-sync-handler/new/unit/handler.go delete mode 100644 internal/use-case/main-use-case/unit-position/case.go delete mode 100644 internal/use-case/main-use-case/unit-position/helper.go delete mode 100644 internal/use-case/main-use-case/unit-position/lib.go delete mode 100644 internal/use-case/main-use-case/unit-position/middleware-runner.go delete mode 100644 internal/use-case/main-use-case/unit-position/middleware.go delete mode 100644 internal/use-case/main-use-case/unit-position/tycovar.go delete mode 100644 internal/use-case/main-use-case/unit/case.go delete mode 100644 internal/use-case/main-use-case/unit/helper.go delete mode 100644 internal/use-case/main-use-case/unit/lib.go delete mode 100644 internal/use-case/main-use-case/unit/middleware-runner.go delete mode 100644 internal/use-case/main-use-case/unit/middleware.go delete mode 100644 internal/use-case/main-use-case/unit/tycovar.go delete mode 100644 internal/use-case/simgos-sync-plugin/new/unit/plugin.go create mode 100644 internal/use-case/simgos-sync-plugin/old/.keep delete mode 100644 internal/use-case/simgos-sync-use-case/new/unit/case.go delete mode 100644 internal/use-case/simgos-sync-use-case/new/unit/helper.go delete mode 100644 internal/use-case/simgos-sync-use-case/new/unit/lib.go delete mode 100644 internal/use-case/simgos-sync-use-case/new/unit/middleware-runner.go delete mode 100644 internal/use-case/simgos-sync-use-case/new/unit/middleware.go delete mode 100644 internal/use-case/simgos-sync-use-case/new/unit/tycovar.go diff --git a/cmd/main-migration/migrations/20251211101547.sql b/cmd/main-migration/migrations/20251211101547.sql new file mode 100644 index 00000000..c24aab8d --- /dev/null +++ b/cmd/main-migration/migrations/20251211101547.sql @@ -0,0 +1,36 @@ +-- Modify "Specialist" table +ALTER TABLE "public"."Specialist" DROP COLUMN "Unit_Code"; +-- Rename a column from "SrcUnit_Code" to "Specialist_Code" +ALTER TABLE "public"."Chemo" RENAME COLUMN "SrcUnit_Code" TO "Specialist_Code"; +-- Modify "Chemo" table +ALTER TABLE "public"."Chemo" DROP CONSTRAINT "fk_Chemo_SrcUnit", ADD CONSTRAINT "fk_Chemo_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "Doctor" table +ALTER TABLE "public"."Doctor" DROP COLUMN "Unit_Code"; +-- Rename a column from "DstUnit_Code" to "Specialist_Code" +ALTER TABLE "public"."Consultation" RENAME COLUMN "DstUnit_Code" TO "Specialist_Code"; +-- Rename a column from "DstDoctor_Code" to "Doctor_Code" +ALTER TABLE "public"."Consultation" RENAME COLUMN "DstDoctor_Code" TO "Doctor_Code"; +-- Modify "Consultation" table +ALTER TABLE "public"."Consultation" DROP CONSTRAINT "fk_Consultation_DstDoctor", DROP CONSTRAINT "fk_Consultation_DstUnit", ADD CONSTRAINT "fk_Consultation_Doctor" FOREIGN KEY ("Doctor_Code") REFERENCES "public"."Doctor" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION, ADD CONSTRAINT "fk_Consultation_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Rename a column from "Unit_Code" to "Specialist_Code" +ALTER TABLE "public"."InternalReference" RENAME COLUMN "Unit_Code" TO "Specialist_Code"; +-- Modify "InternalReference" table +ALTER TABLE "public"."InternalReference" DROP CONSTRAINT "fk_InternalReference_Unit", ADD CONSTRAINT "fk_InternalReference_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Rename a column from "Unit_Code" to "Specialist_Code" +ALTER TABLE "public"."Nurse" RENAME COLUMN "Unit_Code" TO "Specialist_Code"; +-- Modify "Nurse" table +ALTER TABLE "public"."Nurse" DROP CONSTRAINT "fk_Nurse_Unit", ADD CONSTRAINT "fk_Nurse_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Rename a column from "Unit_Code" to "Specialist_Code" +ALTER TABLE "public"."PracticeSchedule" RENAME COLUMN "Unit_Code" TO "Specialist_Code"; +-- Modify "PracticeSchedule" table +ALTER TABLE "public"."PracticeSchedule" DROP CONSTRAINT "fk_PracticeSchedule_Unit", ADD CONSTRAINT "fk_PracticeSchedule_Specialist" FOREIGN KEY ("Specialist_Code") REFERENCES "public"."Specialist" ("Code") ON UPDATE NO ACTION ON DELETE NO ACTION; +-- Modify "ControlLetter" table +ALTER TABLE "public"."ControlLetter" DROP COLUMN "Unit_Code"; +-- Modify "Encounter" table +ALTER TABLE "public"."Encounter" DROP COLUMN "Unit_Code"; +-- Modify "ProcedureRoom" table +ALTER TABLE "public"."ProcedureRoom" DROP COLUMN "Unit_Code"; +-- Drop "UnitPosition" table +DROP TABLE "public"."UnitPosition"; +-- Drop "Unit" table +DROP TABLE "public"."Unit"; diff --git a/cmd/main-migration/migrations/atlas.sum b/cmd/main-migration/migrations/atlas.sum index ca21de20..40d1acc3 100644 --- a/cmd/main-migration/migrations/atlas.sum +++ b/cmd/main-migration/migrations/atlas.sum @@ -1,4 +1,4 @@ -h1:nDEuOqs0hKLyxdzKDcaNhEkrmnmbm6o/jgoGigw47bo= +h1:B4Ghh1AyZG5WD/79iuFWUIRiik0xl2zgtiWRWJ/prTU= 20250904105930.sql h1:MEM6blCgke9DzWQSTnLzasbPIrcHssNNrJqZpSkEo6k= 20250904141448.sql h1:J8cmYNk4ZrG9fhfbi2Z1IWz7YkfvhFqTzrLFo58BPY0= 20250908062237.sql h1:Pu23yEW/aKkwozHoOuROvHS/GK4ngARJGdO7FB7HZuI= @@ -160,4 +160,5 @@ h1:nDEuOqs0hKLyxdzKDcaNhEkrmnmbm6o/jgoGigw47bo= 20251209064304.sql h1:Xs73yQbuJvuQ0OnW1FAZpeytmUl/bGTlJFrwGOsTF4w= 20251209070128.sql h1:fPGE6xOV6uCiVOqnvwn2L/GsBbgp2wxgmZOhF3bSGGM= 20251209084929.sql h1:u4LPMvkGAH4RfGC2IlBTIm7T7paMHoBSvTQ0w5Br7d0= -20251210145148.sql h1:EWbK5f1QKyhaVsKZfJFunmQuw22Msl0Ox3KQ/uag2bw= +20251210145148.sql h1:rejGrnTpaygxPv06v0vxMytF4rk1OJBXaw3ttSmidgc= +20251211101547.sql h1:rRb5Azkx3yvOYIGIXiuAYU26gviETwWarfAaiQY+FLk= diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index 461203d2..fa3bd8a5 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -2,7 +2,7 @@ package chemo import ( ed "simrs-vx/internal/domain/main-entities/doctor" - // std + es "simrs-vx/internal/domain/main-entities/specialist" "time" // internal - lib @@ -14,14 +14,13 @@ import ( // internal - domain - main-entities 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" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Status_Code erc.DataVerifiedCode `json:"status_code"` - SrcUnit_Code *string `json:"srcUnit_code"` + Encounter_Id *uint `json:"encounter_id"` + Status_Code erc.DataVerifiedCode `json:"status_code"` + Specialist_Code *string `json:"specialist_code"` } type ReadListDto struct { @@ -34,7 +33,7 @@ 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_Code *string `json:"srcUnit-code"` + Specialist_Code *string `json:"specialist-code"` } type ReadDetailDto struct { @@ -75,8 +74,8 @@ type ResponseDto struct { VerifiedAt *time.Time `json:"verifiedAt"` VerifiedBy_User_Id *uint `json:"verifiedBy_user_id"` VerifiedBy *eus.User `json:"verifiedBy,omitempty"` - SrcUnit_Code *string `json:"srcUnit_code"` - SrcUnit *eun.Unit `json:"srcUnit,omitempty"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty"` Doctor_Code *string `json:"doctor_code"` Doctor *ed.Doctor `json:"doctor,omitempty"` NextChemoDate *time.Time `json:"nextChemoDate"` @@ -90,8 +89,8 @@ func (d Chemo) ToResponse() ResponseDto { VerifiedAt: d.VerifiedAt, VerifiedBy_User_Id: d.VerifiedBy_User_Id, VerifiedBy: d.VerifiedBy, - SrcUnit_Code: d.SrcUnit_Code, - SrcUnit: d.SrcUnit, + Specialist_Code: d.Specialist_Code, + Specialist: d.Specialist, Doctor_Code: d.Doctor_Code, Doctor: d.Doctor, NextChemoDate: d.NextChemoDate, diff --git a/internal/domain/main-entities/chemo/entity.go b/internal/domain/main-entities/chemo/entity.go index cc828835..b9aa58fd 100644 --- a/internal/domain/main-entities/chemo/entity.go +++ b/internal/domain/main-entities/chemo/entity.go @@ -9,7 +9,7 @@ import ( ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/encounter" - eun "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" eus "simrs-vx/internal/domain/main-entities/user" ) @@ -21,8 +21,8 @@ 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_Code *string `json:"src_unit_code"` // klinik asal - SrcUnit *eun.Unit `json:"src_unit,omitempty" gorm:"foreignKey:SrcUnit_Code;references:Code"` + Specialist_Code *string `json:"specialist_code"` // klinik asal + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` Bed *string `json:"bed" gorm:"size:1024"` Needs *string `json:"needs" gorm:"size:2048"` Doctor_Code *string `json:"doctor_code"` diff --git a/internal/domain/main-entities/consultation/dto.go b/internal/domain/main-entities/consultation/dto.go index 1b83df77..6f4740c8 100644 --- a/internal/domain/main-entities/consultation/dto.go +++ b/internal/domain/main-entities/consultation/dto.go @@ -13,14 +13,14 @@ import ( // internal - domain - main-entities ed "simrs-vx/internal/domain/main-entities/doctor" ee "simrs-vx/internal/domain/main-entities/encounter" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type CreateDto struct { - Encounter_Id *uint `json:"encounter_id"` - Date *time.Time `json:"date"` - Problem *string `json:"problem" validate:"maxLength=10240"` - DstUnit_Code *string `json:"dstUnit_code"` + Encounter_Id *uint `json:"encounter_id"` + Date *time.Time `json:"date"` + Problem *string `json:"problem" validate:"maxLength=10240"` + Specialist_Code *string `json:"dstSpecialist_code"` } type ReadListDto struct { @@ -30,9 +30,9 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter-id"` - DstUnit_Code *string `json:"dstUnit-code"` - DstDoctor_Code *string `json:"dstDoctor-code"` + Encounter_Id *uint `json:"encounter-id"` + Specialist_Code *string `json:"dstSpecialist-code"` + Doctor_Code *string `json:"doctor-code"` } type ReadDetailDto struct { @@ -63,29 +63,29 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty"` - Date *time.Time `json:"date"` - Problem *string `json:"problem"` - Solution *string `json:"solution"` - DstUnit_Code *string `json:"dstUnit_code"` - DstUnit *eu.Unit `json:"dstUnit,omitempty"` - DstDoctor_Code *string `json:"dstDoctor_code"` - DstDoctor *ed.Doctor `json:"dstDoctor,omitempty"` - RepliedAt *time.Time `json:"repliedAt"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty"` + Date *time.Time `json:"date"` + Problem *string `json:"problem"` + Solution *string `json:"solution"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Doctor_Code *string `json:"doctor_code"` + 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, - Date: d.Date, - Problem: d.Problem, - Solution: d.Solution, - DstUnit_Code: d.DstUnit_Code, - DstUnit: d.DstUnit, - DstDoctor_Code: d.DstDoctor_Code, - DstDoctor: d.DstDoctor, + Encounter_Id: d.Encounter_Id, + Encounter: d.Encounter, + Date: d.Date, + Problem: d.Problem, + Solution: d.Solution, + Specialist_Code: d.Specialist_Code, + Specialist: d.Specialist, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, } 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 b8be3596..95ba2512 100644 --- a/internal/domain/main-entities/consultation/entity.go +++ b/internal/domain/main-entities/consultation/entity.go @@ -6,7 +6,7 @@ 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" + es "simrs-vx/internal/domain/main-entities/specialist" ) type Consultation struct { @@ -15,11 +15,11 @@ type Consultation struct { Encounter *ee.Encounter `json:"encounter" gorm:"foreignKey:Encounter_Id;references:Id"` Date *time.Time `json:"date"` - Problem *string `json:"case" gorm:"size:10240"` - Solution *string `json:"solution" gorm:"size:10240"` - DstUnit_Code *string `json:"dstUnit_code"` - DstUnit *eu.Unit `json:"dstUnit" gorm:"foreignKey:DstUnit_Code;references:Code"` - DstDoctor_Code *string `json:"dstDoctor_code"` - DstDoctor *ed.Doctor `json:"dstDoctor" gorm:"foreignKey:DstDoctor_Code;references:Code"` - RepliedAt *time.Time `json:"repliedAt"` + Problem *string `json:"case" gorm:"size:10240"` + Solution *string `json:"solution" gorm:"size:10240"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist" gorm:"foreignKey:Specialist_Code;references:Code"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor" gorm:"foreignKey:Doctor_Code;references:Code"` + RepliedAt *time.Time `json:"repliedAt"` } diff --git a/internal/domain/main-entities/control-letter/dto.go b/internal/domain/main-entities/control-letter/dto.go index 87b82366..18f8020f 100644 --- a/internal/domain/main-entities/control-letter/dto.go +++ b/internal/domain/main-entities/control-letter/dto.go @@ -15,7 +15,6 @@ import ( ee "simrs-vx/internal/domain/main-entities/encounter" 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 { @@ -66,8 +65,6 @@ type ResponseDto struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Encounter *ee.Encounter `json:"encounter,omitempty"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty"` Subspecialist_Code *string `json:"subspecialist_code"` @@ -81,8 +78,6 @@ func (d ControlLetter) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Encounter: d.Encounter, - Unit_Code: d.Unit_Code, - Unit: d.Unit, Specialist_Code: d.Specialist_Code, Specialist: d.Specialist, Subspecialist_Code: d.Subspecialist_Code, diff --git a/internal/domain/main-entities/control-letter/entity.go b/internal/domain/main-entities/control-letter/entity.go index 2b8019b4..e13f5940 100644 --- a/internal/domain/main-entities/control-letter/entity.go +++ b/internal/domain/main-entities/control-letter/entity.go @@ -8,15 +8,12 @@ import ( ee "simrs-vx/internal/domain/main-entities/encounter" 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 ControlLetter 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"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit" gorm:"foreignKey:Unit_Code;references:Code"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist" gorm:"foreignKey:Specialist_Code;references:Code"` Subspecialist_Code *string `json:"subspecialist_code"` diff --git a/internal/domain/main-entities/doctor/dto.go b/internal/domain/main-entities/doctor/dto.go index c7eb0f6b..9bcbc932 100644 --- a/internal/domain/main-entities/doctor/dto.go +++ b/internal/domain/main-entities/doctor/dto.go @@ -5,7 +5,6 @@ import ( 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" "time" ) @@ -69,8 +68,6 @@ type ResponseDto struct { Employee *ee.Employee `json:"employee,omitempty"` IHS_Number *string `json:"ihs_number"` SIP_Number *string `json:"sip_number"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty" ` Subspecialist_Code *string `json:"subspecialist_code"` @@ -84,8 +81,6 @@ func (d Doctor) ToResponse() ResponseDto { Employee: d.Employee, IHS_Number: d.IHS_Number, SIP_Number: d.SIP_Number, - Unit_Code: d.Unit_Code, - Unit: d.Unit, Specialist_Code: d.Specialist_Code, Specialist: d.Specialist, Subspecialist_Code: d.Subspecialist_Code, diff --git a/internal/domain/main-entities/doctor/entity.go b/internal/domain/main-entities/doctor/entity.go index 506271a2..f5797924 100644 --- a/internal/domain/main-entities/doctor/entity.go +++ b/internal/domain/main-entities/doctor/entity.go @@ -5,7 +5,6 @@ import ( 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" "time" ) @@ -17,8 +16,6 @@ type Doctor struct { IHS_Number *string `json:"ihs_number" gorm:"unique;size:20"` SIP_Number *string `json:"sip_number" gorm:"unique;size:20"` SIP_ExpiredDate *time.Time `json:"sip_expiredDate"` - Unit_Code *string `json:"unit_code" gorm:"size:10"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` Specialist_Code *string `json:"specialist_code" gorm:"size:10"` Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` Subspecialist_Code *string `json:"subspecialist_code" gorm:"size:10"` diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 9265978b..5dcf76db 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -30,7 +30,6 @@ import ( er "simrs-vx/internal/domain/main-entities/rehab/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 CreateDto struct { @@ -39,7 +38,6 @@ type CreateDto struct { Class_Code ere.EncounterClassCode `json:"class_code" validate:"maxLength=10"` SubClass_Code *string `json:"subClass_code" validate:"maxLength=10"` // for sub Infra_Code *string `json:"infra_code"` // for inpatient - Unit_Code *string `json:"unit_code"` Specialist_Code *string `json:"specialist_code"` Subspecialist_Code *string `json:"subspecialist_code"` VisitDate time.Time `json:"visitDate"` @@ -96,7 +94,7 @@ type ReadListDto struct { EndDate *string `json:"end-date"` PaymentMethod_Code *string `json:"paymentMethod-code"` Status_Code *string `json:"status-code"` - Unit_Code *string `json:"unit-code"` + Specialist_Code *string `json:"specialist-code"` pa.AuthInfo } @@ -170,7 +168,7 @@ type CheckinDto struct { pa.AuthInfo } -type SwitchUnitDto struct { +type SwitchSpecialistDto struct { Id uint `json:"id"` PolySwitchCode *ere.PolySwitchCode `json:"polySwitchCode"` InternalReferences *[]eir.CreateDto `json:"internalReferences" validate:"required"` @@ -180,7 +178,7 @@ type SwitchUnitDto struct { pa.AuthInfo } -type ApproveCancelUnitDto struct { +type ApproveCancelSpecialistDto struct { Id uint `json:"id"` InternalReferences_Id uint `json:"internalReferences_id" validate:"required"` Dst_Doctor_Code *string `json:"dst_doctor_code"` @@ -194,12 +192,10 @@ type ResponseDto struct { Patient *ep.Patient `json:"patient,omitempty"` RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class_code"` - Unit_Code *string `json:"unit_code"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty"` Subspecialist_Code *string `json:"subspecialist_code"` Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty"` - Unit *eu.Unit `json:"unit,omitempty"` VisitDate time.Time `json:"visitDate"` PaymentMethod_Code ere.AllPaymentMethodCode `json:"paymentMethod_code"` InsuranceCompany_Code *string `json:"insuranceCompany_code"` @@ -244,8 +240,6 @@ func (d Encounter) ToResponse() ResponseDto { Patient: d.Patient, RegisteredAt: d.RegisteredAt, Class_Code: d.Class_Code, - Unit_Code: d.Unit_Code, - Unit: d.Unit, Specialist_Code: d.Specialist_Code, Specialist: d.Specialist, Subspecialist_Code: d.Subspecialist_Code, diff --git a/internal/domain/main-entities/encounter/entity.go b/internal/domain/main-entities/encounter/entity.go index 0b1da159..6bdcfa0c 100644 --- a/internal/domain/main-entities/encounter/entity.go +++ b/internal/domain/main-entities/encounter/entity.go @@ -25,7 +25,6 @@ import ( er "simrs-vx/internal/domain/main-entities/rehab/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 Encounter struct { @@ -34,8 +33,6 @@ type Encounter struct { 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_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` Subspecialist_Code *string `json:"subspecialist_code"` diff --git a/internal/domain/main-entities/internal-reference/dto.go b/internal/domain/main-entities/internal-reference/dto.go index d3771c4d..c2ceec18 100644 --- a/internal/domain/main-entities/internal-reference/dto.go +++ b/internal/domain/main-entities/internal-reference/dto.go @@ -5,17 +5,17 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type CreateDto struct { - Encounter_Id *uint `json:"-"` - Unit_Code *string `json:"unit_code"` - Doctor_Code *string `json:"doctor_code"` - Nurse_Code *string `json:"nurse_code"` - Status_Code erc.DataApprovalCode `json:"status_code"` - SrcDoctor_Code *string `json:"srcDoctor_code"` - SrcNurse_Code *string `json:"srcNurse_code"` + Encounter_Id *uint `json:"-"` + Specialist_Code *string `json:"specialist_code"` + Doctor_Code *string `json:"doctor_code"` + Nurse_Code *string `json:"nurse_code"` + Status_Code erc.DataApprovalCode `json:"status_code"` + SrcDoctor_Code *string `json:"srcDoctor_code"` + SrcNurse_Code *string `json:"srcNurse_code"` } type ReadListDto struct { @@ -25,10 +25,10 @@ type ReadListDto struct { } type FilterDto struct { - Encounter_Id *uint `json:"encounter-id"` - Unit_Code *uint `json:"unit-code"` - Doctor_Code *uint `json:"doctor-code"` - Status_Code erc.DataApprovalCode `json:"status-code"` + Encounter_Id *uint `json:"encounter-id"` + Specialist_Code *uint `json:"specialist-code"` + Doctor_Code *uint `json:"doctor-code"` + Status_Code erc.DataApprovalCode `json:"status-code"` } type ReadDetailDto struct { @@ -53,22 +53,22 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` - Doctor_Code *string `json:"doctor_id"` - Doctor *ed.Doctor `json:"doctor,omitempty"` - Status_Code *erc.DataApprovalCode `json:"status_code"` + Encounter_Id *uint `json:"encounter_id"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Doctor_Code *string `json:"doctor_id"` + Doctor *ed.Doctor `json:"doctor,omitempty"` + Status_Code *erc.DataApprovalCode `json:"status_code"` } func (d InternalReference) ToResponse() ResponseDto { resp := ResponseDto{ - Encounter_Id: d.Encounter_Id, - Unit_Code: d.Unit_Code, - Unit: d.Unit, - Doctor_Code: d.Doctor_Code, - Doctor: d.Doctor, - Status_Code: d.Status_Code, + Encounter_Id: d.Encounter_Id, + Specialist_Code: d.Specialist_Code, + Specialist: d.Specialist, + Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, + Status_Code: d.Status_Code, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/internal-reference/entity.go b/internal/domain/main-entities/internal-reference/entity.go index 90859710..15bbe5cb 100644 --- a/internal/domain/main-entities/internal-reference/entity.go +++ b/internal/domain/main-entities/internal-reference/entity.go @@ -6,21 +6,21 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" en "simrs-vx/internal/domain/main-entities/nurse" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" ) type InternalReference struct { ecore.Main - Encounter_Id *uint `json:"encounter_id"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - Doctor_Code *string `json:"doctor_code"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` - Status_Code *erc.DataApprovalCode `json:"status_code"` - SrcDoctor_Code *string `json:"srcDoctor_code"` - SrcDoctor *ed.Doctor `json:"srcDoctor,omitempty" gorm:"foreignKey:SrcDoctor_Code;references:Code"` - SrcNurse_Code *string `json:"srcNurse_code"` - SrcNurse *en.Nurse `json:"srcNurse,omitempty" gorm:"foreignKey:SrcNurse_Code;references:Code"` - Nurse_Code *string `json:"nurse_code"` - Nurse *en.Nurse `json:"nurse,omitempty" gorm:"foreignKey:Nurse_Code;references:Code"` + Encounter_Id *uint `json:"encounter_id"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Status_Code *erc.DataApprovalCode `json:"status_code"` + SrcDoctor_Code *string `json:"srcDoctor_code"` + SrcDoctor *ed.Doctor `json:"srcDoctor,omitempty" gorm:"foreignKey:SrcDoctor_Code;references:Code"` + SrcNurse_Code *string `json:"srcNurse_code"` + SrcNurse *en.Nurse `json:"srcNurse,omitempty" gorm:"foreignKey:SrcNurse_Code;references:Code"` + Nurse_Code *string `json:"nurse_code"` + Nurse *en.Nurse `json:"nurse,omitempty" gorm:"foreignKey:Nurse_Code;references:Code"` } diff --git a/internal/domain/main-entities/nurse/dto.go b/internal/domain/main-entities/nurse/dto.go index b0cd6104..4ebd3800 100644 --- a/internal/domain/main-entities/nurse/dto.go +++ b/internal/domain/main-entities/nurse/dto.go @@ -4,15 +4,15 @@ 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" + es "simrs-vx/internal/domain/main-entities/specialist" ) type CreateDto struct { - Code *string `json:"code" validate:"maxLength=20"` - Employee_Id *uint `json:"employee_id"` - IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` - Unit_Code *string `json:"unit_code"` - Infra_Code *string `json:"infra_code"` + Code *string `json:"code" validate:"maxLength=20"` + Employee_Id *uint `json:"employee_id"` + IHS_Number *string `json:"ihs_number" validate:"maxLength=20"` + Specialist_Code *string `json:"specialist_code"` + Infra_Code *string `json:"infra_code"` } type ReadListDto struct { @@ -22,11 +22,11 @@ type ReadListDto struct { } type FilterDto struct { - Code *string `json:"code"` - Employee_Id *uint `json:"employee-id"` - IHS_Number *string `json:"ihs-number"` - Unit_Code *string `json:"unit-code"` - Infra_Code *string `json:"infra-code"` + Code *string `json:"code"` + Employee_Id *uint `json:"employee-id"` + IHS_Number *string `json:"ihs-number"` + Specialist_Code *string `json:"specialist-code"` + Infra_Code *string `json:"infra-code"` } type ReadDetailDto struct { Id *uint16 `json:"id"` @@ -53,26 +53,26 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Code *string `json:"code"` - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty"` - IHS_Number *string `json:"ihs_number"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` - Infra_Code *string `json:"infra_code"` - Infra *ei.Infra `json:"infra,omitempty"` + Code *string `json:"code"` + Employee_Id *uint `json:"employee_id"` + Employee *ee.Employee `json:"employee,omitempty"` + IHS_Number *string `json:"ihs_number"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty"` + Infra_Code *string `json:"infra_code"` + Infra *ei.Infra `json:"infra,omitempty"` } func (d Nurse) ToResponse() ResponseDto { resp := ResponseDto{ - Code: d.Code, - Employee_Id: d.Employee_Id, - Employee: d.Employee, - IHS_Number: d.IHS_Number, - Unit_Code: d.Unit_Code, - Unit: d.Unit, - Infra_Code: d.Infra_Code, - Infra: d.Infra, + Code: d.Code, + Employee_Id: d.Employee_Id, + Employee: d.Employee, + IHS_Number: d.IHS_Number, + Specialist_Code: d.Specialist_Code, + Specialist: d.Specialist, + Infra_Code: d.Infra_Code, + 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 cb1df0a8..adb14c10 100644 --- a/internal/domain/main-entities/nurse/entity.go +++ b/internal/domain/main-entities/nurse/entity.go @@ -4,17 +4,17 @@ 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" + es "simrs-vx/internal/domain/main-entities/specialist" ) type Nurse struct { - ecore.Main // adjust this according to the needs - Code *string `json:"code" gorm:"unique;size:20"` - 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"` - Unit_Code *string `json:"unit_code" gorm:"size:10"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - Infra_Code *string `json:"infra_code" gorm:"size:10"` - Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` + ecore.Main // adjust this according to the needs + Code *string `json:"code" gorm:"unique;size:20"` + 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"` + Specialist_Code *string `json:"specialist_code" gorm:"size:10"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Infra_Code *string `json:"infra_code" gorm:"size:10"` + Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` } diff --git a/internal/domain/main-entities/practice-schedule/dto.go b/internal/domain/main-entities/practice-schedule/dto.go index 832bc29d..35e7ff35 100644 --- a/internal/domain/main-entities/practice-schedule/dto.go +++ b/internal/domain/main-entities/practice-schedule/dto.go @@ -6,11 +6,11 @@ import ( ) type CreateDto struct { - Doctor_Code *string `json:"doctor_code"` - Unit_Code *string `json:"unit_code"` - Day_Code *erc.DayCode `json:"day_code"` - StartTime *string `json:"startTime" validate:"maxLength=5"` - EndTime *string `json:"endTime" validate:"maxLength=5"` + Doctor_Code *string `json:"doctor_code"` + Specialist_Code *string `json:"specialist_code"` + Day_Code *erc.DayCode `json:"day_code"` + StartTime *string `json:"startTime" validate:"maxLength=5"` + EndTime *string `json:"endTime" validate:"maxLength=5"` } type ReadListDto struct { @@ -20,11 +20,11 @@ type ReadListDto struct { } type FilterDto struct { - Doctor_Code *string `json:"doctor-code"` - Unit_Code *string `json:"unit-code"` - Day_Code *erc.DayCode `json:"day-code"` - StartTime *string `json:"startTime"` - EndTime *string `json:"endTime"` + Doctor_Code *string `json:"doctor-code"` + Specialist_Code *string `json:"specialist-code"` + Day_Code *erc.DayCode `json:"day-code"` + StartTime *string `json:"startTime"` + EndTime *string `json:"endTime"` } type ReadDetailDto struct { @@ -48,20 +48,20 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Doctor_Code *string `json:"doctor_code"` - Unit_Code *string `json:"unit_code"` - Day_Code *erc.DayCode `json:"day_code"` - StartTime *string `json:"startTime"` - EndTime *string `json:"endTime"` + Doctor_Code *string `json:"doctor_code"` + Specialist_Code *string `json:"specialist_code"` + Day_Code *erc.DayCode `json:"day_code"` + StartTime *string `json:"startTime"` + EndTime *string `json:"endTime"` } func (d PracticeSchedule) ToResponse() ResponseDto { resp := ResponseDto{ - Doctor_Code: d.Doctor_Code, - Unit_Code: d.Unit_Code, - Day_Code: d.Day_Code, - StartTime: d.StartTime, - EndTime: d.EndTime, + Doctor_Code: d.Doctor_Code, + Specialist_Code: d.Specialist_Code, + Day_Code: d.Day_Code, + StartTime: d.StartTime, + EndTime: d.EndTime, } resp.Main = d.Main return resp diff --git a/internal/domain/main-entities/practice-schedule/entity.go b/internal/domain/main-entities/practice-schedule/entity.go index 84ea3296..3f466a3b 100644 --- a/internal/domain/main-entities/practice-schedule/entity.go +++ b/internal/domain/main-entities/practice-schedule/entity.go @@ -3,17 +3,17 @@ package practiceschedule import ( ecore "simrs-vx/internal/domain/base-entities/core" ed "simrs-vx/internal/domain/main-entities/doctor" - eu "simrs-vx/internal/domain/main-entities/unit" + es "simrs-vx/internal/domain/main-entities/specialist" erc "simrs-vx/internal/domain/references/common" ) type PracticeSchedule struct { - ecore.Main // adjust this according to the needs - Doctor_Code *string `json:"doctor_code"` - Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - Day_Code *erc.DayCode `json:"day_code"` - StartTime *string `json:"startTime" gorm:"size:5"` - EndTime *string `json:"endTime" gorm:"size:5"` + ecore.Main // adjust this according to the needs + Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` + Specialist_Code *string `json:"specialist_code"` + Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Day_Code *erc.DayCode `json:"day_code"` + StartTime *string `json:"startTime" gorm:"size:5"` + EndTime *string `json:"endTime" gorm:"size:5"` } diff --git a/internal/domain/main-entities/procedure-room/base/entity.go b/internal/domain/main-entities/procedure-room/base/entity.go index 981dd4f2..ec42de2c 100644 --- a/internal/domain/main-entities/procedure-room/base/entity.go +++ b/internal/domain/main-entities/procedure-room/base/entity.go @@ -10,7 +10,6 @@ type ProcedureRoom struct { Code string `json:"code" gorm:"unique;size:20"` // copied from infra code Infra_Code *string `json:"infra_code" gorm:"size:20;unique"` Type_Code *ero.ProdcedureRoomTypeCode `json:"type_code" gorm:"size:10"` - Unit_Code *string `json:"unit_code" gorm:"size:20"` Specialist_Code *string `json:"specialist_code" gorm:"size:20"` Subspecialist_Code *string `json:"subspecialist_code" gorm:"size:20"` } diff --git a/internal/domain/main-entities/procedure-room/dto.go b/internal/domain/main-entities/procedure-room/dto.go index b3812db2..28779c73 100644 --- a/internal/domain/main-entities/procedure-room/dto.go +++ b/internal/domain/main-entities/procedure-room/dto.go @@ -5,14 +5,12 @@ import ( 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 { Code *string `json:"code"` Infra_Code *string `json:"infra_code"` Type_Code string `json:"type_code"` - Unit_Code *string `json:"unit_code"` Specialist_Code *string `json:"specialist_code"` Subspecialist_Code *string `json:"subspecialist_code"` } @@ -26,7 +24,6 @@ type ReadListDto struct { type FilterDto struct { Infra_Code *string `json:"infra-code"` Type_Code string `json:"type-code"` - Unit_Code *string `json:"unit-code"` Specialist_Code *string `json:"specialist-code"` Subspecialist_Code *string `json:"subspecialist-code"` } @@ -56,8 +53,6 @@ type ResponseDto struct { Type_Code *string `json:"type_code"` Infra_Code *string `json:"infra_code"` Infra *ei.Infra `json:"infra,omitempty"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` Specialist_Code *string `json:"specialist_code"` Specialist *es.Specialist `json:"specialist,omitempty"` Subspecialist_Code *string `json:"subspecialist_code"` @@ -70,8 +65,6 @@ func (d ProcedureRoom) ToResponse() ResponseDto { Infra_Code: d.Infra_Code, Infra: d.Infra, Type_Code: (*string)(d.Type_Code), - Unit_Code: d.Unit_Code, - Unit: d.Unit, Specialist_Code: d.Specialist_Code, Specialist: d.Specialist, Subspecialist_Code: d.Subspecialist_Code, diff --git a/internal/domain/main-entities/procedure-room/entity.go b/internal/domain/main-entities/procedure-room/entity.go index 9be3ac69..76186011 100644 --- a/internal/domain/main-entities/procedure-room/entity.go +++ b/internal/domain/main-entities/procedure-room/entity.go @@ -5,13 +5,11 @@ import ( ebase "simrs-vx/internal/domain/main-entities/procedure-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 ProcedureRoom struct { ebase.ProcedureRoom Infra *ei.Infra `json:"infra,omitempty" gorm:"foreignKey:Infra_Code;references:Code"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` Specialist *es.Specialist `json:"specialist,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` Subspecialist *ess.Subspecialist `json:"subspecialist,omitempty" gorm:"foreignKey:Subspecialist_Code;references:Code"` } diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index 2d656556..78f7ae31 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -4,14 +4,13 @@ import ( ecore "simrs-vx/internal/domain/base-entities/core" espb "simrs-vx/internal/domain/main-entities/specialist-position/base" essb "simrs-vx/internal/domain/main-entities/subspecialist/base" - eu "simrs-vx/internal/domain/main-entities/unit" ) type CreateDto struct { - Id *uint `json:"id"` - Code string `json:"code" validate:"maxLength=10"` - Name string `json:"name" validate:"maxLength=50"` - Unit_Code *string `json:"unit_code"` + Id *uint `json:"id"` + Installation_Code string `json:"installation_code"` + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` } type ReadListDto struct { @@ -22,10 +21,9 @@ type ReadListDto struct { } type FilterDto struct { - Code string `json:"code"` - Name string `json:"name"` - Unit_Code *string `json:"unit-code"` - Search string `json:"search" gormhelper:"searchColumns=Code,Name"` + Code string `json:"code"` + Name string `json:"name"` + Search string `json:"search" gormhelper:"searchColumns=Code,Name"` } type ReadDetailDto struct { @@ -54,8 +52,6 @@ type ResponseDto struct { ecore.SmallMain Code string `json:"code"` Name string `json:"name"` - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` SpecialistPositions []espb.Basic `json:"specialistPositions,omitempty"` Subspecialists []essb.Basic `json:"subspecialists,omitempty"` } @@ -64,8 +60,6 @@ func (d Specialist) ToResponse() ResponseDto { resp := ResponseDto{ Code: d.Code, Name: d.Name, - Unit: d.Unit, - Unit_Code: d.Unit_Code, SpecialistPositions: d.SpecialistPositions, Subspecialists: d.Subspecialists, } diff --git a/internal/domain/main-entities/specialist/entity.go b/internal/domain/main-entities/specialist/entity.go index 0b5b7a5d..0326f614 100644 --- a/internal/domain/main-entities/specialist/entity.go +++ b/internal/domain/main-entities/specialist/entity.go @@ -2,17 +2,17 @@ package specialist import ( ecore "simrs-vx/internal/domain/base-entities/core" + ei "simrs-vx/internal/domain/main-entities/installation" eub "simrs-vx/internal/domain/main-entities/specialist-position/base" essb "simrs-vx/internal/domain/main-entities/subspecialist/base" - 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:20"` - Name string `json:"name" gorm:"size:50"` - Unit_Code *string `json:"unit_code" gorm:"size:20"` - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` - SpecialistPositions []eub.Basic `json:"specialistPositions,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` - Subspecialists []essb.Basic `json:"subspecialists,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + ecore.SmallMain // adjust this according to the needs + Code string `json:"code" gorm:"unique;size:20"` + Name string `json:"name" gorm:"size:50"` + Installation_Code string `json:"installation_code" gorm:"size:20"` + Installation *ei.Installation `json:"installation,omitempty" gorm:"foreignKey:Installation_Code;references:Code"` + SpecialistPositions []eub.Basic `json:"specialistPositions,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` + Subspecialists []essb.Basic `json:"subspecialists,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` } diff --git a/internal/domain/main-entities/unit-position/base/entity.go b/internal/domain/main-entities/unit-position/base/entity.go deleted file mode 100644 index eb046dfc..00000000 --- a/internal/domain/main-entities/unit-position/base/entity.go +++ /dev/null @@ -1,20 +0,0 @@ -package base - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/employee" -) - -type Basic struct { - ecore.SmallMain // adjust this according to the needs - Unit_Code *string `json:"unit_code" gorm:"size:10"` - Code string `json:"code" gorm:"unique;size:10;not null"` - Name string `json:"name" gorm:"size:30;not null"` - HeadStatus bool `json:"headStatus"` - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty" gorm:"foreignKey:Employee_Id;references:Id"` -} - -func (Basic) TableName() string { - return "UnitPosition" -} diff --git a/internal/domain/main-entities/unit-position/dto.go b/internal/domain/main-entities/unit-position/dto.go deleted file mode 100644 index 856cec77..00000000 --- a/internal/domain/main-entities/unit-position/dto.go +++ /dev/null @@ -1,85 +0,0 @@ -package unit_position - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ee "simrs-vx/internal/domain/main-entities/employee" - eu "simrs-vx/internal/domain/main-entities/unit" -) - -type CreateDto struct { - Unit_Code *string `json:"unit_code" validate:"required"` - Code string `json:"code" validate:"maxLength=10;required"` - Name string `json:"name" validate:"maxLength=30;required"` - HeadStatus bool `json:"headStatus"` - Employee_Id *uint `json:"employee_id"` -} - -type ReadListDto struct { - FilterDto - Includes string `json:"includes"` - Sort string `json:"sort"` - Pagination ecore.Pagination -} - -type FilterDto struct { - Unit_Code *string `json:"unit-code"` - Code string `json:"code"` - 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 { - Id *uint16 `json:"id"` - Code *string `json:"code"` -} - -type UpdateDto struct { - Id *uint16 `json:"id"` - CreateDto -} - -type DeleteDto struct { - Id *uint16 `json:"id"` - Code *string `json:"code"` -} - -type MetaDto struct { - PageNumber int `json:"page_number"` - PageSize int `json:"page_size"` - Count int `json:"count"` -} - -type ResponseDto struct { - ecore.SmallMain - Unit_Code *string `json:"unit_code"` - Unit *eu.Unit `json:"unit,omitempty"` - Code string `json:"code"` - Name string `json:"name"` - HeadStatus bool `json:"headStatus"` - Employee_Id *uint `json:"employee_id"` - Employee *ee.Employee `json:"employee,omitempty"` -} - -func (d UnitPosition) ToResponse() ResponseDto { - resp := ResponseDto{ - Unit_Code: d.Unit_Code, - Unit: d.Unit, - Code: d.Code, - Name: d.Name, - HeadStatus: d.HeadStatus, - Employee_Id: d.Employee_Id, - Employee: d.Employee, - } - resp.SmallMain = d.SmallMain - return resp -} - -func ToResponseList(data []UnitPosition) []ResponseDto { - resp := make([]ResponseDto, len(data)) - for i, u := range data { - resp[i] = u.ToResponse() - } - return resp -} diff --git a/internal/domain/main-entities/unit-position/entity.go b/internal/domain/main-entities/unit-position/entity.go deleted file mode 100644 index a7598049..00000000 --- a/internal/domain/main-entities/unit-position/entity.go +++ /dev/null @@ -1,11 +0,0 @@ -package unit_position - -import ( - eu "simrs-vx/internal/domain/main-entities/unit" - eub "simrs-vx/internal/domain/main-entities/unit-position/base" -) - -type UnitPosition struct { - eub.Basic - Unit *eu.Unit `json:"unit,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` -} diff --git a/internal/domain/main-entities/unit/dto.go b/internal/domain/main-entities/unit/dto.go deleted file mode 100644 index 76151cb7..00000000 --- a/internal/domain/main-entities/unit/dto.go +++ /dev/null @@ -1,82 +0,0 @@ -package unit - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ei "simrs-vx/internal/domain/main-entities/installation" - eipb "simrs-vx/internal/domain/main-entities/unit-position/base" -) - -type CreateDto struct { - Id *uint `json:"id"` - Installation_Code *string `json:"installation_code"` - Code string `json:"code" validate:"maxLength=20"` - Name string `json:"name" validate:"maxLength=50"` -} - -type ReadListDto struct { - FilterDto - Includes string `json:"includes"` - Sort string `json:"sort"` - Pagination ecore.Pagination -} - -type FilterDto struct { - Installation_Code *string `json:"installation-code"` - Code string `json:"code"` - Name string `json:"name"` - Search string `json:"search" gormhelper:"searchColumns=Code,Name"` -} - -type ReadDetailDto struct { - Id *uint16 `json:"id"` - Installation_Code *string `json:"installation_code"` - Code *string `json:"code"` - Includes string `json:"includes"` -} - -type UpdateDto struct { - Id *uint16 `json:"id"` - CreateDto -} - -type DeleteDto struct { - Id *uint16 `json:"id"` - Code *string `json:"code"` -} - -type MetaDto struct { - PageNumber int `json:"page_number"` - PageSize int `json:"page_size"` - Count int `json:"count"` -} - -type ResponseDto struct { - ecore.SmallMain - Installation_Code *string `json:"installation_code"` - Installation *ei.Installation `json:"installation,omitempty"` - Code string `json:"code"` - Name string `json:"name"` - UnitPositions []eipb.Basic `json:"unitPositions,omitempty"` -} - -func (d Unit) ToResponse() ResponseDto { - resp := ResponseDto{ - Installation_Code: d.Installation_Code, - Code: d.Code, - Name: d.Name, - UnitPositions: d.UnitPositions, - } - resp.SmallMain = d.SmallMain - if d.Installation != nil { - resp.Installation = d.Installation - } - return resp -} - -func ToResponseList(data []Unit) []ResponseDto { - resp := make([]ResponseDto, len(data)) - for i, u := range data { - resp[i] = u.ToResponse() - } - return resp -} diff --git a/internal/domain/main-entities/unit/entity.go b/internal/domain/main-entities/unit/entity.go deleted file mode 100644 index e8110db3..00000000 --- a/internal/domain/main-entities/unit/entity.go +++ /dev/null @@ -1,18 +0,0 @@ -package unit - -import ( - ecore "simrs-vx/internal/domain/base-entities/core" - ei "simrs-vx/internal/domain/main-entities/installation" - eub "simrs-vx/internal/domain/main-entities/unit-position/base" - ero "simrs-vx/internal/domain/references/organization" -) - -type Unit struct { - ecore.SmallMain // adjust this according to the needs - Installation_Code *string `json:"installation_code" gorm:"size:20"` - Installation *ei.Installation `json:"installation" gorm:"foreignKey:Installation_Code;references:Code"` - Code string `json:"code" gorm:"unique;size:20"` - Name string `json:"name" gorm:"size:50"` - Type_Code *ero.UnitTypeCode `json:"type_code"` - UnitPositions []eub.Basic `json:"unitPositions,omitempty" gorm:"foreignKey:Unit_Code;references:Code"` -} diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index c6a02ba9..8b8babc9 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -240,8 +240,8 @@ func (obj myBase) Skip(w http.ResponseWriter, r *http.Request) { rw.DataResponse(w, res, err) } -func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.SwitchUnitDto{} +func (obj myBase) RequestSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.SwitchSpecialistDto{} id := rw.ValidateInt(w, "id", r.PathValue("id")) if id <= 0 { return @@ -252,7 +252,7 @@ func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) { } // validate request body - if valid := validateRequestSwitchUnit(w, dto); !valid { + if valid := validateRequestSwitchSpecialist(w, dto); !valid { return } @@ -263,12 +263,12 @@ func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) { dto.AuthInfo = *authInfo dto.Id = uint(id) - res, err := u.RequestSwitchUnit(dto) + res, err := u.RequestSwitchSpecialist(dto) rw.DataResponse(w, res, err) } -func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.ApproveCancelUnitDto{} +func (obj myBase) ApproveSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.ApproveCancelSpecialistDto{} id := rw.ValidateInt(w, "id", r.PathValue("id")) if id <= 0 { return @@ -286,12 +286,12 @@ func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) { dto.AuthInfo = *authInfo dto.Id = uint(id) - res, err := u.ApproveSwitchUnit(dto) + res, err := u.ApproveSwitchSpecialist(dto) rw.DataResponse(w, res, err) } -func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.ApproveCancelUnitDto{} +func (obj myBase) CancelSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.ApproveCancelSpecialistDto{} id := rw.ValidateInt(w, "id", r.PathValue("id")) if id <= 0 { return @@ -309,7 +309,7 @@ func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) { dto.AuthInfo = *authInfo dto.Id = uint(id) - res, err := u.CancelSwitchUnit(dto) + res, err := u.CancelSwitchSpecialist(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/main-handler/encounter/request-validation.go b/internal/interface/main-handler/encounter/request-validation.go index 67d8a63c..7d22893e 100644 --- a/internal/interface/main-handler/encounter/request-validation.go +++ b/internal/interface/main-handler/encounter/request-validation.go @@ -58,7 +58,7 @@ func validateRequestCheckIn(w http.ResponseWriter, i e.CheckinDto) (valid bool) return true } -func validateRequestSwitchUnit(w http.ResponseWriter, i e.SwitchUnitDto) (valid bool) { +func validateRequestSwitchSpecialist(w http.ResponseWriter, i e.SwitchSpecialistDto) (valid bool) { // validate poly-switch-code if i.PolySwitchCode == nil { rw.DataResponse(w, nil, d.FieldError{ @@ -84,7 +84,7 @@ func validateRequestSwitchUnit(w http.ResponseWriter, i e.SwitchUnitDto) (valid } for _, v := range *i.InternalReferences { - if v.Unit_Code == nil { + if v.Specialist_Code == nil { rw.DataResponse(w, nil, d.FieldError{ Code: dataValidationFail, Message: "internalReferences.unit_code required", diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index c47ae37d..fced567e 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -115,8 +115,6 @@ import ( subspecialist "simrs-vx/internal/interface/main-handler/subspecialist" subspecialistposition "simrs-vx/internal/interface/main-handler/subspecialist-position" therapyprotocol "simrs-vx/internal/interface/main-handler/therapy-protocol" - unit "simrs-vx/internal/interface/main-handler/unit" - unitposition "simrs-vx/internal/interface/main-handler/unit-position" uom "simrs-vx/internal/interface/main-handler/uom" vehicle "simrs-vx/internal/interface/main-handler/vehicle" vehiclehist "simrs-vx/internal/interface/main-handler/vehicle-hist" @@ -194,9 +192,9 @@ func SetRoutes() http.Handler { "PATCH /{id}/cancel": encounter.O.Cancel, "PATCH /{id}/reject": encounter.O.Reject, "PATCH /{id}/skip": encounter.O.Skip, - "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchUnit, - "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchUnit, - "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchUnit, + "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchSpecialist, + "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchSpecialist, + "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchSpecialist, "POST /create-with-patient": encounter.O.CreateWithPatient, }) hk.GroupRoutes("/v1/mcu-order", r, auth.GuardMW, hk.MapHandlerFunc{ @@ -369,9 +367,7 @@ func SetRoutes() http.Handler { hc.RegCrudByCode(r, "/v1/division", division.O) hc.RegCrudByCode(r, "/v1/division-position", divisionposition.O) hc.RegCrudByCode(r, "/v1/installation", installation.O) - hc.RegCrudByCode(r, "/v1/unit", unit.O) hc.RegCrudByCode(r, "/v1/installation-position", installationposition.O) - hc.RegCrudByCode(r, "/v1/unit-position", unitposition.O) hc.RegCrudByCode(r, "/v1/specialist", specialist.O) hc.RegCrudByCode(r, "/v1/subspecialist", subspecialist.O) hc.RegCrudByCode(r, "/v1/specialist-position", specialistposition.O) diff --git a/internal/interface/main-handler/unit-position/handler.go b/internal/interface/main-handler/unit-position/handler.go deleted file mode 100644 index 7780e80d..00000000 --- a/internal/interface/main-handler/unit-position/handler.go +++ /dev/null @@ -1,71 +0,0 @@ -package unit_position - -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/unit-position" - u "simrs-vx/internal/use-case/main-use-case/unit-position" -) - -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) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { - return - } - dto := e.ReadDetailDto{} - dto.Code = &code - res, err := u.ReadDetail(dto) - rw.DataResponse(w, res, err) -} - -func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { - return - } - - dto := e.UpdateDto{} - if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { - return - } - dto.Code = code - res, err := u.Update(dto) - rw.DataResponse(w, res, err) -} - -func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { - return - } - - dto := e.DeleteDto{} - dto.Code = &code - res, err := u.Delete(dto) - rw.DataResponse(w, res, err) -} diff --git a/internal/interface/main-handler/unit/handler.go b/internal/interface/main-handler/unit/handler.go deleted file mode 100644 index f31667a2..00000000 --- a/internal/interface/main-handler/unit/handler.go +++ /dev/null @@ -1,73 +0,0 @@ -package unit - -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/unit" - u "simrs-vx/internal/use-case/main-use-case/unit" -) - -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) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { - return - } - dto := e.ReadDetailDto{} - - sf.UrlQueryParam(&dto, *r.URL) - dto.Code = &code - res, err := u.ReadDetail(dto) - rw.DataResponse(w, res, err) -} - -func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { - return - } - - dto := e.UpdateDto{} - if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { - return - } - dto.Code = code - res, err := u.Update(dto) - rw.DataResponse(w, res, err) -} - -func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { - code := rw.ValidateString(w, "code", r.PathValue("code")) - if code == "" { - return - } - - dto := e.DeleteDto{} - dto.Code = &code - res, err := u.Delete(dto) - rw.DataResponse(w, res, err) -} diff --git a/internal/interface/migration/main-entities.go b/internal/interface/migration/main-entities.go index af3b35d3..a89e74f2 100644 --- a/internal/interface/migration/main-entities.go +++ b/internal/interface/migration/main-entities.go @@ -109,8 +109,6 @@ import ( subspecialist "simrs-vx/internal/domain/main-entities/subspecialist" subspecialistposition "simrs-vx/internal/domain/main-entities/subspecialist-position" therapyprotocol "simrs-vx/internal/domain/main-entities/therapy-protocol" - unit "simrs-vx/internal/domain/main-entities/unit" - unitposition "simrs-vx/internal/domain/main-entities/unit-position" uom "simrs-vx/internal/domain/main-entities/uom" user "simrs-vx/internal/domain/main-entities/user" userfes "simrs-vx/internal/domain/main-entities/user-fes" @@ -135,7 +133,6 @@ func getMainEntities() []any { &division.Division{}, &divisionposition.DivisionPosition{}, &installation.Installation{}, - &unit.Unit{}, &village.Village{}, &district.District{}, ®ency.Regency{}, @@ -237,7 +234,6 @@ func getMainEntities() []any { &generalconsent.GeneralConsent{}, &deathcause.DeathCause{}, &installationposition.InstallationPosition{}, - &unitposition.UnitPosition{}, &specialistposition.SpecialistPosition{}, &subspecialistposition.SubspecialistPosition{}, &responsibledoctorhist.ResponsibleDoctorHist{}, diff --git a/internal/interface/simgos-sync-handler/new/encounter/handler.go b/internal/interface/simgos-sync-handler/new/encounter/handler.go index aef2f7d2..c37ba66d 100644 --- a/internal/interface/simgos-sync-handler/new/encounter/handler.go +++ b/internal/interface/simgos-sync-handler/new/encounter/handler.go @@ -87,32 +87,32 @@ func (obj myBase) UpdateStatus(w http.ResponseWriter, r *http.Request) { rw.DataResponse(w, res, err) } -func (obj myBase) RequestSwitchUnit(w http.ResponseWriter, r *http.Request) { +func (obj myBase) RequestSwitchSpecialist(w http.ResponseWriter, r *http.Request) { dto := e.Encounter{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - res, err := u.RequestSwitchUnit(dto) + res, err := u.RequestSwitchSpecialist(dto) rw.DataResponse(w, res, err) } -func (obj myBase) ApproveSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.ApproveCancelUnitDto{} +func (obj myBase) ApproveSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.ApproveCancelSpecialistDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - res, err := u.ApproveSwitchUnit(dto) + res, err := u.ApproveSwitchSpecialist(dto) rw.DataResponse(w, res, err) } -func (obj myBase) CancelSwitchUnit(w http.ResponseWriter, r *http.Request) { - dto := e.ApproveCancelUnitDto{} +func (obj myBase) CancelSwitchSpecialist(w http.ResponseWriter, r *http.Request) { + dto := e.ApproveCancelSpecialistDto{} if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { return } - res, err := u.CancelSwitchUnit(dto) + res, err := u.CancelSwitchSpecialist(dto) rw.DataResponse(w, res, err) } diff --git a/internal/interface/simgos-sync-handler/new/unit/handler.go b/internal/interface/simgos-sync-handler/new/unit/handler.go deleted file mode 100644 index 95808728..00000000 --- a/internal/interface/simgos-sync-handler/new/unit/handler.go +++ /dev/null @@ -1,67 +0,0 @@ -package unit - -import ( - "net/http" - - rw "github.com/karincake/risoles" - // ua "github.com/karincake/tumpeng/auth/svc" - - e "simrs-vx/internal/domain/main-entities/unit" - esync "simrs-vx/internal/domain/sync-entities/log" - - u "simrs-vx/internal/use-case/simgos-sync-use-case/new/unit" -) - -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) CreateLog(w http.ResponseWriter, r *http.Request) { - dto := esync.SimxLogDto{} - if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { - return - } - res, err := u.CreateSimxLog(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 - } - - val := uint16(id) - dto.Id = &val - - 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{} - val := uint16(id) - dto.Id = &val - - res, err := u.Delete(dto) - rw.DataResponse(w, res, err) -} diff --git a/internal/interface/simgos-sync-handler/simgos-sync-handler.go b/internal/interface/simgos-sync-handler/simgos-sync-handler.go index c8a08b7f..761c6b74 100644 --- a/internal/interface/simgos-sync-handler/simgos-sync-handler.go +++ b/internal/interface/simgos-sync-handler/simgos-sync-handler.go @@ -28,7 +28,6 @@ import ( "simrs-vx/internal/interface/simgos-sync-handler/new/soapi" "simrs-vx/internal/interface/simgos-sync-handler/new/specialist" "simrs-vx/internal/interface/simgos-sync-handler/new/subspecialist" - "simrs-vx/internal/interface/simgos-sync-handler/new/unit" sd "simrs-vx/internal/interface/simgos-sync-handler/seeder" @@ -53,7 +52,6 @@ func SetRoutes() http.Handler { /******************** SvcToOld ******************/ prefixnew := "/new-to-old" hc.SyncCrud(r, prefixnew+"/v1/installation", installation.O) - hc.SyncCrud(r, prefixnew+"/v1/unit", unit.O) hc.SyncCrud(r, prefixnew+"/v1/division", division.O) hc.SyncCrud(r, prefixnew+"/v1/specialist", specialist.O) hc.SyncCrud(r, prefixnew+"/v1/subspecialist", subspecialist.O) @@ -72,9 +70,9 @@ func SetRoutes() http.Handler { "PATCH /{id}/checkin": encounter.O.Checkin, "PATCH /{id}/checkout": encounter.O.Checkout, "PATCH /{id}/update-status": encounter.O.UpdateStatus, - "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchUnit, - "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchUnit, - "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchUnit, + "PATCH /{id}/req-switch-unit": encounter.O.RequestSwitchSpecialist, + "PATCH /{id}/approve-switch-unit": encounter.O.ApproveSwitchSpecialist, + "PATCH /{id}/cancel-switch-unit": encounter.O.CancelSwitchSpecialist, }) hc.SyncCrud(r, prefixnew+"/v1/soapi", soapi.O) diff --git a/internal/use-case/main-use-case/authentication/helper.go b/internal/use-case/main-use-case/authentication/helper.go index 3a8154b6..94739363 100644 --- a/internal/use-case/main-use-case/authentication/helper.go +++ b/internal/use-case/main-use-case/authentication/helper.go @@ -29,14 +29,12 @@ import ( er "simrs-vx/internal/domain/main-entities/registrator" esp "simrs-vx/internal/domain/main-entities/specialist-position" essp "simrs-vx/internal/domain/main-entities/subspecialist-position" - eup "simrs-vx/internal/domain/main-entities/unit-position" eu "simrs-vx/internal/domain/main-entities/user" udp "simrs-vx/internal/use-case/main-use-case/division-position" uip "simrs-vx/internal/use-case/main-use-case/installation-position" usp "simrs-vx/internal/use-case/main-use-case/specialist-position" ussp "simrs-vx/internal/use-case/main-use-case/subspecialist-position" - uup "simrs-vx/internal/use-case/main-use-case/unit-position" ) // just return the error code @@ -85,7 +83,7 @@ func getDivisionPosition(employee_id uint, event *pl.Event) ([]string, error) { func getInstallationPosition(employeeId uint, event *pl.Event) ([]string, error) { var result []string - // get data unit_position based on employee_id + // get data specialist_position based on employee_id data, _, err := uip.ReadListData(eip.ReadListDto{ FilterDto: eip.FilterDto{Employee_Id: &employeeId}, Includes: "installation"}, event) @@ -102,28 +100,10 @@ func getInstallationPosition(employeeId uint, event *pl.Event) ([]string, error) return result, nil } -func getUnitPosition(employeeId uint, event *pl.Event) ([]string, error) { - var result []string - - // get data unit_position based on employee_id - data, _, err := uup.ReadListData(eup.ReadListDto{FilterDto: eup.FilterDto{Employee_Id: &employeeId}}, event) - if err != nil { - return nil, err - } - - if len(data) > 0 { - for _, dp := range data { - result = append(result, "unit|"+*dp.Unit_Code+"|"+dp.Code) - } - } - - return result, nil -} - func getSpecialistPosition(employeeId uint, event *pl.Event) ([]string, error) { var result []string - // get data unit_position based on employee_id + // get data specialist_position based on employee_id data, _, err := usp.ReadListData(esp.ReadListDto{FilterDto: esp.FilterDto{Employee_Id: &employeeId}}, event) if err != nil { return nil, err @@ -141,7 +121,7 @@ func getSpecialistPosition(employeeId uint, event *pl.Event) ([]string, error) { func getSubspecialistPosition(employeeId uint, event *pl.Event) ([]string, error) { var result []string - // get data unit_position based on employee_id + // get data specialist_position based on employee_id data, _, err := ussp.ReadListData(essp.ReadListDto{ FilterDto: essp.FilterDto{Employee_Id: &employeeId}, Includes: "subspecialist"}, event) @@ -230,9 +210,9 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out outputData["doctor_code"] = doctor.Code // specialist - if doctor.Unit_Code != nil { - atClaims["unit_code"] = doctor.Unit_Code - outputData["unit_code"] = doctor.Unit_Code + if doctor.Specialist_Code != nil { + atClaims["specialist_code"] = doctor.Specialist_Code + outputData["specialist_code"] = doctor.Specialist_Code } if doctor.Specialist_Code != nil { atClaims["specialist_code"] = doctor.Specialist_Code @@ -292,12 +272,6 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out return errorGetPosition } - // unit position - unitPositions, err := getUnitPosition(employee.Id, &event) - if err != nil { - return errorGetPosition - } - // specialist position specialistPositions, err := getSpecialistPosition(employee.Id, &event) if err != nil { @@ -312,7 +286,7 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out roles = append(roles, divisionPositions...) roles = append(roles, installationPositions...) - roles = append(roles, unitPositions...) + roles = append(roles, specialistPositions...) roles = append(roles, specialistPositions...) roles = append(roles, subspecialistPositions...) // atClaims["division_positions"] = divsionPositions diff --git a/internal/use-case/main-use-case/chemo/helper.go b/internal/use-case/main-use-case/chemo/helper.go index 51a09a3a..c241bce3 100644 --- a/internal/use-case/main-use-case/chemo/helper.go +++ b/internal/use-case/main-use-case/chemo/helper.go @@ -19,5 +19,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Chemo) { data.Encounter_Id = inputSrc.Encounter_Id data.Status_Code = inputSrc.Status_Code - data.SrcUnit_Code = inputSrc.SrcUnit_Code + data.Specialist_Code = inputSrc.Specialist_Code } diff --git a/internal/use-case/main-use-case/consultation/case.go b/internal/use-case/main-use-case/consultation/case.go index 25306169..1691e4a9 100644 --- a/internal/use-case/main-use-case/consultation/case.go +++ b/internal/use-case/main-use-case/consultation/case.go @@ -312,7 +312,7 @@ func Reply(input e.ReplyDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - if data.DstDoctor_Code != nil && data.DstDoctor_Code != input.AuthInfo.Doctor_Code { + if data.Doctor_Code != nil && data.Doctor_Code != input.AuthInfo.Doctor_Code { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "data-handled-mismatch", @@ -322,7 +322,7 @@ func Reply(input e.ReplyDto) (*d.Data, error) { return pl.SetLogError(&event, input) } - data.DstDoctor_Code = input.AuthInfo.Doctor_Code + data.Doctor_Code = input.AuthInfo.Doctor_Code 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 3a518c77..6a4e2a3e 100644 --- a/internal/use-case/main-use-case/consultation/helper.go +++ b/internal/use-case/main-use-case/consultation/helper.go @@ -20,5 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Consultation) { data.Encounter_Id = inputSrc.Encounter_Id data.Date = inputSrc.Date data.Problem = inputSrc.Problem - data.DstUnit_Code = inputSrc.DstUnit_Code + data.Specialist_Code = inputSrc.Specialist_Code } diff --git a/internal/use-case/main-use-case/control-letter/helper.go b/internal/use-case/main-use-case/control-letter/helper.go index 8ae71d3c..899fb437 100644 --- a/internal/use-case/main-use-case/control-letter/helper.go +++ b/internal/use-case/main-use-case/control-letter/helper.go @@ -18,7 +18,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ControlLetter) { } data.Encounter_Id = inputSrc.Encounter_Id - data.Unit_Code = inputSrc.Unit_Code data.Specialist_Code = inputSrc.Specialist_Code data.Subspecialist_Code = inputSrc.Subspecialist_Code data.Doctor_Code = inputSrc.Doctor_Code diff --git a/internal/use-case/main-use-case/doctor/helper.go b/internal/use-case/main-use-case/doctor/helper.go index 9ddc2027..9571f62d 100644 --- a/internal/use-case/main-use-case/doctor/helper.go +++ b/internal/use-case/main-use-case/doctor/helper.go @@ -21,7 +21,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Doctor) { data.Employee_Id = inputSrc.Employee_Id data.IHS_Number = inputSrc.IHS_Number data.SIP_Number = inputSrc.SIP_Number - data.Unit_Code = inputSrc.Unit_Code data.Specialist_Code = inputSrc.Specialist_Code data.Subspecialist_Code = inputSrc.Subspecialist_Code } diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index b4001156..dd131944 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -704,13 +704,13 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) { }, nil } -func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { +func RequestSwitchSpecialist(input e.SwitchSpecialistDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id, Includes: "Responsible_Nurse.Employee.User,Responsible_Doctor.Employee"} var data *e.Encounter var err error event := pl.Event{ - Feature: "RequestSwitchUnit", + Feature: "RequestSwitchSpecialist", Source: source, } @@ -720,8 +720,8 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { unitCodes := make(map[string]struct{}) doctorCodes := make(map[string]struct{}) for _, ref := range *input.InternalReferences { - if ref.Unit_Code != nil { - unitCodes[*ref.Unit_Code] = struct{}{} + if ref.Specialist_Code != nil { + unitCodes[*ref.Specialist_Code] = struct{}{} } if ref.Doctor_Code != nil { doctorCodes[*ref.Doctor_Code] = struct{}{} @@ -729,7 +729,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { } // validate unit - if err = validateUnitCodes(unitCodes, &event); err != nil { + if err = validateSpecialistCodes(unitCodes, &event); err != nil { return nil, err } @@ -796,7 +796,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware - if err := mwRunner.RunRequestSwitchUnitMiddleware(requestSwitchEncounter, dataEncounter); err != nil { + if err := mwRunner.RunRequestSwitchSpecialistMiddleware(requestSwitchEncounter, dataEncounter); err != nil { return err } return nil @@ -812,13 +812,13 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) { Meta: d.IS{ "source": source, "structure": "single-data", - "status": "requestSwitchUnit", + "status": "requestSwitchSpecialist", }, Data: data.ToResponse(), }, nil } -func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { +func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id, Includes: "Responsible_Doctor.Employee"} var ( data *e.Encounter @@ -826,12 +826,12 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { ) event := pl.Event{ - Feature: "ApproveSwitchUnit", + Feature: "ApproveSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "approveSwitchUnit") + pl.SetLogInfo(&event, input, "started", "approveSwitchSpecialist") roleAllowed := []string{string(erg.EPCNur)} err = validateAuth(input.AuthInfo, roleAllowed, "request-switch-poly", &event) @@ -904,13 +904,13 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { } // update encounter - if err = updateEncounterApproveSwitchUnit(input, &event, tx); err != nil { + if err = updateEncounterApproveSwitchSpecialist(input, &event, tx); err != nil { return err } mwRunner.setMwType(pu.MWTPre) // Run pre-middleware - if err := mwRunner.RunApproveSwitchUnitMiddleware(approveSwitchEncounter, &input); err != nil { + if err := mwRunner.RunApproveSwitchSpecialistMiddleware(approveSwitchEncounter, &input); err != nil { return err } return nil @@ -933,7 +933,7 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { } -func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { +func CancelSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) { rdDto := e.ReadDetailDto{Id: input.Id} var ( data *e.Encounter @@ -941,12 +941,12 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { ) event := pl.Event{ - Feature: "CancelSwitchUnit", + Feature: "CancelSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "cancelSwitchUnit") + pl.SetLogInfo(&event, input, "started", "cancelSwitchSpecialist") roleAllowed := []string{string(erg.EPCNur)} err = validateAuth(input.AuthInfo, roleAllowed, "request-switch-poly", &event) @@ -1000,7 +1000,7 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { mwRunner.setMwType(pu.MWTPre) // Run pre-middleware - if err := mwRunner.RunCancelSwitchUnitMiddleware(cancelSwitchEncounter, &input); err != nil { + if err := mwRunner.RunCancelSwitchSpecialistMiddleware(cancelSwitchEncounter, &input); err != nil { return err } 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 f606eb7c..e3dfb00c 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -44,7 +44,7 @@ import ( er "simrs-vx/internal/domain/main-entities/rehab" erdh "simrs-vx/internal/domain/main-entities/responsible-doctor-hist" es "simrs-vx/internal/domain/main-entities/soapi" - eu "simrs-vx/internal/domain/main-entities/unit" + esp "simrs-vx/internal/domain/main-entities/specialist" // udo "simrs-vx/internal/use-case/main-use-case/device-order" uaeh "simrs-vx/internal/use-case/main-use-case/adm-employee-hist" @@ -69,7 +69,7 @@ func setDataCreate(input *e.CreateDto, data *e.Encounter) { data.Patient_Id = input.Patient_Id data.RegisteredAt = input.RegisteredAt data.Class_Code = input.Class_Code - data.Unit_Code = input.Unit_Code + data.Specialist_Code = input.Specialist_Code data.Specialist_Code = input.Specialist_Code data.Subspecialist_Code = input.Subspecialist_Code data.VisitDate = input.VisitDate @@ -88,7 +88,7 @@ func setDataCreate(input *e.CreateDto, data *e.Encounter) { } func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { - dst.Unit_Code = src.Unit_Code + dst.Specialist_Code = src.Specialist_Code dst.Specialist_Code = src.Specialist_Code dst.Subspecialist_Code = src.Subspecialist_Code dst.VisitDate = src.VisitDate @@ -104,7 +104,7 @@ func setDataUpdate(src e.UpdateDto, dst *e.Encounter) { func setDataUpdateFromSource(input *e.UpdateDto, data *e.Encounter) { data.Patient_Id = input.Patient_Id data.RegisteredAt = input.RegisteredAt - data.Unit_Code = input.Unit_Code + data.Specialist_Code = input.Specialist_Code data.Specialist_Code = input.Specialist_Code data.Subspecialist_Code = input.Subspecialist_Code data.VisitDate = input.VisitDate @@ -853,9 +853,9 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e switch { case subCode == ere.ACCChemo: chemoCreate := ec.CreateDto{ - Encounter_Id: &input.Id, - Status_Code: erc.DVCNew, - SrcUnit_Code: input.Unit_Code, + Encounter_Id: &input.Id, + Status_Code: erc.DVCNew, + Specialist_Code: input.Specialist_Code, } // create data chemo @@ -977,9 +977,9 @@ func setDBError(event *pl.Event, err error, ctx any) error { return pl.SetLogError(event, ctx) } -func getUnits(unitIds []string, event *pl.Event) ([]eu.Unit, error) { - pl.SetLogInfo(event, nil, "started", "getUnits") - var units []eu.Unit +func getSpecialists(unitIds []string, event *pl.Event) ([]esp.Specialist, error) { + pl.SetLogInfo(event, nil, "started", "getSpecialists") + var units []esp.Specialist err := dg.I.Where("\"Code\" IN ?", unitIds).Find(&units).Error if err != nil { event.Status = "failed" @@ -1009,14 +1009,14 @@ func getDoctors(doctorIds []string, event *pl.Event) ([]ed.Doctor, error) { return doctors, nil } -func validateUnitCodes(unitCodes map[string]struct{}, event *pl.Event) error { +func validateSpecialistCodes(unitCodes map[string]struct{}, event *pl.Event) error { if len(unitCodes) > 0 { var codes []string for code := range unitCodes { codes = append(codes, code) } - units, err := getUnits(codes, event) + units, err := getSpecialists(codes, event) if err != nil { return fmt.Errorf("failed to fetch units: %w", err) } diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index 33f68af5..d102030a 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -83,8 +83,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En tx = tx.Where("\"Encounter\".\"Status_Code\" = ?", *input.Status_Code) } - if input.Unit_Code != nil { - tx = tx.Where("\"Encounter\".\"Unit_Code\" = ?", *input.Unit_Code) + if input.Specialist_Code != nil { + tx = tx.Where("\"Encounter\".\"Specialist_Code\" = ?", *input.Specialist_Code) } if input.PaymentMethod_Code != nil { @@ -268,7 +268,7 @@ func UpdateStatusData(input e.UpdateStatusDto, event *pl.Event, dbx ...*gorm.DB) return nil } -func UpdateDischargeMethod(input e.SwitchUnitDto, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateDischargeMethod(input e.SwitchSpecialistDto, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, input, "started", "DBUpdateDischargeMethod") dischargeCode := setDischargeMethodCode(*input.PolySwitchCode) @@ -382,7 +382,7 @@ func verifyAllocatedVisitCount(i e.CreateDto, event *pl.Event) (e.Encounter, boo return recentEncounterAdm, valid, nil } -func updateEncounterApproveSwitchUnit(input e.ApproveCancelUnitDto, event *pl.Event, dbx ...*gorm.DB) (err error) { +func updateEncounterApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto, event *pl.Event, dbx ...*gorm.DB) (err error) { pl.SetLogInfo(event, nil, "started", "DBCreate") var tx *gorm.DB diff --git a/internal/use-case/main-use-case/encounter/middleware-runner.go b/internal/use-case/main-use-case/encounter/middleware-runner.go index 3ee19355..fff1a804 100644 --- a/internal/use-case/main-use-case/encounter/middleware-runner.go +++ b/internal/use-case/main-use-case/encounter/middleware-runner.go @@ -202,7 +202,7 @@ func (me *middlewareRunner) RunUpdateStatusMiddleware(middlewares []updateStatus return nil } -func (me *middlewareRunner) RunRequestSwitchUnitMiddleware(middleware requestSwitchUnitMw, input *e.Encounter) error { +func (me *middlewareRunner) RunRequestSwitchSpecialistMiddleware(middleware requestSwitchSpecialistMw, input *e.Encounter) error { if !me.SyncOn { return nil } @@ -220,7 +220,7 @@ func (me *middlewareRunner) RunRequestSwitchUnitMiddleware(middleware requestSwi return nil } -func (me *middlewareRunner) RunApproveSwitchUnitMiddleware(middleware approveSwitchUnitMw, input *e.ApproveCancelUnitDto) error { +func (me *middlewareRunner) RunApproveSwitchSpecialistMiddleware(middleware approveSwitchSpecialistMw, input *e.ApproveCancelSpecialistDto) error { if !me.SyncOn { return nil } @@ -238,7 +238,7 @@ func (me *middlewareRunner) RunApproveSwitchUnitMiddleware(middleware approveSwi return nil } -func (me *middlewareRunner) RunCancelSwitchUnitMiddleware(middleware cancelSwitchUnitMw, input *e.ApproveCancelUnitDto) error { +func (me *middlewareRunner) RunCancelSwitchSpecialistMiddleware(middleware cancelSwitchSpecialistMw, input *e.ApproveCancelSpecialistDto) error { if !me.SyncOn { return nil } diff --git a/internal/use-case/main-use-case/encounter/middleware.go b/internal/use-case/main-use-case/encounter/middleware.go index 306e4bca..0db86dec 100644 --- a/internal/use-case/main-use-case/encounter/middleware.go +++ b/internal/use-case/main-use-case/encounter/middleware.go @@ -23,7 +23,7 @@ func init() { updatestatusEncounter = append(updatestatusEncounter, updateStatusMw{Name: "sync-update-status-encounter", Func: plugin.UpdateStatus}) - requestSwitchEncounter = requestSwitchUnitMw{Name: "sync-request-switch-unit-encounter", Func: plugin.RequestSwitchUnit} - approveSwitchEncounter = approveSwitchUnitMw{Name: "sync-approve-switch-unit-encounter", Func: plugin.ApproveSwitchUnit} - cancelSwitchEncounter = cancelSwitchUnitMw{Name: "sync-cancel-switch-unit-encounter", Func: plugin.CancelSwitchUnit} + requestSwitchEncounter = requestSwitchSpecialistMw{Name: "sync-request-switch-unit-encounter", Func: plugin.RequestSwitchSpecialist} + approveSwitchEncounter = approveSwitchSpecialistMw{Name: "sync-approve-switch-unit-encounter", Func: plugin.ApproveSwitchSpecialist} + cancelSwitchEncounter = cancelSwitchSpecialistMw{Name: "sync-cancel-switch-unit-encounter", Func: plugin.CancelSwitchSpecialist} } diff --git a/internal/use-case/main-use-case/encounter/tycovar.go b/internal/use-case/main-use-case/encounter/tycovar.go index 376baed8..fbafc4dd 100644 --- a/internal/use-case/main-use-case/encounter/tycovar.go +++ b/internal/use-case/main-use-case/encounter/tycovar.go @@ -59,19 +59,19 @@ type updateStatusMw struct { Func func(input *e.Encounter) error } -type requestSwitchUnitMw struct { +type requestSwitchSpecialistMw struct { Name string Func func(input *e.Encounter) error } -type approveSwitchUnitMw struct { +type approveSwitchSpecialistMw struct { Name string - Func func(input *e.ApproveCancelUnitDto) error + Func func(input *e.ApproveCancelSpecialistDto) error } -type cancelSwitchUnitMw struct { +type cancelSwitchSpecialistMw struct { Name string - Func func(input *e.ApproveCancelUnitDto) error + Func func(input *e.ApproveCancelSpecialistDto) error } type createWithPatientMw struct { @@ -96,8 +96,8 @@ var deletePostMw []readDetailMw var checkinEncounterMw checkinMw var checkoutEncounter checkoutMw var updatestatusEncounter []updateStatusMw -var requestSwitchEncounter requestSwitchUnitMw -var approveSwitchEncounter approveSwitchUnitMw -var cancelSwitchEncounter cancelSwitchUnitMw +var requestSwitchEncounter requestSwitchSpecialistMw +var approveSwitchEncounter approveSwitchSpecialistMw +var cancelSwitchEncounter cancelSwitchSpecialistMw var createWithPatientPreMw []createWithPatientMw var createWithPatientPostMw []createWithPatientMw diff --git a/internal/use-case/main-use-case/infra/helper.go b/internal/use-case/main-use-case/infra/helper.go index 27c5442c..82048ebf 100644 --- a/internal/use-case/main-use-case/infra/helper.go +++ b/internal/use-case/main-use-case/infra/helper.go @@ -57,7 +57,6 @@ func createProcedureRoom(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error roomCreate := er.CreateDto{ Code: input.Infra_Code, Infra_Code: input.Infra_Code, - Unit_Code: input.Unit_Code, Specialist_Code: input.Specialist_Code, Subspecialist_Code: input.Subspecialist_Code, } 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 26b8903f..7ffdf9e4 100644 --- a/internal/use-case/main-use-case/internal-reference/helper.go +++ b/internal/use-case/main-use-case/internal-reference/helper.go @@ -12,7 +12,7 @@ import ( func setDataCreate(input *ir.CreateDto, data *ir.InternalReference) { data.Encounter_Id = input.Encounter_Id - data.Unit_Code = input.Unit_Code + data.Specialist_Code = input.Specialist_Code data.Doctor_Code = input.Doctor_Code data.SrcDoctor_Code = input.SrcDoctor_Code @@ -28,18 +28,18 @@ func setDataUpdate(input *ir.UpdateDto, data *ir.InternalReference) { data.Status_Code = &input.Status_Code } -func setBulkData(input *e.SwitchUnitDto) []ir.InternalReference { +func setBulkData(input *e.SwitchSpecialistDto) []ir.InternalReference { var data []ir.InternalReference for _, v := range *input.InternalReferences { statusCode := erc.DACNew data = append(data, ir.InternalReference{ - Encounter_Id: &input.Id, - Unit_Code: v.Unit_Code, - Doctor_Code: v.Doctor_Code, - Status_Code: &statusCode, - SrcDoctor_Code: input.Src_Doctor_Code, - SrcNurse_Code: input.Src_Nurse_Code, + Encounter_Id: &input.Id, + Specialist_Code: v.Specialist_Code, + Doctor_Code: v.Doctor_Code, + Status_Code: &statusCode, + SrcDoctor_Code: input.Src_Doctor_Code, + SrcNurse_Code: input.Src_Nurse_Code, }) } 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 0aa54b4b..eb3ca18f 100644 --- a/internal/use-case/main-use-case/internal-reference/lib.go +++ b/internal/use-case/main-use-case/internal-reference/lib.go @@ -144,7 +144,7 @@ func DeleteData(data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) e return nil } -func CreateBulkData(input *e.SwitchUnitDto, event *pl.Event, dbx ...*gorm.DB) error { +func CreateBulkData(input *e.SwitchSpecialistDto, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "started", "DBCreate") data := setBulkData(input) diff --git a/internal/use-case/main-use-case/nurse/helper.go b/internal/use-case/main-use-case/nurse/helper.go index 49078088..cfdf7eb4 100644 --- a/internal/use-case/main-use-case/nurse/helper.go +++ b/internal/use-case/main-use-case/nurse/helper.go @@ -20,6 +20,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Nurse) { data.Code = inputSrc.Code data.Employee_Id = inputSrc.Employee_Id data.IHS_Number = inputSrc.IHS_Number - data.Unit_Code = inputSrc.Unit_Code + data.Specialist_Code = inputSrc.Specialist_Code data.Infra_Code = inputSrc.Infra_Code } diff --git a/internal/use-case/main-use-case/practice-schedule/helper.go b/internal/use-case/main-use-case/practice-schedule/helper.go index ba61b691..1fbe4b5d 100644 --- a/internal/use-case/main-use-case/practice-schedule/helper.go +++ b/internal/use-case/main-use-case/practice-schedule/helper.go @@ -18,7 +18,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PracticeSchedule) { } data.Doctor_Code = inputSrc.Doctor_Code - data.Unit_Code = inputSrc.Unit_Code + data.Specialist_Code = inputSrc.Specialist_Code data.Day_Code = inputSrc.Day_Code data.StartTime = inputSrc.StartTime data.EndTime = inputSrc.EndTime diff --git a/internal/use-case/main-use-case/procedure-room/helper.go b/internal/use-case/main-use-case/procedure-room/helper.go index 0101efef..fa16d16b 100644 --- a/internal/use-case/main-use-case/procedure-room/helper.go +++ b/internal/use-case/main-use-case/procedure-room/helper.go @@ -19,7 +19,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureRoom) { data.Code = *inputSrc.Infra_Code data.Infra_Code = inputSrc.Infra_Code - data.Unit_Code = inputSrc.Unit_Code data.Specialist_Code = inputSrc.Specialist_Code data.Subspecialist_Code = inputSrc.Subspecialist_Code } diff --git a/internal/use-case/main-use-case/specialist/helper.go b/internal/use-case/main-use-case/specialist/helper.go index 5c59b1cf..8a71d2cb 100644 --- a/internal/use-case/main-use-case/specialist/helper.go +++ b/internal/use-case/main-use-case/specialist/helper.go @@ -19,5 +19,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) { data.Code = inputSrc.Code data.Name = inputSrc.Name - data.Unit_Code = inputSrc.Unit_Code + data.Installation_Code = inputSrc.Installation_Code } diff --git a/internal/use-case/main-use-case/unit-position/case.go b/internal/use-case/main-use-case/unit-position/case.go deleted file mode 100644 index c472e90c..00000000 --- a/internal/use-case/main-use-case/unit-position/case.go +++ /dev/null @@ -1,302 +0,0 @@ -package unit_position - -import ( - ee "simrs-vx/internal/domain/main-entities/employee" - eu "simrs-vx/internal/domain/main-entities/unit" - e "simrs-vx/internal/domain/main-entities/unit-position" - "strconv" - - ue "simrs-vx/internal/use-case/main-use-case/employee" - uu "simrs-vx/internal/use-case/main-use-case/unit" - - 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 = "unit-position" - -func Create(input e.CreateDto) (*d.Data, error) { - data := e.UnitPosition{} - - 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 := validateForeignKey(input); 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.UnitPosition - var dataList []e.UnitPosition - 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.UnitPosition - 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{Code: &input.Code} - var data *e.UnitPosition - 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 := validateForeignKey(input.CreateDto); 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{Code: input.Code} - var data *e.UnitPosition - 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 validateForeignKey(input e.CreateDto) error { - // validate installation_id - if _, err := uu.ReadDetail(eu.ReadDetailDto{Code: input.Unit_Code}); err != nil { - return err - } - - // validate employee_Id - if _, err := ue.ReadDetail(ee.ReadDetailDto{Id: uint16(*input.Employee_Id)}); err != nil { - return err - } - return nil -} diff --git a/internal/use-case/main-use-case/unit-position/helper.go b/internal/use-case/main-use-case/unit-position/helper.go deleted file mode 100644 index 827dfcc3..00000000 --- a/internal/use-case/main-use-case/unit-position/helper.go +++ /dev/null @@ -1,25 +0,0 @@ -/* -DESCRIPTION: -Any functions that are used internally by the use-case -*/ -package unit_position - -import ( - e "simrs-vx/internal/domain/main-entities/unit-position" -) - -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.UnitPosition) { - var inputSrc *e.CreateDto - if inputT, ok := any(input).(*e.CreateDto); ok { - inputSrc = inputT - } else { - inputTemp := any(input).(*e.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - data.Unit_Code = inputSrc.Unit_Code - data.Code = inputSrc.Code - data.Name = inputSrc.Name - data.HeadStatus = inputSrc.HeadStatus - data.Employee_Id = inputSrc.Employee_Id -} diff --git a/internal/use-case/main-use-case/unit-position/lib.go b/internal/use-case/main-use-case/unit-position/lib.go deleted file mode 100644 index 104357e5..00000000 --- a/internal/use-case/main-use-case/unit-position/lib.go +++ /dev/null @@ -1,156 +0,0 @@ -package unit_position - -import ( - "errors" - e "simrs-vx/internal/domain/main-entities/unit-position" - - 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.UnitPosition, error) { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - data := e.UnitPosition{} - 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.UnitPosition, *e.MetaDto, error) { - pl.SetLogInfo(event, input, "started", "DBReadList") - data := []e.UnitPosition{} - 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.UnitPosition{}). - 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 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 -} - -func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.UnitPosition, error) { - pl.SetLogInfo(event, input, "started", "DBReadDetail") - data := e.UnitPosition{} - - var tx, getData *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - switch { - case input.Id != nil: - getData = tx.First(&data, input.Id) - case input.Code != nil && *input.Code != "": - getData = tx.Where("\"Code\" = ?", *input.Code).First(&data) - default: - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-read-detail-fail", - Detail: "either Id or Code must be provided", - } - - return nil, pl.SetLogError(event, nil) - } - - if err := getData.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.UnitPosition, 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.UnitPosition, 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/unit-position/middleware-runner.go b/internal/use-case/main-use-case/unit-position/middleware-runner.go deleted file mode 100644 index 73092025..00000000 --- a/internal/use-case/main-use-case/unit-position/middleware-runner.go +++ /dev/null @@ -1,103 +0,0 @@ -package unit_position - -import ( - e "simrs-vx/internal/domain/main-entities/unit-position" - 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.UnitPosition) 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.UnitPosition) 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.UnitPosition) 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.UnitPosition) 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.UnitPosition) 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/unit-position/middleware.go b/internal/use-case/main-use-case/unit-position/middleware.go deleted file mode 100644 index 44c1e396..00000000 --- a/internal/use-case/main-use-case/unit-position/middleware.go +++ /dev/null @@ -1,9 +0,0 @@ -package unit_position - -// 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/unit-position/tycovar.go b/internal/use-case/main-use-case/unit-position/tycovar.go deleted file mode 100644 index 451d6445..00000000 --- a/internal/use-case/main-use-case/unit-position/tycovar.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -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 unit_position - -import ( - "gorm.io/gorm" - - e "simrs-vx/internal/domain/main-entities/unit-position" -) - -type createMw struct { - Name string - Func func(input *e.CreateDto, data *e.UnitPosition, tx *gorm.DB) error -} - -type readListMw struct { - Name string - Func func(input *e.ReadListDto, data *e.UnitPosition, tx *gorm.DB) error -} - -type readDetailMw struct { - Name string - Func func(input *e.ReadDetailDto, data *e.UnitPosition, 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/unit/case.go b/internal/use-case/main-use-case/unit/case.go deleted file mode 100644 index c73c2c1d..00000000 --- a/internal/use-case/main-use-case/unit/case.go +++ /dev/null @@ -1,280 +0,0 @@ -package unit - -import ( - "errors" - e "simrs-vx/internal/domain/main-entities/unit" - erc "simrs-vx/internal/domain/references/common" - esync "simrs-vx/internal/domain/sync-entities/log" - "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 = "unit" - -func Create(input e.CreateDto) (*d.Data, error) { - data := e.Unit{} - - event := pl.Event{ - Feature: "Create", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "create") - - // validate unit_code - _, err := strconv.Atoi(input.Code) - if err != nil { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "invalid_code_format", - Detail: "unit_code must be a valid integer", - Raw: errors.New("invalid unit_code format"), - } - return nil, pl.SetLogError(&event, input) - } - - mwRunner := newMiddlewareRunner(&event) - - err = dg.I.Transaction(func(tx *gorm.DB) error { - if resData, err := CreateData(input, &event, tx); err != nil { - return err - } else { - data = *resData - id := uint(data.Id) - input.Id = &id - } - - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunCreateMiddleware(createPreMw, &input); err != nil { - return err - } - - return nil - }) - - if err = runLogMiddleware(err, input, mwRunner); err != nil { - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - 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 dataList []e.Unit - 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 { - if dataList, metaList, err = ReadListData(input, &event, tx); 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.Unit - 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 { - if data, err = ReadDetailData(input, &event, tx); 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{Code: &input.Code} - var data *e.Unit - var err error - - event := pl.Event{ - Feature: "Update", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "update") - mwRunner := newMiddlewareRunner(&event) - - 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 - } - - input.Id = &data.Id - if err := UpdateData(input, data, &event, tx); err != nil { - return err - } - - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunUpdateMiddleware(updatePreMw, &input); err != nil { - return err - } - - return nil - }) - - if err = runLogMiddleware(err, input, mwRunner); err != nil { - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - 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{Code: input.Code} - var data *e.Unit - var err error - - event := pl.Event{ - Feature: "Delete", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "delete") - mwRunner := newMiddlewareRunner(&event) - - 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 - } - - input.Id = &data.Id - if err := DeleteData(data, &event, tx); err != nil { - return err - } - - mwRunner.setMwType(pu.MWTPre) - // Run pre-middleware - if err := mwRunner.RunDeleteMiddleware(deletePreMw, &input); err != nil { - return err - } - - return nil - }) - - if err = runLogMiddleware(err, input, mwRunner); err != nil { - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.IS{ - "source": source, - "structure": "single-data", - "status": "deleted", - }, - Data: data.ToResponse(), - }, nil - -} - -func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error { - var errMsg string - inputLog := esync.SimxLogDto{ - Payload: input, - Method: erc.CCCreate, - } - - if err != nil { - // Run log-middleware - errMsg = err.Error() - inputLog.ErrMessage = &errMsg - inputLog.IsSuccess = false - - // create log failed - if errMiddleware := mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); errMiddleware != nil { - return errMiddleware - } - return err - } - - // create log success - inputLog.IsSuccess = true - if err = mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); err != nil { - return err - } - - return nil -} diff --git a/internal/use-case/main-use-case/unit/helper.go b/internal/use-case/main-use-case/unit/helper.go deleted file mode 100644 index 8ee7f7e6..00000000 --- a/internal/use-case/main-use-case/unit/helper.go +++ /dev/null @@ -1,23 +0,0 @@ -/* -DESCRIPTION: -Any functions that are used internally by the use-case -*/ -package unit - -import ( - e "simrs-vx/internal/domain/main-entities/unit" -) - -func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Unit) { - var inputSrc *e.CreateDto - if inputT, ok := any(input).(*e.CreateDto); ok { - inputSrc = inputT - } else { - inputTemp := any(input).(*e.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - data.Installation_Code = inputSrc.Installation_Code - data.Code = inputSrc.Code - data.Name = inputSrc.Name -} diff --git a/internal/use-case/main-use-case/unit/lib.go b/internal/use-case/main-use-case/unit/lib.go deleted file mode 100644 index 3ec4a10c..00000000 --- a/internal/use-case/main-use-case/unit/lib.go +++ /dev/null @@ -1,149 +0,0 @@ -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" - - 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.Unit, error) { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - data := e.Unit{} - 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.Unit, *e.MetaDto, error) { - pl.SetLogInfo(event, input, "started", "DBReadList") - data := []e.Unit{} - 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.Unit{}). - 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.Unit, error) { - pl.SetLogInfo(event, input, "started", "DBReadDetail") - data := e.Unit{} - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - if input.Code != nil { - tx = tx.Where("\"Code\" = ?", *input.Code) - } - if input.Id != nil { - tx = tx.Where("\"Id\" = ?", input.Id) - } - - if err := tx. - Scopes(gh.Preload(input.Includes)). - 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.Unit, 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.Unit, 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/unit/middleware-runner.go b/internal/use-case/main-use-case/unit/middleware-runner.go deleted file mode 100644 index a02bb9cf..00000000 --- a/internal/use-case/main-use-case/unit/middleware-runner.go +++ /dev/null @@ -1,148 +0,0 @@ -package unit - -import ( - pl "simrs-vx/pkg/logger" - pu "simrs-vx/pkg/use-case-helper" - - "gorm.io/gorm" - - sync "simrs-vx/internal/infra/sync-consumer-cfg" - - e "simrs-vx/internal/domain/main-entities/unit" - esync "simrs-vx/internal/domain/sync-entities/log" -) - -type middlewareRunner struct { - Event *pl.Event - Tx *gorm.DB - MwType pu.MWType - SyncOn bool -} - -// NewMiddlewareExecutor creates a new middleware executor -func newMiddlewareRunner(event *pl.Event) *middlewareRunner { - return &middlewareRunner{ - Event: event, - SyncOn: sync.O.Enable, - } -} - -// ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, nil) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input); err != nil { - return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err) - } - - pl.SetLogInfo(me.Event, nil, "complete") - } - return nil -} - -// ExecuteCreateMiddleware executes create middleware -func (me *middlewareRunner) RunCreateLogMiddleware(middlewares []createLogMw, input *esync.SimxLogDto) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, nil) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input); 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.Unit) error { - if !me.SyncOn { - return nil - } - - 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.Unit) error { - if !me.SyncOn { - return nil - } - - 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 []updateMw, input *e.UpdateDto) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, nil) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input); 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 []deleteMw, input *e.DeleteDto) error { - if !me.SyncOn { - return nil - } - - for _, middleware := range middlewares { - logData := pu.GetLogData(input, nil) - - pl.SetLogInfo(me.Event, logData, "started", middleware.Name) - - if err := middleware.Func(input); 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/unit/middleware.go b/internal/use-case/main-use-case/unit/middleware.go deleted file mode 100644 index 03ef2c19..00000000 --- a/internal/use-case/main-use-case/unit/middleware.go +++ /dev/null @@ -1,20 +0,0 @@ -package unit - -import ( - plugin "simrs-vx/internal/use-case/simgos-sync-plugin/new/unit" -) - -// example of middleware -func init() { - createPreMw = append(createPreMw, - createMw{Name: "sync-create-unit", Func: plugin.Create}) - - createSimxLogMw = append(createSimxLogMw, - createLogMw{Name: "create-sync-log", Func: plugin.CreateLog}) - - updatePreMw = append(updatePreMw, - updateMw{Name: "sync-update-unit", Func: plugin.Update}) - - deletePreMw = append(deletePreMw, - deleteMw{Name: "sync-delete-unit", Func: plugin.Delete}) -} diff --git a/internal/use-case/main-use-case/unit/tycovar.go b/internal/use-case/main-use-case/unit/tycovar.go deleted file mode 100644 index bf717333..00000000 --- a/internal/use-case/main-use-case/unit/tycovar.go +++ /dev/null @@ -1,61 +0,0 @@ -/* -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 unit - -import ( - "gorm.io/gorm" - - e "simrs-vx/internal/domain/main-entities/unit" - elog "simrs-vx/internal/domain/sync-entities/log" -) - -type createMw struct { - Name string - Func func(input *e.CreateDto) error -} - -type createLogMw struct { - Name string - Func func(input *elog.SimxLogDto) error -} - -type updateMw struct { - Name string - Func func(input *e.UpdateDto) error -} - -type deleteMw struct { - Name string - Func func(input *e.DeleteDto) error -} - -type readListMw struct { - Name string - Func func(input *e.ReadListDto, data *e.Unit, tx *gorm.DB) error -} - -type readDetailMw struct { - Name string - Func func(input *e.ReadDetailDto, data *e.Unit, tx *gorm.DB) error -} - -type UpdateMw = updateMw -type DeleteMw = deleteMw - -var createPreMw []createMw // preprocess middleware -var createPostMw []createMw // postprocess middleware -var createSimxLogMw []createLogMw -var readListPreMw []readListMw // .. -var readListPostMw []readListMw // .. -var readDetailPreMw []readDetailMw -var readDetailPostMw []readDetailMw -var updatePreMw []updateMw -var updatePostMw []readDetailMw -var deletePreMw []deleteMw -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 154695fb..e50aa156 100644 --- a/internal/use-case/main-use-case/user/case.go +++ b/internal/use-case/main-use-case/user/case.go @@ -114,7 +114,6 @@ func Create(input e.CreateDto) (*d.Data, error) { Employee_Id: &employeeData.Id, IHS_Number: input.IHS_Number, SIP_Number: input.SIP_Number, - Unit_Code: input.Unit_Code, Specialist_Code: input.Specialist_Code, Subspecialist_Code: input.Subspecialist_Code, } @@ -123,11 +122,11 @@ func Create(input e.CreateDto) (*d.Data, error) { } case ero.EPCNur: createNurse := en.CreateDto{ - Code: input.Code, - Employee_Id: &employeeData.Id, - IHS_Number: input.IHS_Number, - Unit_Code: input.Unit_Code, - Infra_Code: input.Infra_Code, + Code: input.Code, + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + Specialist_Code: input.Specialist_Code, + Infra_Code: input.Infra_Code, } if _, err := un.CreateData(createNurse, &event, tx); err != nil { return err @@ -436,11 +435,11 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } createNur := en.CreateDto{ - Code: input.Code, - Employee_Id: &employeeData.Id, - IHS_Number: input.IHS_Number, - Unit_Code: input.Unit_Code, - Infra_Code: input.Infra_Code, + Code: input.Code, + Employee_Id: &employeeData.Id, + IHS_Number: input.IHS_Number, + Specialist_Code: input.Specialist_Code, + Infra_Code: input.Infra_Code, } if readNurData != nil { if err := un.UpdateData(en.UpdateDto{CreateDto: createNur}, readNurData, &event, tx); err != nil { diff --git a/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go b/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go index 2f5e2515..69e79b77 100644 --- a/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go +++ b/internal/use-case/simgos-sync-plugin/new/encounter/plugin.go @@ -49,19 +49,19 @@ func UpdateStatus(input *e.Encounter) error { return helper.DoJsonRequest(input, "PATCH", endpoint) } -func RequestSwitchUnit(input *e.Encounter) error { +func RequestSwitchSpecialist(input *e.Encounter) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v/req-switch-unit", prefixEndpoint, input.Id) return helper.DoJsonRequest(input, "PATCH", endpoint) } -func ApproveSwitchUnit(input *e.ApproveCancelUnitDto) error { +func ApproveSwitchSpecialist(input *e.ApproveCancelSpecialistDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v/approve-switch-unit", prefixEndpoint, input.Id) return helper.DoJsonRequest(input, "PATCH", endpoint) } -func CancelSwitchUnit(input *e.ApproveCancelUnitDto) error { +func CancelSwitchSpecialist(input *e.ApproveCancelSpecialistDto) error { prefixEndpoint := getPrefixEndpoint() endpoint := fmt.Sprintf("%s/%v/cancel-switch-unit", prefixEndpoint, input.Id) return helper.DoJsonRequest(input, "PATCH", endpoint) diff --git a/internal/use-case/simgos-sync-plugin/new/unit/plugin.go b/internal/use-case/simgos-sync-plugin/new/unit/plugin.go deleted file mode 100644 index f646f450..00000000 --- a/internal/use-case/simgos-sync-plugin/new/unit/plugin.go +++ /dev/null @@ -1,37 +0,0 @@ -package unit - -import ( - "fmt" - helper "simrs-vx/internal/use-case/simgos-sync-plugin/new" - - sync "simrs-vx/internal/infra/sync-consumer-cfg" - - e "simrs-vx/internal/domain/main-entities/unit" - elog "simrs-vx/internal/domain/sync-entities/log" -) - -func Create(input *e.CreateDto) error { - return helper.DoJsonRequest(input, "POST", getPrefixEndpoint()) -} - -func CreateLog(input *elog.SimxLogDto) error { - prefixEndpoint := getPrefixEndpoint() - endpoint := prefixEndpoint + "/log" - return helper.DoJsonRequest(input, "POST", endpoint) -} - -func Update(input *e.UpdateDto) error { - prefixEndpoint := getPrefixEndpoint() - endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - return helper.DoJsonRequest(input, "PATCH", endpoint) -} - -func Delete(input *e.DeleteDto) error { - prefixEndpoint := getPrefixEndpoint() - endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id) - return helper.DoJsonRequest(input, "DELETE", endpoint) -} - -func getPrefixEndpoint() string { - return fmt.Sprintf("%s%s/v1/unit", sync.O.TargetHost, sync.O.Prefix) -} diff --git a/internal/use-case/simgos-sync-plugin/old/.keep b/internal/use-case/simgos-sync-plugin/old/.keep new file mode 100644 index 00000000..e69de29b diff --git a/internal/use-case/simgos-sync-use-case/new/encounter/case.go b/internal/use-case/simgos-sync-use-case/new/encounter/case.go index 05c77915..db1cb654 100644 --- a/internal/use-case/simgos-sync-use-case/new/encounter/case.go +++ b/internal/use-case/simgos-sync-use-case/new/encounter/case.go @@ -368,18 +368,18 @@ func UpdateStatus(input e.Encounter) (*d.Data, error) { }, nil } -func RequestSwitchUnit(input e.Encounter) (*d.Data, error) { +func RequestSwitchSpecialist(input e.Encounter) (*d.Data, error) { var ( syncLinkInternal *[]syncir.InternalReferenceLink ) event := pl.Event{ - Feature: "RequestSwitchUnit", + Feature: "RequestSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "request-switch-unit") + pl.SetLogInfo(&event, input, "started", "request-switch-specialist") // STEP 1: Get Link syncLink, err := ReadDetailLinkData(input.Id, &event) @@ -431,14 +431,14 @@ func RequestSwitchUnit(input e.Encounter) (*d.Data, error) { }, nil } -func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { +func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) { event := pl.Event{ - Feature: "ApproveSwitchUnit", + Feature: "ApproveSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "approve-switch-unit") + pl.SetLogInfo(&event, input, "started", "approve-switch-specialist") // STEP 1: Get InternalReference Link syncLink, err := utph.ReadDetailLinkData(input.InternalReferences_Id, &event) @@ -478,14 +478,14 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { }, nil } -func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) { +func CancelSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) { event := pl.Event{ - Feature: "CancelSwitchUnit", + Feature: "CancelSwitchSpecialist", Source: source, } // Start log - pl.SetLogInfo(&event, input, "started", "cancel-switch-unit") + pl.SetLogInfo(&event, input, "started", "cancel-switch-specialist") // STEP 1: Get InternalReference Link syncLink, err := utph.ReadDetailLinkData(input.InternalReferences_Id, &event) diff --git a/internal/use-case/simgos-sync-use-case/new/encounter/helper.go b/internal/use-case/simgos-sync-use-case/new/encounter/helper.go index 97656afe..f88ba59f 100644 --- a/internal/use-case/simgos-sync-use-case/new/encounter/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/encounter/helper.go @@ -77,8 +77,8 @@ func setDataTPendaftaran(input *e.Encounter, data *etp.TPendaftaran) { data.Tglreg = input.RegisteredAt // set kdpoly - if p := input.Unit_Code; p != nil { - kdpoly, _ := strconv.Atoi(*input.Unit_Code) + if p := input.Specialist_Code; p != nil { + kdpoly, _ := strconv.Atoi(*input.Specialist_Code) data.Kdpoly = uint(kdpoly) } diff --git a/internal/use-case/simgos-sync-use-case/new/internal-reference/helper.go b/internal/use-case/simgos-sync-use-case/new/internal-reference/helper.go index 9cb55785..6ac98549 100644 --- a/internal/use-case/simgos-sync-use-case/new/internal-reference/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/internal-reference/helper.go @@ -24,7 +24,7 @@ func setCreateDataSimgos(input e.Encounter, data *etp.TPendaftaran) (hist []etph for i, ref := range *enc { hist = append(hist, etph.TPemeriksaanHist{ Idxdaftar: &data.Idxdaftar, - Kdpoly: stringtouint(*ref.Unit_Code), + Kdpoly: stringtouint(*ref.Specialist_Code), DokterPengonsul: stringtouint(*ref.SrcDoctor_Code), DokterPenerima: stringtouint(*ref.Doctor_Code), }) @@ -46,7 +46,7 @@ func setCreateDataSimgos(input e.Encounter, data *etp.TPendaftaran) (hist []etph return } -func setUpdateApproveDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist) { +func setUpdateApproveDataSimgos(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist) { data.DokterPenerima = stringtouint(*input.Dst_Doctor_Code) data.StartKonsul = &now data.UserPenerima = &input.User_Name @@ -54,7 +54,7 @@ func setUpdateApproveDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeri return } -func setUpdateCancelDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist) { +func setUpdateCancelDataSimgos(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist) { data.UserBatal = &input.User_Name data.TglBatal = &now diff --git a/internal/use-case/simgos-sync-use-case/new/internal-reference/lib.go b/internal/use-case/simgos-sync-use-case/new/internal-reference/lib.go index 2263f230..b3c526c5 100644 --- a/internal/use-case/simgos-sync-use-case/new/internal-reference/lib.go +++ b/internal/use-case/simgos-sync-use-case/new/internal-reference/lib.go @@ -61,7 +61,7 @@ func ReadDetailSimgosData(simgosId uint, event *pl.Event) (*etph.TPemeriksaanHis return &data, nil } -func UpdateSimgosData(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist, method string, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateSimgosData(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist, method string, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, input, "started", "DBUpdate") switch method { diff --git a/internal/use-case/simgos-sync-use-case/new/unit/case.go b/internal/use-case/simgos-sync-use-case/new/unit/case.go deleted file mode 100644 index 3450a4cb..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/case.go +++ /dev/null @@ -1,198 +0,0 @@ -package unit - -import ( - pl "simrs-vx/pkg/logger" - - d "github.com/karincake/dodol" - "gorm.io/gorm" - - db "simrs-vx/pkg/dualtrx-helper" - - e "simrs-vx/internal/domain/main-entities/unit" - esimgos "simrs-vx/internal/domain/simgos-entities/m-poly" - elog "simrs-vx/internal/domain/sync-entities/log" - esync "simrs-vx/internal/domain/sync-entities/unit" -) - -const source = "unit" - -func Create(input e.CreateDto) (*d.Data, error) { - var ( - sgData *esimgos.MPoly - syncLink *esync.UnitLink - err error - ) - - event := pl.Event{ - Feature: "Create", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "create") - - err = db.WithDualTx(func(tx *db.Dualtx) error { - // STEP 1: Insert to simgos - sgData, err = CreateSimgosData(input, &event, tx.Simgos) - if err != nil { - return err - } - - // STEP 2: Insert to Link - syncLink, err = CreateLinkData(*input.Id, sgData.Kode, &event, tx.Sync) - if err != nil { - return err - } - - return nil - }) - - if err != nil { - if syncLink != nil { - go func() { _ = DeleteLinkData(syncLink, &event) }() - } - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.II{ - "source": source, - "structure": "single-data", - "status": "created", - }, - }, nil -} - -func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) { - event := pl.Event{ - Feature: "Create", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "create") - - tx := db.NewTx() - err := tx.Sync.Transaction(func(tx *gorm.DB) error { - // Insert to Log - if err := CreateLogData(input, &event, tx); err != nil { - return err - } - - return nil - }) - - if err != nil { - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.II{ - "source": source, - "structure": "single-data", - "status": "created", - }, - }, nil -} - -func Update(input e.UpdateDto) (*d.Data, error) { - event := pl.Event{ - Feature: "Update", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "update") - - // STEP 1: Get Installation Link - syncLink, err := ReadDetailLinkData(*input.Id, &event) - if err != nil { - return nil, err - } - - tx := db.NewTx() - err = tx.Simgos.Transaction(func(tx *gorm.DB) error { - // Step 2: Update Simgos - err = UpdateSimgosData(input, syncLink, &event, tx) - if err != nil { - return err - } - - return nil - }) - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.IS{ - "source": source, - "structure": "single-data", - "status": "updated", - }, - }, nil -} - -func Delete(input e.DeleteDto) (*d.Data, error) { - var isLinkDeleted bool - - event := pl.Event{ - Feature: "Delete", - Source: source, - } - - // Start log - pl.SetLogInfo(&event, input, "started", "delete") - - // STEP 1: Get Installation Link - syncLink, err := ReadDetailLinkData(*input.Id, &event) - if err != nil { - return nil, err - } - - // STEP 2: Get Simgos - sgData, err := ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event) - if err != nil { - return nil, err - } - - err = db.WithDualTx(func(tx *db.Dualtx) error { - // STEP 3: Delete M_Poly Simgos - err = HardDeleteSimgosData(sgData, &event, tx.Simgos) - if err != nil { - return err - } - - // STEP 4: Delete Installation Link - err = DeleteLinkData(syncLink, &event, tx.Sync) - if err != nil { - return err - } - - isLinkDeleted = true - return nil - }) - - if err != nil { - if isLinkDeleted { - go func() { - _, _ = CreateLinkData(uint(*input.Id), sgData.Kode, &event) - }() - } - return nil, err - } - - pl.SetLogInfo(&event, nil, "complete") - - return &d.Data{ - Meta: d.IS{ - "source": source, - "structure": "single-data", - "status": "deleted", - }, - }, nil - -} diff --git a/internal/use-case/simgos-sync-use-case/new/unit/helper.go b/internal/use-case/simgos-sync-use-case/new/unit/helper.go deleted file mode 100644 index d7dfb1f6..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/helper.go +++ /dev/null @@ -1,62 +0,0 @@ -/* -DESCRIPTION: -Any functions that are used internally by the use-case -*/ -package unit - -import ( - "encoding/json" - erc "simrs-vx/internal/domain/references/common" - "strconv" - - e "simrs-vx/internal/domain/main-entities/unit" - - esimgos "simrs-vx/internal/domain/simgos-entities/m-poly" - esyncLog "simrs-vx/internal/domain/sync-entities/log" - esync "simrs-vx/internal/domain/sync-entities/unit" -) - -func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MPoly) { - var inputSrc *e.CreateDto - if inputT, ok := any(input).(*e.CreateDto); ok { - inputSrc = inputT - } else { - inputTemp := any(input).(*e.UpdateDto) - inputSrc = &inputTemp.CreateDto - } - - data.Nama = inputSrc.Name - data.Jenispoly = 0 - - kodePoly, _ := strconv.Atoi(inputSrc.Code) - data.Kode = uint(kodePoly) - return -} - -func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.UnitSimxLog) { - // encode to JSON - jsonData, _ := json.MarshalIndent(input.Payload, "", " ") - jsonString := string(jsonData) - - var status erc.ProcessStatusCode - if input.IsSuccess { - status = erc.PSCSuccess - } else { - status = erc.PSCFailed - if input.ErrMessage != nil { - data.ErrMessage = input.ErrMessage - } - } - - data.Value = &jsonString - data.Date = &now - data.Status = status - - return -} - -func setDataSimxLink(simxId, simgosId uint) (data esync.UnitLink) { - data.Simx_Id = simxId - data.Simgos_Id = simgosId - return -} diff --git a/internal/use-case/simgos-sync-use-case/new/unit/lib.go b/internal/use-case/simgos-sync-use-case/new/unit/lib.go deleted file mode 100644 index 8712ab03..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/lib.go +++ /dev/null @@ -1,188 +0,0 @@ -package unit - -import ( - plh "simrs-vx/pkg/lib-helper" - pl "simrs-vx/pkg/logger" - pu "simrs-vx/pkg/use-case-helper" - "time" - - dg "github.com/karincake/apem/db-gorm-pg" - "gorm.io/gorm" - - e "simrs-vx/internal/domain/main-entities/unit" - esimgos "simrs-vx/internal/domain/simgos-entities/m-poly" - esynclog "simrs-vx/internal/domain/sync-entities/log" - esync "simrs-vx/internal/domain/sync-entities/unit" -) - -var now = time.Now() - -func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esimgos.MPoly, error) { - pl.SetLogInfo(event, nil, "started", "DBCreate") - - data := setDataSimgos(&input) - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.IS["simrs"] - } - - if err := tx.Create(&data).Error; err != nil { - return nil, plh.HandleCreateError(input, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func ReadDetailSimgosData(simgosId uint16, event *pl.Event) (*esimgos.MPoly, error) { - pl.SetLogInfo(event, simgosId, "started", "DBReadDetail") - data := esimgos.MPoly{} - - var tx = dg.IS["simrs"] - - if err := tx. - Where("\"kode\" = ?", simgosId). - First(&data).Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, simgosId, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func UpdateSimgosData(input e.UpdateDto, dataSimgos *esync.UnitLink, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, input, "started", "DBUpdate") - - data := setDataSimgos(&input) - data.Kode = dataSimgos.Simgos_Id - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.IS["simrs"] - } - - 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 HardDeleteSimgosData(data *esimgos.MPoly, 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.IS["simrs"] - } - - 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 CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.UnitLink, error) { - pl.SetLogInfo(event, nil, "started", "DBCreate") - data := setDataSimxLink(simxId, simgosId) - - 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(data, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.UnitLink, error) { - pl.SetLogInfo(event, simxId, "started", "DBReadDetail") - data := esync.UnitLink{} - - var tx = dg.I - - if err := tx. - Where("\"Simx_Id\" = ?", simxId). - First(&data).Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, simxId, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func DeleteLinkData(data *esync.UnitLink, 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 CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) error { - pl.SetLogInfo(event, nil, "started", "DBCreate") - data := setDataSimxLog(&input) - - var tx *gorm.DB - if len(dbx) > 0 { - tx = dbx[0] - } else { - tx = dg.I - } - - if err := tx.Create(&data).Error; err != nil { - return plh.HandleCreateError(input, event, err) - } - - pl.SetLogInfo(event, nil, "complete") - return nil -} diff --git a/internal/use-case/simgos-sync-use-case/new/unit/middleware-runner.go b/internal/use-case/simgos-sync-use-case/new/unit/middleware-runner.go deleted file mode 100644 index 64426eb9..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/middleware-runner.go +++ /dev/null @@ -1,104 +0,0 @@ -package unit - -import ( - pl "simrs-vx/pkg/logger" - pu "simrs-vx/pkg/use-case-helper" - - "gorm.io/gorm" - - e "simrs-vx/internal/domain/main-entities/unit" -) - -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.Unit) 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.Unit) 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.Unit) 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.Unit) 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.Unit) 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/simgos-sync-use-case/new/unit/middleware.go b/internal/use-case/simgos-sync-use-case/new/unit/middleware.go deleted file mode 100644 index bac48f4d..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/middleware.go +++ /dev/null @@ -1,9 +0,0 @@ -package unit - -// 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/simgos-sync-use-case/new/unit/tycovar.go b/internal/use-case/simgos-sync-use-case/new/unit/tycovar.go deleted file mode 100644 index e1a7c69f..00000000 --- a/internal/use-case/simgos-sync-use-case/new/unit/tycovar.go +++ /dev/null @@ -1,44 +0,0 @@ -/* -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 unit - -import ( - "gorm.io/gorm" - - e "simrs-vx/internal/domain/main-entities/unit" -) - -type createMw struct { - Name string - Func func(input *e.CreateDto, data *e.Unit, tx *gorm.DB) error -} - -type readListMw struct { - Name string - Func func(input *e.ReadListDto, data *e.Unit, tx *gorm.DB) error -} - -type readDetailMw struct { - Name string - Func func(input *e.ReadDetailDto, data *e.Unit, 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 a892e5ee437cadcff26168ea1debcf77fd1c6f28 Mon Sep 17 00:00:00 2001 From: vanilia Date: Thu, 11 Dec 2025 18:35:43 +0700 Subject: [PATCH 13/31] ongoing seed subspecialist --- .../domain/main-entities/installation/dto.go | 4 + .../domain/main-entities/specialist/dto.go | 4 + .../domain/main-entities/subspecialist/dto.go | 4 + .../satu-entities/daftar-specialist/entity.go | 12 ++ .../domain/simgos-entities/m-ruang/entity.go | 24 ++++ internal/infra/satu-db/satu-db.go | 9 ++ internal/infra/satu-db/tycovar.go | 5 + .../main-handler/installation/handler.go | 9 ++ .../interface/main-handler/main-handler.go | 27 ++++- .../main-handler/specialist/handler.go | 9 ++ .../main-handler/subspecialist/handler.go | 9 ++ .../simgos-sync-handler.go | 2 + .../main-use-case/installation/case.go | 34 ++++++ .../main-use-case/installation/helper.go | 12 ++ .../main-use-case/installation/lib.go | 24 ++++ .../use-case/main-use-case/specialist/case.go | 34 ++++++ .../main-use-case/specialist/helper.go | 11 ++ .../use-case/main-use-case/specialist/lib.go | 24 ++++ .../main-use-case/subspecialist/case.go | 34 ++++++ .../main-use-case/subspecialist/helper.go | 14 +++ .../main-use-case/subspecialist/lib.go | 24 ++++ .../new/installation/helper.go | 12 ++ .../new/installation/lib.go | 23 ++++ .../new/specialist/helper.go | 12 ++ .../new/specialist/lib.go | 23 ++++ .../new/subspecialist/helper.go | 6 +- .../new/subspecialist/lib.go | 33 +++++- .../simgos-sync-use-case/seeder/helper.go | 1 + .../seeder/installation/seeder.go | 92 ++++++++++++++++ .../seeder/seeder/seeder.go | 103 +++++++++++------- .../seeder/specialist/seeder.go | 90 +++++++++++++++ .../seeder/subspecialist/seeder.go | 100 +++++++++++++++++ pkg/dualtrx-helper/dualtrx-helper.go | 2 + 33 files changed, 773 insertions(+), 53 deletions(-) create mode 100644 internal/domain/satu-entities/daftar-specialist/entity.go create mode 100644 internal/domain/simgos-entities/m-ruang/entity.go create mode 100644 internal/infra/satu-db/satu-db.go create mode 100644 internal/infra/satu-db/tycovar.go create mode 100644 internal/use-case/simgos-sync-use-case/seeder/installation/seeder.go create mode 100644 internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go create mode 100644 internal/use-case/simgos-sync-use-case/seeder/subspecialist/seeder.go diff --git a/internal/domain/main-entities/installation/dto.go b/internal/domain/main-entities/installation/dto.go index bd6fcc0e..56fdb382 100644 --- a/internal/domain/main-entities/installation/dto.go +++ b/internal/domain/main-entities/installation/dto.go @@ -14,6 +14,10 @@ type CreateDto struct { EncounterClass_Code ere.EncounterClassCode `json:"encounterClass_code" validate:"maxLength=20"` } +type CreateBulkDto struct { + Value []CreateDto `json:"value"` +} + type ReadListDto struct { FilterDto Includes string `json:"includes"` diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index 2d656556..90eb38b4 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -44,6 +44,10 @@ type DeleteDto struct { Code *string `json:"code"` } +type CreateBulkDto struct { + Value []CreateDto `json:"value"` +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` diff --git a/internal/domain/main-entities/subspecialist/dto.go b/internal/domain/main-entities/subspecialist/dto.go index 303da04f..378fdd2c 100644 --- a/internal/domain/main-entities/subspecialist/dto.go +++ b/internal/domain/main-entities/subspecialist/dto.go @@ -43,6 +43,10 @@ type DeleteDto struct { Code *string `json:"code"` } +type CreateBulkDto struct { + Value []CreateDto `json:"value"` +} + type MetaDto struct { PageNumber int `json:"page_number"` PageSize int `json:"page_size"` diff --git a/internal/domain/satu-entities/daftar-specialist/entity.go b/internal/domain/satu-entities/daftar-specialist/entity.go new file mode 100644 index 00000000..de69a7bf --- /dev/null +++ b/internal/domain/satu-entities/daftar-specialist/entity.go @@ -0,0 +1,12 @@ +package daftar_specialist + +type DaftarSpesialis struct { + ID uint `json:"id" gorm:"column:id;primaryKey;autoIncrement"` + Kode string `json:"kode" gorm:"column:Kode"` + Spesialis string `json:"spesialis" gorm:"column:Spesialis"` + IdGroupLocationSimgos *string `json:"id_group_location_simgos" gorm:"column:Id_group_location_simgos"` +} + +func (DaftarSpesialis) TableName() string { + return "daftar_spesialis" +} diff --git a/internal/domain/simgos-entities/m-ruang/entity.go b/internal/domain/simgos-entities/m-ruang/entity.go new file mode 100644 index 00000000..1c2b5b31 --- /dev/null +++ b/internal/domain/simgos-entities/m-ruang/entity.go @@ -0,0 +1,24 @@ +package m_ruang + +type MRuang struct { + No uint `json:"no" gorm:"column:no;primaryKey;autoIncrement"` + Nama string `json:"nama" gorm:"column:nama"` + Kelas string `json:"kelas" gorm:"column:kelas"` + IdxRuang string `json:"idx_ruang" gorm:"column:idx_ruang"` + Kelompok string `json:"kelompok" gorm:"column:kelompok"` + Ruang *string `json:"ruang" gorm:"column:ruang"` + KdUnit int `json:"kdunit" gorm:"column:kdunit"` + JumlahTT int `json:"jumlah_tt" gorm:"column:jumlah_tt"` + KetRuang *string `json:"ket_ruang" gorm:"column:ket_ruang"` + Fasilitas *string `json:"fasilitas" gorm:"column:fasilitas"` + Keterangan *string `json:"keterangan" gorm:"column:keterangan"` + SubSistem string `json:"subsistem" gorm:"column:subsistem"` + StAktif int16 `json:"st_aktif" gorm:"column:st_aktif"` + KodeRuang *string `json:"kode_ruang" gorm:"column:kode_ruang"` + IsPartial *string `json:"is_partial" gorm:"column:is_partial"` +} + +// Nama tabel (opsional jika nama struct ≠ nama tabel) +func (MRuang) TableName() string { + return "m_ruang" +} diff --git a/internal/infra/satu-db/satu-db.go b/internal/infra/satu-db/satu-db.go new file mode 100644 index 00000000..4894b4e3 --- /dev/null +++ b/internal/infra/satu-db/satu-db.go @@ -0,0 +1,9 @@ +package simgos_db + +import ( + dg "github.com/karincake/apem/db-gorm-pg" +) + +func SetInstance() { + I = dg.IS["satu"] +} diff --git a/internal/infra/satu-db/tycovar.go b/internal/infra/satu-db/tycovar.go new file mode 100644 index 00000000..b9c9f2b3 --- /dev/null +++ b/internal/infra/satu-db/tycovar.go @@ -0,0 +1,5 @@ +package simgos_db + +import "gorm.io/gorm" + +var I *gorm.DB diff --git a/internal/interface/main-handler/installation/handler.go b/internal/interface/main-handler/installation/handler.go index 0b3f52ef..f9644129 100644 --- a/internal/interface/main-handler/installation/handler.go +++ b/internal/interface/main-handler/installation/handler.go @@ -71,3 +71,12 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) CreateBulk(w http.ResponseWriter, r *http.Request) { + dto := e.CreateBulkDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.CreateBulk(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 f6f6bfce..130cdc2d 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -367,12 +367,33 @@ func SetRoutes() http.Handler { /******************** sources ********************/ hc.RegCrudByCode(r, "/v1/division", division.O) hc.RegCrudByCode(r, "/v1/division-position", divisionposition.O) - hc.RegCrudByCode(r, "/v1/installation", installation.O) + hk.GroupRoutes("/v1/installation", r, hk.MapHandlerFunc{ + "GET /": installation.O.GetList, + "GET /{id}": installation.O.GetDetail, + "POST /": installation.O.Create, + "PATCH /{id}": installation.O.Update, + "DELETE /{id}": installation.O.Delete, + "POST /bulk": installation.O.CreateBulk, + }) hc.RegCrudByCode(r, "/v1/unit", unit.O) hc.RegCrudByCode(r, "/v1/installation-position", installationposition.O) hc.RegCrudByCode(r, "/v1/unit-position", unitposition.O) - hc.RegCrudByCode(r, "/v1/specialist", specialist.O) - hc.RegCrudByCode(r, "/v1/subspecialist", subspecialist.O) + hk.GroupRoutes("/v1/specialist", r, hk.MapHandlerFunc{ + "GET /": specialist.O.GetList, + "GET /{id}": specialist.O.GetDetail, + "POST /": specialist.O.Create, + "PATCH /{id}": specialist.O.Update, + "DELETE /{id}": specialist.O.Delete, + "POST /bulk": specialist.O.CreateBulk, + }) + hk.GroupRoutes("/v1/subspecialist", r, hk.MapHandlerFunc{ + "GET /": subspecialist.O.GetList, + "GET /{id}": subspecialist.O.GetDetail, + "POST /": subspecialist.O.Create, + "PATCH /{id}": subspecialist.O.Update, + "DELETE /{id}": subspecialist.O.Delete, + "POST /bulk": subspecialist.O.CreateBulk, + }) hc.RegCrudByCode(r, "/v1/specialist-position", specialistposition.O) hc.RegCrudByCode(r, "/v1/subspecialist-position", subspecialistposition.O) hc.RegCrudByCode(r, "/v1/infra", infra.O) diff --git a/internal/interface/main-handler/specialist/handler.go b/internal/interface/main-handler/specialist/handler.go index 246da8f4..184fbd79 100644 --- a/internal/interface/main-handler/specialist/handler.go +++ b/internal/interface/main-handler/specialist/handler.go @@ -71,3 +71,12 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) CreateBulk(w http.ResponseWriter, r *http.Request) { + dto := e.CreateBulkDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.CreateBulk(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/subspecialist/handler.go b/internal/interface/main-handler/subspecialist/handler.go index 0e5a41d0..f021b592 100644 --- a/internal/interface/main-handler/subspecialist/handler.go +++ b/internal/interface/main-handler/subspecialist/handler.go @@ -71,3 +71,12 @@ func (obj myBase) Delete(w http.ResponseWriter, r *http.Request) { res, err := u.Delete(dto) rw.DataResponse(w, res, err) } + +func (obj myBase) CreateBulk(w http.ResponseWriter, r *http.Request) { + dto := e.CreateBulkDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + res, err := u.CreateBulk(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/simgos-sync-handler/simgos-sync-handler.go b/internal/interface/simgos-sync-handler/simgos-sync-handler.go index c8a08b7f..d3b9ee72 100644 --- a/internal/interface/simgos-sync-handler/simgos-sync-handler.go +++ b/internal/interface/simgos-sync-handler/simgos-sync-handler.go @@ -5,6 +5,7 @@ import ( /******************** infra ********************/ gs "simrs-vx/internal/infra/gorm-setting" + satudb "simrs-vx/internal/infra/satu-db" simgosdb "simrs-vx/internal/infra/simgos-db" sync "simrs-vx/internal/infra/sync-cfg" @@ -44,6 +45,7 @@ func SetRoutes() http.Handler { a.RegisterExtCall(lh.Populate) a.RegisterExtCall(sync.SetConfig) a.RegisterExtCall(simgosdb.SetInstance) + a.RegisterExtCall(satudb.SetInstance) r := http.NewServeMux() diff --git a/internal/use-case/main-use-case/installation/case.go b/internal/use-case/main-use-case/installation/case.go index b80b6ca5..fb18b655 100644 --- a/internal/use-case/main-use-case/installation/case.go +++ b/internal/use-case/main-use-case/installation/case.go @@ -241,6 +241,40 @@ func Delete(input e.DeleteDto) (*d.Data, error) { } +func CreateBulk(input e.CreateBulkDto) (*d.Data, error) { + var data []e.Installation + + event := pl.Event{ + Feature: "Create", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + err := dg.I.Transaction(func(tx *gorm.DB) error { + if resData, err := CreateBulkData(input.Value, &event, tx); err != nil { + return err + } else { + data = *resData + } + return nil + }) + + if err != nil { + return nil, err + } + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: e.ToResponseList(data), + }, nil +} + func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error { var errMsg string inputLog := esync.SimxLogDto{ diff --git a/internal/use-case/main-use-case/installation/helper.go b/internal/use-case/main-use-case/installation/helper.go index d3d96b5c..a8055c6c 100644 --- a/internal/use-case/main-use-case/installation/helper.go +++ b/internal/use-case/main-use-case/installation/helper.go @@ -21,3 +21,15 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Installation) { data.Name = inputSrc.Name data.EncounterClass_Code = inputSrc.EncounterClass_Code } + +func setBulkData(input []e.CreateDto) (data []e.Installation) { + for _, i := range input { + data = append(data, e.Installation{ + Code: *i.Code, + Name: i.Name, + EncounterClass_Code: i.EncounterClass_Code, + }) + } + + return data +} diff --git a/internal/use-case/main-use-case/installation/lib.go b/internal/use-case/main-use-case/installation/lib.go index d75b2ecd..218c738d 100644 --- a/internal/use-case/main-use-case/installation/lib.go +++ b/internal/use-case/main-use-case/installation/lib.go @@ -1,6 +1,7 @@ package installation import ( + "fmt" e "simrs-vx/internal/domain/main-entities/installation" plh "simrs-vx/pkg/lib-helper" @@ -147,3 +148,26 @@ func DeleteData(data *e.Installation, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func CreateBulkData(input []e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.Installation, error) { + pl.SetLogInfo(event, nil, "started", "DBBulkCreate") + + data := setBulkData(input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + result := tx.Create(&data) + if err := result.Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + fmt.Println("Inserted:", result.RowsAffected) + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/main-use-case/specialist/case.go b/internal/use-case/main-use-case/specialist/case.go index f9f5442b..547677cd 100644 --- a/internal/use-case/main-use-case/specialist/case.go +++ b/internal/use-case/main-use-case/specialist/case.go @@ -295,3 +295,37 @@ func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error { return nil } + +func CreateBulk(input e.CreateBulkDto) (*d.Data, error) { + var data []e.Specialist + + event := pl.Event{ + Feature: "CreateBulk", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + err := dg.I.Transaction(func(tx *gorm.DB) error { + if resData, err := CreateBulkData(input.Value, &event, tx); err != nil { + return err + } else { + data = *resData + } + return nil + }) + + if err != nil { + return nil, err + } + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: e.ToResponseList(data), + }, nil +} diff --git a/internal/use-case/main-use-case/specialist/helper.go b/internal/use-case/main-use-case/specialist/helper.go index 5c59b1cf..0071b816 100644 --- a/internal/use-case/main-use-case/specialist/helper.go +++ b/internal/use-case/main-use-case/specialist/helper.go @@ -21,3 +21,14 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) { data.Name = inputSrc.Name data.Unit_Code = inputSrc.Unit_Code } + +func setBulkData(input []e.CreateDto) (data []e.Specialist) { + for _, i := range input { + data = append(data, e.Specialist{ + Code: i.Code, + Name: i.Name, + }) + } + + return data +} diff --git a/internal/use-case/main-use-case/specialist/lib.go b/internal/use-case/main-use-case/specialist/lib.go index 069f5fbb..c7f27b91 100644 --- a/internal/use-case/main-use-case/specialist/lib.go +++ b/internal/use-case/main-use-case/specialist/lib.go @@ -1,6 +1,7 @@ package specialist import ( + "fmt" e "simrs-vx/internal/domain/main-entities/specialist" plh "simrs-vx/pkg/lib-helper" @@ -147,3 +148,26 @@ func DeleteData(data *e.Specialist, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func CreateBulkData(input []e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.Specialist, error) { + pl.SetLogInfo(event, nil, "started", "DBBulkCreate") + + data := setBulkData(input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + result := tx.Create(&data) + if err := result.Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + fmt.Println("Inserted:", result.RowsAffected) + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/main-use-case/subspecialist/case.go b/internal/use-case/main-use-case/subspecialist/case.go index ca99750d..7d60b73b 100644 --- a/internal/use-case/main-use-case/subspecialist/case.go +++ b/internal/use-case/main-use-case/subspecialist/case.go @@ -293,3 +293,37 @@ func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error { return nil } + +func CreateBulk(input e.CreateBulkDto) (*d.Data, error) { + var data []e.Subspecialist + + event := pl.Event{ + Feature: "CreateBulk", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, input, "started", "create") + err := dg.I.Transaction(func(tx *gorm.DB) error { + if resData, err := CreateBulkData(input.Value, &event, tx); err != nil { + return err + } else { + data = *resData + } + return nil + }) + + if err != nil { + return nil, err + } + pl.SetLogInfo(&event, nil, "complete") + + return &d.Data{ + Meta: d.II{ + "source": source, + "structure": "single-data", + "status": "created", + }, + Data: e.ToResponseList(data), + }, nil +} diff --git a/internal/use-case/main-use-case/subspecialist/helper.go b/internal/use-case/main-use-case/subspecialist/helper.go index 08d64941..4cb1b8da 100644 --- a/internal/use-case/main-use-case/subspecialist/helper.go +++ b/internal/use-case/main-use-case/subspecialist/helper.go @@ -6,6 +6,7 @@ package subspecialist import ( e "simrs-vx/internal/domain/main-entities/subspecialist" + "simrs-vx/internal/domain/main-entities/subspecialist/base" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Subspecialist) { @@ -21,3 +22,16 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Subspecialist) { data.Name = inputSrc.Name data.Specialist_Code = inputSrc.Specialist_Code } + +func setBulkData(input []e.CreateDto) (data []e.Subspecialist) { + for _, i := range input { + data = append(data, e.Subspecialist{ + Basic: base.Basic{ + Code: i.Code, + Name: i.Name, + }, + }) + } + + return data +} diff --git a/internal/use-case/main-use-case/subspecialist/lib.go b/internal/use-case/main-use-case/subspecialist/lib.go index c5a742df..af35fa56 100644 --- a/internal/use-case/main-use-case/subspecialist/lib.go +++ b/internal/use-case/main-use-case/subspecialist/lib.go @@ -1,6 +1,7 @@ package subspecialist import ( + "fmt" e "simrs-vx/internal/domain/main-entities/subspecialist" plh "simrs-vx/pkg/lib-helper" @@ -147,3 +148,26 @@ func DeleteData(data *e.Subspecialist, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, nil, "complete") return nil } + +func CreateBulkData(input []e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*[]e.Subspecialist, error) { + pl.SetLogInfo(event, nil, "started", "DBBulkCreate") + + data := setBulkData(input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + result := tx.Create(&data) + if err := result.Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + fmt.Println("Inserted:", result.RowsAffected) + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/installation/helper.go b/internal/use-case/simgos-sync-use-case/new/installation/helper.go index 1bb722dd..ab0efb25 100644 --- a/internal/use-case/simgos-sync-use-case/new/installation/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/installation/helper.go @@ -11,6 +11,7 @@ import ( esimgos "simrs-vx/internal/domain/simgos-entities/m-instalasi" esync "simrs-vx/internal/domain/sync-entities/installation" esyncLog "simrs-vx/internal/domain/sync-entities/log" + "strconv" ) func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MInstalasi) { @@ -56,3 +57,14 @@ func setDataSimxLink(simxId, simgosId uint) (data esync.InstallationLink) { data.Simgos_Id = simgosId return } + +func setBulkDataSimxLink(input []e.Installation) (data []esync.InstallationLink) { + for _, i := range input { + kode, _ := strconv.Atoi(i.Code) + data = append(data, esync.InstallationLink{ + Simx_Id: uint(i.Id), + Simgos_Id: uint(kode), + }) + } + return +} diff --git a/internal/use-case/simgos-sync-use-case/new/installation/lib.go b/internal/use-case/simgos-sync-use-case/new/installation/lib.go index a8d074fa..bd906679 100644 --- a/internal/use-case/simgos-sync-use-case/new/installation/lib.go +++ b/internal/use-case/simgos-sync-use-case/new/installation/lib.go @@ -1,6 +1,7 @@ package installation import ( + "fmt" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -212,3 +213,25 @@ func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) pl.SetLogInfo(event, nil, "complete") return nil } + +func CreateBulkLinkData(input []e.Installation, event *pl.Event, dbx ...*gorm.DB) (*[]esync.InstallationLink, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setBulkDataSimxLink(input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + result := tx.Create(&data) + if err := result.Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + fmt.Println("Inserted Link:", result.RowsAffected) + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/specialist/helper.go b/internal/use-case/simgos-sync-use-case/new/specialist/helper.go index adce079f..21ed4996 100644 --- a/internal/use-case/simgos-sync-use-case/new/specialist/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/specialist/helper.go @@ -7,6 +7,7 @@ package specialist import ( "encoding/json" erc "simrs-vx/internal/domain/references/common" + "strconv" e "simrs-vx/internal/domain/main-entities/specialist" esimgos "simrs-vx/internal/domain/simgos-entities/m-polihfis" @@ -58,3 +59,14 @@ func setDataSimxLink(simxId, simgosId uint) (data esync.SpecialistLink) { data.Simgos_Id = simgosId return } + +func setBulkDataSimxLink(input []e.Specialist) (data []esync.SpecialistLink) { + for _, i := range input { + kode, _ := strconv.Atoi(i.Code) + data = append(data, esync.SpecialistLink{ + Simx_Id: uint(i.Id), + Simgos_Id: uint(kode), + }) + } + return +} diff --git a/internal/use-case/simgos-sync-use-case/new/specialist/lib.go b/internal/use-case/simgos-sync-use-case/new/specialist/lib.go index 0aee2ceb..787c0039 100644 --- a/internal/use-case/simgos-sync-use-case/new/specialist/lib.go +++ b/internal/use-case/simgos-sync-use-case/new/specialist/lib.go @@ -1,6 +1,7 @@ package specialist import ( + "fmt" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -189,3 +190,25 @@ func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) pl.SetLogInfo(event, nil, "complete") return nil } + +func CreateBulkLinkData(input []e.Specialist, event *pl.Event, dbx ...*gorm.DB) (*[]esync.SpecialistLink, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + data := setBulkDataSimxLink(input) + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + result := tx.Create(&data) + if err := result.Error; err != nil { + return nil, plh.HandleCreateError(input, event, err) + } + + fmt.Println("Inserted Link:", result.RowsAffected) + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/new/subspecialist/helper.go b/internal/use-case/simgos-sync-use-case/new/subspecialist/helper.go index 898f161c..2e1460d6 100644 --- a/internal/use-case/simgos-sync-use-case/new/subspecialist/helper.go +++ b/internal/use-case/simgos-sync-use-case/new/subspecialist/helper.go @@ -9,7 +9,7 @@ import ( erc "simrs-vx/internal/domain/references/common" //esimgos "simrs-vx/internal/domain/simgos-entities/specialist" esyncLog "simrs-vx/internal/domain/sync-entities/log" - esync "simrs-vx/internal/domain/sync-entities/specialist" + esync "simrs-vx/internal/domain/sync-entities/subspecialist" ) //func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MPolihfis) { @@ -30,7 +30,7 @@ import ( // return //} -func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.SpecialistSimxLog) { +func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.SubspecialistSimxLog) { // encode to JSON jsonData, _ := json.MarshalIndent(input.Payload, "", " ") jsonString := string(jsonData) @@ -52,7 +52,7 @@ func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.SpecialistSimxLog) { return } -func setDataSimxLink(simxId, simgosId uint) (data esync.SpecialistLink) { +func setDataSimxLink(simxId, simgosId uint) (data esync.SubspecialistLink) { data.Simx_Id = simxId data.Simgos_Id = simgosId return diff --git a/internal/use-case/simgos-sync-use-case/new/subspecialist/lib.go b/internal/use-case/simgos-sync-use-case/new/subspecialist/lib.go index 781e899d..d9d7381d 100644 --- a/internal/use-case/simgos-sync-use-case/new/subspecialist/lib.go +++ b/internal/use-case/simgos-sync-use-case/new/subspecialist/lib.go @@ -1,6 +1,7 @@ package subspecialist import ( + "fmt" plh "simrs-vx/pkg/lib-helper" pl "simrs-vx/pkg/logger" pu "simrs-vx/pkg/use-case-helper" @@ -9,9 +10,8 @@ import ( dg "github.com/karincake/apem/db-gorm-pg" "gorm.io/gorm" - //esimgos "simrs-vx/internal/domain/simgos-entities/specialist" esynclog "simrs-vx/internal/domain/sync-entities/log" - esync "simrs-vx/internal/domain/sync-entities/specialist" + esync "simrs-vx/internal/domain/sync-entities/subspecialist" ) var now = time.Now() @@ -106,7 +106,7 @@ var now = time.Now() // return nil //} -func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.SpecialistLink, error) { +func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.SubspecialistLink, error) { pl.SetLogInfo(event, nil, "started", "DBCreate") data := setDataSimxLink(simxId, simgosId) @@ -125,9 +125,9 @@ func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.SpecialistLink, error) { +func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.SubspecialistLink, error) { pl.SetLogInfo(event, simxId, "started", "DBReadDetail") - data := esync.SpecialistLink{} + data := esync.SubspecialistLink{} var tx = dg.I @@ -143,7 +143,7 @@ func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.SpecialistLink, return &data, nil } -func DeleteLinkData(data *esync.SpecialistLink, event *pl.Event, dbx ...*gorm.DB) error { +func DeleteLinkData(data *esync.SubspecialistLink, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBDelete") var tx *gorm.DB @@ -185,3 +185,24 @@ func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) pl.SetLogInfo(event, nil, "complete") return nil } + +func CreateBulkLinkData(data []esync.SubspecialistLink, event *pl.Event, dbx ...*gorm.DB) (*[]esync.SubspecialistLink, error) { + pl.SetLogInfo(event, nil, "started", "DBCreate") + + var tx *gorm.DB + if len(dbx) > 0 { + tx = dbx[0] + } else { + tx = dg.I + } + + result := tx.Create(&data) + if err := result.Error; err != nil { + return nil, plh.HandleCreateError(data, event, err) + } + + fmt.Println("Inserted Link:", result.RowsAffected) + + pl.SetLogInfo(event, nil, "complete") + return &data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/helper.go b/internal/use-case/simgos-sync-use-case/seeder/helper.go index 74006fe2..8fc5538e 100644 --- a/internal/use-case/simgos-sync-use-case/seeder/helper.go +++ b/internal/use-case/simgos-sync-use-case/seeder/helper.go @@ -15,6 +15,7 @@ import ( type Dto struct { LoginNip []string `json:"loginNip"` Instalasi_Code string `json:"instalasi_code"` + SeedTableName string `json:"seedTableName"` } func Send(method string, endpoint string, body *bytes.Buffer, username string) ([]byte, error) { diff --git a/internal/use-case/simgos-sync-use-case/seeder/installation/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/installation/seeder.go new file mode 100644 index 00000000..04c7f028 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/installation/seeder.go @@ -0,0 +1,92 @@ +package installation + +import ( + "bytes" + "encoding/json" + "log" + "net/http" + ere "simrs-vx/internal/domain/references/encounter" + db "simrs-vx/pkg/dualtrx-helper" + pl "simrs-vx/pkg/logger" + "strconv" + + ei "simrs-vx/internal/domain/main-entities/installation" + eu "simrs-vx/internal/domain/simgos-entities/m-unit" + + ui "simrs-vx/internal/use-case/simgos-sync-use-case/new/installation" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" +) + +func SeedInstallation(event *pl.Event, tx *db.Dualtx) error { + unit := []eu.MUnit{} + + // Get M_Unit + err := tx.Simgos.Model(&eu.MUnit{}). + Find(&unit).Error + if err != nil { + log.Println("Error Querying MUnit:", err) + return err + } + + // Mapping To Installation + var installationData []ei.CreateDto + for _, v := range unit { + + codeString := strconv.Itoa(int(v.KodeUnit)) + installationData = append(installationData, ei.CreateDto{ + Name: v.NamaUnit, + EncounterClass_Code: ere.ECAmbulatory, + Code: &codeString, + }) + } + + dataInstallation, err := CreateBulkInstallation(ei.CreateBulkDto{Value: installationData}) + if err != nil { + return err + } + + _, err = ui.CreateBulkLinkData(dataInstallation, event, tx.Sync) + if err != nil { + return err + } + + return nil + +} + +func CreateBulkInstallation(ins ei.CreateBulkDto) ([]ei.Installation, error) { + var path = "installation/bulk" + + // create request body + jsonData, err := json.Marshal(ins) + if err != nil { + return nil, err + } + + reqBody := bytes.NewBuffer(jsonData) + // send data to main-api + resp, err := seeder.Send(http.MethodPost, path, reqBody, "von") + if err != nil { + return nil, err + } + + type MetaData struct { + Source string `json:"source"` + Status string `json:"status"` + Structure string `json:"structure"` + } + + type MainApiResp struct { + Meta MetaData `json:"meta"` + Data []ei.Installation `json:"data"` + } + + // getting response + var data MainApiResp + err = json.Unmarshal(resp, &data) + if err != nil { + return nil, err + } + + return data.Data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go index 49f59b99..d52caec6 100644 --- a/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go +++ b/internal/use-case/simgos-sync-use-case/seeder/seeder/seeder.go @@ -2,9 +2,6 @@ package seeder import ( "log" - "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/doctor" - "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/nurse" - "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/regular" db "simrs-vx/pkg/dualtrx-helper" pl "simrs-vx/pkg/logger" @@ -14,6 +11,13 @@ import ( el "simrs-vx/internal/domain/simgos-entities/m-login" "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" + + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/doctor" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/installation" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/nurse" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/regular" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/specialist" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder/subspecialist" ) const source = "seeder" @@ -33,52 +37,69 @@ func SeedToSimx(input seeder.Dto) (*d.Data, error) { kddokter, kdperawat []uint ) - // Get M_login - err := tx.Simgos.Model(&el.MLogin{}). - Select(`DISTINCT ON (nip) m_login.*`). - Where(`"nip" IN (?)`, input.LoginNip). - Find(&mlogin).Error - if err != nil { - log.Println("Error Querying Mlogin:", err) - return nil, err - } + switch input.SeedTableName { + case "installation": + if err := installation.SeedInstallation(&event, tx); err != nil { + return nil, err + } + case "specialist": + if err := specialist.SeedSpecialist(&event, tx); err != nil { + return nil, err + } + case "subspecialist": + if err := subspecialist.SeedSubspecialist(&event, tx); err != nil { + return nil, err + } - // SET data - if len(mlogin) > 0 { - for _, l := range mlogin { - if l.KdDokter != 0 { - kddokter = append(kddokter, l.KdDokter) - continue + default: + + // Get M_login + err := tx.Simgos.Model(&el.MLogin{}). + Select(`DISTINCT ON (nip) m_login.*`). + Where(`"nip" IN (?)`, input.LoginNip). + Find(&mlogin).Error + if err != nil { + log.Println("Error Querying Mlogin:", err) + return nil, err + } + + // SET data + if len(mlogin) > 0 { + for _, l := range mlogin { + if l.KdDokter != 0 { + kddokter = append(kddokter, l.KdDokter) + continue + } + + if l.KdPerawat != 0 { + kdperawat = append(kdperawat, l.KdPerawat) + continue + } + + regLogin = append(regLogin, l) } + } - if l.KdPerawat != 0 { - kdperawat = append(kdperawat, l.KdPerawat) - continue + // Seed based on role + if len(kddokter) > 0 { + err = doctor.SeedDoctor(kddokter, &event, tx) + if err != nil { + return nil, err } - - regLogin = append(regLogin, l) } - } - // Seed based on role - if len(kddokter) > 0 { - err = doctor.SeedDoctor(kddokter, &event, tx) - if err != nil { - return nil, err + if len(kdperawat) > 0 { + err = nurse.SeedNurse(kdperawat, &event, tx) + if err != nil { + return nil, err + } } - } - if len(kdperawat) > 0 { - err = nurse.SeedNurse(kdperawat, &event, tx) - if err != nil { - return nil, err - } - } - - if len(regLogin) > 0 { - err = regular.SeedRegular(regLogin, input.Instalasi_Code) - if err != nil { - return nil, err + if len(regLogin) > 0 { + err = regular.SeedRegular(regLogin, input.Instalasi_Code) + if err != nil { + return nil, err + } } } diff --git a/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go new file mode 100644 index 00000000..a4cde9b3 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go @@ -0,0 +1,90 @@ +package specialist + +import ( + "bytes" + "encoding/json" + "log" + "net/http" + db "simrs-vx/pkg/dualtrx-helper" + pl "simrs-vx/pkg/logger" + "strconv" + + es "simrs-vx/internal/domain/main-entities/specialist" + er "simrs-vx/internal/domain/simgos-entities/m-ruang" + + us "simrs-vx/internal/use-case/simgos-sync-use-case/new/specialist" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" +) + +func SeedSpecialist(event *pl.Event, tx *db.Dualtx) error { + ruang := []er.MRuang{} + + // Get M_Ruang + err := tx.Simgos.Model(&er.MRuang{}). + Find(&ruang).Error + if err != nil { + log.Println("Error Querying MRuang:", err) + return err + } + + // Mapping To Installation + var speData []es.CreateDto + for _, v := range ruang { + + codeString := strconv.Itoa(int(v.No)) + speData = append(speData, es.CreateDto{ + Code: codeString, + Name: v.Nama, + }) + } + + dataSpe, err := CreateBulkSpecialist(es.CreateBulkDto{Value: speData}) + if err != nil { + return err + } + + _, err = us.CreateBulkLinkData(dataSpe, event, tx.Sync) + if err != nil { + return err + } + + return nil + +} + +func CreateBulkSpecialist(ins es.CreateBulkDto) ([]es.Specialist, error) { + var path = "specialist/bulk" + + // create request body + jsonData, err := json.Marshal(ins) + if err != nil { + return nil, err + } + + reqBody := bytes.NewBuffer(jsonData) + // send data to main-api + resp, err := seeder.Send(http.MethodPost, path, reqBody, "von") + if err != nil { + return nil, err + } + + type MetaData struct { + Source string `json:"source"` + Status string `json:"status"` + Structure string `json:"structure"` + } + + type MainApiResp struct { + Meta MetaData `json:"meta"` + Data []es.Specialist `json:"data"` + } + + // getting response + var data MainApiResp + err = json.Unmarshal(resp, &data) + if err != nil { + return nil, err + } + + return data.Data, nil +} diff --git a/internal/use-case/simgos-sync-use-case/seeder/subspecialist/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/subspecialist/seeder.go new file mode 100644 index 00000000..cc95d371 --- /dev/null +++ b/internal/use-case/simgos-sync-use-case/seeder/subspecialist/seeder.go @@ -0,0 +1,100 @@ +package subspecialist + +import ( + "bytes" + "encoding/json" + "log" + "net/http" + db "simrs-vx/pkg/dualtrx-helper" + pl "simrs-vx/pkg/logger" + + es "simrs-vx/internal/domain/main-entities/subspecialist" + eds "simrs-vx/internal/domain/satu-entities/daftar-specialist" + esb "simrs-vx/internal/domain/sync-entities/subspecialist" + + us "simrs-vx/internal/use-case/simgos-sync-use-case/new/subspecialist" + "simrs-vx/internal/use-case/simgos-sync-use-case/seeder" +) + +func SeedSubspecialist(event *pl.Event, tx *db.Dualtx) error { + dspe := []eds.DaftarSpesialis{} + subspeMap := make(map[string]uint) + + // Get Daftar Specialist + err := tx.Satu.Model(&eds.DaftarSpesialis{}). + Find(&dspe).Error + if err != nil { + log.Println("Error Querying DaftarSpecialist:", err) + return err + } + + // Mapping To Subspecialist + var speData []es.CreateDto + for _, v := range dspe { + speData = append(speData, es.CreateDto{ + Code: v.Kode, + Name: v.Spesialis, + }) + + subspeMap[v.Kode] = v.ID + } + + dataSpe, err := CreateBulkSubSpecialist(es.CreateBulkDto{Value: speData}) + if err != nil { + return err + } + + // mapping link for subspecialist + var subspecliast []esb.SubspecialistLink + for _, v := range dataSpe { + subspecliast = append(subspecliast, esb.SubspecialistLink{ + Simx_Id: uint(v.Id), + Simgos_Id: subspeMap[v.Code], + }) + } + + _, err = us.CreateBulkLinkData(subspecliast, event, tx.Sync) + if err != nil { + return err + } + + return nil + +} + +func CreateBulkSubSpecialist(ins es.CreateBulkDto) ([]es.Subspecialist, error) { + var path = "subspecialist/bulk" + + // create request body + jsonData, err := json.Marshal(ins) + if err != nil { + return nil, err + } + + reqBody := bytes.NewBuffer(jsonData) + // send data to main-api + resp, err := seeder.Send(http.MethodPost, path, reqBody, "von") + if err != nil { + return nil, err + } + + type MetaData struct { + Source string `json:"source"` + Status string `json:"status"` + Structure string `json:"structure"` + } + + type MainApiResp struct { + Meta MetaData `json:"meta"` + Data []es.Subspecialist `json:"data"` + } + + // getting response + var data MainApiResp + err = json.Unmarshal(resp, &data) + if err != nil { + return nil, err + } + + return data.Data, nil +} diff --git a/pkg/dualtrx-helper/dualtrx-helper.go b/pkg/dualtrx-helper/dualtrx-helper.go index 144337c5..94b60a5a 100644 --- a/pkg/dualtrx-helper/dualtrx-helper.go +++ b/pkg/dualtrx-helper/dualtrx-helper.go @@ -8,6 +8,7 @@ import ( type Dualtx struct { Sync *gorm.DB Simgos *gorm.DB + Satu *gorm.DB } func NewDualtx() *Dualtx { @@ -24,6 +25,7 @@ func NewTx() *Dualtx { return &Dualtx{ Sync: dg.I, Simgos: dg.IS["simrs"], + Satu: dg.IS["satu"], } } From bc1209a2706f22d4ea92988c65a606ee092c1c1a Mon Sep 17 00:00:00 2001 From: vanilia Date: Thu, 11 Dec 2025 20:22:37 +0700 Subject: [PATCH 14/31] seeder ongoing --- .../use-case/main-use-case/encounter/case.go | 2 +- .../seeder/specialist/seeder.go | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index dd131944..1c3d63aa 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -889,7 +889,7 @@ func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error } // Set doctor_code; nil indicates no change. - if input.Dst_Doctor_Code == nil { + if input.Dst_Doctor_Code == nil || *input.Dst_Doctor_Code == "" { input.Dst_Doctor_Code = irData.Doctor_Code } diff --git a/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go index a4cde9b3..038c2356 100644 --- a/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go +++ b/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go @@ -27,14 +27,25 @@ func SeedSpecialist(event *pl.Event, tx *db.Dualtx) error { return err } - // Mapping To Installation + // Mapping To Specialist var speData []es.CreateDto for _, v := range ruang { + if v.StAktif == 0 { + continue + } + + speCode := strconv.Itoa(int(v.No)) + + var insCode string + if v.KdUnit != 0 { + code := strconv.Itoa(v.KdUnit) + insCode = code + } - codeString := strconv.Itoa(int(v.No)) speData = append(speData, es.CreateDto{ - Code: codeString, - Name: v.Nama, + Code: speCode, + Name: v.Nama, + Installation_Code: insCode, }) } From 158e57f6f2794f32e0f38cb49d03a6064f899d1d Mon Sep 17 00:00:00 2001 From: vanilia Date: Fri, 12 Dec 2025 07:47:28 +0700 Subject: [PATCH 15/31] seed complete --- internal/domain/main-entities/specialist/dto.go | 8 ++++---- internal/use-case/main-use-case/specialist/helper.go | 5 +++-- .../simgos-sync-use-case/seeder/specialist/seeder.go | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index 04f848cd..1b75e7cb 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -7,10 +7,10 @@ import ( ) type CreateDto struct { - Id *uint `json:"id"` - Installation_Code string `json:"installation_code"` - Code string `json:"code" validate:"maxLength=10"` - Name string `json:"name" validate:"maxLength=50"` + Id *uint `json:"id"` + Installation_Code *string `json:"installation_code"` + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` } type ReadListDto struct { diff --git a/internal/use-case/main-use-case/specialist/helper.go b/internal/use-case/main-use-case/specialist/helper.go index 49f5745f..f5130d4e 100644 --- a/internal/use-case/main-use-case/specialist/helper.go +++ b/internal/use-case/main-use-case/specialist/helper.go @@ -25,8 +25,9 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) { func setBulkData(input []e.CreateDto) (data []e.Specialist) { for _, i := range input { data = append(data, e.Specialist{ - Code: i.Code, - Name: i.Name, + Code: i.Code, + Name: i.Name, + Installation_Code: i.Installation_Code, }) } diff --git a/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go b/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go index 038c2356..e108aaee 100644 --- a/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go +++ b/internal/use-case/simgos-sync-use-case/seeder/specialist/seeder.go @@ -36,10 +36,10 @@ func SeedSpecialist(event *pl.Event, tx *db.Dualtx) error { speCode := strconv.Itoa(int(v.No)) - var insCode string + var insCode *string if v.KdUnit != 0 { code := strconv.Itoa(v.KdUnit) - insCode = code + insCode = &code } speData = append(speData, es.CreateDto{ From f651a185b39cf3fa07c85cc46e6896ce41c0fc4d Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Fri, 12 Dec 2025 09:46:28 +0700 Subject: [PATCH 16/31] refactor/unit-dropping: perbaikan --- go.mod | 2 +- go.sum | 4 ++-- internal/domain/main-entities/doctor/dto.go | 17 +++++++++-------- internal/domain/main-entities/encounter/dto.go | 1 + .../domain/references/encounter/encounter.go | 2 +- .../use-case/main-use-case/encounter/lib.go | 10 ++++++---- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index c395bd8f..74ce299b 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,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.3.1 + github.com/karincake/getuk v0.3.2 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 da70ac51..088ad636 100644 --- a/go.sum +++ b/go.sum @@ -81,8 +81,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.3.1 h1:yRqBTrwpnjYcZD3gPDoSxFlsLgI9/GKCr3ZCsS4TtYQ= -github.com/karincake/getuk v0.3.1/go.mod h1:NVnvxSGAkQ/xuq99FzWACvY5efyKPLFla1cKB8czm7c= +github.com/karincake/getuk v0.3.2 h1:Qe+PRQ2qdgdiJlWiVEq37N8rrgS654nUnY0PWS6pMzA= +github.com/karincake/getuk v0.3.2/go.mod h1:nFl133aKQqxRbe5q9lo8q7BxlYBavmbkpglBhq/dNWk= 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/doctor/dto.go b/internal/domain/main-entities/doctor/dto.go index 9bcbc932..4a8901a5 100644 --- a/internal/domain/main-entities/doctor/dto.go +++ b/internal/domain/main-entities/doctor/dto.go @@ -26,14 +26,15 @@ type ReadListDto struct { } type FilterDto struct { - Code *string `json:"code"` - Employee_Id *uint `json:"employee-id"` - IHS_Number *string `json:"ihs-number" validate:"maxLength=20"` - SIP_Number *string `json:"sip-number" validate:"maxLength=20"` - SIP_ExpiredDate *string `json:"sip-expiredDate"` - Unit_Code *string `json:"unit-code"` - Specialist_Code *string `json:"specialist-code"` - Subspecialist_Code *string `json:"subspecialist-code"` + Code *string `json:"code"` + Employee_Id *uint `json:"employee-id"` + IHS_Number *string `json:"ihs-number" validate:"maxLength=20"` + SIP_Number *string `json:"sip-number" validate:"maxLength=20"` + SIP_ExpiredDate *string `json:"sip-expiredDate"` + Unit_Code *string `json:"unit-code"` + Specialist_Code *string `json:"specialist-code"` + Specialist_Code_Opt *string `json:"specialist-code-opt"` + Subspecialist_Code *string `json:"subspecialist-code"` } type ReadDetailDto struct { diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 5dcf76db..982f0ed8 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -105,6 +105,7 @@ type FilterDto struct { RegisteredAt *time.Time `json:"registeredAt"` Class_Code ere.EncounterClassCode `json:"class-code" validate:"maxLength=10"` Specialist_Code *string `json:"specialist-code"` + Specialist_Code_Opt *string `json:"specialist-code-opt"` Subspecialist_Code *string `json:"subspecialist-code"` VisitDate time.Time `json:"visitDate"` Appoinment_Doctor_Code *string `json:"appointment-doctor-code"` diff --git a/internal/domain/references/encounter/encounter.go b/internal/domain/references/encounter/encounter.go index 83ef759b..a3cd932e 100644 --- a/internal/domain/references/encounter/encounter.go +++ b/internal/domain/references/encounter/encounter.go @@ -70,7 +70,7 @@ const ( OCCHcu OutpatientClassCode = "hcu" // HCU OCCVk OutpatientClassCode = "vk" // Verlos kamer - ACCReg AmbulatoryClassCode = "reg" // Regular + ACCReg AmbulatoryClassCode = "regular" // Regular // ACCRehab ACCRme AmbulatoryClassCode = "rme" // Rehab Medik // ACCCad AmbulatoryClassCode = "chemo-adm" // Chemotherapy // ACCCac AmbulatoryClassCode = "chemo-act" // Chemotherapy diff --git a/internal/use-case/main-use-case/encounter/lib.go b/internal/use-case/main-use-case/encounter/lib.go index d102030a..69020f14 100644 --- a/internal/use-case/main-use-case/encounter/lib.go +++ b/internal/use-case/main-use-case/encounter/lib.go @@ -83,15 +83,17 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En tx = tx.Where("\"Encounter\".\"Status_Code\" = ?", *input.Status_Code) } - if input.Specialist_Code != nil { - tx = tx.Where("\"Encounter\".\"Specialist_Code\" = ?", *input.Specialist_Code) - } + // if input.Specialist_Code != nil { + // tx = tx.Where("\"Encounter\".\"Specialist_Code\" = ?", *input.Specialist_Code) + // } if input.PaymentMethod_Code != nil { tx = tx.Where("\"Encounter\".\"PaymentMethod_Code\" = ?", *input.PaymentMethod_Code) } - tx = tx.Scopes(gh.Preload(input.Includes)). + tx = tx.Debug(). + Scopes(gh.Filter(input.FilterDto)). + Scopes(gh.Preload(input.Includes)). Count(&count). Scopes(gh.Paginate(input, &pagination)). Order("\"CreatedAt\" DESC") From d5023bd93c34892214dfd5c2857df8d5d9bec513 Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Fri, 12 Dec 2025 09:54:45 +0700 Subject: [PATCH 17/31] reafactor/unit-dropping: missing 1 change --- internal/domain/main-entities/specialist/dto.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index 1b75e7cb..04f848cd 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -7,10 +7,10 @@ import ( ) type CreateDto struct { - Id *uint `json:"id"` - Installation_Code *string `json:"installation_code"` - Code string `json:"code" validate:"maxLength=10"` - Name string `json:"name" validate:"maxLength=50"` + Id *uint `json:"id"` + Installation_Code string `json:"installation_code"` + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` } type ReadListDto struct { From 0e7d50265df6fd5b01cd078a8582337924e9c49b Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Fri, 12 Dec 2025 10:12:39 +0700 Subject: [PATCH 18/31] feat (resume): add doctor into response --- internal/domain/main-entities/resume/dto.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/internal/domain/main-entities/resume/dto.go b/internal/domain/main-entities/resume/dto.go index e7ddf09b..d75fe3da 100644 --- a/internal/domain/main-entities/resume/dto.go +++ b/internal/domain/main-entities/resume/dto.go @@ -2,6 +2,7 @@ package resume import ( ecore "simrs-vx/internal/domain/base-entities/core" + ed "simrs-vx/internal/domain/main-entities/doctor" "time" erc "simrs-vx/internal/domain/references/common" @@ -54,6 +55,7 @@ type ResponseDto struct { ecore.Main Encounter_Id *uint `json:"encounter_id"` Doctor_Code *string `json:"doctor_code"` + Doctor *ed.Doctor `json:"doctor,omitempty" gorm:"foreignKey:Doctor_Code;references:Code"` Value *string `json:"value"` FileUrl *string `json:"fileUrl"` Status_Code erc.DataVerifiedCode `json:"status_code"` @@ -63,6 +65,7 @@ func (d Resume) ToResponse() ResponseDto { resp := ResponseDto{ Encounter_Id: d.Encounter_Id, Doctor_Code: d.Doctor_Code, + Doctor: d.Doctor, Value: d.Value, FileUrl: d.FileUrl, Status_Code: d.Status_Code, From 6daa97459bf24195fe8d9c2879d35bf5226010cd Mon Sep 17 00:00:00 2001 From: vanilia Date: Fri, 12 Dec 2025 10:12:53 +0700 Subject: [PATCH 19/31] on going chemo plan --- .../main-handler/encounter/handler.go | 26 ------------------- internal/use-case/main-use-case/chemo/case.go | 1 + 2 files changed, 1 insertion(+), 26 deletions(-) diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index 70231efb..8b8babc9 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -338,29 +338,3 @@ func (obj myBase) CreateWithPatient(w http.ResponseWriter, r *http.Request) { res, err := u.CreateWithPatient(dto) rw.DataResponse(w, res, err) } - -func (obj myBase) CreateWithPatient(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.CreateWithPatientDto{} - if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { - return - } - - // validate SubClass - if err := verifyClassCode(dto.Encounter); err != nil { - rw.DataResponse(w, nil, d.FieldError{ - Code: dataValidationFail, - Message: err.Error(), - }) - return - } - - dto.Encounter.AuthInfo = *authInfo - dto.Patient.AuthInfo = *authInfo - res, err := u.CreateWithPatient(dto) - rw.DataResponse(w, res, err) -} diff --git a/internal/use-case/main-use-case/chemo/case.go b/internal/use-case/main-use-case/chemo/case.go index b940fa37..a922c74a 100644 --- a/internal/use-case/main-use-case/chemo/case.go +++ b/internal/use-case/main-use-case/chemo/case.go @@ -330,6 +330,7 @@ func Verify(input e.VerifyDto) (*d.Data, error) { }) if err != nil { + return nil, err } return &d.Data{ From 1c6292158dddf305823b6f06d897bedd4531c476 Mon Sep 17 00:00:00 2001 From: vanilia Date: Fri, 12 Dec 2025 10:16:45 +0700 Subject: [PATCH 20/31] fix error ongoing --- internal/domain/main-entities/specialist/dto.go | 8 ++++---- internal/use-case/main-use-case/specialist/helper.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/domain/main-entities/specialist/dto.go b/internal/domain/main-entities/specialist/dto.go index 04f848cd..1b75e7cb 100644 --- a/internal/domain/main-entities/specialist/dto.go +++ b/internal/domain/main-entities/specialist/dto.go @@ -7,10 +7,10 @@ import ( ) type CreateDto struct { - Id *uint `json:"id"` - Installation_Code string `json:"installation_code"` - Code string `json:"code" validate:"maxLength=10"` - Name string `json:"name" validate:"maxLength=50"` + Id *uint `json:"id"` + Installation_Code *string `json:"installation_code"` + Code string `json:"code" validate:"maxLength=10"` + Name string `json:"name" validate:"maxLength=50"` } type ReadListDto struct { diff --git a/internal/use-case/main-use-case/specialist/helper.go b/internal/use-case/main-use-case/specialist/helper.go index f5130d4e..bc7bd51e 100644 --- a/internal/use-case/main-use-case/specialist/helper.go +++ b/internal/use-case/main-use-case/specialist/helper.go @@ -19,7 +19,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) { data.Code = inputSrc.Code data.Name = inputSrc.Name - data.Installation_Code = inputSrc.Installation_Code + data.Installation_Code = *inputSrc.Installation_Code } func setBulkData(input []e.CreateDto) (data []e.Specialist) { @@ -27,7 +27,7 @@ func setBulkData(input []e.CreateDto) (data []e.Specialist) { data = append(data, e.Specialist{ Code: i.Code, Name: i.Name, - Installation_Code: i.Installation_Code, + Installation_Code: *i.Installation_Code, }) } From b840f801c8aca6792cfcb51df82486381a6302a0 Mon Sep 17 00:00:00 2001 From: vanilia Date: Fri, 12 Dec 2025 10:23:29 +0700 Subject: [PATCH 21/31] fix error --- internal/domain/main-entities/specialist/entity.go | 2 +- internal/use-case/main-use-case/specialist/helper.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/domain/main-entities/specialist/entity.go b/internal/domain/main-entities/specialist/entity.go index 0326f614..c53e29ec 100644 --- a/internal/domain/main-entities/specialist/entity.go +++ b/internal/domain/main-entities/specialist/entity.go @@ -11,7 +11,7 @@ type Specialist struct { ecore.SmallMain // adjust this according to the needs Code string `json:"code" gorm:"unique;size:20"` Name string `json:"name" gorm:"size:50"` - Installation_Code string `json:"installation_code" gorm:"size:20"` + Installation_Code *string `json:"installation_code" gorm:"size:20"` Installation *ei.Installation `json:"installation,omitempty" gorm:"foreignKey:Installation_Code;references:Code"` SpecialistPositions []eub.Basic `json:"specialistPositions,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` Subspecialists []essb.Basic `json:"subspecialists,omitempty" gorm:"foreignKey:Specialist_Code;references:Code"` diff --git a/internal/use-case/main-use-case/specialist/helper.go b/internal/use-case/main-use-case/specialist/helper.go index bc7bd51e..f5130d4e 100644 --- a/internal/use-case/main-use-case/specialist/helper.go +++ b/internal/use-case/main-use-case/specialist/helper.go @@ -19,7 +19,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) { data.Code = inputSrc.Code data.Name = inputSrc.Name - data.Installation_Code = *inputSrc.Installation_Code + data.Installation_Code = inputSrc.Installation_Code } func setBulkData(input []e.CreateDto) (data []e.Specialist) { @@ -27,7 +27,7 @@ func setBulkData(input []e.CreateDto) (data []e.Specialist) { data = append(data, e.Specialist{ Code: i.Code, Name: i.Name, - Installation_Code: *i.Installation_Code, + Installation_Code: i.Installation_Code, }) } From ec2a02dffded5c57123e6d2b95f5e0870a5366df Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Fri, 12 Dec 2025 10:42:27 +0700 Subject: [PATCH 22/31] dev: hotfix- chorse: exclude Dockerfile --- .gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/.gitignore b/.gitignore index 4c10eb38..7800ac94 100644 --- a/.gitignore +++ b/.gitignore @@ -27,8 +27,6 @@ go.work.sum # env file .env config.yml -Dockerfile-main-api -Dockerfile-sync-api **/atlas.hcl !**/atlas.hcl.example From 44b37e2d49d41dec630993c2edc190166e7d1231 Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Fri, 12 Dec 2025 10:44:09 +0700 Subject: [PATCH 23/31] dev: hotfix - chore: Dockerfiles --- Dockerfile-main-api-example => Dockerfile-main-api | 0 Dockerfile-sync-api-example => Dockerfile-sync-api | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename Dockerfile-main-api-example => Dockerfile-main-api (100%) rename Dockerfile-sync-api-example => Dockerfile-sync-api (100%) diff --git a/Dockerfile-main-api-example b/Dockerfile-main-api similarity index 100% rename from Dockerfile-main-api-example rename to Dockerfile-main-api diff --git a/Dockerfile-sync-api-example b/Dockerfile-sync-api similarity index 100% rename from Dockerfile-sync-api-example rename to Dockerfile-sync-api From 87baa898f6c3414e979a2947fb7625b6cd15ecc8 Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Fri, 12 Dec 2025 10:51:37 +0700 Subject: [PATCH 24/31] dev: hotfixes + moved cmd/simgos-sync* to cmd/snync* + adjust Dockerfiles --- Dockerfile-main-api | 2 +- Dockerfile-sync-api | 8 ++++---- cmd/{simgos-sync-api => sync-api}/config.yml-example | 0 cmd/{simgos-sync-api => sync-api}/main.go | 0 cmd/{simgos-sync-migration => sync-migration}/Makefile | 0 .../README-ATLAS.MD | 0 .../atlas.hcl.example | 0 .../migration.go | 0 .../migrations/20251113035508.sql | 0 .../migrations/20251114071129.sql | 0 .../migrations/20251117041601.sql | 0 .../migrations/20251118082246.sql | 0 .../migrations/20251118082915.sql | 0 .../migrations/20251126115527.sql | 0 .../migrations/20251201093443.sql | 0 .../migrations/20251209083238.sql | 0 .../migrations/atlas.sum | 0 17 files changed, 5 insertions(+), 5 deletions(-) rename cmd/{simgos-sync-api => sync-api}/config.yml-example (100%) rename cmd/{simgos-sync-api => sync-api}/main.go (100%) rename cmd/{simgos-sync-migration => sync-migration}/Makefile (100%) rename cmd/{simgos-sync-migration => sync-migration}/README-ATLAS.MD (100%) rename cmd/{simgos-sync-migration => sync-migration}/atlas.hcl.example (100%) rename cmd/{simgos-sync-migration => sync-migration}/migration.go (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/20251113035508.sql (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/20251114071129.sql (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/20251117041601.sql (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/20251118082246.sql (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/20251118082915.sql (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/20251126115527.sql (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/20251201093443.sql (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/20251209083238.sql (100%) rename cmd/{simgos-sync-migration => sync-migration}/migrations/atlas.sum (100%) diff --git a/Dockerfile-main-api b/Dockerfile-main-api index cb8839b9..2037fec7 100644 --- a/Dockerfile-main-api +++ b/Dockerfile-main-api @@ -7,7 +7,7 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/main-api/main-api ./cmd/main-api/ FROM alpine:latest WORKDIR /app -COPY --from=builder /src/assets . +COPY --from=builder /src/assets ./assets COPY --from=builder /src/cmd/main-api/main-api . COPY --from=builder /src/cmd/main-api/config.yml . EXPOSE 8010 diff --git a/Dockerfile-sync-api b/Dockerfile-sync-api index 5b32d522..ae2749b5 100644 --- a/Dockerfile-sync-api +++ b/Dockerfile-sync-api @@ -3,12 +3,12 @@ WORKDIR /src COPY go.mod go.sum ./ RUN go mod download COPY . . -RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/simgos-sync-api/simgos-sync-api ./cmd/simgos-sync-api/main.go +RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/sync-api/sync-api ./cmd/sync-api/main.go FROM alpine:latest WORKDIR /app -COPY --from=builder /src/assets . -COPY --from=builder /src/cmd/simgos-sync-api/simgos-sync-api . -COPY --from=builder /src/cmd/simgos-sync-api/config.yml . +COPY --from=builder /src/assets ./assets +COPY --from=builder /src/cmd/sync-api/simgos-sync-api . +COPY --from=builder /src/cmd/sync-api/config.yml . EXPOSE 8011 CMD ["./simgos-sync-api"] diff --git a/cmd/simgos-sync-api/config.yml-example b/cmd/sync-api/config.yml-example similarity index 100% rename from cmd/simgos-sync-api/config.yml-example rename to cmd/sync-api/config.yml-example diff --git a/cmd/simgos-sync-api/main.go b/cmd/sync-api/main.go similarity index 100% rename from cmd/simgos-sync-api/main.go rename to cmd/sync-api/main.go diff --git a/cmd/simgos-sync-migration/Makefile b/cmd/sync-migration/Makefile similarity index 100% rename from cmd/simgos-sync-migration/Makefile rename to cmd/sync-migration/Makefile diff --git a/cmd/simgos-sync-migration/README-ATLAS.MD b/cmd/sync-migration/README-ATLAS.MD similarity index 100% rename from cmd/simgos-sync-migration/README-ATLAS.MD rename to cmd/sync-migration/README-ATLAS.MD diff --git a/cmd/simgos-sync-migration/atlas.hcl.example b/cmd/sync-migration/atlas.hcl.example similarity index 100% rename from cmd/simgos-sync-migration/atlas.hcl.example rename to cmd/sync-migration/atlas.hcl.example diff --git a/cmd/simgos-sync-migration/migration.go b/cmd/sync-migration/migration.go similarity index 100% rename from cmd/simgos-sync-migration/migration.go rename to cmd/sync-migration/migration.go diff --git a/cmd/simgos-sync-migration/migrations/20251113035508.sql b/cmd/sync-migration/migrations/20251113035508.sql similarity index 100% rename from cmd/simgos-sync-migration/migrations/20251113035508.sql rename to cmd/sync-migration/migrations/20251113035508.sql diff --git a/cmd/simgos-sync-migration/migrations/20251114071129.sql b/cmd/sync-migration/migrations/20251114071129.sql similarity index 100% rename from cmd/simgos-sync-migration/migrations/20251114071129.sql rename to cmd/sync-migration/migrations/20251114071129.sql diff --git a/cmd/simgos-sync-migration/migrations/20251117041601.sql b/cmd/sync-migration/migrations/20251117041601.sql similarity index 100% rename from cmd/simgos-sync-migration/migrations/20251117041601.sql rename to cmd/sync-migration/migrations/20251117041601.sql diff --git a/cmd/simgos-sync-migration/migrations/20251118082246.sql b/cmd/sync-migration/migrations/20251118082246.sql similarity index 100% rename from cmd/simgos-sync-migration/migrations/20251118082246.sql rename to cmd/sync-migration/migrations/20251118082246.sql diff --git a/cmd/simgos-sync-migration/migrations/20251118082915.sql b/cmd/sync-migration/migrations/20251118082915.sql similarity index 100% rename from cmd/simgos-sync-migration/migrations/20251118082915.sql rename to cmd/sync-migration/migrations/20251118082915.sql diff --git a/cmd/simgos-sync-migration/migrations/20251126115527.sql b/cmd/sync-migration/migrations/20251126115527.sql similarity index 100% rename from cmd/simgos-sync-migration/migrations/20251126115527.sql rename to cmd/sync-migration/migrations/20251126115527.sql diff --git a/cmd/simgos-sync-migration/migrations/20251201093443.sql b/cmd/sync-migration/migrations/20251201093443.sql similarity index 100% rename from cmd/simgos-sync-migration/migrations/20251201093443.sql rename to cmd/sync-migration/migrations/20251201093443.sql diff --git a/cmd/simgos-sync-migration/migrations/20251209083238.sql b/cmd/sync-migration/migrations/20251209083238.sql similarity index 100% rename from cmd/simgos-sync-migration/migrations/20251209083238.sql rename to cmd/sync-migration/migrations/20251209083238.sql diff --git a/cmd/simgos-sync-migration/migrations/atlas.sum b/cmd/sync-migration/migrations/atlas.sum similarity index 100% rename from cmd/simgos-sync-migration/migrations/atlas.sum rename to cmd/sync-migration/migrations/atlas.sum From 1ec7cf517e7b561916df8a4825ad4747eff74709 Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Fri, 12 Dec 2025 11:02:39 +0700 Subject: [PATCH 25/31] dev: hotfix, Dockerfile final --- Dockerfile-sync-api | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile-sync-api b/Dockerfile-sync-api index ae2749b5..c364f1a4 100644 --- a/Dockerfile-sync-api +++ b/Dockerfile-sync-api @@ -8,7 +8,7 @@ RUN CGO_ENABLED=0 GOOS=linux go build -o ./cmd/sync-api/sync-api ./cmd/sync-api/ FROM alpine:latest WORKDIR /app COPY --from=builder /src/assets ./assets -COPY --from=builder /src/cmd/sync-api/simgos-sync-api . +COPY --from=builder /src/cmd/sync-api/sync-api . COPY --from=builder /src/cmd/sync-api/config.yml . EXPOSE 8011 CMD ["./simgos-sync-api"] From d21cae7dedecd0289d530ef999eea4d09e37776b Mon Sep 17 00:00:00 2001 From: Munawwirul Jamal Date: Fri, 12 Dec 2025 11:09:54 +0700 Subject: [PATCH 26/31] dev: hotfix, Dockerfile after final --- Dockerfile-sync-api | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile-sync-api b/Dockerfile-sync-api index c364f1a4..2a66ceb8 100644 --- a/Dockerfile-sync-api +++ b/Dockerfile-sync-api @@ -11,4 +11,4 @@ COPY --from=builder /src/assets ./assets COPY --from=builder /src/cmd/sync-api/sync-api . COPY --from=builder /src/cmd/sync-api/config.yml . EXPOSE 8011 -CMD ["./simgos-sync-api"] +CMD ["./sync-api"] From cfdfac223f9b9c6b08769abc745daa8975e544e8 Mon Sep 17 00:00:00 2001 From: vanilia Date: Fri, 12 Dec 2025 13:48:34 +0700 Subject: [PATCH 27/31] protocol chemo finish --- .../domain/main-entities/chemo-plan/dto.go | 43 ++++----- .../domain/main-entities/chemo-plan/entity.go | 22 ++--- internal/domain/main-entities/chemo/dto.go | 1 + .../main-handler/chemo-plan/handler.go | 88 +++++++++++++++++++ .../main-handler/chemo-protocol/handler.go | 5 +- .../interface/main-handler/main-handler.go | 4 + .../use-case/main-use-case/chemo-plan/case.go | 6 +- .../main-use-case/chemo-plan/helper.go | 18 ++-- .../use-case/main-use-case/chemo-plan/lib.go | 12 ++- .../use-case/main-use-case/chemo/helper.go | 1 + internal/use-case/main-use-case/chemo/lib.go | 5 ++ .../main-use-case/encounter/helper.go | 86 ++++++++++++++---- internal/use-case/main-use-case/soapi/case.go | 16 +++- .../use-case/main-use-case/soapi/helper.go | 74 ++++------------ 14 files changed, 261 insertions(+), 120 deletions(-) create mode 100644 internal/interface/main-handler/chemo-plan/handler.go diff --git a/internal/domain/main-entities/chemo-plan/dto.go b/internal/domain/main-entities/chemo-plan/dto.go index c5e9cb11..29f47a70 100644 --- a/internal/domain/main-entities/chemo-plan/dto.go +++ b/internal/domain/main-entities/chemo-plan/dto.go @@ -11,14 +11,14 @@ import ( ) type CreateDto struct { - Parent_Id *uint `json:"parent_id"` - SeriesNumber *uint16 `json:"seriesNumber"` - CycleNumber *uint `json:"cycleNumber"` - PlanDate *time.Time `json:"planDate"` - RealizationDate *time.Time `json:"realizationDate"` - Notes *string `json:"notes"` - Status ere.StatusProtocolChemo `json:"status"` - Encounter_Id *uint `json:"encounter_id"` + Parent_Id *uint `json:"parent_id"` + SeriesNumber *uint16 `json:"seriesNumber"` + CycleNumber *uint `json:"cycleNumber"` + PlanDate *time.Time `json:"planDate"` + RealizationDate *time.Time `json:"realizationDate"` + Notes *string `json:"notes"` + Status *ere.StatusProtocolChemo `json:"status"` + Encounter_Id *uint `json:"encounter_id"` } type ReadListDto struct { @@ -47,12 +47,13 @@ type DeleteDto struct { } type FailDto struct { - Id uint `json:"id"` - Reasons *string `json:"reason"` + Id uint `json:"id"` + Reasons string `json:"reasons" validate:"required"` } type FailReason struct { - Date *time.Time `json:"date"` - FailReason *string `json:"failReason"` + Date *time.Time `json:"date"` + FailReason string `json:"failReason"` + Encounter_Id *uint `json:"encounter_id"` } type MetaDto struct { @@ -63,15 +64,15 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - Parent_Id *uint `json:"parent_id"` // chemo.Id - Protocol_Id *uint `json:"protocol_id"` - SeriesNumber *uint16 `json:"seriesNumber"` // series ke - - CycleNumber *uint `json:"cycleNumber"` // cycle ke - - PlanDate *time.Time `json:"planDate"` - RealizationDate *time.Time `json:"realizationDate"` - Notes *string `json:"notes"` - Status ere.StatusProtocolChemo `json:"status"` - Reasons *string `json:"reasons"` + Parent_Id *uint `json:"parent_id"` // chemo.Id + Protocol_Id *uint `json:"protocol_id"` + SeriesNumber *uint16 `json:"seriesNumber"` // series ke - + CycleNumber *uint `json:"cycleNumber"` // cycle ke - + PlanDate *time.Time `json:"planDate"` + RealizationDate *time.Time `json:"realizationDate"` + Notes *string `json:"notes"` + Status *ere.StatusProtocolChemo `json:"status"` + Reasons *string `json:"reasons"` } func (d ChemoPlan) ToResponse() ResponseDto { diff --git a/internal/domain/main-entities/chemo-plan/entity.go b/internal/domain/main-entities/chemo-plan/entity.go index 1fef099e..3698039f 100644 --- a/internal/domain/main-entities/chemo-plan/entity.go +++ b/internal/domain/main-entities/chemo-plan/entity.go @@ -11,15 +11,15 @@ import ( type ChemoPlan struct { ecore.Main - Parent_Id *uint `json:"parent_id"` // chemo.Id - Protocol_Id *uint `json:"protocol_id"` - SeriesNumber *uint16 `json:"seriesNumber"` // series ke - - CycleNumber *uint `json:"cycleNumber"` // cycle ke - - PlanDate *time.Time `json:"planDate"` - RealizationDate *time.Time `json:"realizationDate"` - Notes *string `json:"notes"` - Status ere.StatusProtocolChemo `json:"status"` - Encounter_Id *uint `json:"encounter_id"` - Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` - Reasons *string `json:"reasons"` // json + Parent_Id *uint `json:"parent_id"` // chemo.Id + Protocol_Id *uint `json:"protocol_id"` + SeriesNumber *uint16 `json:"seriesNumber"` // series ke - + CycleNumber *uint `json:"cycleNumber"` // cycle ke - + PlanDate *time.Time `json:"planDate"` + RealizationDate *time.Time `json:"realizationDate"` + Notes *string `json:"notes"` + Status *ere.StatusProtocolChemo `json:"status"` + Encounter_Id *uint `json:"encounter_id"` + Encounter *ee.Encounter `json:"encounter,omitempty" gorm:"foreignKey:Encounter_Id;references:Id"` + Reasons *string `json:"reasons"` // json } diff --git a/internal/domain/main-entities/chemo/dto.go b/internal/domain/main-entities/chemo/dto.go index 737027fb..7a74acf6 100644 --- a/internal/domain/main-entities/chemo/dto.go +++ b/internal/domain/main-entities/chemo/dto.go @@ -39,6 +39,7 @@ type FilterDto struct { VerifiedBy_User_Id *uint `json:"verifiedBy-user-id"` Specialist_Code *string `json:"specialist-code"` Patient_Id *uint `json:"patient-id"` + Class_Code ere.ChemoClassCode `json:"class-code"` } type ReadDetailDto struct { diff --git a/internal/interface/main-handler/chemo-plan/handler.go b/internal/interface/main-handler/chemo-plan/handler.go new file mode 100644 index 00000000..215797b0 --- /dev/null +++ b/internal/interface/main-handler/chemo-plan/handler.go @@ -0,0 +1,88 @@ +package chemo_protocol + +import ( + "net/http" + + rw "github.com/karincake/risoles" + sf "github.com/karincake/semprit" + + e "simrs-vx/internal/domain/main-entities/chemo-plan" + ep "simrs-vx/internal/domain/main-entities/chemo-protocol" + u "simrs-vx/internal/use-case/main-use-case/chemo-plan" +) + +type myBase struct{} + +var O myBase + +func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { + dto := ep.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{} + sf.UrlQueryParam(&dto, *r.URL) + + 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) +} + +func (obj myBase) Fail(w http.ResponseWriter, r *http.Request) { + id := rw.ValidateInt(w, "id", r.PathValue("id")) + if id <= 0 { + return + } + + dto := e.FailDto{} + if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { + return + } + + dto.Id = uint(id) + res, err := u.Fail(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/interface/main-handler/chemo-protocol/handler.go b/internal/interface/main-handler/chemo-protocol/handler.go index 92410188..4ac8d90f 100644 --- a/internal/interface/main-handler/chemo-protocol/handler.go +++ b/internal/interface/main-handler/chemo-protocol/handler.go @@ -81,11 +81,8 @@ func (obj myBase) Verify(w http.ResponseWriter, r *http.Request) { } dto := e.VerifyDto{} - if res := rw.ValidateStructByIOR(w, r.Body, &dto); !res { - return - } - dto.Id = uint(id) + authInfo, err := pa.GetAuthInfo(r) if err != nil { rw.WriteJSON(w, http.StatusUnauthorized, d.IS{"message": err.Error()}, nil) diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 937246fb..be90705d 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -81,6 +81,7 @@ import ( /******************** sources ********************/ antibioticsrc "simrs-vx/internal/interface/main-handler/antibiotic-src" antibioticsrccat "simrs-vx/internal/interface/main-handler/antibiotic-src-category" + chemoplan "simrs-vx/internal/interface/main-handler/chemo-plan" chemoprotocol "simrs-vx/internal/interface/main-handler/chemo-protocol" device "simrs-vx/internal/interface/main-handler/device" diagnosesrc "simrs-vx/internal/interface/main-handler/diagnose-src" @@ -323,6 +324,9 @@ func SetRoutes() http.Handler { "PATCH /{id}/verify": chemoprotocol.O.Verify, "PATCH /{id}/reject": chemoprotocol.O.Reject, }) + hk.GroupRoutes("/v1/chemo-plan", r, auth.GuardMW, hk.MapHandlerFunc{ + "PATCH /{id}/fail": chemoplan.O.Fail, + }) hc.RegCrud(r, "/v1/upload-file", uploadfile.O) hc.RegCrud(r, "/v1/encounter-document", encounterdocument.O) hc.RegCrud(r, "/v1/general-consent", generalconsent.O) diff --git a/internal/use-case/main-use-case/chemo-plan/case.go b/internal/use-case/main-use-case/chemo-plan/case.go index 7f74b6f7..eff45b46 100644 --- a/internal/use-case/main-use-case/chemo-plan/case.go +++ b/internal/use-case/main-use-case/chemo-plan/case.go @@ -176,7 +176,7 @@ func Update(input e.UpdateDto) (*d.Data, error) { return err } - if err := UpdateData(data, &event, tx); err != nil { + if err := UpdateData(data, "", &event, tx); err != nil { return err } @@ -284,7 +284,7 @@ func Fail(input e.FailDto) (*d.Data, error) { return nil, pl.SetLogError(&event, data) } - if data.Status != ere.SPCPlanned { + if *data.Status != ere.SPCPlanned { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "invalid-chemo-status", @@ -293,7 +293,7 @@ func Fail(input e.FailDto) (*d.Data, error) { } err = dg.I.Transaction(func(tx *gorm.DB) error { - if err := UpdateData(data, &event, tx); err != nil { + if err := UpdateFailData(input, data, &event, tx); err != nil { return err } diff --git a/internal/use-case/main-use-case/chemo-plan/helper.go b/internal/use-case/main-use-case/chemo-plan/helper.go index 5cf7ffd5..4d62f819 100644 --- a/internal/use-case/main-use-case/chemo-plan/helper.go +++ b/internal/use-case/main-use-case/chemo-plan/helper.go @@ -34,16 +34,23 @@ func setDataCreate(input *ep.CreateDto) (data []e.ChemoPlan) { return } -func setDataUpdate(data *e.ChemoPlan) { +func setDataCreateSoapi(data *e.ChemoPlan) { data.RealizationDate = &now status := ere.SPCComplete - data.Status = status + data.Status = &status +} + +func setDataDeleteSoapi(data *e.ChemoPlan) { + status := ere.SPCPlanned + data.Status = &status } func setDatafail(input e.FailDto, data *e.ChemoPlan) { data.RealizationDate = nil - data.Status = ere.SPCSchedule + + status := ere.SPCSchedule + data.Status = &status var reasons []e.FailReason @@ -52,8 +59,9 @@ func setDatafail(input e.FailDto, data *e.ChemoPlan) { } reasons = append(reasons, e.FailReason{ - FailReason: input.Reasons, - Date: &now, + FailReason: input.Reasons, + Date: &now, + Encounter_Id: data.Encounter_Id, }) if b, err := json.Marshal(reasons); err == nil { diff --git a/internal/use-case/main-use-case/chemo-plan/lib.go b/internal/use-case/main-use-case/chemo-plan/lib.go index 92d7c8eb..22d6259b 100644 --- a/internal/use-case/main-use-case/chemo-plan/lib.go +++ b/internal/use-case/main-use-case/chemo-plan/lib.go @@ -98,9 +98,15 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e return &data, nil } -func UpdateData(data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { +func UpdateData(data *e.ChemoPlan, method string, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - setDataUpdate(data) + + switch method { + case "c": + setDataCreateSoapi(data) + case "d": + setDataDeleteSoapi(data) + } var tx *gorm.DB if len(dbx) > 0 { @@ -148,7 +154,7 @@ func DeleteData(data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { func UpdateFailData(input e.FailDto, data *e.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) error { pl.SetLogInfo(event, data, "started", "DBUpdate") - setDataUpdate(data) + setDatafail(input, data) var tx *gorm.DB if len(dbx) > 0 { diff --git a/internal/use-case/main-use-case/chemo/helper.go b/internal/use-case/main-use-case/chemo/helper.go index c241bce3..96012228 100644 --- a/internal/use-case/main-use-case/chemo/helper.go +++ b/internal/use-case/main-use-case/chemo/helper.go @@ -20,4 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Chemo) { data.Encounter_Id = inputSrc.Encounter_Id data.Status_Code = inputSrc.Status_Code data.Specialist_Code = inputSrc.Specialist_Code + data.Class_Code = inputSrc.Class_Code } diff --git a/internal/use-case/main-use-case/chemo/lib.go b/internal/use-case/main-use-case/chemo/lib.go index 4b049c13..8b848d8f 100644 --- a/internal/use-case/main-use-case/chemo/lib.go +++ b/internal/use-case/main-use-case/chemo/lib.go @@ -47,6 +47,11 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch tx = dg.I } + if input.Class_Code != "" { + tx = tx.Where(`"Chemo"."Class_Code" = ?`, input.Class_Code) + input.Class_Code = "" + } + tx = tx. Model(&e.Chemo{}). Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). diff --git a/internal/use-case/main-use-case/encounter/helper.go b/internal/use-case/main-use-case/encounter/helper.go index 0d822768..29d7fa9b 100644 --- a/internal/use-case/main-use-case/encounter/helper.go +++ b/internal/use-case/main-use-case/encounter/helper.go @@ -660,21 +660,24 @@ func insertdataClassCode(input e.CreateDto, soapiData []es.CreateDto, event *pl. func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, event *pl.Event, tx *gorm.DB) (err error) { subCode := ere.AmbulatoryClassCode(*input.SubClass_Code) + var chemoPlan *ecpl.ChemoPlan switch { case subCode == ere.ACCChemo: // validate if encounter Chemo valid - chemoProtoc, err := validateChemoAdm(*input.Patient_Id, event) + chemoPlan, err = validateChemo(*input.Patient_Id, event) if err != nil { return err } - if chemoProtoc == nil { + if chemoPlan == nil { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "data-not-found", Detail: "chemo plan not found", } + + return pl.SetLogError(event, input) } chemoCreate := ec.CreateDto{ @@ -691,7 +694,8 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e } // set chemo-plan to planned - err = updateChemoPlan(chemoProtoc, event, tx) + chemoPlan.Encounter_Id = &input.Id + err = updateChemoPlan(chemoPlan, event, tx) if err != nil { return err } @@ -898,7 +902,10 @@ func updateChemoPlan(data *ecpl.ChemoPlan, event *pl.Event, dbx ...*gorm.DB) err tx = dg.I } - if err := tx.Model(&data).Update(`"Status"`, ere.SPCPlanned).Error; err != nil { + err := tx.Model(&data).Updates(map[string]interface{}{ + `"Status"`: ere.SPCPlanned, + `"Encounter_Id"`: data.Encounter_Id}).Error + if err != nil { return err } @@ -913,11 +920,15 @@ func getChemoProtocol(patientId uint, event *pl.Event) (*ecp.ChemoProtocol, erro var tx = dg.I tx = tx.Model(&ecp.ChemoProtocol{}). - Joins(`"ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`). - Where(`"Patient.Id" = ? AND cp."Status" IS NULL`, patientId). + Joins(`LEFT JOIN "ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`). + Where(`"ChemoProtocol"."Patient_Id" = ?`, patientId). Preload("ChemoPlans", func(db *gorm.DB) *gorm.DB { - return tx.Order(`"Id" ASC`).Limit(1) + return db. + Where(`"Status" IS NULL OR "Status" = ?`, ere.SPCSchedule). + Order(`"Id" ASC`). + Limit(1) }). + Order(`"CreatedAt" DESC`). First(&data) if err := tx.Error; err != nil { @@ -928,35 +939,80 @@ func getChemoProtocol(patientId uint, event *pl.Event) (*ecp.ChemoProtocol, erro return &data, nil } -func validateChemoAdm(patientId uint, event *pl.Event) (*ecpl.ChemoPlan, error) { +func validateChemo(patientId uint, event *pl.Event) (*ecpl.ChemoPlan, error) { + // get chemo adm + chemoAdm, err := getChemoAdm(patientId, event) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-not-found", + Detail: "patient doesn't have active chemo", + } + + return nil, pl.SetLogError(event, patientId) + } + return nil, err + } + + // validate is chemo verified + if chemoAdm.Status_Code != erc.DVCVerified { + event.Status = "failed" + event.ErrInfo = pl.ErrorInfo{ + Code: "data-not-match", + Detail: fmt.Sprintf("chemo not yet verified"), + } + return nil, pl.SetLogError(event, chemoAdm) + } + // get chemo protocol - chemo, err := getChemoProtocol(patientId, event) + chemoProtocol, err := getChemoProtocol(patientId, event) if err != nil { return nil, err } - if chemo.Status_Code != erc.DVCVerified { + if chemoProtocol.Status_Code != erc.DVCVerified { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "data-not-match", Detail: fmt.Sprintf("protocol chemo not yet verified"), } - return nil, pl.SetLogError(event, chemo) + return nil, pl.SetLogError(event, chemoProtocol) } - if now.Before(*chemo.StartDate) || now.After(*chemo.EndDate) { + if now.Before(*chemoProtocol.StartDate) || now.After(*chemoProtocol.EndDate) { event.Status = "failed" event.ErrInfo = pl.ErrorInfo{ Code: "invalid-date-range", Detail: "chemo cannot be performed because the current date is outside the allowed treatment window.", } - return nil, pl.SetLogError(event, chemo) + return nil, pl.SetLogError(event, chemoProtocol) } - if chemo.ChemoPlans == nil || len(*chemo.ChemoPlans) == 0 { + if chemoProtocol.ChemoPlans == nil || len(*chemoProtocol.ChemoPlans) == 0 { return nil, nil } // Return the first chemo plan - return &(*chemo.ChemoPlans)[0], nil + return &(*chemoProtocol.ChemoPlans)[0], nil +} + +func getChemoAdm(patientId uint, event *pl.Event) (*ec.Chemo, error) { + pl.SetLogInfo(event, nil, "started", "getChemoProtocol") + data := ec.Chemo{} + + var tx = dg.I + + tx = tx.Model(&ec.Chemo{}). + Joins(`LEFT JOIN "Encounter" e ON e."Id" = "Chemo"."Encounter_Id"`). + Where(`e."Patient_Id" = ? AND "Chemo"."Class_Code" = ?`, patientId, ere.CCCAdm). + Order(`"CreatedAt" DESC`). + First(&data) + + if err := tx.Error; err != nil { + return nil, err + } + + pl.SetLogInfo(event, nil, "complete") + return &data, nil } diff --git a/internal/use-case/main-use-case/soapi/case.go b/internal/use-case/main-use-case/soapi/case.go index 6b93fd8a..f74ef594 100644 --- a/internal/use-case/main-use-case/soapi/case.go +++ b/internal/use-case/main-use-case/soapi/case.go @@ -42,7 +42,7 @@ func Create(input e.CreateDto) (*d.Data, error) { return nil, pl.SetLogError(&event, input) } - chemoPlan, err := validateIfEncounterIsChemo(*input.Encounter_Id, &event) + chemoPlan, err := validateIfEncounterIsChemo(*input.Encounter_Id, "c", &event) if err != nil { return nil, err } @@ -57,7 +57,7 @@ func Create(input e.CreateDto) (*d.Data, error) { // update chemoPlan if chemoPlan != nil { chemoPlan.Encounter_Id = input.Encounter_Id - if err = ucp.UpdateData(chemoPlan, &event, tx); err != nil { + if err = ucp.UpdateData(chemoPlan, "c", &event, tx); err != nil { return err } } @@ -252,6 +252,18 @@ func Delete(input e.DeleteDto) (*d.Data, error) { return err } + // update chemoPlan + chemoPlan, err := validateIfEncounterIsChemo(*data.Encounter_Id, "d", &event) + if err != nil { + return err + } + + if chemoPlan != nil { + if err = ucp.UpdateData(chemoPlan, "d", &event, tx); err != nil { + return err + } + } + mwRunner.setMwType(pu.MWTPre) // Run pre-middleware if err = mwRunner.ExecuteIfSyncOn(func() error { diff --git a/internal/use-case/main-use-case/soapi/helper.go b/internal/use-case/main-use-case/soapi/helper.go index 24f87465..74a63b80 100644 --- a/internal/use-case/main-use-case/soapi/helper.go +++ b/internal/use-case/main-use-case/soapi/helper.go @@ -6,11 +6,7 @@ package soapi import ( "errors" - "fmt" - erc "simrs-vx/internal/domain/references/common" pl "simrs-vx/pkg/logger" - pu "simrs-vx/pkg/use-case-helper" - "time" dg "github.com/karincake/apem/db-gorm-pg" "gorm.io/gorm" @@ -55,7 +51,7 @@ func setBulkData(input []e.CreateDto, encounterId uint) []e.Soapi { return data } -func validateIfEncounterIsChemo(encounterId uint, event *pl.Event) (*ecpl.ChemoPlan, error) { +func validateIfEncounterIsChemo(encounterId uint, method string, event *pl.Event) (*ecpl.ChemoPlan, error) { // get encounter enc, err := getEncounter(encounterId, event) if err != nil { @@ -64,12 +60,12 @@ func validateIfEncounterIsChemo(encounterId uint, event *pl.Event) (*ecpl.ChemoP // Encounter must be Ambulatory and NOT Rehab a := enc.Ambulatory - if enc.Class_Code != ere.ECAmbulatory || a == nil || a.Class_Code == ere.ACCRehab { + if a == nil || a.Class_Code == ere.ACCRehab { return nil, nil } // get chemo protocol - chemo, err := getChemo(*enc.Patient_Id, event) + chemo, err := getChemo(*enc.Patient_Id, enc.Id, event) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil @@ -77,10 +73,6 @@ func validateIfEncounterIsChemo(encounterId uint, event *pl.Event) (*ecpl.ChemoP return nil, pl.SetLogError(event, nil) } - if err = chemoProtocoValidation(chemo, event); err != nil { - - } - if chemo.ChemoPlans == nil || len(*chemo.ChemoPlans) == 0 { return nil, nil } @@ -89,69 +81,39 @@ func validateIfEncounterIsChemo(encounterId uint, event *pl.Event) (*ecpl.ChemoP return &(*chemo.ChemoPlans)[0], nil } -func chemoProtocoValidation(chemo *ecp.ChemoProtocol, event *pl.Event) error { - if chemo.Status_Code != erc.DVCVerified { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "data-not-match", - Detail: fmt.Sprintf("protocol chemo not yet verified"), - } - - return pl.SetLogError(event, chemo) - } - - now := time.Now() - if now.Before(*chemo.StartDate) || now.After(*chemo.EndDate) { - event.Status = "failed" - event.ErrInfo = pl.ErrorInfo{ - Code: "invalid-date-range", - Detail: "chemo cannot be performed because the current date is outside the allowed treatment window.", - } - - return pl.SetLogError(event, chemo) - } - - return nil -} - func getEncounter(encounterId uint, event *pl.Event) (*ee.Encounter, error) { pl.SetLogInfo(event, nil, "started", "getEncounter") data := ee.Encounter{} var tx = dg.I - if err := tx.Model(&ee.Encounter{}). - Where(`"Encounter_Id" = ?`, encounterId). - Scopes(withConditionalAmbulatory()). - First(&data).Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, nil, encounterId); processedErr != nil { - return nil, processedErr - } + err := tx.Model(&ee.Encounter{}). + Joins(`LEFT JOIN "Ambulatory" a ON a."Encounter_Id" = "Encounter"."Id"`). + Where(`"Encounter"."Id" = ?`, encounterId). + Where(`"Encounter"."Class_Code" = ?`, ere.ECAmbulatory). + Preload("Ambulatory"). + First(&data).Error + + if err != nil { + return nil, err } pl.SetLogInfo(event, nil, "complete") return &data, nil } -func withConditionalAmbulatory() func(db *gorm.DB) *gorm.DB { - return func(db *gorm.DB) *gorm.DB { - return db.Preload(`"Ambulatory"`, func(db *gorm.DB) *gorm.DB { - return db.Joins(`JOIN "Encounter" e ON "e"."Id" = "Ambulatory"."Encounter_Id"`) - }) - } -} - -func getChemo(patientId uint, event *pl.Event) (*ecp.ChemoProtocol, error) { - pl.SetLogInfo(event, nil, "started", "getChemoFromEncounter") +func getChemo(patientId, encounterId uint, event *pl.Event) (*ecp.ChemoProtocol, error) { + pl.SetLogInfo(event, nil, "started", "getChemo") data := ecp.ChemoProtocol{} var tx = dg.I tx = tx.Model(&ecp.ChemoProtocol{}). - Joins(`"ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`). - Where(`"Patient.Id" = ? AND cp."Status" = ?`, patientId, ere.SPCPlanned). + Joins(`LEFT JOIN "ChemoPlan" cp ON cp."Protocol_Id" = "ChemoProtocol"."Id"`). + Where(`"ChemoProtocol"."Patient_Id" = ?`, patientId). Preload("ChemoPlans", func(db *gorm.DB) *gorm.DB { - return tx.Order(`"Id" ASC`).Limit(1) + return db. + Where(`"Encounter_Id" = ?`, encounterId) }). First(&data) From 10ae092334ca6f7a5a7af56cc2deb407bd0b9648 Mon Sep 17 00:00:00 2001 From: vanilia Date: Fri, 12 Dec 2025 13:56:56 +0700 Subject: [PATCH 28/31] delete unnessasry code --- .../main-use-case/chemo-protocol/helper.go | 52 ------------------- .../main-use-case/chemo-protocol/lib.go | 2 +- .../use-case/main-use-case/patient/lib.go | 1 - .../main-use-case/prescription-item/lib.go | 2 +- .../new/specialist/lib.go | 2 +- 5 files changed, 3 insertions(+), 56 deletions(-) diff --git a/internal/use-case/main-use-case/chemo-protocol/helper.go b/internal/use-case/main-use-case/chemo-protocol/helper.go index 36ff70a6..73e487f5 100644 --- a/internal/use-case/main-use-case/chemo-protocol/helper.go +++ b/internal/use-case/main-use-case/chemo-protocol/helper.go @@ -5,16 +5,6 @@ Any functions that are used internally by the use-case package chemo_protocol import ( - 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" - - erc "simrs-vx/internal/domain/references/common" - ere "simrs-vx/internal/domain/references/encounter" - - ec "simrs-vx/internal/domain/main-entities/chemo" e "simrs-vx/internal/domain/main-entities/chemo-protocol" ) @@ -39,45 +29,3 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ChemoProtocol) { data.Status_Code = inputSrc.Status_Code data.Patient_Id = inputSrc.Patient_Id } - -func getChemoEncounterReg(event *pl.Event) (*ec.Chemo, error) { - pl.SetLogInfo(event, nil, "started", "DBReadChemoEncounterReg") - data := ec.Chemo{} - - var tx = dg.I - - if err := tx.Model(&ec.Chemo{}). - Joins(`LEFT JOIN "Encounter" "e" ON "e"."Id" = "Chemo"."Encounter_Id"`). - Joins(`LEFT JOIN "Ambulatory" "a" ON "a"."Encounter_Id" = "e"."Id"`). - Where(`"Chemo"."Status_Code" = ? AND "a"."Class_Code" = ?`, erc.DVCVerified, ere.ACCReg). - Order("\"CreatedAt\" DESC"). - First(&data). - Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} - -func getChemoEncounter(encounterId *uint, event *pl.Event) (*ec.Chemo, error) { - pl.SetLogInfo(event, encounterId, "started", "DBReadChemoEncounter") - data := ec.Chemo{} - - var tx = dg.I - - if err := tx.Model(&ec.Chemo{}). - Where(`"Encounter_Id" = ? AND "Status_Code"`, encounterId, erc.DVCVerified). - Scopes(gh.Preload("Encounter.Ambulatory")). - First(&data). - Error; err != nil { - if processedErr := pu.HandleReadError(err, event, source, nil, data); processedErr != nil { - return nil, processedErr - } - } - - pl.SetLogInfo(event, nil, "complete") - return &data, nil -} diff --git a/internal/use-case/main-use-case/chemo-protocol/lib.go b/internal/use-case/main-use-case/chemo-protocol/lib.go index abb19224..44a0bc80 100644 --- a/internal/use-case/main-use-case/chemo-protocol/lib.go +++ b/internal/use-case/main-use-case/chemo-protocol/lib.go @@ -57,7 +57,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ch 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 errors.Is(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 b4e5d8b9..e1a5fc42 100644 --- a/internal/use-case/main-use-case/patient/lib.go +++ b/internal/use-case/main-use-case/patient/lib.go @@ -51,7 +51,6 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pa } tx = tx. - Debug(). Model(&e.Patient{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). 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 aa5c9e2b..1c21304b 100644 --- a/internal/use-case/main-use-case/prescription-item/lib.go +++ b/internal/use-case/main-use-case/prescription-item/lib.go @@ -47,7 +47,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Pr tx = dg.I } - tx = tx.Debug(). + tx = tx. Model(&e.PrescriptionItem{}). Scopes(gh.Preload(input.Includes)). Scopes(gh.Filter(input.FilterDto)). diff --git a/internal/use-case/simgos-sync-use-case/new/specialist/lib.go b/internal/use-case/simgos-sync-use-case/new/specialist/lib.go index 787c0039..26cc8efc 100644 --- a/internal/use-case/simgos-sync-use-case/new/specialist/lib.go +++ b/internal/use-case/simgos-sync-use-case/new/specialist/lib.go @@ -31,7 +31,7 @@ func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esi tx = dg.IS["simrs"] } - if err := tx.Debug().Create(&data).Error; err != nil { + if err := tx.Create(&data).Error; err != nil { return nil, plh.HandleCreateError(input, event, err) } From a87eed7eaa38e9cbde26db09699a8cbb068fa057 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 15 Dec 2025 13:14:59 +0700 Subject: [PATCH 29/31] feat (vclaim-sep-control-letter): add delete and detail by control letter number --- .../vclaim-sep-control-letter/dto.go | 175 +++++++++++++++++- .../vclaim-sep-control-letter/entity.go | 2 + .../interface/main-handler/main-handler.go | 4 +- .../vclaim-sep-control-letter/handler.go | 40 ++-- .../vclaim-sep-control-letter/plugin.go | 111 ++++++----- .../vclaim-sep-control-letter/tycovar.go | 87 --------- .../vclaim-sep-control-letter/middleware.go | 6 + .../vclaim-sep-control-letter/tycovar.go | 9 +- 8 files changed, 260 insertions(+), 174 deletions(-) delete mode 100644 internal/use-case/bpjs-plugin/vclaim-sep-control-letter/tycovar.go diff --git a/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go b/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go index 1974e66c..516fb131 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go +++ b/internal/domain/bpjs-entities/vclaim-sep-control-letter/dto.go @@ -40,8 +40,9 @@ type UpdateDto struct { } type DeleteDto struct { - Id uint `json:"id"` - Number *string `json:"number"` + Id uint `json:"id"` + Number *string `json:"number"` + RequestPayload string `json:"requestPayload" validate:"maxLength=1024"` } type MetaDto struct { @@ -52,10 +53,11 @@ type MetaDto struct { type ResponseDto struct { ecore.Main - VclaimSep_Number *string `json:"vclaimSep_number"` - Number *string `json:"number"` - Value *string `json:"value"` - FileUrl *string `json:"fileUrl"` + VclaimSep_Number *string `json:"vclaimSep_number"` + Number *string `json:"number"` + Value *string `json:"value"` + FileUrl *string `json:"fileUrl"` + Detail *FullResponse `json:"detail,omitempty"` } func (d VclaimSepControlLetter) ToResponse() ResponseDto { @@ -64,6 +66,7 @@ func (d VclaimSepControlLetter) ToResponse() ResponseDto { Number: d.Number, Value: d.Value, FileUrl: d.FileUrl, + Detail: d.Detail, } resp.Main = d.Main return resp @@ -77,6 +80,15 @@ func ToResponseList(data []VclaimSepControlLetter) []ResponseDto { return resp } +func (d DeleteDto) RequestPayloadIntoJson() ([]byte, error) { + payload := map[string]interface{}{} + err := json.Unmarshal([]byte(d.RequestPayload), &payload) + if err != nil { + return nil, err + } + return json.Marshal(payload) +} + func (c CreateDto) RequestPayloadIntoJson() ([]byte, error) { payload := map[string]interface{}{} err := json.Unmarshal([]byte(c.RequestPayload), &payload) @@ -122,3 +134,154 @@ func (v ResponseForPDF) GenerateBirthDate() string { t, _ := time.Parse("2006-01-02", v.VclaimSep.VclaimMember.BirthDate) return pu.FormatIndonesianDate(t) } + +type SuratKontrol struct { + NoSuratKontrol string `json:"noSuratKontrol"` + TglRencanaKontrol string `json:"tglRencanaKontrol"` + TglTerbit string `json:"tglTerbit"` + JnsKontrol string `json:"jnsKontrol"` + PoliTujuan string `json:"poliTujuan"` + NamaPoliTujuan string `json:"namaPoliTujuan"` + KodeDokter string `json:"kodeDokter"` + NamaDokter string `json:"namaDokter"` + FlagKontrol string `json:"flagKontrol"` + KodeDokterPembuat *string `json:"kodeDokterPembuat"` + NamaDokterPembuat *string `json:"namaDokterPembuat"` + NamaJnsKontrol string `json:"namaJnsKontrol"` + Sep Sep `json:"sep"` +} + +type Sep struct { + NoSep string `json:"noSep"` + TglSep string `json:"tglSep"` + JnsPelayanan string `json:"jnsPelayanan"` + Poli string `json:"poli"` + Diagnosa string `json:"diagnosa"` + Peserta Peserta `json:"peserta"` + ProvUmum ProvUmum `json:"provUmum"` + ProvPerujuk ProvPerujuk `json:"provPerujuk"` +} + +type Peserta struct { + NoKartu string `json:"noKartu"` + Nama string `json:"nama"` + TglLahir string `json:"tglLahir"` + Kelamin string `json:"kelamin"` + HakKelas string `json:"hakKelas"` +} + +type ProvUmum struct { + KdProvider string `json:"kdProvider"` + NmProvider string `json:"nmProvider"` +} + +type ProvPerujuk struct { + KdProviderPerujuk string `json:"kdProviderPerujuk"` + NmProviderPerujuk string `json:"nmProviderPerujuk"` + AsalRujukan string `json:"asalRujukan"` + NoRujukan string `json:"noRujukan"` + TglRujukan string `json:"tglRujukan"` +} + +type VclaimResponse struct { + MetaData MetaData `json:"metaData"` + Response *SuratKontrol `json:"response"` // nullable +} + +type DetailVclaimResponse struct { + MetaData MetaData `json:"metaData"` + Response *FullResponse `json:"response"` // nullable +} + +type MetaData struct { + Code string `json:"code"` + Message string `json:"message"` +} + +func (r VclaimResponse) ToPDFNeeds() ([]byte, error) { + response := ResponseForPDF{ + Number: r.Response.Sep.NoSep, + PlannedControlDate: r.Response.TglRencanaKontrol, + IssuedDate: r.Response.TglTerbit, + Doctor_Name: r.Response.NamaDokter, + DstUnit_Name: r.Response.NamaPoliTujuan, + ResponsibleDoctor_Name: *r.Response.NamaDokterPembuat, + VclaimSep: VclaimSep{ + VclaimMember: VclaimMember{ + CardNumber: r.Response.Sep.Peserta.NoKartu, + Name: r.Response.Sep.Peserta.Nama, + BirthDate: r.Response.Sep.Peserta.TglLahir, + Gender: r.Response.Sep.Peserta.Kelamin, + }, + Diagnose: r.Response.Sep.Diagnosa, + Number: r.Response.Sep.NoSep, + }, + } + return json.Marshal(response) +} + +type FullResponse struct { + NoSuratKontrol string `json:"noSuratKontrol"` + TglRencanaKontrol string `json:"tglRencanaKontrol"` + TglTerbit string `json:"tglTerbit"` + JnsKontrol string `json:"jnsKontrol"` + PoliTujuan string `json:"poliTujuan"` + NamaPoliTujuan string `json:"namaPoliTujuan"` + KodeDokter string `json:"kodeDokter"` + NamaDokter string `json:"namaDokter"` + FlagKontrol string `json:"flagKontrol"` + KodeDokterPembuat string `json:"kodeDokterPembuat"` + NamaDokterPembuat string `json:"namaDokterPembuat"` + NamaJnsKontrol string `json:"namaJnsKontrol"` + Sep Sep `json:"sep"` + FormPRB FormPRB `json:"formPRB"` +} + +type Provider struct { + KdProvider string `json:"kdProvider"` + NmProvider string `json:"nmProvider"` +} + +type FormPRB struct { + KdStatusPRB *string `json:"kdStatusPRB"` + Data PRBData `json:"data"` +} + +type PRBData struct { + HBA1C *string `json:"HBA1C"` + GDP *string `json:"GDP"` + GD2JPP *string `json:"GD2JPP"` + EGFR *string `json:"eGFR"` + TD_Sistolik *string `json:"TD_Sistolik"` + TD_Diastolik *string `json:"TD_Diastolik"` + LDL *string `json:"LDL"` + Rata_TD_Sistolik *string `json:"Rata_TD_Sistolik"` + Rata_TD_Diastolik *string `json:"Rata_TD_Diastolik"` + JantungKoroner *string `json:"JantungKoroner"` + Stroke *string `json:"Stroke"` + VaskularPerifer *string `json:"VaskularPerifer"` + Aritmia *string `json:"Aritmia"` + AtrialFibrilasi *string `json:"AtrialFibrilasi"` + SesakNapas3Bulan *string `json:"SesakNapas3Bulan"` + NyeriDada3Bulan *string `json:"NyeriDada3Bulan"` + Terkontrol *string `json:"Terkontrol"` + Gejala2xMinggu *string `json:"Gejala2xMinggu"` + BangunMalam *string `json:"BangunMalam"` + KeterbatasanFisik *string `json:"KeterbatasanFisik"` + FungsiParu *string `json:"FungsiParu"` + SkorMMRC *string `json:"SkorMMRC"` + Eksaserbasi1Tahun *string `json:"Eksaserbasi1Tahun"` + MampuAktivitas *string `json:"MampuAktivitas"` + Epileptik6Bulan *string `json:"Epileptik6Bulan"` + EfekSampingOAB *string `json:"EfekSampingOAB"` + HamilMenyusui *string `json:"HamilMenyusui"` + Remisi *string `json:"Remisi"` + TerapiRumatan *string `json:"TerapiRumatan"` + Usia *string `json:"Usia"` + AsamUrat *string `json:"AsamUrat"` + RemisiSLE *string `json:"RemisiSLE"` + Hamil *string `json:"Hamil"` + NadiIstirahat *string `json:"NadiIstirahat"` + SesakNapasAktivitas *string `json:"SesakNapasAktivitas"` + NyeriDadaAktivitas *string `json:"NyeriDadaAktivitas"` +} diff --git a/internal/domain/bpjs-entities/vclaim-sep-control-letter/entity.go b/internal/domain/bpjs-entities/vclaim-sep-control-letter/entity.go index 57f758fb..8f5f65be 100644 --- a/internal/domain/bpjs-entities/vclaim-sep-control-letter/entity.go +++ b/internal/domain/bpjs-entities/vclaim-sep-control-letter/entity.go @@ -10,4 +10,6 @@ type VclaimSepControlLetter struct { Number *string `json:"number" gorm:"unique;size:20"` Value *string `json:"value"` FileUrl *string `json:"fileUrl" gorm:"unique;size:1024"` + + Detail *FullResponse `json:"detail,omitempty" gorm:"-"` } diff --git a/internal/interface/main-handler/main-handler.go b/internal/interface/main-handler/main-handler.go index 6eb106da..bea0467f 100644 --- a/internal/interface/main-handler/main-handler.go +++ b/internal/interface/main-handler/main-handler.go @@ -434,7 +434,9 @@ func SetRoutes() http.Handler { }) hk.GroupRoutes("/v1/vclaim-sep-control-letter", r, hk.MapHandlerFunc{ - "POST /": vclaimsepcontrolletter.O.Create, + "POST /": vclaimsepcontrolletter.O.Create, + "GET /{number}": vclaimsepcontrolletter.O.GetDetail, + "DELETE /{number}": vclaimsepcontrolletter.O.Delete, }) hk.GroupRoutes("/v1/vclaim-sep-hist", r, hk.MapHandlerFunc{ diff --git a/internal/interface/main-handler/vclaim-sep-control-letter/handler.go b/internal/interface/main-handler/vclaim-sep-control-letter/handler.go index d26cc633..4bdd3d5d 100644 --- a/internal/interface/main-handler/vclaim-sep-control-letter/handler.go +++ b/internal/interface/main-handler/vclaim-sep-control-letter/handler.go @@ -29,16 +29,16 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { // rw.DataResponse(w, res, err) // } -// func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { -// number := rw.ValidateString(w, "number", r.PathValue("number")) -// if number <= "" { -// return -// } -// dto := e.ReadDetailDto{} -// dto.Number = &number -// res, err := u.ReadDetail(dto) -// rw.DataResponse(w, res, err) -// } +func (obj myBase) GetDetail(w http.ResponseWriter, r *http.Request) { + number := rw.ValidateString(w, "number", r.PathValue("number")) + if number == "" { + return + } + dto := e.ReadDetailDto{} + dto.Number = &number + res, err := u.ReadDetail(dto) + rw.DataResponse(w, res, err) +} // func (obj myBase) Update(w http.ResponseWriter, r *http.Request) { // number := rw.ValidateString(w, "number", r.PathValue("number")) @@ -55,13 +55,13 @@ func (obj myBase) Create(w http.ResponseWriter, r *http.Request) { // 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) Delete(w http.ResponseWriter, r *http.Request) { + number := rw.ValidateString(w, "number", r.PathValue("number")) + if number == "" { + return + } + dto := e.DeleteDto{} + dto.Number = &number + res, err := u.Delete(dto) + rw.DataResponse(w, res, err) +} diff --git a/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/plugin.go b/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/plugin.go index 3ad81f74..cedb3dc9 100644 --- a/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/plugin.go +++ b/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/plugin.go @@ -35,7 +35,7 @@ func CreateSepControlLetter(input *e.CreateDto, data *e.VclaimSepControlLetter, return err } - var vresp Response + var vresp e.VclaimResponse if err := json.Unmarshal(body, &vresp); err != nil { return fmt.Errorf("failed to parse response JSON: %w", err) } @@ -55,71 +55,68 @@ func CreateSepControlLetter(input *e.CreateDto, data *e.VclaimSepControlLetter, return nil } -// func ReadDetailSep(input *e.ReadDetailDto, data *e.VclaimSep, tx *gorm.DB) error { -// endpoint := fmt.Sprintf("sep/%s", input.Number) -// req, err := http.NewRequest("GET", ibpjs.O.BaseUrl+endpoint, nil) -// if err != nil { -// return err -// } -// req.Header.Set("Content-Type", "application/json") +func DeleteSepControlLetter(input *e.DeleteDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error { + payload, err := input.RequestPayloadIntoJson() + if err != nil { + return err + } + req, err := http.NewRequest("DELETE", ibpjs.O.BaseUrl+"RencanaKontrol/Delete", bytes.NewBuffer(payload)) + 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() + 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 -// } + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } -// var detail e.SepResponse -// if err := json.Unmarshal(body, &detail); err != nil { -// return fmt.Errorf("failed to parse response JSON: %w", err) -// } + var vresp e.VclaimResponse + if err := json.Unmarshal(body, &vresp); err != nil { + return fmt.Errorf("failed to parse response JSON: %w", err) + } -// data.Detail = detail.Response + if vresp.MetaData.Code != "200" { + return fmt.Errorf("failed to delete sep control letter: %s", vresp.MetaData.Message) + } -// return nil -// } + return nil +} -// func DeleteSep(input *e.DeleteDto, data *e.VclaimSep, tx *gorm.DB) error { -// payload := e.SepDeleteRequest{} -// payload.Request.TSep.NoSep = *input.Number -// payload.Request.TSep.User = "Coba Ws" +func GetDetailSepControlLetterByNumber(input *e.ReadDetailDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error { + req, err := http.NewRequest("GET", ibpjs.O.BaseUrl+"RencanaKontrol/noSuratKontrol/"+*input.Number, nil) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/json") -// jsonPayload, err := json.Marshal(payload) -// if err != nil { -// return err -// } + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() -// req, err := http.NewRequest("DELETE", ibpjs.O.BaseUrl+"sep", bytes.NewBuffer(jsonPayload)) -// if err != nil { -// return err -// } + body, err := io.ReadAll(resp.Body) + if err != nil { + return err + } -// req.Header.Set("Content-Type", "application/json") + var vresp e.DetailVclaimResponse + if err := json.Unmarshal(body, &vresp); err != nil { + return fmt.Errorf("failed to parse response JSON: %w", err) + } -// resp, err := http.DefaultClient.Do(req) -// if err != nil { -// return err -// } -// defer resp.Body.Close() + if vresp.MetaData.Code != "200" { + return fmt.Errorf("failed to get detail sep control letter by number: %s", vresp.MetaData.Message) + } -// body, err := io.ReadAll(resp.Body) -// if err != nil { -// return err -// } + data.Detail = vresp.Response -// var detail e.SepResponse -// if err := json.Unmarshal(body, &detail); err != nil { -// return fmt.Errorf("failed to parse response JSON: %w", err) -// } - -// if detail.MetaData.Message == SepNotFound { -// return fmt.Errorf("sep with number %s not found", *data.Number) -// } - -// return nil -// } + return nil +} diff --git a/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/tycovar.go b/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/tycovar.go deleted file mode 100644 index c732afa5..00000000 --- a/internal/use-case/bpjs-plugin/vclaim-sep-control-letter/tycovar.go +++ /dev/null @@ -1,87 +0,0 @@ -package vclaimsepcontrolletter - -import ( - "encoding/json" - - e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter" -) - -type SuratKontrol struct { - NoSuratKontrol string `json:"noSuratKontrol"` - TglRencanaKontrol string `json:"tglRencanaKontrol"` - TglTerbit string `json:"tglTerbit"` - JnsKontrol string `json:"jnsKontrol"` - PoliTujuan string `json:"poliTujuan"` - NamaPoliTujuan string `json:"namaPoliTujuan"` - KodeDokter string `json:"kodeDokter"` - NamaDokter string `json:"namaDokter"` - FlagKontrol string `json:"flagKontrol"` - KodeDokterPembuat *string `json:"kodeDokterPembuat"` - NamaDokterPembuat *string `json:"namaDokterPembuat"` - NamaJnsKontrol string `json:"namaJnsKontrol"` - Sep Sep `json:"sep"` -} - -type Sep struct { - NoSep string `json:"noSep"` - TglSep string `json:"tglSep"` - JnsPelayanan string `json:"jnsPelayanan"` - Poli string `json:"poli"` - Diagnosa string `json:"diagnosa"` - Peserta Peserta `json:"peserta"` - ProvUmum ProvUmum `json:"provUmum"` - ProvPerujuk ProvPerujuk `json:"provPerujuk"` -} - -type Peserta struct { - NoKartu string `json:"noKartu"` - Nama string `json:"nama"` - TglLahir string `json:"tglLahir"` - Kelamin string `json:"kelamin"` - HakKelas string `json:"hakKelas"` -} - -type ProvUmum struct { - KdProvider string `json:"kdProvider"` - NmProvider string `json:"nmProvider"` -} - -type ProvPerujuk struct { - KdProviderPerujuk string `json:"kdProviderPerujuk"` - NmProviderPerujuk string `json:"nmProviderPerujuk"` - AsalRujukan string `json:"asalRujukan"` - NoRujukan string `json:"noRujukan"` - TglRujukan string `json:"tglRujukan"` -} - -type Response struct { - MetaData MetaData `json:"metaData"` - Response *SuratKontrol `json:"response"` // nullable -} - -type MetaData struct { - Code string `json:"code"` - Message string `json:"message"` -} - -func (r Response) ToPDFNeeds() ([]byte, error) { - response := e.ResponseForPDF{ - Number: r.Response.Sep.NoSep, - PlannedControlDate: r.Response.TglRencanaKontrol, - IssuedDate: r.Response.TglTerbit, - Doctor_Name: r.Response.NamaDokter, - DstUnit_Name: r.Response.NamaPoliTujuan, - ResponsibleDoctor_Name: *r.Response.NamaDokterPembuat, - VclaimSep: e.VclaimSep{ - VclaimMember: e.VclaimMember{ - CardNumber: r.Response.Sep.Peserta.NoKartu, - Name: r.Response.Sep.Peserta.Nama, - BirthDate: r.Response.Sep.Peserta.TglLahir, - Gender: r.Response.Sep.Peserta.Kelamin, - }, - Diagnose: r.Response.Sep.Diagnosa, - Number: r.Response.Sep.NoSep, - }, - } - return json.Marshal(response) -} diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/middleware.go b/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/middleware.go index 0cca1159..c9785da8 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/middleware.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/middleware.go @@ -9,4 +9,10 @@ func init() { createPreMw = append(createPreMw, createMw{Name: "create-sep-control-letter", Func: pvscl.CreateSepControlLetter}, ) + readDetailPreMw = append(readDetailPreMw, + readDetailMw{Name: "get-detail-sep-control-letter-by-number", Func: pvscl.GetDetailSepControlLetterByNumber}, + ) + deletePreMw = append(deletePreMw, + DeleteMw{Name: "delete-sep-control-letter", Func: pvscl.DeleteSepControlLetter}, + ) } diff --git a/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/tycovar.go b/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/tycovar.go index 2e921ae9..ee2e73f1 100644 --- a/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/tycovar.go +++ b/internal/use-case/bpjs-use-case/vclaim-sep-control-letter/tycovar.go @@ -30,7 +30,10 @@ type readDetailMw struct { } type UpdateMw = readDetailMw -type DeleteMw = readDetailMw +type DeleteMw struct { + Name string + Func func(input *e.DeleteDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error +} var createPreMw []createMw // preprocess middleware var createPostMw []createMw // postprocess middleware @@ -40,5 +43,5 @@ var readDetailPreMw []readDetailMw var readDetailPostMw []readDetailMw var updatePreMw []readDetailMw var updatePostMw []readDetailMw -var deletePreMw []readDetailMw -var deletePostMw []readDetailMw +var deletePreMw []DeleteMw +var deletePostMw []DeleteMw From eea6bc7700c82950311cb2a5702303d6548cab47 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Mon, 15 Dec 2025 13:15:46 +0700 Subject: [PATCH 30/31] fix (encouter): fix dto, change createdto from object to embedded in create-with-patient --- .../domain/main-entities/encounter/dto.go | 4 +- .../main-handler/encounter/handler.go | 4 +- .../use-case/main-use-case/encounter/case.go | 38 +++++++++---------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/internal/domain/main-entities/encounter/dto.go b/internal/domain/main-entities/encounter/dto.go index 982f0ed8..3b857ca1 100644 --- a/internal/domain/main-entities/encounter/dto.go +++ b/internal/domain/main-entities/encounter/dto.go @@ -294,6 +294,6 @@ func ToResponseList(data []Encounter) []ResponseDto { } type CreateWithPatientDto struct { - Encounter CreateDto `json:"encounter"` - Patient ep.CreateDto `json:"patient"` + CreateDto + Patient ep.CreateDto `json:"patient"` } diff --git a/internal/interface/main-handler/encounter/handler.go b/internal/interface/main-handler/encounter/handler.go index 8b8babc9..0801f805 100644 --- a/internal/interface/main-handler/encounter/handler.go +++ b/internal/interface/main-handler/encounter/handler.go @@ -325,7 +325,7 @@ func (obj myBase) CreateWithPatient(w http.ResponseWriter, r *http.Request) { } // validate SubClass - if err := verifyClassCode(dto.Encounter); err != nil { + if err := verifyClassCode(dto.CreateDto); err != nil { rw.DataResponse(w, nil, d.FieldError{ Code: dataValidationFail, Message: err.Error(), @@ -333,7 +333,7 @@ func (obj myBase) CreateWithPatient(w http.ResponseWriter, r *http.Request) { return } - dto.Encounter.AuthInfo = *authInfo + dto.AuthInfo = *authInfo dto.Patient.AuthInfo = *authInfo res, err := u.CreateWithPatient(dto) rw.DataResponse(w, res, err) diff --git a/internal/use-case/main-use-case/encounter/case.go b/internal/use-case/main-use-case/encounter/case.go index 1c3d63aa..eb0c29dc 100644 --- a/internal/use-case/main-use-case/encounter/case.go +++ b/internal/use-case/main-use-case/encounter/case.go @@ -1094,17 +1094,17 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) { pl.SetLogInfo(&event, input, "started", "create") roleAllowed := []string{string(erg.EPCReg)} - err = validateAuth(input.Encounter.AuthInfo, roleAllowed, "create-encounter", &event) + err = validateAuth(input.AuthInfo, roleAllowed, "create-encounter", &event) if err != nil { return nil, err } // validate rehab by bpjs - if input.Encounter.RefTypeCode == ere.RTCBpjs && - input.Encounter.Class_Code == ere.ECAmbulatory && - ere.AmbulatoryClassCode(*input.Encounter.SubClass_Code) == ere.ACCRehab { + if input.RefTypeCode == ere.RTCBpjs && + input.Class_Code == ere.ECAmbulatory && + ere.AmbulatoryClassCode(*input.SubClass_Code) == ere.ACCRehab { // get latest rehab data - recentRehabData, err := getLatestRehabData(input.Encounter, &event) + recentRehabData, err := getLatestRehabData(input.CreateDto, &event) if err != nil { return nil, err } @@ -1115,18 +1115,18 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) { // If the mode is "series", verify whether the visit count still remains // and whether the series has not expired. // If visitMode is "series", then get encounterAdm - input.Encounter.VisitMode_Code, input.Encounter.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input.Encounter, &event) + input.VisitMode_Code, input.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input.CreateDto, &event) if err != nil { return nil, err } } else { - input.Encounter.VisitMode_Code = ere.VMCAdm + input.VisitMode_Code = ere.VMCAdm } // When visitMode_Code is "series", load the associated SOAPI record to copy its values. - if input.Encounter.VisitMode_Code == ere.VMCSeries { + if input.VisitMode_Code == ere.VMCSeries { // get data soapi - recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.Encounter.RecentEncounterAdm, &event) + recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.RecentEncounterAdm, &event) if err != nil { return nil, err } @@ -1134,13 +1134,13 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) { } // check if patient is new in the hospital - input.Encounter.NewStatus, err = identifyPatientStatus(input.Encounter) + input.NewStatus, err = identifyPatientStatus(input.CreateDto) if err != nil { return nil, err } - input.Encounter.Adm_Employee_Id = input.Encounter.AuthInfo.Employee_Id + input.Adm_Employee_Id = input.AuthInfo.Employee_Id - mwRunner := newMiddlewareRunner(&event, input.Encounter.Sync) + mwRunner := newMiddlewareRunner(&event, input.Sync) err = dg.I.Transaction(func(tx *gorm.DB) error { // create patient @@ -1155,28 +1155,28 @@ func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) { } // create encounter - input.Encounter.Patient_Id = &patientId - if resData, err := CreateData(input.Encounter, &event, tx); err != nil { + input.Patient_Id = &patientId + if resData, err := CreateData(input.CreateDto, &event, tx); err != nil { return err } else { data = *resData - input.Encounter.Id = data.Id + input.Id = data.Id } // insert ambulatory/emergency/inpatient - err = insertdataClassCode(input.Encounter, recentSoapiDataforCopy, &event, tx) + err = insertdataClassCode(input.CreateDto, recentSoapiDataforCopy, &event, tx) if err != nil { return err } // insert vclaimReference - if vr := input.Encounter.VclaimReference; vr != nil { + if vr := input.VclaimReference; vr != nil { t, _ := time.Parse("2006-01-02", vr.TglRujukan) _, err = uv.CreateData(ev.CreateDto{ Encounter_Id: &data.Id, Date: &t, - SrcCode: input.Encounter.Ref_Number, - SrcName: input.Encounter.RefSource_Name, + SrcCode: input.Ref_Number, + SrcName: input.RefSource_Name, Number: &vr.NoSep}, &event, tx) if err != nil { return err From bc9f311e51312cf2e273b6a8a2e7aa973d9fafa1 Mon Sep 17 00:00:00 2001 From: dpurbosakti Date: Tue, 16 Dec 2025 11:51:52 +0700 Subject: [PATCH 31/31] feat (resume): update template html include data fasyankes, not set yet --- assets/docs/resume.html | 6 +++--- internal/use-case/main-use-case/generate-file/helper.go | 4 ++++ internal/use-case/main-use-case/generate-file/tycovar.go | 8 ++++---- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/assets/docs/resume.html b/assets/docs/resume.html index 4ad209ff..8715f1ba 100644 --- a/assets/docs/resume.html +++ b/assets/docs/resume.html @@ -627,17 +627,17 @@ Fasyankes : - {{ .NIK }} + {{ .ControlHealthcare }} Tanggal : - {{ .NIK }} + {{ .ControlDate }} Klinik : - {{ .NIK }} + {{ .ControlUnit }} diff --git a/internal/use-case/main-use-case/generate-file/helper.go b/internal/use-case/main-use-case/generate-file/helper.go index adcdc16d..3756330e 100644 --- a/internal/use-case/main-use-case/generate-file/helper.go +++ b/internal/use-case/main-use-case/generate-file/helper.go @@ -328,6 +328,10 @@ func generateResumeTemplateData(resume er.Resume, event pl.Event, tx *gorm.DB) ( templateData.DischargeMethod = rData.Management.DischargeMethod templateData.Medications = rData.Medication.Medications templateData.Date = pu.GetTimeNow().Format("02-01-2006") + // this below is just my guess + // templateData.ControlHealthcare = get from vclaim sep eg. III + // templateData.ControlUnit = get from vclaim sep eg. R.KERINCI - KLS 3 + // templateData.ControlDate = get from vclaim sep eg. 2022-01-01 return &templateData, nil } diff --git a/internal/use-case/main-use-case/generate-file/tycovar.go b/internal/use-case/main-use-case/generate-file/tycovar.go index fd62787a..bf68b143 100644 --- a/internal/use-case/main-use-case/generate-file/tycovar.go +++ b/internal/use-case/main-use-case/generate-file/tycovar.go @@ -62,10 +62,10 @@ type ResumePDF struct { ConditionOnDischarge string DischargeMethod string Medications []er.MedicationEntry - // fasyankes - // date - // klinik - Date string + ControlHealthcare string + ControlUnit string + ControlDate string + Date string } type ScreeningPDF struct {