## Directivas SIMCO v3.7.0 - Estandarizacion de Documentacion (7) - SIMCO-DOCUMENTACION-PROYECTO.md - SIMCO-NOMENCLATURA.md - SIMCO-ESTRUCTURA-DOCS.md - SIMCO-INVENTARIOS.md - SIMCO-TESTING.md - SIMCO-MIGRACIONES-BD.md - SIMCO-INTEGRACIONES-EXTERNAS.md ## Directivas SIMCO v3.8.0 - Mantenimiento de Documentacion (2) - SIMCO-MANTENIMIENTO-DOCUMENTACION.md - SIMCO-SINCRONIZACION-BD.md ## Templates (4) - TEMPLATE-INVENTARIO-PROYECTO.md - TEMPLATE-INTEGRACION-EXTERNA.md - TEMPLATE-MODULO-ESTANDAR.md - TEMPLATE-DEPRECACION.md ## Checklists (6) - CHECKLIST-DOCUMENTACION-PROYECTO.md - CHECKLIST-INVENTARIOS.md - CHECKLIST-NOMENCLATURA.md - CHECKLIST-MANTENIMIENTO-DOCS.md - CHECKLIST-SINCRONIZACION-BD.md - _MAP.md ## Perfil de Agente (1) - PERFIL-DOCUMENTATION-MAINTAINER.md ## Indices - INDICE-DIRECTIVAS-WORKSPACE.yml actualizado a v3.8.0 ## Submodulos actualizados (14) - gamilit, erp-core, michangarrito, template-saas - erp-suite, erp-construccion, erp-clinicas - erp-mecanicas-diesel, erp-retail, erp-vidrio-templado - trading-platform, betting-analytics - inmobiliaria-analytics, platform_marketing_content Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
352 lines
8.4 KiB
Markdown
352 lines
8.4 KiB
Markdown
# TEMPLATE: Integracion Externa
|
|
|
|
**Version:** 1.0.0
|
|
**Proposito:** Template para documentar integraciones con servicios externos
|
|
**Referencia:** SIMCO-INTEGRACIONES-EXTERNAS.md
|
|
**Creado:** 2026-01-10
|
|
|
|
---
|
|
|
|
## Instrucciones de Uso
|
|
|
|
1. Copiar este template a `/docs/02-integraciones/` (o ubicacion equivalente)
|
|
2. Nombrar archivo: `INT-{NNN}-{nombre-proveedor}.md`
|
|
3. Reemplazar todos los placeholders `{...}`
|
|
4. Eliminar secciones que no apliquen
|
|
5. Mantener actualizado con cada cambio en la integracion
|
|
|
|
---
|
|
|
|
## Template
|
|
|
|
```markdown
|
|
# INT-{NNN}: {Nombre de la Integracion}
|
|
|
|
## Metadata
|
|
|
|
| Campo | Valor |
|
|
|-------|-------|
|
|
| **Codigo** | INT-{NNN} |
|
|
| **Proveedor** | {Nombre del proveedor} |
|
|
| **Tipo** | {Pagos|Auth|Notificaciones|Storage|Analytics|CRM|Comunicacion} |
|
|
| **Estado** | {Implementado|Documentado|En Desarrollo|Pendiente|Deprecado} |
|
|
| **Multi-tenant** | {Si|No} |
|
|
| **Fecha integracion** | {YYYY-MM-DD} |
|
|
| **Ultimo update** | {YYYY-MM-DD} |
|
|
| **Owner** | {Equipo/Persona responsable} |
|
|
|
|
---
|
|
|
|
## 1. Descripcion
|
|
|
|
{Parrafo explicando el proposito de esta integracion, que problema resuelve
|
|
y en que partes del sistema se utiliza.}
|
|
|
|
**Caso de uso principal:**
|
|
- {Caso de uso 1}
|
|
- {Caso de uso 2}
|
|
|
|
---
|
|
|
|
## 2. Credenciales Requeridas
|
|
|
|
### Variables de Entorno
|
|
|
|
| Variable | Descripcion | Tipo | Obligatorio |
|
|
|----------|-------------|------|-------------|
|
|
| `{PROVIDER}_API_KEY` | API Key para autenticacion | string | SI |
|
|
| `{PROVIDER}_SECRET` | Secret para firma de requests | string | SI |
|
|
| `{PROVIDER}_WEBHOOK_SECRET` | Secret para validar webhooks | string | NO |
|
|
| `{PROVIDER}_ENVIRONMENT` | Ambiente (sandbox/production) | string | SI |
|
|
|
|
### Ejemplo de .env
|
|
|
|
```env
|
|
# {Proveedor}
|
|
{PROVIDER}_API_KEY=pk_test_xxxxxxxxxxxx
|
|
{PROVIDER}_SECRET=sk_test_xxxxxxxxxxxx
|
|
{PROVIDER}_WEBHOOK_SECRET=whsec_xxxxxxxxxxxx
|
|
{PROVIDER}_ENVIRONMENT=sandbox
|
|
```
|
|
|
|
### Obtencion de Credenciales
|
|
|
|
1. Crear cuenta en {URL del dashboard del proveedor}
|
|
2. Navegar a Settings → API Keys
|
|
3. Generar par de llaves (test y production)
|
|
4. Configurar webhook URL: `{URL_BASE}/webhooks/{provider}`
|
|
|
|
---
|
|
|
|
## 3. Endpoints/SDK Utilizados
|
|
|
|
### Operaciones Implementadas
|
|
|
|
| Operacion | Metodo | Endpoint/SDK | Descripcion |
|
|
|-----------|--------|--------------|-------------|
|
|
| {Crear recurso} | POST | `/v1/{resource}` | {Descripcion} |
|
|
| {Obtener recurso} | GET | `/v1/{resource}/:id` | {Descripcion} |
|
|
| {Listar recursos} | GET | `/v1/{resource}` | {Descripcion} |
|
|
| {Actualizar recurso} | PUT | `/v1/{resource}/:id` | {Descripcion} |
|
|
| {Eliminar recurso} | DELETE | `/v1/{resource}/:id` | {Descripcion} |
|
|
|
|
### SDK/Cliente Utilizado
|
|
|
|
```typescript
|
|
// Dependencia npm
|
|
import { ProviderClient } from '{provider-sdk}';
|
|
|
|
// Inicializacion
|
|
const client = new ProviderClient(process.env.{PROVIDER}_API_KEY);
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Rate Limits
|
|
|
|
| Limite | Valor | Periodo | Accion si excede |
|
|
|--------|-------|---------|------------------|
|
|
| Requests totales | {N} | por minuto | 429 + Retry-After header |
|
|
| Requests por IP | {N} | por segundo | Backoff exponencial |
|
|
| Batch operations | {N} | por request | Split en multiples calls |
|
|
|
|
### Estrategia de Retry
|
|
|
|
```typescript
|
|
// Backoff exponencial implementado
|
|
const delays = [1000, 2000, 4000]; // ms
|
|
for (let attempt = 0; attempt < 3; attempt++) {
|
|
try {
|
|
return await client.call(request);
|
|
} catch (error) {
|
|
if (error.status === 429) {
|
|
await sleep(delays[attempt]);
|
|
continue;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 5. Manejo de Errores
|
|
|
|
### Codigos de Error
|
|
|
|
| Codigo | Descripcion | Accion Recomendada | Retry |
|
|
|--------|-------------|-------------------|-------|
|
|
| 400 | Bad Request - Parametros invalidos | Validar input | NO |
|
|
| 401 | Unauthorized - Credenciales invalidas | Verificar API key | NO |
|
|
| 403 | Forbidden - Sin permisos | Verificar scopes | NO |
|
|
| 404 | Not Found - Recurso no existe | Verificar ID | NO |
|
|
| 429 | Rate Limited | Esperar Retry-After | SI |
|
|
| 500 | Server Error | Retry con backoff | SI (3x) |
|
|
| 502 | Bad Gateway | Retry con backoff | SI (2x) |
|
|
| 503 | Service Unavailable | Retry con backoff | SI (5x) |
|
|
|
|
### Ejemplo de Manejo
|
|
|
|
```typescript
|
|
try {
|
|
const result = await providerService.createResource(data);
|
|
return result;
|
|
} catch (error) {
|
|
logger.error('Provider error', {
|
|
service: '{provider}',
|
|
operation: 'createResource',
|
|
code: error.code,
|
|
message: error.message,
|
|
tenantId: context.tenantId,
|
|
});
|
|
|
|
if (isRetryable(error)) {
|
|
return await retryWithBackoff(() => providerService.createResource(data));
|
|
}
|
|
|
|
throw new IntegrationException('{provider}', error);
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## 6. Fallbacks
|
|
|
|
### Estrategia de Fallback
|
|
|
|
| Escenario | Fallback | Tiempo maximo |
|
|
|-----------|----------|---------------|
|
|
| {Servicio caido} | {Cola para reintentar} | {N horas} |
|
|
| {Rate limited} | {Throttle local} | {N minutos} |
|
|
| {Timeout} | {Cache local} | {N segundos} |
|
|
|
|
### Modo Degradado
|
|
|
|
{Describir como funciona el sistema si esta integracion falla.
|
|
Que features se desactivan? Que alternativas hay?}
|
|
|
|
---
|
|
|
|
## 7. Multi-tenant
|
|
|
|
### Modelo de Credenciales
|
|
|
|
- [ ] **Global:** Una credencial para todos los tenants
|
|
- [ ] **Por Tenant:** Cada tenant configura sus credenciales
|
|
- [ ] **Hibrido:** Global con override por tenant
|
|
|
|
### Almacenamiento
|
|
|
|
```sql
|
|
-- Si credenciales por tenant
|
|
CREATE TABLE tenant_integrations (
|
|
id UUID PRIMARY KEY,
|
|
tenant_id UUID REFERENCES tenants(id),
|
|
provider VARCHAR(50) DEFAULT '{provider}',
|
|
credentials JSONB NOT NULL, -- Encriptado con tenant_key
|
|
config JSONB DEFAULT '{}',
|
|
is_active BOOLEAN DEFAULT true,
|
|
created_at TIMESTAMP DEFAULT NOW(),
|
|
UNIQUE(tenant_id, provider)
|
|
);
|
|
```
|
|
|
|
### Contexto en Llamadas
|
|
|
|
```typescript
|
|
// Obtener credenciales segun tenant
|
|
const credentials = await credentialsService.get(
|
|
tenantId,
|
|
'{provider}'
|
|
);
|
|
|
|
const client = new ProviderClient(credentials.apiKey);
|
|
```
|
|
|
|
---
|
|
|
|
## 8. Webhooks (si aplica)
|
|
|
|
### Endpoints Registrados
|
|
|
|
| Evento | Endpoint Local | Descripcion |
|
|
|--------|----------------|-------------|
|
|
| `{event.created}` | `/webhooks/{provider}/created` | {Descripcion} |
|
|
| `{event.updated}` | `/webhooks/{provider}/updated` | {Descripcion} |
|
|
| `{event.deleted}` | `/webhooks/{provider}/deleted` | {Descripcion} |
|
|
|
|
### Validacion de Webhooks
|
|
|
|
```typescript
|
|
// Verificar firma del webhook
|
|
function verifyWebhook(payload: string, signature: string): boolean {
|
|
const expected = crypto
|
|
.createHmac('sha256', process.env.{PROVIDER}_WEBHOOK_SECRET)
|
|
.update(payload)
|
|
.digest('hex');
|
|
|
|
return crypto.timingSafeEqual(
|
|
Buffer.from(signature),
|
|
Buffer.from(expected)
|
|
);
|
|
}
|
|
```
|
|
|
|
### Registro en Proveedor
|
|
|
|
1. Dashboard → Settings → Webhooks
|
|
2. URL: `https://{domain}/webhooks/{provider}`
|
|
3. Eventos: {lista de eventos suscritos}
|
|
4. Secret: Copiar a `{PROVIDER}_WEBHOOK_SECRET`
|
|
|
|
---
|
|
|
|
## 9. Testing
|
|
|
|
### Modo Sandbox/Test
|
|
|
|
| Ambiente | Credenciales | Datos |
|
|
|----------|--------------|-------|
|
|
| Sandbox | `pk_test_*` / `sk_test_*` | Datos ficticios |
|
|
| Production | `pk_live_*` / `sk_live_*` | Datos reales |
|
|
|
|
### Datos de Prueba
|
|
|
|
```
|
|
# Tarjeta de prueba (si aplica)
|
|
Numero: 4242 4242 4242 4242
|
|
Exp: 12/28
|
|
CVV: 123
|
|
|
|
# Usuario de prueba
|
|
Email: test@{provider}.com
|
|
Password: test123
|
|
```
|
|
|
|
### Comandos de Test
|
|
|
|
```bash
|
|
# Test de conexion
|
|
npm run test:integration -- --grep "{provider}"
|
|
|
|
# Test de webhook
|
|
curl -X POST http://localhost:3000/webhooks/{provider} \
|
|
-H "Content-Type: application/json" \
|
|
-H "X-Signature: {test_signature}" \
|
|
-d '{"event": "test"}'
|
|
```
|
|
|
|
---
|
|
|
|
## 10. Monitoreo
|
|
|
|
### Metricas a Monitorear
|
|
|
|
| Metrica | Descripcion | Alerta |
|
|
|---------|-------------|--------|
|
|
| Latencia | Tiempo de respuesta promedio | > 2s |
|
|
| Error Rate | % de requests fallidos | > 5% |
|
|
| Rate Limit Usage | % del limite usado | > 80% |
|
|
| Webhook Delay | Tiempo entre evento y recepcion | > 30s |
|
|
|
|
### Logs Estructurados
|
|
|
|
```typescript
|
|
logger.info('Provider call', {
|
|
service: '{provider}',
|
|
operation: '{operation}',
|
|
duration: durationMs,
|
|
tenantId: context.tenantId,
|
|
resourceId: result.id,
|
|
success: true,
|
|
});
|
|
```
|
|
|
|
---
|
|
|
|
## 11. Referencias
|
|
|
|
### Documentacion Oficial
|
|
- [API Reference]({url_documentacion})
|
|
- [SDK Documentation]({url_sdk})
|
|
- [Changelog]({url_changelog})
|
|
|
|
### Modulos Relacionados
|
|
- [Modulo Backend](../../apps/backend/src/modules/{modulo}/)
|
|
- [Servicio](../../apps/backend/src/modules/{modulo}/{provider}.service.ts)
|
|
- [DTOs](../../apps/backend/src/modules/{modulo}/dto/)
|
|
|
|
### Soporte
|
|
- Email: support@{provider}.com
|
|
- Dashboard: {url_dashboard}
|
|
|
|
---
|
|
|
|
**Ultima actualizacion:** {YYYY-MM-DD}
|
|
**Autor:** {nombre/equipo}
|
|
```
|
|
|
|
---
|
|
|
|
**Referencia:** SIMCO-INTEGRACIONES-EXTERNAS.md
|