2026-07-01 08:09:26 -04:00

129 lines
3.5 KiB
TypeScript

import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
// Recursos disponibles en la empresa
const resources = [
{ id: 'aton1', name: 'Aton 1' },
{ id: 'aton2', name: 'Aton 2' },
{ id: 'aton3', name: 'Aton 3' },
{ id: 'cowork-1', name: 'Espacio Coworking 1' },
{ id: 'auditorio', name: 'Auditorio Principal' },
];
// Autores del equipo
const authors = [
'Jessica Orozco',
'Carlos Méndez',
'Ana Torres',
'Luis Herrera',
'María López',
];
// Slots de horario (horas laborales)
const slots = [
{ start: '09:00', end: '10:00' },
{ start: '10:00', end: '11:00' },
{ start: '11:00', end: '12:00' },
{ start: '14:00', end: '15:00' },
{ start: '15:00', end: '16:00' },
{ start: '16:00', end: '17:00' },
{ start: '17:00', end: '18:00' },
];
// Genera fechas futuras en julio 2026 (días hábiles: lunes a viernes)
function getFutureDates(): string[] {
const dates: string[] = [];
// Desde mañana (02/07) hasta fin de julio (31/07)
const start = new Date('2026-07-02');
const end = new Date('2026-07-31');
for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
const dayOfWeek = d.getDay();
if (dayOfWeek !== 0 && dayOfWeek !== 6) {
// excluir sábado y domingo
dates.push(d.toISOString().split('T')[0]);
}
}
return dates;
}
function getRandom<T>(arr: T[]): T {
return arr[Math.floor(Math.random() * arr.length)];
}
function getRandomNotes(): string | undefined {
const notes = [
'Reunión de planificación sprint',
'Demo con cliente',
'Sesión de diseño',
'Revisión de métricas',
'Workshop de onboarding',
'Retrospectiva del equipo',
undefined,
undefined, // 2/8 chance de sin notas
];
return getRandom(notes);
}
async function main() {
console.log('🌱 Iniciando seed de reservas futuras en Supabase...\n');
const dates = getFutureDates();
console.log(`📅 Fechas a cubrir: ${dates[0]}${dates[dates.length - 1]} (${dates.length} días hábiles)`);
let created = 0;
let skipped = 0;
for (const date of dates) {
// 2-4 reservas por día para simular uso real
const reservasDelDia = Math.floor(Math.random() * 3) + 2;
// Shuffle slots para no repetir
const shuffledSlots = [...slots].sort(() => Math.random() - 0.5);
for (let i = 0; i < reservasDelDia; i++) {
const slot = shuffledSlots[i];
const resource = getRandom(resources);
const author = getRandom(authors);
try {
await prisma.reserva.create({
data: {
resourceId: resource.id,
resourceName: resource.name,
date,
startTime: slot.start,
endTime: slot.end,
author,
notes: getRandomNotes(),
},
});
created++;
console.log(`${date} ${slot.start}-${slot.end} | ${resource.name} | ${author}`);
} catch (e: any) {
// Conflicto de unique constraint: mismo recurso + fecha + hora
if (e.code === 'P2002') {
skipped++;
} else {
console.error(` ❌ Error inesperado: ${e.message}`);
}
}
}
}
console.log(`\n📊 Resultado:`);
console.log(` ✅ Creadas: ${created} reservas`);
console.log(` ⏭️ Omitidas por conflicto: ${skipped}`);
console.log(`\n🎉 Seed completado. Datos disponibles en Supabase.`);
}
main()
.catch((e) => {
console.error('❌ Error en el seed:', e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});