Files
api-antrian-operasi/internal/domain/dashboard/repository.go
2026-02-11 11:32:17 +07:00

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
}