Inicializar rioCata - Sistema de Catación de Café
- 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
This commit is contained in:
244
postgres/init/04_sample_data.sql
Normal file
244
postgres/init/04_sample_data.sql
Normal file
@@ -0,0 +1,244 @@
|
||||
-- ============================================
|
||||
-- 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.'
|
||||
);
|
||||
Reference in New Issue
Block a user