#!/usr/bin/env node /** * Script para crear proyectos de prueba en Dolibarr usando la API Route * Este script usa la API Route segura de Next.js * * REQUISITO: El servidor de Next.js debe estar corriendo (npm run dev) * Uso: node scripts/seed-projects-via-api.js */ const NEXT_API_URL = 'http://localhost:3000/api/dolibarr'; // Datos de proyectos de ejemplo con variedad de estados y presupuestos const projectsData = [ { title: "Desarrollo de App Móvil", ref: "PROJ-2024-001", description: "Aplicación móvil para gestión de inventario con funcionalidades de escaneo QR y sincronización en tiempo real.", opp_amount: 45000, opp_percent: 65, date_start: Math.floor(new Date('2024-01-15').getTime() / 1000), date_end: Math.floor(new Date('2024-06-30').getTime() / 1000), }, { title: "Rediseño Web Corporativo", ref: "PROJ-2024-002", description: "Renovación completa del sitio web corporativo con nuevo diseño responsive y optimización SEO.", opp_amount: 28000, opp_percent: 90, date_start: Math.floor(new Date('2023-11-01').getTime() / 1000), date_end: Math.floor(new Date('2024-02-28').getTime() / 1000), }, { title: "Sistema de Facturación Automática", ref: "PROJ-2024-003", description: "Desarrollo de sistema automatizado para generación y envío de facturas con integración a contabilidad.", opp_amount: 62000, opp_percent: 35, date_start: Math.floor(new Date('2024-02-01').getTime() / 1000), date_end: Math.floor(new Date('2024-08-31').getTime() / 1000), }, { title: "Migración a Cloud AWS", ref: "PROJ-2024-004", description: "Migración completa de infraestructura on-premise a AWS con configuración de alta disponibilidad.", opp_amount: 85000, opp_percent: 20, date_start: Math.floor(new Date('2024-03-01').getTime() / 1000), date_end: Math.floor(new Date('2024-12-31').getTime() / 1000), }, { title: "Dashboard Analítico BI", ref: "PROJ-2024-005", description: "Creación de dashboard de Business Intelligence para análisis de ventas y KPIs en tiempo real.", opp_amount: 38000, opp_percent: 100, date_start: Math.floor(new Date('2023-09-01').getTime() / 1000), date_end: Math.floor(new Date('2023-12-15').getTime() / 1000), }, { title: "API REST Microservicios", ref: "PROJ-2024-006", description: "Desarrollo de arquitectura de microservicios con API REST para integración de sistemas legacy.", opp_amount: 72000, opp_percent: 50, date_start: Math.floor(new Date('2024-01-20').getTime() / 1000), date_end: Math.floor(new Date('2024-07-31').getTime() / 1000), }, { title: "App de Gestión de Proyectos", ref: "PROJ-2024-007", description: "Plataforma web para gestión ágil de proyectos con tableros Kanban, Gantt y reporting automático.", opp_amount: 55000, opp_percent: 75, date_start: Math.floor(new Date('2023-12-01').getTime() / 1000), date_end: Math.floor(new Date('2024-05-31').getTime() / 1000), }, { title: "E-commerce con Marketplace", ref: "PROJ-2024-008", description: "Plataforma de e-commerce completa con funcionalidad de marketplace multivendedor y pasarela de pagos.", opp_amount: 120000, opp_percent: 15, date_start: Math.floor(new Date('2024-04-01').getTime() / 1000), date_end: Math.floor(new Date('2025-03-31').getTime() / 1000), }, { title: "Sistema CRM Personalizado", ref: "PROJ-2024-009", description: "CRM a medida con automatización de marketing, gestión de leads y pipeline de ventas.", opp_amount: 48000, opp_percent: 0, date_start: Math.floor(new Date('2024-05-01').getTime() / 1000), date_end: Math.floor(new Date('2024-11-30').getTime() / 1000), }, { title: "Portal de Empleados", ref: "PROJ-2024-010", description: "Portal interno para empleados con gestión de vacaciones, nóminas, formación y comunicación interna.", opp_amount: 35000, opp_percent: 100, date_start: Math.floor(new Date('2023-10-01').getTime() / 1000), date_end: Math.floor(new Date('2023-12-31').getTime() / 1000), }, { title: "Sistema de Reservas Online", ref: "PROJ-2024-011", description: "Plataforma de reservas con calendario interactivo, confirmación automática y pasarela de pago.", opp_amount: 42000, opp_percent: 45, date_start: Math.floor(new Date('2024-02-15').getTime() / 1000), date_end: Math.floor(new Date('2024-07-15').getTime() / 1000), }, { title: "App de Formación Online", ref: "PROJ-2024-012", description: "Plataforma LMS para formación online con seguimiento de progreso, certificados y evaluaciones.", opp_amount: 68000, opp_percent: 30, date_start: Math.floor(new Date('2024-03-10').getTime() / 1000), date_end: Math.floor(new Date('2024-10-31').getTime() / 1000), }, ]; /** * Crear un proyecto usando la API Route de Next.js */ async function createProject(projectData) { const url = `${NEXT_API_URL}/projects`; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(projectData), }); if (!response.ok) { const errorData = await response.json(); throw new Error(`Error ${response.status}: ${errorData.error || 'Unknown error'}`); } const result = await response.json(); return result; } catch (error) { if (error.code === 'ECONNREFUSED') { throw new Error('No se puede conectar al servidor Next.js. ¿Está corriendo "npm run dev"?'); } throw error; } } /** * Validar proyecto (cambiar estado a validado/abierto) */ async function validateProject(projectId) { const url = `${NEXT_API_URL}/projects/${projectId}/validate`; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ notrigger: 0 }), }); if (!response.ok) { // Es normal que algunos proyectos no se puedan validar return false; } return true; } catch (error) { return false; } } /** * Script principal */ async function main() { console.log('\n🚀 SEED DE PROYECTOS DE PRUEBA PARA DOLIBARR\n'); console.log('═'.repeat(60)); console.log(`📡 API Next.js: ${NEXT_API_URL}`); console.log(`📊 Proyectos a crear: ${projectsData.length}`); console.log('═'.repeat(60)); console.log(''); // Verificar que Next.js esté corriendo console.log('🔍 Verificando conexión con Next.js...'); try { const testResponse = await fetch('http://localhost:3000'); if (!testResponse.ok && testResponse.status !== 404) { throw new Error('Server not responding'); } console.log('✅ Servidor Next.js está corriendo\n'); } catch (error) { console.error('❌ ERROR: No se puede conectar al servidor Next.js'); console.error(' Por favor, ejecuta "npm run dev" en otra terminal primero.\n'); process.exit(1); } let successCount = 0; let errorCount = 0; const errors = []; for (let i = 0; i < projectsData.length; i++) { const project = projectsData[i]; const num = i + 1; const percentage = project.opp_percent; // Indicador visual del progreso const progressBar = '▓'.repeat(Math.floor(percentage / 10)) + '░'.repeat(10 - Math.floor(percentage / 10)); console.log(`[${num}/${projectsData.length}] ${project.title}`); console.log(` 📈 Progreso: [${progressBar}] ${percentage}%`); console.log(` 💰 Presupuesto: €${project.opp_amount.toLocaleString()}`); try { // Crear proyecto const result = await createProject(project); console.log(` ✅ Creado con ID: ${result}`); // Validar proyecto si tiene progreso > 0 if (percentage > 0) { const validated = await validateProject(result); if (validated) { console.log(` ✓ Validado (estado: abierto)`); } else { console.log(` ⚠ Creado pero no validado (normal para algunos proyectos)`); } } else { console.log(` 📋 Dejado como borrador`); } successCount++; // Pequeña pausa para no saturar la API await new Promise(resolve => setTimeout(resolve, 500)); } catch (error) { console.log(` ❌ Error: ${error.message}`); errors.push({ project: project.title, error: error.message }); errorCount++; } console.log(''); } // Resumen final console.log('═'.repeat(60)); console.log('✨ PROCESO COMPLETADO\n'); console.log(`✅ Proyectos creados exitosamente: ${successCount}`); console.log(`❌ Proyectos con error: ${errorCount}`); if (errors.length > 0) { console.log('\n📋 Errores encontrados:'); errors.forEach(({ project, error }) => { console.log(` • ${project}: ${error}`); }); } console.log('═'.repeat(60)); if (successCount > 0) { console.log('\n💡 ¡Recarga tu aplicación para ver los proyectos!'); console.log(' Abre http://localhost:3000 en tu navegador\n'); } } // Ejecutar main().catch(error => { console.error('\n❌ ERROR FATAL:', error.message); console.error('\nAsegúrate de que:'); console.error(' 1. El servidor Next.js está corriendo (npm run dev)'); console.error(' 2. Dolibarr está accesible'); console.error(' 3. Las credenciales en .env.local son correctas\n'); process.exit(1); });