The last of the paused branches, from its "not for merge" checkpoint:
extraction in ledger-import (text, pages, page images; capped, caught),
journaled as attachment.text_extracted; dedup by hash with
books.find_attachment and books.consolidate_duplicates; annotations and
books.set_entry_settles; the company record categories; the two fuzz
targets; feature attachment_text. Nineteen files conflicted with the
four P4b merges, resolved as plan 8.0.2 says: P6 retakes schema 18 (it
had taken 16, which S4.3 holds; S5 holds 17); the tool table is 129 and
the destructive count 31; both sides' appends kept with their seams
restored; one B-27 paragraph naming every feature; in the old-books
fixture P6's hand-written reimbursement is entry 7 (its ids collided
with S4.3's invoice); the replay fuzzer's list gains S7's
invoice.written_off; S4.3's issued-PDF test expects the extraction
record P6 journals right after a filing.
One integration defect between S7 and P6, found by the arap property
test and fixed here: under P6's dedup, a write-off whose evidence bytes
were filed already (the same collection letter for a second write-off of
the same invoice) was refused only after its entry had been journaled,
at the final link to the invoice ("already linked"). The write-off now
resolves the dedup before anything is journaled and keeps a link the
record already has to the invoice instead of refusing it; an explicit
existing_attachment_id already on an entry is still refused (S7's
one-receipt-once rule). P6's gate never ran before the pause; it runs on
main after this merge, and its ledger-store -> ledger-import dependency
is the open review point (plan 8.0.1).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HS8WZziDnyxunC23MUxrLp
110 lines
4.7 KiB
Rust
110 lines
4.7 KiB
Rust
//! `ledger-core`: canonical double-entry bookkeeping semantics.
|
|
//!
|
|
//! This crate is the engine. Everything else in the workspace — persistence,
|
|
//! import, the oracle harness, the UI — builds on top of it and never
|
|
//! reimplements accounting logic.
|
|
//!
|
|
//! Design rules (see `AGENTS.md` at the repo root):
|
|
//!
|
|
//! * Money is [`Money`]: an exact [`rust_decimal::Decimal`] plus an ISO 4217
|
|
//! currency code. Binary floats never touch money paths.
|
|
//! * A [`Ledger`] is single-currency for now (see `docs/requirements.md` R-5).
|
|
//! * All mutations go through [`Ledger`] commands (`create_entry`, `add_line`,
|
|
//! `post_entry`, `reverse_entry`). Posted entries are immutable; corrections
|
|
//! are reversing entries.
|
|
//! * Reports ([`trial_balance`](reports::trial_balance), [`balance_sheet`](reports::balance_sheet), [`unclosed_earnings`](reports::unclosed_earnings)) are
|
|
//! pure functions of a ledger, which is what makes the semantic oracle
|
|
//! (`docs/oracle.md`) possible.
|
|
|
|
pub mod account;
|
|
pub mod analysis;
|
|
pub mod arap;
|
|
pub mod assets;
|
|
pub mod calendar;
|
|
pub mod cashflow;
|
|
pub mod classes;
|
|
pub mod conventions;
|
|
pub mod error;
|
|
pub mod evidence;
|
|
pub mod form1099;
|
|
pub mod instruments;
|
|
pub mod journal;
|
|
pub mod k1;
|
|
pub mod kernel;
|
|
pub mod ledger;
|
|
pub mod money;
|
|
pub mod parties;
|
|
pub mod payouts;
|
|
pub mod payroll;
|
|
pub mod periods;
|
|
#[cfg(kani)]
|
|
mod proofs;
|
|
pub mod reports;
|
|
pub mod rules;
|
|
pub mod schedules;
|
|
pub mod settings;
|
|
pub mod shares;
|
|
pub mod tax;
|
|
pub mod tax_capital;
|
|
|
|
pub use account::{Account, AccountId, AccountType, ChartOfAccounts, Side};
|
|
pub use arap::{
|
|
AgingDocument, AgingRow, Application, Bill, BillFields, BillId, ControlCheck, Customer,
|
|
CustomerId, DocLine, DocRef, DocState, DocStatus, DocTag, DocumentKind, DocumentLine,
|
|
DocumentPartKey, DocumentStatus, EarlyDiscount, Fee, Invoice, InvoiceFields, InvoiceId,
|
|
Movement, PartySnapshot, PaymentDetails, SendKind, Sent, SentVia, SettleParams, SettlementRow,
|
|
Terms, TermsKind, UnattachedLine, Vendor, VendorId,
|
|
};
|
|
pub use assets::{
|
|
Asset, AssetBasis, AssetCorrection, AssetId, AssetStatus, BasisRule, DepreciationMethod,
|
|
DepreciationPosting, DisposalAmounts, NewAsset, PostedRun, RunAmount, ScheduleLine,
|
|
Sec704cMethod, accumulated_scheduled_through, catch_up_room, check_disposal,
|
|
depreciation_effects, depreciation_schedule, disposal_amounts, life_end, run_amount,
|
|
run_amounts, scheduled_book_value,
|
|
};
|
|
pub use cashflow::{
|
|
CashFlowFooting, CashFlowKind, CashFlowLine, CashFlowParams, CashFlowSection,
|
|
CashFlowStatement, CashFlowWarning, CashFlowWarningKind, NoncashDisclosure, OperatingClass,
|
|
OperatingReconciliation, ReconcilingKind, ReconcilingLine, RoleList, RoleProblem, cash_flow,
|
|
role_problems,
|
|
};
|
|
pub use classes::{Class, ClassId, ProjectFacts, ProjectKind, ProjectStatus};
|
|
pub use error::LedgerError;
|
|
pub use evidence::{Annotation, AnnotationFields};
|
|
pub use form1099::{
|
|
Dated1099, Decision1099, ExemptReason, Form1099, Payment1099, PaymentAccounts, Status1099,
|
|
Vendor1099Line, Vendor1099Report, vendor_1099_report,
|
|
};
|
|
pub use instruments::{Instrument, InstrumentId, InstrumentKind};
|
|
pub use journal::{EntryId, EntryStatus, JournalEntry, JournalLine};
|
|
pub use kernel::{EntryFlows, Flow};
|
|
pub use ledger::{
|
|
BAD_DEBTS, ControlAccount, GENERAL_EXPENSES, Ledger, PAYABLES, PAYMENT_PROCESSING_FEES,
|
|
PAYROLL, PURCHASE_DISCOUNTS, RECEIVABLES, RETAINED_EARNINGS, REVENUE, ReconciliationReport,
|
|
SALES_ALLOWANCES, UnclearedLine, control_account, control_accounts,
|
|
};
|
|
pub use money::{Currency, Money};
|
|
pub use parties::{Party, PartyField, PartyId, Role, TinFacts, TinType, W4Facts, W9Facts};
|
|
pub use payouts::{Payout, PayoutAdjustment, PayoutLine, PayoutTotals, payout_plan};
|
|
pub use payroll::{PayrollLine, PayrollRun, PayrollRunId};
|
|
pub use periods::{
|
|
CloseTo, MemberClose, MemberCloseRecord, MemberRule, MemberSplit, MembersClosed, Period,
|
|
PeriodId, PeriodStatus, RETAINED_EARNINGS_CODE,
|
|
};
|
|
pub use reports::{
|
|
AssetRegister, AssetRegisterRow, BalanceSheet, BalanceSheetStatement, ClassProfitAndLoss,
|
|
GeneralLedger, LedgerAccount, LedgerPosting, MemberCapital, MemberEquityColumn,
|
|
MembersEquityStatement, ProfitAndLoss, ProfitAndLossStatement, ProjectFigures, ProjectToDate,
|
|
StatementLine, TrialBalance, TrialBalanceLine, balance_sheet_as_of, contribution_margin_pct,
|
|
fixed_asset_register, general_ledger, members_equity, profit_and_loss_for_period,
|
|
project_entries, project_figures, project_to_date, trial_balance_as_of,
|
|
};
|
|
pub use schedules::{
|
|
AmortizationSchedule, Frequency, NewRecurring, NewSchedule, RecurringEntry, RecurringId,
|
|
ScheduleConvention, ScheduleId, ScheduleKind, TemplateLine,
|
|
};
|
|
pub use shares::{PartyMember, PartyShare, Share};
|
|
pub use tax::{
|
|
BookOnlyLine, TaxCategory, TaxForm, TaxKind, TaxSummary, TaxSummaryLine, tax_summary,
|
|
};
|