Add Verpflegungsmehraufwand (VMA) as fixed facility condition field
Docker-Images bauen und veröffentlichen / build (, omsorgCore/Dockerfile, omsorgcore) (push) Successful in 17s
Docker-Images bauen und veröffentlichen / build (, omsorgWeb/Dockerfile, omsorgweb) (push) Successful in 6s
Docker-Images bauen und veröffentlichen / build (, omsorgapp/Dockerfile, omsorgapp) (push) Successful in 18s

Adds MealAllowanceRate as a flat, nullable EUR amount on Facility, following
the same pattern as the existing TravelCostRate/BillingRate fields — a fixed
per-facility rate, not the statutory day-based VMA tiers, per explicit
request.

Both generated API clients are regenerated/rebuilt as required after any
Contract/Controller change (see omsorgCore/CLAUDE.md, "Generierte API-
Clients"). The PHP client regen also picks up the DELETE /api/roles/{id}
endpoint added in a previous backend change but never synced to this client
until now.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Felix Kemmler
2026-08-10 20:45:40 +02:00
co-authored by Claude Sonnet 5
parent 99b5e07390
commit 019b4286fd
23 changed files with 1820 additions and 138 deletions
@@ -151,13 +151,13 @@ export default function FacilityDetailPanel({ facility, onUpdated }) {
</div>
<div>
<strong>Mindeststunden</strong>
<p>{facility.minimumHours ?? "—"}</p>
<strong>Verpflegungsmehraufwand</strong>
<p>{facility.mealAllowanceRate != null ? `${facility.mealAllowanceRate} EUR (Pauschale je Einsatz)` : "—"}</p>
</div>
<div>
<strong>Pausenregelung</strong>
<p>{facility.breakPolicy ?? "—"}</p>
<strong>Mindeststunden</strong>
<p>{facility.minimumHours ?? "—"}</p>
</div>
<div>
@@ -24,8 +24,8 @@ export const emptyFacilityForm = {
travelCostMode: "Pauschale",
travelCostRate: "",
travelCostPerKm: "",
mealAllowanceRate: "",
minimumHours: "",
breakPolicy: "",
billingInterval: "",
paymentTermDays: "",
individualAgreements: "",
@@ -53,8 +53,8 @@ export function facilityToFormValues(facility) {
travelCostMode: facility.travelCostMode ?? "Pauschale",
travelCostRate: facility.travelCostRate ?? "",
travelCostPerKm: facility.travelCostPerKm ?? "",
mealAllowanceRate: facility.mealAllowanceRate ?? "",
minimumHours: facility.minimumHours ?? "",
breakPolicy: facility.breakPolicy ?? "",
billingInterval: facility.billingInterval ?? "",
paymentTermDays: facility.paymentTermDays ?? "",
individualAgreements: facility.individualAgreements ?? "",
@@ -87,8 +87,8 @@ export function facilityFormToPayload(form, { includeCrmStatus = false, followUp
payload.travelCostMode = form.travelCostMode || "Pauschale";
payload.travelCostRate = form.travelCostRate === "" ? null : Number(form.travelCostRate);
payload.travelCostPerKm = form.travelCostPerKm === "" ? null : Number(form.travelCostPerKm);
payload.mealAllowanceRate = form.mealAllowanceRate === "" ? null : Number(form.mealAllowanceRate);
payload.minimumHours = form.minimumHours === "" ? null : Number(form.minimumHours);
payload.breakPolicy = form.breakPolicy.trim() || null;
payload.billingInterval = form.billingInterval || null;
payload.paymentTermDays = form.paymentTermDays === "" ? null : Number(form.paymentTermDays);
payload.individualAgreements = form.individualAgreements.trim() || null;
@@ -282,10 +282,12 @@ export default function FacilityForm({ form, onChange, includeCrmStatus = false,
)}
</div>
<label className="form-field">
<span>Pausenregelung</span>
<input value={form.breakPolicy} onChange={updateField("breakPolicy")} />
</label>
<div className="form-row">
<label className="form-field">
<span>Verpflegungsmehraufwand (EUR, Pauschale je Einsatz)</span>
<input type="number" min="0" step="0.01" value={form.mealAllowanceRate} onChange={updateField("mealAllowanceRate")} />
</label>
</div>
<div className="form-row">
<label className="form-field">