From d8663d946f7c46d623b29e92b36fd485d2b33d46 Mon Sep 17 00:00:00 2001 From: Priec Date: Mon, 7 Sep 2026 20:12:52 +0200 Subject: [PATCH] conversion stuff is now handled by the module --- common/proto/accounting.proto | 9 +++++---- common/proto/common.proto | 6 ++++++ common/proto/tables_data.proto | 5 ++--- common/src/proto/descriptor.bin | Bin 255596 -> 255894 bytes common/src/proto/komp_ac.accounting.rs | 10 ++++++---- common/src/proto/komp_ac.common.rs | 9 +++++++++ common/src/proto/komp_ac.tables_data.rs | 8 ++++---- server | 2 +- 8 files changed, 33 insertions(+), 16 deletions(-) diff --git a/common/proto/accounting.proto b/common/proto/accounting.proto index 55df4b19..bc476a65 100644 --- a/common/proto/accounting.proto +++ b/common/proto/accounting.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package komp_ac.accounting; -import "exchange_rates.proto"; +import "common.proto"; // Mutable informational journals. A journal may contain only debits, only // credits, or any non-zero balance. Balance is reported but never enforced. @@ -170,9 +170,9 @@ message JournalLineInput { string account = 2; string amount = 3; string description = 4; - // Empty uses the profile provider's previous publication. Set this per line when the - // accountant needs a different rule, a saved custom rate, or a one-off rate. - optional komp_ac.exchange_rates.ExchangeRateSelection exchange_rate_selection = 5; + // Omit to use the selected conversion module's posting policy. + // Explicit options are interpreted only by their named module. + optional komp_ac.common.CurrencyConversionOptions conversion_options = 5; } message CloseJournalRequest { @@ -325,6 +325,7 @@ message JournalLine { string original_amount = 16; string original_currency = 17; int64 conversion_evidence_id = 18; + int64 conversion_table_definition_id = 19; } message Journal { diff --git a/common/proto/common.proto b/common/proto/common.proto index 073e01c5..cf40321e 100644 --- a/common/proto/common.proto +++ b/common/proto/common.proto @@ -9,3 +9,9 @@ message CountResponse { message PositionRequest { int64 position = 1; } + +// Options interpreted only by the named currency-conversion module. +message CurrencyConversionOptions { + string module_id = 1; + string options_json = 2; +} diff --git a/common/proto/tables_data.proto b/common/proto/tables_data.proto index 49919fda..bd8c6613 100644 --- a/common/proto/tables_data.proto +++ b/common/proto/tables_data.proto @@ -3,7 +3,6 @@ syntax = "proto3"; package komp_ac.tables_data; import "common.proto"; -import "exchange_rates.proto"; import "google/protobuf/struct.proto"; // Read and write row data for user-defined tables inside profiles (schemas). @@ -166,7 +165,7 @@ map data = 3; message PostAccountingTableDataRequest { PostTableDataRequest row = 1; - komp_ac.exchange_rates.ExchangeRateSelection exchange_rate_selection = 2; + komp_ac.common.CurrencyConversionOptions conversion_options = 2; } // Insert response. @@ -272,7 +271,7 @@ message PutTableDataRequest { message PutAccountingTableDataRequest { PutTableDataRequest update = 1; - komp_ac.exchange_rates.ExchangeRateSelection exchange_rate_selection = 2; + komp_ac.common.CurrencyConversionOptions conversion_options = 2; bool confirmed = 3; repeated string expected_affected_profiles = 4; } diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 001cb632ffd2a260e2f8da537c463aaf55a69529..b4a81cb00c3e84541be463019baeb825d00ef8ef 100644 GIT binary patch delta 18488 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 delta 17795 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 OkxppY@u7L<|NcLk742OB diff --git a/common/src/proto/komp_ac.accounting.rs b/common/src/proto/komp_ac.accounting.rs index ea5f7d50..4707807e 100644 --- a/common/src/proto/komp_ac.accounting.rs +++ b/common/src/proto/komp_ac.accounting.rs @@ -72,11 +72,11 @@ pub struct JournalLineInput { pub amount: ::prost::alloc::string::String, #[prost(string, tag = "4")] pub description: ::prost::alloc::string::String, - /// Empty uses the profile provider's previous publication. Set this per line when the - /// accountant needs a different rule, a saved custom rate, or a one-off rate. + /// Omit to use the selected conversion module's posting policy. + /// Explicit options are interpreted only by their named module. #[prost(message, optional, tag = "5")] - pub exchange_rate_selection: ::core::option::Option< - super::exchange_rates::ExchangeRateSelection, + pub conversion_options: ::core::option::Option< + super::common::CurrencyConversionOptions, >, } #[derive(serde::Serialize, serde::Deserialize)] @@ -314,6 +314,8 @@ pub struct JournalLine { pub original_currency: ::prost::alloc::string::String, #[prost(int64, tag = "18")] pub conversion_evidence_id: i64, + #[prost(int64, tag = "19")] + pub conversion_table_definition_id: i64, } #[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/common/src/proto/komp_ac.common.rs b/common/src/proto/komp_ac.common.rs index 211fa638..f037304d 100644 --- a/common/src/proto/komp_ac.common.rs +++ b/common/src/proto/komp_ac.common.rs @@ -14,3 +14,12 @@ pub struct PositionRequest { #[prost(int64, tag = "1")] pub position: i64, } +/// Options interpreted only by the named currency-conversion module. +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct CurrencyConversionOptions { + #[prost(string, tag = "1")] + pub module_id: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub options_json: ::prost::alloc::string::String, +} diff --git a/common/src/proto/komp_ac.tables_data.rs b/common/src/proto/komp_ac.tables_data.rs index 4ecd6908..6a190133 100644 --- a/common/src/proto/komp_ac.tables_data.rs +++ b/common/src/proto/komp_ac.tables_data.rs @@ -54,8 +54,8 @@ pub struct PostAccountingTableDataRequest { #[prost(message, optional, tag = "1")] pub row: ::core::option::Option, #[prost(message, optional, tag = "2")] - pub exchange_rate_selection: ::core::option::Option< - super::exchange_rates::ExchangeRateSelection, + pub conversion_options: ::core::option::Option< + super::common::CurrencyConversionOptions, >, } /// Insert response. @@ -187,8 +187,8 @@ pub struct PutAccountingTableDataRequest { #[prost(message, optional, tag = "1")] pub update: ::core::option::Option, #[prost(message, optional, tag = "2")] - pub exchange_rate_selection: ::core::option::Option< - super::exchange_rates::ExchangeRateSelection, + pub conversion_options: ::core::option::Option< + super::common::CurrencyConversionOptions, >, #[prost(bool, tag = "3")] pub confirmed: bool, diff --git a/server b/server index 1da33d65..f00542d0 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 1da33d65622004d0005b672a7b67b2f69d7c9492 +Subproject commit f00542d009fdb32b1f9c1426ec0522cfe52ae28e