From de573eda4f48348ede0ea9be53a681bb612aaa7b Mon Sep 17 00:00:00 2001 From: renaldybrada Date: Mon, 2 Mar 2026 14:52:36 +0700 Subject: [PATCH] fixing nomor antrian when searching/filtering --- internal/domain/antrian_operasi/repository.go | 497 +++++++++++++----- 1 file changed, 356 insertions(+), 141 deletions(-) diff --git a/internal/domain/antrian_operasi/repository.go b/internal/domain/antrian_operasi/repository.go index 3da4e13..3424c06 100644 --- a/internal/domain/antrian_operasi/repository.go +++ b/internal/domain/antrian_operasi/repository.go @@ -11,6 +11,7 @@ import ( "context" "github.com/google/uuid" + "github.com/jmoiron/sqlx" ) const DB_NAME = "db_antrian" @@ -47,7 +48,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", "no_urut_sub_spesialis", + "no_urut_spesialis", "no_urut_sub_spesialis", "no_ktp", "no_rekam_medis", "nama_pasien", "status_operasi", }). SetAllowedTables([]string{TBL_NAME, TBL_DIAGNOSA_OPERASI}) queryBuilder.SetSecurityOptions(false, 100) @@ -363,153 +364,16 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c context.Context, req CreatePa func (r antrianOperasiRepo) SearchableListAntrianOperasi(c context.Context, q AntrianQuery) (ListPasienOperasiPaginate, error) { var result ListPasienOperasiPaginate - query := queryUtils.DynamicQuery{ - From: TBL_NAME, - Aliases: "dpo", - Fields: []queryUtils.SelectField{ - {Expression: "dpo.id"}, - {Expression: "dpo.Tanggal_daftar", Alias: "tanggal_daftar"}, - {Expression: "dpo.No_KTP", Alias: "no_ktp"}, - {Expression: "dpo.No_rekam_medis", Alias: "no_rekam_medis"}, - {Expression: "dpo.Nama_pasien", Alias: "nama_pasien"}, - {Expression: "dpo.Status_operasi", Alias: "status_operasi"}, - {Expression: "dpo.Jenis_kelamin", Alias: "jenis_kelamin"}, - {Expression: "ds.Spesialis", Alias: "spesialis"}, - {Expression: "dss.Subspesialis", Alias: "subspesialis"}, - {Expression: "dko.Kategori", Alias: "kategori"}, - }, - Sort: []queryUtils.SortField{ - {Column: "dpo.Tanggal_daftar", Order: "ASC"}, - }, - } - - wfKategori := queryUtils.WindowFunction{ - Function: "ROW_NUMBER", - Over: "\"dpo\".\"Kategori_operasi\"", - OrderBy: "\"dpo\".\"Tanggal_daftar\"", - Alias: "no_urut_kategori", - } - - wfSpesialis := queryUtils.WindowFunction{ - Function: "ROW_NUMBER", - Over: "\"dpo\".\"Spesialis\"", - OrderBy: "\"dpo\".\"Tanggal_daftar\", \"dpo\".\"date_created\", \"dpo\".\"date_updated\"", - Alias: "no_urut_spesialis", - } - wfSubSpesialis := queryUtils.WindowFunction{ - Function: "ROW_NUMBER", - Over: "\"dpo\".\"Sub_spesialis\"", - OrderBy: "\"dpo\".\"Tanggal_daftar\", \"dpo\".\"date_created\", \"dpo\".\"date_updated\"", - Alias: "no_urut_sub_spesialis", - } - - var selectFilter []queryUtils.DynamicFilter - typeIdColumn := "" - - switch q.Type { - case "kategori": - typeIdColumn = "dko.id" - query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) - query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_kategori", Order: "ASC"}) - case "spesialis": - typeIdColumn = "ds.id" - query.WindowFunctions = append(query.WindowFunctions, wfSpesialis, wfSubSpesialis) - query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_spesialis", Order: "ASC"}) - case "sub-spesialis": - typeIdColumn = "dss.id" - query.WindowFunctions = append(query.WindowFunctions, wfSubSpesialis) - query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_sub_spesialis", Order: "ASC"}) - default: - query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) - } - - if q.TypeID != 0 && q.Type != "all" { - selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID}) - } - - query.Joins = []queryUtils.Join{ - { - Type: "LEFT", - Table: "daftar_spesialis", - Alias: "ds", - OnConditions: queryUtils.FilterGroup{ - Filters: []queryUtils.DynamicFilter{ - { - Column: "ds.id", Operator: queryUtils.OpEqual, Value: "dpo.Spesialis", - }, - }, - }, - }, - { - Type: "LEFT", - Table: "daftar_subspesialis", - Alias: "dss", - OnConditions: queryUtils.FilterGroup{ - Filters: []queryUtils.DynamicFilter{ - { - Column: "dpo.Sub_spesialis", Operator: queryUtils.OpEqual, Value: "dss.id", - }, - }, - }, - }, - { - Type: "LEFT", - Table: "daftar_kategori_operasi", - Alias: "dko", - OnConditions: queryUtils.FilterGroup{ - Filters: []queryUtils.DynamicFilter{ - { - Column: "dpo.Kategori_operasi", Operator: queryUtils.OpEqual, Value: "dko.id", - }, - }, - }, - }, - } - - // filtering search results - if q.Search != "" { - searchFilters := []queryUtils.DynamicFilter{ - {Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, - {Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, - {Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, - } - - query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"}) - } - - if q.Status != "" { - selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: q.Status}) - } - - // wiring all select filter - query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: selectFilter, LogicOp: "AND"}) - dbconn, err := r.db.GetSQLXDB(DB_NAME) if err != nil { log.Printf("Unable to connect db : %s", err) return result, err } - // query count - countData, err := r.queryBuilder.ExecuteCount(c, dbconn, query) + // result, err = r.oldListAntrian(c, dbconn, q) + result, err = r.fixingListAntrian(c, dbconn, q) if err != nil { - log.Printf("Unable to execute query count : %s ", err) - return result, err - } - result.Paging.Limit = q.Limit - result.Paging.Offset = q.Offset - result.Paging.Total = int(countData) - result.Paging.CalculatePagingInfo() - - // query data - queryData := query - queryData.Limit = q.Limit - queryData.Offset = q.Offset - err = r.queryBuilder.ExecuteQuery( - c, dbconn, queryData, &result.Data) - if err != nil { - log.Printf("Unable to execute query data : %s", err) - return result, err + return result, nil } // filtering antrian ids @@ -941,3 +805,354 @@ func (r antrianOperasiRepo) DeleteStatusAntrianOperasi(c context.Context, id str return nil } + +// private functions + +// this code will be deleted soon, change to fixingListAntrion() methods. +func (r antrianOperasiRepo) oldListAntrian(c context.Context, dbconn *sqlx.DB, q AntrianQuery) (ListPasienOperasiPaginate, error) { + var result ListPasienOperasiPaginate + + query := queryUtils.DynamicQuery{ + From: TBL_NAME, + Aliases: "dpo", + Fields: []queryUtils.SelectField{ + {Expression: "dpo.id"}, + {Expression: "dpo.Tanggal_daftar", Alias: "tanggal_daftar"}, + {Expression: "dpo.No_KTP", Alias: "no_ktp"}, + {Expression: "dpo.No_rekam_medis", Alias: "no_rekam_medis"}, + {Expression: "dpo.Nama_pasien", Alias: "nama_pasien"}, + {Expression: "dpo.Status_operasi", Alias: "status_operasi"}, + {Expression: "dpo.Jenis_kelamin", Alias: "jenis_kelamin"}, + {Expression: "ds.Spesialis", Alias: "spesialis"}, + {Expression: "dss.Subspesialis", Alias: "subspesialis"}, + {Expression: "dko.Kategori", Alias: "kategori"}, + }, + Sort: []queryUtils.SortField{ + {Column: "dpo.Tanggal_daftar", Order: "ASC"}, + }, + } + + wfKategori := queryUtils.WindowFunction{ + Function: "ROW_NUMBER", + Over: "\"dpo\".\"Kategori_operasi\"", + OrderBy: "\"dpo\".\"Tanggal_daftar\"", + Alias: "no_urut_kategori", + } + + wfSpesialis := queryUtils.WindowFunction{ + Function: "ROW_NUMBER", + Over: "\"dpo\".\"Spesialis\"", + OrderBy: "\"dpo\".\"Tanggal_daftar\", \"dpo\".\"date_created\", \"dpo\".\"date_updated\"", + Alias: "no_urut_spesialis", + } + wfSubSpesialis := queryUtils.WindowFunction{ + Function: "ROW_NUMBER", + Over: "\"dpo\".\"Sub_spesialis\"", + OrderBy: "\"dpo\".\"Tanggal_daftar\", \"dpo\".\"date_created\", \"dpo\".\"date_updated\"", + Alias: "no_urut_sub_spesialis", + } + + var selectFilter []queryUtils.DynamicFilter + typeIdColumn := "" + + switch q.Type { + case "kategori": + typeIdColumn = "dko.id" + query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) + query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_kategori", Order: "ASC"}) + case "spesialis": + typeIdColumn = "ds.id" + query.WindowFunctions = append(query.WindowFunctions, wfSpesialis, wfSubSpesialis) + query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_spesialis", Order: "ASC"}) + case "sub-spesialis": + typeIdColumn = "dss.id" + query.WindowFunctions = append(query.WindowFunctions, wfSubSpesialis) + query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_sub_spesialis", Order: "ASC"}) + default: + query.WindowFunctions = append(query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) + } + + if q.TypeID != 0 && q.Type != "all" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID}) + } + + query.Joins = []queryUtils.Join{ + { + Type: "LEFT", + Table: "daftar_spesialis", + Alias: "ds", + OnConditions: queryUtils.FilterGroup{ + Filters: []queryUtils.DynamicFilter{ + { + Column: "ds.id", Operator: queryUtils.OpEqual, Value: "dpo.Spesialis", + }, + }, + }, + }, + { + Type: "LEFT", + Table: "daftar_subspesialis", + Alias: "dss", + OnConditions: queryUtils.FilterGroup{ + Filters: []queryUtils.DynamicFilter{ + { + Column: "dpo.Sub_spesialis", Operator: queryUtils.OpEqual, Value: "dss.id", + }, + }, + }, + }, + { + Type: "LEFT", + Table: "daftar_kategori_operasi", + Alias: "dko", + OnConditions: queryUtils.FilterGroup{ + Filters: []queryUtils.DynamicFilter{ + { + Column: "dpo.Kategori_operasi", Operator: queryUtils.OpEqual, Value: "dko.id", + }, + }, + }, + }, + } + + // filtering search results + if q.Search != "" { + searchFilters := []queryUtils.DynamicFilter{ + {Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + {Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + {Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + } + + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"}) + } + + if q.Status != "" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: q.Status}) + } + + // wiring all select filter + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: selectFilter, LogicOp: "AND"}) + + // query count + countData, err := r.queryBuilder.ExecuteCount(c, dbconn, query) + if err != nil { + log.Printf("Unable to execute query count : %s ", err) + return result, err + } + result.Paging.Limit = q.Limit + result.Paging.Offset = q.Offset + result.Paging.Total = int(countData) + result.Paging.CalculatePagingInfo() + + // query data + queryData := query + queryData.Limit = q.Limit + queryData.Offset = q.Offset + err = r.queryBuilder.ExecuteQuery( + c, dbconn, queryData, &result.Data) + if err != nil { + log.Printf("Unable to execute query data : %s", err) + return result, err + } + + return result, nil +} + +func (r antrianOperasiRepo) fixingListAntrian(c context.Context, dbconn *sqlx.DB, q AntrianQuery) (ListPasienOperasiPaginate, error) { + var result ListPasienOperasiPaginate + + numberedRowsName := "numbered" + + query := queryUtils.DynamicQuery{ + CTEs: []queryUtils.CTE{ + { + Name: numberedRowsName, + Query: queryUtils.DynamicQuery{ + Fields: []queryUtils.SelectField{ + {Expression: "dpo.id", Alias: "id"}, + {Expression: "dpo.Tanggal_daftar", Alias: "tanggal_daftar"}, + {Expression: "dpo.No_KTP", Alias: "no_ktp"}, + {Expression: "dpo.No_rekam_medis", Alias: "no_rekam_medis"}, + {Expression: "dpo.Nama_pasien", Alias: "nama_pasien"}, + {Expression: "dpo.Status_operasi", Alias: "status_operasi"}, + {Expression: "dpo.Jenis_kelamin", Alias: "jenis_kelamin"}, + {Expression: "ds.Spesialis", Alias: "spesialis"}, + {Expression: "dss.Subspesialis", Alias: "subspesialis"}, + {Expression: "dko.Kategori", Alias: "kategori"}, + }, + From: TBL_NAME, + Aliases: "dpo", + Joins: []queryUtils.Join{ + { + Type: "LEFT", + Table: "daftar_spesialis", + Alias: "ds", + OnConditions: queryUtils.FilterGroup{ + Filters: []queryUtils.DynamicFilter{ + { + Column: "ds.id", Operator: queryUtils.OpEqual, Value: "dpo.Spesialis", + }, + }, + }, + }, + { + Type: "LEFT", + Table: "daftar_subspesialis", + Alias: "dss", + OnConditions: queryUtils.FilterGroup{ + Filters: []queryUtils.DynamicFilter{ + { + Column: "dpo.Sub_spesialis", Operator: queryUtils.OpEqual, Value: "dss.id", + }, + }, + }, + }, + { + Type: "LEFT", + Table: "daftar_kategori_operasi", + Alias: "dko", + OnConditions: queryUtils.FilterGroup{ + Filters: []queryUtils.DynamicFilter{ + { + Column: "dpo.Kategori_operasi", Operator: queryUtils.OpEqual, Value: "dko.id", + }, + }, + }, + }, + }, + }, + }, + }, + Fields: []queryUtils.SelectField{ + {Expression: "id"}, + {Expression: "tanggal_daftar"}, + {Expression: "no_ktp"}, + {Expression: "no_rekam_medis"}, + {Expression: "nama_pasien"}, + {Expression: "status_operasi"}, + {Expression: "jenis_kelamin"}, + {Expression: "spesialis"}, + {Expression: "subspesialis"}, + {Expression: "kategori"}, + }, + From: numberedRowsName, + Sort: []queryUtils.SortField{ + {Column: "tanggal_daftar", Order: "ASC"}, + }, + } + + // windows functions + + wfKategori := queryUtils.WindowFunction{ + Function: "ROW_NUMBER", + Over: "\"dpo\".\"Kategori_operasi\"", + OrderBy: "\"dpo\".\"Tanggal_daftar\"", + Alias: "no_urut_kategori", + } + + wfSpesialis := queryUtils.WindowFunction{ + Function: "ROW_NUMBER", + Over: "\"dpo\".\"Spesialis\"", + OrderBy: "\"dpo\".\"Tanggal_daftar\", \"dpo\".\"date_created\", \"dpo\".\"date_updated\"", + Alias: "no_urut_spesialis", + } + wfSubSpesialis := queryUtils.WindowFunction{ + Function: "ROW_NUMBER", + Over: "\"dpo\".\"Sub_spesialis\"", + OrderBy: "\"dpo\".\"Tanggal_daftar\", \"dpo\".\"date_created\", \"dpo\".\"date_updated\"", + Alias: "no_urut_sub_spesialis", + } + + typeIdColumn := "" + + // selecting windows functions by type + + switch q.Type { + case "kategori": + typeIdColumn = "dko.id" + query.CTEs[0].Query.WindowFunctions = append(query.CTEs[0].Query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) + query.Fields = append(query.Fields, queryUtils.SelectField{Expression: "no_urut_kategori"}) + query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_kategori", Order: "ASC"}) + case "spesialis": + typeIdColumn = "ds.id" + query.CTEs[0].Query.WindowFunctions = append(query.CTEs[0].Query.WindowFunctions, wfSpesialis, wfSubSpesialis) + query.Fields = append(query.Fields, queryUtils.SelectField{Expression: "no_urut_spesialis"}) + query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_spesialis", Order: "ASC"}) + case "sub-spesialis": + typeIdColumn = "dss.id" + query.CTEs[0].Query.WindowFunctions = append(query.CTEs[0].Query.WindowFunctions, wfSubSpesialis) + query.Fields = append(query.Fields, queryUtils.SelectField{Expression: "no_urut_sub_spesialis"}) + query.Sort = append(query.Sort, queryUtils.SortField{Column: "no_urut_sub_spesialis", Order: "ASC"}) + default: + addedFields := []queryUtils.SelectField{ + {Expression: "no_urut_kategori"}, + {Expression: "no_urut_spesialis"}, + {Expression: "no_urut_sub_spesialis"}, + } + query.Fields = append(query.Fields, addedFields...) + query.CTEs[0].Query.WindowFunctions = append(query.CTEs[0].Query.WindowFunctions, wfKategori, wfSpesialis, wfSubSpesialis) + } + + // initiate count query + queryCount := query.CTEs[0].Query + + var selectFilter []queryUtils.DynamicFilter + var selectFilterCount []queryUtils.DynamicFilter + + if q.TypeID != 0 && q.Type != "all" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID}) + selectFilterCount = append(selectFilterCount, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID}) + } + + // filtering search results + if q.Search != "" { + // search filter main data + searchFilters := []queryUtils.DynamicFilter{ + {Column: "no_ktp", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + {Column: "no_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + {Column: "nama_pasien", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + } + + // search filter count + searchFiltersCount := []queryUtils.DynamicFilter{ + {Column: "dpo.No_KTP", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + {Column: "dpo.No_rekam_medis", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + {Column: "dpo.Nama_pasien", Operator: queryUtils.OpILike, Value: "%" + q.Search + "%"}, + } + + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"}) + queryCount.Filters = append(queryCount.Filters, queryUtils.FilterGroup{Filters: searchFiltersCount, LogicOp: "OR"}) + } + + if q.Status != "" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "status_operasi", Operator: queryUtils.OpEqual, Value: q.Status}) + selectFilterCount = append(selectFilterCount, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: q.Status}) + } + + // wiring all select filter + query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: selectFilter, LogicOp: "AND"}) + queryCount.Filters = append(queryCount.Filters, queryUtils.FilterGroup{Filters: selectFilterCount, LogicOp: "AND"}) + + countData, err := r.queryBuilder.ExecuteCount(c, dbconn, queryCount) + if err != nil { + log.Printf("Unable to execute query count : %s ", err) + return result, err + } + result.Paging.Limit = q.Limit + result.Paging.Offset = q.Offset + result.Paging.Total = int(countData) + result.Paging.CalculatePagingInfo() + + // query data + queryData := query + queryData.Limit = q.Limit + queryData.Offset = q.Offset + err = r.queryBuilder.ExecuteQuery( + c, dbconn, queryData, &result.Data) + if err != nil { + log.Printf("Unable to execute query data : %s", err) + return result, err + } + + return result, nil +}