{# GET /admin/ecb — crate::pages::admin::ecb::ui::EcbPage #} {% extends "ui/base.html" %} {% block title %}Exchange rates{% endblock %} {% block content %}

Exchange rates

ECB reference rates

The importer fetches the ECB's published rates once a day and records every attempt. Conversions read only what it has verified, so coverage is what decides whether a foreign-currency amount can be posted at all.

{% include "pages/admin/ecb/status.html" %}

Import attempts {{ page.batches.len() }} {%- if page.failure_count() > 0 %}{{ page.failure_count() }} failed{% endif -%}

{% if page.batches.is_empty() %}

The importer has not recorded an attempt. It runs on startup and then daily, so an empty log means the server has not completed a run since this table was created.

{% else %}
{% for batch in page.batches %} {% if let Some(message) = batch.error_message %} {% endif %} {% endfor %}
#ResultStartedFinished TookWindowObservations Verified through
{{ batch.batch_id }} {%- if batch.succeeded() %}succeeded {%- else if batch.running() %}running {%- else %}failed{% endif -%} {{ batch.started() }} {%- if let Some(finished) = batch.finished() %}{{ finished }} {%- else %}still running{% endif -%} {%- if let Some(took) = batch.took() %}{{ took }} {%- else %}{% endif -%} {{ batch.window() }}
{{ batch.endpoint }}
{{ batch.observations() }} {%- if let Some(date) = batch.verified_through_date %}{{ date }} {%- else %}{% endif -%}
{{ message }}

Attempts are an audit record: they cannot be edited or deleted, and a batch that re-fetched a day an earlier one already owned inserts nothing, which is why the new count can be lower than the total.

{% endif %}
{% endblock %}