/** * 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 categoría de nota en PDF */ export interface CategoriaPdf { key: string label: string indent?: boolean } /** * Categorías de notas para el formulario PDF * Distribución correcta según formulario físico EVC-IH01 */ export const CATEGORIAS_PDF: { columnaIzquierda: CategoriaPdf[] columnaDerecha: CategoriaPdf[] } = { columnaIzquierda: [ { key: 'Floral', label: 'Floral' }, { key: 'Afrutado', label: 'Afrutado' }, { key: 'Bayas', label: 'Bayas', indent: true }, { key: 'Frutas Deshidratadas', label: 'Frutas Deshidratadas', indent: true }, { key: 'Cítricos', label: 'Cítricos', indent: true }, { key: 'Verde Vegetal', label: 'Verde/Vegetal' }, { key: 'Otro', label: 'Otra' }, { key: 'Químico', label: 'Químico', indent: true }, { key: 'Humedad/Tierra', label: 'Humedad/Tierra', indent: true }, { key: 'Madera', label: 'Madera', indent: true }, ], columnaDerecha: [ { key: 'Tostado', label: 'Tostado' }, { key: 'Cereal', label: 'Cereal', indent: true }, { key: 'Quemado', label: 'Quemado', indent: true }, { key: 'Tabaco', label: 'Tabaco', indent: true }, { key: 'Nueces/Cacao', label: 'Nueces/Cacao' }, { key: 'Nueces', label: 'Nueces', indent: true }, { key: 'Cacao', label: 'Cacao', indent: true }, { key: 'Especias', label: 'Especias' }, { key: 'Dulce', label: 'Dulce' }, { key: 'Vainilla', label: 'Vainilla', indent: true }, { key: 'Azúcar Morena', label: 'Azúcar Morena', indent: true }, ], } /** * 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