trello_fake/scripts/seed-projects-via-api.js

282 lines
9.4 KiB
JavaScript
Raw Normal View History

#!/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);
});