syntax = "proto3"; package komp_ac.accounting; // Mutable informational journals. A journal may contain only debits, only // credits, or any non-zero balance. Balance is reported but never enforced. service Accounting { // Create an empty journal and return its generated journal_id. rpc CreateJournal(CreateJournalRequest) returns (Journal); // Return journal lines and credits-minus-debits informational balance. rpc GetJournal(GetJournalRequest) returns (Journal); // Return the profile-wide count of balanced and unbalanced journals. rpc GetAccountingStatus(GetAccountingStatusRequest) returns (AccountingStatus); // Return an oldest-first, paginated queue of unbalanced journals. rpc ListUnbalancedJournals(ListUnbalancedJournalsRequest) returns (ListUnbalancedJournalsResponse); // Append one manual debit or credit line to an existing journal. rpc AddJournalLine(AddJournalLineRequest) returns (Journal); // Soft-delete one line while retaining it for audit display. rpc SoftDeleteJournalLine(SoftDeleteJournalLineRequest) returns (Journal); } // Tables with an active posting script accept journal_id as a reserved key in // PostTableDataRequest.data. It selects the journal receiving generated lines // and is removed before the source row is validated or stored. enum JournalSide { JOURNAL_SIDE_UNSPECIFIED = 0; JOURNAL_SIDE_DEBIT = 1; JOURNAL_SIDE_CREDIT = 2; } message CreateJournalRequest { string profile_name = 1; string currency = 2; string description = 3; } message GetJournalRequest { string profile_name = 1; int64 journal_id = 2; bool include_deleted = 3; } message GetAccountingStatusRequest { string profile_name = 1; } message AccountingStatus { bool all_journals_balanced = 1; int64 journal_count = 2; int64 balanced_journal_count = 3; int64 unbalanced_journal_count = 4; string calculated_at = 5; } message ListUnbalancedJournalsRequest { string profile_name = 1; // Zero uses 50. The maximum is 500. int32 page_size = 2; // Opaque cursor returned by the previous response. Empty starts at the // oldest unbalanced journal. string page_token = 3; // Optional ISO 4217 currency filter. Empty includes every currency. string currency = 4; } message UnbalancedJournalSummary { int64 journal_id = 1; string description = 2; string currency = 3; string total_debit = 4; string total_credit = 5; // Signed credits-minus-debits difference. string balance = 6; // Side and positive amount needed to make the journal balance zero. JournalSide missing_side = 7; string missing_amount = 8; int64 active_line_count = 9; string created_at = 10; } message ListUnbalancedJournalsResponse { repeated UnbalancedJournalSummary journals = 1; int64 total_unbalanced_count = 2; string next_page_token = 3; } message AddJournalLineRequest { string profile_name = 1; int64 journal_id = 2; JournalSide side = 3; string account_code = 4; string amount = 5; string description = 6; } message SoftDeleteJournalLineRequest { string profile_name = 1; int64 journal_id = 2; int64 journal_line_id = 3; } message JournalLine { int64 id = 1; int32 line_number = 2; JournalSide side = 3; string account_code = 4; string amount = 5; string description = 6; bool deleted = 7; string created_at = 8; string deleted_at = 9; string source_table_name = 10; int64 source_record_id = 11; int64 source_row_revision = 12; int64 posting_script_id = 13; } message Journal { int64 id = 1; string profile_name = 2; string currency = 3; string description = 4; string created_at = 5; repeated JournalLine lines = 6; string total_debit = 7; string total_credit = 8; // Informational difference calculated as credits minus debits. string balance = 9; }