Files
simrsx-be/internal/use-case/main-use-case/patient/helper.go
T
2025-11-25 13:56:18 +07:00

121 lines
2.8 KiB
Go

/*
DESCRIPTION:
Any functions that are used internally by the use-case
*/
package patient
import (
"fmt"
"strconv"
"time"
e "simrs-vx/internal/domain/main-entities/patient"
ibpjs "simrs-vx/internal/infra/bpjs"
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
data.RegisteredBy_User_Name = inputSrc.RegisteredBy_User_Name
} else {
inputTemp := any(input).(*e.UpdateDto)
inputSrc = &inputTemp.CreateDto
}
switch {
case inputSrc.Number == nil && data.Number == nil:
medRecNum, err := GenerateNextMedicalRecordNumber()
if err != nil {
return err
}
data.Number = &medRecNum
case inputSrc.Number != nil:
data.Number = inputSrc.Number
}
data.Person_Id = inputSrc.Person_Id
data.RegisteredAt = inputSrc.RegisteredAt
data.Status_Code = inputSrc.Status_Code
data.NewBornStatus = inputSrc.NewBornStatus
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 = "%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 == "" {
return prefix + "000001", 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 {
today := getTodayDate()
return fmt.Sprintf("%speserta/nokartu?noKartu=%s&tglpelayanan=%s", ibpjs.O.BaseUrl, noBpjs, today)
}
func getTodayDate() string {
return time.Now().Format("2006-01-02")
}