aeat.domain.modelos._ledger_filing_snapshot module¶
Immutable ledger snapshot backing a modelo filing revision.
A modelo calculation revision that reaches a verified or filed state carries a
content-addressed snapshot of the ledger state it was computed from: a
fingerprint over each contributing transaction’s tax-relevant facts plus an
aggregate snapshot fingerprint. This is the audit + staleness layer that sits
on top of the write-time blocking guard (see the
modelo-filing-ledger-snapshot ADR).
This module holds the pure records and the pure fingerprint diff. The Transaction-aware capture (which reads the live catalogue to produce row fingerprints) lives in the application aggregation layer so the domain stays free of the ledger-read dependency, per the hexagonal boundary.
- class LedgerRowFingerprint(**data)[source]¶
Bases:
BaseModelContent fingerprint of one contributing ledger transaction.
- Variables:
transaction_id – The contributor’s stable ledger transaction id.
fingerprint – SHA-256 hex over the transaction’s tax-relevant facts (the fields that can move a casilla), computed by the application capture helper.
- Parameters:
- transaction_id: str¶
- fingerprint: str¶
- class LedgerFilingSnapshot(**data)[source]¶
Bases:
BaseModelImmutable snapshot of the ledger state behind one filing revision.
Empty
rowsis valid and expected for a non-ledger modelo (no contributing transactions); itssnapshot_fingerprintis the digest of the empty contributor set, so every modelo carries a uniform, comparable snapshot regardless of whether it is ledger-fed.- Variables:
rows – Per-contributor fingerprints, sorted by transaction id.
snapshot_fingerprint – SHA-256 hex over the sorted
(id, fingerprint)pairs; the content address of the whole ledger state.captured_at – UTC timestamp the snapshot was taken.
- Parameters:
rows (tuple[LedgerRowFingerprint, ...])
snapshot_fingerprint (str)
captured_at (datetime)
- rows: tuple[LedgerRowFingerprint, ...]¶
- snapshot_fingerprint: str¶
- captured_at: datetime¶
- class LedgerFilingStalenessVerdict(**data)[source]¶
Bases:
BaseModelDrift between a filed snapshot and the current ledger state.
- Variables:
is_stale – True when any contributor changed or was removed.
changed – Contributor ids whose live fingerprint differs from the snapshot.
removed – Contributor ids absent from the live catalogue.
unchanged – Contributor ids whose live fingerprint matches the snapshot.
- Parameters:
- is_stale: bool¶
- changed: tuple[str, ...]¶
- removed: tuple[str, ...]¶
- unchanged: tuple[str, ...]¶
- snapshot_fingerprint(rows)[source]¶
Return the aggregate content address over sorted contributor fingerprints.
- Return type:
- Parameters:
rows (tuple[LedgerRowFingerprint, ...])
- diff_ledger_fingerprints(snapshot, current_fingerprints)[source]¶
Compare a filed snapshot against live per-contributor fingerprints.
current_fingerprintsmaps each contributor’s transaction id to its freshly-recomputed fingerprint (a contributor missing from the mapping is treated as removed). Pure: no ledger read happens here.- Return type:
- Returns:
The computed
LedgerFilingStalenessVerdictdetail.- Parameters:
snapshot (LedgerFilingSnapshot)
- class LedgerEvidenceRow(**data)[source]¶
Bases:
BaseModelTyped evidence projection of one contributing ledger transaction.
Where
LedgerRowFingerprintrecords only the content hash (for staleness detection), this record carries the actual tax-relevant facts that moved a casilla, plus its regulatory grounding and evidence references, so the fact basis can be reconstituted from the revision and rendered into a filing artefact.fingerprintbinds this row to the matchingLedgerRowFingerprint, so an evidence/fingerprint mismatch is detectable.Enum-valued facts are stored as their canonical string
value(and dates as ISO-8601 strings) so the record roundtrips cleanly through the strict persistence boundary and the domain stays free of the ledger-read dependency; the application capture layer projects the typedTransactioninto this primitive shape.- Parameters:
transaction_id (str)
fingerprint (str)
booked_date (str)
value_date (str | None)
amount (Decimal)
currency (str)
direction (str)
business_classification (str)
business_pct (Decimal | None)
taxable_base (Decimal | None)
iva_rate (Decimal | None)
iva_amount (Decimal | None)
iva_category (str | None)
category_id (str | None)
irpf_category (str | None)
counterparty_eu_member_state (str | None)
fx_rate (Decimal | None)
value_in_eur (Decimal | None)
lifecycle_state (str)
counterparty (str | None)
description (str)
purchase_invoice_evidence_id (str | None)
legal_refs (tuple[LegalRefId, ...])
source_refs (tuple[SourceRefId, ...])
- transaction_id: str¶
- fingerprint: str¶
- booked_date: str¶
- value_date: str | None¶
- amount: Decimal¶
- currency: str¶
- direction: str¶
- business_classification: str¶
- business_pct: Decimal | None¶
- taxable_base: Decimal | None¶
- iva_rate: Decimal | None¶
- iva_amount: Decimal | None¶
- iva_category: str | None¶
- category_id: str | None¶
- irpf_category: str | None¶
- counterparty_eu_member_state: str | None¶
- fx_rate: Decimal | None¶
- value_in_eur: Decimal | None¶
- lifecycle_state: str¶
- counterparty: str | None¶
- description: str¶
- purchase_invoice_evidence_id: str | None¶
- attachment_ids: tuple[str, ...]¶
- document_link_ids: tuple[str, ...]¶
- legal_refs: tuple[LegalRefId, ...]¶
- source_refs: tuple[SourceRefId, ...]¶
- class ManualFactBasisEntry(**data)[source]¶
Bases:
BaseModelOne operator-entered fact behind a revision that is not ledger-derived.
Manual casilla inputs and binding overrides have no contributing ledger row; they are nonetheless part of the fact basis a filing artefact must explain.
casilla_idis the canonical registry casilla id andvalueis the rendered canonical string of the operator-entered value.- Parameters:
- casilla_id: CasillaId¶
- value: str¶
- kind: str¶
- note: str¶
- legal_refs: tuple[LegalRefId, ...]¶
- source_refs: tuple[SourceRefId, ...]¶
- class LedgerFilingEvidence(**data)[source]¶
Bases:
BaseModelThe bundled fact basis behind one ledger-derived filing revision.
Pegged to the revision’s
LedgerFilingSnapshotviasnapshot_fingerprintso evidence and the staleness fingerprint share one content address. Emptyrows+ emptymanual_entriesis valid for a non-ledger, non-manual revision; a ledger-derived revision MUST carry oneLedgerEvidenceRowper fingerprint contributor (the application capture asserts the sets match, so no contributor is silently dropped from the evidence).- Parameters:
snapshot_fingerprint (str)
rows (tuple[LedgerEvidenceRow, ...])
manual_entries (tuple[ManualFactBasisEntry, ...])
captured_at (datetime)
- snapshot_fingerprint: str¶
- rows: tuple[LedgerEvidenceRow, ...]¶
- manual_entries: tuple[ManualFactBasisEntry, ...]¶
- captured_at: datetime¶