# MGN-015: Especificaciones Técnicas Backend

## Descripción

Especificaciones técnicas de la API REST para el módulo de Billing y Suscripciones. Incluye endpoints para gestión de planes, suscripciones, métodos de pago, facturación y métricas de uso.

## Especificaciones Disponibles

| ID | Nombre | RF Relacionado | Estado |
|----|--------|----------------|--------|
| [ET-MGN-015-001](./ET-MGN-015-001-api-planes-suscripcion.md) | API de Planes de Suscripción | RF-001 | Especificado |
| [ET-MGN-015-002](./ET-MGN-015-002-api-suscripciones.md) | API de Suscripciones | RF-002 | Especificado |
| [ET-MGN-015-003](./ET-MGN-015-003-api-metodos-pago.md) | API de Métodos de Pago | RF-003 | Especificado |
| [ET-MGN-015-004](./ET-MGN-015-004-api-facturacion.md) | API de Facturación | RF-004 | Especificado |
| [ET-MGN-015-005](./ET-MGN-015-005-api-uso-metricas.md) | API de Uso y Métricas | RF-005 | Especificado |

## Estructura del Módulo

```
src/modules/billing/
├── index.ts                    # Exports del módulo
├── billing.routes.ts           # Router principal
├── plans/
│   ├── plans.controller.ts
│   ├── plans.service.ts
│   ├── plans.routes.ts
│   └── plans.validation.ts
├── subscriptions/
│   ├── subscriptions.controller.ts
│   ├── subscriptions.service.ts
│   ├── subscriptions.routes.ts
│   └── subscriptions.validation.ts
├── payment-methods/
│   ├── payment-methods.controller.ts
│   ├── payment-methods.service.ts
│   ├── payment-methods.routes.ts
│   └── payment-methods.validation.ts
├── invoices/
│   ├── invoices.controller.ts
│   ├── invoices.service.ts
│   ├── invoices.routes.ts
│   └── invoices.validation.ts
├── usage/
│   ├── usage.controller.ts
│   ├── usage.service.ts
│   └── usage.routes.ts
├── webhooks/
│   ├── stripe.webhook.ts
│   └── webhook.routes.ts
├── jobs/
│   ├── subscription-renewal.job.ts
│   ├── payment-retry.job.ts
│   ├── invoice-generation.job.ts
│   └── record-usage.job.ts
└── services/
    ├── pac.service.ts          # Integración PAC para CFDI
    └── stripe.service.ts       # Integración Stripe
```

## Rutas de la API

### Planes (Super Admin)
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | /api/v1/billing/plans | Listar planes |
| GET | /api/v1/billing/plans/:id | Obtener plan |
| POST | /api/v1/billing/plans | Crear plan |
| PUT | /api/v1/billing/plans/:id | Actualizar plan |
| DELETE | /api/v1/billing/plans/:id | Eliminar plan |
| PATCH | /api/v1/billing/plans/:id/toggle | Activar/desactivar |

### Suscripciones (Tenant Owner)
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | /api/v1/billing/subscription | Suscripción actual |
| POST | /api/v1/billing/subscription/upgrade | Upgrade de plan |
| POST | /api/v1/billing/subscription/downgrade | Downgrade de plan |
| POST | /api/v1/billing/subscription/cancel | Cancelar suscripción |
| POST | /api/v1/billing/subscription/reactivate | Reactivar |
| PUT | /api/v1/billing/subscription/billing-cycle | Cambiar ciclo |
| GET | /api/v1/billing/subscription/history | Historial |

### Métodos de Pago (Tenant Owner)
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | /api/v1/billing/payment-methods | Listar métodos |
| POST | /api/v1/billing/payment-methods/setup-intent | Crear setup intent |
| POST | /api/v1/billing/payment-methods | Agregar método |
| PATCH | /api/v1/billing/payment-methods/:id/default | Establecer default |
| DELETE | /api/v1/billing/payment-methods/:id | Eliminar método |

### Facturas (Tenant Owner)
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | /api/v1/billing/invoices | Listar facturas |
| GET | /api/v1/billing/invoices/:id | Obtener factura |
| GET | /api/v1/billing/invoices/:id/pdf | Descargar PDF |
| GET | /api/v1/billing/invoices/:id/xml | Descargar XML CFDI |
| POST | /api/v1/billing/invoices/:id/request-cfdi | Solicitar CFDI |
| POST | /api/v1/billing/invoices/:id/retry-payment | Reintentar pago |

### Uso y Métricas (Usuarios)
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | /api/v1/billing/usage | Uso actual |
| GET | /api/v1/billing/usage/history | Historial de uso |
| GET | /api/v1/billing/usage/check | Verificar acción |
| GET | /api/v1/billing/features | Features habilitadas |
| GET | /api/v1/billing/features/:feature | Verificar feature |

### Webhooks
| Método | Ruta | Descripción |
|--------|------|-------------|
| POST | /api/v1/webhooks/stripe | Webhook de Stripe |

## Integraciones Externas

### Stripe
- **Uso:** Procesamiento de pagos, tokenización de tarjetas
- **Endpoints:** PaymentIntents, SetupIntents, Customers, PaymentMethods
- **Webhooks:** payment_method.updated, customer.source.expiring

### PAC (Proveedor Autorizado de Certificación)
- **Uso:** Timbrado de CFDI para facturas mexicanas
- **Opciones:** Facturama, SW Sapien, Finkok
- **Funciones:** validateRFC, timbrar, cancelar

## Variables de Entorno

```env
# Stripe
STRIPE_SECRET_KEY=sk_live_xxx
STRIPE_PUBLISHABLE_KEY=pk_live_xxx
STRIPE_WEBHOOK_SECRET=whsec_xxx

# PAC para CFDI
PAC_PROVIDER=facturama
PAC_USER=xxx
PAC_PASSWORD=xxx
PAC_SANDBOX=false

# Datos fiscales del emisor
CFDI_RFC_EMISOR=XXX123456789
CFDI_NOMBRE_EMISOR=Mi Empresa S.A. de C.V.
CFDI_REGIMEN_FISCAL=601
CFDI_LUGAR_EXPEDICION=12345

# Modo de despliegue
DEPLOYMENT_MODE=saas  # o 'single_tenant'
```

## Jobs Programados

| Job | Frecuencia | Descripción |
|-----|------------|-------------|
| generateRenewalInvoices | Diario 00:00 | Genera facturas 1 día antes de renovación |
| processSubscriptionRenewals | Diario 01:00 | Procesa renovaciones de suscripciones |
| retryFailedPayments | Cada hora | Reintenta pagos fallidos (días 1, 3, 7) |
| recordUsageMetrics | Cada 6 horas | Registra métricas de uso por tenant |
| sendExpirationAlerts | Diario | Envía alertas de tarjetas por vencer |

## Middlewares Específicos

```typescript
// Verificar límites antes de acciones
router.post('/users', checkUserLimit, usersController.create);
router.post('/companies', checkCompanyLimit, companiesController.create);

// Verificar features habilitadas
router.use('/crm', requireFeature('crm'));
router.use('/projects', requireFeature('projects'));
```

## Seguridad

1. **PCI-DSS:** Nunca almacenar datos sensibles de tarjetas
2. **Webhooks:** Verificar firma de Stripe en cada request
3. **Autorización:** Roles específicos por endpoint
4. **Rate limiting:** Aplicar en endpoints de pago

## Notas de Implementación

1. Este módulo se oculta completamente en modo `single_tenant`
2. Los planes son entidades globales (sin tenant_id)
3. Las suscripciones y facturas tienen tenant_id y RLS
4. El caché de uso se invalida en cada cambio de recursos
