adjust patient

This commit is contained in:
vanilia
2025-11-19 16:10:21 +07:00
parent 5bfa9785cc
commit f8674b4eca
6 changed files with 109 additions and 29 deletions
@@ -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
}
@@ -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 {
@@ -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 {
@@ -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
}
@@ -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 {
@@ -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
}