TiFacturaOnline · Gateway de facturación electrónica AFIP
Registro de releases QA/PROD desde qa-20260825 hasta qa-20260907c, y el anexo con los pasos de actualización acumulados.
resultado=null local), cuando el POS no reintentó ni facturó por CAEA. Cierra el hueco que ni rama-3 ni CRÍTICO-4 cubrían (sub/sobre-reporte fiscal). Guarda contra el número reusado y el doble-huérfano. Dos fases gateadas OFF (detectar / recuperar); corre antes del job de NC. KPI y alerta Telegram. (Plan 027)CondicionIVAReceptorId (que ARCA rechaza desde el 01/12/2026), con desglose por comercio/POS. Solo mide; no frena la emisión.resultado=null a propósito, condición necesaria para la detección de huérfanos.Aplicar: swap de jar. KPI y PDF/email quedan activos solos; el barrido, inerte hasta cargar su fila en Tareas y prender los flags.
GET /api/libro-iva (X-Api-Key): todos los comprobantes autorizados del período (CAE + CAEA + NC/ND). Formatos arca (RG 4597), csv y json./api/cockpit/libro-iva.Aplicar: swap de jar. Sin DDL. Endpoints read-only.
resultado='A' y cae != null); si no, ERROR terminal EMAIL_NO_APROBADO. Candado único de las 4 vías de envío.management.tracing.enabled=false).Aplicar: swap de jar. Sin DDL. Config: agrega management.tracing.enabled=false y logging.pattern.correlation="" (ver anexo).
/api/ajustes-contingencia: detalle impositivo completo por comprobante (impuestos + alícuotas + tributos + datos del receptor). Aditivo.?formato=libro-iva — registros de ancho fijo del Libro de IVA Digital (RG 4597), verificados contra el PDF de AFIP.Aplicar: swap de jar. Sin DDL. Endpoints read-only.
/api/ajustes-contingencia acepta cuit y nroSucursal como filtros. Log más limpio (se vacía logging.pattern.correlation).setFlushMode(COMMIT) NO-OP. Sin cambio de comportamiento.Aplicar: swap de jar. Sin DDL. Punto de partida de esta guía.
Todas read-only, no tocan el money-path de emisión. Fechas en YYYYMMDD. Reemplazá
HOST y <api-key> por los de tu entorno.
Los comprobantes que el gateway emitió por su cuenta y el BackOffice necesita para cerrar su Libro de IVA: el CAE original (duplicado), la NC/ND que lo anula, y el CAEA que es la venta real impresa. El neteo cierra (CAE + CAEA − NC = CAEA); el valor es de registro. Cada comprobante trae su detalle impositivo completo.
Auth: header X-Api-Key: <api-key> · ventana máx. 92 días.
| Parámetro | Req. | Descripción |
|---|---|---|
desde | sí | Inicio del período (YYYYMMDD). |
hasta | sí | Fin del período (YYYYMMDD). |
cuit | — | Filtra por comercio (con o sin guiones; se normaliza a dígitos). |
nroSucursal | — | Filtra por sucursal. |
ente | — | Filtra por id interno de EnteFacturador (compatibilidad). |
formato | — | json (default) · libro-iva (registros ancho fijo RG 4597). |
curl -H "X-Api-Key: <api-key>" \ "https://HOST/api/ajustes-contingencia?desde=20260901&hasta=20260930&cuit=30712434763"
[
{
"ticket": { "suc": 1, "pos": 2, "nroTicket": "T-0001" },
"caeOriginal": {
"ptoVta": 559, "nro": 301882, "fecha": "20260901",
"cae": "75130212345601", "tipoComprobante": 6, "importeTotal": 1234.56,
"docTipo": 99, "docNro": 0, "condicionIvaReceptorId": 5,
"impuestos": {
"netoGravado": 1020.30, "noGravado": 0.0, "exento": 0.0,
"iva": 214.26, "tributos": 0.0, "total": 1234.56,
"ivaAlicuotas": [ { "id": 5, "baseImponible": 1020.30, "importe": 214.26 } ],
"tributosDetalle": []
}
},
"ncAnulacion": { "ptoVta": 559, "nro": 45, "fecha": "20260902", "cae": "75130298765401",
"tipoComprobante": 8, "importeTotal": 1234.56, "docTipo": 99, "docNro": 0,
"condicionIvaReceptorId": 5, "impuestos": { "…": "idem estructura" } },
"caeaImpreso": { "ptoVta": 560, "nro": 12000, "caea": "26123456789012",
"fchTope": "20260910", "estadoInforme": "INFORMADO",
"impuestos": { "…": "idem estructura" } },
"motivo": "doble facturación CAE+CAEA de contingencia",
"crossPeriodo": false,
"estado": "CERRADO"
}
]
Ids AFIP: tipoComprobante 6=Fac B, 8=NC B (1/3=A, 11/13=C, 51/53=M) · alícuota IVA 3=0%, 4=10,5%, 5=21%, 6=27%, 8=5%, 9=2,5% · docTipo 80=CUIT, 96=DNI, 99=Cons.Final.
?formato=libro-ivaMismos filtros; devuelve los registros de ancho fijo del Libro de IVA Digital (RG 4597):
curl -H "X-Api-Key: <api-key>" \
"https://HOST/api/ajustes-contingencia?desde=20260901&hasta=20260930&formato=libro-iva"
→ { "ventasCbte": [ "…registro de 266 caracteres por comprobante…" ],
"ventasAlicuotas": [ "…registro de 62 caracteres por alícuota…" ] }
A diferencia de (A), devuelve todos los comprobantes autorizados por AFIP (CAE online +
CAEA offline + NC/ND), no solo la tripla de contingencia. Fuente: la tabla Trx
(canal único).
Auth: header X-Api-Key: <api-key> · ventana máx. 366 días.
| Parámetro | Req. | Descripción |
|---|---|---|
desde | sí | Inicio del período (YYYYMMDD). |
hasta | sí | Fin del período (YYYYMMDD). |
cuit | — | Filtra por comercio (con o sin guiones). |
nroSucursal | — | Filtra por sucursal. |
ente | — | Filtra por id interno de EnteFacturador. |
formato | — | Ver opciones abajo. |
formatoarca (default) — JSON con las líneas de ancho fijo RG 4597 (ventasCbte 266 / ventasAlicuotas 62).json — un objeto estructurado por comprobante (ver ejemplo).csv — adjunto .zip con ventas_cbte.csv + ventas_alicuotas.csv.formato=jsoncurl -H "X-Api-Key: <api-key>" \
"https://HOST/api/libro-iva?desde=20260901&hasta=20260930&formato=json"
→ [
{
"fecha": "20260901", "tipoComprobante": 6, "ptoVta": 559, "nroComprobante": 301882,
"tipofacturacion": "CAE", "cae": "75130212345601", "caea": null,
"docTipo": 99, "docNro": 0, "razonSocial": "Consumidor Final",
"importeNeto": 1020.30, "importeNoGravado": 0.0, "importeExento": 0.0,
"importeIva": 214.26, "importeTributos": 0.0, "importeTotal": 1234.56,
"iva": [ { "id": 5, "baseImponible": 1020.30, "importe": 214.26 } ]
}
]
formato=csv (baja un .zip)curl -H "X-Api-Key: <api-key>" -OJ \ "https://HOST/api/libro-iva?desde=20260901&hasta=20260930&formato=csv" # → libro-iva-20260901-20260930.zip (ventas_cbte.csv + ventas_alicuotas.csv)
Mismo contenido que (B) pero con la auth normal del cockpit (sesión), sin la
X-Api-Key. Siempre devuelve un archivo descargable. Es lo que usa el botón
“Descargar” de la sección Libro de IVA (ventas).
Auth: sesión del cockpit (no requiere X-Api-Key ni el secret del ABM).
Iguales a (B): desde, hasta (req.), cuit, nroSucursal, ente, formato.
arca / csv → descarga .zip.json → descarga .json.
Actualización acumulada qa-20260825 → qa-20260907c. Todas las releases intermedias son
swap de jar: no hay ninguna migración de DDL ni cambio de WSDL. La única base de datos que
se toca es un INSERT de datos (fila en Tareas), y solo si se activa el barrido.
Descargar el asset tifactura-spring-20260907c.jar de la release y renombrarlo a tifactura-spring.jar.
nssm stop TipreTiFactura copy /y D:\...\tifactura-spring.jar D:\...\backup\tifactura-spring.PREV-<fecha>.jar :: reemplazar el jar por el nuevo nssm start TipreTiFactura
Para actualizar no hace falta cambiar nada si usás el deploy/application.yml de esta versión: ya trae todo. Si mantenés tu YAML externo anterior (de qa-20260825), agregá estas dos claves que entraron con BootUI 1.16 (qa-20260907):
management:
tracing:
enabled: false # BootUI 1.16 trae OpenTelemetry; lo dejamos inerte
logging:
pattern:
correlation: "" # evita el bloque [ ] vacío en cada línea de log
El bloque numeracion.barrido.* solo hace falta si vas a activar el barrido (paso 4). Si no está, aplican los valores por default (todo OFF).
Ninguno es obligatorio — esta actualización no tiene DDL. El único script existe para el barrido (paso 4) y es un INSERT de datos, no un cambio de esquema.
Si no se hace nada de esto, el barrido queda inerte. Para activarlo, en orden:
a. Correr el INSERT en Tareas (una vez). El script está en el repo o dentro del jar:
jar xf tifactura-spring.jar BOOT-INF/classes/db/migration/schedule-barrido-numeracion-job.sql
b. La sección de config es numeracion.barrido en application.yml — así viene por default (cada clave enlazada a una variable de entorno con su valor por default):
numeracion:
barrido:
detectar-enabled: ${BARRIDO_NUM_DETECTAR:false} # Fase A: detecta + alerta (solo lectura)
recuperar-enabled: ${BARRIDO_NUM_RECUPERAR:false} # Fase B: recupera (escribe) — requiere Fase A
ventana-dias: ${BARRIDO_NUM_VENTANA_DIAS:35} # días hacia atrás por comprobanteFecha
max-por-corrida: ${BARRIDO_NUM_MAX:200} # tope de consultas a ARCA por corrida
Cada clave se puede prender de dos formas equivalentes (elegí una):
BARRIDO_NUM_DETECTAR=true, luego BARRIDO_NUM_RECUPERAR=true.detectar-enabled: true y luego recuperar-enabled: true en ese bloque.c. Secuencia: primero Fase A (detectar-enabled=true, recuperar en false) → reiniciar → mirar la tarjeta “Barrido de numeración” del cockpit y las alertas unos días. Después Fase B (recuperar-enabled=true) → reiniciar.
GET /api/cockpit/barrido-numeracion y GET /api/cockpit/condicion-iva-receptor devuelven JSON.Restaurar el jar de backup y reiniciar. Si se activó el barrido y se quiere revertir, apagar los flags o quitar la fila de Tareas; los comprobantes ya recuperados quedan (son válidos).
hbm2ddl=none, el esquema lo administra el cliente. Los .sql de db/migration/ son scripts de referencia que aplica el DBA; esta actualización no requiere ninguno (salvo el INSERT opcional del barrido).Catálogo de las respuestas con error que recibe el cliente (SOAP faults + Response con resultado=R), el faultstring de cada caso (CAE/AFIP + mail, con el fix de claridad aplicado) y el diagrama del flujo de envío de email. Documento self-contained; también suelto en docs/errores-respuesta-cliente.html.