From f8674b4eca6cd88761eee4ce6fb46d92cec8ba7c Mon Sep 17 00:00:00 2001 From: vanilia Date: Wed, 19 Nov 2025 16:10:21 +0700 Subject: [PATCH] adjust patient --- internal/domain/main-entities/patient/dto.go | 1 + .../use-case/main-use-case/patient/case.go | 7 ++ .../use-case/main-use-case/patient/helper.go | 77 ++++++++++++------- .../patient/middleware-runner.go | 19 +++++ .../use-case/main-use-case/patient/tycovar.go | 6 ++ .../simgos-sync-use-case/patient/case.go | 28 +++++++ 6 files changed, 109 insertions(+), 29 deletions(-) diff --git a/internal/domain/main-entities/patient/dto.go b/internal/domain/main-entities/patient/dto.go index ec270abf..56a52e0f 100644 --- a/internal/domain/main-entities/patient/dto.go +++ b/internal/domain/main-entities/patient/dto.go @@ -28,6 +28,7 @@ type CreateDto struct { RegisteredAt *time.Time `json:"registeredAt"` RegisteredBy_User_Name *string `json:"registeredBy_user_name" validate:"maxLength=100"` Status_Code erc.ActiveStatusCode `json:"status_code" validate:"maxLength=10"` + Number *string `json:"number"` pa.AuthInfo } diff --git a/internal/use-case/main-use-case/patient/case.go b/internal/use-case/main-use-case/patient/case.go index 6c048322..1a8437e5 100644 --- a/internal/use-case/main-use-case/patient/case.go +++ b/internal/use-case/main-use-case/patient/case.go @@ -45,6 +45,13 @@ func Create(input e.CreateDto) (*d.Data, error) { return err } + // Run pre-middleware -> Generate number + nomr, err := mwRunner.RunGenerateNumberMiddleware(generatePatientNumber) + if err != nil { + return err + } + input.Number = nomr + if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx); err != nil { return err } else { diff --git a/internal/use-case/main-use-case/patient/helper.go b/internal/use-case/main-use-case/patient/helper.go index c53ebca3..2c62ca21 100644 --- a/internal/use-case/main-use-case/patient/helper.go +++ b/internal/use-case/main-use-case/patient/helper.go @@ -24,7 +24,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Patient) error { inputSrc = &inputTemp.CreateDto } - if data.Id == 0 { + if data.Number == nil { medRecNum, err := GenerateNextMedicalRecordNumber() if err != nil { return err @@ -52,38 +52,57 @@ func GenerateNextMedicalRecordNumber() (string, error) { return "", err } - var nextInt int64 - var format string + //var nextInt int64 + //var format string + //if last == "" { + // // No existing records, start with 10 digits + // nextInt = 1 + // format = "%08d" + //} else { + // n, err := strconv.ParseInt(last, 10, 64) + // if err != nil { + // return "", err + // } + // nextInt = n + 1 + // + // // Dynamically determine format based on existing number + // digitCount := len(last) + // + // // If the incremented number needs more digits, expand format + // nextStr := strconv.FormatInt(nextInt, 10) + // if len(nextStr) > digitCount { + // digitCount = len(nextStr) + // } + // + // // Ensure minimum 10 digits as per requirement + // if digitCount < 10 { + // digitCount = 10 + // } + // + // format = fmt.Sprintf("%%0%dd", digitCount) + //} + + const prefix = "12" // fixed starting prefix (same as $awal_rm) in simgos + const maxSuffix = 999999 + + // No existing NOMR → start fresh if last == "" { - // No existing records, start with 10 digits - nextInt = 1 - format = "%010d" - } else { - n, err := strconv.ParseInt(last, 10, 64) - if err != nil { - return "", err - } - nextInt = n + 1 - - // Dynamically determine format based on existing number - digitCount := len(last) - - // If the incremented number needs more digits, expand format - nextStr := strconv.FormatInt(nextInt, 10) - if len(nextStr) > digitCount { - digitCount = len(nextStr) - } - - // Ensure minimum 10 digits as per requirement - if digitCount < 10 { - digitCount = 10 - } - - format = fmt.Sprintf("%%0%dd", digitCount) + return prefix + "000001", nil } - return fmt.Sprintf(format, nextInt), nil + suffix := last[len(prefix):] // extract numeric part + num, _ := strconv.Atoi(suffix) + + // 3. If suffix reaches 999999 → increment the prefix + if num == maxSuffix { + p, _ := strconv.Atoi(prefix) + p++ + return fmt.Sprintf("%d000001", p), nil + } + + // 4. Normal increment + return prefix + fmt.Sprintf("%06d", num+1), nil } func endpointMapper(noBpjs string) string { diff --git a/internal/use-case/main-use-case/patient/middleware-runner.go b/internal/use-case/main-use-case/patient/middleware-runner.go index f9e05bb7..1ea1623d 100644 --- a/internal/use-case/main-use-case/patient/middleware-runner.go +++ b/internal/use-case/main-use-case/patient/middleware-runner.go @@ -159,6 +159,25 @@ func (me *middlewareRunner) RunDeleteMiddleware(middlewares []deleteMw, input *e return nil } +func (me *middlewareRunner) RunGenerateNumberMiddleware(middlewares generateNumberMw) (generateNorm *string, err error) { + if !me.SyncOn { + return nil, nil + } + + logData := pu.GetLogData(nil, nil) + + pl.SetLogInfo(me.Event, logData, "started", middlewares.Name) + + generateNorm, err = middlewares.Func() + if err != nil { + return nil, pu.HandleMiddlewareError(me.Event, string(me.MwType), middlewares.Name, logData, err) + } + + pl.SetLogInfo(me.Event, nil, "complete") + + return +} + func (me *middlewareRunner) setMwType(mwType pu.MWType) { me.MwType = mwType } diff --git a/internal/use-case/main-use-case/patient/tycovar.go b/internal/use-case/main-use-case/patient/tycovar.go index cedb1514..d2370122 100644 --- a/internal/use-case/main-use-case/patient/tycovar.go +++ b/internal/use-case/main-use-case/patient/tycovar.go @@ -50,6 +50,11 @@ type readDetailMw struct { Func func(input *e.ReadDetailDto, data *e.Patient, tx *gorm.DB) error } +type generateNumberMw struct { + Name string + Func func() (*string, error) +} + type UpdateMw = updateMw type DeleteMw = deleteMw @@ -65,6 +70,7 @@ var updatePreMw []updateMw var updatePostMw []readDetailMw var deletePreMw []deleteMw var deletePostMw []readDetailMw +var generatePatientNumber generateNumberMw type BPJSResponse struct { MetaData struct { diff --git a/internal/use-case/simgos-sync-use-case/patient/case.go b/internal/use-case/simgos-sync-use-case/patient/case.go index dd95bed4..b87cd952 100644 --- a/internal/use-case/simgos-sync-use-case/patient/case.go +++ b/internal/use-case/simgos-sync-use-case/patient/case.go @@ -201,3 +201,31 @@ func Delete(input e.DeleteDto) (*d.Data, error) { }, nil } + +func Generate() (*d.Data, error) { + event := pl.Event{ + Feature: "Generate Nomr", + Source: source, + } + + // Start log + pl.SetLogInfo(&event, nil, "started", "create") + + norm, err := generateNomrPatient() + 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:d.II{ + + } + }, nil +}