From 81a41b9b1ae20a0c51f3105fe6cf50d3c9da626a Mon Sep 17 00:00:00 2001 From: Filipriec Date: Mon, 31 Aug 2026 21:14:01 +0200 Subject: [PATCH] predvaha --- client-gui2 | 2 +- common/proto/accounting.proto | 42 +++++++ common/src/proto/descriptor.bin | Bin 214899 -> 217310 bytes common/src/proto/komp_ac.accounting.rs | 146 +++++++++++++++++++++++++ server | 2 +- 5 files changed, 190 insertions(+), 2 deletions(-) diff --git a/client-gui2 b/client-gui2 index 91a46f6c..9839994e 160000 --- a/client-gui2 +++ b/client-gui2 @@ -1 +1 @@ -Subproject commit 91a46f6cf2627631b702308abaa5029783da60ef +Subproject commit 9839994ea55eb2b441b196eeb62cf15623de18ff diff --git a/common/proto/accounting.proto b/common/proto/accounting.proto index 9eaadcb4..e06370a4 100644 --- a/common/proto/accounting.proto +++ b/common/proto/accounting.proto @@ -63,6 +63,11 @@ service Accounting { returns (ListAccountingPeriodsResponse); rpc ListPeriodBalances(ListPeriodBalancesRequest) returns (ListPeriodBalancesResponse); + // Return a predvaha from one closed period's frozen account balances. + // Opening and closing signed balances are presented on their debit or credit + // side, while period turnover retains the journal's debit and credit columns. + rpc GetTrialBalance(GetTrialBalanceRequest) returns (GetTrialBalanceResponse); + // Materialize one row per directly transferable source account in a table // containing an ACCOUNTING_TRANSFER definition. Source fields are frozen // accounting facts; target fields start as an unchanged same-path copy and @@ -437,6 +442,43 @@ message ListPeriodBalancesResponse { repeated PeriodDenominationBalance denomination_balances = 2; } +message GetTrialBalanceRequest { + int64 period_id = 1; +} + +message TrialBalanceRow { + // Slash-delimited root-to-leaf account path. Rows include both posting + // accounts and consolidated ancestors from the frozen period snapshot. + string account = 1; + uint32 depth = 2; + bool is_summary = 3; + string currency = 4; + string opening_debit = 5; + string opening_credit = 6; + string period_debit = 7; + string period_credit = 8; + string closing_debit = 9; + string closing_credit = 10; +} + +message TrialBalanceTotals { + // Totals are calculated from root rows only, because descendant rows are + // already consolidated into their ancestors. + string opening_debit = 1; + string opening_credit = 2; + string period_debit = 3; + string period_credit = 4; + string closing_debit = 5; + string closing_credit = 6; +} + +message GetTrialBalanceResponse { + AccountingPeriod period = 1; + string currency = 2; + repeated TrialBalanceRow rows = 3; + TrialBalanceTotals totals = 4; +} + message GenerateAccountingTransferRequest { string profile_name = 1; string table_name = 2; diff --git a/common/src/proto/descriptor.bin b/common/src/proto/descriptor.bin index 114703110f56604d247f1f9102c3a99d1b1f2e96..56b08f187c2186e040991bfd806c44adcb880585 100644 GIT binary patch delta 18198 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 T%v-W)NW_0;+omD*=;QxCjL*T3 diff --git a/common/src/proto/komp_ac.accounting.rs b/common/src/proto/komp_ac.accounting.rs index 27efa1f6..31e247b2 100644 --- a/common/src/proto/komp_ac.accounting.rs +++ b/common/src/proto/komp_ac.accounting.rs @@ -502,6 +502,68 @@ pub struct ListPeriodBalancesResponse { pub denomination_balances: ::prost::alloc::vec::Vec, } #[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] +pub struct GetTrialBalanceRequest { + #[prost(int64, tag = "1")] + pub period_id: i64, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct TrialBalanceRow { + /// Slash-delimited root-to-leaf account path. Rows include both posting + /// accounts and consolidated ancestors from the frozen period snapshot. + #[prost(string, tag = "1")] + pub account: ::prost::alloc::string::String, + #[prost(uint32, tag = "2")] + pub depth: u32, + #[prost(bool, tag = "3")] + pub is_summary: bool, + #[prost(string, tag = "4")] + pub currency: ::prost::alloc::string::String, + #[prost(string, tag = "5")] + pub opening_debit: ::prost::alloc::string::String, + #[prost(string, tag = "6")] + pub opening_credit: ::prost::alloc::string::String, + #[prost(string, tag = "7")] + pub period_debit: ::prost::alloc::string::String, + #[prost(string, tag = "8")] + pub period_credit: ::prost::alloc::string::String, + #[prost(string, tag = "9")] + pub closing_debit: ::prost::alloc::string::String, + #[prost(string, tag = "10")] + pub closing_credit: ::prost::alloc::string::String, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] +pub struct TrialBalanceTotals { + /// Totals are calculated from root rows only, because descendant rows are + /// already consolidated into their ancestors. + #[prost(string, tag = "1")] + pub opening_debit: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub opening_credit: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub period_debit: ::prost::alloc::string::String, + #[prost(string, tag = "4")] + pub period_credit: ::prost::alloc::string::String, + #[prost(string, tag = "5")] + pub closing_debit: ::prost::alloc::string::String, + #[prost(string, tag = "6")] + pub closing_credit: ::prost::alloc::string::String, +} +#[derive(serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct GetTrialBalanceResponse { + #[prost(message, optional, tag = "1")] + pub period: ::core::option::Option, + #[prost(string, tag = "2")] + pub currency: ::prost::alloc::string::String, + #[prost(message, repeated, tag = "3")] + pub rows: ::prost::alloc::vec::Vec, + #[prost(message, optional, tag = "4")] + pub totals: ::core::option::Option, +} +#[derive(serde::Serialize, serde::Deserialize)] #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GenerateAccountingTransferRequest { #[prost(string, tag = "1")] @@ -1375,6 +1437,35 @@ pub mod accounting_client { ); self.inner.unary(req, path, codec).await } + /// Return a predvaha from one closed period's frozen account balances. + /// Opening and closing signed balances are presented on their debit or credit + /// side, while period turnover retains the journal's debit and credit columns. + pub async fn get_trial_balance( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::unknown( + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic_prost::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/komp_ac.accounting.Accounting/GetTrialBalance", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert( + GrpcMethod::new("komp_ac.accounting.Accounting", "GetTrialBalance"), + ); + self.inner.unary(req, path, codec).await + } /// Materialize one row per directly transferable source account in a table /// containing an ACCOUNTING_TRANSFER definition. Source fields are frozen /// accounting facts; target fields start as an unchanged same-path copy and @@ -1631,6 +1722,16 @@ pub mod accounting_server { tonic::Response, tonic::Status, >; + /// Return a predvaha from one closed period's frozen account balances. + /// Opening and closing signed balances are presented on their debit or credit + /// side, while period turnover retains the journal's debit and credit columns. + async fn get_trial_balance( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; /// Materialize one row per directly transferable source account in a table /// containing an ACCOUNTING_TRANSFER definition. Source fields are frozen /// accounting facts; target fields start as an unchanged same-path copy and @@ -2573,6 +2674,51 @@ pub mod accounting_server { }; Box::pin(fut) } + "/komp_ac.accounting.Accounting/GetTrialBalance" => { + #[allow(non_camel_case_types)] + struct GetTrialBalanceSvc(pub Arc); + impl< + T: Accounting, + > tonic::server::UnaryService + for GetTrialBalanceSvc { + type Response = super::GetTrialBalanceResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::get_trial_balance(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let method = GetTrialBalanceSvc(inner); + let codec = tonic_prost::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } "/komp_ac.accounting.Accounting/GenerateAccountingTransfer" => { #[allow(non_camel_case_types)] struct GenerateAccountingTransferSvc(pub Arc); diff --git a/server b/server index 61f373ee..48d6b1cd 160000 --- a/server +++ b/server @@ -1 +1 @@ -Subproject commit 61f373ee5c75f35263e3e5773bb71310bd9371ad +Subproject commit 48d6b1cd089f21614c6525b7162b968eac08916d