Files
analiticaNucleo/nuxt4-app/app/composables/useRechazosMetrics.ts
josedario87 694ee4e3bb
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 5m41s
Refactorizar Panorama Facturador: implementar filosofía "Metabase calcula TODO, Vue solo renderiza"
Cambios principales:

- Refactorizar todos los componentes de panorama para recibir datos directos de Metabase
  * TotalesMonetarios.vue: cambiar de props.metrics a props.data
  * TotalesIngresoCompra.vue: cambiar de props.metrics a props.data
  * TotalesVerde.vue: cambiar de props.metrics a props.data
  * SecosVendidos.vue: cambiar de props.metrics a props.data

- Eliminar fechas hardcodeadas en panorama.post.ts
  * Pasar valores null directamente a Metabase para usar sus defaults

- Marcar composables obsoletos para Panorama Facturador
  * useIngresosMetrics.ts: agregar advertencia de no uso en Panorama
  * useRechazosMetrics.ts: agregar advertencia de no uso en Panorama

Resultado: Todos los cálculos (agregaciones, promedios ponderados) se hacen en Metabase mediante SQL. Los componentes Vue solo renderizan valores ya calculados.
2025-10-27 15:09:03 -06:00

95 lines
3.2 KiB
TypeScript

/**
* ⚠️ ADVERTENCIA - COMPOSABLE OBSOLETO PARA PANORAMA FACTURADOR ⚠️
*
* Este composable NO debe usarse en el Panorama Facturador.
*
* FILOSOFÍA DE LA APLICACIÓN:
* "Metabase calcula TODO. Vue solo renderiza."
*
* Los cálculos de métricas, agregaciones y promedios DEBEN hacerse
* en Metabase mediante SQL. Los componentes de Vue solo deben recibir
* datos ya calculados y renderizarlos.
*
* Este composable existe para compatibilidad con otras páginas legacy,
* pero NO debe usarse en nuevas funcionalidades del Panorama.
*
* Para el Panorama Facturador, consulta:
* - METABASE_QUERIES_PANORAMA.md (Query #6: panorama_rechazos_subproductos)
* - server/api/metabase/panorama.post.ts
* - pages/panorama.vue
* - components/rechazos/RechazosSubproductos.vue
*
* Última actualización: 2025-10-27
*/
import { computed } from 'vue'
import type { ComputedRef } from 'vue'
export interface RechazoRecord {
tipo: 'chibolita' | 'perico' | 'vano' | 'picadillo' | 'magalla' | 'pinta'
cantidad: number // libras para chibolita, perico, pinta; galones para vano, picadillo, magalla
precio_unitario: number
total_cobrado: number
}
export interface RechazoMetrics {
totalCantidad: number
precioPromedio: number
totalCobrado: number
}
export interface RechazosMetrics {
chibolita: ComputedRef<RechazoMetrics>
perico: ComputedRef<RechazoMetrics>
vano: ComputedRef<RechazoMetrics>
picadillo: ComputedRef<RechazoMetrics>
magalla: ComputedRef<RechazoMetrics>
pinta: ComputedRef<RechazoMetrics>
totalRechazos: ComputedRef<number>
}
export function useRechazosMetrics(rechazos: ComputedRef<RechazoRecord[]>) {
const calcularMetricasPorTipo = (tipo: RechazoRecord['tipo']): ComputedRef<RechazoMetrics> => {
return computed(() => {
const registros = rechazos.value.filter(r => r.tipo === tipo)
const totalCantidad = registros.reduce((sum, r) => sum + (r.cantidad || 0), 0)
// const totalCobrado = registros.reduce((sum, r) => sum + (r.total_cobrado || 0), 0) DESACTIVADO HASTA NORMALIZAR LOS DATOS DE LA TABLA ORIGINAL, MENCIONAR SI TE TOPAS CON ESTO UN MES DESPUES ESTAMOS EN 1 OCTUBRE 2025
// const precioPromedio = totalCantidad > 0 ? totalCobrado / totalCantidad : 0 DESACTIVADO HASTA NORMALIZAR LOS DATOS DE LA TABLA ORIGINAL, MENCIONAR SI TE TOPAS CON ESTO UN MES DESPUES ESTAMOS EN 1 OCTUBRE 2025
const precioPromedio = 10
const totalCobrado = 100
return {
totalCantidad,
precioPromedio,
totalCobrado
}
})
}
const chibolita = calcularMetricasPorTipo('chibolita')
const perico = calcularMetricasPorTipo('perico')
const vano = calcularMetricasPorTipo('vano')
const picadillo = calcularMetricasPorTipo('picadillo')
const magalla = calcularMetricasPorTipo('magalla')
const pinta = calcularMetricasPorTipo('pinta')
const totalRechazos = computed(() => {
return chibolita.value.totalCobrado +
perico.value.totalCobrado +
vano.value.totalCobrado +
picadillo.value.totalCobrado +
magalla.value.totalCobrado +
pinta.value.totalCobrado
})
return {
chibolita,
perico,
vano,
picadillo,
magalla,
pinta,
totalRechazos
}
}