syntax = "proto3"; package komp_ac.ecb; // Read-only access to ECB conversion audit evidence. // // This service exists for manual visual verification. It exposes conversions // already recorded by backend posting workflows and never recalculates money. service EcbService { // List immutable ECB conversion evidence for one money value. rpc ListEcbConversionEvidence(ListEcbConversionEvidenceRequest) returns (ListEcbConversionEvidenceResponse); } // Identify one logical money cell whose conversion history should be inspected. message ListEcbConversionEvidenceRequest { // Required. Profile containing the table. string profile_name = 1; // Required. Logical table name within the profile. string table_name = 2; // Required. Dynamic table row id. int64 record_id = 3; // Required. Current display name of the money column. The server resolves it // to the stable physical column name used by immutable evidence. string column_name = 4; // Optional. Maximum rows to return. Zero uses 100; maximum is 500. int32 limit = 5; // Optional cursor. Return evidence ids lower than this value. optional int64 before_evidence_id = 6; } // One immutable explanation of how a posted EUR value was determined. message EcbConversionEvidence { int64 evidence_id = 1; string original_amount = 2; string original_currency = 3; string eur_amount = 4; string conversion_context = 5; string anchor_date = 6; string determination_method = 7; string rounding_method = 8; optional string rate_date = 9; optional string units_per_eur = 10; optional int64 rate_observation_id = 11; optional string observation_hash = 12; optional string source_payload_hash = 13; optional string rate_fetched_at = 14; optional int64 import_batch_id = 15; optional string source_endpoint = 16; string evidence_created_at = 17; } message ListEcbConversionEvidenceResponse { // True when at least one evidence row for this cell used an ECB rate. bool has_exchange = 1; // Newest-first immutable history for this page. repeated EcbConversionEvidence evidence = 2; // True when another page exists using the last evidence_id as the cursor. bool has_more = 3; }