From 83e1776f86057da3343793c3cc3c9c3ce0da81a8 Mon Sep 17 00:00:00 2001 From: renaldybrada Date: Tue, 3 Mar 2026 12:07:44 +0700 Subject: [PATCH] add gelar depan belakang --- internal/domain/antrian_operasi/model.go | 12 +- internal/domain/antrian_operasi/repository.go | 21 +++- internal/domain/antrian_operasi/response.go | 8 +- .../domain/reference/dokter/dokter_test.go | 6 +- internal/domain/reference/dokter/model.go | 19 ++- .../domain/reference/dokter/repository.go | 110 ++++++++++++++++++ internal/domain/reference/dokter/response.go | 7 +- 7 files changed, 165 insertions(+), 18 deletions(-) diff --git a/internal/domain/antrian_operasi/model.go b/internal/domain/antrian_operasi/model.go index 65d40ce..bbe5947 100644 --- a/internal/domain/antrian_operasi/model.go +++ b/internal/domain/antrian_operasi/model.go @@ -50,11 +50,13 @@ type TeleponPasienModel struct { } type DokterOperasiModel struct { - ID string `db:"id"` - Nip sql.NullString `db:"nip"` - NamaDepan sql.NullString `db:"nama_depan"` - NamaBelakang sql.NullString `db:"nama_belakang"` - SatuanKerja string `db:"satker"` + ID string `db:"id"` + Nip sql.NullString `db:"nip"` + NamaDepan sql.NullString `db:"nama_depan"` + NamaBelakang sql.NullString `db:"nama_belakang"` + SatuanKerja string `db:"satker"` + GelarDepan []string + GelarBelakang []string } type DetailPasienOperasi struct { diff --git a/internal/domain/antrian_operasi/repository.go b/internal/domain/antrian_operasi/repository.go index bed9b9a..0b9a32d 100644 --- a/internal/domain/antrian_operasi/repository.go +++ b/internal/domain/antrian_operasi/repository.go @@ -2,6 +2,7 @@ package antrianoperasi import ( "antrian-operasi/internal/database" + "antrian-operasi/internal/domain/reference/dokter" "antrian-operasi/internal/shared" queryUtils "antrian-operasi/internal/utils/query" "database/sql" @@ -580,6 +581,7 @@ func (r antrianOperasiRepo) GetAntrianOperasiById(c context.Context, id string) } // query dokter + var resultDokterModel []dokter.DokterModel queryDokter := queryUtils.DynamicQuery{ From: TBL_DOKTER_OPERASI, Aliases: "dpodp", @@ -588,7 +590,7 @@ func (r antrianOperasiRepo) GetAntrianOperasiById(c context.Context, id string) {Expression: "dp.NIP", Alias: "nip"}, {Expression: "dp.Nama_depan", Alias: "nama_depan"}, {Expression: "dp.Nama_belakang", Alias: "nama_belakang"}, - {Expression: "dk.Nama_ksm", Alias: "satker"}, + {Expression: "dk.Nama_ksm", Alias: "nama_ksm"}, }, Filters: []queryUtils.FilterGroup{ { @@ -625,12 +627,27 @@ func (r antrianOperasiRepo) GetAntrianOperasiById(c context.Context, id string) }, } - err = r.queryBuilder.ExecuteQuery(c, dbconn, queryDokter, &result.ResultDokterOperasi) + err = r.queryBuilder.ExecuteQuery(c, dbconn, queryDokter, &resultDokterModel) if err != nil { log.Printf("Unable to execute dokter query : %s", err) return result, err } + //fetch gelar + resultDokterModel = dokter.FetchGelar(c, r.queryBuilder, dbconn, resultDokterModel) + + //map to result.ResultDokterOperasi + for _, dokter := range resultDokterModel { + result.ResultDokterOperasi = append(result.ResultDokterOperasi, DokterOperasiModel{ + ID: dokter.ID, + Nip: shared.NullString(dokter.Nip), + NamaBelakang: shared.NullString(dokter.NamaBelakang.String), + NamaDepan: shared.NullString(dokter.NamaDepan.String), + GelarDepan: dokter.GelarDepan, + GelarBelakang: dokter.GelarBelakang, + }) + } + return result, nil } diff --git a/internal/domain/antrian_operasi/response.go b/internal/domain/antrian_operasi/response.go index f0ba6cb..f63beda 100644 --- a/internal/domain/antrian_operasi/response.go +++ b/internal/domain/antrian_operasi/response.go @@ -80,7 +80,13 @@ func (model DetailPasienOperasiResultQuery) MapToResponse() DetailPasienOperasiR } for _, dk := range model.ResultDokterOperasi { - joinedName := strings.ToUpper(dk.NamaDepan.String) + " " + strings.ToUpper(dk.NamaBelakang.String) + namaDepan := strings.ToUpper(dk.NamaDepan.String) + namaBelakang := strings.ToUpper(dk.NamaBelakang.String) + gelarDepan := strings.Join(dk.GelarDepan, " ") + gelarBelakang := strings.Join(dk.GelarBelakang, ", ") + + joinedName := gelarDepan + " " + namaDepan + " " + namaBelakang + " " + gelarBelakang + result.DokterPelaksanaItems = append(result.DokterPelaksanaItems, DokterPelaksanaItemRequest{ Id: dk.ID, Nip: &dk.Nip.String, diff --git a/internal/domain/reference/dokter/dokter_test.go b/internal/domain/reference/dokter/dokter_test.go index 38fd134..9696849 100644 --- a/internal/domain/reference/dokter/dokter_test.go +++ b/internal/domain/reference/dokter/dokter_test.go @@ -38,9 +38,9 @@ func TestParsingDokter(t *testing.T) { func TestParsingListDokter(t *testing.T) { listModel := ListDokterModel{ - DokterModel{"test-id-1", "test-nip-1", shared.NullString("A"), shared.NullString("B"), sql.NullString{}, "test-ksm-1"}, - DokterModel{"test-id-2", "test-nip-2", shared.NullString("C"), shared.NullString("D"), sql.NullString{}, "test-ksm-2"}, - DokterModel{"test-id-3", "test-nip-3", shared.NullString("E"), shared.NullString("F"), sql.NullString{}, "test-ksm-3"}, + DokterModel{"test-id-1", "test-nip-1", shared.NullString("A"), shared.NullString("B"), sql.NullString{}, "test-ksm-1", []string{}, []string{}}, + DokterModel{"test-id-2", "test-nip-2", shared.NullString("C"), shared.NullString("D"), sql.NullString{}, "test-ksm-2", []string{}, []string{}}, + DokterModel{"test-id-3", "test-nip-3", shared.NullString("E"), shared.NullString("F"), sql.NullString{}, "test-ksm-3", []string{}, []string{}}, } t.Run("test length model list and list response", func(t *testing.T) { diff --git a/internal/domain/reference/dokter/model.go b/internal/domain/reference/dokter/model.go index 4819cdb..cb95c24 100644 --- a/internal/domain/reference/dokter/model.go +++ b/internal/domain/reference/dokter/model.go @@ -6,12 +6,19 @@ import ( ) type DokterModel struct { - ID string `json:"id" db:"id"` - Nip string `json:"nip" db:"nip"` - NamaDepan sql.NullString `json:"nama_depan" db:"nama_depan"` - NamaBelakang sql.NullString `json:"nama_belakang" db:"nama_belakang"` - HfisCode sql.NullString `json:"hfis_code" db:"hfis_code"` - NamaKsm string `json:"nama_ksm" db:"nama_ksm"` + ID string `json:"id" db:"id"` + Nip string `json:"nip" db:"nip"` + NamaDepan sql.NullString `json:"nama_depan" db:"nama_depan"` + NamaBelakang sql.NullString `json:"nama_belakang" db:"nama_belakang"` + HfisCode sql.NullString `json:"hfis_code" db:"hfis_code"` + NamaKsm string `json:"nama_ksm" db:"nama_ksm"` + GelarDepan []string + GelarBelakang []string +} + +type GelarModel struct { + Gelar string `db:"gelar"` + IDDokter string `db:"id_dokter"` } type DokterResponse struct { diff --git a/internal/domain/reference/dokter/repository.go b/internal/domain/reference/dokter/repository.go index eb42612..34768ef 100644 --- a/internal/domain/reference/dokter/repository.go +++ b/internal/domain/reference/dokter/repository.go @@ -9,10 +9,16 @@ import ( queryUtils "antrian-operasi/internal/utils/query" "context" + + "github.com/jmoiron/sqlx" ) const DB_NAME = "db_antrian" const TBL_NAME = "data_pegawai" +const TBL_GELAR_DEPAN = "daftar_gelar_depan" +const TBL_GELAR_BELAKANG = "daftar_gelar_belakang" +const TBL_RELASI_GELAR_DEPAN = "data_pegawai_daftar_gelar_depan" +const TBL_RELASI_GELAR_BLKG = "data_pegawai_daftar_gelar_belakang" type IDokterRepository interface { SearchableListDokter(c context.Context, search string, limit int, offset int) (ListDokterModelPaginate, error) @@ -74,6 +80,108 @@ func baseSelectQuery() queryUtils.DynamicQuery { return query } +func FetchGelar(c context.Context, qb *queryUtils.QueryBuilder, dbconn *sqlx.DB, listDokter []DokterModel) []DokterModel { + var listGelarDepan []GelarModel + var listGelarBelakang []GelarModel + + dokterIds := make([]string, 0, len(listDokter)) + for _, dokter := range listDokter { + dokterIds = append(dokterIds, dokter.ID) + } + + queryGelarDepan := queryUtils.DynamicQuery{ + Fields: []queryUtils.SelectField{ + {Expression: "rgd.data_pegawai_id", Alias: "id_dokter"}, + {Expression: "gd.Gelar_depan", Alias: "gelar"}, + }, + From: TBL_RELASI_GELAR_DEPAN, + Aliases: "rgd", + Joins: []queryUtils.Join{ + { + Type: "LEFT", + Table: TBL_GELAR_DEPAN, + Alias: "gd", + OnConditions: queryUtils.FilterGroup{ + Filters: []queryUtils.DynamicFilter{ + { + Column: "gd.id", Operator: queryUtils.OpEqual, Value: "rgd.daftar_gelar_depan_id", + }, + }, + }, + }, + }, + Filters: []queryUtils.FilterGroup{ + { + Filters: []queryUtils.DynamicFilter{ + { + Column: "rgd.data_pegawai_id", Operator: queryUtils.OpIn, Value: dokterIds, + }, + }, + }, + }, + } + + queryGelarBelakang := queryUtils.DynamicQuery{ + Fields: []queryUtils.SelectField{ + {Expression: "rgb.data_pegawai_id", Alias: "id_dokter"}, + {Expression: "gb.Gelar_belakang", Alias: "gelar"}, + }, + From: TBL_RELASI_GELAR_BLKG, + Aliases: "rgb", + Joins: []queryUtils.Join{ + { + Type: "LEFT", + Table: TBL_GELAR_BELAKANG, + Alias: "gb", + OnConditions: queryUtils.FilterGroup{ + Filters: []queryUtils.DynamicFilter{ + { + Column: "gb.id", Operator: queryUtils.OpEqual, Value: "rgb.daftar_gelar_belakang_id", + }, + }, + }, + }, + }, + Filters: []queryUtils.FilterGroup{ + { + Filters: []queryUtils.DynamicFilter{ + { + Column: "rgb.data_pegawai_id", Operator: queryUtils.OpIn, Value: dokterIds, + }, + }, + }, + }, + } + + err := qb.ExecuteQuery(c, dbconn, queryGelarDepan, &listGelarDepan) + if err != nil { + return listDokter + } + + err = qb.ExecuteQuery(c, dbconn, queryGelarBelakang, &listGelarBelakang) + if err != nil { + return listDokter + } + + mapGelarDepan := make(map[string][]string) + mapGelarBelakang := make(map[string][]string) + for _, g := range listGelarDepan { + mapGelarDepan[g.IDDokter] = append(mapGelarDepan[g.IDDokter], g.Gelar) + } + + for _, g := range listGelarBelakang { + mapGelarBelakang[g.IDDokter] = append(mapGelarBelakang[g.IDDokter], g.Gelar) + } + + for idx := range listDokter { + listDokter[idx].GelarDepan = mapGelarDepan[listDokter[idx].ID] + listDokter[idx].GelarBelakang = mapGelarBelakang[listDokter[idx].ID] + } + + return listDokter + +} + func (r dokterRepo) SearchableListDokter(c context.Context, search string, limit int, offset int) (ListDokterModelPaginate, error) { var result ListDokterModelPaginate @@ -128,6 +236,8 @@ func (r dokterRepo) SearchableListDokter(c context.Context, search string, limit return result, err } + result.Data = FetchGelar(c, r.queryBuilder, dbconn, result.Data) + return result, nil } diff --git a/internal/domain/reference/dokter/response.go b/internal/domain/reference/dokter/response.go index a0e4257..80f42c9 100644 --- a/internal/domain/reference/dokter/response.go +++ b/internal/domain/reference/dokter/response.go @@ -8,10 +8,15 @@ func DokterRowToResponse(row DokterModel) DokterResponse { hfis = &row.HfisCode.String } + namaDepan := strings.ToUpper(row.NamaDepan.String) + namaBelakang := strings.ToUpper(row.NamaBelakang.String) + gelarDepan := strings.Join(row.GelarDepan, " ") + gelarBelakang := strings.Join(row.GelarBelakang, ", ") + return DokterResponse{ ID: row.ID, Nip: row.Nip, - NamaLengkap: strings.ToUpper(row.NamaDepan.String) + " " + strings.ToUpper(row.NamaBelakang.String), + NamaLengkap: gelarDepan + " " + namaDepan + " " + namaBelakang + " " + gelarBelakang, HfisCode: hfis, NamaKsm: row.NamaKsm, }