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. porname(el orden no es semántico). - Ignora el atributo
locationdesoap: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¶
- Cliente AFIP — los servicios SOAP que este backend consume.
- API REST — los endpoints REST (incluida la variante REST de
getCaea). - El ciclo de facturación — cuándo entra cada operación.