129 lines
3.5 KiB
TypeScript
129 lines
3.5 KiB
TypeScript
import { PrismaClient } from '@prisma/client';
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
// Recursos disponibles en la empresa
|
|
const resources = [
|
|
{ id: 'sala-A', name: 'Sala de Reuniones A' },
|
|
{ id: 'sala-B', name: 'Sala de Reuniones B' },
|
|
{ id: 'cowork-1', name: 'Espacio Coworking 1' },
|
|
{ id: 'cowork-2', name: 'Espacio Coworking 2' },
|
|
{ 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();
|
|
});
|