45 lines
2.4 KiB
Markdown
45 lines
2.4 KiB
Markdown
|
|
# 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.
|