erp-retail-backend-v2/docs/SPRINT-5-SUMMARY.md
rckrdmrd a6186c4022 Migración desde erp-retail/backend - Estándar multi-repo v2
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 08:11:34 -06:00

233 lines
8.1 KiB
Markdown

# Sprint 5: CFDI/Facturación - Resumen
## Objetivo
Implementar el sistema completo de facturación electrónica CFDI 4.0 para el vertical de Retail, con integración a PACs y soporte para autofactura.
## Componentes Implementados
### 1. Servicios
#### XMLService (`src/modules/invoicing/services/xml.service.ts`)
Servicio para construcción y manipulación de XML CFDI 4.0:
- **buildCFDIXML()**: Construye XML completo según especificación SAT
- **addSealToXML()**: Agrega sello del contribuyente
- **addCertificateToXML()**: Agrega certificado CSD
- **addTimbreToXML()**: Agrega complemento TimbreFiscalDigital
- **buildCadenaOriginal()**: Genera cadena original para firma
- **parseStampedXML()**: Parsea respuesta de PAC
- **generateQRData()**: Genera URL de verificación SAT para QR
- **validateXMLStructure()**: Validación básica de estructura
**Características:**
- Namespaces CFDI 4.0 y TFD 1.1
- Soporte para CFDIs relacionados
- Formateo de montos y tasas según SAT
- Generación de cadena original del SAT
#### PACService (`src/modules/invoicing/services/pac.service.ts`)
Servicio de integración con Proveedores Autorizados de Certificación:
- **stampCFDI()**: Timbrado de CFDI
- **cancelCFDI()**: Cancelación con motivo
- **verifyCFDIStatus()**: Consulta estado en SAT
- **encrypt()/decrypt()**: Cifrado de credenciales
- **loadCertificate()**: Carga de CSD
- **signData()**: Firma con llave privada
**PACs Soportados:**
| PAC | Timbrado | Cancelación | Verificación |
|-----|----------|-------------|--------------|
| Finkok | ✓ | ✓ | ✓ |
| Facturapi | ✓ | ✓ | - |
| SW Sapien | ✓ | - | - |
| Soluciones Fiscales | Config | Config | Config |
| Digisat | Config | Config | Config |
**Motivos de Cancelación (SAT):**
- `01`: Comprobante emitido con errores con relación
- `02`: Comprobante emitido con errores sin relación
- `03`: No se llevó a cabo la operación
- `04`: Operación nominativa relacionada en factura global
#### CFDIBuilderService (`src/modules/invoicing/services/cfdi-builder.service.ts`)
Constructor de estructuras CFDI desde datos de orden:
- **buildFromOrder()**: Construye CFDI desde líneas de pedido
- **buildCreditNote()**: Genera nota de crédito
- **buildPaymentComplement()**: Genera complemento de pago
- **validateReceptor()**: Valida datos del receptor (CFDI 4.0)
- **getUsoCFDIOptions()**: Opciones de uso CFDI por tipo de persona
- **getCommonClavesProdServ()**: Claves SAT comunes para retail
**Cálculos Automáticos:**
- Desglose de impuestos (IVA, ISR, IEPS)
- Agregación por tipo de impuesto
- Manejo de precios con/sin impuesto
- Retenciones IVA e ISR
#### CFDIService (`src/modules/invoicing/services/cfdi.service.ts`)
Servicio principal de facturación:
- **createCFDI()**: Crear factura (draft o timbrada)
- **stampCFDI()**: Timbrar factura en borrador
- **cancelCFDI()**: Cancelar factura timbrada
- **verifyCFDIStatus()**: Verificar estado en SAT
- **listCFDIs()**: Listado con filtros paginados
- **getCFDIById()**: Obtener por ID
- **getCFDIByUUID()**: Obtener por UUID
- **downloadXML()**: Descargar XML
- **resendEmail()**: Reenviar por correo
- **createCreditNote()**: Crear nota de crédito
- **getStats()**: Estadísticas de facturación
- **getActiveConfig()**: Obtener configuración activa
### 2. Validación Zod (`src/modules/invoicing/validation/cfdi.schema.ts`)
**Schemas de CFDI:**
- `receptorSchema`: Datos del receptor con validación RFC
- `orderLineSchema`: Líneas con claves SAT
- `createCFDISchema`: Creación completa
- `cancelCFDISchema`: Cancelación con motivo
- `listCFDIsQuerySchema`: Filtros de búsqueda
- `createCreditNoteSchema`: Nota de crédito
**Schemas de Configuración:**
- `createCFDIConfigSchema`: Configuración PAC y CSD
- `updateCFDIConfigSchema`: Actualización parcial
- `validateCFDIConfigSchema`: Validación de config
**Schemas de Autofactura:**
- `autofacturaRequestSchema`: Solicitud de autofactura
- `lookupOrderSchema`: Búsqueda de ticket
### 3. Controladores (`src/modules/invoicing/controllers/cfdi.controller.ts`)
**Endpoints de CFDI (14):**
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | `/cfdis` | Listar CFDIs |
| GET | `/cfdis/:id` | Obtener por ID |
| GET | `/cfdis/uuid/:uuid` | Obtener por UUID |
| POST | `/cfdis` | Crear CFDI |
| POST | `/cfdis/:id/stamp` | Timbrar |
| POST | `/cfdis/:id/cancel` | Cancelar |
| GET | `/cfdis/:id/verify` | Verificar en SAT |
| GET | `/cfdis/:id/xml` | Descargar XML |
| POST | `/cfdis/:id/resend-email` | Reenviar email |
| POST | `/cfdis/:id/credit-note` | Crear nota crédito |
| GET | `/stats` | Estadísticas |
| GET | `/cancellation-reasons` | Motivos cancelación |
| GET | `/uso-cfdi-options` | Opciones UsoCFDI |
| GET | `/claves-prod-serv` | Claves SAT |
**Endpoints de Configuración (5):**
| Método | Ruta | Descripción |
|--------|------|-------------|
| GET | `/config` | Obtener config |
| POST | `/config` | Crear/actualizar config |
| PUT | `/config` | Actualizar config |
| POST | `/config/certificate` | Subir CSD |
| POST | `/config/validate` | Validar config |
**Endpoints de Autofactura (2):**
| Método | Ruta | Descripción |
|--------|------|-------------|
| POST | `/autofactura/lookup` | Buscar ticket |
| POST | `/autofactura/create` | Generar factura |
**Total: 21 endpoints**
### 4. Rutas (`src/modules/invoicing/routes/cfdi.routes.ts`)
**Rutas Públicas:**
- Autofactura (lookup, create)
- Catálogos SAT (uso CFDI, claves prod/serv, motivos cancelación)
**Rutas Autenticadas:**
- CFDI CRUD y operaciones
- Configuración (requiere `cfdi:config:*`)
**Permisos Requeridos:**
- `cfdi:view`, `cfdi:create`, `cfdi:stamp`, `cfdi:cancel`, `cfdi:send`
- `cfdi:config:view`, `cfdi:config:manage`
## Estructura de Archivos
```
src/modules/invoicing/
├── controllers/
│ ├── index.ts
│ └── cfdi.controller.ts
├── entities/
│ ├── index.ts
│ ├── cfdi.entity.ts
│ └── cfdi-config.entity.ts
├── routes/
│ ├── index.ts
│ └── cfdi.routes.ts
├── services/
│ ├── index.ts
│ ├── cfdi.service.ts
│ ├── cfdi-builder.service.ts
│ ├── xml.service.ts
│ └── pac.service.ts
├── validation/
│ ├── index.ts
│ └── cfdi.schema.ts
└── index.ts
```
## Flujo de Facturación
```
┌────────────┐ ┌──────────────┐ ┌─────────────┐
│ Order │────▶│ CFDIBuilder │────▶│ CFDI │
│ Data │ │ Service │ │ (draft) │
└────────────┘ └──────────────┘ └──────┬──────┘
┌────────────┐ ┌──────────────┐ ┌─────────────┐
│ Stamped │◀────│ PAC │◀────│ XML │
│ CFDI │ │ Service │ │ Service │
└────────────┘ └──────────────┘ └─────────────┘
```
## Estados del CFDI
```
draft ──────▶ pending ──────▶ stamped ──────▶ cancelled
│ │
▼ ▼
error cancellation_pending
```
## Características CFDI 4.0
- Validación de RFC y régimen fiscal del receptor
- Código postal del domicilio fiscal requerido
- Objeto de impuesto por concepto
- Relacionados con tipo de relación
- Exportación (01 = No exportación)
## Dependencias
- xmlbuilder2: Construcción de XML
- crypto (Node.js): Cifrado y firma
- TypeORM 0.3.x
- Zod para validación
## Variables de Entorno Requeridas
```env
PAC_ENCRYPTION_KEY=your-32-byte-encryption-key
```
## Próximos Pasos
El Sprint 6 según el roadmap cubrirá POS Backend:
- Sesiones de POS
- Órdenes y líneas
- Pagos múltiples
- Integración con motor de precios