Refactorizar Panorama Facturador: implementar filosofía "Metabase calcula TODO, Vue solo renderiza"
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 5m41s
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 5m41s
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.
This commit is contained in:
@@ -13,22 +13,22 @@
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
<MetricCard
|
||||
label="Inversión en Uva"
|
||||
:value="formatCurrency(metrics.inversionUva.value)"
|
||||
:value="formatCurrency(data.inversion_uva)"
|
||||
variant="danger"
|
||||
/>
|
||||
<MetricCard
|
||||
label="Inversión en Mojado"
|
||||
:value="formatCurrency(metrics.inversionMojado.value)"
|
||||
:value="formatCurrency(data.inversion_mojado)"
|
||||
variant="info"
|
||||
/>
|
||||
<MetricCard
|
||||
label="Inversión en Oreado"
|
||||
:value="formatCurrency(metrics.inversionOreado.value)"
|
||||
:value="formatCurrency(data.inversion_oreado)"
|
||||
variant="warning"
|
||||
/>
|
||||
<MetricCard
|
||||
label="Total Invertido"
|
||||
:value="formatCurrency(metrics.totalInvertido.value)"
|
||||
:value="formatCurrency(data.total_invertido)"
|
||||
variant="primary"
|
||||
/>
|
||||
</div>
|
||||
@@ -58,19 +58,19 @@
|
||||
</div>
|
||||
<MetricCard
|
||||
label="Precio Promedio Ponderado Mojado"
|
||||
:value="formatNumber(metrics.precioPromedioMojadoPorQq.value)"
|
||||
:value="formatNumber(data.precio_promedio_mojado_por_qq)"
|
||||
unit="L./qq"
|
||||
variant="info"
|
||||
/>
|
||||
<MetricCard
|
||||
label="Precio Promedio Ponderado Oreado"
|
||||
:value="formatNumber(metrics.precioPromedioOreadoPorQq.value)"
|
||||
:value="formatNumber(data.precio_promedio_oreado_por_qq)"
|
||||
unit="L./qq"
|
||||
variant="warning"
|
||||
/>
|
||||
<MetricCard
|
||||
label="Precio Promedio Ponderado qq Seco"
|
||||
:value="formatNumber(metrics.precioPromedioQqSeco.value)"
|
||||
:value="formatNumber(data.precio_promedio_qq_seco)"
|
||||
unit="L./qq"
|
||||
variant="primary"
|
||||
/>
|
||||
@@ -85,22 +85,22 @@
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
<MetricCard
|
||||
label="Inversión Restante Uva"
|
||||
:value="formatCurrency(metrics.inversionRestanteUva.value)"
|
||||
:value="formatCurrency(data.inversion_restante_uva)"
|
||||
variant="danger"
|
||||
/>
|
||||
<MetricCard
|
||||
label="Inversión Restante Mojado"
|
||||
:value="formatCurrency(metrics.inversionRestanteMojado.value)"
|
||||
:value="formatCurrency(data.inversion_restante_mojado)"
|
||||
variant="info"
|
||||
/>
|
||||
<MetricCard
|
||||
label="Inversión Restante Oreado"
|
||||
:value="formatCurrency(metrics.inversionRestanteOreado.value)"
|
||||
:value="formatCurrency(data.inversion_restante_oreado)"
|
||||
variant="warning"
|
||||
/>
|
||||
<MetricCard
|
||||
label="Inversión Restante Esperada"
|
||||
:value="formatCurrency(metrics.inversionRestanteEsperada.value)"
|
||||
:value="formatCurrency(data.inversion_restante_esperada)"
|
||||
variant="primary"
|
||||
/>
|
||||
</div>
|
||||
@@ -111,10 +111,24 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, computed } from 'vue'
|
||||
import type { IngresosMetrics } from '~/composables/useIngresosMetrics'
|
||||
|
||||
// Props reciben datos directos de Metabase - SIN composables
|
||||
const props = defineProps<{
|
||||
metrics: IngresosMetrics
|
||||
data: {
|
||||
inversion_uva: number
|
||||
inversion_mojado: number
|
||||
inversion_oreado: number
|
||||
total_invertido: number
|
||||
precio_promedio_uva_por_lb: number
|
||||
precio_promedio_uva_por_qq: number
|
||||
precio_promedio_mojado_por_qq: number
|
||||
precio_promedio_oreado_por_qq: number
|
||||
precio_promedio_qq_seco: number
|
||||
inversion_restante_uva: number
|
||||
inversion_restante_mojado: number
|
||||
inversion_restante_oreado: number
|
||||
inversion_restante_esperada: number
|
||||
}
|
||||
}>()
|
||||
|
||||
type UnitDisplay = 'lb' | 'qq' | 'both'
|
||||
@@ -158,11 +172,11 @@ const formatCurrency = (value: number) => {
|
||||
function formatPrecioUvaNumber(): string {
|
||||
switch (unitDisplay.value) {
|
||||
case 'lb':
|
||||
return formatNumber(props.metrics.precioPromedioUvaPorQqLb.value)
|
||||
return formatNumber(props.data.precio_promedio_uva_por_lb)
|
||||
case 'qq':
|
||||
return formatNumber(props.metrics.precioPromedioUvaPorQq.value)
|
||||
return formatNumber(props.data.precio_promedio_uva_por_qq)
|
||||
case 'both':
|
||||
return `${formatNumber(props.metrics.precioPromedioUvaPorQqLb.value)} / ${formatNumber(props.metrics.precioPromedioUvaPorQq.value)}`
|
||||
return `${formatNumber(props.data.precio_promedio_uva_por_lb)} / ${formatNumber(props.data.precio_promedio_uva_por_qq)}`
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user