wiki/Finanzas y liquidaciones/Tipos de cambio: una llamada API al día y un respaldo que no necesita clave
06Finanzas y liquidacionesLectura mínima 2

Tipos de cambio: una llamada API al día y un respaldo que no necesita clave

El job de refresco diario, las dos fuentes que hay detrás y el historial que todavía puede decirle qué tipo estaba vivo un martes de marzo.

Los tipos de cambio son de ese tipo de infraestructura en la que nadie piensa hasta que una liquidación está en dólares y alguien pregunta de dónde salió el 1,0847. La respuesta de la plataforma es deliberadamente pequeña: un job, una caché, una tabla de historial y una página de administración con tres controles.

Un job, una vez al día

Un cron llama a /api/cron/refresh-rates a las 07:00 UTC, las 08:00 en hora centroeuropea. Trae los últimos tipos con base EUR, se queda solo con los pares cuya moneda está en el catálogo y los escribe en la caché de tipos: una fila por par de monedas, reemplazada en cada refresco. Las conversiones entre monedas se calculan en tiempo de ejecución a partir de esos pares con base EUR, y por eso una sola llamada API al día cubre a todos los inquilinos de la plataforma. Existe un botón Actualizar ahora para esas mañanas en las que esperar a mañana no es una opción.

Dos fuentes, una de ellas gratuita

La fuente principal es ExchangeRate-API: 161 monedas, actualización diaria y una clave API que el equipo de plataforma guarda una sola vez. Sin clave —o cuando la llamada principal vuelve vacía— el job cae hacia Frankfurter, que sirve los tipos de referencia del Banco Central Europeo: 31 monedas, publicadas a diario a las 16:00 CET, sin clave. El respaldo es automático, y cada refresco registra qué fuente entregó los números de verdad, así que un día de tipos escasos se explica solo en lugar de parecer un bug.

El interruptor, y qué pasa cuando está apagado

/admin/exchange-rates pertenece al equipo de plataforma; todos los demás reciben la página de acceso restringido. Contiene la clave API, el interruptor de actualización diaria automática, el refresco manual y un resumen de cuántos tipos hay en caché, de qué fuente y desde hace cuánto. Apague la actualización automática y el cron no sigue trayendo tipos en silencio: registra una ejecución omitida con el motivo y no toca nada. Un job que miente sobre estar desactivado es peor que no tener job.

Historial, para poder defender un tipo bloqueado

La caché guarda el tipo de hoy para cada par. Cada cambio queda capturado en un historial separado, de solo añadir, con un válido desde y un válido hasta, que es lo que permite reconstruir meses después qué tipo estaba vivo en un momento dado. Los registros que bloquearon un tipo —un trato de Market aceptado, una liquidación— conservan el tipo que bloquearon haga lo que haga la fuente después. El historial existe para la conversación sobre el tipo, no para cambiarlo.