diff --git a/nuxt4-app/app/components/TotalesIngresoCompra.vue b/nuxt4-app/app/components/TotalesIngresoCompra.vue
index 635da46..a86acc1 100644
--- a/nuxt4-app/app/components/TotalesIngresoCompra.vue
+++ b/nuxt4-app/app/components/TotalesIngresoCompra.vue
@@ -146,6 +146,14 @@ const props = defineProps<{
total_qq_oreado_deposito: number
total_qq_seco_deposito: number
}
+ contadores?: {
+ total_ingresos?: number
+ ingresos_filtrados?: number
+ total_clientes?: number
+ clientes_con_ingresos_filtrados?: number
+ }
+ rangoLegible: string
+ lastUpdated: string
}>()
// Toggle de unidades: 'lb' | 'qq' | 'both'
@@ -189,6 +197,15 @@ const formatNumber = (value: number) => {
}
async function copiarTexto() {
+ const footer = `
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📊 RESUMEN
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📅 Rango: ${props.rangoLegible}
+📦 Ingresos: ${props.contadores?.ingresos_filtrados || 0} de ${props.contadores?.total_ingresos || 0} registros
+👥 Clientes: ${props.contadores?.clientes_con_ingresos_filtrados || 0} de ${props.contadores?.total_clientes || 0} clientes
+🕐 Generado: ${props.lastUpdated}`
+
const texto = `☕ TOTALES DE INGRESO Y COMPRA
🍇 UVA:
@@ -209,7 +226,7 @@ async function copiarTexto() {
📊 TOTALES GENERALES:
QQ Seco Ingresado: ${formatNumber(props.data.total_qq_seco_ingresado)} QQ
QQ Seco Comprado: ${formatNumber(props.data.total_qq_seco_comprado)} QQ
- QQ Seco en Depósito: ${formatNumber(props.data.total_qq_seco_deposito)} QQ`
+ QQ Seco en Depósito: ${formatNumber(props.data.total_qq_seco_deposito)} QQ${footer}`
await navigator.clipboard.writeText(texto)
alert('✅ Totales de Ingreso y Compra copiados al portapapeles')
diff --git a/nuxt4-app/app/components/TotalesMonetarios.vue b/nuxt4-app/app/components/TotalesMonetarios.vue
index 97bc6fa..36bf30c 100644
--- a/nuxt4-app/app/components/TotalesMonetarios.vue
+++ b/nuxt4-app/app/components/TotalesMonetarios.vue
@@ -113,6 +113,14 @@ const props = defineProps<{
inversion_restante_oreado: number
inversion_restante_esperada: number
}
+ contadores?: {
+ total_ingresos?: number
+ ingresos_filtrados?: number
+ total_clientes?: number
+ clientes_con_ingresos_filtrados?: number
+ }
+ rangoLegible: string
+ lastUpdated: string
}>()
// Toggle de unidades para precios de Uva: 'lb' | 'qq' | 'both'
@@ -154,6 +162,15 @@ const formatCurrency = (value: number) => {
}
async function copiarTexto() {
+ const footer = `
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📊 RESUMEN
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📅 Rango: ${props.rangoLegible}
+📦 Ingresos: ${props.contadores?.ingresos_filtrados || 0} de ${props.contadores?.total_ingresos || 0} registros
+👥 Clientes: ${props.contadores?.clientes_con_ingresos_filtrados || 0} de ${props.contadores?.total_clientes || 0} clientes
+🕐 Generado: ${props.lastUpdated}`
+
const texto = `💰 TOTALES MONETARIOS
💵 INVERSIÓN HASTA LA FECHA:
@@ -172,7 +189,7 @@ async function copiarTexto() {
Restante Uva: ${formatCurrency(props.data.inversion_restante_uva)}
Restante Mojado: ${formatCurrency(props.data.inversion_restante_mojado)}
Restante Oreado: ${formatCurrency(props.data.inversion_restante_oreado)}
- Total Restante: ${formatCurrency(props.data.inversion_restante_esperada)}`
+ Total Restante: ${formatCurrency(props.data.inversion_restante_esperada)}${footer}`
await navigator.clipboard.writeText(texto)
alert('✅ Totales Monetarios copiados al portapapeles')
diff --git a/nuxt4-app/app/components/TotalesVerde.vue b/nuxt4-app/app/components/TotalesVerde.vue
index 4afc5f9..d402ecb 100644
--- a/nuxt4-app/app/components/TotalesVerde.vue
+++ b/nuxt4-app/app/components/TotalesVerde.vue
@@ -82,6 +82,14 @@ const props = defineProps<{
inversion_restante_verde: number
total_lb_neto_comprado_verde: number
}
+ contadores?: {
+ total_ingresos?: number
+ ingresos_filtrados?: number
+ total_clientes?: number
+ clientes_con_ingresos_filtrados?: number
+ }
+ rangoLegible: string
+ lastUpdated: string
}>()
const formatNumber = (value: number) => {
@@ -102,6 +110,15 @@ const formatCurrency = (value: number) => {
}
async function copiarTexto() {
+ const footer = `
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📊 RESUMEN
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📅 Rango: ${props.rangoLegible}
+📦 Ingresos: ${props.contadores?.ingresos_filtrados || 0} de ${props.contadores?.total_ingresos || 0} registros
+👥 Clientes: ${props.contadores?.clientes_con_ingresos_filtrados || 0} de ${props.contadores?.total_clientes || 0} clientes
+🕐 Generado: ${props.lastUpdated}`
+
const texto = `🌱 CAFÉ VERDE
📊 TOTALES:
@@ -112,7 +129,7 @@ async function copiarTexto() {
💵 FINANCIERO:
Precio Promedio Pagado: ${formatCurrency(props.data.precio_promedio_verde_pagado)}/lb
Inversión Hasta la Fecha: ${formatCurrency(props.data.inversion_verde_hasta_fecha)}
- Inversión Restante: ${formatCurrency(props.data.inversion_restante_verde)}`
+ Inversión Restante: ${formatCurrency(props.data.inversion_restante_verde)}${footer}`
await navigator.clipboard.writeText(texto)
alert('✅ Totales de Café Verde copiados al portapapeles')
diff --git a/nuxt4-app/app/pages/informe-ingresos.vue b/nuxt4-app/app/pages/informe-ingresos.vue
index 0e6d690..7136172 100644
--- a/nuxt4-app/app/pages/informe-ingresos.vue
+++ b/nuxt4-app/app/pages/informe-ingresos.vue
@@ -363,9 +363,27 @@
-
-
-
+
+
+
@@ -849,6 +867,16 @@ async function loadOpcionesFiltros() {
async function copiarListaIngresosTexto() {
if (!data.value?.listaIngresos || data.value.listaIngresos.length === 0) return
+ const contadores = data.value.contadores || {}
+ const footer = `
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📊 RESUMEN
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📅 Rango: ${rangoLegible.value}
+📦 Ingresos: ${contadores.ingresos_filtrados || 0} de ${contadores.total_ingresos || 0} registros
+👥 Clientes: ${contadores.clientes_con_ingresos_filtrados || 0} de ${contadores.total_clientes || 0} clientes
+🕐 Generado: ${lastUpdated.value}`
+
const texto = `📊 LISTA DE INGRESOS - ${data.value.listaIngresos.length} registros
Rango: ${rangoLegible.value}
Generado: ${lastUpdated.value}
@@ -862,7 +890,7 @@ ${idx + 1}. ID: ${ing.id}
💰 Precio: L ${ing.precio ? ing.precio.toFixed(2) : '-'}
💵 Total: L ${ing.total_a_pagar ? ing.total_a_pagar.toFixed(2) : '-'}
📍 Estado: ${ing.estado || '-'}
-`).join('\n')}`
+`).join('\n')}${footer}`
await navigator.clipboard.writeText(texto)
alert('✅ Lista de ingresos copiada al portapapeles')
@@ -879,6 +907,16 @@ async function copiarListaIngresosJSON() {
async function copiarTop10ClientesTexto() {
if (!data.value?.listaClientes || data.value.listaClientes.length === 0) return
+ const contadores = data.value.contadores || {}
+ const footer = `
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📊 RESUMEN
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📅 Rango: ${rangoLegible.value}
+📦 Ingresos: ${contadores.ingresos_filtrados || 0} de ${contadores.total_ingresos || 0} registros
+👥 Clientes: ${contadores.clientes_con_ingresos_filtrados || 0} de ${contadores.total_clientes || 0} clientes
+🕐 Generado: ${lastUpdated.value}`
+
const top10 = data.value.listaClientes.slice(0, 10)
const texto = `🏆 TOP 10 CLIENTES
Rango: ${rangoLegible.value}
@@ -891,7 +929,7 @@ ${idx + 1}. ${cliente.cliente_nombre || 'Sin nombre'}
💰 Total Pagado: L ${cliente.total_pagado ? cliente.total_pagado.toFixed(2) : '0.00'}
📦 Ingresos: ${cliente.num_ingresos || 0}
⚖️ Quintales: ${cliente.total_qq_seco ? cliente.total_qq_seco.toFixed(2) : '0.00'} qq
-`).join('\n')}`
+`).join('\n')}${footer}`
await navigator.clipboard.writeText(texto)
alert('✅ Top 10 clientes copiado al portapapeles')
@@ -909,6 +947,16 @@ async function copiarTop10ClientesJSON() {
async function copiarSerieTemporalTexto() {
if (!data.value?.serieTemporal || data.value.serieTemporal.length === 0) return
+ const contadores = data.value.contadores || {}
+ const footer = `
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📊 RESUMEN
+━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+📅 Rango: ${rangoLegible.value}
+📦 Ingresos: ${contadores.ingresos_filtrados || 0} de ${contadores.total_ingresos || 0} registros
+👥 Clientes: ${contadores.clientes_con_ingresos_filtrados || 0} de ${contadores.total_clientes || 0} clientes
+🕐 Generado: ${lastUpdated.value}`
+
const texto = `📈 SERIE TEMPORAL ACUMULADA - ${data.value.serieTemporal.length} puntos
Rango: ${rangoLegible.value}
Generado: ${lastUpdated.value}
@@ -922,7 +970,7 @@ ${idx + 1}. 📅 ${punto.fecha_grupo ? new Date(punto.fecha_grupo).toLocaleDateS
💰 Inversión: L ${punto.inversion_periodo ? punto.inversion_periodo.toFixed(2) : '0.00'}
📊 Acumulado: ${punto.peso_seco_acumulado ? punto.peso_seco_acumulado.toFixed(2) : '0.00'} qq
💵 Total Acum: L ${punto.inversion_acumulada ? punto.inversion_acumulada.toFixed(2) : '0.00'}
-`).join('\n')}`
+`).join('\n')}${footer}`
await navigator.clipboard.writeText(texto)
alert('✅ Serie temporal copiada al portapapeles')