8.1 KiB
8.1 KiB
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ón02: Comprobante emitido con errores sin relación03: No se llevó a cabo la operación04: 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 RFCorderLineSchema: Líneas con claves SATcreateCFDISchema: Creación completacancelCFDISchema: Cancelación con motivolistCFDIsQuerySchema: Filtros de búsquedacreateCreditNoteSchema: Nota de crédito
Schemas de Configuración:
createCFDIConfigSchema: Configuración PAC y CSDupdateCFDIConfigSchema: Actualización parcialvalidateCFDIConfigSchema: Validación de config
Schemas de Autofactura:
autofacturaRequestSchema: Solicitud de autofacturalookupOrderSchema: 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:sendcfdi: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
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