estadisticas de osp expandida

This commit is contained in:
2026-04-16 16:01:45 -04:00
parent 8f207e675c
commit 548bb0cdb2
4 changed files with 374 additions and 20 deletions

View File

@@ -105,13 +105,21 @@ export class TrainingService {
// Ejecutamos todas las consultas en paralelo con Promise.all para mayor velocidad
const [
totalOspsResult,
totalProducersResult,
totalProductsResult, // Nuevo: Calculado desde el JSON
// totalProducersResult,
totalProductsResult,
statusDistribution,
activityDistribution,
typeDistribution,
stateDistribution,
yearDistribution,
ecoSectorDistribution,
productiveSectorDistribution,
centralActivityDistribution,
mainActivityDistribution,
structureTypeDistribution,
isOpenSpaceDistribution,
hasTransportDistribution,
genderResult,
] = await Promise.all([
// 1. Total OSPs
this.drizzle
@@ -120,12 +128,12 @@ export class TrainingService {
.where(whereCondition),
// 2. Total Productores (Columna plana que mantuviste)
this.drizzle
.select({
sum: sql<number>`SUM(${trainingSurveys.womenCount} + ${trainingSurveys.menCount})`,
})
.from(trainingSurveys)
.where(whereCondition),
// this.drizzle
// .select({
// sum: sql<number>`SUM(${trainingSurveys.womenCount} + ${trainingSurveys.menCount})`,
// })
// .from(trainingSurveys)
// .where(whereCondition),
// 3. NUEVO: Total Productos (Contamos el largo del array JSON productList)
this.drizzle
@@ -145,7 +153,7 @@ export class TrainingService {
.where(whereCondition)
.groupBy(trainingSurveys.currentStatus),
// 5. Distribución por Actividad
// 5. Distribución por Actividad (General)
this.drizzle
.select({
name: trainingSurveys.productiveActivity,
@@ -188,11 +196,90 @@ export class TrainingService {
.where(whereCondition)
.groupBy(trainingSurveys.companyConstitutionYear)
.orderBy(trainingSurveys.companyConstitutionYear),
// 9. Distribución por Sector Económico
this.drizzle
.select({
name: trainingSurveys.ecoSector,
value: sql<number>`count(*)`,
})
.from(trainingSurveys)
.where(whereCondition)
.groupBy(trainingSurveys.ecoSector),
// 10. Distribución por Sector Productivo
this.drizzle
.select({
name: trainingSurveys.productiveSector,
value: sql<number>`count(*)`,
})
.from(trainingSurveys)
.where(whereCondition)
.groupBy(trainingSurveys.productiveSector),
// 11. Distribución por Actividad Central Productiva
this.drizzle
.select({
name: trainingSurveys.centralProductiveActivity,
value: sql<number>`count(*)`,
})
.from(trainingSurveys)
.where(whereCondition)
.groupBy(trainingSurveys.centralProductiveActivity),
// 12. Distribución por Actividad Productiva Principal
this.drizzle
.select({
name: trainingSurveys.mainProductiveActivity,
value: sql<number>`count(*)`,
})
.from(trainingSurveys)
.where(whereCondition)
.groupBy(trainingSurveys.mainProductiveActivity),
// 13. Distribución por Tipo de Estructura
this.drizzle
.select({
name: trainingSurveys.structureType,
value: sql<number>`count(*)`,
})
.from(trainingSurveys)
.where(whereCondition)
.groupBy(trainingSurveys.structureType),
// 14. Distribución por Espacio Abierto
this.drizzle
.select({
name: sql<string>`case when ${trainingSurveys.isOpenSpace} then 'Sí' else 'No' end`,
value: sql<number>`count(*)`,
})
.from(trainingSurveys)
.where(whereCondition)
.groupBy(trainingSurveys.isOpenSpace),
// 15. Distribución por Transporte
this.drizzle
.select({
name: sql<string>`case when ${trainingSurveys.hasTransport} then 'Sí' else 'No' end`,
value: sql<number>`count(*)`,
})
.from(trainingSurveys)
.where(whereCondition)
.groupBy(trainingSurveys.hasTransport),
// 16. Distribución por Género
this.drizzle
.select({
women: sql<number>`sum(${trainingSurveys.womenCount})`,
men: sql<number>`sum(${trainingSurveys.menCount})`,
})
.from(trainingSurveys)
.where(whereCondition),
]);
return {
totalOsps: Number(totalOspsResult[0]?.count || 0),
totalProducers: Number(totalProducersResult[0]?.sum || 0),
// totalProducers: Number(totalProducersResult[0]?.sum || 0),
totalProducts: Number(totalProductsResult[0]?.sum || 0), // Dato extraído del JSON
statusDistribution: statusDistribution.map((item) => ({
@@ -215,6 +302,38 @@ export class TrainingService {
...item,
value: Number(item.value),
})),
ecoSectorDistribution: ecoSectorDistribution.map((item) => ({
...item,
value: Number(item.value),
})),
productiveSectorDistribution: productiveSectorDistribution.map((item) => ({
...item,
value: Number(item.value),
})),
centralActivityDistribution: centralActivityDistribution.map((item) => ({
...item,
value: Number(item.value),
})),
mainActivityDistribution: mainActivityDistribution.map((item) => ({
...item,
value: Number(item.value),
})),
structureTypeDistribution: structureTypeDistribution.map((item) => ({
...item,
value: Number(item.value),
})),
isOpenSpaceDistribution: isOpenSpaceDistribution.map((item) => ({
...item,
value: Number(item.value),
})),
hasTransportDistribution: hasTransportDistribution.map((item) => ({
...item,
value: Number(item.value),
})),
genderDistribution: [
{ name: 'Mujeres', value: Number(genderResult[0]?.women || 0) },
{ name: 'Hombres', value: Number(genderResult[0]?.men || 0) },
],
};
}