Saltar a contenido
v26.3

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:

{Vorgangstyp}^{Vorgangsdaten}
Beispiel: AVKassenschnitt^Tagesabschluss^1500.00

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:

  1. Conectar la TSE de Swissbit
  2. Admin → Configuración → TSE
  3. Tipo de TSE: Hardware
  4. Indicar la ruta local a la TSE
  5. Introducir el número de serie de la caja
  6. «Inicializar» — establece los PIN y registra el cliente

Proxy de TSE (en red)

Para sistemas distribuidos con varias cajas:

  1. Configurar el servidor proxy de TSE
  2. Admin → Configuración → TSE
  3. Tipo de TSE: Proxy
  4. Introducir la URL del servidor proxy
  5. «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:

  1. Admin → Configuración → Exportación → DSFinV-K
  2. Seleccionar el periodo
  3. «Crear exportación»
  4. Archivo ZIP con todos los archivos CSV prescritos

Exportación GDPdU

Para la inspección digital de la empresa:

  1. Admin → Configuración → Exportación → GDPdU
  2. Seleccionar el periodo
  3. «Crear exportación»
  4. Archivo de exportación conforme a GDPdU

Fallo de la TSE

Si la TSE falla (avería, problema de red):

  1. DiKAS registra el fallo automáticamente (TseOutageLog con StartTime, Reason, AffectedTransactions)
  2. El cobro no se bloquea: el funcionamiento continúa
  3. Se establece el campo TseError en el documento afectado
  4. Al volver a estar disponible, las entradas de fallo abiertas se cierran (se establece EndTime)
  5. 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