Compare commits

...
2 Commits
+311 -159
View File
@@ -4,6 +4,7 @@ import (
"antrian-operasi/internal/database"
"antrian-operasi/internal/shared"
queryUtils "antrian-operasi/internal/utils/query"
"database/sql"
"log"
"slices"
"strconv"
@@ -16,11 +17,15 @@ import (
const DB_NAME = "db_antrian"
const TBL_NAME = "data_pasien_operasi"
const TBL_DIAGNOSA_OPERASI = "data_diagnosa_pasien_operasi"
const TBL_PASIEN_TELEPHONE = "data_telepon_pasien_operasi"
const TBL_TINDAKAN_OPERASI = "data_tindakan_pasien_operasi"
const TBL_DOKTER_OPERASI = "data_pasien_operasi_data_pegawai_2"
type IAntrianOperasiRepository interface {
CreateAntrianOperasi(c *gin.Context, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error)
SearchableListAntrianOperasi(c *gin.Context) (ListPasienOperasiPaginate, error)
GetAntrianOperasiById(c *gin.Context, id string) (DetailPasienOperasiResultQuery, error)
UpdateAntrianOperasi(c *gin.Context, id string, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error)
}
type antrianOperasiRepo struct {
@@ -41,6 +46,7 @@ func NewRepository(dbService database.Service) IAntrianOperasiRepository {
"\"Kode_diagnosa\"", "\"Diagnosa\"", "\"Jenis_diagnosa\"", "\"FK_pasien_operasi_diagnosa_pasien_operasi_ID\"", "FK_pasien_operasi_diagnosa_pasien_operasi_ID",
"\"Kode_tindakan\"", "\"Tindakan\"", "\"Tindakan_tambahan\"", "\"FK_pasien_operasi_tindakan_pasien_operasi_ID\"", "FK_pasien_operasi_tindakan_pasien_operasi_ID",
"\"data_pasien_operasi_id\"", "\"data_pegawai_id\"", "data_pasien_operasi_id",
"no_urut_spesialis",
}).
SetAllowedTables([]string{TBL_NAME, TBL_DIAGNOSA_OPERASI})
queryBuilder.SetSecurityOptions(false, 100)
@@ -51,6 +57,231 @@ func NewRepository(dbService database.Service) IAntrianOperasiRepository {
}
}
func (r antrianOperasiRepo) insertAntrianChildTables(c *gin.Context, tx *sql.Tx, idAntrian string, req CreatePasienOperasiRequest) error {
returningCols := []string{
"id",
}
// INSERT data_telepon_pasien_operasi
var valuesInsertTelepon [][]interface{}
for _, telp := range req.FormData.NoTelepon {
idTelepon := uuid.New().String()
itemValues := []interface{}{idTelepon, telp, idAntrian}
valuesInsertTelepon = append(valuesInsertTelepon, itemValues)
}
insertTeleponQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Nomor_telepon\"",
"\"FK_pasien_operasi_telepon_pasien_operasi_ID\"",
},
Values: valuesInsertTelepon,
}
sql, args, err := r.queryBuilder.BuildBulkInsertQuery(TBL_PASIEN_TELEPHONE, insertTeleponQuery, returningCols...)
if err != nil {
log.Printf("error building query telepon %s", err)
return err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
log.Println(err)
return err
}
log.Printf("success insert telepon")
// INSERT data_diagnosa_pasien_operasi
var valuesDiagnosa [][]interface{}
for _, diagnosa := range req.DiagnosisItem {
idDiagnosa := uuid.New().String()
itemValues := []interface{}{
idDiagnosa,
diagnosa.KodeDiagnosa,
diagnosa.Diagnosa,
diagnosa.JenisDiagnosa,
idAntrian,
}
valuesDiagnosa = append(valuesDiagnosa, itemValues)
}
insertDiagnosaQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Kode_diagnosa\"",
"\"Diagnosa\"",
"\"Jenis_diagnosa\"",
"\"FK_pasien_operasi_diagnosa_pasien_operasi_ID\"",
},
Values: valuesDiagnosa,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery(TBL_DIAGNOSA_OPERASI, insertDiagnosaQuery, returningCols...)
if err != nil {
log.Printf("error building query diagnosa %s", err)
return err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
log.Println(err)
return err
}
log.Printf("success insert diagnosa")
// INSERT data_tindakan_pasien_operasi
var valuesTindakan [][]interface{}
for _, tindakan := range req.TindakanItems {
idTindakan := uuid.New().String()
itemValues := []interface{}{
idTindakan,
tindakan.KodeTindakan,
tindakan.Tindakan,
tindakan.TindakanTambahan,
idAntrian,
}
valuesTindakan = append(valuesTindakan, itemValues)
}
insertTindakanQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Kode_tindakan\"",
"\"Tindakan\"",
"\"Tindakan_tambahan\"",
"\"FK_pasien_operasi_tindakan_pasien_operasi_ID\"",
},
Values: valuesTindakan,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery(TBL_TINDAKAN_OPERASI, insertTindakanQuery, returningCols...)
if err != nil {
log.Printf("error building query tindakan %s", err)
return err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
log.Println(err)
return err
}
log.Printf("success insert tindakan")
// INSERT data_pasien_operasi_data_pegawai
var valuesDokterPelaksana [][]interface{}
for _, dokter := range req.DokterPelaksanaItems {
itemValues := []interface{}{
idAntrian,
dokter.Id,
}
valuesDokterPelaksana = append(valuesDokterPelaksana, itemValues)
}
insertDokterPelaksanaQuery := queryUtils.InsertBulkData{
Columns: []string{
"\"data_pasien_operasi_id\"",
"\"data_pegawai_id\"",
},
Values: valuesDokterPelaksana,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery(TBL_DOKTER_OPERASI, insertDokterPelaksanaQuery, returningCols...)
if err != nil {
log.Printf("error building query dokter pelaksana %s", err)
return err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
log.Println(err)
return err
}
return nil
}
func (r antrianOperasiRepo) deleteAntrianChildTables(c *gin.Context, tx *sql.Tx, idAntrian string) error {
// delete telephone
filters := []queryUtils.FilterGroup{
{
Filters: []queryUtils.DynamicFilter{
{Column: "FK_pasien_operasi_telepon_pasien_operasi_ID", Operator: queryUtils.OpEqual, Value: idAntrian},
},
},
}
sql, args, err := r.queryBuilder.BuildDeleteQuery(TBL_PASIEN_TELEPHONE, filters)
if err != nil {
log.Printf("Unable to create delete phone query : %v", err)
return err
}
_, err = tx.ExecContext(c, sql, args)
if err != nil {
log.Printf("Unable to executing delete phone : %v", err)
return err
}
// delete diagnosa
filters = []queryUtils.FilterGroup{
{
Filters: []queryUtils.DynamicFilter{
{Column: "FK_pasien_operasi_diagnosa_pasien_operasi_ID", Operator: queryUtils.OpEqual, Value: idAntrian},
},
},
}
sql, args, err = r.queryBuilder.BuildDeleteQuery(TBL_DIAGNOSA_OPERASI, filters)
if err != nil {
log.Printf("Unable to create delete diagnosa query : %v", err)
return err
}
_, err = tx.ExecContext(c, sql, args)
if err != nil {
log.Printf("Unable to executing delete diagnosa : %v", err)
return err
}
// delete tindakan
filters = []queryUtils.FilterGroup{
{
Filters: []queryUtils.DynamicFilter{
{Column: "FK_pasien_operasi_tindakan_pasien_operasi_ID", Operator: queryUtils.OpEqual, Value: idAntrian},
},
},
}
sql, args, err = r.queryBuilder.BuildDeleteQuery(TBL_TINDAKAN_OPERASI, filters)
if err != nil {
log.Printf("Unable to create delete tindakan query : %v", err)
return err
}
_, err = tx.ExecContext(c, sql, args)
if err != nil {
log.Printf("Unable to executing delete tindakan : %v", err)
return err
}
// delete dokter
filters = []queryUtils.FilterGroup{
{
Filters: []queryUtils.DynamicFilter{
{Column: "data_pasien_operasi_id", Operator: queryUtils.OpEqual, Value: idAntrian},
},
},
}
sql, args, err = r.queryBuilder.BuildDeleteQuery(TBL_DOKTER_OPERASI, filters)
if err != nil {
log.Printf("Unable to create delete dokter operasi query : %v", err)
return err
}
_, err = tx.ExecContext(c, sql, args)
if err != nil {
log.Printf("Unable to executing delete dokter operasi : %v", err)
return err
}
return nil
}
func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) {
db, err := r.db.GetSQLXDB(DB_NAME)
if err != nil {
@@ -109,162 +340,12 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c *gin.Context, req CreatePasie
}
log.Printf("success insert main")
// INSERT data_telepon_pasien_operasi
var valuesInsertTelepon [][]interface{}
for _, telp := range req.FormData.NoTelepon {
idTelepon := uuid.New().String()
itemValues := []interface{}{idTelepon, telp, idAntrian}
valuesInsertTelepon = append(valuesInsertTelepon, itemValues)
}
insertTeleponQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Nomor_telepon\"",
"\"FK_pasien_operasi_telepon_pasien_operasi_ID\"",
},
Values: valuesInsertTelepon,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_telepon_pasien_operasi", insertTeleponQuery, returningCols...)
if err != nil {
log.Printf("error building query telepon %s", err)
tx.Rollback()
return req, err
}
_, err = tx.ExecContext(c, sql, args...)
// INSERT CHILD TABLES
err = r.insertAntrianChildTables(c, tx, idAntrian, req)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert telepon")
// INSERT data_diagnosa_pasien_operasi
var valuesDiagnosa [][]interface{}
for _, diagnosa := range req.DiagnosisItem {
idDiagnosa := uuid.New().String()
itemValues := []interface{}{
idDiagnosa,
diagnosa.KodeDiagnosa,
diagnosa.Diagnosa,
diagnosa.JenisDiagnosa,
idAntrian,
}
valuesDiagnosa = append(valuesDiagnosa, itemValues)
}
insertDiagnosaQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Kode_diagnosa\"",
"\"Diagnosa\"",
"\"Jenis_diagnosa\"",
"\"FK_pasien_operasi_diagnosa_pasien_operasi_ID\"",
},
Values: valuesDiagnosa,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_diagnosa_pasien_operasi", insertDiagnosaQuery, returningCols...)
if err != nil {
log.Printf("error building query diagnosa %s", err)
tx.Rollback()
return req, err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert diagnosa")
// INSERT data_tindakan_pasien_operasi
var valuesTindakan [][]interface{}
for _, tindakan := range req.TindakanItems {
idTindakan := uuid.New().String()
itemValues := []interface{}{
idTindakan,
tindakan.KodeTindakan,
tindakan.Tindakan,
tindakan.TindakanTambahan,
idAntrian,
}
valuesTindakan = append(valuesTindakan, itemValues)
}
insertTindakanQuery := queryUtils.InsertBulkData{
Columns: []string{
"id",
"\"Kode_tindakan\"",
"\"Tindakan\"",
"\"Tindakan_tambahan\"",
"\"FK_pasien_operasi_tindakan_pasien_operasi_ID\"",
},
Values: valuesTindakan,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_tindakan_pasien_operasi", insertTindakanQuery, returningCols...)
if err != nil {
log.Printf("error building query tindakan %s", err)
tx.Rollback()
return req, err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert tindakan")
// INSERT data_pasien_operasi_data_pegawai
var valuesDokterPelaksana [][]interface{}
for _, dokter := range req.DokterPelaksanaItems {
itemValues := []interface{}{
idAntrian,
dokter.Id,
}
valuesDokterPelaksana = append(valuesDokterPelaksana, itemValues)
}
insertDokterPelaksanaQuery := queryUtils.InsertBulkData{
Columns: []string{
"\"data_pasien_operasi_id\"",
"\"data_pegawai_id\"",
},
Values: valuesDokterPelaksana,
}
sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_pasien_operasi_data_pegawai", insertDokterPelaksanaQuery, returningCols...)
if err != nil {
log.Printf("error building query dokter pelaksana %s", err)
tx.Rollback()
return req, err
}
_, err = tx.ExecContext(c, sql, args...)
if err != nil {
tx.Rollback()
log.Println(err)
return req, err
}
log.Printf("success insert dokter pelaksana")
// COMMIT TRANSACTION
tx.Commit()
@@ -304,7 +385,9 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa
{Expression: "dko.Kategori", Alias: "kategori"},
},
Sort: []queryUtils.SortField{
{Column: "dpo.Tanggal_daftar", Order: "ASC"}},
{Column: "dpo.Tanggal_daftar", Order: "ASC"},
{Column: "no_urut_spesialis", Order: "ASC"},
},
}
wfKategori := queryUtils.WindowFunction{
@@ -317,13 +400,13 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa
wfSpesialis := queryUtils.WindowFunction{
Function: "ROW_NUMBER",
Over: "\"dpo\".\"Kategori_operasi\", \"dpo\".\"Spesialis\"",
OrderBy: "\"dpo\".\"Tanggal_daftar\"",
OrderBy: "\"dpo\".\"Tanggal_daftar\", \"dpo\".\"date_created\", \"dpo\".\"date_updated\"",
Alias: "no_urut_spesialis",
}
wfSubSpesialis := queryUtils.WindowFunction{
Function: "ROW_NUMBER",
Over: "\"dpo\".\"Kategori_operasi\", \"dpo\".\"Spesialis\", \"dpo\".\"Sub_spesialis\"",
OrderBy: "\"dpo\".\"Tanggal_daftar\"",
OrderBy: "\"dpo\".\"Tanggal_daftar\", \"dpo\".\"date_created\", \"dpo\".\"date_updated\"",
Alias: "no_urut_sub_spesialis",
}
@@ -565,7 +648,7 @@ func (r antrianOperasiRepo) GetAntrianOperasiById(c *gin.Context, id string) (De
// query diagnosa
queryDiagnosa := queryUtils.DynamicQuery{
From: "data_diagnosa_pasien_operasi",
From: TBL_DIAGNOSA_OPERASI,
Fields: []queryUtils.SelectField{
{Expression: "id"},
{Expression: "Kode_diagnosa"},
@@ -589,7 +672,7 @@ func (r antrianOperasiRepo) GetAntrianOperasiById(c *gin.Context, id string) (De
// query tindakan
queryTindakan := queryUtils.DynamicQuery{
From: "data_tindakan_pasien_operasi",
From: TBL_TINDAKAN_OPERASI,
Fields: []queryUtils.SelectField{
{Expression: "id"},
{Expression: "Kode_tindakan"},
@@ -613,7 +696,7 @@ func (r antrianOperasiRepo) GetAntrianOperasiById(c *gin.Context, id string) (De
// query telepon
queryTelepon := queryUtils.DynamicQuery{
From: "data_telepon_pasien_operasi",
From: TBL_PASIEN_TELEPHONE,
Fields: []queryUtils.SelectField{
{Expression: "id"},
{Expression: "Nomor_telepon"},
@@ -635,7 +718,7 @@ func (r antrianOperasiRepo) GetAntrianOperasiById(c *gin.Context, id string) (De
// query dokter
queryDokter := queryUtils.DynamicQuery{
From: "data_pasien_operasi_data_pegawai_2",
From: TBL_DOKTER_OPERASI,
Aliases: "dpodp",
Fields: []queryUtils.SelectField{
{Expression: "dpodp.id"},
@@ -687,3 +770,72 @@ func (r antrianOperasiRepo) GetAntrianOperasiById(c *gin.Context, id string) (De
return result, nil
}
func (r antrianOperasiRepo) UpdateAntrianOperasi(c *gin.Context, id string, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) {
// Update main table
updateMainQuery := queryUtils.UpdateData{
Columns: []string{
"date_updated", "No_rekam_medis", "No_ktp", "Nama_pasien", "Jenis_kelamin",
"Tanggal_lahir", "Umur", "Alamat", "Kategori_operasi",
"Rencana_operasi", "Keterangan", "Tanggal_selesai_operasi",
"Status_operasi", "Spesialis", "Sub_spesialis",
},
Values: []interface{}{
time.Now(), req.FormData.NoRekamMedis, req.FormData.NoKtp, req.FormData.NamaPasien, req.FormData.JenisKelamin,
req.FormData.TglLahir, req.FormData.Umur, req.FormData.Alamat, req.RencanaOperasiData.KategoriOperasi,
req.RencanaOperasiData.RencanaOperasi, req.RencanaOperasiData.Keterangan, req.StatusPasienData.TglSelesai,
req.StatusPasienData.StatusOperasi, req.RencanaOperasiData.Spesialis, req.RencanaOperasiData.SubSpesialis,
},
}
filters := []queryUtils.FilterGroup{
{
Filters: []queryUtils.DynamicFilter{
{Column: "id", Operator: queryUtils.OpEqual, Value: id},
},
},
}
sqlUpdateMain, args, err := r.queryBuilder.BuildUpdateQuery(TBL_NAME, updateMainQuery, filters)
if err != nil {
log.Printf("Error build update query : %v", err)
return req, err
}
db, err := r.db.GetSQLXDB(DB_NAME)
if err != nil {
log.Printf("Erorr initiating db : %v", err)
return req, err
}
// START TRANSACTION
tx, err := db.BeginTx(c, nil)
if err != nil {
log.Printf("Error initiating update transaction : %v", err)
return req, err
}
_, err = tx.ExecContext(c, sqlUpdateMain, args...)
if err != nil {
log.Printf("Error executing main update query : %v", err)
tx.Rollback()
return req, err
}
// Delete all child tables
err = r.deleteAntrianChildTables(c, tx, id)
if err != nil {
log.Printf("Error deleting child tables, rollback.. : %v", err)
tx.Rollback()
return req, err
}
// Re-inserting updated child tables
err = r.insertAntrianChildTables(c, tx, id, req)
if err != nil {
log.Printf("Error re-inserting child tables, rollback.. : %v", err)
tx.Rollback()
return req, err
}
return req, nil
}