diff --git a/internal/domain/antrian_operasi/repository.go b/internal/domain/antrian_operasi/repository.go index d13237a..4eaed9d 100644 --- a/internal/domain/antrian_operasi/repository.go +++ b/internal/domain/antrian_operasi/repository.go @@ -17,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 { @@ -42,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) @@ -75,7 +80,7 @@ func (r antrianOperasiRepo) insertAntrianChildTables(c *gin.Context, tx *sql.Tx, Values: valuesInsertTelepon, } - sql, args, err := r.queryBuilder.BuildBulkInsertQuery("data_telepon_pasien_operasi", insertTeleponQuery, returningCols...) + sql, args, err := r.queryBuilder.BuildBulkInsertQuery(TBL_PASIEN_TELEPHONE, insertTeleponQuery, returningCols...) if err != nil { log.Printf("error building query telepon %s", err) @@ -114,7 +119,7 @@ func (r antrianOperasiRepo) insertAntrianChildTables(c *gin.Context, tx *sql.Tx, Values: valuesDiagnosa, } - sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_diagnosa_pasien_operasi", insertDiagnosaQuery, returningCols...) + sql, args, err = r.queryBuilder.BuildBulkInsertQuery(TBL_DIAGNOSA_OPERASI, insertDiagnosaQuery, returningCols...) if err != nil { log.Printf("error building query diagnosa %s", err) return err @@ -152,7 +157,7 @@ func (r antrianOperasiRepo) insertAntrianChildTables(c *gin.Context, tx *sql.Tx, Values: valuesTindakan, } - sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_tindakan_pasien_operasi", insertTindakanQuery, returningCols...) + sql, args, err = r.queryBuilder.BuildBulkInsertQuery(TBL_TINDAKAN_OPERASI, insertTindakanQuery, returningCols...) if err != nil { log.Printf("error building query tindakan %s", err) return err @@ -183,7 +188,7 @@ func (r antrianOperasiRepo) insertAntrianChildTables(c *gin.Context, tx *sql.Tx, Values: valuesDokterPelaksana, } - sql, args, err = r.queryBuilder.BuildBulkInsertQuery("data_pasien_operasi_data_pegawai_2", insertDokterPelaksanaQuery, returningCols...) + 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 @@ -197,6 +202,86 @@ func (r antrianOperasiRepo) insertAntrianChildTables(c *gin.Context, tx *sql.Tx, 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 { @@ -300,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{ @@ -313,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", } @@ -561,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"}, @@ -585,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"}, @@ -609,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"}, @@ -631,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"}, @@ -683,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 +}