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:
@@ -0,0 +1,125 @@
|
||||
package vclaimsepcontrolletter
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
|
||||
|
||||
ibpjs "simrs-vx/internal/infra/bpjs"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CreateSepControlLetter(input *e.CreateDto, data *e.VclaimSepControlLetter, tx *gorm.DB) error {
|
||||
payload, err := input.RequestPayloadIntoJson()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req, err := http.NewRequest("POST", ibpjs.O.BaseUrl+"RencanaKontrol", bytes.NewBuffer(payload))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
body, err := io.ReadAll(resp.Body)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var vresp Response
|
||||
if err := json.Unmarshal(body, &vresp); err != nil {
|
||||
return fmt.Errorf("failed to parse response JSON: %w", err)
|
||||
}
|
||||
|
||||
if vresp.MetaData.Code != "200" {
|
||||
return fmt.Errorf("failed to create sep control letter: %s", vresp.MetaData.Message)
|
||||
}
|
||||
|
||||
pdfNeeds, err := vresp.ToPDFNeeds()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
tmp := string(pdfNeeds)
|
||||
input.Value = &tmp
|
||||
input.Number = &vresp.Response.NoSuratKontrol
|
||||
input.VclaimSep_Number = &vresp.Response.Sep.NoSep
|
||||
return nil
|
||||
}
|
||||
|
||||
// func ReadDetailSep(input *e.ReadDetailDto, data *e.VclaimSep, tx *gorm.DB) error {
|
||||
// endpoint := fmt.Sprintf("sep/%s", input.Number)
|
||||
// req, err := http.NewRequest("GET", ibpjs.O.BaseUrl+endpoint, nil)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// resp, err := http.DefaultClient.Do(req)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// defer resp.Body.Close()
|
||||
|
||||
// body, err := io.ReadAll(resp.Body)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// var detail e.SepResponse
|
||||
// if err := json.Unmarshal(body, &detail); err != nil {
|
||||
// return fmt.Errorf("failed to parse response JSON: %w", err)
|
||||
// }
|
||||
|
||||
// data.Detail = detail.Response
|
||||
|
||||
// return nil
|
||||
// }
|
||||
|
||||
// func DeleteSep(input *e.DeleteDto, data *e.VclaimSep, tx *gorm.DB) error {
|
||||
// payload := e.SepDeleteRequest{}
|
||||
// payload.Request.TSep.NoSep = *input.Number
|
||||
// payload.Request.TSep.User = "Coba Ws"
|
||||
|
||||
// jsonPayload, err := json.Marshal(payload)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// req, err := http.NewRequest("DELETE", ibpjs.O.BaseUrl+"sep", bytes.NewBuffer(jsonPayload))
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// req.Header.Set("Content-Type", "application/json")
|
||||
|
||||
// resp, err := http.DefaultClient.Do(req)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
// defer resp.Body.Close()
|
||||
|
||||
// body, err := io.ReadAll(resp.Body)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// var detail e.SepResponse
|
||||
// if err := json.Unmarshal(body, &detail); err != nil {
|
||||
// return fmt.Errorf("failed to parse response JSON: %w", err)
|
||||
// }
|
||||
|
||||
// if detail.MetaData.Message == SepNotFound {
|
||||
// return fmt.Errorf("sep with number %s not found", *data.Number)
|
||||
// }
|
||||
|
||||
// return nil
|
||||
// }
|
||||
@@ -0,0 +1,87 @@
|
||||
package vclaimsepcontrolletter
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
|
||||
e "simrs-vx/internal/domain/bpjs-entities/vclaim-sep-control-letter"
|
||||
)
|
||||
|
||||
type SuratKontrol struct {
|
||||
NoSuratKontrol string `json:"noSuratKontrol"`
|
||||
TglRencanaKontrol string `json:"tglRencanaKontrol"`
|
||||
TglTerbit string `json:"tglTerbit"`
|
||||
JnsKontrol string `json:"jnsKontrol"`
|
||||
PoliTujuan string `json:"poliTujuan"`
|
||||
NamaPoliTujuan string `json:"namaPoliTujuan"`
|
||||
KodeDokter string `json:"kodeDokter"`
|
||||
NamaDokter string `json:"namaDokter"`
|
||||
FlagKontrol string `json:"flagKontrol"`
|
||||
KodeDokterPembuat *string `json:"kodeDokterPembuat"`
|
||||
NamaDokterPembuat *string `json:"namaDokterPembuat"`
|
||||
NamaJnsKontrol string `json:"namaJnsKontrol"`
|
||||
Sep Sep `json:"sep"`
|
||||
}
|
||||
|
||||
type Sep struct {
|
||||
NoSep string `json:"noSep"`
|
||||
TglSep string `json:"tglSep"`
|
||||
JnsPelayanan string `json:"jnsPelayanan"`
|
||||
Poli string `json:"poli"`
|
||||
Diagnosa string `json:"diagnosa"`
|
||||
Peserta Peserta `json:"peserta"`
|
||||
ProvUmum ProvUmum `json:"provUmum"`
|
||||
ProvPerujuk ProvPerujuk `json:"provPerujuk"`
|
||||
}
|
||||
|
||||
type Peserta struct {
|
||||
NoKartu string `json:"noKartu"`
|
||||
Nama string `json:"nama"`
|
||||
TglLahir string `json:"tglLahir"`
|
||||
Kelamin string `json:"kelamin"`
|
||||
HakKelas string `json:"hakKelas"`
|
||||
}
|
||||
|
||||
type ProvUmum struct {
|
||||
KdProvider string `json:"kdProvider"`
|
||||
NmProvider string `json:"nmProvider"`
|
||||
}
|
||||
|
||||
type ProvPerujuk struct {
|
||||
KdProviderPerujuk string `json:"kdProviderPerujuk"`
|
||||
NmProviderPerujuk string `json:"nmProviderPerujuk"`
|
||||
AsalRujukan string `json:"asalRujukan"`
|
||||
NoRujukan string `json:"noRujukan"`
|
||||
TglRujukan string `json:"tglRujukan"`
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
MetaData MetaData `json:"metaData"`
|
||||
Response *SuratKontrol `json:"response"` // nullable
|
||||
}
|
||||
|
||||
type MetaData struct {
|
||||
Code string `json:"code"`
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
func (r Response) ToPDFNeeds() ([]byte, error) {
|
||||
response := e.ResponseForPDF{
|
||||
Number: r.Response.Sep.NoSep,
|
||||
PlannedControlDate: r.Response.TglRencanaKontrol,
|
||||
IssuedDate: r.Response.TglTerbit,
|
||||
Doctor_Name: r.Response.NamaDokter,
|
||||
DstUnit_Name: r.Response.NamaPoliTujuan,
|
||||
ResponsibleDoctor_Name: *r.Response.NamaDokterPembuat,
|
||||
VclaimSep: e.VclaimSep{
|
||||
VclaimMember: e.VclaimMember{
|
||||
CardNumber: r.Response.Sep.Peserta.NoKartu,
|
||||
Name: r.Response.Sep.Peserta.Nama,
|
||||
BirthDate: r.Response.Sep.Peserta.TglLahir,
|
||||
Gender: r.Response.Sep.Peserta.Kelamin,
|
||||
},
|
||||
Diagnose: r.Response.Sep.Diagnosa,
|
||||
Number: r.Response.Sep.NoSep,
|
||||
},
|
||||
}
|
||||
return json.Marshal(response)
|
||||
}
|
||||
@@ -20,5 +20,5 @@ func setData[T *e.CreateDto | *e.UpdateDto](input T, data *e.VclaimSepControlLet
|
||||
data.VclaimSep_Number = inputSrc.VclaimSep_Number
|
||||
data.Number = inputSrc.Number
|
||||
data.Value = inputSrc.Value
|
||||
data.FileUrl = inputSrc.FileUrl
|
||||
// data.FileUrl = inputSrc.FileUrl
|
||||
}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package vclaimsepcontrolletter
|
||||
|
||||
import (
|
||||
pvscl "simrs-vx/internal/use-case/bpjs-plugin/vclaim-sep-control-letter"
|
||||
)
|
||||
|
||||
// example of middleware
|
||||
// func init() {
|
||||
// createPreMw = append(createPreMw,
|
||||
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
|
||||
// CreateMw{Name: "check-data", Func: pm.CheckData},
|
||||
// )
|
||||
// }
|
||||
func init() {
|
||||
createPreMw = append(createPreMw,
|
||||
createMw{Name: "create-sep-control-letter", Func: pvscl.CreateSepControlLetter},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -246,7 +246,7 @@ func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
}
|
||||
|
||||
func Delete(input e.DeleteDto) (*d.Data, error) {
|
||||
rdDto := e.ReadDetailDto{Id: input.Id}
|
||||
rdDto := e.ReadDetailDto{Number: input.Number}
|
||||
var data *e.VclaimSep
|
||||
var err error
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -1,103 +0,0 @@
|
||||
package actionreport
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/action-report"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type middlewareRunner struct {
|
||||
Event *pl.Event
|
||||
Tx *gorm.DB
|
||||
MwType pu.MWType
|
||||
}
|
||||
|
||||
// NewMiddlewareExecutor creates a new middleware executor
|
||||
func newMiddlewareRunner(event *pl.Event, tx *gorm.DB) *middlewareRunner {
|
||||
return &middlewareRunner{
|
||||
Event: event,
|
||||
Tx: tx,
|
||||
}
|
||||
}
|
||||
|
||||
// ExecuteCreateMiddleware executes create middleware
|
||||
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.ActionReport) error {
|
||||
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) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.ActionReport) error {
|
||||
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.ActionReport) error {
|
||||
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 []readDetailMw, input *e.ReadDetailDto, data *e.ActionReport) error {
|
||||
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) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.ActionReport) error {
|
||||
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) setMwType(mwType pu.MWType) {
|
||||
me.MwType = mwType
|
||||
}
|
||||
@@ -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 actionreport
|
||||
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 actionreport
|
||||
package procedurereport
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/action-report"
|
||||
e "simrs-vx/internal/domain/main-entities/procedure-report"
|
||||
)
|
||||
|
||||
type createMw struct {
|
||||
Name string
|
||||
Func func(input *e.CreateDto, data *e.ActionReport, 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.ActionReport, 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.ActionReport, 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
-8
@@ -1,12 +1,11 @@
|
||||
package unit
|
||||
package registrator
|
||||
|
||||
import (
|
||||
e "simrs-vx/internal/domain/main-entities/registrator"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
)
|
||||
|
||||
type middlewareRunner struct {
|
||||
@@ -24,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.Unit) error {
|
||||
func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e.CreateDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -39,7 +38,7 @@ func (me *middlewareRunner) RunCreateMiddleware(middlewares []createMw, input *e
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Unit) error {
|
||||
func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, input *e.ReadListDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -54,7 +53,7 @@ func (me *middlewareRunner) RunReadListMiddleware(middlewares []readListMw, inpu
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Unit) error {
|
||||
func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -69,7 +68,7 @@ func (me *middlewareRunner) RunReadDetailMiddleware(middlewares []readDetailMw,
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Unit) error {
|
||||
func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Registrator) error {
|
||||
for _, middleware := range middlewares {
|
||||
logData := pu.GetLogData(input, data)
|
||||
|
||||
@@ -84,7 +83,7 @@ func (me *middlewareRunner) RunUpdateMiddleware(middlewares []readDetailMw, inpu
|
||||
return nil
|
||||
}
|
||||
|
||||
func (me *middlewareRunner) RunDeleteMiddleware(middlewares []readDetailMw, input *e.ReadDetailDto, data *e.Unit) 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 unit
|
||||
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 unit
|
||||
package registrator
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
e "simrs-vx/internal/domain/main-entities/registrator"
|
||||
)
|
||||
|
||||
type createMw struct {
|
||||
Name string
|
||||
Func func(input *e.CreateDto, data *e.Unit, 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.Unit, 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.Unit, 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,9 +0,0 @@
|
||||
package unit_position
|
||||
|
||||
// example of middleware
|
||||
// func init() {
|
||||
// createPreMw = append(createPreMw,
|
||||
// CreateMw{Name: "modif-input", Func: pm.ModifInput},
|
||||
// CreateMw{Name: "check-data", Func: pm.CheckData},
|
||||
// )
|
||||
// }
|
||||
@@ -1,44 +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_position
|
||||
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit-position"
|
||||
)
|
||||
|
||||
type createMw struct {
|
||||
Name string
|
||||
Func func(input *e.CreateDto, data *e.UnitPosition, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type readListMw struct {
|
||||
Name string
|
||||
Func func(input *e.ReadListDto, data *e.UnitPosition, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type readDetailMw struct {
|
||||
Name string
|
||||
Func func(input *e.ReadDetailDto, data *e.UnitPosition, tx *gorm.DB) error
|
||||
}
|
||||
|
||||
type UpdateMw = readDetailMw
|
||||
type DeleteMw = readDetailMw
|
||||
|
||||
var createPreMw []createMw // preprocess middleware
|
||||
var createPostMw []createMw // postprocess middleware
|
||||
var readListPreMw []readListMw // ..
|
||||
var readListPostMw []readListMw // ..
|
||||
var readDetailPreMw []readDetailMw
|
||||
var readDetailPostMw []readDetailMw
|
||||
var updatePreMw []readDetailMw
|
||||
var updatePostMw []readDetailMw
|
||||
var deletePreMw []readDetailMw
|
||||
var deletePostMw []readDetailMw
|
||||
@@ -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 {
|
||||
|
||||
@@ -49,19 +49,19 @@ func UpdateStatus(input *e.Encounter) error {
|
||||
return helper.DoJsonRequest(input, "PATCH", endpoint)
|
||||
}
|
||||
|
||||
func RequestSwitchUnit(input *e.Encounter) error {
|
||||
func RequestSwitchSpecialist(input *e.Encounter) error {
|
||||
prefixEndpoint := getPrefixEndpoint()
|
||||
endpoint := fmt.Sprintf("%s/%v/req-switch-unit", prefixEndpoint, input.Id)
|
||||
return helper.DoJsonRequest(input, "PATCH", endpoint)
|
||||
}
|
||||
|
||||
func ApproveSwitchUnit(input *e.ApproveCancelUnitDto) error {
|
||||
func ApproveSwitchSpecialist(input *e.ApproveCancelSpecialistDto) error {
|
||||
prefixEndpoint := getPrefixEndpoint()
|
||||
endpoint := fmt.Sprintf("%s/%v/approve-switch-unit", prefixEndpoint, input.Id)
|
||||
return helper.DoJsonRequest(input, "PATCH", endpoint)
|
||||
}
|
||||
|
||||
func CancelSwitchUnit(input *e.ApproveCancelUnitDto) error {
|
||||
func CancelSwitchSpecialist(input *e.ApproveCancelSpecialistDto) error {
|
||||
prefixEndpoint := getPrefixEndpoint()
|
||||
endpoint := fmt.Sprintf("%s/%v/cancel-switch-unit", prefixEndpoint, input.Id)
|
||||
return helper.DoJsonRequest(input, "PATCH", endpoint)
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
package unit
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
helper "simrs-vx/internal/use-case/simgos-sync-plugin/new"
|
||||
|
||||
sync "simrs-vx/internal/infra/sync-consumer-cfg"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
elog "simrs-vx/internal/domain/sync-entities/log"
|
||||
)
|
||||
|
||||
func Create(input *e.CreateDto) error {
|
||||
return helper.DoJsonRequest(input, "POST", getPrefixEndpoint())
|
||||
}
|
||||
|
||||
func CreateLog(input *elog.SimxLogDto) error {
|
||||
prefixEndpoint := getPrefixEndpoint()
|
||||
endpoint := prefixEndpoint + "/log"
|
||||
return helper.DoJsonRequest(input, "POST", endpoint)
|
||||
}
|
||||
|
||||
func Update(input *e.UpdateDto) error {
|
||||
prefixEndpoint := getPrefixEndpoint()
|
||||
endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id)
|
||||
return helper.DoJsonRequest(input, "PATCH", endpoint)
|
||||
}
|
||||
|
||||
func Delete(input *e.DeleteDto) error {
|
||||
prefixEndpoint := getPrefixEndpoint()
|
||||
endpoint := fmt.Sprintf("%s/%v", prefixEndpoint, *input.Id)
|
||||
return helper.DoJsonRequest(input, "DELETE", endpoint)
|
||||
}
|
||||
|
||||
func getPrefixEndpoint() string {
|
||||
return fmt.Sprintf("%s%s/v1/unit", sync.O.TargetHost, sync.O.Prefix)
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
package doctor
|
||||
|
||||
import (
|
||||
pl "simrs-vx/pkg/logger"
|
||||
|
||||
d "github.com/karincake/dodol"
|
||||
"gorm.io/gorm"
|
||||
|
||||
db "simrs-vx/pkg/dualtrx-helper"
|
||||
|
||||
elog "simrs-vx/internal/domain/sync-entities/log"
|
||||
)
|
||||
|
||||
const source = "doctor"
|
||||
|
||||
func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) {
|
||||
event := pl.Event{
|
||||
Feature: "Create",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "create")
|
||||
|
||||
tx := db.NewTx()
|
||||
err := tx.Sync.Transaction(func(tx *gorm.DB) error {
|
||||
// Insert to Log
|
||||
if err := CreateLogData(input, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.II{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "created",
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
DESCRIPTION:
|
||||
Any functions that are used internally by the use-case
|
||||
*/
|
||||
package doctor
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
erc "simrs-vx/internal/domain/references/common"
|
||||
|
||||
esync "simrs-vx/internal/domain/sync-entities/doctor"
|
||||
esyncLog "simrs-vx/internal/domain/sync-entities/log"
|
||||
)
|
||||
|
||||
func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.DoctorSimxLog) {
|
||||
// encode to JSON
|
||||
jsonData, _ := json.MarshalIndent(input.Payload, "", " ")
|
||||
jsonString := string(jsonData)
|
||||
|
||||
var status erc.ProcessStatusCode
|
||||
if input.IsSuccess {
|
||||
status = erc.PSCSuccess
|
||||
} else {
|
||||
status = erc.PSCFailed
|
||||
if input.ErrMessage != nil {
|
||||
data.ErrMessage = input.ErrMessage
|
||||
}
|
||||
}
|
||||
|
||||
data.Value = &jsonString
|
||||
data.Date = &now
|
||||
data.Status = status
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func setDataSimxLink(simxId, simgosId uint) (data esync.DoctorLink) {
|
||||
data.Simx_Id = simxId
|
||||
data.Simgos_Id = simgosId
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package doctor
|
||||
|
||||
import (
|
||||
plh "simrs-vx/pkg/lib-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
"time"
|
||||
|
||||
dg "github.com/karincake/apem/db-gorm-pg"
|
||||
"gorm.io/gorm"
|
||||
|
||||
esync "simrs-vx/internal/domain/sync-entities/doctor"
|
||||
esynclog "simrs-vx/internal/domain/sync-entities/log"
|
||||
)
|
||||
|
||||
var now = time.Now()
|
||||
|
||||
func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.DoctorLink, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
data := setDataSimxLink(simxId, simgosId)
|
||||
|
||||
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(data, event, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
data := setDataSimxLog(&input)
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
if err := tx.Create(&data).Error; err != nil {
|
||||
return plh.HandleCreateError(input, event, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return nil
|
||||
}
|
||||
@@ -368,18 +368,18 @@ func UpdateStatus(input e.Encounter) (*d.Data, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func RequestSwitchUnit(input e.Encounter) (*d.Data, error) {
|
||||
func RequestSwitchSpecialist(input e.Encounter) (*d.Data, error) {
|
||||
var (
|
||||
syncLinkInternal *[]syncir.InternalReferenceLink
|
||||
)
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "RequestSwitchUnit",
|
||||
Feature: "RequestSwitchSpecialist",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "request-switch-unit")
|
||||
pl.SetLogInfo(&event, input, "started", "request-switch-specialist")
|
||||
|
||||
// STEP 1: Get Link
|
||||
syncLink, err := ReadDetailLinkData(input.Id, &event)
|
||||
@@ -431,14 +431,14 @@ func RequestSwitchUnit(input e.Encounter) (*d.Data, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) {
|
||||
event := pl.Event{
|
||||
Feature: "ApproveSwitchUnit",
|
||||
Feature: "ApproveSwitchSpecialist",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "approve-switch-unit")
|
||||
pl.SetLogInfo(&event, input, "started", "approve-switch-specialist")
|
||||
|
||||
// STEP 1: Get InternalReference Link
|
||||
syncLink, err := utph.ReadDetailLinkData(input.InternalReferences_Id, &event)
|
||||
@@ -478,14 +478,14 @@ func ApproveSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
func CancelSwitchUnit(input e.ApproveCancelUnitDto) (*d.Data, error) {
|
||||
func CancelSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) {
|
||||
event := pl.Event{
|
||||
Feature: "CancelSwitchUnit",
|
||||
Feature: "CancelSwitchSpecialist",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "cancel-switch-unit")
|
||||
pl.SetLogInfo(&event, input, "started", "cancel-switch-specialist")
|
||||
|
||||
// STEP 1: Get InternalReference Link
|
||||
syncLink, err := utph.ReadDetailLinkData(input.InternalReferences_Id, &event)
|
||||
|
||||
@@ -77,8 +77,8 @@ func setDataTPendaftaran(input *e.Encounter, data *etp.TPendaftaran) {
|
||||
data.Tglreg = input.RegisteredAt
|
||||
|
||||
// set kdpoly
|
||||
if p := input.Unit_Code; p != nil {
|
||||
kdpoly, _ := strconv.Atoi(*input.Unit_Code)
|
||||
if p := input.Specialist_Code; p != nil {
|
||||
kdpoly, _ := strconv.Atoi(*input.Specialist_Code)
|
||||
data.Kdpoly = uint(kdpoly)
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ func setCreateDataSimgos(input e.Encounter, data *etp.TPendaftaran) (hist []etph
|
||||
for i, ref := range *enc {
|
||||
hist = append(hist, etph.TPemeriksaanHist{
|
||||
Idxdaftar: &data.Idxdaftar,
|
||||
Kdpoly: stringtouint(*ref.Unit_Code),
|
||||
Kdpoly: stringtouint(*ref.Specialist_Code),
|
||||
DokterPengonsul: stringtouint(*ref.SrcDoctor_Code),
|
||||
DokterPenerima: stringtouint(*ref.Doctor_Code),
|
||||
})
|
||||
@@ -46,7 +46,7 @@ func setCreateDataSimgos(input e.Encounter, data *etp.TPendaftaran) (hist []etph
|
||||
return
|
||||
}
|
||||
|
||||
func setUpdateApproveDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist) {
|
||||
func setUpdateApproveDataSimgos(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist) {
|
||||
data.DokterPenerima = stringtouint(*input.Dst_Doctor_Code)
|
||||
data.StartKonsul = &now
|
||||
data.UserPenerima = &input.User_Name
|
||||
@@ -54,7 +54,7 @@ func setUpdateApproveDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeri
|
||||
return
|
||||
}
|
||||
|
||||
func setUpdateCancelDataSimgos(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist) {
|
||||
func setUpdateCancelDataSimgos(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist) {
|
||||
data.UserBatal = &input.User_Name
|
||||
data.TglBatal = &now
|
||||
|
||||
|
||||
@@ -61,7 +61,7 @@ func ReadDetailSimgosData(simgosId uint, event *pl.Event) (*etph.TPemeriksaanHis
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func UpdateSimgosData(input e.ApproveCancelUnitDto, data *etph.TPemeriksaanHist, method string, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
func UpdateSimgosData(input e.ApproveCancelSpecialistDto, data *etph.TPemeriksaanHist, method string, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, input, "started", "DBUpdate")
|
||||
|
||||
switch method {
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package nurse
|
||||
|
||||
import (
|
||||
pl "simrs-vx/pkg/logger"
|
||||
|
||||
d "github.com/karincake/dodol"
|
||||
"gorm.io/gorm"
|
||||
|
||||
db "simrs-vx/pkg/dualtrx-helper"
|
||||
|
||||
elog "simrs-vx/internal/domain/sync-entities/log"
|
||||
)
|
||||
|
||||
const source = "nurse"
|
||||
|
||||
func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) {
|
||||
event := pl.Event{
|
||||
Feature: "Create",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "create")
|
||||
|
||||
tx := db.NewTx()
|
||||
err := tx.Sync.Transaction(func(tx *gorm.DB) error {
|
||||
// Insert to Log
|
||||
if err := CreateLogData(input, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.II{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "created",
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
/*
|
||||
DESCRIPTION:
|
||||
Any functions that are used internally by the use-case
|
||||
*/
|
||||
package nurse
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
erc "simrs-vx/internal/domain/references/common"
|
||||
|
||||
esyncLog "simrs-vx/internal/domain/sync-entities/log"
|
||||
esync "simrs-vx/internal/domain/sync-entities/nurse"
|
||||
)
|
||||
|
||||
func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.NurseSimxLog) {
|
||||
// encode to JSON
|
||||
jsonData, _ := json.MarshalIndent(input.Payload, "", " ")
|
||||
jsonString := string(jsonData)
|
||||
|
||||
var status erc.ProcessStatusCode
|
||||
if input.IsSuccess {
|
||||
status = erc.PSCSuccess
|
||||
} else {
|
||||
status = erc.PSCFailed
|
||||
if input.ErrMessage != nil {
|
||||
data.ErrMessage = input.ErrMessage
|
||||
}
|
||||
}
|
||||
|
||||
data.Value = &jsonString
|
||||
data.Date = &now
|
||||
data.Status = status
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func setDataSimxLink(simxId, simgosId uint) (data esync.NurseLink) {
|
||||
data.Simx_Id = simxId
|
||||
data.Simgos_Id = simgosId
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package nurse
|
||||
|
||||
import (
|
||||
plh "simrs-vx/pkg/lib-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
"time"
|
||||
|
||||
dg "github.com/karincake/apem/db-gorm-pg"
|
||||
"gorm.io/gorm"
|
||||
|
||||
esynclog "simrs-vx/internal/domain/sync-entities/log"
|
||||
esync "simrs-vx/internal/domain/sync-entities/nurse"
|
||||
)
|
||||
|
||||
var now = time.Now()
|
||||
|
||||
func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.NurseLink, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
data := setDataSimxLink(simxId, simgosId)
|
||||
|
||||
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(data, event, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
data := setDataSimxLog(&input)
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
if err := tx.Create(&data).Error; err != nil {
|
||||
return plh.HandleCreateError(input, event, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return nil
|
||||
}
|
||||
@@ -1,198 +0,0 @@
|
||||
package unit
|
||||
|
||||
import (
|
||||
pl "simrs-vx/pkg/logger"
|
||||
|
||||
d "github.com/karincake/dodol"
|
||||
"gorm.io/gorm"
|
||||
|
||||
db "simrs-vx/pkg/dualtrx-helper"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
esimgos "simrs-vx/internal/domain/simgos-entities/m-poly"
|
||||
elog "simrs-vx/internal/domain/sync-entities/log"
|
||||
esync "simrs-vx/internal/domain/sync-entities/unit"
|
||||
)
|
||||
|
||||
const source = "unit"
|
||||
|
||||
func Create(input e.CreateDto) (*d.Data, error) {
|
||||
var (
|
||||
sgData *esimgos.MPoly
|
||||
syncLink *esync.UnitLink
|
||||
err error
|
||||
)
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "Create",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "create")
|
||||
|
||||
err = db.WithDualTx(func(tx *db.Dualtx) error {
|
||||
// STEP 1: Insert to simgos
|
||||
sgData, err = CreateSimgosData(input, &event, tx.Simgos)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// STEP 2: Insert to Link
|
||||
syncLink, err = CreateLinkData(*input.Id, sgData.Kode, &event, tx.Sync)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
if syncLink != nil {
|
||||
go func() { _ = DeleteLinkData(syncLink, &event) }()
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.II{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "created",
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func CreateSimxLog(input elog.SimxLogDto) (*d.Data, error) {
|
||||
event := pl.Event{
|
||||
Feature: "Create",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "create")
|
||||
|
||||
tx := db.NewTx()
|
||||
err := tx.Sync.Transaction(func(tx *gorm.DB) error {
|
||||
// Insert to Log
|
||||
if err := CreateLogData(input, &event, tx); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.II{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "created",
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func Update(input e.UpdateDto) (*d.Data, error) {
|
||||
event := pl.Event{
|
||||
Feature: "Update",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "update")
|
||||
|
||||
// STEP 1: Get Installation Link
|
||||
syncLink, err := ReadDetailLinkData(*input.Id, &event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
tx := db.NewTx()
|
||||
err = tx.Simgos.Transaction(func(tx *gorm.DB) error {
|
||||
// Step 2: Update Simgos
|
||||
err = UpdateSimgosData(input, syncLink, &event, tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.IS{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "updated",
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func Delete(input e.DeleteDto) (*d.Data, error) {
|
||||
var isLinkDeleted bool
|
||||
|
||||
event := pl.Event{
|
||||
Feature: "Delete",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "delete")
|
||||
|
||||
// STEP 1: Get Installation Link
|
||||
syncLink, err := ReadDetailLinkData(*input.Id, &event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// STEP 2: Get Simgos
|
||||
sgData, err := ReadDetailSimgosData(uint16(syncLink.Simgos_Id), &event)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
err = db.WithDualTx(func(tx *db.Dualtx) error {
|
||||
// STEP 3: Delete M_Poly Simgos
|
||||
err = HardDeleteSimgosData(sgData, &event, tx.Simgos)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// STEP 4: Delete Installation Link
|
||||
err = DeleteLinkData(syncLink, &event, tx.Sync)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
isLinkDeleted = true
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
if isLinkDeleted {
|
||||
go func() {
|
||||
_, _ = CreateLinkData(uint(*input.Id), sgData.Kode, &event)
|
||||
}()
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.IS{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "deleted",
|
||||
},
|
||||
}, nil
|
||||
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
/*
|
||||
DESCRIPTION:
|
||||
Any functions that are used internally by the use-case
|
||||
*/
|
||||
package unit
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
erc "simrs-vx/internal/domain/references/common"
|
||||
"strconv"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
|
||||
esimgos "simrs-vx/internal/domain/simgos-entities/m-poly"
|
||||
esyncLog "simrs-vx/internal/domain/sync-entities/log"
|
||||
esync "simrs-vx/internal/domain/sync-entities/unit"
|
||||
)
|
||||
|
||||
func setDataSimgos[T *e.CreateDto | *e.UpdateDto](input T) (data esimgos.MPoly) {
|
||||
var inputSrc *e.CreateDto
|
||||
if inputT, ok := any(input).(*e.CreateDto); ok {
|
||||
inputSrc = inputT
|
||||
} else {
|
||||
inputTemp := any(input).(*e.UpdateDto)
|
||||
inputSrc = &inputTemp.CreateDto
|
||||
}
|
||||
|
||||
data.Nama = inputSrc.Name
|
||||
data.Jenispoly = 0
|
||||
|
||||
kodePoly, _ := strconv.Atoi(inputSrc.Code)
|
||||
data.Kode = uint(kodePoly)
|
||||
return
|
||||
}
|
||||
|
||||
func setDataSimxLog(input *esyncLog.SimxLogDto) (data esync.UnitSimxLog) {
|
||||
// encode to JSON
|
||||
jsonData, _ := json.MarshalIndent(input.Payload, "", " ")
|
||||
jsonString := string(jsonData)
|
||||
|
||||
var status erc.ProcessStatusCode
|
||||
if input.IsSuccess {
|
||||
status = erc.PSCSuccess
|
||||
} else {
|
||||
status = erc.PSCFailed
|
||||
if input.ErrMessage != nil {
|
||||
data.ErrMessage = input.ErrMessage
|
||||
}
|
||||
}
|
||||
|
||||
data.Value = &jsonString
|
||||
data.Date = &now
|
||||
data.Status = status
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func setDataSimxLink(simxId, simgosId uint) (data esync.UnitLink) {
|
||||
data.Simx_Id = simxId
|
||||
data.Simgos_Id = simgosId
|
||||
return
|
||||
}
|
||||
@@ -1,188 +0,0 @@
|
||||
package unit
|
||||
|
||||
import (
|
||||
plh "simrs-vx/pkg/lib-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
pu "simrs-vx/pkg/use-case-helper"
|
||||
"time"
|
||||
|
||||
dg "github.com/karincake/apem/db-gorm-pg"
|
||||
"gorm.io/gorm"
|
||||
|
||||
e "simrs-vx/internal/domain/main-entities/unit"
|
||||
esimgos "simrs-vx/internal/domain/simgos-entities/m-poly"
|
||||
esynclog "simrs-vx/internal/domain/sync-entities/log"
|
||||
esync "simrs-vx/internal/domain/sync-entities/unit"
|
||||
)
|
||||
|
||||
var now = time.Now()
|
||||
|
||||
func CreateSimgosData(input e.CreateDto, event *pl.Event, dbx ...*gorm.DB) (*esimgos.MPoly, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
|
||||
data := setDataSimgos(&input)
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.IS["simrs"]
|
||||
}
|
||||
|
||||
if err := tx.Create(&data).Error; err != nil {
|
||||
return nil, plh.HandleCreateError(input, event, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func ReadDetailSimgosData(simgosId uint16, event *pl.Event) (*esimgos.MPoly, error) {
|
||||
pl.SetLogInfo(event, simgosId, "started", "DBReadDetail")
|
||||
data := esimgos.MPoly{}
|
||||
|
||||
var tx = dg.IS["simrs"]
|
||||
|
||||
if err := tx.
|
||||
Where("\"kode\" = ?", simgosId).
|
||||
First(&data).Error; err != nil {
|
||||
if processedErr := pu.HandleReadError(err, event, source, simgosId, data); processedErr != nil {
|
||||
return nil, processedErr
|
||||
}
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func UpdateSimgosData(input e.UpdateDto, dataSimgos *esync.UnitLink, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, input, "started", "DBUpdate")
|
||||
|
||||
data := setDataSimgos(&input)
|
||||
data.Kode = dataSimgos.Simgos_Id
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.IS["simrs"]
|
||||
}
|
||||
|
||||
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 HardDeleteSimgosData(data *esimgos.MPoly, 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.IS["simrs"]
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
func CreateLinkData(simxId, simgosId uint, event *pl.Event, dbx ...*gorm.DB) (*esync.UnitLink, error) {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
data := setDataSimxLink(simxId, simgosId)
|
||||
|
||||
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(data, event, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func ReadDetailLinkData(simxId uint16, event *pl.Event) (*esync.UnitLink, error) {
|
||||
pl.SetLogInfo(event, simxId, "started", "DBReadDetail")
|
||||
data := esync.UnitLink{}
|
||||
|
||||
var tx = dg.I
|
||||
|
||||
if err := tx.
|
||||
Where("\"Simx_Id\" = ?", simxId).
|
||||
First(&data).Error; err != nil {
|
||||
if processedErr := pu.HandleReadError(err, event, source, simxId, data); processedErr != nil {
|
||||
return nil, processedErr
|
||||
}
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return &data, nil
|
||||
}
|
||||
|
||||
func DeleteLinkData(data *esync.UnitLink, 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
|
||||
}
|
||||
|
||||
func CreateLogData(input esynclog.SimxLogDto, event *pl.Event, dbx ...*gorm.DB) error {
|
||||
pl.SetLogInfo(event, nil, "started", "DBCreate")
|
||||
data := setDataSimxLog(&input)
|
||||
|
||||
var tx *gorm.DB
|
||||
if len(dbx) > 0 {
|
||||
tx = dbx[0]
|
||||
} else {
|
||||
tx = dg.I
|
||||
}
|
||||
|
||||
if err := tx.Create(&data).Error; err != nil {
|
||||
return plh.HandleCreateError(input, event, err)
|
||||
}
|
||||
|
||||
pl.SetLogInfo(event, nil, "complete")
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
package doctor
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
pl "simrs-vx/pkg/logger"
|
||||
"strconv"
|
||||
|
||||
db "simrs-vx/pkg/dualtrx-helper"
|
||||
|
||||
erg "simrs-vx/internal/domain/references/organization"
|
||||
|
||||
eed "simrs-vx/internal/domain/main-entities/doctor"
|
||||
epr "simrs-vx/internal/domain/main-entities/person"
|
||||
es "simrs-vx/internal/domain/main-entities/user"
|
||||
|
||||
ud "simrs-vx/internal/use-case/simgos-sync-use-case/new/doctor"
|
||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
||||
)
|
||||
|
||||
type user struct {
|
||||
Kddokter uint `gorm:"column:kddokter"`
|
||||
Kdpoly uint `gorm:"column:kdpoly"`
|
||||
NIP string `gorm:"column:nip"`
|
||||
NamaPegawai string `gorm:"column:nama_pegawai"`
|
||||
}
|
||||
|
||||
func SeedDoctor(kddoc []uint, event *pl.Event, tx *db.Dualtx) error {
|
||||
|
||||
log.Println("=== START SeedDoctor ===")
|
||||
|
||||
var users []user
|
||||
|
||||
log.Println("Querying SIMGOS doctors...")
|
||||
|
||||
err := tx.Simgos.
|
||||
Table("m_dokter").
|
||||
Select(`
|
||||
DISTINCT ON (l.nip)
|
||||
m_dokter.kddokter as kddokter,
|
||||
m_dokter.kdpoly as kdpoly,
|
||||
l.nip as nip,
|
||||
l.nama_pegawai as nama_pegawai
|
||||
`).
|
||||
Joins(`LEFT JOIN m_login l ON l.kddokter = m_dokter.kddokter`).
|
||||
Where(`m_dokter.kddokter IN (?)`, kddoc).
|
||||
Order(`l.nip`).
|
||||
Scan(&users).Error
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("Found %d doctors to seed\n", len(users))
|
||||
|
||||
// mapping
|
||||
for i, d := range users {
|
||||
log.Printf("[%d/%d] Processing doctor KdDokter=%d ...", i+1, len(users), d.Kddokter)
|
||||
|
||||
kddokter := strconv.Itoa(int(d.Kddokter))
|
||||
//kdpoly := strconv.Itoa(int(d.MDokter.Kdpoly))
|
||||
nik := seeder.GenerateDummyNIK("F")
|
||||
|
||||
doctorsimx := es.CreateDto{
|
||||
Name: d.NIP,
|
||||
Password: "1234",
|
||||
ContractPosition_Code: erg.CSCEmp,
|
||||
Code: &kddokter,
|
||||
Person: &epr.UpdateDto{
|
||||
CreateDto: epr.CreateDto{
|
||||
Name: d.NamaPegawai,
|
||||
ResidentIdentityNumber: &nik,
|
||||
},
|
||||
},
|
||||
Employee: &es.EmployeUpdateDto{
|
||||
Position_Code: erg.EPCDoc,
|
||||
},
|
||||
}
|
||||
|
||||
log.Printf("[%d] Creating User for NIP=%s ...", i+1, d.NIP)
|
||||
|
||||
// create user
|
||||
userData, err := seeder.CreateUser(doctorsimx)
|
||||
if err != nil {
|
||||
log.Println("Error createUser:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("[%d] User created: ID=%d", i+1, userData.Id)
|
||||
|
||||
log.Printf("[%d] Fetching doctor with code=%s ...", i+1, kddokter)
|
||||
|
||||
// get doctor
|
||||
dataDoctor, err := getDoctors(kddokter)
|
||||
if err != nil {
|
||||
log.Println("Error getDoctors:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
doc := *dataDoctor
|
||||
ddoc := doc[0]
|
||||
|
||||
log.Printf("[%d] Linking doctor %d to %s ...", i+1, ddoc.Id, kddokter)
|
||||
if _, err = ud.CreateLinkData(ddoc.Id, d.Kddokter, event); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("[%d] Link created successfully.", i+1)
|
||||
}
|
||||
|
||||
log.Println("=== FINISH SeedDoctor ===")
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func getDoctors(code string) (*[]eed.Doctor, error) {
|
||||
path := fmt.Sprintf("doctor?code=%s", code)
|
||||
|
||||
resp, err := seeder.Send(http.MethodGet, path, nil, "von")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
type MetaData struct {
|
||||
Source string `json:"source"`
|
||||
Status string `json:"status"`
|
||||
Structure string `json:"structure"`
|
||||
}
|
||||
|
||||
type MainApiResp struct {
|
||||
Meta MetaData `json:"meta"`
|
||||
Data []eed.Doctor `json:"data"`
|
||||
}
|
||||
|
||||
// getting response
|
||||
var data MainApiResp
|
||||
err = json.Unmarshal(resp, &data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &data.Data, nil
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package seeder
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
es "simrs-vx/internal/domain/main-entities/user"
|
||||
cfg "simrs-vx/internal/infra/sync-cfg"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Dto struct {
|
||||
LoginNip []string `json:"loginNip"`
|
||||
Instalasi_Code string `json:"instalasi_code"`
|
||||
}
|
||||
|
||||
func Send(method string, endpoint string, body *bytes.Buffer, username string) ([]byte, error) {
|
||||
var url string = cfg.O.NewHost + "v1/" + endpoint
|
||||
var reader io.Reader = nil
|
||||
if body != nil {
|
||||
reader = body
|
||||
}
|
||||
req, err := http.NewRequest(method, url, reader)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
req.Header.Set("Content-Type", "application/json")
|
||||
req.Header.Set("X-Sync-Source", cfg.O.OldSource)
|
||||
req.Header.Set("X-Sync-SecretKey", cfg.O.NewSecretKey)
|
||||
req.Header.Set("X-Sync-UserName", username)
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return nil, fmt.Errorf("http status code %d", resp.StatusCode)
|
||||
}
|
||||
respBody, _ := io.ReadAll(resp.Body)
|
||||
return respBody, nil
|
||||
}
|
||||
|
||||
func CreateUser(user es.CreateDto) (*es.User, error) {
|
||||
var path = "user"
|
||||
|
||||
// create request body
|
||||
jsonUser, err := json.Marshal(user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
reqBody := bytes.NewBuffer(jsonUser)
|
||||
// send data to main-api
|
||||
resp, err := Send(http.MethodPost, path, reqBody, "von")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
type MetaData struct {
|
||||
Source string `json:"source"`
|
||||
Status string `json:"status"`
|
||||
Structure string `json:"structure"`
|
||||
}
|
||||
|
||||
type MainApiResp struct {
|
||||
Meta MetaData `json:"meta"`
|
||||
Data es.User `json:"data"`
|
||||
}
|
||||
|
||||
// getting response
|
||||
var data MainApiResp
|
||||
err = json.Unmarshal(resp, &data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &data.Data, nil
|
||||
}
|
||||
|
||||
func GenerateDummyNIK(gender string) string {
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
|
||||
// 1️⃣ Kode wilayah (6 digit)
|
||||
// Bisa di-random, atau gunakan kode tetap seperti Jakarta: 317301
|
||||
region := rand.Intn(999999) // 000000 - 999999
|
||||
regionCode := fmt.Sprintf("%06d", region)
|
||||
|
||||
// 2️⃣ Tanggal lahir (DDMMYY)
|
||||
year := rand.Intn(30) + 70 // antara tahun 1970-1999 (bisa diganti range lain)
|
||||
month := rand.Intn(12) + 1
|
||||
day := rand.Intn(28) + 1 // selalu valid
|
||||
|
||||
if gender == "F" {
|
||||
day += 40 // aturan NIK perempuan: tanggal lahir + 40
|
||||
}
|
||||
|
||||
birth := fmt.Sprintf("%02d%02d%02d", day, month, year)
|
||||
|
||||
// 3️⃣ Nomor urut (4 digit)
|
||||
sequence := fmt.Sprintf("%04d", rand.Intn(9999))
|
||||
|
||||
// 4️⃣ Susun NIK akhir
|
||||
nik := regionCode + birth + sequence
|
||||
|
||||
return nik
|
||||
}
|
||||
@@ -0,0 +1,147 @@
|
||||
package nurse
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
||||
db "simrs-vx/pkg/dualtrx-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
"strconv"
|
||||
|
||||
erg "simrs-vx/internal/domain/references/organization"
|
||||
|
||||
enr "simrs-vx/internal/domain/main-entities/nurse"
|
||||
epr "simrs-vx/internal/domain/main-entities/person"
|
||||
es "simrs-vx/internal/domain/main-entities/user"
|
||||
|
||||
el "simrs-vx/internal/domain/simgos-entities/m-login"
|
||||
en "simrs-vx/internal/domain/simgos-entities/m-perawat"
|
||||
|
||||
un "simrs-vx/internal/use-case/simgos-sync-use-case/new/nurse"
|
||||
)
|
||||
|
||||
type user struct {
|
||||
el.MLogin
|
||||
en.MPerawat
|
||||
}
|
||||
|
||||
func SeedNurse(kdnur []uint, event *pl.Event, tx *db.Dualtx) error {
|
||||
|
||||
log.Println("=== START SeedNurse ===")
|
||||
|
||||
var users []user
|
||||
|
||||
log.Println("Querying SIMGOS nurses...")
|
||||
|
||||
err := tx.Simgos.
|
||||
Table("m_perawat").
|
||||
Select(`
|
||||
DISTINCT ON (l.nip)
|
||||
m_perawat.idperawat,
|
||||
m_perawat.nama,
|
||||
l.nip,
|
||||
l.nama_pegawai
|
||||
`).
|
||||
Joins("LEFT JOIN m_login l ON l.kdperawat = m_perawat.idperawat").
|
||||
Where(`m_perawat.idperawat IN (?)`, kdnur).
|
||||
Order(`l.nip`).
|
||||
Scan(&users).Error
|
||||
|
||||
if err != nil {
|
||||
log.Println("Error Querying SIMGOS:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("Found %d nurses to seed\n", len(users))
|
||||
|
||||
// mapping
|
||||
for i, d := range users {
|
||||
log.Printf("[%d/%d] Processing nurse KdPerawat=%d ...", i+1, len(users), d.Idperawat)
|
||||
|
||||
kdprawat := strconv.Itoa(int(*d.Idperawat))
|
||||
nik := seeder.GenerateDummyNIK("F")
|
||||
|
||||
nursesimx := es.CreateDto{
|
||||
Name: d.MLogin.NIP,
|
||||
Password: "1234",
|
||||
ContractPosition_Code: erg.CSCEmp,
|
||||
Code: &kdprawat,
|
||||
Person: &epr.UpdateDto{
|
||||
CreateDto: epr.CreateDto{
|
||||
Name: d.NamaPegawai,
|
||||
ResidentIdentityNumber: &nik,
|
||||
},
|
||||
},
|
||||
Employee: &es.EmployeUpdateDto{
|
||||
Position_Code: erg.EPCNur,
|
||||
},
|
||||
}
|
||||
|
||||
log.Printf("[%d] Creating User for NIP=%v ...", i+1, d.MLogin.NIP)
|
||||
|
||||
// create user
|
||||
userData, err := seeder.CreateUser(nursesimx)
|
||||
if err != nil {
|
||||
log.Println("Error createUser:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("[%d] User created: ID=%d", i+1, userData.Id)
|
||||
|
||||
log.Printf("[%d] Fetching nurse with code=%s ...", i+1, kdprawat)
|
||||
|
||||
// get nurse
|
||||
dataNurse, err := getNurse(kdprawat)
|
||||
if err != nil {
|
||||
log.Println("Error get nurses:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
data := *dataNurse
|
||||
ddata := data[0]
|
||||
|
||||
log.Printf("[%d] Linking nurse %d to %s ...", i+1, ddata.Id, kdprawat)
|
||||
if _, err := un.CreateLinkData(ddata.Id, *d.Idperawat, event); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("[%d] Link created successfully.", i+1)
|
||||
}
|
||||
|
||||
log.Println("=== FINISH Seednurse ===")
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func getNurse(code string) (*[]enr.Nurse, error) {
|
||||
path := fmt.Sprintf("nurse?code=%s", code)
|
||||
|
||||
resp, err := seeder.Send(http.MethodGet, path, nil, "von")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
type MetaData struct {
|
||||
Source string `json:"source"`
|
||||
Status string `json:"status"`
|
||||
Structure string `json:"structure"`
|
||||
}
|
||||
|
||||
type MainApiResp struct {
|
||||
Meta MetaData `json:"meta"`
|
||||
Data []enr.Nurse `json:"data"`
|
||||
}
|
||||
|
||||
// getting response
|
||||
var data MainApiResp
|
||||
err = json.Unmarshal(resp, &data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &data.Data, nil
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package regular
|
||||
|
||||
import (
|
||||
"log"
|
||||
erg "simrs-vx/internal/domain/references/organization"
|
||||
|
||||
epr "simrs-vx/internal/domain/main-entities/person"
|
||||
es "simrs-vx/internal/domain/main-entities/user"
|
||||
|
||||
el "simrs-vx/internal/domain/simgos-entities/m-login"
|
||||
|
||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
||||
)
|
||||
|
||||
func SeedRegular(regLogin []el.MLogin, instalasiCode string) error {
|
||||
|
||||
log.Println("=== START SeedRegular ===")
|
||||
|
||||
// mapping
|
||||
for i, d := range regLogin {
|
||||
log.Printf("[%d/%d] Processing Regular NIP=%s ...", i+1, len(regLogin), d.NIP)
|
||||
|
||||
nik := seeder.GenerateDummyNIK("F")
|
||||
|
||||
regularsimx := es.CreateDto{
|
||||
Name: d.NIP,
|
||||
Password: "1234",
|
||||
ContractPosition_Code: erg.CSCEmp,
|
||||
Installation_Code: &instalasiCode,
|
||||
Person: &epr.UpdateDto{
|
||||
CreateDto: epr.CreateDto{
|
||||
Name: d.NamaPegawai,
|
||||
ResidentIdentityNumber: &nik,
|
||||
},
|
||||
},
|
||||
Employee: &es.EmployeUpdateDto{
|
||||
Position_Code: erg.EPCReg,
|
||||
},
|
||||
}
|
||||
|
||||
log.Printf("[%d] Creating User for NIP=%s ...", i+1, d.NIP)
|
||||
|
||||
// create user
|
||||
userData, err := seeder.CreateUser(regularsimx)
|
||||
if err != nil {
|
||||
log.Println("Error createUser:", err)
|
||||
return err
|
||||
}
|
||||
|
||||
log.Printf("[%d] User created: ID=%d", i+1, userData.Id)
|
||||
}
|
||||
|
||||
log.Println("=== FINISH SeedRegular ===")
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
package seeder
|
||||
|
||||
import (
|
||||
"log"
|
||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/doctor"
|
||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/nurse"
|
||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder/regular"
|
||||
|
||||
db "simrs-vx/pkg/dualtrx-helper"
|
||||
pl "simrs-vx/pkg/logger"
|
||||
|
||||
d "github.com/karincake/dodol"
|
||||
|
||||
el "simrs-vx/internal/domain/simgos-entities/m-login"
|
||||
|
||||
"simrs-vx/internal/use-case/simgos-sync-use-case/seeder"
|
||||
)
|
||||
|
||||
const source = "seeder"
|
||||
|
||||
func SeedToSimx(input seeder.Dto) (*d.Data, error) {
|
||||
event := pl.Event{
|
||||
Feature: "Seeder",
|
||||
Source: source,
|
||||
}
|
||||
|
||||
// Start log
|
||||
pl.SetLogInfo(&event, input, "started", "create")
|
||||
|
||||
var (
|
||||
tx = db.NewTx()
|
||||
mlogin, regLogin []el.MLogin
|
||||
kddokter, kdperawat []uint
|
||||
)
|
||||
|
||||
// Get M_login
|
||||
err := tx.Simgos.Model(&el.MLogin{}).
|
||||
Select(`DISTINCT ON (nip) m_login.*`).
|
||||
Where(`"nip" IN (?)`, input.LoginNip).
|
||||
Find(&mlogin).Error
|
||||
if err != nil {
|
||||
log.Println("Error Querying Mlogin:", err)
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// SET data
|
||||
if len(mlogin) > 0 {
|
||||
for _, l := range mlogin {
|
||||
if l.KdDokter != 0 {
|
||||
kddokter = append(kddokter, l.KdDokter)
|
||||
continue
|
||||
}
|
||||
|
||||
if l.KdPerawat != 0 {
|
||||
kdperawat = append(kdperawat, l.KdPerawat)
|
||||
continue
|
||||
}
|
||||
|
||||
regLogin = append(regLogin, l)
|
||||
}
|
||||
}
|
||||
|
||||
// Seed based on role
|
||||
if len(kddokter) > 0 {
|
||||
err = doctor.SeedDoctor(kddokter, &event, tx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if len(kdperawat) > 0 {
|
||||
err = nurse.SeedNurse(kdperawat, &event, tx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if len(regLogin) > 0 {
|
||||
err = regular.SeedRegular(regLogin, input.Instalasi_Code)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
pl.SetLogInfo(&event, nil, "complete")
|
||||
|
||||
return &d.Data{
|
||||
Meta: d.II{
|
||||
"source": source,
|
||||
"structure": "single-data",
|
||||
"status": "created",
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
Reference in New Issue
Block a user