2.4 KiB
per-diem-calculator
Deterministic per-diem (Verpflegungsmehraufwand) calculator for ProofedMesh.
Deliberately not an LLM. Pauschalen gehören nicht in Prompts — Reproduzierbarkeit, Nachvollziehbarkeit, Angriffsfläche (siehe docs/architecture/v1.1.md §6.2).
Scope (skeleton)
This directory currently holds the service skeleton — package layout, data types, and a calculation unit with BMF-style fixtures. The HTTP wire layer, Pocket-ID client, Session-Scope-Token acquisition, Receipt-Adapter integration, Signing-Service call, and Trillian attestation submission are stubs or absent. They will be added incrementally in the Phase-2 spike.
Layout
services/per-diem-calculator/
├── README.md
├── go.mod
├── cmd/calculator/main.go — HTTP entrypoint stub
└── internal/
├── calc/
│ ├── calc.go — deterministic calculation core
│ └── calc_test.go — table-driven tests with BMF fixtures
└── rates/
└── rates.go — DataSource client stub (ds:per-diem-rates)
Verträge
- Input:
travel.planv1.0.0 — start_date, end_date, legs[]{country, from_date, to_date} — zu definieren alsschemas/travel/plan/v1.0.0.jsonbeim ersten tatsächlichen Lauf. - Rates-Lookup:
ds:per-diem-rates/rates mit{country, valid_on}je Reisetag (per Session-Scope-Token). Rückgabe-Schemads.per_diem.ratev1.0.0. - Output:
expense.canonicalv1.2.0expense_items[]mittype ∈ {PER_DIEM_ARRIVAL, PER_DIEM_DEPARTURE, PER_DIEM_FULL, PER_DIEM_PARTIAL}undcomputed_fromje Zeile. - Attestation: DSSE-signiert durch Signing Service, Operation
expense.compute_per_diem, Policyproofedmesh.transformations.per_diemmussallowzurückgeben.
Rundungskonvention
Monetäre Werte als Dezimal-Strings. Beträge aus Rates werden 1:1 übernommen (keine Teilrundung — die BMF-Pauschalen sind Vollsätze). Summenbildung über alle Items passiert erst beim Mapping auf die Senke (siehe agent-sink-mapping).
Lokal bauen (sobald Code vollständig)
go test ./...
go run ./cmd/calculator -help
Noch nicht lauffähig — Dependencies sind leer und main ist Stub.