diff --git a/docs/docs.go b/docs/docs.go index d918f04..f145a15 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -206,6 +206,47 @@ const docTemplate = `{ } } }, + "/dashboard/antrian-per-hari/": { + "get": { + "tags": [ + "Dashboard" + ], + "summary": "Get Antrian per Hari", + "parameters": [ + { + "type": "integer", + "description": "tahun dalam int", + "name": "year", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "bulan dalam int", + "name": "month", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dashboard.AntrianPerHari" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/shared.BaseErrorResponse" + } + } + } + } + }, "/dashboard/antrian-per-kategori/": { "get": { "tags": [ @@ -960,6 +1001,26 @@ const docTemplate = `{ } } }, + "dashboard.AntrianPerHari": { + "type": "object", + "properties": { + "batal": { + "type": "integer" + }, + "belum": { + "type": "integer" + }, + "selesai": { + "type": "integer" + }, + "tanggalDaftar": { + "type": "string" + }, + "tunda": { + "type": "integer" + } + } + }, "dashboard.AntrianPerKategori": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index 8e76455..5dd375c 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -200,6 +200,47 @@ } } }, + "/dashboard/antrian-per-hari/": { + "get": { + "tags": [ + "Dashboard" + ], + "summary": "Get Antrian per Hari", + "parameters": [ + { + "type": "integer", + "description": "tahun dalam int", + "name": "year", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "bulan dalam int", + "name": "month", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/dashboard.AntrianPerHari" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "$ref": "#/definitions/shared.BaseErrorResponse" + } + } + } + } + }, "/dashboard/antrian-per-kategori/": { "get": { "tags": [ @@ -954,6 +995,26 @@ } } }, + "dashboard.AntrianPerHari": { + "type": "object", + "properties": { + "batal": { + "type": "integer" + }, + "belum": { + "type": "integer" + }, + "selesai": { + "type": "integer" + }, + "tanggalDaftar": { + "type": "string" + }, + "tunda": { + "type": "integer" + } + } + }, "dashboard.AntrianPerKategori": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 8953346..340b5e5 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -195,6 +195,19 @@ definitions: - tindakan - tindakanTambahan type: object + dashboard.AntrianPerHari: + properties: + batal: + type: integer + belum: + type: integer + selesai: + type: integer + tanggalDaftar: + type: string + tunda: + type: integer + type: object dashboard.AntrianPerKategori: properties: id_kategori: @@ -538,6 +551,33 @@ paths: summary: Update Status Antrian Operasi tags: - Antrian Operasi + /dashboard/antrian-per-hari/: + get: + parameters: + - description: tahun dalam int + in: query + name: year + required: true + type: integer + - description: bulan dalam int + in: query + name: month + required: true + type: integer + responses: + "200": + description: OK + schema: + items: + $ref: '#/definitions/dashboard.AntrianPerHari' + type: array + "500": + description: Internal Server Error + schema: + $ref: '#/definitions/shared.BaseErrorResponse' + summary: Get Antrian per Hari + tags: + - Dashboard /dashboard/antrian-per-kategori/: get: responses: diff --git a/internal/domain/dashboard/handler.go b/internal/domain/dashboard/handler.go index d2cc874..2849f02 100644 --- a/internal/domain/dashboard/handler.go +++ b/internal/domain/dashboard/handler.go @@ -146,6 +146,47 @@ func (h DashboardHandler) GetPerbandinganKategoriAntrean(c *gin.Context) { c.JSON(http.StatusOK, response) } +// GetAntrianPerHari godoc +// @Summary Get Antrian per Hari +// @Tags Dashboard +// @Param year query int true "tahun dalam int" +// @Param month query int true "bulan dalam int" +// @Success 200 {object} []AntrianPerHari +// @Failure 500 {object} shared.BaseErrorResponse +// @Router /dashboard/antrian-per-hari/ [get] +func (h DashboardHandler) GetAntrianPerHari(c *gin.Context) { + var req PeriodeDashboardRequest + if err := c.ShouldBindQuery(&req); err != nil { + c.JSON(400, shared.BaseErrorResponse{ + Success: false, + Code: 400, + Message: "error bind json", + Errors: shared.ValidationError(err), + }) + return + } + + data, err := h.repo.GetAntrianPerHari(c, req) + + if err != nil { + errorResponse := baseResponse.BaseErrorResponse{ + Success: false, + Code: 500, + Message: err.Error(), + } + c.JSON(http.StatusInternalServerError, errorResponse) + return + } + + response := baseResponse.ToBaseResponse( + data, + true, + 200, + "success get antrean per hari") + + c.JSON(http.StatusOK, response) +} + // GetTableAntrianPerSpesialis godoc // @Summary Get Table Antrian per Spesialis // @Tags Dashboard diff --git a/internal/domain/dashboard/model.go b/internal/domain/dashboard/model.go index c188a87..4de1251 100644 --- a/internal/domain/dashboard/model.go +++ b/internal/domain/dashboard/model.go @@ -1,5 +1,7 @@ package dashboard +import "time" + type AntrianPerKategori struct { IdKategori int `db:"Kategori_operasi" json:"id_kategori"` Kategori string `db:"Kategori" json:"kategori"` @@ -44,6 +46,14 @@ type PerbandinganKategoriAntrean struct { 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 TableAntreanPerSpesialis struct { Spesialis string `db:"spesialis"` Total int `db:"total"` diff --git a/internal/domain/dashboard/repository.go b/internal/domain/dashboard/repository.go index 3954c9f..97a9f3e 100644 --- a/internal/domain/dashboard/repository.go +++ b/internal/domain/dashboard/repository.go @@ -17,6 +17,7 @@ type IDashboardRepository interface { GetAntrianPerSpesialis(c *gin.Context) (ListModelAntrianPerSpesialis, error) GetPerbandinganStatusAntrean(c *gin.Context, req PeriodeDashboardRequest) (ListPerbandinganStatusAntrean, error) GetPerbandinganKategoriAntrean(c *gin.Context, req PeriodeDashboardRequest) ([]PerbandinganKategoriAntrean, error) + GetAntrianPerHari(c *gin.Context, req PeriodeDashboardRequest) ([]AntrianPerHari, error) GetTableAntrianPerSpesialis(c *gin.Context, req PeriodeDashboardRequest) ([]TableAntreanPerSpesialis, error) GetTableAntrianPerSubSpesialis(c *gin.Context, req PeriodeDashboardRequest) ([]TableAntreanPerSubSpesialis, error) } @@ -238,6 +239,48 @@ func (r dashboardRepo) GetPerbandinganKategoriAntrean(c *gin.Context, req Period return result, nil } +func (r dashboardRepo) GetAntrianPerHari(c *gin.Context, req PeriodeDashboardRequest) ([]AntrianPerHari, error) { + var result []AntrianPerHari + + startDate, endDate := GenerateStartEndDate(req) + + query := queryUtils.DynamicQuery{ + From: TBL_NAME, + Aliases: "dpo", + Fields: []queryUtils.SelectField{ + {Expression: "DATE(dpo.\"Tanggal_daftar\")", Alias: "tanggal_daftar"}, + {Expression: "count(dpo.id) filter (where dpo.\"Status_operasi\" = ('1')) as belum"}, + {Expression: "count(dpo.id) filter (where dpo.\"Status_operasi\" = ('2')) as selesai"}, + {Expression: "count(dpo.id) filter (where dpo.\"Status_operasi\" = ('3')) as tunda"}, + {Expression: "count(dpo.id) filter (where dpo.\"Status_operasi\" = ('4')) as batal"}, + }, + Filters: []queryUtils.FilterGroup{ + { + Filters: []queryUtils.DynamicFilter{ + {Column: "dpo.Tanggal_daftar", Operator: queryUtils.OpBetween, Value: []string{startDate, endDate}}, + }, + }, + }, + GroupBy: []string{"DATE(dpo.\"Tanggal_daftar\")"}, + Sort: []queryUtils.SortField{ + {Column: "DATE(dpo.\"Tanggal_daftar\")", Order: "ASC"}, + }, + } + + dbconn, err := r.db.GetSQLXDB(DB_NAME) + if err != nil { + return result, err + } + + err = r.queryBuilder.ExecuteQuery( + c, dbconn, query, &result) + if err != nil { + return result, err + } + + return result, nil +} + func (r dashboardRepo) GetTableAntrianPerSpesialis(c *gin.Context, req PeriodeDashboardRequest) ([]TableAntreanPerSpesialis, error) { var result []TableAntreanPerSpesialis diff --git a/internal/domain/dashboard/routes.go b/internal/domain/dashboard/routes.go index 0fd1f30..c73a4e4 100644 --- a/internal/domain/dashboard/routes.go +++ b/internal/domain/dashboard/routes.go @@ -14,6 +14,7 @@ func RegisterRoutes(r *gin.RouterGroup, dbService database.Service) { r.GET("/antrian-per-spesialis", dashboardHandler.GetAntrianPerSpesialis) r.GET("/perbandingan-status-antrian", dashboardHandler.GetPerbandinganStatusAntrean) r.GET("/perbandingan-kategori-antrian", dashboardHandler.GetPerbandinganKategoriAntrean) + r.GET("/antrian-per-hari", dashboardHandler.GetAntrianPerHari) r.GET("/table-antrian-per-spesialis", dashboardHandler.GetTableAntrianPerSpesialis) r.GET("/table-antrian-per-subspesialis", dashboardHandler.GetTableAntrianPerSubSpesialis) }