230 lines
7.2 KiB
JavaScript
230 lines
7.2 KiB
JavaScript
|
|
#!/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);
|
||
|
|
});
|