527 lines
11 KiB
Go
527 lines
11 KiB
Go
package encounter
|
|
|
|
import (
|
|
erc "simrs-vx/internal/domain/references/common"
|
|
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/encounter"
|
|
synce "simrs-vx/internal/domain/sync-entities/encounter"
|
|
syncir "simrs-vx/internal/domain/sync-entities/internal-reference"
|
|
elog "simrs-vx/internal/domain/sync-entities/log"
|
|
|
|
utph "simrs-vx/internal/use-case/simgos-sync-use-case/new/internal-reference"
|
|
)
|
|
|
|
const source = "encounter"
|
|
|
|
func Create(input e.Encounter) (*d.Data, error) {
|
|
var (
|
|
syncLink *synce.EncounterLink
|
|
)
|
|
|
|
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 TPendaftaran
|
|
tPendaftaran, err := CreateTPendaftaranData(input, &event, tx.Simgos)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 2: Insert TRekammedik
|
|
err = CreateTRekammedik(input, tPendaftaran, &event, tx.Simgos)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 3: Update MPasien
|
|
err = updatePatientCaraBayar(*tPendaftaran, &event, tx.Simgos)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// STEP 4: Insert to Link
|
|
syncLink, err = CreateLinkData(input.Id, tPendaftaran.Idxdaftar, &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.Encounter) (*d.Data, error) {
|
|
event := pl.Event{
|
|
Feature: "Update",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "update")
|
|
|
|
// STEP 1: Get Link
|
|
syncLink, err := ReadDetailLinkData(input.Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// STEP 2: Get Simgos
|
|
simgos, err := ReadTPendaftaranDetailData(syncLink.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 2: Update Simgos
|
|
if err = UpdateTPendaftaranData(input, simgos, "update", &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")
|
|
|
|
// STEP 1: Get Link
|
|
syncLink, err := ReadDetailLinkData(input.Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// STEP 2: Get Simgos
|
|
sgData, err := ReadTPendaftaranDetailData(syncLink.Simgos_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = db.WithDualTx(func(tx *db.Dualtx) error {
|
|
// STEP 3: Delete Simgos
|
|
err = HardDeleteTPendaftaranData(sgData, &event, tx.Simgos)
|
|
if 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(uint(input.Id), sgData.Idxdaftar, &event)
|
|
}()
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
pl.SetLogInfo(&event, nil, "complete")
|
|
|
|
return &d.Data{
|
|
Meta: d.IS{
|
|
"source": source,
|
|
"structure": "single-data",
|
|
"status": "deleted",
|
|
},
|
|
}, nil
|
|
|
|
}
|
|
|
|
func CheckIn(input e.Encounter) (*d.Data, error) {
|
|
event := pl.Event{
|
|
Feature: "CheckIn",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "check-in")
|
|
|
|
// STEP 1: Get Link
|
|
syncLink, err := ReadDetailLinkData(input.Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// STEP 2: Get Simgos
|
|
simgos, err := ReadTPendaftaranDetailData(syncLink.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 2: Update Simgos
|
|
if err = UpdateTPendaftaranData(input, simgos, "check-in", &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 CheckOut(input e.Encounter) (*d.Data, error) {
|
|
event := pl.Event{
|
|
Feature: "CheckOut",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "check-out")
|
|
|
|
// STEP 1: Get Link
|
|
syncLink, err := ReadDetailLinkData(input.Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// STEP 2: Get Simgos
|
|
simgos, err := ReadTPendaftaranDetailData(syncLink.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 2: Update Simgos
|
|
if err = UpdateTPendaftaranData(input, simgos, "check-out", &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 UpdateStatus(input e.Encounter) (*d.Data, error) {
|
|
event := pl.Event{
|
|
Feature: "Update Status",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "update-status")
|
|
|
|
// STEP 1: Get Link
|
|
syncLink, err := ReadDetailLinkData(input.Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// STEP 2: Get Simgos
|
|
simgos, err := ReadTPendaftaranDetailData(syncLink.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 2: Update TPendaftaran
|
|
if err = UpdateTPendaftaranData(input, simgos, "update-status", &event, tx); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Step 3: Update TDiagnosadanterapi
|
|
if input.Status_Code == erc.DSCCancel {
|
|
if err = updateCancelTDiagnosaTherapy(simgos.Idxdaftar, input, &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 RequestSwitchSpecialist(input e.Encounter) (*d.Data, error) {
|
|
var (
|
|
syncLinkInternal *[]syncir.InternalReferenceLink
|
|
)
|
|
|
|
event := pl.Event{
|
|
Feature: "RequestSwitchSpecialist",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "request-switch-specialist")
|
|
|
|
// STEP 1: Get Link
|
|
syncLink, err := ReadDetailLinkData(input.Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// STEP 2: Get Simgos
|
|
tpendaftaran, err := ReadTPendaftaranDetailData(syncLink.Simgos_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
err = db.WithDualTx(func(tx *db.Dualtx) error {
|
|
// Step 3: Update TPendaftaran
|
|
if err = UpdateTPendaftaranData(input, tpendaftaran, "update-status", &event, tx.Simgos); err != nil {
|
|
return err
|
|
}
|
|
|
|
// Step 4: Bulk Insert TPemeriksaanHist
|
|
tPemeriksanHistory, err := utph.CreateSimgosData(input, tpendaftaran, &event, tx.Simgos)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Step 5: Bulk Insert To Link
|
|
if syncLinkInternal, err = utph.CreateBulkLinkData(*input.InternalReferences, *tPemeriksanHistory, &event, tx.Sync); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
if syncLinkInternal != nil {
|
|
go func() { _ = utph.DeleteLinkData(syncLinkInternal, &event) }()
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
pl.SetLogInfo(&event, nil, "complete")
|
|
|
|
return &d.Data{
|
|
Meta: d.IS{
|
|
"source": source,
|
|
"structure": "single-data",
|
|
"status": "updated",
|
|
},
|
|
}, nil
|
|
}
|
|
|
|
func ApproveSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) {
|
|
event := pl.Event{
|
|
Feature: "ApproveSwitchSpecialist",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "approve-switch-specialist")
|
|
|
|
// STEP 1: Get InternalReference Link
|
|
syncLink, err := utph.ReadDetailLinkData(input.InternalReferences_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// STEP 2: Get TPemeriksaanHist
|
|
tPemeriksaanHist, err := utph.ReadDetailSimgosData(syncLink.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 3: Update TPemeriksaanHist
|
|
if err := utph.UpdateSimgosData(input, tPemeriksaanHist, "approve", &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 CancelSwitchSpecialist(input e.ApproveCancelSpecialistDto) (*d.Data, error) {
|
|
event := pl.Event{
|
|
Feature: "CancelSwitchSpecialist",
|
|
Source: source,
|
|
}
|
|
|
|
// Start log
|
|
pl.SetLogInfo(&event, input, "started", "cancel-switch-specialist")
|
|
|
|
// STEP 1: Get InternalReference Link
|
|
syncLink, err := utph.ReadDetailLinkData(input.InternalReferences_Id, &event)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// STEP 2: Get TPemeriksaanHist
|
|
tPemeriksaanHist, err := utph.ReadDetailSimgosData(syncLink.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 3: Update TPemeriksaanHist
|
|
if err := utph.UpdateSimgosData(input, tPemeriksaanHist, "cancel", &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
|
|
}
|