275 lines
5.3 KiB
Go
275 lines
5.3 KiB
Go
package soapi
|
|
|
|
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/soapi"
|
|
|
|
elog "simrs-vx/internal/domain/sync-entities/log"
|
|
esync "simrs-vx/internal/domain/sync-entities/soapi"
|
|
|
|
ue "simrs-vx/internal/use-case/simgos-sync-use-case/new/encounter"
|
|
)
|
|
|
|
const source = "soapi"
|
|
|
|
func Create(input e.Soapi) (*d.Data, error) {
|
|
var (
|
|
syncLink *esync.SoapiLink
|
|
err error
|
|
)
|
|
|
|
event := pl.Event{
|
|
Feature: "Create",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "create")
|
|
|
|
// get encounter Link
|
|
eLink, err := ue.ReadDetailLinkData(*input.Encounter_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// get Tpendaftaran
|
|
tPendaftaran, err := ue.ReadTPendaftaranDetailData(eLink.Simgos_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = db.WithDualTx(func(tx *db.Dualtx) error {
|
|
// STEP 1: Insert to TDiagnosaDanTerapi
|
|
tDiagTherapy, err := CreateTDiagnosaDanTerapi(input, tPendaftaran, &event, tx.Simgos)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 2: Insert to TICD
|
|
_, err = CreateTIcd(input, tPendaftaran, &event, tx.Simgos)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 3: Insert to TICD-CM
|
|
_, err = CreateTIcdCm(input, tPendaftaran, &event, tx.Simgos)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 4: Insert to Link
|
|
syncLink, err = CreateLinkData(input.Id, tDiagTherapy.Idxterapi, &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.Soapi) (*d.Data, error) {
|
|
event := pl.Event{
|
|
Feature: "Update",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "update")
|
|
|
|
// Get Soapi Link
|
|
sLink, err := ReadDetailLinkData(input.Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get TDiagnosadanTerapi
|
|
tDiagTherapy, err := ReadDetailTDiagnosaDanTerapi(sLink.Simgos_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get Encounter Link
|
|
eLink, err := ue.ReadDetailLinkData(*input.Encounter_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get TPendaftaran
|
|
tPendaftaran, err := ue.ReadTPendaftaranDetailData(eLink.Simgos_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
tx := db.NewTx()
|
|
err = tx.Simgos.Transaction(func(tx *gorm.DB) error {
|
|
// SET LOCAL
|
|
if err = tx.Exec(`SET LOCAL simx.sync_source = 'new'`).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// Step 1: Update TDiagnosaDanTerapi
|
|
if err = UpdateTDiagnosaDanTerapi(input, tDiagTherapy, &event, tx); err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 2: Delete TIcd
|
|
if err = HardDeleteTIcd(tDiagTherapy.Idxdaftar, &event, tx); err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 3: Delete TIcdCm
|
|
if err = HardDeleteTIcdCm(tDiagTherapy.Idxdaftar, &event, tx); err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 4: Insert TIcd
|
|
if _, err = CreateTIcd(input, tPendaftaran, &event, tx); err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 5: Insert TIcd-cm
|
|
if _, err = CreateTIcdCm(input, tPendaftaran, &event, tx); 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")
|
|
|
|
// Get Soapi Link
|
|
syncLink, err := ReadDetailLinkData(input.Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Get TDiagnosa&Terapi
|
|
tDiagTh, err := ReadDetailTDiagnosaDanTerapi(syncLink.Simgos_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = db.WithDualTx(func(tx *db.Dualtx) error {
|
|
// STEP 1: Delete TDiagnosa&Terapi Simgos
|
|
if err = HardDeleteTDiagnosaDanTerapi(tDiagTh, &event, tx.Simgos); err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 2: Delete TIcd
|
|
if err = HardDeleteTIcd(tDiagTh.Idxdaftar, &event, tx.Simgos); err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 3: Delete TIcdCm
|
|
if err = HardDeleteTIcdCm(tDiagTh.Idxdaftar, &event, tx.Simgos); err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 4: Delete Link
|
|
err = DeleteLinkData(syncLink, &event, tx.Sync)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
isLinkDeleted = true
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
if isLinkDeleted {
|
|
go func() {
|
|
_, _ = CreateLinkData(input.Id, tDiagTh.Idxterapi, &event)
|
|
}()
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
pl.SetLogInfo(&event, nil, "complete")
|
|
|
|
return &d.Data{
|
|
Meta: d.IS{
|
|
"source": source,
|
|
"structure": "single-data",
|
|
"status": "deleted",
|
|
},
|
|
}, nil
|
|
|
|
}
|