Frontend (nuevo commit): - Tokens.tsx: Tienda de tokens (MCH-019) - CodiSpei.tsx: CoDi QR y SPEI CLABE (MCH-024) - Rutas y navegacion actualizadas - 14 paginas totales Epicas actualizadas a Completado: - MCH-019: Tienda de Tokens - MCH-023: Programa Referidos - MCH-024: CoDi/SPEI - MCH-026: Multi-idioma LATAM - MCH-027: Integracion SAT - MCH-028: Marketplace Proveedores Epicas pendientes (2/35): - MCH-022: Modo Offline (requiere mobile) - MCH-025: Widgets Atajos (requiere codigo nativo) Documentacion: - PROXIMA-ACCION.md v2.3.0 - FRONTEND_INVENTORY.yml v2.3.0 Sprint 6 completado - 94% epicas Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
502 lines
15 KiB
Markdown
502 lines
15 KiB
Markdown
---
|
|
id: EPIC-MCH-027
|
|
type: Epic
|
|
title: "MCH-027: Integracion SAT"
|
|
code: MCH-027
|
|
status: Completado
|
|
status_real: "Mock"
|
|
status_nota: "Implementacion mock - Sin integracion real con PAC"
|
|
phase: 7
|
|
priority: P3
|
|
story_points: 55
|
|
created_at: 2026-01-10
|
|
updated_at: 2026-01-17
|
|
simco_version: "4.0.1"
|
|
dependencies:
|
|
blocks: []
|
|
depends_on: []
|
|
---
|
|
|
|
# MCH-027: Integracion SAT
|
|
|
|
## Metadata
|
|
- **Codigo:** MCH-027
|
|
- **Fase:** 7 - Expansion (Futuro)
|
|
- **Prioridad:** P3
|
|
- **Estado:** Parcial (Mock)
|
|
- **Estado Real:** Implementacion mock - UUID generado localmente, sin timbrado SAT
|
|
- **Story Points:** 55
|
|
- **Sprint Asignado:** Sprint 5 (Integraciones Reales)
|
|
- **Requiere:** Contrato con PAC (Facturapi recomendado)
|
|
- **Fecha estimada:** Sprint 19+
|
|
|
|
## Descripcion
|
|
|
|
Integracion con el SAT (Servicio de Administracion Tributaria) de Mexico para facturacion electronica simplificada (CFDI): emision de facturas a clientes, cancelacion, y reportes fiscales.
|
|
|
|
## Objetivos
|
|
|
|
1. Emision de CFDI (facturas)
|
|
2. Cancelacion de facturas
|
|
3. Envio automatico al cliente
|
|
4. Reportes para contabilidad
|
|
5. Cumplimiento normativo
|
|
|
|
## Alcance
|
|
|
|
### Incluido
|
|
- CFDI de Ingreso (factura de venta)
|
|
- CFDI de Egreso (nota de credito)
|
|
- Envio por email al cliente
|
|
- Descarga de XML y PDF
|
|
- Reporte mensual
|
|
|
|
### Excluido
|
|
- CFDI de Nomina
|
|
- CFDI de Pagos complejos
|
|
- Declaraciones automaticas
|
|
- Contabilidad electronica
|
|
|
|
## Tipos de Comprobante
|
|
|
|
| Tipo | Uso | Cuando |
|
|
|------|-----|--------|
|
|
| Ingreso | Factura de venta | Cliente solicita factura |
|
|
| Egreso | Nota de credito | Devolucion o descuento |
|
|
|
|
## Flujo de Facturacion
|
|
|
|
### Solicitud de Factura (Post-venta)
|
|
```
|
|
1. Cliente solicita factura via WhatsApp
|
|
"Necesito factura del ticket #123"
|
|
|
|
2. Bot responde:
|
|
"Para tu factura necesito:
|
|
- RFC
|
|
- Razon social
|
|
- Codigo postal
|
|
- Uso CFDI (ej: Gastos en general)"
|
|
|
|
3. Cliente proporciona datos
|
|
|
|
4. Sistema genera CFDI:
|
|
- Timbra con PAC
|
|
- Genera PDF
|
|
- Envia por email
|
|
- Guarda en historial
|
|
|
|
5. Bot confirma:
|
|
"Tu factura ha sido enviada a tu email"
|
|
```
|
|
|
|
### Factura desde POS
|
|
```
|
|
1. Al finalizar venta
|
|
2. Empleado pregunta: "¿Requiere factura?"
|
|
3. Si: captura datos fiscales
|
|
4. Se genera CFDI
|
|
5. Se entrega ticket + factura
|
|
```
|
|
|
|
## Modelo de Datos
|
|
|
|
### Tablas (schema: billing)
|
|
|
|
**invoices** (CFDI)
|
|
- id, tenant_id, sale_id, type (ingreso/egreso)
|
|
- uuid (folio fiscal), serie, folio
|
|
- customer_rfc, customer_name, customer_zip
|
|
- uso_cfdi, payment_method, payment_form
|
|
- subtotal, iva, total
|
|
- xml_url, pdf_url, status
|
|
- stamped_at, cancelled_at
|
|
|
|
**invoice_items**
|
|
- id, invoice_id, product_id
|
|
- clave_prod_serv, clave_unidad
|
|
- description, quantity, unit_price
|
|
- discount, iva, total
|
|
|
|
**tax_configs** (por tenant)
|
|
- id, tenant_id, rfc, razon_social
|
|
- regimen_fiscal, codigo_postal
|
|
- pac_provider, pac_credentials
|
|
|
|
## Claves SAT Requeridas
|
|
|
|
### Uso CFDI Comunes
|
|
| Clave | Descripcion |
|
|
|-------|-------------|
|
|
| G01 | Adquisicion de mercancias |
|
|
| G03 | Gastos en general |
|
|
| P01 | Por definir |
|
|
|
|
### Forma de Pago
|
|
| Clave | Descripcion |
|
|
|-------|-------------|
|
|
| 01 | Efectivo |
|
|
| 04 | Tarjeta de credito |
|
|
| 28 | Tarjeta de debito |
|
|
| 99 | Por definir |
|
|
|
|
### Metodo de Pago
|
|
| Clave | Descripcion |
|
|
|-------|-------------|
|
|
| PUE | Pago en una sola exhibicion |
|
|
| PPD | Pago en parcialidades |
|
|
|
|
## Integracion con PAC
|
|
|
|
### Proveedores PAC Recomendados
|
|
- Facturapi (simple, buena API)
|
|
- SW Sapien
|
|
- Finkok
|
|
|
|
### API Facturapi (Ejemplo)
|
|
```typescript
|
|
const facturapi = require('facturapi');
|
|
|
|
const invoice = await facturapi.invoices.create({
|
|
customer: {
|
|
legal_name: 'Juan Perez',
|
|
tax_id: 'XAXX010101000',
|
|
tax_system: '601',
|
|
address: { zip: '06600' }
|
|
},
|
|
items: [{
|
|
product: {
|
|
description: 'Coca-Cola 600ml',
|
|
product_key: '50202301', // Bebidas
|
|
price: 18,
|
|
tax_included: true
|
|
}
|
|
}],
|
|
payment_form: '01', // Efectivo
|
|
use: 'G03' // Gastos generales
|
|
});
|
|
```
|
|
|
|
## Endpoints API
|
|
|
|
| Metodo | Endpoint | Descripcion |
|
|
|--------|----------|-------------|
|
|
| POST | /invoices | Crear factura |
|
|
| GET | /invoices/:id | Obtener factura |
|
|
| GET | /invoices/:id/pdf | Descargar PDF |
|
|
| GET | /invoices/:id/xml | Descargar XML |
|
|
| POST | /invoices/:id/cancel | Cancelar factura |
|
|
| POST | /invoices/:id/send | Reenviar por email |
|
|
| GET | /invoices/report | Reporte mensual |
|
|
|
|
## UI Components
|
|
|
|
### InvoiceRequestForm
|
|
- RFC con validacion
|
|
- Razon social
|
|
- Codigo postal
|
|
- Uso CFDI (dropdown)
|
|
- Email para envio
|
|
|
|
### InvoiceHistory
|
|
- Lista de facturas emitidas
|
|
- Filtros por periodo
|
|
- Acciones: ver, descargar, cancelar
|
|
|
|
### InvoicePreview
|
|
- Vista previa del PDF
|
|
- Datos fiscales
|
|
- Botones: descargar, enviar
|
|
|
|
## Historias de Usuario
|
|
|
|
### MCH-US-260: Emision de CFDI de Ingreso
|
|
**Story Points:** 8
|
|
|
|
**Como** dueno de negocio
|
|
**Quiero** emitir facturas electronicas (CFDI de Ingreso) cuando un cliente lo solicite
|
|
**Para** cumplir con las obligaciones fiscales y dar al cliente su comprobante oficial
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-260-1] El sistema genera un CFDI valido con estructura XML conforme al esquema SAT vigente
|
|
- [CA-260-2] El CFDI incluye todos los datos fiscales requeridos: RFC, razon social, regimen fiscal, uso CFDI
|
|
- [CA-260-3] Los productos facturados incluyen clave de producto/servicio SAT y clave de unidad
|
|
- [CA-260-4] El timbrado se realiza exitosamente con el PAC configurado
|
|
- [CA-260-5] El UUID (folio fiscal) se almacena correctamente en la base de datos
|
|
- [CA-260-6] El estatus de la factura se actualiza a "Timbrada" tras el proceso exitoso
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-260-01 | Implementar entity Invoice con todos los campos SAT | 3h |
|
|
| MCH-TT-260-02 | Crear servicio de construccion de XML CFDI | 4h |
|
|
| MCH-TT-260-03 | Implementar validaciones de datos fiscales | 2h |
|
|
| MCH-TT-260-04 | Integrar con servicio de timbrado PAC | 4h |
|
|
| MCH-TT-260-05 | Crear endpoint POST /invoices | 2h |
|
|
| MCH-TT-260-06 | Implementar tests unitarios y de integracion | 3h |
|
|
|
|
---
|
|
|
|
### MCH-US-261: Emision de CFDI de Egreso
|
|
**Story Points:** 5
|
|
|
|
**Como** dueno de negocio
|
|
**Quiero** emitir notas de credito (CFDI de Egreso) cuando haya devoluciones o descuentos
|
|
**Para** reflejar correctamente las operaciones fiscales y mantener la contabilidad al dia
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-261-1] El CFDI de Egreso referencia correctamente al CFDI de Ingreso original (UUID)
|
|
- [CA-261-2] El tipo de relacion SAT se especifica correctamente (01-Nota de credito)
|
|
- [CA-261-3] Los montos del egreso corresponden a la devolucion o descuento aplicado
|
|
- [CA-261-4] El sistema valida que el CFDI original exista y este vigente
|
|
- [CA-261-5] El egreso se timbra correctamente con el PAC
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-261-01 | Extender modelo Invoice para tipo Egreso | 2h |
|
|
| MCH-TT-261-02 | Implementar logica de relacion entre CFDIs | 3h |
|
|
| MCH-TT-261-03 | Crear validaciones especificas para egresos | 2h |
|
|
| MCH-TT-261-04 | Ajustar servicio de timbrado para egresos | 2h |
|
|
| MCH-TT-261-05 | Implementar tests para flujo de egreso | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-262: Integracion con PAC
|
|
**Story Points:** 8
|
|
|
|
**Como** sistema
|
|
**Quiero** conectarme con un Proveedor Autorizado de Certificacion (PAC)
|
|
**Para** timbrar los CFDIs y obtener el sello digital del SAT
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-262-1] El sistema soporta al menos un PAC (Facturapi como principal)
|
|
- [CA-262-2] Las credenciales del PAC se almacenan encriptadas por tenant
|
|
- [CA-262-3] El sistema maneja errores de timbrado con mensajes claros
|
|
- [CA-262-4] Se implementa retry automatico ante fallas temporales del PAC
|
|
- [CA-262-5] Los tiempos de respuesta del PAC se registran para monitoreo
|
|
- [CA-262-6] El sistema puede funcionar en modo sandbox para pruebas
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-262-01 | Crear interfaz abstracta PacProvider | 2h |
|
|
| MCH-TT-262-02 | Implementar FacturapiProvider | 4h |
|
|
| MCH-TT-262-03 | Configurar manejo de credenciales encriptadas | 3h |
|
|
| MCH-TT-262-04 | Implementar circuit breaker y retry logic | 3h |
|
|
| MCH-TT-262-05 | Crear modo sandbox/pruebas | 2h |
|
|
| MCH-TT-262-06 | Implementar logging y metricas de PAC | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-263: Generacion de PDF de Factura
|
|
**Story Points:** 5
|
|
|
|
**Como** cliente
|
|
**Quiero** recibir mi factura en formato PDF legible
|
|
**Para** tener un comprobante imprimible y facil de leer
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-263-1] El PDF incluye todos los datos fiscales del emisor y receptor
|
|
- [CA-263-2] Se muestra el desglose de productos con claves SAT
|
|
- [CA-263-3] El PDF incluye codigo QR con URL de verificacion SAT
|
|
- [CA-263-4] Se muestra la cadena original y sello digital
|
|
- [CA-263-5] El diseno es profesional y cumple con requisitos SAT
|
|
- [CA-263-6] El PDF se genera en menos de 3 segundos
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-263-01 | Disenar template de factura PDF | 3h |
|
|
| MCH-TT-263-02 | Implementar servicio de generacion PDF | 4h |
|
|
| MCH-TT-263-03 | Integrar generacion de codigo QR | 2h |
|
|
| MCH-TT-263-04 | Crear endpoint GET /invoices/:id/pdf | 1h |
|
|
| MCH-TT-263-05 | Optimizar rendimiento de generacion | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-264: Envio Automatico por Email
|
|
**Story Points:** 5
|
|
|
|
**Como** cliente
|
|
**Quiero** recibir mi factura automaticamente por email
|
|
**Para** tenerla disponible sin tener que solicitarla nuevamente
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-264-1] El email incluye el XML como adjunto
|
|
- [CA-264-2] El email incluye el PDF como adjunto
|
|
- [CA-264-3] El asunto del email identifica claramente la factura (serie, folio)
|
|
- [CA-264-4] El cuerpo del email incluye resumen de la factura
|
|
- [CA-264-5] Se registra el envio exitoso en la base de datos
|
|
- [CA-264-6] El sistema permite reenviar la factura bajo demanda
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-264-01 | Disenar template de email para factura | 2h |
|
|
| MCH-TT-264-02 | Implementar servicio de envio con adjuntos | 3h |
|
|
| MCH-TT-264-03 | Crear endpoint POST /invoices/:id/send | 1h |
|
|
| MCH-TT-264-04 | Implementar cola de envios para alto volumen | 3h |
|
|
| MCH-TT-264-05 | Registrar tracking de envios | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-265: Cancelacion de Facturas
|
|
**Story Points:** 8
|
|
|
|
**Como** dueno de negocio
|
|
**Quiero** cancelar facturas emitidas por error o devolucion
|
|
**Para** mantener mi contabilidad correcta ante el SAT
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-265-1] La cancelacion se envia al SAT a traves del PAC
|
|
- [CA-265-2] Se requiere motivo de cancelacion segun catalogo SAT
|
|
- [CA-265-3] Para facturas >$1000, se gestiona el proceso de aceptacion del receptor
|
|
- [CA-265-4] El estatus de cancelacion se actualiza correctamente (En proceso, Cancelada)
|
|
- [CA-265-5] Se genera acuse de cancelacion cuando aplica
|
|
- [CA-265-6] El sistema consulta periodicamente el estatus de cancelaciones pendientes
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-265-01 | Implementar endpoint POST /invoices/:id/cancel | 2h |
|
|
| MCH-TT-265-02 | Integrar API de cancelacion del PAC | 4h |
|
|
| MCH-TT-265-03 | Implementar flujo de aceptacion de receptor | 4h |
|
|
| MCH-TT-265-04 | Crear job de consulta de estatus de cancelaciones | 3h |
|
|
| MCH-TT-265-05 | Implementar notificaciones de cambio de estatus | 2h |
|
|
| MCH-TT-265-06 | Crear tests para flujos de cancelacion | 3h |
|
|
|
|
---
|
|
|
|
### MCH-US-266: Solicitud de Factura via WhatsApp
|
|
**Story Points:** 8
|
|
|
|
**Como** cliente
|
|
**Quiero** solicitar mi factura a traves de WhatsApp
|
|
**Para** obtenerla de forma rapida y conversacional sin llamar al negocio
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-266-1] El bot reconoce la intencion de solicitar factura
|
|
- [CA-266-2] El bot solicita los datos fiscales requeridos de forma conversacional
|
|
- [CA-266-3] El sistema valida el RFC en formato y estructura
|
|
- [CA-266-4] El bot confirma los datos antes de generar la factura
|
|
- [CA-266-5] La factura se genera y se notifica al cliente el envio por email
|
|
- [CA-266-6] El bot maneja errores de forma amigable (RFC invalido, ticket no encontrado)
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-266-01 | Disenar flujo conversacional de facturacion | 3h |
|
|
| MCH-TT-266-02 | Implementar intent de solicitud de factura | 2h |
|
|
| MCH-TT-266-03 | Crear colectores de datos fiscales | 4h |
|
|
| MCH-TT-266-04 | Integrar validacion de RFC | 2h |
|
|
| MCH-TT-266-05 | Conectar con servicio de facturacion | 3h |
|
|
| MCH-TT-266-06 | Implementar manejo de errores conversacional | 2h |
|
|
|
|
---
|
|
|
|
### MCH-US-267: Reportes Fiscales Mensuales
|
|
**Story Points:** 8
|
|
|
|
**Como** contador del negocio
|
|
**Quiero** generar reportes mensuales de facturas emitidas
|
|
**Para** facilitar la declaracion de impuestos y conciliacion fiscal
|
|
|
|
#### Criterios de Aceptacion
|
|
- [CA-267-1] El reporte incluye todas las facturas del periodo (ingresos y egresos)
|
|
- [CA-267-2] Se muestra desglose de IVA trasladado y retenido
|
|
- [CA-267-3] El reporte se puede exportar en formato Excel y PDF
|
|
- [CA-267-4] Se incluye totales por tipo de comprobante
|
|
- [CA-267-5] El reporte incluye facturas canceladas marcadas como tal
|
|
- [CA-267-6] Se puede filtrar por serie, estatus y tipo de CFDI
|
|
|
|
#### Tareas
|
|
| ID | Tarea | Estimacion |
|
|
|----|-------|------------|
|
|
| MCH-TT-267-01 | Disenar estructura del reporte fiscal | 2h |
|
|
| MCH-TT-267-02 | Implementar consultas agregadas de facturas | 4h |
|
|
| MCH-TT-267-03 | Crear endpoint GET /invoices/report | 2h |
|
|
| MCH-TT-267-04 | Implementar exportacion a Excel | 3h |
|
|
| MCH-TT-267-05 | Implementar exportacion a PDF | 2h |
|
|
| MCH-TT-267-06 | Crear UI de reportes fiscales | 4h |
|
|
| MCH-TT-267-07 | Implementar filtros y parametros del reporte | 2h |
|
|
|
|
---
|
|
|
|
### Resumen de Historias de Usuario
|
|
|
|
| ID | Historia | Story Points | Prioridad |
|
|
|----|----------|--------------|-----------|
|
|
| MCH-US-260 | Emision de CFDI de Ingreso | 8 | Alta |
|
|
| MCH-US-261 | Emision de CFDI de Egreso | 5 | Alta |
|
|
| MCH-US-262 | Integracion con PAC | 8 | Alta |
|
|
| MCH-US-263 | Generacion de PDF de Factura | 5 | Alta |
|
|
| MCH-US-264 | Envio Automatico por Email | 5 | Media |
|
|
| MCH-US-265 | Cancelacion de Facturas | 8 | Alta |
|
|
| MCH-US-266 | Solicitud de Factura via WhatsApp | 8 | Media |
|
|
| MCH-US-267 | Reportes Fiscales Mensuales | 8 | Media |
|
|
| **Total** | | **55** | |
|
|
|
|
## Entregables
|
|
|
|
| Entregable | Estado | Archivo |
|
|
|------------|--------|---------|
|
|
| DB Schema | Completado | `database/schemas/15-invoices.sql` |
|
|
| invoices.module | Completado | `modules/invoices/` |
|
|
| Entities | Completado | `modules/invoices/entities/` |
|
|
| Service | Completado | `modules/invoices/invoices.service.ts` |
|
|
| Controller | Completado | `modules/invoices/invoices.controller.ts` |
|
|
| PAC integration | Mock | Integrado en servicio |
|
|
| Invoice PDF generator | Pendiente | `services/invoice-pdf.service.ts` |
|
|
| WhatsApp invoice flow | Pendiente | `whatsapp-service/flows/` |
|
|
| Invoice UI | Completado | `pages/Invoices.tsx` |
|
|
|
|
## Dependencias
|
|
|
|
### Depende de
|
|
- MCH-004 (Sales - datos de venta)
|
|
- MCH-014 (Customers - datos fiscales)
|
|
- Cuenta SAT del negocio (e.firma)
|
|
- Contrato con PAC
|
|
|
|
### Bloquea a
|
|
- Ninguno
|
|
|
|
## Criterios de Aceptacion
|
|
|
|
- [ ] CFDI se genera correctamente
|
|
- [ ] XML cumple con esquema SAT
|
|
- [ ] PDF se genera legible
|
|
- [ ] Email se envia al cliente
|
|
- [ ] Cancelacion funciona
|
|
- [ ] Reporte mensual se genera
|
|
|
|
## Configuracion por Tenant
|
|
|
|
```typescript
|
|
{
|
|
billing: {
|
|
enabled: true,
|
|
pac_provider: 'facturapi',
|
|
pac_api_key: 'encrypted...',
|
|
rfc: 'XAXX010101000',
|
|
razon_social: 'Mi Tiendita SA de CV',
|
|
regimen_fiscal: '601',
|
|
codigo_postal: '06600',
|
|
serie: 'A',
|
|
auto_send_email: true
|
|
}
|
|
}
|
|
```
|
|
|
|
## Costos
|
|
|
|
| Concepto | Costo Estimado |
|
|
|----------|----------------|
|
|
| PAC por timbrado | ~$2-4 MXN/factura |
|
|
| Certificado e.firma | Gratis (SAT) |
|
|
|
|
---
|
|
|
|
**Ultima actualizacion:** 2026-01-17
|