#!/usr/bin/env node /** * Script para crear proyectos de prueba en Dolibarr * Uso: node scripts/seed-projects.js */ const API_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8200/api/index.php'; const API_KEY = process.env.NEXT_PUBLIC_DOLIBARR_API_KEY || 'Xzulu2Jbv1Ge4V1IVtXKe45db9W64WN7'; // Datos de proyectos de ejemplo 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.", socid: null, // Sin cliente asignado 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.", socid: null, 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.", socid: null, 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.", socid: null, 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.", socid: null, 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.", socid: null, 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.", socid: null, 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.", socid: null, 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.", socid: null, 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.", socid: null, 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), }, ]; /** * Crear un proyecto en Dolibarr */ async function createProject(projectData) { const url = `${API_URL}/projects?DOLAPIKEY=${API_KEY}`; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify(projectData), }); if (!response.ok) { const errorText = await response.text(); throw new Error(`Error ${response.status}: ${errorText}`); } const result = await response.json(); return result; } catch (error) { throw error; } } /** * Validar proyecto (cambiar estado a validado/abierto) */ async function validateProject(projectId) { const url = `${API_URL}/projects/${projectId}/validate?DOLAPIKEY=${API_KEY}`; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', }, body: JSON.stringify({ notrigger: 0 }), }); if (!response.ok) { const errorText = await response.text(); console.warn(` ⚠️ No se pudo validar (puede ser normal): ${errorText.substring(0, 100)}`); return false; } return true; } catch (error) { console.warn(` ⚠️ Error validando proyecto: ${error.message}`); return false; } } /** * Script principal */ async function main() { console.log('🚀 Iniciando creación de proyectos de prueba en Dolibarr...\n'); console.log(`📡 API URL: ${API_URL}`); console.log(`🔑 API Key: ${API_KEY.substring(0, 10)}...`); console.log(`📊 Proyectos a crear: ${projectsData.length}\n`); let successCount = 0; let errorCount = 0; for (let i = 0; i < projectsData.length; i++) { const project = projectsData[i]; const num = i + 1; console.log(`[${num}/${projectsData.length}] Creando: "${project.title}"...`); try { // Crear proyecto const result = await createProject(project); console.log(` ✅ Proyecto creado con ID: ${result}`); // Validar proyecto (cambiar a estado abierto) // Solo validar proyectos que no estén al 0% (borradores) if (project.opp_percent > 0) { console.log(` 📝 Validando proyecto...`); await validateProject(result); } successCount++; // Pequeña pausa entre creaciones await new Promise(resolve => setTimeout(resolve, 300)); } catch (error) { console.error(` ❌ Error: ${error.message}`); errorCount++; } console.log(''); } console.log('═'.repeat(60)); console.log(`✨ Proceso completado!`); console.log(`✅ Exitosos: ${successCount}`); console.log(`❌ Errores: ${errorCount}`); console.log('═'.repeat(60)); if (successCount > 0) { console.log('\n💡 Ahora puedes recargar tu aplicación para ver los proyectos creados!'); } } // Ejecutar main().catch(error => { console.error('❌ Error fatal:', error); process.exit(1); });