{"version":3,"file":"aggregateChartData-CIqGgT9Y.cjs","sources":["../src/dashboard/utils/aggregateChartData.ts"],"sourcesContent":["import type { AggregationType } from '../types';\n\n/**\n * Agrupa un array de datos por un campo clave y aplica una función de agregación\n * sobre uno o más campos numéricos. Si aggregation es 'none' o undefined,\n * retorna los datos sin modificar (backward compat).\n *\n * @param data - Array de registros planos del proxy (ya con field mapping aplicado)\n * @param groupByField - Campo por el que agrupar (Eje X / Categoría)\n * @param valueFields - Campo(s) numérico(s) a agregar (Eje Y, series)\n * @param aggregation - Función a aplicar\n * @returns Array agrupado listo para Recharts\n */\nexport function aggregateChartData(\n  data: Record<string, unknown>[],\n  groupByField: string,\n  valueFields: string[],\n  aggregation?: AggregationType\n): Record<string, unknown>[] {\n  if (!aggregation || aggregation === 'none' || data.length === 0) return data;\n\n  // Agrupar por el campo X\n  const groups = new Map<string, Record<string, unknown>[]>();\n  for (const row of data) {\n    const key = String(row[groupByField] ?? 'N/A');\n    if (!groups.has(key)) groups.set(key, []);\n    groups.get(key)!.push(row);\n  }\n\n  // Aplicar agregación a cada grupo\n  const result: Record<string, unknown>[] = [];\n  for (const [groupKey, rows] of groups) {\n    const aggregated: Record<string, unknown> = { [groupByField]: groupKey };\n\n    for (const field of valueFields) {\n      const values = rows\n        .map(r => r[field])\n        .filter((v): v is number => typeof v === 'number');\n\n      aggregated[field] = applyAggregation(values, aggregation);\n    }\n\n    result.push(aggregated);\n  }\n\n  return result;\n}\n\nfunction applyAggregation(values: number[], type: AggregationType): number {\n  if (values.length === 0) return 0;\n  switch (type) {\n    case 'sum':     return values.reduce((a, b) => a + b, 0);\n    case 'average': return Math.round((values.reduce((a, b) => a + b, 0) / values.length) * 100) / 100;\n    case 'count':   return values.length;\n    case 'min':     return Math.min(...values);\n    case 'max':     return Math.max(...values);\n    case 'last':    return values[values.length - 1];\n    case 'first':   return values[0];\n    case 'none':    return values[0]; // sin agregación: primer valor del grupo\n    default:        return values[0];\n  }\n}\n"],"names":["aggregateChartData","data","groupByField","valueFields","aggregation","groups","row","key","result","groupKey","rows","aggregated","field","values","r","v","applyAggregation","type","a","b"],"mappings":"aAaO,SAASA,EACdC,EACAC,EACAC,EACAC,EAC2B,CAC3B,GAAI,CAACA,GAAeA,IAAgB,QAAUH,EAAK,SAAW,EAAG,OAAOA,EAGxE,MAAMI,MAAa,IACnB,UAAWC,KAAOL,EAAM,CACtB,MAAMM,EAAM,OAAOD,EAAIJ,CAAY,GAAK,KAAK,EACxCG,EAAO,IAAIE,CAAG,GAAGF,EAAO,IAAIE,EAAK,EAAE,EACxCF,EAAO,IAAIE,CAAG,EAAG,KAAKD,CAAG,CAC3B,CAGA,MAAME,EAAoC,CAAA,EAC1C,SAAW,CAACC,EAAUC,CAAI,IAAKL,EAAQ,CACrC,MAAMM,EAAsC,CAAE,CAACT,CAAY,EAAGO,CAAA,EAE9D,UAAWG,KAAST,EAAa,CAC/B,MAAMU,EAASH,EACZ,IAAII,GAAKA,EAAEF,CAAK,CAAC,EACjB,OAAQG,GAAmB,OAAOA,GAAM,QAAQ,EAEnDJ,EAAWC,CAAK,EAAII,EAAiBH,EAAQT,CAAW,CAC1D,CAEAI,EAAO,KAAKG,CAAU,CACxB,CAEA,OAAOH,CACT,CAEA,SAASQ,EAAiBH,EAAkBI,EAA+B,CACzE,GAAIJ,EAAO,SAAW,EAAG,MAAO,GAChC,OAAQI,EAAA,CACN,IAAK,MAAW,OAAOJ,EAAO,OAAO,CAACK,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EACvD,IAAK,UAAW,OAAO,KAAK,MAAON,EAAO,OAAO,CAACK,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EAAIN,EAAO,OAAU,GAAG,EAAI,IAC/F,IAAK,QAAW,OAAOA,EAAO,OAC9B,IAAK,MAAW,OAAO,KAAK,IAAI,GAAGA,CAAM,EACzC,IAAK,MAAW,OAAO,KAAK,IAAI,GAAGA,CAAM,EACzC,IAAK,OAAW,OAAOA,EAAOA,EAAO,OAAS,CAAC,EAC/C,IAAK,QAAW,OAAOA,EAAO,CAAC,EAC/B,IAAK,OAAW,OAAOA,EAAO,CAAC,EAC/B,QAAgB,OAAOA,EAAO,CAAC,CAAA,CAEnC"}