ProofedMesh/services/per-diem-calculator/README.md

45 lines
2.4 KiB
Markdown
Raw Permalink Normal View History

# 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](../../docs/architecture/v1.1.md#user-content-62-deterministische-regelwerke-am-beispiel-spesensätze-verpflegungsmehraufwand)).
## 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.plan` v1.0.0 — start_date, end_date, legs[]{country, from_date, to_date} — zu definieren als `schemas/travel/plan/v1.0.0.json` beim ersten tatsächlichen Lauf.
- **Rates-Lookup:** `ds:per-diem-rates` /rates mit `{country, valid_on}` je Reisetag (per Session-Scope-Token). Rückgabe-Schema `ds.per_diem.rate` v1.0.0.
- **Output:** `expense.canonical` v1.2.0 `expense_items[]` mit `type ∈ {PER_DIEM_ARRIVAL, PER_DIEM_DEPARTURE, PER_DIEM_FULL, PER_DIEM_PARTIAL}` und `computed_from` je Zeile.
- **Attestation:** DSSE-signiert durch Signing Service, Operation `expense.compute_per_diem`, Policy `proofedmesh.transformations.per_diem` muss `allow` zurü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)
```bash
go test ./...
go run ./cmd/calculator -help
```
Noch nicht lauffähig — Dependencies sind leer und `main` ist Stub.