Saltar a contenido

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