Saltar a contenido

API SOAP

Referencia de los 3 endpoints SOAP que TiFacturaOnlineNext expone (los que consume a AFIP están en Cliente AFIP). El enfoque es contract-first (SPEC-008): el WSDL es la fuente de verdad, y un test bloqueante garantiza que el WSDL servido no se desvíe del baseline de producción. Para el porqué del ciclo, mirá El ciclo de facturación.

Stack

Pieza Valor
Framework SOAP Apache CXF (JAX-WS), cxf.version 4.2.2
Binding SOAP 1.2 (SOAPBinding.SOAP12HTTP_BINDING), style document literal
Transport HTTP (http://schemas.xmlsoap.org/soap/http)
targetNamespace (los 3) http://ws.action.tifacturaonlinemanager.tipre.com/
Path del CXFServlet /TiFacturaOnlineManagerWS (application.yml, cxf.path)
WSDLs fuente src/main/resources/wsdl/{TrxWS,CaeaWS,TiFacturaOnlineManagerWS}.wsdl
WSDLs baseline (gate) baseline/wsdl/ (raíz del repo)

Los 3 servicios

Los publica CxfSoapConfig (com.tipre.tifacturaonlinemanager.config) como tres beans Endpoint. El CXFServlet se monta en cxf.path = /TiFacturaOnlineManagerWS, y cada endpoint se publica en su sub-path, de modo que las URLs resultantes coinciden con las de producción.

Servicio Clase endpoint Sub-path (.publish) URL resultante
TrxWSService TrxWsEndpoint /TrxWS .../TiFacturaOnlineManagerWS/TrxWS
CaeaWSService CaeaWsEndpoint /CaeaWS .../TiFacturaOnlineManagerWS/CaeaWS
TiFacturaOnlineManagerWSService TfomWsEndpoint /TiFacturaOnlineManagerWS .../TiFacturaOnlineManagerWS/TiFacturaOnlineManagerWS

Cada bean fija setWsdlLocation("wsdl/X.wsdl") para servir el WSDL exacto del baseline de producción (no el que CXF regeneraría) — es la vía más segura para que el diff bloqueante dé vacío.

@Bean
public Endpoint trxWsEndpoint(Bus bus, FacturacionService facturacionService) {
    EndpointImpl ep = new EndpointImpl(bus, new TrxWsEndpoint(facturacionService));
    ep.setWsdlLocation("wsdl/TrxWS.wsdl");
    ep.publish("/TrxWS");
    return ep;
}

Cada endpoint implementa una SEI generada por wsdl2java (interfaz endpointInterface) y está anotado @BindingType(SOAPBinding.SOAP12HTTP_BINDING).

El handler de logging legacy NO se porta

SPEC-008 paso 3: a propósito no se registra el WSServerLogHandler legacy. Su logging (TransaccionLog) y su masking estaban muertos en el legacy, y su única función viva (montar el contexto Seam) ya la cubre SeamEventScopeFilter. Portarlo "tal cual" haría crecer el shim de Seam sin beneficio observable.

Operaciones

Las faults estándar de cada operación de negocio son: AfipGeneralException, ParametroRequeridoException, TimeOutException, GeneralException. getVersion y setMockActive no declaran faults; sendEmail y getPdf declaran solo ParametroRequeridoException y GeneralException.

TrxWS (TrxWsEndpoint)

Endpoint de operaciones sobre transacciones (comprobantes) emitidas offline con CAEA.

Operación Estado Qué hace
saveTrx Cableado Persiste una Trx emitida offline con CAEA (delega en FacturacionService.saveTrx).
fecaeaSolicitar Stub Lanza UnsupportedOperationException (pendiente).
setMockActive Stub Lanza UnsupportedOperationException.
getVersion Cableado Devuelve la versión (v20250328).

CaeaWS (CaeaWsEndpoint)

Endpoint del flujo CAEA orientado al POS.

Operación Estado Qué hace
getCaea Stub Lanza UnsupportedOperationException (la variante REST GET /caeaWS/getCaea sí está cableada — ver API REST).
setMockActive Stub Lanza UnsupportedOperationException.
getVersion Stub Lanza UnsupportedOperationException.

TiFacturaOnlineManagerWS (TfomWsEndpoint)

El endpoint principal: emisión de CAE, consultas y puntos de venta.

Operación Estado Qué hace
fecaeSolicitar Cableado Emisión online de CAE (idempotencia + AFIP + persistencia), vía FacturacionService.fecaeSolicitar.
fecaeSolicitarNextGen Cableado Emisión de CAE con numeración automática desde POS NextGen (resuelve ptoVta y Nº desde nroTicketPos/nroSuc/nroPos). Declara faults *_Exception del paquete generado.
feCompUltimoAutorizado Cableado Último comprobante autorizado en ARCA (usa el TA WSAA + WsfeUltimoComprobanteClient).
feCompConsultar Cableado Consulta un comprobante en AFIP o lo devuelve de la DB (FacturacionService.feCompConsultar).
feCompomprobanteFacturado Cableado Idempotencia de consulta: si la Trx existe la devuelve con CAE; si no, devuelve la del request.
getPv Cableado Puntos de venta CAEA del ente (PtoVentaConsultaService.getPtosVenta).
getVersion Cableado Devuelve la versión (v20250328).
setMockActive Stub Lanza UnsupportedOperationException.
sendEmail Stub Lanza UnsupportedOperationException.
getPdf Fuera de alcance Lanza UnsupportedOperationException: el sistema no genera PDF (SPEC-013 descartado).

El gate del WSDL (WsdlDiffGateTest)

SPEC-008 paso 4: un test bloqueante que garantiza que el WSDL servido por CXF no se desvía del contrato de producción. Vive en src/test/java/.../WsdlDiffGateTest.java.

Levanta el app (RANDOM_PORT), baja /TiFacturaOnlineManagerWS/{servicio}?wsdl de cada endpoint y lo compara semánticamente (XMLUnit) contra el baseline congelado en baseline/wsdl/. Normalización aplicada:

  • Ignora whitespace, comentarios y prefijos de namespace (checkForSimilar).
  • Empareja message/operation/etc. por name (el orden no es semántico).
  • Ignora el atributo location de soap:address (host/puerto cambian entre prod y runtime).

Cualquier otra diferencia = test rojo = build rojo. Si hay diff, deja el WSDL servido en target/wsdl-served/ para inspección.

Dos copias de los WSDL — distinto rol

src/main/resources/wsdl/ es la fuente del codegen (wsdl2java) y lo que sirve CXF en runtime (setWsdlLocation). baseline/wsdl/ es el contrato congelado exportado del legacy en vivo (JBoss AS 7.1.1, host EC2AMAZ-01LULGK:8087), contra el que el gate compara. Son archivos distintos a propósito: pueden diferir en serialización (orden de namespaces/atributos) pero deben ser semánticamente idénticos. No editar baseline/wsdl/: es la referencia.

Generación de stubs (cxf-codegen-plugin)

Las SEI y los tipos JAXB se generan en build-time con org.apache.cxf:cxf-codegen-plugin (goal wsdl2java), en la fase generate-sources, hacia target/generated-sources/cxf.

WSDL fuente Paquete generado
src/main/resources/wsdl/TrxWS.wsdl com.tipre.tifacturaonlinemanager.ws.gen.trx
src/main/resources/wsdl/CaeaWS.wsdl com.tipre.tifacturaonlinemanager.ws.gen.caea
src/main/resources/wsdl/TiFacturaOnlineManagerWS.wsdl com.tipre.tifacturaonlinemanager.ws.gen.tfom

Como los 3 WSDL comparten el mismo targetNamespace, se mapea un paquete por servicio (-p ...=...gen.trx, etc.) para que no colisionen las operaciones comunes (getVersion, setMockActive).

# Regenerar las SEI desde los WSDL (corre solo, dentro del build)
mvn generate-sources

# Build completo + el gate bloqueante del WSDL
mvn test

Por dónde seguir