feat (resume): add verify and validate, base value structure

This commit is contained in:
dpurbosakti
2025-11-24 17:13:40 +07:00
parent 8eb94dcdba
commit 5322e986e4
7 changed files with 362 additions and 6 deletions
@@ -4,7 +4,10 @@ import (
"errors"
"strconv"
erc "simrs-vx/internal/domain/references/common"
// main entities
ee "simrs-vx/internal/domain/main-entities/encounter"
e "simrs-vx/internal/domain/main-entities/resume"
ue "simrs-vx/internal/use-case/main-use-case/encounter"
@@ -31,6 +34,10 @@ func Create(input e.CreateDto) (*d.Data, error) {
pl.SetLogInfo(&event, input, "started", "create")
err := dg.I.Transaction(func(tx *gorm.DB) error {
if !input.AuthInfo.IsDoctor() {
return errors.New("user is not a doctor")
}
mwRunner := newMiddlewareRunner(&event, tx)
mwRunner.setMwType(pu.MWTPre)
// Run pre-middleware
@@ -43,6 +50,7 @@ func Create(input e.CreateDto) (*d.Data, error) {
return errors.New("encounter is already done")
}
input.Status_Code = erc.DVCNew
if resData, err := CreateData(input, &event, tx); err != nil {
return err
} else {
@@ -188,6 +196,10 @@ func Update(input e.UpdateDto) (*d.Data, error) {
pl.SetLogInfo(&event, input, "started", "update")
err = dg.I.Transaction(func(tx *gorm.DB) error {
if !input.AuthInfo.IsDoctor() {
return errors.New("user is not a doctor")
}
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
return err
@@ -254,6 +266,10 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
pl.SetLogInfo(&event, input, "started", "delete")
err = dg.I.Transaction(func(tx *gorm.DB) error {
if !input.AuthInfo.IsDoctor() {
return errors.New("user is not a doctor")
}
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
return err
@@ -293,3 +309,84 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
}, nil
}
func UpdateStatusCode(input e.UpdateDto) (*d.Data, error) {
rdDto := e.ReadDetailDto{Id: input.Id}
var data *e.Resume
var err error
event := pl.Event{
Feature: "UpdateStatusCode",
Source: source,
}
// Start log
pl.SetLogInfo(&event, input, "started", "updateStatusCode")
err = dg.I.Transaction(func(tx *gorm.DB) error {
if !input.AuthInfo.IsDoctor() {
return errors.New("user is not a doctor")
}
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
return err
}
enc, err := ue.ReadDetailData(ee.ReadDetailDto{Id: uint16(*data.Encounter_Id)}, &event, tx)
if err != nil {
return err
}
// check if encounter is done
if enc.IsDone() {
return errors.New("encounter is already done")
}
switch input.Status_Code {
case erc.DVCValidated:
if !enc.IsSameResponsibleDoctor(input.AuthInfo.Doctor_Code) {
return errors.New("validation doctor is not the same as encounter responsible doctor")
}
if data.IsNew() {
return errors.New("resume need to be verified first")
}
if data.IsValidated() {
return errors.New("resume already validated")
}
data.Status_Code = erc.DVCValidated
err = tx.Save(&data).Error
if err != nil {
return err
}
case erc.DVCVerified:
if data.IsValidated() {
return errors.New("resume already validated")
}
if data.IsVerified() {
return errors.New("resume already verified")
}
data.Status_Code = erc.DVCVerified
err = tx.Save(&data).Error
if 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
}
@@ -18,5 +18,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Resume) {
}
data.Encounter_Id = inputSrc.Encounter_Id
data.Doctor_Code = inputSrc.AuthInfo.Doctor_Code
data.Value = inputSrc.Value
data.Status_Code = inputSrc.Status_Code
}