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(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(); });