From bf18bf8b682afe976a5dea6fe70b7ee3f462ea75 Mon Sep 17 00:00:00 2001 From: renaldybrada Date: Thu, 5 Mar 2026 13:32:19 +0700 Subject: [PATCH] change nomor urutan method. adjustment create and update status functions --- internal/domain/antrian_operasi/repository.go | 264 +++++++++++++++++- 1 file changed, 260 insertions(+), 4 deletions(-) diff --git a/internal/domain/antrian_operasi/repository.go b/internal/domain/antrian_operasi/repository.go index 65a16de..6b15d6f 100644 --- a/internal/domain/antrian_operasi/repository.go +++ b/internal/domain/antrian_operasi/repository.go @@ -97,13 +97,13 @@ func (r antrianOperasiRepo) CreateAntrianOperasi(c context.Context, req CreatePa req.RencanaOperasiData.KategoriOperasi, req.RencanaOperasiData.RencanaOperasi, "1", - 1, // nomor + 0, // nomor req.RencanaOperasiData.Spesialis, req.RencanaOperasiData.SubSpesialis, req.RencanaOperasiData.Keterangan, req.StatusPasienData.KeteranganStatus, - req.RencanaOperasiData.Spesialis, - req.RencanaOperasiData.SubSpesialis, + 0, + 0, }, } returningCols := []string{ @@ -141,7 +141,8 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c context.Context, q An return result, err } - result, err = r.getNumberedListAntrian(c, dbconn, q) + // result, err = r.getNumberedListAntrian(c, dbconn, q) + result, err = r.getNumberedListAntrianV2(c, dbconn, q) if err != nil { return result, nil } @@ -838,6 +839,7 @@ func (r antrianOperasiRepo) deleteAntrianChildTables(c context.Context, tx *sql. return nil } +// this function is unused, soon should be deleted. Change to getNumberedListAntrianV2 func (r antrianOperasiRepo) getNumberedListAntrian(c context.Context, dbconn *sqlx.DB, q AntrianQuery) (ListPasienOperasiPaginate, error) { var result ListPasienOperasiPaginate @@ -1052,3 +1054,257 @@ func (r antrianOperasiRepo) getNumberedListAntrian(c context.Context, dbconn *sq return result, nil } + +func (r antrianOperasiRepo) getNumberedListAntrianV2(c context.Context, dbconn *sqlx.DB, q AntrianQuery) (ListPasienOperasiPaginate, error) { + var result ListPasienOperasiPaginate + + // Base Query + baseQuery := queryUtils.DynamicQuery{ + From: TBL_NAME, + Aliases: "dpo", + 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"}, + {Expression: "dpo.Nomor", Alias: "no_urut_kategori"}, + {Expression: "dpo.Nomor_spesialis", Alias: "no_urut_spesialis"}, + {Expression: "dpo.Nomor_sub_spesialis", Alias: "no_urut_sub_spesialis"}, + }, + 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", + }, + }, + }, + }, + }, + } + + // Set Condition based on request query + if q.Search != "" { + // search filter + 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 + "%"}, + } + + baseQuery.Filters = append(baseQuery.Filters, queryUtils.FilterGroup{Filters: searchFilters, LogicOp: "OR"}) + } + + var selectFilter []queryUtils.DynamicFilter + typeIdColumn := "" + + switch q.Type { + case "kategori": + typeIdColumn = "dpo.Kategori_operasi" + case "spesialis": + typeIdColumn = "dpo.Spesialis" + case "sub-spesialis": + typeIdColumn = "dpo.Sub_spesialis" + } + + if q.TypeID != 0 && q.Type != "all" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: typeIdColumn, Operator: queryUtils.OpEqual, Value: q.TypeID}) + } + + if q.Status != "" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: q.Status}) + } + + if q.Id != "" { + selectFilter = append(selectFilter, queryUtils.DynamicFilter{Column: "dpo.id", Operator: queryUtils.OpEqual, Value: q.Id}) + } + + // wiring all select filter + baseQuery.Filters = append(baseQuery.Filters, queryUtils.FilterGroup{Filters: selectFilter, LogicOp: "AND"}) + + // SET SORTING BASE QUERY + if q.SortBy != "" && q.SortOrder != "" { + baseQuery.Sort = append(baseQuery.Sort, queryUtils.SortField{Column: q.SortBy, Order: q.SortOrder}) + } else { + baseQuery.Sort = append(baseQuery.Sort, queryUtils.SortField{Column: "dpo.Tanggal_daftar", Order: "ASC"}) + } + + // execute base query count + if q.Id == "" { + countData, err := r.queryBuilder.ExecuteCount(c, dbconn, baseQuery) + 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() + } + + // execute base query data + queryData := baseQuery + 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 + } + + // Map Result Base Query ID, Status = Belum + statusBelumIds := []string{} + for _, row := range result.Data { + if *row.StatusOperasi == "1" { + statusBelumIds = append(statusBelumIds, row.ID) + } + } + + // fetch numbered list status = 'Belum' + numberedListBelum, err := r.getNumberedListBelumByIds(c, dbconn, statusBelumIds) + if err != nil { + return result, err + } + + // parse numbered list belum into map + numberedListBelumMap := make(map[string]PasienOperasi) + for _, row := range numberedListBelum { + numberedListBelumMap[row.ID] = row + } + + // Map no antrian result (status = belum) + for idx := range result.Data { + statusBelum := "1" + statusTunda := "3" + statusBatal := "4" + + currentRow := result.Data[idx] + if *currentRow.StatusOperasi == statusBelum { + result.Data[idx].NoUrutKategori = numberedListBelumMap[result.Data[idx].ID].NoUrutKategori + result.Data[idx].NoUrutSpesialis = numberedListBelumMap[result.Data[idx].ID].NoUrutSpesialis + result.Data[idx].NoUrutSubSpesialis = numberedListBelumMap[result.Data[idx].ID].NoUrutSubSpesialis + } + + if *currentRow.StatusOperasi == statusTunda || *currentRow.StatusOperasi == statusBatal { + result.Data[idx].NoUrutKategori = 0 + result.Data[idx].NoUrutSpesialis = 0 + result.Data[idx].NoUrutSubSpesialis = 0 + } + + } + + return result, nil +} + +func (r antrianOperasiRepo) getNumberedListBelumByIds(c context.Context, dbconn *sqlx.DB, ids []string) ([]PasienOperasi, error) { + var result []PasienOperasi + + if len(ids) == 0 { + return result, nil + } + + query := ` + WITH numberedStatusBelum AS ( + SELECT + dpo.id AS id, + dko.id AS id_kategori, + ds.id AS id_spesialis, + dss.id AS id_subspesialis, + dpo."Tanggal_daftar" AS tanggal_daftar, + dpo."No_KTP" AS no_ktp, + dpo."No_rekam_medis" AS no_rekam_medis, + dpo."Nama_pasien" AS nama_pasien, + dpo."Status_operasi" AS status_operasi, + dpo."Jenis_kelamin" AS jenis_kelamin, + ds."Spesialis" AS spesialis, + dss."Subspesialis" AS subspesialis, + dko."Kategori" AS kategori, + + ROW_NUMBER() OVER ( + PARTITION BY dpo."Kategori_operasi" + ORDER BY dpo."Tanggal_daftar" + ) AS no_urut_kategori, + + ROW_NUMBER() OVER ( + PARTITION BY dpo."Spesialis" + ORDER BY dpo."Tanggal_daftar", dpo.date_created, dpo.date_updated + ) AS no_urut_spesialis, + + ROW_NUMBER() OVER ( + PARTITION BY dpo."Sub_spesialis" + ORDER BY dpo."Tanggal_daftar", dpo.date_created, dpo.date_updated + ) AS no_urut_sub_spesialis + + FROM data_pasien_operasi dpo + LEFT JOIN daftar_spesialis ds ON ds.id = dpo."Spesialis" + LEFT JOIN daftar_subspesialis dss ON dpo."Sub_spesialis" = dss.id + LEFT JOIN daftar_kategori_operasi dko ON dpo."Kategori_operasi" = dko.id + WHERE dpo."Status_operasi" = ? + ) + + SELECT + id, + tanggal_daftar, + no_ktp, + no_rekam_medis, + nama_pasien, + status_operasi, + jenis_kelamin, + spesialis, + subspesialis, + kategori, + no_urut_kategori, + no_urut_spesialis, + no_urut_sub_spesialis + FROM numberedStatusBelum + WHERE id IN (?) + ` + query, args, err := sqlx.In(query, "1", ids) + if err != nil { + return nil, err + } + + query = dbconn.Rebind(query) + + err = dbconn.SelectContext(c, &result, query, args...) + if err != nil { + return nil, err + } + + return result, nil +}