erp-construccion/docs/00-vision-general/MARKETPLACE-EXTENSIONES.md

1082 lines
24 KiB
Markdown

# Marketplace de Extensiones - Guía de Desarrollo
**Versión:** 1.0
**Fecha:** 2025-11-17
**SDK Version:** 1.0.0
**Modelo:** SaaS Multi-tenant B2B
---
## 📋 Resumen Ejecutivo
El Marketplace de Extensiones permite a constructoras (tenants), partners y desarrolladores externos crear funcionalidad custom sin modificar el core del sistema. Las extensiones se desarrollan usando el SDK oficial y se distribuyen a través del marketplace centralizado.
**Tipos de desarrolladores:**
- **Equipo interno**: Extensiones oficiales (integraciones, reportes)
- **Partners certificados**: Módulos verticales especializados
- **Clientes enterprise**: Extensiones privadas para uso interno
- **Comunidad**: Extensiones públicas open-source
---
## 🎯 Tipos de Extensiones
### 1. Integraciones (Connectors)
Conectores a sistemas externos:
**Ejemplos:**
- SAP S/4HANA Connector
- CONTPAQi Connector
- WhatsApp Business API
- QuickBooks Online
- Slack Notifications
- Microsoft Teams
- Google Workspace
- Zoom Meetings
**Características:**
- Autenticación OAuth 2.0
- Webhooks bidireccionales
- Retry logic y error handling
- Rate limiting inteligente
- Logs de sincronización
**Pricing típico:** $0-$199/mes
---
### 2. Reportes Custom
Plantillas de reportes especializados:
**Ejemplos:**
- Reporte INFONAVIT EVC (formato oficial 2025)
- Reporte para licitaciones CFE
- Reporte de cumplimiento NOM-031-STPS
- Dashboard ejecutivo C-level
- Reporte de rentabilidad por proyecto
- Análisis de variaciones de presupuesto
**Características:**
- Exportación a PDF, Excel, CSV
- Scheduling automático (diario, semanal, mensual)
- Email delivery
- Plantillas con branding de la constructora
- Cálculos complejos pre-configurados
**Pricing típico:** $29-$99 (one-time) o $10-$50/mes
---
### 3. Módulos Verticales
Funcionalidad específica por tipo de constructora:
**Ejemplos:**
- Módulo de Obra Civil Pesada (puentes, carreteras)
- Módulo de Edificación Alta (rascacielos, oficinas)
- Módulo de Obra Industrial (plantas, fábricas)
- Módulo de Infraestructura (aeropuertos, estaciones)
- Módulo de Restauración (edificios históricos)
**Características:**
- Catálogos especializados (actividades, riesgos, EPP)
- Workflows específicos
- Reportes regulatorios verticales
- Integraciones con herramientas especializadas
**Pricing típico:** $199-$599/mes
---
### 4. Workflows Custom
Flujos de aprobación personalizados:
**Ejemplos:**
- Workflow de estimaciones 5 niveles (Resident → Super → Director → Finance → Cliente)
- Workflow de compras con 3 cotizaciones obligatorias
- Workflow de cambios de alcance con firma digital
- Workflow de liberación de pagos a subcontratistas
**Características:**
- Aprobaciones paralelas o secuenciales
- Escalamiento automático por tiempo
- Notificaciones por múltiples canales
- Firma digital integrada
- Audit trail completo
**Pricing típico:** $49-$199/mes
---
### 5. Dashboards Temáticos
Dashboards especializados:
**Ejemplos:**
- Dashboard Financiero (CFO)
- Dashboard de Producción (Gerente de Obra)
- Dashboard de Calidad (QA Manager)
- Dashboard de HSE (Safety Manager)
- Dashboard de Compras (Procurement)
**Características:**
- Widgets personalizables
- Drill-down interactivo
- Alertas en tiempo real
- Exportación programada
- Mobile responsive
**Pricing típico:** $29-$99/mes
---
### 6. Templates
Plantillas de documentos y procesos:
**Ejemplos:**
- Contratos tipo (obra, subcontrato, arrendamiento)
- Formatos oficiales (permisos, licencias)
- Checklists de calidad por actividad
- Procedimientos de seguridad
- Minutas de junta
**Características:**
- Merge de datos del sistema
- Variables dinámicas
- Versionado de templates
- Firma digital
- Multi-idioma
**Pricing típico:** $9-$49 (one-time)
---
## 🛠️ SDK de Desarrollo
### Instalación
```bash
npm install @erp-construccion/extension-sdk
```
### Estructura de una Extensión
```typescript
// mi-extension/
// ├── package.json
// ├── extension.config.ts
// ├── src/
// │ ├── index.ts // Entry point
// │ ├── hooks/ // Event hooks
// │ ├── components/ // UI components (React)
// │ ├── services/ // Business logic
// │ └── utils/ // Utilities
// └── tests/
// package.json
{
"name": "@mi-empresa/extension-whatsapp",
"version": "1.0.0",
"description": "Notificaciones por WhatsApp",
"main": "dist/index.js",
"dependencies": {
"@erp-construccion/extension-sdk": "^1.0.0"
},
"extensionMetadata": {
"displayName": "WhatsApp Notifier",
"category": "integrations",
"pricing": {
"type": "free"
},
"permissions": [
"notifications.send",
"users.read"
]
}
}
```
### Configuración de Extensión
```typescript
// extension.config.ts
import { ExtensionConfig } from '@erp-construccion/extension-sdk';
export default {
id: 'whatsapp-notifier',
name: 'WhatsApp Notifier',
version: '1.0.0',
author: {
name: 'Mi Empresa',
email: 'soporte@mi-empresa.com',
website: 'https://mi-empresa.com'
},
description: 'Envía notificaciones automáticas por WhatsApp',
icon: 'https://cdn.mi-empresa.com/whatsapp-icon.png',
// Compatibilidad
minPlatformVersion: '2.0.0',
maxPlatformVersion: '3.0.0',
// Pricing
pricing: {
type: 'free', // 'free' | 'one_time' | 'subscription'
amount: 0,
currency: 'USD',
trial: false
},
// Permisos requeridos
permissions: [
'notifications.send',
'users.read',
'projects.read'
],
// Configuración
settings: [
{
key: 'whatsapp_api_key',
type: 'string',
required: true,
secure: true,
label: 'WhatsApp API Key',
description: 'API key de WhatsApp Business'
},
{
key: 'default_template',
type: 'select',
options: ['template1', 'template2'],
default: 'template1',
label: 'Plantilla por defecto'
}
]
} as ExtensionConfig;
```
---
## 📚 API del SDK
### 1. Hooks (Eventos)
```typescript
import { Extension, Hook } from '@erp-construccion/extension-sdk';
@Extension({
id: 'whatsapp-notifier',
name: 'WhatsApp Notifier'
})
export class WhatsAppNotifierExtension {
// Hook: Cuando se crea una estimación
@Hook('estimations.created')
async onEstimationCreated(estimation: Estimation) {
const constructora = this.context.constructora;
const users = await this.api.users.findByRole('finance');
for (const user of users) {
if (user.phone && user.notificationsEnabled) {
await this.sendWhatsApp(user.phone, {
template: 'estimation_created',
params: {
estimationNumber: estimation.number,
amount: estimation.amount,
project: estimation.project.name
}
});
}
}
}
// Hook: Cuando se aprueba un presupuesto
@Hook('budgets.approved')
async onBudgetApproved(budget: Budget) {
// Lógica custom
}
// Hook: Cuando un proyecto excede presupuesto
@Hook('projects.budget_exceeded')
async onBudgetExceeded(project: Project, overrun: number) {
// Alertar al director de proyecto
const director = await this.api.users.findById(project.directorId);
await this.sendWhatsApp(director.phone, {
template: 'budget_alert',
params: {
projectName: project.name,
overrunPercentage: (overrun * 100).toFixed(2)
}
});
}
}
```
**Hooks disponibles:**
```typescript
// Proyectos
'projects.created'
'projects.updated'
'projects.deleted'
'projects.budget_exceeded'
'projects.milestone_reached'
// Presupuestos
'budgets.created'
'budgets.approved'
'budgets.rejected'
// Compras
'purchases.order_created'
'purchases.order_approved'
'purchases.goods_received'
// Estimaciones
'estimations.created'
'estimations.approved'
'estimations.paid'
// Control de Obra
'progress.updated'
'progress.milestone_completed'
// RRHH
'employees.hired'
'employees.terminated'
'attendance.checked_in'
'attendance.anomaly_detected'
// HSE
'incidents.registered'
'incidents.investigated'
'risks.predicted' // IA
'patterns.detected' // IA
// Calidad
'defects.reported'
'defects.resolved'
// Finanzas
'accounting.entry_created'
'payments.made'
'invoices.received'
// General
'notifications.sent'
'reports.generated'
```
---
### 2. API de Datos
```typescript
// Acceso a datos de la constructora
import { API } from '@erp-construccion/extension-sdk';
export class MiExtension {
async getMiData() {
const api = this.context.api;
// Proyectos
const projects = await api.projects.findAll({
status: 'active',
limit: 10
});
// Presupuestos
const budget = await api.budgets.findById('budget-123');
// Usuarios
const users = await api.users.findByRole('engineer');
// Custom queries
const result = await api.query(`
SELECT p.name, SUM(b.amount) as total
FROM projects p
JOIN budgets b ON b.project_id = p.id
WHERE p.status = 'active'
GROUP BY p.id
`);
return result;
}
// Crear datos
async createProject() {
const project = await this.context.api.projects.create({
name: 'Nuevo Proyecto',
code: 'PRJ-2025-001',
startDate: '2025-01-01',
endDate: '2025-12-31'
});
return project;
}
// Actualizar datos
async updateProject(id: string) {
const project = await this.context.api.projects.update(id, {
status: 'completed'
});
return project;
}
}
```
---
### 3. UI Components (React)
```typescript
import { Component, MenuItem } from '@erp-construccion/extension-sdk';
import { useState } from 'react';
// Agregar ítem al menú lateral
@MenuItem({
section: 'settings',
label: 'Configurar WhatsApp',
icon: 'whatsapp',
route: '/settings/whatsapp'
})
export function WhatsAppSettingsPage() {
const [apiKey, setApiKey] = useState('');
const handleSave = async () => {
await context.settings.save({ whatsapp_api_key: apiKey });
};
return (
<div>
<h1>Configuración de WhatsApp</h1>
<input
type="text"
value={apiKey}
onChange={(e) => setApiKey(e.target.value)}
placeholder="API Key"
/>
<button onClick={handleSave}>Guardar</button>
</div>
);
}
// Agregar widget al dashboard
@Component({
type: 'dashboard-widget',
title: 'Notificaciones WhatsApp Enviadas',
defaultSize: { w: 2, h: 1 }
})
export function WhatsAppStatsWidget() {
const [stats, setStats] = useState({ sent: 0, delivered: 0, failed: 0 });
useEffect(() => {
// Cargar estadísticas
const loadStats = async () => {
const data = await context.api.custom('/whatsapp/stats');
setStats(data);
};
loadStats();
}, []);
return (
<div className="widget">
<h3>WhatsApp Stats (Últimos 7 días)</h3>
<div>Enviados: {stats.sent}</div>
<div>Entregados: {stats.delivered}</div>
<div>Fallidos: {stats.failed}</div>
</div>
);
}
// Agregar botón en página de estimaciones
@Component({
type: 'action-button',
page: 'estimations.detail',
label: 'Enviar por WhatsApp',
icon: 'send'
})
export function SendEstimationButton({ estimation }: { estimation: Estimation }) {
const handleSend = async () => {
// Enviar estimación por WhatsApp
await sendEstimationViaWhatsApp(estimation);
};
return <button onClick={handleSend}>Enviar por WhatsApp</button>;
}
```
---
### 4. Servicios y Utilidades
```typescript
import { Service, injectable } from '@erp-construccion/extension-sdk';
@Service()
export class WhatsAppService {
async sendMessage(phone: string, message: string) {
const apiKey = await this.context.settings.get('whatsapp_api_key');
const response = await fetch('https://api.whatsapp.com/send', {
method: 'POST',
headers: {
'Authorization': `Bearer ${apiKey}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
to: phone,
message: message
})
});
if (!response.ok) {
throw new Error('Failed to send WhatsApp message');
}
// Registrar en audit log
await this.context.audit.log({
action: 'whatsapp.message_sent',
details: { phone, message }
});
return response.json();
}
async sendTemplate(phone: string, templateId: string, params: any) {
// Implementación de template
}
}
```
---
### 5. Storage (Persistencia)
```typescript
// Cada extensión tiene su propio almacenamiento aislado por constructora
import { Storage } from '@erp-construccion/extension-sdk';
export class MiExtension {
async guardarConfig() {
// Guardar en storage de la extensión
await this.context.storage.set('mi_config', {
apiKey: 'xxx',
enabled: true,
lastSync: new Date()
});
}
async cargarConfig() {
const config = await this.context.storage.get('mi_config');
return config;
}
async eliminarConfig() {
await this.context.storage.delete('mi_config');
}
// Storage de archivos
async subirArchivo(file: File) {
const url = await this.context.storage.uploadFile(file, {
folder: 'whatsapp-attachments',
maxSize: 10 * 1024 * 1024, // 10 MB
allowedTypes: ['image/png', 'image/jpeg', 'application/pdf']
});
return url;
}
}
```
---
### 6. Notificaciones
```typescript
import { Notifications } from '@erp-construccion/extension-sdk';
export class MiExtension {
async enviarNotificacion() {
// Notificación in-app
await this.context.notifications.send({
userId: 'user-123',
title: 'Estimación Aprobada',
message: 'La estimación #EST-2025-001 ha sido aprobada',
type: 'success',
link: '/estimations/EST-2025-001'
});
// Email
await this.context.notifications.sendEmail({
to: 'user@example.com',
subject: 'Estimación Aprobada',
template: 'estimation_approved',
data: {
estimationNumber: 'EST-2025-001',
amount: '$250,000 USD'
}
});
// SMS
await this.context.notifications.sendSMS({
phone: '+52 442 123 4567',
message: 'Estimación EST-2025-001 aprobada por $250,000 USD'
});
}
}
```
---
### 7. Scheduled Jobs (Tareas Programadas)
```typescript
import { Job, Schedule } from '@erp-construccion/extension-sdk';
@Job()
export class SyncJob {
// Ejecutar cada hora
@Schedule('0 * * * *')
async syncData() {
console.log('Sincronizando datos con sistema externo...');
// Obtener datos pendientes
const pending = await this.context.storage.get('pending_sync');
// Sincronizar
for (const item of pending) {
await this.syncItem(item);
}
// Limpiar
await this.context.storage.delete('pending_sync');
}
// Ejecutar diariamente a las 2 AM
@Schedule('0 2 * * *')
async dailyReport() {
// Generar reporte diario
const report = await this.generateReport();
// Enviar por email
await this.context.notifications.sendEmail({
to: 'admin@company.com',
subject: 'Reporte Diario WhatsApp',
body: report
});
}
private async syncItem(item: any) {
// Implementación
}
private async generateReport() {
// Implementación
return 'Reporte...';
}
}
```
---
## 📦 Publicación en el Marketplace
### 1. Desarrollo Local
```bash
# Clonar template
git clone https://github.com/erp-construccion/extension-template
cd extension-template
# Instalar dependencias
npm install
# Desarrollo en modo watch
npm run dev
# Testing
npm test
# Build para producción
npm run build
```
### 2. Testing en Constructora de Prueba
```bash
# Subir extensión a constructora de prueba
npm run deploy --constructora=my-test-constructora
# Ver logs en tiempo real
npm run logs --constructora=my-test-constructora
```
### 3. Validación y Certificación
**Checklist de validación:**
- [ ] ✅ Todos los tests pasan (coverage ≥80%)
- [ ] ✅ Sin vulnerabilidades de seguridad (npm audit)
- [ ] ✅ Documentación completa (README.md)
- [ ] ✅ Screenshots/demo video
- [ ] ✅ Pricing definido
- [ ] ✅ Soporte definido (email, docs, SLA)
- [ ] ✅ Compatible con versiones de plataforma
- [ ] ✅ No usa APIs privadas/no documentadas
- [ ] ✅ Maneja errores gracefully
- [ ] ✅ Logs apropiados (no spam)
- [ ] ✅ Performance aceptable (no bloquea UI)
**Revisión del equipo:**
- Seguridad: Audit de código (SAST/DAST)
- Compliance: Verificación de licencias
- UX: Revisión de interfaz
- Performance: Load testing
### 4. Publicar al Marketplace
```bash
# Login con credenciales de desarrollador
npm run marketplace:login
# Publicar (primera vez)
npm run marketplace:publish
# Actualizar versión existente
npm run marketplace:publish --version=1.1.0 --changelog="Bug fixes"
```
**Formulario de publicación:**
```yaml
name: "WhatsApp Notifier"
description: "Envía notificaciones automáticas por WhatsApp Business API"
category: "integrations"
version: "1.0.0"
author: "Mi Empresa"
support_email: "soporte@mi-empresa.com"
support_url: "https://docs.mi-empresa.com/whatsapp"
documentation_url: "https://docs.mi-empresa.com/whatsapp"
privacy_policy_url: "https://mi-empresa.com/privacy"
terms_url: "https://mi-empresa.com/terms"
pricing:
type: "free"
screenshots:
- url: "https://cdn.mi-empresa.com/screenshot1.png"
caption: "Dashboard principal"
- url: "https://cdn.mi-empresa.com/screenshot2.png"
caption: "Configuración"
demo_video: "https://youtube.com/watch?v=xxx"
keywords:
- whatsapp
- notifications
- messaging
compatible_plans:
- professional
- enterprise
permissions:
- notifications.send
- users.read
changelog: |
## v1.0.0 (2025-11-17)
- Initial release
- WhatsApp Business API integration
- Templates for estimations and budgets
```
---
## 💰 Modelos de Monetización
### 1. Gratis
```typescript
pricing: {
type: 'free'
}
```
**Casos de uso:**
- Extensiones open-source
- Marketing (lead generation)
- Complemento de servicio principal
---
### 2. Pago Único
```typescript
pricing: {
type: 'one_time',
amount: 49,
currency: 'USD'
}
```
**Casos de uso:**
- Templates
- Reportes estáticos
- Herramientas simples
---
### 3. Suscripción Mensual
```typescript
pricing: {
type: 'subscription',
amount: 99,
currency: 'USD',
interval: 'month',
trial: {
enabled: true,
days: 14
}
}
```
**Casos de uso:**
- Integraciones
- Módulos con mantenimiento
- Servicios externos (APIs)
---
### 4. Basado en Uso
```typescript
pricing: {
type: 'usage_based',
base: 29, // Base mensual
tiers: [
{ upTo: 1000, pricePerUnit: 0.05 }, // $0.05 por notificación
{ upTo: 10000, pricePerUnit: 0.03 },
{ upTo: null, pricePerUnit: 0.01 } // Ilimitado a $0.01
],
unit: 'notification'
}
```
**Casos de uso:**
- SMS/WhatsApp
- APIs externas con costo
- Servicios de IA/ML
---
### 5. Freemium
```typescript
pricing: {
type: 'freemium',
free: {
limits: {
notifications: 100, // 100 notificaciones/mes gratis
users: 5
}
},
pro: {
amount: 49,
currency: 'USD',
interval: 'month',
limits: {
notifications: 10000,
users: null // Ilimitado
}
}
}
```
---
## 🔒 Seguridad de Extensiones
### Sandboxing
Las extensiones corren en un entorno aislado:
```typescript
// Restricciones automáticas:
- No pueden acceder directamente a la base de datos
- Solo pueden usar APIs expuestas por el SDK
- No pueden ejecutar código nativo
- Timeouts automáticos (30s por request)
- Rate limiting por constructora
- Memory limits (512 MB por extensión)
```
### Permisos Granulares
```typescript
permissions: [
'projects.read', // Leer proyectos
'projects.write', // Crear/editar proyectos
'budgets.read',
'users.read',
'notifications.send',
'files.upload',
'webhooks.create'
]
```
**La constructora debe aprobar los permisos al instalar la extensión.**
### Audit Logging
Todas las acciones de extensiones se registran:
```typescript
await this.context.audit.log({
action: 'extension.data_accessed',
extension: 'whatsapp-notifier',
resource: 'projects',
resourceId: 'proj-123',
details: { action: 'read' }
});
```
---
## 📊 Analytics para Desarrolladores
Dashboard de métricas de tu extensión:
```
┌─────────────────────────────────────────────────┐
│ WhatsApp Notifier - Analytics │
├─────────────────────────────────────────────────┤
│ │
│ 📊 Instalaciones │
│ Total: 234 tenants │
│ Activos: 198 (84.6%) │
│ Trial: 28 (12%) │
│ Cancelados: 8 (3.4%) │
│ │
│ 💰 Revenue (MRR) │
│ $0 (extensión gratuita) │
│ │
│ ⭐ Ratings │
│ Promedio: 4.7/5.0 (89 reviews) │
│ │
│ 📈 Uso │
│ Notificaciones enviadas (30 días): 45,678 │
│ Promedio por tenant: 230/mes │
│ │
│ 🐛 Errores (últimos 7 días) │
│ Total: 12 (0.026% error rate) │
│ Por tipo: │
│ - API timeout: 8 │
│ - Invalid phone: 3 │
│ - Rate limit: 1 │
│ │
└─────────────────────────────────────────────────┘
```
---
## 🎯 Casos de Éxito
### Ejemplo 1: SAP Connector (Partner Oficial)
**Desarrollador:** SAP Integration Partners
**Tipo:** Integración
**Pricing:** $99/mes
**Instalaciones:** 45 tenants enterprise
**MRR:** $4,455
**Descripción:**
Conecta el ERP de construcción con SAP S/4HANA para sincronizar pólizas contables, cuentas por pagar/cobrar y datos maestros.
**Features:**
- Sincronización bidireccional automática
- Mapping personalizable de cuentas
- Logs de sincronización
- Soporte 24/7
---
### Ejemplo 2: Reporte INFONAVIT (Comunidad)
**Desarrollador:** Juan Pérez (independiente)
**Tipo:** Reporte custom
**Pricing:** $49 (one-time)
**Ventas:** 127 instalaciones
**Revenue total:** $6,223
**Descripción:**
Genera el reporte oficial de INFONAVIT en formato EVC actualizado 2025, con todos los campos requeridos pre-llenados desde los datos del sistema.
---
### Ejemplo 3: Módulo Obra Civil (Partner Certificado)
**Desarrollador:** CivilTech Solutions
**Tipo:** Módulo vertical
**Pricing:** $299/mes
**Instalaciones:** 12 tenants
**MRR:** $3,588
**Descripción:**
Módulo especializado para constructoras de obra civil pesada (puentes, carreteras, presas) con funcionalidad específica de control de acarreos, laboratorio de suelos, y reportes para SCT.
---
## 🚀 Roadmap del SDK
**Q1 2026:**
- ✅ SDK v2.0 con TypeScript full support
- ✅ Webhooks mejorados (retry exponential backoff)
- ✅ GraphQL API (además de REST)
**Q2 2026:**
- 📋 Mobile SDK (React Native components)
- 📋 Extension templates (quickstart)
- 📋 CLI tool mejorado
**Q3 2026:**
- 📋 Serverless functions (AWS Lambda integration)
- 📋 Real-time data subscriptions (WebSockets)
- 📋 AI/ML integration (TensorFlow.js)
---
## 📚 Recursos
**Documentación:**
- [SDK Reference](https://docs.erp-construccion.com/sdk)
- [API Reference](https://docs.erp-construccion.com/api)
- [Extension Examples](https://github.com/erp-construccion/extension-examples)
- [Best Practices](https://docs.erp-construccion.com/best-practices)
**Comunidad:**
- [Discord](https://discord.gg/erp-construccion)
- [Stack Overflow](https://stackoverflow.com/questions/tagged/erp-construccion)
- [GitHub Discussions](https://github.com/erp-construccion/sdk/discussions)
**Soporte:**
- Email: developers@erp-construccion.com
- Office Hours: Viernes 10am-12pm PST (Zoom)
---
**Generado:** 2025-11-17
**SDK Versión:** 1.0.0
**Modelo:** SaaS Multi-tenant Marketplace