# 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
