Config y perfiles¶
Configuración Spring del backend: archivos application*.yml, perfiles, variables de entorno y bloque AFIP. Todo sale de src/main/resources/application*.yml (+ el application-realdb.yml de test). Para la persistencia ver Persistencia; para el cliente AFIP, Cliente AFIP.
Secretos siempre por env var
DB y certificado AFIP nunca van en el repo. Las contraseñas se inyectan por variable de entorno. El único archivo con un password literal es application-realdb.yml, que está gitignored y es solo para validar mapeos contra una DB de prod restaurada en local.
Perfiles¶
| Perfil | Archivo | DB | AFIP | Uso |
|---|---|---|---|---|
| base | application.yml |
— | HOMOLOGACION | Config común a todos. Default: dev. |
dev |
application-dev.yml |
SQL Server local (localhost:1433, db tifacturaonline) |
hereda HOMOLOGACION | Desarrollo. Log a DEBUG. |
prod |
application-prod.yml |
SQL Server del cliente (todo por env) | PRODUCCION | Producción. Log a INFO. |
realdb |
application-realdb.yml (test, gitignored) |
prod restaurada local | — | Validación de mapeos JPA (read-only). |
| (test) | src/test/resources/application.yml |
H2 | — | Tests; pisa al base en el classpath de test. |
Perfil por defecto: spring.profiles.default: dev. Para activar otro: --spring.profiles.active=prod o SPRING_PROFILES_ACTIVE=prod.
application.yml (base)¶
spring:
application:
name: tifactura-spring
profiles:
default: dev
jpa:
hibernate:
ddl-auto: none
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
open-in-view: false
database-platform: com.tipre.tifacturaonlinemanager.action.db.SQLServerDialect
cxf:
path: /TiFacturaOnlineManagerWS
cockpit:
admin-secret: ${COCKPIT_ADMIN_SECRET:}
revalidar-arca-al-guardar: ${COCKPIT_REVALIDAR_ARCA:false}
afip:
mode: HOMOLOGACION
wsaa-url: https://wsaahomo.afip.gov.ar/ws/services/LoginCms
wsfe-url: https://wswhomo.afip.gob.ar/wsfev1/service.asmx
service: wsfe
dstdn: cn=wsaahomo,o=afip,c=ar,serialNumber=CUIT 33693450239
ticket-time-ms: 43200000 # 12h
tls-insecure: true
cuit: ${AFIP_CUIT:}
comprobantes-por-request: 1
logging:
level:
com.tipre.tifacturaonlinemanager: INFO
application-dev.yml¶
spring:
datasource:
url: jdbc:sqlserver://localhost:1433;databaseName=tifacturaonline;encrypt=true;trustServerCertificate=true
username: ${DB_USER:sa}
password: ${DB_PASS:}
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
logging:
level:
com.tipre.tifacturaonlinemanager: DEBUG
AFIP queda en HOMOLOGACION (heredado del base). DB local: usuario default sa, password vacío por default.
application-prod.yml¶
spring:
datasource:
url: jdbc:sqlserver://${DB_HOST}:${DB_PORT:1433};databaseName=${DB_NAME};encrypt=true;trustServerCertificate=true
username: ${DB_USER}
password: ${DB_PASS}
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
afip:
mode: PRODUCCION
wsaa-url: https://wsaa.afip.gov.ar/ws/services/LoginCms
wsfe-url: https://servicios1.afip.gov.ar/wsfev1/service.asmx
dstdn: cn=wsaa,o=afip,c=ar,serialNumber=CUIT 33693450239
logging:
level:
com.tipre.tifacturaonlinemanager: INFO
En prod todos los hosts y secretos de DB son env vars sin default → si faltan, la app no levanta (intencional: nada hardcodeado).
Variables de entorno¶
| Variable | Perfil | Default | Efecto |
|---|---|---|---|
DB_USER |
dev / prod | sa (dev) / sin default (prod) |
Usuario de la DB. |
DB_PASS |
dev / prod | vacío (dev) / sin default (prod) | Password de la DB. |
DB_HOST |
prod | sin default | Host SQL Server. |
DB_PORT |
prod | 1433 |
Puerto SQL Server. |
DB_NAME |
prod | sin default | Nombre de la base. |
AFIP_CUIT |
base | vacío | CUIT del emisor (afip.cuit). |
COCKPIT_ADMIN_SECRET |
base | vacío | Secret del ABM del cockpit (header X-Cockpit-Secret). Vacío → ABM deshabilitado (fail-closed). |
COCKPIT_REVALIDAR_ARCA |
base | false |
Si true, al alta/edición de SucPosPV revalida los PV (CAE/CAEA) contra AFIP antes de guardar. |
LOG_DIR |
logback | logs |
Directorio de los archivos de log. |
SPRING_PROFILES_ACTIVE |
Spring | dev |
Perfil activo. |
El cert AFIP NO es env var
El certificado .p12 (path, clave y alias) no sale del .yml ni de env vars: vive en la tabla EntesFacturadores por comercio (certP12Path, certP12Password, certP12Alias). Ver Modelo de dominio y Cliente AFIP.
Config AFIP (afip.*)¶
Estas properties las consume AfipClientConfig (vía @Value con los mismos defaults). El bloque base es HOMOLOGACION; application-prod.yml lo sobreescribe a PRODUCCION.
| Property | HOMOLOGACION (base) | PRODUCCION (prod) |
|---|---|---|
afip.mode |
HOMOLOGACION |
PRODUCCION |
afip.wsaa-url |
https://wsaahomo.afip.gov.ar/ws/services/LoginCms |
https://wsaa.afip.gov.ar/ws/services/LoginCms |
afip.wsfe-url |
https://wswhomo.afip.gob.ar/wsfev1/service.asmx |
https://servicios1.afip.gov.ar/wsfev1/service.asmx |
afip.dstdn |
cn=wsaahomo,o=afip,c=ar,serialNumber=CUIT 33693450239 |
cn=wsaa,o=afip,c=ar,serialNumber=CUIT 33693450239 |
afip.service |
wsfe |
wsfe |
afip.ticket-time-ms |
43200000 (12 h) |
idem |
afip.tls-insecure |
true |
idem (heredado; sobrescribible) |
afip.cuit |
${AFIP_CUIT:} |
idem |
afip.comprobantes-por-request |
1 |
idem |
tls-insecure = true
Con afip.tls-insecure: true el cliente AFIP hace trust-all del cert y no verifica el hostname de ARCA — es el equivalente al Https.java del legacy (que tampoco validaba). Está forzado como en prod legacy. Para volver a TLS verificado, poné false (en el perfil que corresponda). En AfipClientConfig el default del @Value es false, pero el application.yml lo fuerza a true.
CXF (SOAP)¶
cxf.path: /TiFacturaOnlineManagerWS monta el CXFServlet. CxfSoapConfig publica 3 endpoints bajo ese path, cada uno sirviendo el WSDL baseline de producción:
| Endpoint | URL resultante | WSDL |
|---|---|---|
TrxWsEndpoint |
/TiFacturaOnlineManagerWS/TrxWS |
wsdl/TrxWS.wsdl |
CaeaWsEndpoint |
/TiFacturaOnlineManagerWS/CaeaWS |
wsdl/CaeaWS.wsdl |
TfomWsEndpoint |
/TiFacturaOnlineManagerWS/TiFacturaOnlineManagerWS |
wsdl/TiFacturaOnlineManagerWS.wsdl |
Detalle en API SOAP.
Cockpit¶
cockpit.admin-secret (env COCKPIT_ADMIN_SECRET) gatea el ABM de SucPosPV vía header X-Cockpit-Secret. Es fail-closed: si no hay secret configurado, todo el ABM responde deshabilitado. No es autenticación real (eso es SPEC-014); es un candado simple. cockpit.revalidar-arca-al-guardar (env COCKPIT_REVALIDAR_ARCA, default false) controla si se revalidan los PV contra AFIP al guardar. Ver Cockpit.
Logging¶
Configurado en src/main/resources/logback-spring.xml (sobre los defaults de Spring Boot). Variable LOG_DIR (default logs).
| Appender / logger | Archivo | Rotación | Notas |
|---|---|---|---|
CONSOLE |
— | — | Salida estándar (root). |
APP_FILE |
${LOG_DIR}/tifactura.log |
10 MB/archivo, 30 días, cap 500 MB | Log general (root). |
TRAFFIC_FILE |
${LOG_DIR}/traffic.log |
20 MB/archivo, 30 días, cap 2 GB | Tráfico POS↔servicio + gateway↔ARCA, payloads JSON/XML completos. |
logger TRAFFIC |
→ TRAFFIC_FILE |
— | additivity=false: el tráfico va solo a traffic.log, no ensucia consola ni app log. Lo alimenta TrafficLoggingFilter. |
Niveles del paquete com.tipre.tifacturaonlinemanager: INFO en base/prod, DEBUG en dev.
Config operativa fuera del YAML
Mail, URLs y flags operativos no están en el application.yml: siguen saliendo de la tabla Parametro (config que el cliente cambia en caliente). El .yml solo tiene infraestructura y secretos.
Por dónde seguir¶
- Backend — stack y build.
- Persistencia — datasource y dialecto.
- Cliente AFIP — cómo se usa el bloque
afip.*. - Setup de desarrollo — levantar con el perfil dev.