diff --git a/internal/domain/antrian_operasi/handler.go b/internal/domain/antrian_operasi/handler.go index 697dee6..9634678 100644 --- a/internal/domain/antrian_operasi/handler.go +++ b/internal/domain/antrian_operasi/handler.go @@ -65,10 +65,12 @@ func (h AntrianOperasiHandler) CreateAntrianOperasi(c *gin.Context) { res, err := h.repo.CreateAntrianOperasi(c, req) if err != nil { log.Printf("insert error : %s", err) + errMessage := []string{err.Error()} c.JSON(500, shared.BaseErrorResponse{ Success: false, Code: 500, Message: "insert error", + Errors: errMessage, }) return } diff --git a/internal/domain/antrian_operasi/model.go b/internal/domain/antrian_operasi/model.go index cd9a346..c8dbcf7 100644 --- a/internal/domain/antrian_operasi/model.go +++ b/internal/domain/antrian_operasi/model.go @@ -13,17 +13,25 @@ type PasienOperasi struct { NamaPasien *string `db:"nama_pasien"` Spesialis *string `db:"spesialis"` SubSpesialis *string `db:"subspesialis"` - KodeDiagnosa *string `db:"kode_diagnosa"` - Diagnosa *string `db:"diagnosa"` - Kategori *string `db:"kategori"` - StatusOperasi *string `db:"status_operasi"` - JenisKelamin *string `db:"jenis_kelamin"` - NoUrutKategori int `db:"no_urut_kategori"` - NoUrutSpesialis int `db:"no_urut_spesialis"` - NoUrutSubSpesialis int `db:"no_urut_sub_spesialis"` + Diagnosa []string + Tindakan *string + Kategori *string `db:"kategori"` + StatusOperasi *string `db:"status_operasi"` + JenisKelamin *string `db:"jenis_kelamin"` + NoUrutKategori int `db:"no_urut_kategori"` + NoUrutSpesialis int `db:"no_urut_spesialis"` + NoUrutSubSpesialis int `db:"no_urut_sub_spesialis"` } type ListPasienOperasiPaginate struct { Data []PasienOperasi Paging shared.PaginationInfo } + +type DiagnosaOperasiModel struct { + ID string `db:"id"` + KodeDiagnosa string `db:"Kode_diagnosa"` + Diagnosa string `db:"Diagnosa"` + JenisDiagnosa string `db:"Jenis_diagnosa"` + AntrianId string `db:"antrian_id"` +} diff --git a/internal/domain/antrian_operasi/repository.go b/internal/domain/antrian_operasi/repository.go index e8b97c3..4a3cfc5 100644 --- a/internal/domain/antrian_operasi/repository.go +++ b/internal/domain/antrian_operasi/repository.go @@ -15,6 +15,7 @@ import ( const DB_NAME = "db_antrian" const TBL_NAME = "data_pasien_operasi" +const TBL_DIAGNOSA_OPERASI = "data_diagnosa_pasien_operasi" type IAntrianOperasiRepository interface { CreateAntrianOperasi(c *gin.Context, req CreatePasienOperasiRequest) (CreatePasienOperasiRequest, error) @@ -36,10 +37,11 @@ func NewRepository(dbService database.Service) IAntrianOperasiRepository { "\"Nomor_spesialis\"", "\"Nomor_sub_spesialis\"", "\"Nomor_telepon\"", "\"FK_pasien_operasi_telepon_pasien_operasi_ID\"", - "\"Kode_diagnosa\"", "\"Diagnosa\"", "\"Jenis_diagnosa\"", "\"FK_pasien_operasi_diagnosa_pasien_operasi_ID\"", + "\"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\"", "\"data_pasien_operasi_id\"", "\"data_pegawai_id\"", - }) + }). + SetAllowedTables([]string{TBL_NAME, TBL_DIAGNOSA_OPERASI}) queryBuilder.SetSecurityOptions(false, 100) return antrianOperasiRepo{ @@ -298,8 +300,6 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa {Expression: "dpo.Jenis_kelamin", Alias: "jenis_kelamin"}, {Expression: "ds.Spesialis", Alias: "spesialis"}, {Expression: "dss.Subspesialis", Alias: "subspesialis"}, - {Expression: "ddpo.Kode_diagnosa", Alias: "kode_diagnosa"}, - {Expression: "ddpo.Diagnosa", Alias: "diagnosa"}, {Expression: "dko.Kategori", Alias: "kategori"}, }, Sort: []queryUtils.SortField{ @@ -384,18 +384,6 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa }, }, }, - { - Type: "LEFT", - Table: "data_diagnosa_pasien_operasi", - Alias: "ddpo", - OnConditions: queryUtils.FilterGroup{ - Filters: []queryUtils.DynamicFilter{ - { - Column: "dpo.id", Operator: queryUtils.OpEqual, Value: "ddpo.FK_pasien_operasi_diagnosa_pasien_operasi_ID", - }, - }, - }, - }, } // filtering search results @@ -444,5 +432,48 @@ func (r antrianOperasiRepo) SearchableListAntrianOperasi(c *gin.Context) (ListPa return result, err } + // filtering antrian ids + var antrianIds []string + for _, item := range result.Data { + antrianIds = append(antrianIds, item.ID) + } + + // query additional data + queryDiagnosa := queryUtils.DynamicQuery{ + From: TBL_DIAGNOSA_OPERASI, + Aliases: "ddpo", + Fields: []queryUtils.SelectField{ + {Expression: "id", Alias: "id"}, + {Expression: "Kode_diagnosa", Alias: "Kode_diagnosa"}, + {Expression: "Diagnosa", Alias: "Diagnosa"}, + {Expression: "Jenis_diagnosa", Alias: "Jenis_diagnosa"}, + {Expression: "FK_pasien_operasi_diagnosa_pasien_operasi_ID", Alias: "antrian_id"}, + }, + Filters: []queryUtils.FilterGroup{ + { + Filters: []queryUtils.DynamicFilter{ + {Column: "FK_pasien_operasi_diagnosa_pasien_operasi_ID", Operator: queryUtils.OpIn, Value: antrianIds}, + }, LogicOp: "AND", + }, + }, + } + + var resultDiagnosa []DiagnosaOperasiModel + err = r.queryBuilder.ExecuteQuery(c, dbconn, queryDiagnosa, &resultDiagnosa) + if err != nil { + log.Printf("Unable to execute query diagnosa : %s", err) + return result, err + } + + // attach support data to parent + shared.MapChildToParent( + result.Data, resultDiagnosa, + func(o *PasienOperasi) string { return o.ID }, + func(d DiagnosaOperasiModel) string { return d.AntrianId }, + func(o *PasienOperasi, d DiagnosaOperasiModel) { + o.Diagnosa = append(o.Diagnosa, d.Diagnosa) + }, + ) + return result, nil } diff --git a/internal/shared/map.go b/internal/shared/map.go new file mode 100644 index 0000000..5494ef2 --- /dev/null +++ b/internal/shared/map.go @@ -0,0 +1,21 @@ +package shared + +func MapChildToParent[P any, C any, K comparable]( + parents []P, + children []C, + parentKey func(*P) K, + childKey func(C) K, + attach func(*P, C), +) { + index := make(map[K]*P) + + for i := range parents { + index[parentKey(&parents[i])] = &parents[i] + } + + for _, c := range children { + if p, ok := index[childKey(c)]; ok { + attach(p, c) + } + } +}