- Base de datos PostgreSQL 16 con extensiones JSONB y arrays - Docker Compose para containerización - Scripts SQL de inicialización (schema, funciones, índices, datos de prueba) - Suite de tests de validación (18 tests) - Queries de ejemplo (17 queries) - Script helper para gestión (scripts/riocata.sh) - Documentación completa en README.md Estructura: - 4 tablas principales: sesion, auth.users, sesion_participante, muestra, evaluacion - Tipo ENUM para defectos - 2 triggers automáticos (updated_at, puntaje_final) - 19 índices de optimización (GIN, B-tree, funcionales) - Constraints de validación para arrays y JSONB - 2 funciones auxiliares para análisis
245 lines
8.5 KiB
SQL
245 lines
8.5 KiB
SQL
-- ============================================
|
|
-- rioCata - Datos de Prueba
|
|
-- ============================================
|
|
|
|
-- ============================================
|
|
-- USUARIOS DE PRUEBA
|
|
-- ============================================
|
|
|
|
INSERT INTO auth.users (id, email, nombre) VALUES
|
|
('11111111-1111-1111-1111-111111111111', 'dario@nucleoriofrio.com', 'Dario'),
|
|
('22222222-2222-2222-2222-222222222222', 'juan.catador@example.com', 'Juan Pérez'),
|
|
('33333333-3333-3333-3333-333333333333', 'maria.juez@example.com', 'María González');
|
|
|
|
-- ============================================
|
|
-- SESIÓN DE CATACIÓN DE PRUEBA
|
|
-- ============================================
|
|
|
|
INSERT INTO sesion (id, codigo, fecha, nombre) VALUES
|
|
('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'S-2025-10-17-01', '2025-10-17', 'Mesa Laboratorio #1 - Lotes Lavados');
|
|
|
|
-- ============================================
|
|
-- PARTICIPANTES DE LA SESIÓN
|
|
-- ============================================
|
|
|
|
INSERT INTO sesion_participante (id, sesion_id, catador_id, rol) VALUES
|
|
('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '11111111-1111-1111-1111-111111111111', 'catador'),
|
|
('cccccccc-cccc-cccc-cccc-cccccccccccc', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '22222222-2222-2222-2222-222222222222', 'catador'),
|
|
('dddddddd-dddd-dddd-dddd-dddddddddddd', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '33333333-3333-3333-3333-333333333333', 'juez');
|
|
|
|
-- ============================================
|
|
-- MUESTRAS DE CAFÉ
|
|
-- ============================================
|
|
|
|
INSERT INTO muestra (id, sesion_id, codigo, posicion) VALUES
|
|
('eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'Muestra A-101', 1),
|
|
('ffffffff-ffff-ffff-ffff-ffffffffffff', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'Muestra B-202', 2),
|
|
('00000000-0000-0000-0000-000000000001', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'Muestra C-303', 3);
|
|
|
|
-- ============================================
|
|
-- EVALUACIONES DE PRUEBA
|
|
-- ============================================
|
|
|
|
-- Evaluación 1: Dario evalúa Muestra A-101 (café excelente)
|
|
INSERT INTO evaluacion (
|
|
muestra_id,
|
|
sesion_participante_id,
|
|
intensidades,
|
|
fragancia_aroma_notas,
|
|
sabor_notas,
|
|
tazas_no_uniformes,
|
|
tazas_defectuosas,
|
|
sensacion_en_boca,
|
|
gustos_predominantes,
|
|
defecto,
|
|
otras_notas
|
|
) VALUES (
|
|
'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee',
|
|
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb',
|
|
'{
|
|
"fragancia": {"descriptiva": 8, "afectiva": 9},
|
|
"aroma": {"descriptiva": 9, "afectiva": 9},
|
|
"sabor": {"descriptiva": 10, "afectiva": 10},
|
|
"saborResidual": {"descriptiva": 8, "afectiva": 9},
|
|
"acidez": {"descriptiva": 9, "afectiva": 9},
|
|
"dulzor": {"descriptiva": 10, "afectiva": 10},
|
|
"sensacionBoca": {"descriptiva": 8, "afectiva": 9},
|
|
"impresionGlobal": {"descriptiva": null, "afectiva": 10}
|
|
}'::jsonb,
|
|
'[
|
|
{"categoria": "Afrutado", "subcategoria": "Cítricos", "notaEspecifica": "Naranja dulce"},
|
|
{"categoria": "Floral", "subcategoria": "Jazmín", "notaEspecifica": null}
|
|
]'::jsonb,
|
|
'[
|
|
{"categoria": "Afrutado", "subcategoria": "Bayas", "notaEspecifica": "Fresa madura"},
|
|
{"categoria": "Chocolatado", "subcategoria": "Chocolate con leche", "notaEspecifica": null}
|
|
]'::jsonb,
|
|
ARRAY[]::smallint[],
|
|
ARRAY[]::smallint[],
|
|
ARRAY['Suave', 'Aceitoso']::text[],
|
|
ARRAY['Ácido', 'Dulce']::text[],
|
|
null,
|
|
'Café excepcional. Muy balanceado, con dulzor prominente y acidez brillante. Notas a vino tinto en el retrogusto. Cuerpo medio-alto, muy limpio.'
|
|
);
|
|
|
|
-- Evaluación 2: Juan evalúa Muestra A-101 (también buena evaluación)
|
|
INSERT INTO evaluacion (
|
|
muestra_id,
|
|
sesion_participante_id,
|
|
intensidades,
|
|
fragancia_aroma_notas,
|
|
sabor_notas,
|
|
tazas_no_uniformes,
|
|
tazas_defectuosas,
|
|
sensacion_en_boca,
|
|
gustos_predominantes,
|
|
defecto,
|
|
otras_notas
|
|
) VALUES (
|
|
'eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee',
|
|
'cccccccc-cccc-cccc-cccc-cccccccccccc',
|
|
'{
|
|
"fragancia": {"descriptiva": 7, "afectiva": 8},
|
|
"aroma": {"descriptiva": 8, "afectiva": 9},
|
|
"sabor": {"descriptiva": 9, "afectiva": 9},
|
|
"saborResidual": {"descriptiva": 7, "afectiva": 8},
|
|
"acidez": {"descriptiva": 8, "afectiva": 8},
|
|
"dulzor": {"descriptiva": 9, "afectiva": 9},
|
|
"sensacionBoca": {"descriptiva": 7, "afectiva": 8},
|
|
"impresionGlobal": {"descriptiva": null, "afectiva": 9}
|
|
}'::jsonb,
|
|
'[
|
|
{"categoria": "Afrutado", "subcategoria": "Cítricos", "notaEspecifica": "Mandarina"}
|
|
]'::jsonb,
|
|
'[
|
|
{"categoria": "Afrutado", "subcategoria": "Bayas", "notaEspecifica": "Mora"},
|
|
{"categoria": "Caramelizado", "subcategoria": "Caramelo", "notaEspecifica": null}
|
|
]'::jsonb,
|
|
ARRAY[]::smallint[],
|
|
ARRAY[]::smallint[],
|
|
ARRAY['Suave']::text[],
|
|
ARRAY['Dulce', 'Ácido']::text[],
|
|
null,
|
|
'Muy buen café. Dulce y complejo. Buena acidez cítrica. Cuerpo medio.'
|
|
);
|
|
|
|
-- Evaluación 3: Dario evalúa Muestra B-202 (café con problemas de uniformidad)
|
|
INSERT INTO evaluacion (
|
|
muestra_id,
|
|
sesion_participante_id,
|
|
intensidades,
|
|
fragancia_aroma_notas,
|
|
sabor_notas,
|
|
tazas_no_uniformes,
|
|
tazas_defectuosas,
|
|
sensacion_en_boca,
|
|
gustos_predominantes,
|
|
defecto,
|
|
otras_notas
|
|
) VALUES (
|
|
'ffffffff-ffff-ffff-ffff-ffffffffffff',
|
|
'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb',
|
|
'{
|
|
"fragancia": {"descriptiva": 5, "afectiva": 6},
|
|
"aroma": {"descriptiva": 6, "afectiva": 7},
|
|
"sabor": {"descriptiva": 6, "afectiva": 7},
|
|
"saborResidual": {"descriptiva": 5, "afectiva": 6},
|
|
"acidez": {"descriptiva": 7, "afectiva": 7},
|
|
"dulzor": {"descriptiva": 6, "afectiva": 7},
|
|
"sensacionBoca": {"descriptiva": 5, "afectiva": 6},
|
|
"impresionGlobal": {"descriptiva": null, "afectiva": 6}
|
|
}'::jsonb,
|
|
'[
|
|
{"categoria": "Especiado", "subcategoria": "Canela", "notaEspecifica": null}
|
|
]'::jsonb,
|
|
'[
|
|
{"categoria": "Nueces", "subcategoria": "Almendra", "notaEspecifica": null}
|
|
]'::jsonb,
|
|
ARRAY[2, 5]::smallint[],
|
|
ARRAY[]::smallint[],
|
|
ARRAY['Áspero']::text[],
|
|
ARRAY['Ácido']::text[],
|
|
null,
|
|
'Café promedio. Las tazas 2 y 5 no estaban uniformes con las demás. Algo de astringencia. Cuerpo ligero-medio.'
|
|
);
|
|
|
|
-- Evaluación 4: María evalúa Muestra C-303 (café con defecto fenólico)
|
|
INSERT INTO evaluacion (
|
|
muestra_id,
|
|
sesion_participante_id,
|
|
intensidades,
|
|
fragancia_aroma_notas,
|
|
sabor_notas,
|
|
tazas_no_uniformes,
|
|
tazas_defectuosas,
|
|
sensacion_en_boca,
|
|
gustos_predominantes,
|
|
defecto,
|
|
otras_notas
|
|
) VALUES (
|
|
'00000000-0000-0000-0000-000000000001',
|
|
'dddddddd-dddd-dddd-dddd-dddddddddddd',
|
|
'{
|
|
"fragancia": {"descriptiva": 4, "afectiva": 4},
|
|
"aroma": {"descriptiva": 3, "afectiva": 3},
|
|
"sabor": {"descriptiva": 3, "afectiva": 3},
|
|
"saborResidual": {"descriptiva": 2, "afectiva": 2},
|
|
"acidez": {"descriptiva": 5, "afectiva": 5},
|
|
"dulzor": {"descriptiva": 4, "afectiva": 4},
|
|
"sensacionBoca": {"descriptiva": 3, "afectiva": 3},
|
|
"impresionGlobal": {"descriptiva": null, "afectiva": 2}
|
|
}'::jsonb,
|
|
'[
|
|
{"categoria": "Otros", "subcategoria": "Químico", "notaEspecifica": "Medicinal"}
|
|
]'::jsonb,
|
|
'[
|
|
{"categoria": "Otros", "subcategoria": "Químico", "notaEspecifica": "Fenólico"}
|
|
]'::jsonb,
|
|
ARRAY[3, 4, 5]::smallint[],
|
|
ARRAY[5]::smallint[],
|
|
ARRAY['Áspero', 'Astringente']::text[],
|
|
ARRAY['Amargo']::text[],
|
|
'Fenólico',
|
|
'Café con defecto fenólico grave en taza 5. Sabor medicinal/químico. No apto para comercialización.'
|
|
);
|
|
|
|
-- Evaluación 5: Juan evalúa Muestra B-202
|
|
INSERT INTO evaluacion (
|
|
muestra_id,
|
|
sesion_participante_id,
|
|
intensidades,
|
|
fragancia_aroma_notas,
|
|
sabor_notas,
|
|
tazas_no_uniformes,
|
|
tazas_defectuosas,
|
|
sensacion_en_boca,
|
|
gustos_predominantes,
|
|
defecto,
|
|
otras_notas
|
|
) VALUES (
|
|
'ffffffff-ffff-ffff-ffff-ffffffffffff',
|
|
'cccccccc-cccc-cccc-cccc-cccccccccccc',
|
|
'{
|
|
"fragancia": {"descriptiva": 6, "afectiva": 7},
|
|
"aroma": {"descriptiva": 6, "afectiva": 7},
|
|
"sabor": {"descriptiva": 7, "afectiva": 7},
|
|
"saborResidual": {"descriptiva": 6, "afectiva": 7},
|
|
"acidez": {"descriptiva": 6, "afectiva": 7},
|
|
"dulzor": {"descriptiva": 7, "afectiva": 7},
|
|
"sensacionBoca": {"descriptiva": 6, "afectiva": 7},
|
|
"impresionGlobal": {"descriptiva": null, "afectiva": 7}
|
|
}'::jsonb,
|
|
'[
|
|
{"categoria": "Nueces", "subcategoria": "Avellana", "notaEspecifica": null}
|
|
]'::jsonb,
|
|
'[
|
|
{"categoria": "Caramelizado", "subcategoria": "Miel", "notaEspecifica": null}
|
|
]'::jsonb,
|
|
ARRAY[3]::smallint[],
|
|
ARRAY[]::smallint[],
|
|
ARRAY['Suave']::text[],
|
|
ARRAY['Dulce']::text[],
|
|
null,
|
|
'Café correcto. Taza 3 ligeramente diferente. Notas a nueces tostadas. Cuerpo medio.'
|
|
);
|