Skip to content

アーキテクチャ

ワークスペース構成

Relqis は、CLI、runtime、application、domain、infrastructure に分かれた Cargo workspace です。

  • rlq-clirlq コマンドを提供するアプリケーション層のアダプタです。
  • relqis-runtime は SQLite bootstrap、clock、viewer/runtime facade を提供する共有 composition root です。
  • relqis-application は command/query DTO、アプリケーションサービス、エラー変換、トランザクション境界を担います。
  • relqis-domain は bounded context、aggregate、値オブジェクト、policy、domain event を担います。
  • relqis-infra-sqlite は SQLite 永続化、query repository、migration、UnitOfWork 実装を担います。

境界づけられたコンテキスト

ワークスペースで実装している主要な bounded context は次のとおりです。

  • Ledger
  • Master
  • Posting
  • Closing
  • Evidence
  • Export

日本語の目安:

  • Ledger = 台帳
  • Master = マスタ
  • Posting = 起票
  • Closing = 締め
  • Evidence = 証憑参照
  • Export = エクスポート

Ledger(台帳)は単一の会計上の真実として保たれます。締め結果、繰越仕訳、read model、export は、隠れた可変残高ではなく ledger entry から説明できなければなりません。

レイヤードアーキテクチャ

依存方向は常に domain の内側へ向けます。

  • rlq-cli は端末入力を解釈し、出力を整形し、アプリケーションサービスへ委譲します。
  • relqis-runtime は SQLite ベースの engine wiring をまとめ、CLI や将来の GUI が同じ runtime を共有できるようにします。
  • relqis-application はユースケースを調停し、aggregate をまたぐ規則やアプリケーション規則を検証し、トランザクション境界を持ちます。
  • relqis-domain は会計不変条件を含み、CLI や SQLite の都合に依存してはいけません。
  • relqis-infra-sqlite は、domain 規則を再定義せずに永続化ポートと read-side query を実装します。

現在の実装状況

現在の実装は、初期骨格だけの状態ではありません。

  • entry、posting request、opening、fiscal period、close、carryforward、attach/trace、export、master data 管理向けの CLI command が存在します。
  • posted 済み仕訳は不変であり、変更フローは post、reverse、void、carryforward で表現されます。
  • Manual entry も PostingRequest(起票要求)を通ります。ledger entry への直接書き込み経路はありません。
  • SQLite 永続化では、ファイルベース DB で foreign keys と WAL mode を有効にしています。
  • read-side projection は現在、journal、general ledger、trial balance、posting work、closing checks、evidence trace、export history の query repository として提供しています。
  • export は freeemfyayoigeneric_journalgeneric_trial_balance を end-to-end でサポートしています。
  • export run はライフサイクル状態更新を永続化し、端末上で失敗した後でも ExportRunView から確認できます。

アプリケーション境界のルール

  • CLI command は repository を直接呼ばず、application service を呼びます。
  • application service は UnitOfWork を通じて top-level transaction を管理します。
  • read model が query-time SQL で作られていても、write-side aggregate と read-side projection は論理的に分離します。
  • SQLite は永続化インフラであり、domain model そのものではありません。