package dashboard import ( "sort" "time" ) type AntrianPerKategori struct { IdKategori int `db:"Kategori_operasi" json:"id_kategori"` Kategori string `db:"Kategori" json:"kategori"` JmlAntrian int `db:"jumlah_antrean" json:"jumlah_antrean"` } type AntrianPerSpesialisModel struct { IdSpesialis int `db:"id_spesialis"` Spesialis string `db:"Spesialis"` IdSubSpesialis int `db:"id_subspesialis"` SubSpesialis string `db:"Subspesialis"` JmlAntrian int `db:"jml_antrian"` } type AntrianPerSpesialisResponse struct { IdSpesialis int Spesialis string JmlAntrian int SubSpesialis []AntrianPerSubSpesialisResponse } type AntrianPerSubSpesialisResponse struct { IdSubSpesialis int SubSpesialis string JmlAntrian int } type PerbandinganStatusAntreanQueryResult struct { IdStatus int `db:"status_operasi"` Jumlah int `db:"jumlah"` } type PerbandinganStatusAntreanResponse struct { IdStatus int `json:"id"` Jumlah int `json:"jumlah"` Status string `json:"statust"` } type PerbandinganKategoriAntrean struct { IdKategori int `db:"id_kategori" json:"id_kategori"` Kategori string `db:"kategori" json:"kategori"` Jumlah int `db:"jumlah" json:"jumlah"` } type AntrianPerHari struct { TanggalDaftar time.Time `db:"tanggal_daftar"` Belum int `db:"belum"` Selesai int `db:"selesai"` Tunda int `db:"tunda"` Batal int `db:"batal"` } type AntrianPerHariResponse struct { TanggalDaftar string Belum int Selesai int Tunda int Batal int } type TableAntreanPerSpesialis struct { Spesialis string `db:"spesialis"` Total int `db:"total"` Belum int `db:"belum"` Selesai int `db:"selesai"` Tunda int `db:"tunda"` Batal int `db:"batal"` } type TableAntreanPerSubSpesialis struct { Spesialis string `db:"spesialis"` SubSpesialis string `db:"sub_spesialis"` Total int `db:"total"` Belum int `db:"belum"` Selesai int `db:"selesai"` Tunda int `db:"tunda"` Batal int `db:"batal"` } type ListModelAntrianPerSpesialis []AntrianPerSpesialisModel func (list ListModelAntrianPerSpesialis) ParseToResponse() []AntrianPerSpesialisResponse { resultMap := make(map[string]*AntrianPerSpesialisResponse) for _, item := range list { // check if spesialis already on resultMap // if not exist, create antrian spesialis response if _, ok := resultMap[item.Spesialis]; !ok { resultMap[item.Spesialis] = &AntrianPerSpesialisResponse{ IdSpesialis: item.IdSpesialis, Spesialis: item.Spesialis, JmlAntrian: 0, SubSpesialis: []AntrianPerSubSpesialisResponse{}, } } // add subspesialis item resultMap[item.Spesialis].SubSpesialis = append( resultMap[item.Spesialis].SubSpesialis, AntrianPerSubSpesialisResponse{ IdSubSpesialis: item.IdSubSpesialis, SubSpesialis: item.SubSpesialis, JmlAntrian: item.JmlAntrian, }, ) // accumulate jmlAntrian subspesialis -> total antrian spesialis resultMap[item.Spesialis].JmlAntrian += item.JmlAntrian } // sort by spesialis name ascending keys := make([]string, 0, len(resultMap)) for k := range resultMap { keys = append(keys, resultMap[k].Spesialis) } sort.Strings(keys) // convert map -> slice result := make([]AntrianPerSpesialisResponse, 0, len(resultMap)) for _, v := range keys { result = append(result, *resultMap[v]) } return result }