Files
cataRio/nuxt4/app/utils/pdf/pdfLayout.ts
josedario87 9fc1842791
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 1m14s
PDF: Layout horizontal compacto para categorías padre-hijo
- Categorías reestructuradas con jerarquía explícita (padres con hijos)
- Hijos se muestran horizontalmente después del padre con wrap automático
- Fragancia-Aroma y Sabores reducidos a 28mm cada una (más compacto)
- Labels abreviados para subcategorías (F.Deshidr., Az.Morena, etc.)
- Ajustadas posiciones Y de todas las secciones
2025-11-24 17:56:41 -06:00

249 lines
5.3 KiB
TypeScript

/**
* Constantes y configuración del layout para el formulario PDF EVC-IH01
* Tamaño: Carta (Letter) - 8.5" x 11" (215.9mm x 279.4mm)
* Máximo 3 formularios por página
*/
export const PDF_CONFIG = {
// Página Carta (Letter)
pageWidth: 215.9, // mm (8.5")
pageHeight: 279.4, // mm (11")
// Márgenes
marginTop: 8,
marginBottom: 8,
marginLeft: 8,
marginRight: 8,
// Formulario individual (2 por página para más espacio)
formHeight: 130, // ~130mm cada formulario (más alto)
formWidth: 199.9, // pageWidth - marginLeft - marginRight
formSpacing: 3, // Espacio entre formularios
// Tipografía
fontSize: {
title: 10,
header: 8,
body: 7,
small: 6,
tiny: 5.5,
},
// Colores
colors: {
black: '#000000',
gray: '#666666',
lightGray: '#CCCCCC',
},
// Grosor de líneas
lineWidth: {
thin: 0.1,
normal: 0.2,
thick: 0.4,
},
// Tamaño de checkbox
checkboxSize: 3.5,
checkboxSpacing: 1.5,
} as const
/**
* Calcula la posición Y inicial para un formulario según su posición en la página
* @param posicion - Posición del formulario (0, 1, o 2)
* @returns Coordenada Y inicial en mm
*/
export function calcularYInicio(posicion: 0 | 1 | 2): number {
const { marginTop, formHeight, formSpacing } = PDF_CONFIG
return marginTop + posicion * (formHeight + formSpacing)
}
/**
* Secciones del formulario con sus posiciones relativas
*/
export const FORM_SECTIONS = {
// Encabezado
header: {
y: 0,
height: 10,
},
// Tabla de intensidades (lado izquierdo)
intensidades: {
x: 0,
y: 10,
width: 48,
height: 32,
},
// Fragancia-Aroma (centro-derecha superior)
fraganciaAroma: {
x: 48,
y: 10,
width: 76,
height: 18,
},
// Notas Fragancia-Aroma (derecha superior)
notasFragancia: {
x: 124,
y: 10,
width: 75.9,
height: 18,
},
// Sabores (centro-derecha medio)
sabores: {
x: 48,
y: 28,
width: 76,
height: 14,
},
// Notas Sabores (derecha medio)
notasSabor: {
x: 124,
y: 28,
width: 75.9,
height: 14,
},
// Sensación en boca y gustos
sensacionGustos: {
x: 48,
y: 42,
width: 151.9,
height: 12,
},
// Tazas y defectos
tazasDefectos: {
x: 0,
y: 54,
width: 199.9,
height: 12,
},
// Otras notas
otrasNotas: {
x: 0,
y: 66,
width: 199.9,
height: 8,
},
// Sub total
subTotal: {
x: 0,
y: 74,
width: 199.9,
height: 10,
},
} as const
/**
* Nombres de los parámetros de intensidad para la tabla
*/
export const PARAMETROS_INTENSIDAD = [
{ key: 'fragancia', label: 'Fragancia' },
{ key: 'aroma', label: 'Aroma' },
{ key: 'sabor', label: 'Sabor' },
{ key: 'saborResidual', label: 'Sabor Residual' },
{ key: 'acidez', label: 'Acidez' },
{ key: 'dulzor', label: 'Dulzor' },
{ key: 'sensacionBoca', label: 'Sensación Boca' },
{ key: 'impresionGlobal', label: 'Impresión Global' },
] as const
/**
* Tipo para subcategoría (hijo)
*/
export interface SubcategoriaPdf {
key: string
label: string
}
/**
* Tipo para categoría padre con hijos opcionales
*/
export interface CategoriaConHijosPdf {
key: string
label: string
hijos?: SubcategoriaPdf[]
}
/**
* Categorías de notas para el formulario PDF
* Estructura jerárquica: padres con hijos que se renderizan horizontalmente
*/
export const CATEGORIAS_JERARQUICAS: CategoriaConHijosPdf[] = [
{ key: 'Floral', label: 'Floral' },
{
key: 'Afrutado',
label: 'Afrutado',
hijos: [
{ key: 'Bayas', label: 'Bayas' },
{ key: 'Frutas Deshidratadas', label: 'F.Deshidr.' },
{ key: 'Cítricos', label: 'Cítricos' },
],
},
{ key: 'Verde Vegetal', label: 'Verde/Vegetal' },
{
key: 'Otro',
label: 'Otra',
hijos: [
{ key: 'Químico', label: 'Químico' },
{ key: 'Humedad/Tierra', label: 'Humedad' },
{ key: 'Madera', label: 'Madera' },
],
},
{
key: 'Tostado',
label: 'Tostado',
hijos: [
{ key: 'Cereal', label: 'Cereal' },
{ key: 'Quemado', label: 'Quemado' },
{ key: 'Tabaco', label: 'Tabaco' },
],
},
{
key: 'Nueces/Cacao',
label: 'Nueces/Cacao',
hijos: [
{ key: 'Nueces', label: 'Nueces' },
{ key: 'Cacao', label: 'Cacao' },
],
},
{ key: 'Especias', label: 'Especias' },
{
key: 'Dulce',
label: 'Dulce',
hijos: [
{ key: 'Vainilla', label: 'Vainilla' },
{ key: 'Azúcar Morena', label: 'Az.Morena' },
],
},
]
/**
* Sensaciones en boca para el formulario PDF
*/
export const SENSACIONES_PDF = [
{ key: 'Áspero', label: 'Áspero (Arenoso, Rugoso, Rasposo)' },
{ key: 'Aceitoso', label: 'Aceitoso' },
{ key: 'Metálico', label: 'Metálico' },
{ key: 'Suave', label: 'Suave (Aterciopelado, Sedoso)' },
{ key: 'Deja seca la boca', label: 'Deja seca la boca (Astringente)' },
] as const
/**
* Gustos predominantes para el formulario PDF
*/
export const GUSTOS_PDF = [
{ key: 'Salado', label: 'Salado' },
{ key: 'Amargo', label: 'Amargo' },
{ key: 'Ácido', label: 'Ácido' },
{ key: 'Dulce', label: 'Dulce' },
{ key: 'Umami', label: 'Umami' },
] as const
/**
* Defectos para el formulario PDF
*/
export const DEFECTOS_PDF = [
{ key: 'Mohoso', label: 'Mohoso' },
{ key: 'Fenólico', label: 'Fenólico' },
{ key: 'Papa', label: 'Papa' },
] as const