/* DESCRIPTION: Any functions that are used internally by the use-case */ package patient import ( "fmt" e "simrs-vx/internal/domain/main-entities/patient" "strconv" dg "github.com/karincake/apem/db-gorm-pg" ) func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Patient) error { var inputSrc *e.CreateDto if inputT, ok := any(input).(*e.CreateDto); ok { inputSrc = inputT } else { inputTemp := any(input).(*e.UpdateDto) inputSrc = &inputTemp.CreateDto } if data.Id == 0 { medRecNum, err := GenerateNextMedicalRecordNumber() if err != nil { return err } data.Number = &medRecNum } data.Person_Id = inputSrc.Person_Id data.RegisteredAt = inputSrc.RegisteredAt data.Status_Code = inputSrc.Status_Code return nil } func GenerateNextMedicalRecordNumber() (string, error) { var last string err := dg.I. Table("\"Patient\""). Select("\"Number\""). Where("\"Number\" IS NOT NULL AND \"Number\" ~ '^[0-9]+$'"). // Only numeric strings Order("\"Number\"::bigint DESC"). Limit(1). Scan(&last).Error if err != nil { return "", err } var nextInt int64 var format string 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 fmt.Sprintf(format, nextInt), nil }