238 lines
6.2 KiB
Go
238 lines
6.2 KiB
Go
package dashboard
|
|
|
|
import (
|
|
"antrian-operasi/internal/database"
|
|
|
|
queryUtils "antrian-operasi/internal/utils/query"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
const DB_NAME = "db_antrian"
|
|
const TBL_NAME = "data_pasien_operasi"
|
|
const TBL_SUBSPESIALIS = "daftar_subspesialis"
|
|
|
|
type IDashboardRepository interface {
|
|
GetAntrianPerKategori(c *gin.Context) ([]AntrianPerKategori, error)
|
|
GetAntrianPerSpesialis(c *gin.Context) (ListModelAntrianPerSpesialis, error)
|
|
GetPerbandinganStatusAntrean(c *gin.Context, req PeriodeDashboardRequest) (ListPerbandinganStatusAntrean, error)
|
|
GetPerbandinganKategoriAntrean(c *gin.Context, req PeriodeDashboardRequest) ([]PerbandinganKategoriAntrean, error)
|
|
}
|
|
|
|
type dashboardRepo struct {
|
|
queryBuilder *queryUtils.QueryBuilder
|
|
db database.Service
|
|
}
|
|
|
|
func NewRepository(dbService database.Service) IDashboardRepository {
|
|
queryBuilder := queryUtils.NewQueryBuilder(queryUtils.DBTypePostgreSQL).
|
|
SetAllowedColumns([]string{
|
|
"Kategori_operasi",
|
|
"Kategori",
|
|
"jumlah_antrean",
|
|
})
|
|
queryBuilder.SetSecurityOptions(false, 100)
|
|
|
|
return dashboardRepo{
|
|
queryBuilder: queryBuilder,
|
|
db: dbService,
|
|
}
|
|
}
|
|
|
|
func (r dashboardRepo) GetAntrianPerKategori(c *gin.Context) ([]AntrianPerKategori, error) {
|
|
var result []AntrianPerKategori
|
|
|
|
query := queryUtils.DynamicQuery{
|
|
From: TBL_NAME,
|
|
Aliases: "dpo",
|
|
Fields: []queryUtils.SelectField{
|
|
{Expression: "dpo.Kategori_operasi", Alias: "Kategori_operasi"},
|
|
{Expression: "dko.Kategori", Alias: "Kategori"},
|
|
{Expression: "COUNT(dpo.id)", Alias: "jumlah_antrean"},
|
|
},
|
|
GroupBy: []string{"dpo.Kategori_operasi", "dko.Kategori"},
|
|
Sort: []queryUtils.SortField{
|
|
{Column: "dko.Kategori", Order: "ASC"},
|
|
},
|
|
}
|
|
|
|
query.Joins = []queryUtils.Join{
|
|
{
|
|
Type: "LEFT",
|
|
Table: "daftar_kategori_operasi",
|
|
Alias: "dko",
|
|
OnConditions: queryUtils.FilterGroup{
|
|
Filters: []queryUtils.DynamicFilter{
|
|
{
|
|
Column: "dpo.Kategori_operasi", Operator: queryUtils.OpEqual, Value: "dko.id",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}
|
|
|
|
// filter status = 1 (belum)
|
|
var filter []queryUtils.DynamicFilter
|
|
filter = append(filter, queryUtils.DynamicFilter{Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: "1"})
|
|
query.Filters = append(query.Filters, queryUtils.FilterGroup{Filters: filter, LogicOp: "AND"})
|
|
|
|
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) GetAntrianPerSpesialis(c *gin.Context) (ListModelAntrianPerSpesialis, error) {
|
|
var result ListModelAntrianPerSpesialis
|
|
|
|
query := queryUtils.DynamicQuery{
|
|
From: TBL_SUBSPESIALIS,
|
|
Aliases: "dss",
|
|
Fields: []queryUtils.SelectField{
|
|
{Expression: "ds.id", Alias: "id_spesialis"},
|
|
{Expression: "dss.id", Alias: "id_subspesialis"},
|
|
{Expression: "ds.Spesialis"},
|
|
{Expression: "dss.Subspesialis"},
|
|
{Expression: "COUNT(dpo.id)", Alias: "jml_antrian"},
|
|
},
|
|
Joins: []queryUtils.Join{
|
|
{
|
|
Type: "LEFT",
|
|
Table: "daftar_spesialis",
|
|
Alias: "ds",
|
|
OnConditions: queryUtils.FilterGroup{
|
|
Filters: []queryUtils.DynamicFilter{
|
|
{
|
|
Column: "dss.FK_daftar_spesialis_ID", Operator: queryUtils.OpEqual, Value: "ds.id",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
{
|
|
Type: "LEFT",
|
|
Table: "data_pasien_operasi",
|
|
Alias: "dpo",
|
|
OnConditions: queryUtils.FilterGroup{
|
|
Filters: []queryUtils.DynamicFilter{
|
|
{
|
|
Column: "dpo.Sub_spesialis", Operator: queryUtils.OpEqual, Value: "dss.id",
|
|
},
|
|
{
|
|
Column: "dpo.Status_operasi", Operator: queryUtils.OpEqual, Value: "1",
|
|
},
|
|
}, LogicOp: "AND",
|
|
},
|
|
},
|
|
},
|
|
GroupBy: []string{"dss.id", "dss.Subspesialis", "ds.id", "ds.Spesialis"},
|
|
Sort: []queryUtils.SortField{
|
|
{Column: "ds.id"},
|
|
},
|
|
}
|
|
|
|
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) GetPerbandinganStatusAntrean(c *gin.Context, req PeriodeDashboardRequest) (ListPerbandinganStatusAntrean, error) {
|
|
var result ListPerbandinganStatusAntrean
|
|
startDate, endDate := GenerateStartEndDate(req)
|
|
|
|
query := queryUtils.DynamicQuery{
|
|
From: TBL_NAME,
|
|
Aliases: "dpo",
|
|
Fields: []queryUtils.SelectField{
|
|
{Expression: "dpo.Status_operasi", Alias: "status_operasi"},
|
|
{Expression: "COUNT(dpo.id)", Alias: "jumlah"},
|
|
},
|
|
Filters: []queryUtils.FilterGroup{
|
|
{
|
|
Filters: []queryUtils.DynamicFilter{
|
|
{Column: "dpo.Tanggal_daftar", Operator: queryUtils.OpBetween, Value: []string{startDate, endDate}},
|
|
},
|
|
},
|
|
},
|
|
GroupBy: []string{"dpo.Status_operasi"},
|
|
Sort: []queryUtils.SortField{
|
|
{Column: "dpo.Status_operasi", 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) GetPerbandinganKategoriAntrean(c *gin.Context, req PeriodeDashboardRequest) ([]PerbandinganKategoriAntrean, error) {
|
|
var result []PerbandinganKategoriAntrean
|
|
|
|
startDate, endDate := GenerateStartEndDate(req)
|
|
|
|
query := queryUtils.DynamicQuery{
|
|
From: "daftar_kategori_operasi",
|
|
Aliases: "dko",
|
|
Fields: []queryUtils.SelectField{
|
|
{Expression: "dko.id", Alias: "id_kategori"},
|
|
{Expression: "dko.Kategori", Alias: "kategori"},
|
|
{Expression: "COUNT(dpo.id)", Alias: "jumlah"},
|
|
},
|
|
Joins: []queryUtils.Join{
|
|
{
|
|
Type: "LEFT",
|
|
Table: TBL_NAME,
|
|
Alias: "dpo",
|
|
OnConditions: queryUtils.FilterGroup{
|
|
Filters: []queryUtils.DynamicFilter{
|
|
{Column: "dpo.Kategori_operasi", Operator: queryUtils.OpEqual, Value: "dko.id"},
|
|
{Column: "dpo.Tanggal_daftar", Operator: queryUtils.OpBetween, Value: []string{startDate, endDate}},
|
|
}, LogicOp: "AND",
|
|
},
|
|
},
|
|
},
|
|
GroupBy: []string{"dko.id", "dko.Kategori"},
|
|
Sort: []queryUtils.SortField{
|
|
{Column: "dko.id", 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
|
|
}
|