Merge branch 'migration' of https://github.com/dikstub-rssa/simrs-be into feat/chemo-plan
# Conflicts: # internal/domain/main-entities/chemo/dto.go # internal/use-case/main-use-case/encounter/helper.go
This commit is contained in:
No files matched your search
@@ -1,28 +0,0 @@
|
||||
/*
|
||||
DESCRIPTION:
|
||||
Any functions that are used internally by the use-case
|
||||
*/
|
||||
package actionreport
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/action-report"
|
||||
)
|
||||
|
||||
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ActionReport) {
|
||||
var inputSrc *e.CreateDto
|
||||
if inputT, ok := any(input).(*e.CreateDto); ok {
|
||||
inputSrc = inputT
|
||||
} else {
|
||||
inputTemp := any(input).(*e.UpdateDto)
|
||||
inputSrc = &inputTemp.CreateDto
|
||||
}
|
||||
|
||||
data.Encounter_Id = inputSrc.Encounter_Id
|
||||
data.Date = inputSrc.Date
|
||||
data.Doctor_Code = inputSrc.Doctor_Code
|
||||
data.Operator_Employe_Id = inputSrc.Operator_Employe_Id
|
||||
data.Assistant_Employe_Id = inputSrc.Assistant_Employe_Id
|
||||
data.Instrumentor_Employe_Id = inputSrc.Instrumentor_Employe_Id
|
||||
data.Nurse_Code = inputSrc.Nurse_Code
|
||||
data.Value = inputSrc.Value
|
||||
}
|
||||
@@ -26,16 +26,15 @@ import (
|
||||
em "simrs-vx/internal/domain/main-entities/midwife"
|
||||
en "simrs-vx/internal/domain/main-entities/nurse"
|
||||
ep "simrs-vx/internal/domain/main-entities/pharmacist"
|
||||
er "simrs-vx/internal/domain/main-entities/registrator"
|
||||
esp "simrs-vx/internal/domain/main-entities/specialist-position"
|
||||
essp "simrs-vx/internal/domain/main-entities/subspecialist-position"
|
||||
eup "simrs-vx/internal/domain/main-entities/unit-position"
|
||||
eu "simrs-vx/internal/domain/main-entities/user"
|
||||
|
||||
udp "simrs-vx/internal/use-case/main-use-case/division-position"
|
||||
uip "simrs-vx/internal/use-case/main-use-case/installation-position"
|
||||
usp "simrs-vx/internal/use-case/main-use-case/specialist-position"
|
||||
ussp "simrs-vx/internal/use-case/main-use-case/subspecialist-position"
|
||||
uup "simrs-vx/internal/use-case/main-use-case/unit-position"
|
||||
)
|
||||
|
||||
// just return the error code
|
||||
@@ -84,7 +83,7 @@ func getDivisionPosition(employee_id uint, event *pl.Event) ([]string, error) {
|
||||
func getInstallationPosition(employeeId uint, event *pl.Event) ([]string, error) {
|
||||
var result []string
|
||||
|
||||
// get data unit_position based on employee_id
|
||||
// get data specialist_position based on employee_id
|
||||
data, _, err := uip.ReadListData(eip.ReadListDto{
|
||||
FilterDto: eip.FilterDto{Employee_Id: &employeeId},
|
||||
Includes: "installation"}, event)
|
||||
@@ -101,28 +100,10 @@ func getInstallationPosition(employeeId uint, event *pl.Event) ([]string, error)
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func getUnitPosition(employeeId uint, event *pl.Event) ([]string, error) {
|
||||
var result []string
|
||||
|
||||
// get data unit_position based on employee_id
|
||||
data, _, err := uup.ReadListData(eup.ReadListDto{FilterDto: eup.FilterDto{Employee_Id: &employeeId}}, event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(data) > 0 {
|
||||
for _, dp := range data {
|
||||
result = append(result, "unit|"+*dp.Unit_Code+"|"+dp.Code)
|
||||
}
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func getSpecialistPosition(employeeId uint, event *pl.Event) ([]string, error) {
|
||||
var result []string
|
||||
|
||||
// get data unit_position based on employee_id
|
||||
// get data specialist_position based on employee_id
|
||||
data, _, err := usp.ReadListData(esp.ReadListDto{FilterDto: esp.FilterDto{Employee_Id: &employeeId}}, event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -140,7 +121,7 @@ func getSpecialistPosition(employeeId uint, event *pl.Event) ([]string, error) {
|
||||
func getSubspecialistPosition(employeeId uint, event *pl.Event) ([]string, error) {
|
||||
var result []string
|
||||
|
||||
// get data unit_position based on employee_id
|
||||
// get data specialist_position based on employee_id
|
||||
data, _, err := ussp.ReadListData(essp.ReadListDto{
|
||||
FilterDto: essp.FilterDto{Employee_Id: &employeeId},
|
||||
Includes: "subspecialist"}, event)
|
||||
@@ -229,9 +210,9 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out
|
||||
outputData["doctor_code"] = doctor.Code
|
||||
|
||||
// specialist
|
||||
if doctor.Unit_Code != nil {
|
||||
atClaims["unit_code"] = doctor.Unit_Code
|
||||
outputData["unit_code"] = doctor.Unit_Code
|
||||
if doctor.Specialist_Code != nil {
|
||||
atClaims["specialist_code"] = doctor.Specialist_Code
|
||||
outputData["specialist_code"] = doctor.Specialist_Code
|
||||
}
|
||||
if doctor.Specialist_Code != nil {
|
||||
atClaims["specialist_code"] = doctor.Specialist_Code
|
||||
@@ -265,6 +246,16 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out
|
||||
}
|
||||
atClaims["pharmacist_code"] = empData.Code
|
||||
outputData["pharmacist_code"] = empData.Code
|
||||
case erg.EPCReg:
|
||||
empData := er.Registrator{}
|
||||
dg.I.Where("\"Employee_Id\" = ?", employee.Id).First(&empData)
|
||||
if empData.Id == 0 {
|
||||
return d.FieldErrors{"authentication": d.FieldError{Code: "auth-noRegistrator", Message: pl.GenMessage("auth-noRegistrator")}}
|
||||
}
|
||||
atClaims["registrator_id"] = empData.Id
|
||||
outputData["registrator_id"] = empData.Id
|
||||
atClaims["installation_code"] = empData.Installation_Code
|
||||
outputData["installation_code"] = empData.Installation_Code
|
||||
}
|
||||
|
||||
errorGetPosition := d.FieldErrors{"authentication": d.FieldError{Code: "auth-getData-failed", Message: pl.GenMessage("auth-getData-failed")}}
|
||||
@@ -281,12 +272,6 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out
|
||||
return errorGetPosition
|
||||
}
|
||||
|
||||
// unit position
|
||||
unitPositions, err := getUnitPosition(employee.Id, &event)
|
||||
if err != nil {
|
||||
return errorGetPosition
|
||||
}
|
||||
|
||||
// specialist position
|
||||
specialistPositions, err := getSpecialistPosition(employee.Id, &event)
|
||||
if err != nil {
|
||||
@@ -301,7 +286,7 @@ func populateRoles(user *eu.User, input eu.LoginDto, atClaims jwt.MapClaims, out
|
||||
|
||||
roles = append(roles, divisionPositions...)
|
||||
roles = append(roles, installationPositions...)
|
||||
roles = append(roles, unitPositions...)
|
||||
roles = append(roles, specialistPositions...)
|
||||
roles = append(roles, specialistPositions...)
|
||||
roles = append(roles, subspecialistPositions...)
|
||||
// atClaims["division_positions"] = divsionPositions
|
||||
|
||||
@@ -19,5 +19,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Chemo) {
|
||||
|
||||
data.Encounter_Id = inputSrc.Encounter_Id
|
||||
data.Status_Code = inputSrc.Status_Code
|
||||
data.SrcUnit_Code = inputSrc.SrcUnit_Code
|
||||
data.Specialist_Code = inputSrc.Specialist_Code
|
||||
}
|
||||
@@ -312,7 +312,7 @@ func Reply(input e.ReplyDto) (*d.Data, error) {
|
||||
return pl.SetLogError(&event, input)
|
||||
}
|
||||
|
||||
if data.DstDoctor_Code != nil && data.DstDoctor_Code != input.AuthInfo.Doctor_Code {
|
||||
if data.Doctor_Code != nil && data.Doctor_Code != input.AuthInfo.Doctor_Code {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-handled-mismatch",
|
||||
@@ -322,7 +322,7 @@ func Reply(input e.ReplyDto) (*d.Data, error) {
|
||||
return pl.SetLogError(&event, input)
|
||||
}
|
||||
|
||||
data.DstDoctor_Code = input.AuthInfo.Doctor_Code
|
||||
data.Doctor_Code = input.AuthInfo.Doctor_Code
|
||||
data.Solution = input.Solution
|
||||
data.RepliedAt = pu.GetTimeNow()
|
||||
err = tx.Save(&data).Error
|
||||
|
||||
@@ -20,5 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Consultation) {
|
||||
data.Encounter_Id = inputSrc.Encounter_Id
|
||||
data.Date = inputSrc.Date
|
||||
data.Problem = inputSrc.Problem
|
||||
data.DstUnit_Code = inputSrc.DstUnit_Code
|
||||
data.Specialist_Code = inputSrc.Specialist_Code
|
||||
}
|
||||
@@ -18,7 +18,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ControlLetter) {
|
||||
}
|
||||
|
||||
data.Encounter_Id = inputSrc.Encounter_Id
|
||||
data.Unit_Code = inputSrc.Unit_Code
|
||||
data.Specialist_Code = inputSrc.Specialist_Code
|
||||
data.Subspecialist_Code = inputSrc.Subspecialist_Code
|
||||
data.Doctor_Code = inputSrc.Doctor_Code
|
||||
|
||||
@@ -21,7 +21,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Doctor) {
|
||||
data.Employee_Id = inputSrc.Employee_Id
|
||||
data.IHS_Number = inputSrc.IHS_Number
|
||||
data.SIP_Number = inputSrc.SIP_Number
|
||||
data.Unit_Code = inputSrc.Unit_Code
|
||||
data.Specialist_Code = inputSrc.Specialist_Code
|
||||
data.Subspecialist_Code = inputSrc.Subspecialist_Code
|
||||
}
|
||||
@@ -22,12 +22,14 @@ import (
|
||||
edc "simrs-vx/internal/domain/main-entities/death-cause"
|
||||
e "simrs-vx/internal/domain/main-entities/encounter"
|
||||
eir "simrs-vx/internal/domain/main-entities/internal-reference"
|
||||
ep "simrs-vx/internal/domain/main-entities/patient"
|
||||
es "simrs-vx/internal/domain/main-entities/soapi"
|
||||
esync "simrs-vx/internal/domain/sync-entities/log"
|
||||
|
||||
uv "simrs-vx/internal/use-case/bpjs-use-case/vclaim-reference"
|
||||
udc "simrs-vx/internal/use-case/main-use-case/death-cause"
|
||||
uir "simrs-vx/internal/use-case/main-use-case/internal-reference"
|
||||
up "simrs-vx/internal/use-case/main-use-case/patient"
|
||||
us "simrs-vx/internal/use-case/main-use-case/soapi"
|
||||
)
|
||||
|
||||
@@ -702,13 +704,13 @@ func CheckIn(input e.CheckinDto) (*d.Data, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) {
|
||||
func RequestSwitchSpecialist(input e.SwitchSpecialistDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Id: input.Id, Includes: "Responsible_Nurse.Employee.User,Responsible_Doctor.Employee"}
|
||||
var data *e.Encounter
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "RequestSwitchUnit",
|
||||
Feature: "RequestSwitchSpecialist",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
@@ -718,8 +720,8 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) {
|
||||
unitCodes := make(map[string]struct{})
|
||||
doctorCodes := make(map[string]struct{})
|
||||
for _, ref := range *input.InternalReferences {
|
||||
if ref.Unit_Code != nil {
|
||||
unitCodes[*ref.Unit_Code] = struct{}{}
|
||||
if ref.Specialist_Code != nil {
|
||||
unitCodes[*ref.Specialist_Code] = struct{}{}
|
||||
}
|
||||
if ref.Doctor_Code != nil {
|
||||
doctorCodes[*ref.Doctor_Code] = struct{}{}
|
||||
@@ -727,7 +729,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
// validate unit
|
||||
if err = validateUnitCodes(unitCodes, &event); err != nil {
|
||||
if err = validateSpecialistCodes(unitCodes, &event); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@@ -794,7 +796,7 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) {
|
||||
|
||||
mwRunner.setMwType(pu.MWTPre)
|
||||
// Run pre-middleware
|
||||
if err := mwRunner.RunRequestSwitchUnitMiddleware(requestSwitchEncounter, dataEncounter); err != nil {
|
||||
if err := mwRunner.RunRequestSwitchSpecialistMiddleware(requestSwitchEncounter, dataEncounter); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -810,13 +812,13 @@ func RequestSwitchUnit(input e.SwitchUnitDto) (*d.Data, error) {
|
||||
Meta: d.IS{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "requestSwitchUnit",
|
||||
"status": "requestSwitchSpecialist",
|
||||
},
|
||||
Data: data.ToResponse(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Id: input.Id, Includes: "Responsible_Doctor.Employee"}
|
||||
var (
|
||||
data *e.Encounter
|
||||
@@ -824,12 +826,12 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
)
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "ApproveSwitchUnit",
|
||||
Feature: "ApproveSwitchSpecialist",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "approveSwitchUnit")
|
||||
pl.SetLogInfo(&event, input, "started", "approveSwitchSpecialist")
|
||||
|
||||
roleAllowed := []string{string(erg.EPCNur)}
|
||||
err = validateAuth(input.AuthInfo, roleAllowed, "request-switch-poly", &event)
|
||||
@@ -902,13 +904,13 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
// update encounter
|
||||
if err = updateEncounterApproveSwitchUnit(input, &event, tx); err != nil {
|
||||
if err = updateEncounterApproveSwitchSpecialist(input, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
mwRunner.setMwType(pu.MWTPre)
|
||||
// Run pre-middleware
|
||||
if err := mwRunner.RunApproveSwitchUnitMiddleware(approveSwitchEncounter, &input); err != nil {
|
||||
if err := mwRunner.RunApproveSwitchSpecialistMiddleware(approveSwitchEncounter, &input); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -931,7 +933,7 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
|
||||
}
|
||||
|
||||
func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
func CancelSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||
var (
|
||||
data *e.Encounter
|
||||
@@ -939,12 +941,12 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
)
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "CancelSwitchUnit",
|
||||
Feature: "CancelSwitchSpecialist",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "cancelSwitchUnit")
|
||||
pl.SetLogInfo(&event, input, "started", "cancelSwitchSpecialist")
|
||||
|
||||
roleAllowed := []string{string(erg.EPCNur)}
|
||||
err = validateAuth(input.AuthInfo, roleAllowed, "request-switch-poly", &event)
|
||||
@@ -998,7 +1000,7 @@ func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
|
||||
mwRunner.setMwType(pu.MWTPre)
|
||||
// Run pre-middleware
|
||||
if err := mwRunner.RunCancelSwitchUnitMiddleware(cancelSwitchEncounter, &input); err != nil {
|
||||
if err := mwRunner.RunCancelSwitchSpecialistMiddleware(cancelSwitchEncounter, &input); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -1075,3 +1077,144 @@ func validateAuth(a auth.AuthInfo, roleAllowed []string, action string, event *p
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func CreateWithPatient(input e.CreateWithPatientDto) (*d.Data, error) {
|
||||
var (
|
||||
data e.Encounter
|
||||
recentSoapiDataforCopy []es.CreateDto
|
||||
err error
|
||||
)
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "Create",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "create")
|
||||
|
||||
roleAllowed := []string{string(erg.EPCReg)}
|
||||
err = validateAuth(input.Encounter.AuthInfo, roleAllowed, "create-encounter", &event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// validate rehab by bpjs
|
||||
if input.Encounter.RefTypeCode == ere.RTCBpjs &&
|
||||
input.Encounter.Class_Code == ere.ECAmbulatory &&
|
||||
ere.AmbulatoryClassCode(*input.Encounter.SubClass_Code) == ere.ACCRehab {
|
||||
// get latest rehab data
|
||||
recentRehabData, err := getLatestRehabData(input.Encounter, &event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// If recentRehabData is nil, then visitMode_Code = "adm"
|
||||
if recentRehabData != nil {
|
||||
// If recentRehabData is not nil, determine the visitMode_Code:
|
||||
// If the mode is "series", verify whether the visit count still remains
|
||||
// and whether the series has not expired.
|
||||
// If visitMode is "series", then get encounterAdm
|
||||
input.Encounter.VisitMode_Code, input.Encounter.RecentEncounterAdm, err = determineVisitMode(recentRehabData, input.Encounter, &event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
input.Encounter.VisitMode_Code = ere.VMCAdm
|
||||
}
|
||||
|
||||
// When visitMode_Code is "series", load the associated SOAPI record to copy its values.
|
||||
if input.Encounter.VisitMode_Code == ere.VMCSeries {
|
||||
// get data soapi
|
||||
recentSoapiDataforCopy, err = getSoapiEncounterAdm(*input.Encounter.RecentEncounterAdm, &event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// check if patient is new in the hospital
|
||||
input.Encounter.NewStatus, err = identifyPatientStatus(input.Encounter)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
input.Encounter.Adm_Employee_Id = input.Encounter.AuthInfo.Employee_Id
|
||||
|
||||
mwRunner := newMiddlewareRunner(&event, input.Encounter.Sync)
|
||||
|
||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||
// create patient
|
||||
var patientId uint
|
||||
patientData, err := up.Create(input.Patient, tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if patientData != nil {
|
||||
patientId = patientData.Data.(ep.ResponseDto).Id
|
||||
}
|
||||
|
||||
// create encounter
|
||||
input.Encounter.Patient_Id = &patientId
|
||||
if resData, err := CreateData(input.Encounter, &event, tx); err != nil {
|
||||
return err
|
||||
} else {
|
||||
data = *resData
|
||||
input.Encounter.Id = data.Id
|
||||
}
|
||||
|
||||
// insert ambulatory/emergency/inpatient
|
||||
err = insertdataClassCode(input.Encounter, recentSoapiDataforCopy, &event, tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// insert vclaimReference
|
||||
if vr := input.Encounter.VclaimReference; vr != nil {
|
||||
t, _ := time.Parse("2006-01-02", vr.TglRujukan)
|
||||
_, err = uv.CreateData(ev.CreateDto{
|
||||
Encounter_Id: &data.Id,
|
||||
Date: &t,
|
||||
SrcCode: input.Encounter.Ref_Number,
|
||||
SrcName: input.Encounter.RefSource_Name,
|
||||
Number: &vr.NoSep}, &event, tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
dataEncounter, err := ReadDetailData(e.ReadDetailDto{
|
||||
Id: data.Id,
|
||||
Includes: "Adm_Employee.User,Adm_Employee.Person," +
|
||||
"Patient.Person.Relatives," +
|
||||
"Patient.Person.VclaimMember,VclaimReference," +
|
||||
"Patient.Person.Contacts,Patient.Person.Addresses"},
|
||||
&event, tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
mwRunner.setMwType(pu.MWTPre)
|
||||
// Run pre-middleware
|
||||
if err := mwRunner.RunCreateWithPatientMiddleware(createWithPatientPreMw, dataEncounter); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err = runLogMiddleware(err, input, mwRunner); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.II{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "created",
|
||||
},
|
||||
Data: data.ToResponse(),
|
||||
}, nil
|
||||
}
|
||||
@@ -43,7 +43,7 @@ import (
|
||||
epi "simrs-vx/internal/domain/main-entities/prescription-item"
|
||||
er "simrs-vx/internal/domain/main-entities/rehab"
|
||||
es "simrs-vx/internal/domain/main-entities/soapi"
|
||||
eu "simrs-vx/internal/domain/main-entities/unit"
|
||||
esp "simrs-vx/internal/domain/main-entities/specialist"
|
||||
|
||||
ua "simrs-vx/internal/use-case/main-use-case/ambulatory"
|
||||
uc "simrs-vx/internal/use-case/main-use-case/chemo"
|
||||
@@ -66,7 +66,7 @@ func setDataCreate(input *e.CreateDto, data *e.Encounter) {
|
||||
data.Patient_Id = input.Patient_Id
|
||||
data.RegisteredAt = input.RegisteredAt
|
||||
data.Class_Code = input.Class_Code
|
||||
data.Unit_Code = input.Unit_Code
|
||||
data.Specialist_Code = input.Specialist_Code
|
||||
data.Specialist_Code = input.Specialist_Code
|
||||
data.Subspecialist_Code = input.Subspecialist_Code
|
||||
data.VisitDate = input.VisitDate
|
||||
@@ -85,7 +85,7 @@ func setDataCreate(input *e.CreateDto, data *e.Encounter) {
|
||||
}
|
||||
|
||||
func setDataUpdate(src e.UpdateDto, dst *e.Encounter) {
|
||||
dst.Unit_Code = src.Unit_Code
|
||||
dst.Specialist_Code = src.Specialist_Code
|
||||
dst.Specialist_Code = src.Specialist_Code
|
||||
dst.Subspecialist_Code = src.Subspecialist_Code
|
||||
dst.VisitDate = src.VisitDate
|
||||
@@ -101,7 +101,7 @@ func setDataUpdate(src e.UpdateDto, dst *e.Encounter) {
|
||||
func setDataUpdateFromSource(input *e.UpdateDto, data *e.Encounter) {
|
||||
data.Patient_Id = input.Patient_Id
|
||||
data.RegisteredAt = input.RegisteredAt
|
||||
data.Unit_Code = input.Unit_Code
|
||||
data.Specialist_Code = input.Specialist_Code
|
||||
data.Specialist_Code = input.Specialist_Code
|
||||
data.Subspecialist_Code = input.Subspecialist_Code
|
||||
data.VisitDate = input.VisitDate
|
||||
@@ -678,10 +678,10 @@ func insertDataSubClassAmbulatory(input e.CreateDto, soapiData []es.CreateDto, e
|
||||
}
|
||||
|
||||
chemoCreate := ec.CreateDto{
|
||||
Encounter_Id: &input.Id,
|
||||
Status_Code: erc.DVCVerified,
|
||||
SrcUnit_Code: input.Unit_Code,
|
||||
Class_Code: ere.CCCAct,
|
||||
Encounter_Id: &input.Id,
|
||||
Status_Code: erc.DVCVerified,
|
||||
Specialist_Code: input.Specialist_Code,
|
||||
Class_Code: ere.CCCAct,
|
||||
}
|
||||
|
||||
// create data chemo
|
||||
@@ -809,9 +809,9 @@ func setDBError(event *pl.Event, err error, ctx any) error {
|
||||
return pl.SetLogError(event, ctx)
|
||||
}
|
||||
|
||||
func getUnits(unitIds []string, event *pl.Event) ([]eu.Unit, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "getUnits")
|
||||
var units []eu.Unit
|
||||
func getSpecialists(unitIds []string, event *pl.Event) ([]esp.Specialist, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "getSpecialists")
|
||||
var units []esp.Specialist
|
||||
err := dg.I.Where("\"Code\" IN ?", unitIds).Find(&units).Error
|
||||
if err != nil {
|
||||
event.Status = "failed"
|
||||
@@ -841,18 +841,18 @@ func getDoctors(doctorIds []string, event *pl.Event) ([]ed.Doctor, error) {
|
||||
return doctors, nil
|
||||
}
|
||||
|
||||
func validateUnitCodes(unitCodes map[string]struct{}, event *pl.Event) error {
|
||||
if len(unitCodes) > 0 {
|
||||
func validateSpecialistCodes(speCodes map[string]struct{}, event *pl.Event) error {
|
||||
if len(speCodes) > 0 {
|
||||
var codes []string
|
||||
for code := range unitCodes {
|
||||
for code := range speCodes {
|
||||
codes = append(codes, code)
|
||||
}
|
||||
|
||||
units, err := getUnits(codes, event)
|
||||
specialists, err := getSpecialists(codes, event)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to fetch units: %w", err)
|
||||
}
|
||||
if len(units) != len(codes) {
|
||||
if len(specialists) != len(codes) {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-validation-fail",
|
||||
|
||||
@@ -85,8 +85,8 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.En
|
||||
tx = tx.Where("\"Encounter\".\"Status_Code\" = ?", *input.Status_Code)
|
||||
}
|
||||
|
||||
if input.Unit_Code != nil {
|
||||
tx = tx.Where("\"Encounter\".\"Unit_Code\" = ?", *input.Unit_Code)
|
||||
if input.Specialist_Code != nil {
|
||||
tx = tx.Where("\"Encounter\".\"Specialist_Code\" = ?", *input.Specialist_Code)
|
||||
}
|
||||
|
||||
if input.PaymentMethod_Code != nil {
|
||||
@@ -280,7 +280,7 @@ func UpdateStatusData(input e.UpdateStatusDto, event *pl.Event, dbx ...*gorm.DB)
|
||||
return nil
|
||||
}
|
||||
|
||||
func UpdateDischargeMethod(input e.SwitchUnitDto, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
func UpdateDischargeMethod(input e.SwitchSpecialistDto, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, input, "started", "DBUpdateDischargeMethod")
|
||||
dischargeCode := setDischargeMethodCode(*input.PolySwitchCode)
|
||||
|
||||
@@ -394,7 +394,7 @@ func verifyAllocatedVisitCount(i e.CreateDto, event *pl.Event) (e.Encounter, boo
|
||||
return recentEncounterAdm, valid, nil
|
||||
}
|
||||
|
||||
func updateEncounterApproveSwitchUnit(input e.ApproveCancelUnitDto, event *pl.Event, dbx ...*gorm.DB) (err error) {
|
||||
func updateEncounterApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto, event *pl.Event, dbx ...*gorm.DB) (err error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
|
||||
var tx *gorm.DB
|
||||
|
||||
@@ -202,7 +202,7 @@ func (me *middlewareRunner) RunUpdateStatusMiddleware(middlewares []updateStatus
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunRequestSwitchUnitMiddleware(middleware requestSwitchUnitMw, input *e.Encounter) error {
|
||||
func (me *middlewareRunner) RunRequestSwitchSpecialistMiddleware(middleware requestSwitchSpecialistMw, input *e.Encounter) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
@@ -220,7 +220,7 @@ func (me *middlewareRunner) RunRequestSwitchUnitMiddleware(middleware requestSwi
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunApproveSwitchUnitMiddleware(middleware approveSwitchUnitMw, input *e.ApproveCancelUnitDto) error {
|
||||
func (me *middlewareRunner) RunApproveSwitchSpecialistMiddleware(middleware approveSwitchSpecialistMw, input *e.ApproveCancelSpecialistDto) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
@@ -238,7 +238,7 @@ func (me *middlewareRunner) RunApproveSwitchUnitMiddleware(middleware approveSwi
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunCancelSwitchUnitMiddleware(middleware cancelSwitchUnitMw, input *e.ApproveCancelUnitDto) error {
|
||||
func (me *middlewareRunner) RunCancelSwitchSpecialistMiddleware(middleware cancelSwitchSpecialistMw, input *e.ApproveCancelSpecialistDto) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
@@ -259,3 +259,22 @@ func (me *middlewareRunner) RunCancelSwitchUnitMiddleware(middleware cancelSwitc
|
||||
func (me *middlewareRunner) setMwType(mwType pu.MWType) {
|
||||
me.MwType = mwType
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunCreateWithPatientMiddleware(middlewares []createWithPatientMw, input *e.Encounter) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, nil)
|
||||
|
||||
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||
|
||||
if err := middleware.Func(input); err != nil {
|
||||
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(me.Event, nil, "complete")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -23,7 +23,7 @@ func init() {
|
||||
updatestatusEncounter = append(updatestatusEncounter,
|
||||
updateStatusMw{Name: "sync-update-status-encounter", Func: plugin.UpdateStatus})
|
||||
|
||||
requestSwitchEncounter = requestSwitchUnitMw{Name: "sync-request-switch-unit-encounter", Func: plugin.RequestSwitchUnit}
|
||||
approveSwitchEncounter = approveSwitchUnitMw{Name: "sync-approve-switch-unit-encounter", Func: plugin.ApproveSwitchUnit}
|
||||
cancelSwitchEncounter = cancelSwitchUnitMw{Name: "sync-cancel-switch-unit-encounter", Func: plugin.CancelSwitchUnit}
|
||||
requestSwitchEncounter = requestSwitchSpecialistMw{Name: "sync-request-switch-unit-encounter", Func: plugin.RequestSwitchSpecialist}
|
||||
approveSwitchEncounter = approveSwitchSpecialistMw{Name: "sync-approve-switch-unit-encounter", Func: plugin.ApproveSwitchSpecialist}
|
||||
cancelSwitchEncounter = cancelSwitchSpecialistMw{Name: "sync-cancel-switch-unit-encounter", Func: plugin.CancelSwitchSpecialist}
|
||||
}
|
||||
@@ -59,19 +59,24 @@ type updateStatusMw struct {
|
||||
Func func(input *e.Encounter) error
|
||||
}
|
||||
|
||||
type requestSwitchUnitMw struct {
|
||||
type requestSwitchSpecialistMw struct {
|
||||
Name string
|
||||
Func func(input *e.Encounter) error
|
||||
}
|
||||
|
||||
type approveSwitchUnitMw struct {
|
||||
type approveSwitchSpecialistMw struct {
|
||||
Name string
|
||||
Func func(input *e.ApproveCancelUnitDto) error
|
||||
Func func(input *e.ApproveCancelSpecialistDto) error
|
||||
}
|
||||
|
||||
type cancelSwitchUnitMw struct {
|
||||
type cancelSwitchSpecialistMw struct {
|
||||
Name string
|
||||
Func func(input *e.ApproveCancelUnitDto) error
|
||||
Func func(input *e.ApproveCancelSpecialistDto) error
|
||||
}
|
||||
|
||||
type createWithPatientMw struct {
|
||||
Name string
|
||||
Func func(input *e.Encounter) error
|
||||
}
|
||||
|
||||
type UpdateMw = updateMw
|
||||
@@ -91,6 +96,8 @@ var deletePostMw []readDetailMw
|
||||
var checkinEncounterMw checkinMw
|
||||
var checkoutEncounter checkoutMw
|
||||
var updatestatusEncounter []updateStatusMw
|
||||
var requestSwitchEncounter requestSwitchUnitMw
|
||||
var approveSwitchEncounter approveSwitchUnitMw
|
||||
var cancelSwitchEncounter cancelSwitchUnitMw
|
||||
var requestSwitchEncounter requestSwitchSpecialistMw
|
||||
var approveSwitchEncounter approveSwitchSpecialistMw
|
||||
var cancelSwitchEncounter cancelSwitchSpecialistMw
|
||||
var createWithPatientPreMw []createWithPatientMw
|
||||
var createWithPatientPostMw []createWithPatientMw
|
||||
@@ -183,9 +183,9 @@ func generateCL(input GenerateDto, event pl.Event, tx *gorm.DB) (*ResponseDto, e
|
||||
}
|
||||
|
||||
// map template data
|
||||
clData := VclaimControlLetter{}
|
||||
if input.Data != nil {
|
||||
err := json.Unmarshal([]byte(*input.Data), &clData)
|
||||
clData := evscl.ResponseForPDF{}
|
||||
if cl.Value != nil {
|
||||
err := json.Unmarshal([]byte(*cl.Value), &clData)
|
||||
if err != nil {
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-unmarshal-fail",
|
||||
@@ -195,22 +195,11 @@ func generateCL(input GenerateDto, event pl.Event, tx *gorm.DB) (*ResponseDto, e
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
return nil, errors.New("there is no data to be used")
|
||||
return nil, errors.New("there is no value to be used")
|
||||
}
|
||||
|
||||
if cl == nil {
|
||||
createCL := evscl.CreateDto{
|
||||
VclaimSep_Number: &clData.VclaimSep.Number,
|
||||
Number: &clData.Number,
|
||||
Value: input.Data,
|
||||
}
|
||||
if cl, err = uvscl.CreateData(createCL, &event, tx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
}
|
||||
// get encounter id by vclaim sep number
|
||||
vs, err := uvs.ReadDetailData(evs.ReadDetailDto{Number: &clData.VclaimSep.Number}, &event)
|
||||
vs, err := uvs.ReadDetailData(evs.ReadDetailDto{Number: cl.VclaimSep_Number}, &event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -220,7 +209,7 @@ func generateCL(input GenerateDto, event pl.Event, tx *gorm.DB) (*ResponseDto, e
|
||||
input.Encounter_Id = vs.Encounter_Id
|
||||
input.UseA5Lanscape = true
|
||||
|
||||
templateData := clData.generateTemplateData()
|
||||
templateData := generateTemplateData(clData)
|
||||
// generate file
|
||||
urlPub, err := generateFile(input, templateData)
|
||||
if err != nil {
|
||||
|
||||
@@ -1,15 +1,11 @@
|
||||
package generatefile
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
evscl "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
|
||||
erc "simrs-vx/internal/domain/references/common"
|
||||
ere "simrs-vx/internal/domain/references/encounter"
|
||||
|
||||
er "simrs-vx/internal/domain/main-entities/resume"
|
||||
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
)
|
||||
|
||||
type GeneralConsentPDF struct {
|
||||
@@ -105,28 +101,6 @@ type GenerateDto struct {
|
||||
Data *string `json:"data"`
|
||||
}
|
||||
|
||||
type VclaimControlLetter struct {
|
||||
Number string `json:"noSuratKontrol"`
|
||||
PlannedControlDate string `json:"tglRencanaKontrol"`
|
||||
Doctor_Name string `json:"namaDokter"`
|
||||
DstUnit_Name string `json:"namaPoliTujuan"`
|
||||
ResponsibleDoctor_Name string `json:"namaDokterPembuat"`
|
||||
VclaimSep VclaimSep `json:"sep"`
|
||||
}
|
||||
|
||||
type VclaimSep struct {
|
||||
VclaimMember VclaimMember `json:"peserta"`
|
||||
Diagnose string `json:"diagnosa"`
|
||||
Number string `json:"noSep"`
|
||||
}
|
||||
|
||||
type VclaimMember struct {
|
||||
CardNumber string `json:"noKartu"`
|
||||
Name string `json:"nama"`
|
||||
BirthDate string `json:"tglLahir"`
|
||||
Gender string `json:"kelamin"`
|
||||
}
|
||||
|
||||
type GeneratePDFdto struct {
|
||||
TemplatePath string
|
||||
TemplateData any
|
||||
@@ -149,37 +123,17 @@ const (
|
||||
TDNSB TemplateDocsName = "screening-form-b.html"
|
||||
)
|
||||
|
||||
func (v VclaimControlLetter) generateTemplateData() ControlLetterPDF {
|
||||
|
||||
func generateTemplateData(v evscl.ResponseForPDF) ControlLetterPDF {
|
||||
return ControlLetterPDF{
|
||||
Number: v.Number,
|
||||
Doctor_Name: v.Doctor_Name,
|
||||
DstUnit_Name: v.DstUnit_Name,
|
||||
CardNumber: v.VclaimSep.VclaimMember.CardNumber,
|
||||
Name: v.generateNameWithGender(),
|
||||
BirthDate: v.generateBirthDate(),
|
||||
Name: v.GenerateNameWithGender(),
|
||||
BirthDate: v.GenerateBirthDate(),
|
||||
Diagnose: v.VclaimSep.Diagnose,
|
||||
PlanDate: v.PlannedControlDate,
|
||||
ResponsibleDoctor_Name: v.ResponsibleDoctor_Name,
|
||||
PrintDate: generatePrintDate(),
|
||||
PrintDate: v.IssuedDate,
|
||||
}
|
||||
}
|
||||
|
||||
func (v VclaimControlLetter) generateNameWithGender() string {
|
||||
gender := "Perempuan"
|
||||
if v.VclaimSep.VclaimMember.Gender == "L" {
|
||||
gender = "Laki-Laki"
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%s (%s)", v.VclaimSep.VclaimMember.Name, gender)
|
||||
}
|
||||
|
||||
func (v VclaimControlLetter) generateBirthDate() string {
|
||||
t, _ := time.Parse("2006-01-02", v.VclaimSep.VclaimMember.BirthDate)
|
||||
return pu.FormatIndonesianDate(t)
|
||||
}
|
||||
|
||||
func generatePrintDate() string {
|
||||
now := time.Now()
|
||||
return now.Format("2006/01/02")
|
||||
}
|
||||
@@ -57,7 +57,6 @@ func createProcedureRoom(input *e.CreateDto, event *pl.Event, tx *gorm.DB) error
|
||||
roomCreate := er.CreateDto{
|
||||
Code: input.Infra_Code,
|
||||
Infra_Code: input.Infra_Code,
|
||||
Unit_Code: input.Unit_Code,
|
||||
Specialist_Code: input.Specialist_Code,
|
||||
Subspecialist_Code: input.Subspecialist_Code,
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
|
||||
func setDataCreate(input *ir.CreateDto, data *ir.InternalReference) {
|
||||
data.Encounter_Id = input.Encounter_Id
|
||||
data.Unit_Code = input.Unit_Code
|
||||
data.Specialist_Code = input.Specialist_Code
|
||||
|
||||
data.Doctor_Code = input.Doctor_Code
|
||||
data.SrcDoctor_Code = input.SrcDoctor_Code
|
||||
@@ -28,18 +28,18 @@ func setDataUpdate(input *ir.UpdateDto, data *ir.InternalReference) {
|
||||
data.Status_Code = &input.Status_Code
|
||||
}
|
||||
|
||||
func setBulkData(input *e.SwitchUnitDto) []ir.InternalReference {
|
||||
func setBulkData(input *e.SwitchSpecialistDto) []ir.InternalReference {
|
||||
var data []ir.InternalReference
|
||||
|
||||
for _, v := range *input.InternalReferences {
|
||||
statusCode := erc.DACNew
|
||||
data = append(data, ir.InternalReference{
|
||||
Encounter_Id: &input.Id,
|
||||
Unit_Code: v.Unit_Code,
|
||||
Doctor_Code: v.Doctor_Code,
|
||||
Status_Code: &statusCode,
|
||||
SrcDoctor_Code: input.Src_Doctor_Code,
|
||||
SrcNurse_Code: input.Src_Nurse_Code,
|
||||
Encounter_Id: &input.Id,
|
||||
Specialist_Code: v.Specialist_Code,
|
||||
Doctor_Code: v.Doctor_Code,
|
||||
Status_Code: &statusCode,
|
||||
SrcDoctor_Code: input.Src_Doctor_Code,
|
||||
SrcNurse_Code: input.Src_Nurse_Code,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@ func DeleteData(data *eir.InternalReference, event *pl.Event, dbx ...*gorm.DB) e
|
||||
return nil
|
||||
}
|
||||
|
||||
func CreateBulkData(input *e.SwitchUnitDto, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
func CreateBulkData(input *e.SwitchSpecialistDto, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
|
||||
data := setBulkData(input)
|
||||
|
||||
@@ -23,4 +23,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Item) {
|
||||
data.Uom_Code = inputSrc.Uom_Code
|
||||
data.Infra_Code = inputSrc.Infra_Code
|
||||
data.Stock = inputSrc.Stock
|
||||
data.BuyingPrice = inputSrc.BuyingPrice
|
||||
data.SellingPrice = inputSrc.SellingPrice
|
||||
}
|
||||
@@ -20,6 +20,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Nurse) {
|
||||
data.Code = inputSrc.Code
|
||||
data.Employee_Id = inputSrc.Employee_Id
|
||||
data.IHS_Number = inputSrc.IHS_Number
|
||||
data.Unit_Code = inputSrc.Unit_Code
|
||||
data.Specialist_Code = inputSrc.Specialist_Code
|
||||
data.Infra_Code = inputSrc.Infra_Code
|
||||
}
|
||||
@@ -27,7 +27,7 @@ import (
|
||||
|
||||
const source = "patient"
|
||||
|
||||
func Create(input e.CreateDto) (*d.Data, error) {
|
||||
func Create(input e.CreateDto, dbx ...*gorm.DB) (*d.Data, error) {
|
||||
data := e.Patient{}
|
||||
|
||||
event := pl.Event{
|
||||
@@ -35,16 +35,22 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
Source: source,
|
||||
}
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "create")
|
||||
mwRunner := newMiddlewareRunner(&event, input.Sync)
|
||||
|
||||
// check if user has employee position
|
||||
if !input.AuthInfo.HasEmployeePosition() {
|
||||
if !input.AuthInfo.IsReg() && !input.AuthInfo.IsSys() {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "auth-forbidden",
|
||||
Detail: "user has no employee position",
|
||||
Detail: "user role is not allowed to create patient, only 'reg' position is allowed",
|
||||
Raw: errors.New("authentication failed"),
|
||||
}
|
||||
return nil, pl.SetLogError(&event, input)
|
||||
@@ -52,7 +58,7 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
|
||||
input.RegisteredBy_User_Name = &input.AuthInfo.User_Name
|
||||
|
||||
err := dg.I.Transaction(func(tx *gorm.DB) error {
|
||||
err := tx.Transaction(func(tx1 *gorm.DB) error {
|
||||
mwRunner.setMwType(pu.MWTPre)
|
||||
// Run pre-middleware
|
||||
if err := mwRunner.RunCreateMiddleware(createPreMw, &input, &data); err != nil {
|
||||
@@ -66,14 +72,14 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
}
|
||||
input.Number = nomr
|
||||
|
||||
if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx); err != nil {
|
||||
if person_id, err := upe.CreateOrUpdatePerson(input.Person, &event, tx1); err != nil {
|
||||
return err
|
||||
} else {
|
||||
input.Person_Id = person_id
|
||||
}
|
||||
|
||||
if input.Person.VclaimMember_CardNumber != nil && input.Person.ResidentIdentityNumber != nil {
|
||||
if err := uvm.CreateOrUpdateData(evm.CreateDto{CardNumber: input.Person.VclaimMember_CardNumber, Person_Id: input.Person_Id}, &event, tx); err != nil {
|
||||
if err := uvm.CreateOrUpdateData(evm.CreateDto{CardNumber: input.Person.VclaimMember_CardNumber, Person_Id: input.Person_Id}, &event, tx1); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
@@ -81,38 +87,38 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
for idx := range input.PersonAddresses {
|
||||
input.PersonAddresses[idx].Person_Id = *input.Person_Id
|
||||
}
|
||||
if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx); err != nil {
|
||||
if err := upa.CreateOrUpdateBatch(input.PersonAddresses, &event, tx1); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for idx := range input.PersonContacts {
|
||||
input.PersonContacts[idx].Person_Id = *input.Person_Id
|
||||
}
|
||||
if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx); err != nil {
|
||||
if err := upc.CreateOrUpdateBatch(input.PersonContacts, &event, tx1); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for idx := range input.PersonRelatives {
|
||||
input.PersonRelatives[idx].Person_Id = *input.Person_Id
|
||||
}
|
||||
if err := upr.CreateOrUpdateBatch(input.PersonRelatives, &event, tx); err != nil {
|
||||
if err := upr.CreateOrUpdateBatch(input.PersonRelatives, &event, tx1); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for idx := range input.PersonInsurances {
|
||||
input.PersonInsurances[idx].Person_Id = *input.Person_Id
|
||||
}
|
||||
if err := upi.CreateOrUpdateBatch(input.PersonInsurances, &event, tx); err != nil {
|
||||
if err := upi.CreateOrUpdateBatch(input.PersonInsurances, &event, tx1); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if resData, err := CreateData(input, &event, tx); err != nil {
|
||||
if resData, err := CreateData(input, &event, tx1); err != nil {
|
||||
return err
|
||||
} else {
|
||||
data = *resData
|
||||
}
|
||||
|
||||
dataPatient, err := ReadDetailData(e.ReadDetailDto{Id: uint16(data.Id)}, &event, tx)
|
||||
dataPatient, err := ReadDetailData(e.ReadDetailDto{Id: uint16(data.Id)}, &event, tx1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -227,6 +233,16 @@ func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
pl.SetLogInfo(&event, input, "started", "update")
|
||||
mwRunner := newMiddlewareRunner(&event, input.Sync)
|
||||
|
||||
if !input.AuthInfo.IsReg() && !input.AuthInfo.IsSys() {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "auth-forbidden",
|
||||
Detail: "user role is not allowed to create patient, only 'reg' position is allowed",
|
||||
Raw: errors.New("authentication failed"),
|
||||
}
|
||||
return nil, pl.SetLogError(&event, input)
|
||||
}
|
||||
|
||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
|
||||
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
|
||||
|
||||
@@ -142,7 +142,7 @@ func DeleteData(data *e.Patient, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
if err := tx.Delete(&data).Error; err != nil {
|
||||
if err := tx.Unscoped().Delete(&data).Error; err != nil {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-delete-fail",
|
||||
|
||||
@@ -2,6 +2,8 @@ package personaddress
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/person-address"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
plh "simrs-vx/pkg/lib-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
@@ -179,10 +181,19 @@ func CreateOrUpdateBatch(input []e.UpdateDto, event *pl.Event, tx ...*gorm.DB) e
|
||||
}
|
||||
setData(&input[idx], &data[idx])
|
||||
if err := dbx.Create(&data[idx]).Error; err != nil {
|
||||
errMsg := err.Error()
|
||||
additionalMessage := ""
|
||||
// FK error
|
||||
if strings.Contains(errMsg, "violates foreign key") {
|
||||
pos := strings.Index(errMsg, "violates foreign key")
|
||||
additionalMessage = ", " + errMsg[pos:]
|
||||
}
|
||||
// Got another errot, put it down below
|
||||
// ....
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-create-fail",
|
||||
Detail: "Database insert failed",
|
||||
Detail: "data insert failed at PersonAddres[" + strconv.Itoa(idx) + "]" + additionalMessage,
|
||||
Raw: err,
|
||||
}
|
||||
return pl.SetLogError(event, input)
|
||||
|
||||
@@ -18,7 +18,7 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.PracticeSchedule) {
|
||||
}
|
||||
|
||||
data.Doctor_Code = inputSrc.Doctor_Code
|
||||
data.Unit_Code = inputSrc.Unit_Code
|
||||
data.Specialist_Code = inputSrc.Specialist_Code
|
||||
data.Day_Code = inputSrc.Day_Code
|
||||
data.StartTime = inputSrc.StartTime
|
||||
data.EndTime = inputSrc.EndTime
|
||||
|
||||
+9
-9
@@ -1,10 +1,10 @@
|
||||
package actionreport
|
||||
package procedurereport
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strconv"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/action-report"
|
||||
e "simrs-vx/internal/domain/main-entities/procedure-report"
|
||||
|
||||
dg "github.com/karincake/apem/db-gorm-pg"
|
||||
d "github.com/karincake/dodol"
|
||||
@@ -15,10 +15,10 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
const source = "action-report"
|
||||
const source = "procedure-report"
|
||||
|
||||
func Create(input e.CreateDto) (*d.Data, error) {
|
||||
data := e.ActionReport{}
|
||||
data := e.ProcedureReport{}
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "Create",
|
||||
@@ -85,8 +85,8 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
func ReadList(input e.ReadListDto) (*d.Data, error) {
|
||||
var data *e.ActionReport
|
||||
var dataList []e.ActionReport
|
||||
var data *e.ProcedureReport
|
||||
var dataList []e.ProcedureReport
|
||||
var metaList *e.MetaDto
|
||||
var err error
|
||||
|
||||
@@ -138,7 +138,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
|
||||
var data *e.ActionReport
|
||||
var data *e.ProcedureReport
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
@@ -186,7 +186,7 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
|
||||
|
||||
func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||
var data *e.ActionReport
|
||||
var data *e.ProcedureReport
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
@@ -242,7 +242,7 @@ func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
|
||||
func Delete(input e.DeleteDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||
var data *e.ActionReport
|
||||
var data *e.ProcedureReport
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
DESCRIPTION:
|
||||
Any functions that are used internally by the use-case
|
||||
*/
|
||||
package procedurereport
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/procedure-report"
|
||||
)
|
||||
|
||||
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureReport) {
|
||||
var inputSrc *e.CreateDto
|
||||
if inputT, ok := any(input).(*e.CreateDto); ok {
|
||||
inputSrc = inputT
|
||||
} else {
|
||||
inputTemp := any(input).(*e.UpdateDto)
|
||||
inputSrc = &inputTemp.CreateDto
|
||||
}
|
||||
|
||||
data.Encounter_Id = inputSrc.Encounter_Id
|
||||
data.Date = inputSrc.Date
|
||||
data.Doctor_Code = inputSrc.Doctor_Code
|
||||
data.Operator_Name = inputSrc.Operator_Name
|
||||
data.Assistant_Name = inputSrc.Assistant_Name
|
||||
data.Instrumentor_Name = inputSrc.Instrumentor_Name
|
||||
data.Anesthesia_Doctor_Code = inputSrc.Anesthesia_Doctor_Code
|
||||
data.Anesthesia_Nurse_Name = inputSrc.Anesthesia_Nurse_Name
|
||||
data.Diagnose = inputSrc.Diagnose
|
||||
data.Nurse_Name = inputSrc.Nurse_Name
|
||||
data.ProcedureValue = inputSrc.ProcedureValue
|
||||
data.ExecutionValue = inputSrc.ExecutionValue
|
||||
data.Type_Code = inputSrc.Type_Code
|
||||
|
||||
//PROPER
|
||||
// data.Operator_Employe_Id = inputSrc.Operator_Employe_Id
|
||||
// data.Assistant_Employe_Id = inputSrc.Assistant_Employe_Id
|
||||
// data.Instrumentor_Employe_Id = inputSrc.Instrumentor_Employe_Id
|
||||
// data.Nurse_Code = inputSrc.Nurse_Code
|
||||
}
|
||||
+11
-11
@@ -1,7 +1,7 @@
|
||||
package actionreport
|
||||
package procedurereport
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/action-report"
|
||||
e "simrs-vx/internal/domain/main-entities/procedure-report"
|
||||
|
||||
plh "simrs-vx/pkg/lib-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
@@ -12,10 +12,10 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ActionReport, error) {
|
||||
func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureReport, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
|
||||
data := e.ActionReport{}
|
||||
data := e.ProcedureReport{}
|
||||
setData(&input, &data)
|
||||
|
||||
var tx *gorm.DB
|
||||
@@ -33,9 +33,9 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.ActionR
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ActionReport, *e.MetaDto, error) {
|
||||
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.ProcedureReport, *e.MetaDto, error) {
|
||||
pl.SetLogInfo(event, input, "started", "DBReadList")
|
||||
data := []e.ActionReport{}
|
||||
data := []e.ProcedureReport{}
|
||||
pagination := gh.Pagination{}
|
||||
count := int64(0)
|
||||
meta := e.MetaDto{}
|
||||
@@ -48,7 +48,7 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ac
|
||||
}
|
||||
|
||||
tx = tx.
|
||||
Model(&e.ActionReport{}).
|
||||
Model(&e.ProcedureReport{}).
|
||||
Scopes(gh.Preload(input.Includes)).
|
||||
Scopes(gh.Filter(input.FilterDto)).
|
||||
Count(&count).
|
||||
@@ -70,9 +70,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Ac
|
||||
return data, &meta, nil
|
||||
}
|
||||
|
||||
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ActionReport, error) {
|
||||
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.ProcedureReport, error) {
|
||||
pl.SetLogInfo(event, input, "started", "DBReadDetail")
|
||||
data := e.ActionReport{}
|
||||
data := e.ProcedureReport{}
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
@@ -91,7 +91,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func UpdateData(input e.UpdateDto, data *e.ActionReport, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
func UpdateData(input e.UpdateDto, data *e.ProcedureReport, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, data, "started", "DBUpdate")
|
||||
setData(&input, data)
|
||||
|
||||
@@ -116,7 +116,7 @@ func UpdateData(input e.UpdateDto, data *e.ActionReport, event *pl.Event, dbx ..
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteData(data *e.ActionReport, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
func DeleteData(data *e.ProcedureReport, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, data, "started", "DBDelete")
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
+7
-7
@@ -1,7 +1,7 @@
|
||||
package unit_position
|
||||
package procedurereport
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/unit-position"
|
||||
e "simrs-vx/internal/domain/main-entities/procedure-report"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
|
||||
@@ -23,7 +23,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner {
|
||||
}
|
||||
|
||||
// ExecuteCreateMiddleware executes create middleware
|
||||
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.UnitPosition) error {
|
||||
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ProcedureReport) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -38,7 +38,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.UnitPosition) error {
|
||||
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ProcedureReport) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -53,7 +53,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.UnitPosition) error {
|
||||
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureReport) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -68,7 +68,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.UnitPosition) error {
|
||||
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureReport) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -83,7 +83,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.UnitPosition) error {
|
||||
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ProcedureReport) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package unit_position
|
||||
package procedurereport
|
||||
|
||||
// example of middleware
|
||||
// func init() {
|
||||
+5
-5
@@ -6,27 +6,27 @@ In this sample it also provides type and variable regarding the needs of the
|
||||
middleware to separate from main use-case which has the basic CRUD
|
||||
functionality. The purpose of this is to make the code more maintainable.
|
||||
*/
|
||||
package unit_position
|
||||
package procedurereport
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit-position"
|
||||
e "simrs-vx/internal/domain/main-entities/procedure-report"
|
||||
)
|
||||
|
||||
type createMw struct {
|
||||
Name string
|
||||
Func func(input *e.CreateDto, data *e.UnitPosition, tx *gorm.DB) error
|
||||
Func func(input *e.CreateDto, data *e.ProcedureReport, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type readListMw struct {
|
||||
Name string
|
||||
Func func(input *e.ReadListDto, data *e.UnitPosition, tx *gorm.DB) error
|
||||
Func func(input *e.ReadListDto, data *e.ProcedureReport, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type readDetailMw struct {
|
||||
Name string
|
||||
Func func(input *e.ReadDetailDto, data *e.UnitPosition, tx *gorm.DB) error
|
||||
Func func(input *e.ReadDetailDto, data *e.ProcedureReport, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type UpdateMw = readDetailMw
|
||||
@@ -19,7 +19,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.ProcedureRoom) {
|
||||
|
||||
data.Code = *inputSrc.Infra_Code
|
||||
data.Infra_Code = inputSrc.Infra_Code
|
||||
data.Unit_Code = inputSrc.Unit_Code
|
||||
data.Specialist_Code = inputSrc.Specialist_Code
|
||||
data.Subspecialist_Code = inputSrc.Subspecialist_Code
|
||||
}
|
||||
+13
-39
@@ -1,27 +1,22 @@
|
||||
package unit_position
|
||||
package registrator
|
||||
|
||||
import (
|
||||
ee "simrs-vx/internal/domain/main-entities/employee"
|
||||
eu "simrs-vx/internal/domain/main-entities/unit"
|
||||
e "simrs-vx/internal/domain/main-entities/unit-position"
|
||||
"strconv"
|
||||
|
||||
ue "simrs-vx/internal/use-case/main-use-case/employee"
|
||||
uu "simrs-vx/internal/use-case/main-use-case/unit"
|
||||
|
||||
dg "github.com/karincake/apem/db-gorm-pg"
|
||||
d "github.com/karincake/dodol"
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/registrator"
|
||||
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
const source = "unit-position"
|
||||
const source = "registrator"
|
||||
|
||||
func Create(input e.CreateDto) (*d.Data, error) {
|
||||
data := e.UnitPosition{}
|
||||
data := e.Registrator{}
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "Create",
|
||||
@@ -39,10 +34,6 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := validateForeignKey(input); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if resData, err := CreateData(input, &event, tx); err != nil {
|
||||
return err
|
||||
} else {
|
||||
@@ -75,8 +66,8 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
func ReadList(input e.ReadListDto) (*d.Data, error) {
|
||||
var data *e.UnitPosition
|
||||
var dataList []e.UnitPosition
|
||||
var data *e.Registrator
|
||||
var dataList []e.Registrator
|
||||
var metaList *e.MetaDto
|
||||
var err error
|
||||
|
||||
@@ -128,7 +119,7 @@ func ReadList(input e.ReadListDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
|
||||
var data *e.UnitPosition
|
||||
var data *e.Registrator
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
@@ -175,8 +166,8 @@ func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Code: &input.Code}
|
||||
var data *e.UnitPosition
|
||||
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||
var data *e.Registrator
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
@@ -200,10 +191,6 @@ func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := validateForeignKey(input.CreateDto); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := UpdateData(input, data, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -235,8 +222,8 @@ func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
func Delete(input e.DeleteDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Code: input.Code}
|
||||
var data *e.UnitPosition
|
||||
rdDto := e.ReadDetailDto{Id: &input.Id}
|
||||
var data *e.Registrator
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
@@ -287,16 +274,3 @@ func Delete(input e.DeleteDto) (*d.Data, error) {
|
||||
}, nil
|
||||
|
||||
}
|
||||
|
||||
func validateForeignKey(input e.CreateDto) error {
|
||||
// validate installation_id
|
||||
if _, err := uu.ReadDetail(eu.ReadDetailDto{Code: input.Unit_Code}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// validate employee_Id
|
||||
if _, err := ue.ReadDetail(ee.ReadDetailDto{Id: uint16(*input.Employee_Id)}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
+4
-5
@@ -2,13 +2,13 @@
|
||||
DESCRIPTION:
|
||||
Any functions that are used internally by the use-case
|
||||
*/
|
||||
package unit
|
||||
package registrator
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
e "simrs-vx/internal/domain/main-entities/registrator"
|
||||
)
|
||||
|
||||
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Unit) {
|
||||
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Registrator) {
|
||||
var inputSrc *e.CreateDto
|
||||
if inputT, ok := any(input).(*e.CreateDto); ok {
|
||||
inputSrc = inputT
|
||||
@@ -17,7 +17,6 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Unit) {
|
||||
inputSrc = &inputTemp.CreateDto
|
||||
}
|
||||
|
||||
data.Employee_Id = inputSrc.Employee_Id
|
||||
data.Installation_Code = inputSrc.Installation_Code
|
||||
data.Code = inputSrc.Code
|
||||
data.Name = inputSrc.Name
|
||||
}
|
||||
+48
-18
@@ -1,7 +1,8 @@
|
||||
package unit
|
||||
package registrator
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
"fmt"
|
||||
e "simrs-vx/internal/domain/main-entities/registrator"
|
||||
|
||||
plh "simrs-vx/pkg/lib-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
@@ -12,10 +13,10 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Unit, error) {
|
||||
func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Registrator, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
|
||||
data := e.Unit{}
|
||||
data := e.Registrator{}
|
||||
setData(&input, &data)
|
||||
|
||||
var tx *gorm.DB
|
||||
@@ -33,9 +34,9 @@ func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.Unit, e
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Unit, *e.MetaDto, error) {
|
||||
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Registrator, *e.MetaDto, error) {
|
||||
pl.SetLogInfo(event, input, "started", "DBReadList")
|
||||
data := []e.Unit{}
|
||||
data := []e.Registrator{}
|
||||
pagination := gh.Pagination{}
|
||||
count := int64(0)
|
||||
meta := e.MetaDto{}
|
||||
@@ -48,12 +49,12 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un
|
||||
}
|
||||
|
||||
tx = tx.
|
||||
Model(&e.Unit{}).
|
||||
Model(&e.Registrator{}).
|
||||
Scopes(gh.Preload(input.Includes)).
|
||||
Scopes(gh.Filter(input.FilterDto)).
|
||||
Count(&count).
|
||||
Scopes(gh.Paginate(input, &pagination)).
|
||||
Scopes(gh.Sort(input.Sort))
|
||||
Order("\"CreatedAt\" DESC")
|
||||
|
||||
if err := tx.Find(&data).Error; err != nil {
|
||||
if err == gorm.ErrRecordNotFound {
|
||||
@@ -70,9 +71,9 @@ func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.Un
|
||||
return data, &meta, nil
|
||||
}
|
||||
|
||||
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Unit, error) {
|
||||
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.Registrator, error) {
|
||||
pl.SetLogInfo(event, input, "started", "DBReadDetail")
|
||||
data := e.Unit{}
|
||||
data := e.Registrator{}
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
@@ -81,16 +82,14 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
if input.Code != nil {
|
||||
tx = tx.Where("\"Code\" = ?", *input.Code)
|
||||
if input.Employee_Id != nil {
|
||||
tx = tx.Where("\"Employee_Id\" = ?", *input.Employee_Id)
|
||||
}
|
||||
if input.Id != nil {
|
||||
tx = tx.Where("\"Id\" = ?", input.Id)
|
||||
}
|
||||
|
||||
if err := tx.
|
||||
Scopes(gh.Preload(input.Includes)).
|
||||
First(&data).Error; err != nil {
|
||||
fmt.Println(input.Includes)
|
||||
if err := tx.Scopes(gh.Preload(input.Includes)).First(&data).Error; err != nil {
|
||||
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
|
||||
return nil, processedErr
|
||||
}
|
||||
@@ -100,7 +99,7 @@ func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func UpdateData(input e.UpdateDto, data *e.Unit, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
func UpdateData(input e.UpdateDto, data *e.Registrator, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, data, "started", "DBUpdate")
|
||||
setData(&input, data)
|
||||
|
||||
@@ -125,7 +124,7 @@ func UpdateData(input e.UpdateDto, data *e.Unit, event *pl.Event, dbx ...*gorm.D
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteData(data *e.Unit, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
func DeleteData(data *e.Registrator, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, data, "started", "DBDelete")
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
@@ -147,3 +146,34 @@ func DeleteData(data *e.Unit, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetIdByUserId(user_id *uint, event *pl.Event, dbx ...*gorm.DB) (*uint, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBGetIdByUserId")
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
var registrator_id uint
|
||||
|
||||
err := tx.Model(&e.Registrator{}).
|
||||
Select("\"Doctor\".\"Id\" as registrator_id").
|
||||
Joins("JOIN \"Employee\" as e ON e.\"Id\" = \"Doctor\".\"Employee_Id\"").
|
||||
Where("e.\"User_Id\" = ?", user_id).
|
||||
Scan(®istrator_id).Error
|
||||
|
||||
if err != nil {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-get-fail",
|
||||
Detail: "Database get failed",
|
||||
Raw: err,
|
||||
}
|
||||
return nil, pl.SetLogError(event, user_id)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return ®istrator_id, nil
|
||||
}
|
||||
+7
-7
@@ -1,7 +1,7 @@
|
||||
package actionreport
|
||||
package registrator
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/action-report"
|
||||
e "simrs-vx/internal/domain/main-entities/registrator"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
|
||||
@@ -23,7 +23,7 @@ func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner {
|
||||
}
|
||||
|
||||
// ExecuteCreateMiddleware executes create middleware
|
||||
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ActionReport) error {
|
||||
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -38,7 +38,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ActionReport) error {
|
||||
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -53,7 +53,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ActionReport) error {
|
||||
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -68,7 +68,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ActionReport) error {
|
||||
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -83,7 +83,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ActionReport) error {
|
||||
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package actionreport
|
||||
package registrator
|
||||
|
||||
// example of middleware
|
||||
// func init() {
|
||||
+5
-5
@@ -6,27 +6,27 @@ In this sample it also provides type and variable regarding the needs of the
|
||||
middleware to separate from main use-case which has the basic CRUD
|
||||
functionality. The purpose of this is to make the code more maintainable.
|
||||
*/
|
||||
package actionreport
|
||||
package registrator
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/action-report"
|
||||
e "simrs-vx/internal/domain/main-entities/registrator"
|
||||
)
|
||||
|
||||
type createMw struct {
|
||||
Name string
|
||||
Func func(input *e.CreateDto, data *e.ActionReport, tx *gorm.DB) error
|
||||
Func func(input *e.CreateDto, data *e.Registrator, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type readListMw struct {
|
||||
Name string
|
||||
Func func(input *e.ReadListDto, data *e.ActionReport, tx *gorm.DB) error
|
||||
Func func(input *e.ReadListDto, data *e.Registrator, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type readDetailMw struct {
|
||||
Name string
|
||||
Func func(input *e.ReadDetailDto, data *e.ActionReport, tx *gorm.DB) error
|
||||
Func func(input *e.ReadDetailDto, data *e.Registrator, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type UpdateMw = readDetailMw
|
||||
@@ -19,5 +19,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.Specialist) {
|
||||
|
||||
data.Code = inputSrc.Code
|
||||
data.Name = inputSrc.Name
|
||||
data.Unit_Code = inputSrc.Unit_Code
|
||||
data.Installation_Code = inputSrc.Installation_Code
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
/*
|
||||
DESCRIPTION:
|
||||
Any functions that are used internally by the use-case
|
||||
*/
|
||||
package unit_position
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/unit-position"
|
||||
)
|
||||
|
||||
func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.UnitPosition) {
|
||||
var inputSrc *e.CreateDto
|
||||
if inputT, ok := any(input).(*e.CreateDto); ok {
|
||||
inputSrc = inputT
|
||||
} else {
|
||||
inputTemp := any(input).(*e.UpdateDto)
|
||||
inputSrc = &inputTemp.CreateDto
|
||||
}
|
||||
|
||||
data.Unit_Code = inputSrc.Unit_Code
|
||||
data.Code = inputSrc.Code
|
||||
data.Name = inputSrc.Name
|
||||
data.HeadStatus = inputSrc.HeadStatus
|
||||
data.Employee_Id = inputSrc.Employee_Id
|
||||
}
|
||||
@@ -1,156 +0,0 @@
|
||||
package unit_position
|
||||
|
||||
import (
|
||||
"errors"
|
||||
e "simrs-vx/internal/domain/main-entities/unit-position"
|
||||
|
||||
plh "simrs-vx/pkg/lib-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
|
||||
dg "github.com/karincake/apem/db-gorm-pg"
|
||||
gh "github.com/karincake/getuk"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CreateData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*e.UnitPosition, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
|
||||
data := e.UnitPosition{}
|
||||
setData(&input, &data)
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
if err := tx.Create(&data).Error; err != nil {
|
||||
return nil, plh.HandleCreateError(input, event, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func ReadListData(input e.ReadListDto, event *pl.Event, dbx ...*gorm.DB) ([]e.UnitPosition, *e.MetaDto, error) {
|
||||
pl.SetLogInfo(event, input, "started", "DBReadList")
|
||||
data := []e.UnitPosition{}
|
||||
pagination := gh.Pagination{}
|
||||
count := int64(0)
|
||||
meta := e.MetaDto{}
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
tx = tx.
|
||||
Model(&e.UnitPosition{}).
|
||||
Scopes(gh.Preload(input.Includes)).
|
||||
Scopes(gh.Filter(input.FilterDto)).
|
||||
Count(&count).
|
||||
Scopes(gh.Paginate(input, &pagination)).
|
||||
Scopes(gh.Sort(input.Sort))
|
||||
|
||||
if err := tx.Find(&data).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, &meta, nil
|
||||
}
|
||||
return nil, nil, plh.HandleListError(input, event, err)
|
||||
}
|
||||
|
||||
meta.Count = int(count)
|
||||
meta.PageNumber = pagination.PageNumber
|
||||
meta.PageSize = pagination.PageSize
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return data, &meta, nil
|
||||
}
|
||||
|
||||
func ReadDetailData(input e.ReadDetailDto, event *pl.Event, dbx ...*gorm.DB) (*e.UnitPosition, error) {
|
||||
pl.SetLogInfo(event, input, "started", "DBReadDetail")
|
||||
data := e.UnitPosition{}
|
||||
|
||||
var tx, getData *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
switch {
|
||||
case input.Id != nil:
|
||||
getData = tx.First(&data, input.Id)
|
||||
case input.Code != nil && *input.Code != "":
|
||||
getData = tx.Where("\"Code\" = ?", *input.Code).First(&data)
|
||||
default:
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-read-detail-fail",
|
||||
Detail: "either Id or Code must be provided",
|
||||
}
|
||||
|
||||
return nil, pl.SetLogError(event, nil)
|
||||
}
|
||||
|
||||
if err := getData.Error; err != nil {
|
||||
if processedErr := pu.HandleReadError(err, event, source, input.Id, data); processedErr != nil {
|
||||
return nil, processedErr
|
||||
}
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func UpdateData(input e.UpdateDto, data *e.UnitPosition, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, data, "started", "DBUpdate")
|
||||
setData(&input, data)
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
if err := tx.Save(&data).Error; err != nil {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-update-fail",
|
||||
Detail: "Database update failed",
|
||||
Raw: err,
|
||||
}
|
||||
return pl.SetLogError(event, input)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeleteData(data *e.UnitPosition, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, data, "started", "DBDelete")
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
if err := tx.Delete(&data).Error; err != nil {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "data-delete-fail",
|
||||
Detail: "Database delete failed",
|
||||
Raw: err,
|
||||
}
|
||||
return pl.SetLogError(event, data)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return nil
|
||||
}
|
||||
@@ -1,280 +0,0 @@
|
||||
package unit
|
||||
|
||||
import (
|
||||
"errors"
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
erc "simrs-vx/internal/domain/references/common"
|
||||
esync "simrs-vx/internal/domain/sync-entities/log"
|
||||
"strconv"
|
||||
|
||||
dg "github.com/karincake/apem/db-gorm-pg"
|
||||
d "github.com/karincake/dodol"
|
||||
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
const source = "unit"
|
||||
|
||||
func Create(input e.CreateDto) (*d.Data, error) {
|
||||
data := e.Unit{}
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "Create",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "create")
|
||||
|
||||
// validate unit_code
|
||||
_, err := strconv.Atoi(input.Code)
|
||||
if err != nil {
|
||||
event.Status = "failed"
|
||||
event.ErrInfo = pl.ErrorInfo{
|
||||
Code: "invalid_code_format",
|
||||
Detail: "unit_code must be a valid integer",
|
||||
Raw: errors.New("invalid unit_code format"),
|
||||
}
|
||||
return nil, pl.SetLogError(&event, input)
|
||||
}
|
||||
|
||||
mwRunner := newMiddlewareRunner(&event)
|
||||
|
||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||
if resData, err := CreateData(input, &event, tx); err != nil {
|
||||
return err
|
||||
} else {
|
||||
data = *resData
|
||||
id := uint(data.Id)
|
||||
input.Id = &id
|
||||
}
|
||||
|
||||
mwRunner.setMwType(pu.MWTPre)
|
||||
// Run pre-middleware
|
||||
if err := mwRunner.RunCreateMiddleware(createPreMw, &input); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err = runLogMiddleware(err, input, mwRunner); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.II{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "created",
|
||||
},
|
||||
Data: data.ToResponse(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func ReadList(input e.ReadListDto) (*d.Data, error) {
|
||||
var dataList []e.Unit
|
||||
var metaList *e.MetaDto
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "ReadList",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "readList")
|
||||
|
||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||
if dataList, metaList, err = ReadListData(input, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.IS{
|
||||
"source": source,
|
||||
"structure": "list-data",
|
||||
"status": "fetched",
|
||||
"page_number": strconv.Itoa(metaList.PageNumber),
|
||||
"page_size": strconv.Itoa(metaList.PageSize),
|
||||
"record_totalCount": strconv.Itoa(metaList.Count),
|
||||
"record_currentCount": strconv.Itoa(len(dataList)),
|
||||
},
|
||||
Data: e.ToResponseList(dataList),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func ReadDetail(input e.ReadDetailDto) (*d.Data, error) {
|
||||
var data *e.Unit
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "ReadDetail",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "readDetail")
|
||||
|
||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||
if data, err = ReadDetailData(input, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.IS{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "fetched",
|
||||
},
|
||||
Data: data.ToResponse(),
|
||||
}, nil
|
||||
}
|
||||
|
||||
func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Code: &input.Code}
|
||||
var data *e.Unit
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "Update",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "update")
|
||||
mwRunner := newMiddlewareRunner(&event)
|
||||
|
||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
|
||||
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
input.Id = &data.Id
|
||||
if err := UpdateData(input, data, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
mwRunner.setMwType(pu.MWTPre)
|
||||
// Run pre-middleware
|
||||
if err := mwRunner.RunUpdateMiddleware(updatePreMw, &input); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err = runLogMiddleware(err, input, mwRunner); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.IS{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "updated",
|
||||
},
|
||||
Data: data.ToResponse(),
|
||||
}, nil
|
||||
|
||||
}
|
||||
|
||||
func Delete(input e.DeleteDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Code: input.Code}
|
||||
var data *e.Unit
|
||||
var err error
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "Delete",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "delete")
|
||||
mwRunner := newMiddlewareRunner(&event)
|
||||
|
||||
err = dg.I.Transaction(func(tx *gorm.DB) error {
|
||||
pl.SetLogInfo(&event, rdDto, "started", "DBReadDetail")
|
||||
if data, err = ReadDetailData(rdDto, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
input.Id = &data.Id
|
||||
if err := DeleteData(data, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
mwRunner.setMwType(pu.MWTPre)
|
||||
// Run pre-middleware
|
||||
if err := mwRunner.RunDeleteMiddleware(deletePreMw, &input); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err = runLogMiddleware(err, input, mwRunner); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.IS{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "deleted",
|
||||
},
|
||||
Data: data.ToResponse(),
|
||||
}, nil
|
||||
|
||||
}
|
||||
|
||||
func runLogMiddleware(err error, input any, mwRunner *middlewareRunner) error {
|
||||
var errMsg string
|
||||
inputLog := esync.SimxLogDto{
|
||||
Payload: input,
|
||||
Method: erc.CCCreate,
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
// Run log-middleware
|
||||
errMsg = err.Error()
|
||||
inputLog.ErrMessage = &errMsg
|
||||
inputLog.IsSuccess = false
|
||||
|
||||
// create log failed
|
||||
if errMiddleware := mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); errMiddleware != nil {
|
||||
return errMiddleware
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
// create log success
|
||||
inputLog.IsSuccess = true
|
||||
if err = mwRunner.RunCreateLogMiddleware(createSimxLogMw, &inputLog); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,148 +0,0 @@
|
||||
package unit
|
||||
|
||||
import (
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
sync "simrs-vx/internal/infra/sync-consumer-cfg"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
esync "simrs-vx/internal/domain/sync-entities/log"
|
||||
)
|
||||
|
||||
type middlewareRunner struct {
|
||||
Event *pl.Event
|
||||
Tx *gorm.DB
|
||||
MwType pu.MWType
|
||||
SyncOn bool
|
||||
}
|
||||
|
||||
// NewMiddlewareExecutor creates a new middleware executor
|
||||
func newMiddlewareRunner(event *pl.Event) *middlewareRunner {
|
||||
return &middlewareRunner{
|
||||
Event: event,
|
||||
SyncOn: sync.O.Enable,
|
||||
}
|
||||
}
|
||||
|
||||
// ExecuteCreateMiddleware executes create middleware
|
||||
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, nil)
|
||||
|
||||
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||
|
||||
if err := middleware.Func(input); err != nil {
|
||||
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(me.Event, nil, "complete")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// ExecuteCreateMiddleware executes create middleware
|
||||
func (me *middlewareRunner) RunCreateLogMiddleware(middlewares []createLogMw, input *esync.SimxLogDto) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, nil)
|
||||
|
||||
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||
|
||||
if err := middleware.Func(input); err != nil {
|
||||
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(me.Event, nil, "complete")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Unit) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||
|
||||
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(me.Event, nil, "complete")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Unit) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||
|
||||
if err := middleware.Func(input, data, me.Tx); err != nil {
|
||||
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(me.Event, nil, "complete")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []updateMw, input *e.UpdateDto) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, nil)
|
||||
|
||||
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||
|
||||
if err := middleware.Func(input); err != nil {
|
||||
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(me.Event, nil, "complete")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []deleteMw, input *e.DeleteDto) error {
|
||||
if !me.SyncOn {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, nil)
|
||||
|
||||
pl.SetLogInfo(me.Event, logData, "started", middleware.Name)
|
||||
|
||||
if err := middleware.Func(input); err != nil {
|
||||
return pu.HandleMiddlewareError(me.Event, string(me.MwType), middleware.Name, logData, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(me.Event, nil, "complete")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) setMwType(mwType pu.MWType) {
|
||||
me.MwType = mwType
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
package unit
|
||||
|
||||
import (
|
||||
plugin "simrs-vx/internal/use-case/simgos-sync-plugin/new/unit"
|
||||
)
|
||||
|
||||
// example of middleware
|
||||
func init() {
|
||||
createPreMw = append(createPreMw,
|
||||
createMw{Name: "sync-create-unit", Func: plugin.Create})
|
||||
|
||||
createSimxLogMw = append(createSimxLogMw,
|
||||
createLogMw{Name: "create-sync-log", Func: plugin.CreateLog})
|
||||
|
||||
updatePreMw = append(updatePreMw,
|
||||
updateMw{Name: "sync-update-unit", Func: plugin.Update})
|
||||
|
||||
deletePreMw = append(deletePreMw,
|
||||
deleteMw{Name: "sync-delete-unit", Func: plugin.Delete})
|
||||
}
|
||||
@@ -1,61 +0,0 @@
|
||||
/*
|
||||
DESCRIPTION:
|
||||
A sample, part of the package that contains type, constants, and/or variables.
|
||||
|
||||
In this sample it also provides type and variable regarding the needs of the
|
||||
middleware to separate from main use-case which has the basic CRUD
|
||||
functionality. The purpose of this is to make the code more maintainable.
|
||||
*/
|
||||
package unit
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
elog "simrs-vx/internal/domain/sync-entities/log"
|
||||
)
|
||||
|
||||
type createMw struct {
|
||||
Name string
|
||||
Func func(input *e.CreateDto) error
|
||||
}
|
||||
|
||||
type createLogMw struct {
|
||||
Name string
|
||||
Func func(input *elog.SimxLogDto) error
|
||||
}
|
||||
|
||||
type updateMw struct {
|
||||
Name string
|
||||
Func func(input *e.UpdateDto) error
|
||||
}
|
||||
|
||||
type deleteMw struct {
|
||||
Name string
|
||||
Func func(input *e.DeleteDto) error
|
||||
}
|
||||
|
||||
type readListMw struct {
|
||||
Name string
|
||||
Func func(input *e.ReadListDto, data *e.Unit, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type readDetailMw struct {
|
||||
Name string
|
||||
Func func(input *e.ReadDetailDto, data *e.Unit, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type UpdateMw = updateMw
|
||||
type DeleteMw = deleteMw
|
||||
|
||||
var createPreMw []createMw // preprocess middleware
|
||||
var createPostMw []createMw // postprocess middleware
|
||||
var createSimxLogMw []createLogMw
|
||||
var readListPreMw []readListMw // ..
|
||||
var readListPostMw []readListMw // ..
|
||||
var readDetailPreMw []readDetailMw
|
||||
var readDetailPostMw []readDetailMw
|
||||
var updatePreMw []updateMw
|
||||
var updatePostMw []readDetailMw
|
||||
var deletePreMw []deleteMw
|
||||
var deletePostMw []readDetailMw
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
en "simrs-vx/internal/domain/main-entities/nurse"
|
||||
et "simrs-vx/internal/domain/main-entities/nutritionist"
|
||||
ep "simrs-vx/internal/domain/main-entities/pharmacist"
|
||||
er "simrs-vx/internal/domain/main-entities/registrator"
|
||||
esi "simrs-vx/internal/domain/main-entities/specialist-intern"
|
||||
e "simrs-vx/internal/domain/main-entities/user"
|
||||
|
||||
@@ -26,6 +27,7 @@ import (
|
||||
upa "simrs-vx/internal/use-case/main-use-case/person-address"
|
||||
upc "simrs-vx/internal/use-case/main-use-case/person-contact"
|
||||
up "simrs-vx/internal/use-case/main-use-case/pharmacist"
|
||||
ur "simrs-vx/internal/use-case/main-use-case/registrator"
|
||||
usi "simrs-vx/internal/use-case/main-use-case/specialist-intern"
|
||||
|
||||
erc "simrs-vx/internal/domain/references/common"
|
||||
@@ -112,7 +114,6 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
Employee_Id: &employeeData.Id,
|
||||
IHS_Number: input.IHS_Number,
|
||||
SIP_Number: input.SIP_Number,
|
||||
Unit_Code: input.Unit_Code,
|
||||
Specialist_Code: input.Specialist_Code,
|
||||
Subspecialist_Code: input.Subspecialist_Code,
|
||||
}
|
||||
@@ -121,11 +122,11 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
}
|
||||
case ero.EPCNur:
|
||||
createNurse := en.CreateDto{
|
||||
Code: input.Code,
|
||||
Employee_Id: &employeeData.Id,
|
||||
IHS_Number: input.IHS_Number,
|
||||
Unit_Code: input.Unit_Code,
|
||||
Infra_Code: input.Infra_Code,
|
||||
Code: input.Code,
|
||||
Employee_Id: &employeeData.Id,
|
||||
IHS_Number: input.IHS_Number,
|
||||
Specialist_Code: input.Specialist_Code,
|
||||
Infra_Code: input.Infra_Code,
|
||||
}
|
||||
if _, err := un.CreateData(createNurse, &event, tx); err != nil {
|
||||
return err
|
||||
@@ -167,7 +168,18 @@ func Create(input e.CreateDto) (*d.Data, error) {
|
||||
return err
|
||||
}
|
||||
case ero.EPCReg, ero.EPCScr:
|
||||
// do nothing
|
||||
var instalationCode string
|
||||
if input.Installation_Code != nil {
|
||||
instalationCode = *input.Installation_Code
|
||||
}
|
||||
|
||||
createSub := er.CreateDto{
|
||||
Employee_Id: employeeData.Id,
|
||||
Installation_Code: instalationCode,
|
||||
}
|
||||
if _, err := ur.CreateData(createSub, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
default:
|
||||
return errors.New("invalid employee position")
|
||||
}
|
||||
@@ -423,11 +435,11 @@ func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
return err
|
||||
}
|
||||
createNur := en.CreateDto{
|
||||
Code: input.Code,
|
||||
Employee_Id: &employeeData.Id,
|
||||
IHS_Number: input.IHS_Number,
|
||||
Unit_Code: input.Unit_Code,
|
||||
Infra_Code: input.Infra_Code,
|
||||
Code: input.Code,
|
||||
Employee_Id: &employeeData.Id,
|
||||
IHS_Number: input.IHS_Number,
|
||||
Specialist_Code: input.Specialist_Code,
|
||||
Infra_Code: input.Infra_Code,
|
||||
}
|
||||
if readNurData != nil {
|
||||
if err := un.UpdateData(en.UpdateDto{CreateDto: createNur}, readNurData, &event, tx); err != nil {
|
||||
|
||||
Reference in New Issue
Block a user