TSE y Hacienda¶
Desde el 01/01/2020, en Alemania es obligatorio un dispositivo técnico de seguridad (TSE) para los sistemas de caja (KassenSichV, §146a AO). DiKAS es totalmente conforme con la TSE y firma todos los procesos relevantes para la caja conforme a la AEAO sobre el §146a AO.
Para inspectores fiscales: → Conformidad TSE — Documentación para inspectores fiscales (descripción técnica detallada)
Para usuarios: → Guía de la TSE en el manual de usuario (configuración y manejo)
¿Qué es una TSE?¶
Una TSE es un módulo de seguridad certificado que firma digitalmente cada operación de caja. Con ella, Hacienda puede comprobar si los datos de caja han sido manipulados a posteriori.
La TSE en DiKAS¶
DiKAS firma todos los procesos relevantes para la caja, no solo las facturas:
| Proceso | ProcessType | Entity | Descripción |
|---|---|---|---|
| Recibos de caja | Kassenbeleg-V1 |
Receipt | Cada pago (venta directa, pago de mesa) |
| Anulaciones | Kassenbeleg-V1 |
Receipt | Cada anulación de recibo |
| Pedidos | Bestellung-V1 |
OpenBon | Cada pedido en el servicio de mesa |
| Pedidos agrupados | Bestellung-V1 |
OpenBon | Pedidos en lote (firma en el recibo principal) |
| Apertura de turno | SonstigerVorgang |
Exchange | Cada apertura de turno |
| Cierre de turno | SonstigerVorgang |
Exchange | Cada cierre de turno |
| Cierres de caja | SonstigerVorgang |
DayClose | Cada informe Z |
| Gastos | SonstigerVorgang |
Spending | Cada retirada de efectivo |
Arquitectura¶
Flujo de firma¶
Handler (z.B. ProcessDirectSaleCommand)
→ TseSigningHelper.SignReceiptAsync()
→ BackendConfig laden (TSE-fähig?)
→ ITseService.IsAvailable prüfen
→ ProcessData aufbauen
→ ClientId auflösen (CashPointSerial → BonIdServer → "1")
→ ITseService.SignReceiptAsync() [5s Timeout]
→ TSE-Felder auf Entity speichern
→ HandleOutageLogAsync() (Ausfallprotokoll)
Gastos (Spendings): Se firman como SonstigerVorgang; el texto del proceso depende del AccountMode:
| AccountMode | Tipo de proceso TSE |
|---|---|
| 1 (Gasto) | AVSonstAusgabe |
| 2 (Caja→Banco) | AVTransfer |
| 3 (Banco→Caja) | AVSonstEinlage |
| 4 (Transferencia) | AVSonstAusgabe |
Componentes¶
| Componente | Descripción |
|---|---|
TseSigningHelper |
Clase estática central para todas las firmas TSE |
ITseService |
Interfaz para el acceso a la TSE (IsAvailable, Sign, Export) |
TseServiceRouter |
Enrutamiento: se prefiere el proxy, con respaldo en el hardware |
SwissbitTseService |
TSE USB local de Swissbit |
TseProxyService |
TSE en red a través de proxy HTTP |
TseInitializationService |
Inicialización inicial de la TSE |
ITseDataHolder |
Interfaz con 9 campos TSE en todas las entidades firmadas |
TseOutageLog |
Entidad del registro de fallos |
TseConfig |
Configuración de la TSE (PublicKey, Serial, SigAlg, PIN) |
Formatos de ProcessData¶
Kassenbeleg-V1:
Beleg^{BruttoGesamt}_{MwStSatz1}:{MwStBetrag1}_{MwStSatz2}:{MwStBetrag2}
Beispiel: Beleg^50.00_19.00:5.00_7.00:2.00
Bestellung-V1:
{Menge}^{Artikeltext}^{BruttoBetrag};{Menge}^{Artikeltext}^{BruttoBetrag}
Beispiel: 2.00^Cola^7.00;1.00^Pizza^11.50
SonstigerVorgang:
Formato del código QR (DSFinV-K anexo I)¶
V0;{KassenSerial};{ProcessType};{ProcessData};{TransNr};{SignZähler};{Start};{Ende};{SigAlg};{LogFormat};{Signatur};{PublicKey}
Configuración¶
TSE de hardware (Swissbit)¶
Memoria USB en el servidor:
- Conectar la TSE de Swissbit
- Admin → Configuración → TSE
- Tipo de TSE: Hardware
- Indicar la ruta local a la TSE
- Introducir el número de serie de la caja
- «Inicializar» — establece los PIN y registra el cliente
Proxy de TSE (en red)¶
Para sistemas distribuidos con varias cajas:
- Configurar el servidor proxy de TSE
- Admin → Configuración → TSE
- Tipo de TSE: Proxy
- Introducir la URL del servidor proxy
- «Activar»
Endpoints de la API¶
| Método | Endpoint | Descripción |
|---|---|---|
| GET | /api/v1/tse/info |
Información de estado de la TSE (capacidad, certificado, firmas) |
| GET | /api/v1/tse/config |
Leer la configuración de la TSE |
| PUT | /api/v1/tse/config |
Actualizar la configuración de la TSE |
| POST | /api/v1/tse/initialize |
Inicializar la TSE |
| GET | /api/v1/tse/export/tar |
Exportar los datos de registro de la TSE como TAR (opcional ?startDate=&endDate=) |
Datos de la TSE en el recibo¶
Cada recibo de caja contiene los datos de la TSE:
══════════════════════════════════
BON Nr. 20260313-0042
──────────────────────────────────
...Artikel...
──────────────────────────────────
TSE-Information:
Signatur: a8f3c2d1e5...
Trans.-Nr: 12345
Sign.-Zäh: 67890
Start: 2026-03-13T18:30:00
Ende: 2026-03-13T18:30:01
Seriennr: ABCDEF1234567890
[QR-Code]
══════════════════════════════════
El código QR contiene todos los datos de la TSE en formato DSFinV-K (anexo I) y puede ser escaneado por Hacienda.
Exportación DSFinV-K¶
Para la inspección de caja, DiKAS exporta los datos en formato DSFinV-K:
- Admin → Configuración → Exportación → DSFinV-K
- Seleccionar el periodo
- «Crear exportación»
- Archivo ZIP con todos los archivos CSV prescritos
Exportación GDPdU¶
Para la inspección digital de la empresa:
- Admin → Configuración → Exportación → GDPdU
- Seleccionar el periodo
- «Crear exportación»
- Archivo de exportación conforme a GDPdU
Fallo de la TSE¶
Si la TSE falla (avería, problema de red):
- DiKAS registra el fallo automáticamente (
TseOutageLogcon StartTime, Reason, AffectedTransactions) - El cobro no se bloquea: el funcionamiento continúa
- Se establece el campo
TseErroren el documento afectado - Al volver a estar disponible, las entradas de fallo abiertas se cierran (se establece EndTime)
- Los registros de fallos se conservan para Hacienda
Importante: En caso de fallo de la TSE, está obligado a documentar el fallo y subsanarlo con prontitud. DiKAS realiza la documentación de forma automática.
Pruebas¶
17 pruebas TSE dedicadas en TseSigningTests.cs:
- Formato de ProcessData para Kassenbeleg-V1 (uno/varios tipos impositivos, recibo cero)
- Formato de ProcessData para Bestellung-V1 (individual, varias posiciones)
- Generación del código QR (formato V0, casos nulos)
- Flujo de firma (TSE activa, desactivada, no disponible)
- Cadena de respaldo de ClientId (CashRegisterId → BonIdServer → "1")
- Formato de importes (InvariantCulture)
- Constantes de ProcessType
Preguntas frecuentes sobre la TSE¶
¿Tengo que tener una TSE? Sí, obligatoria en Alemania desde el 01/01/2020.
¿Qué TSE admite DiKAS? TSE de hardware (Swissbit USB) y proxies de TSE basados en red.
¿Cuánto cuesta una TSE? TSE de hardware: aprox. 250–300 EUR, pago único.
¿Puede Hacienda inspeccionar mis datos? Sí, mediante la exportación DSFinV-K, GDPdU y TAR de la TSE. DiKAS está preparado para ello.
¿Un fallo de la TSE bloquea la caja? No. DiKAS registra el fallo y sigue funcionando. El fallo debe subsanarse con prontitud.
Documentos complementarios¶
→ Conformidad TSE para inspectores fiscales — Documentación técnica detallada para la inspección de la empresa → Guía de la TSE para usuarios — Configuración y manejo → Notificación de caja a Hacienda — Declarar la caja a través de Mein ELSTER (§ 146a párr. 4 AO) → Desarrollo de plugins — Crear módulos propios