Wartungsplan-Schema companion-app<->Panel angeglichen; Setup-Feldkopf zeigt zugeordneten Sensor
companion-app nannte Servicebuch-Feldnamen betrieb/notiz, waehrend Panel und Backend (profil["service"]["buch"]) werkstatt/kosten/arbeiten verwenden - ohne Uebersetzung dazwischen zeigten in einer Oberflaeche angelegte Eintraege in der anderen leere Werkstatt-/Kosten-Werte. werkstatt/kosten/ arbeiten als kanonisch uebernommen (aeltere, bereits etablierte Panel- Konvention); ServicebuchEintrag, das Bearbeitungsformular (inkl. neuem Kosten-Feld) und die Ansicht in Service.tsx angepasst, den Workaround-Cast im CSV-Export (DatensatzPopup.tsx) sowie die Testfixture entsprechend bereinigt. Setup-Popup (Panel, Item 11 aus der letzten Sammel-Rueckmeldung): die statische Beschreibung unter jedem Feldnamen ist jetzt die Kennung und der aktuelle Wert des tatsaechlich zugeordneten Sensors. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -79,25 +79,16 @@ function exportieren(
|
||||
)
|
||||
return
|
||||
}
|
||||
// ACHTUNG: liest werkstatt/kosten, nicht ServicebuchEintrag.betrieb/notiz -
|
||||
// das ist absichtlich. Der tatsächlich gespeicherte Datensatz
|
||||
// (profil["service"]["buch"], vom Backend/Panel geschrieben) trägt
|
||||
// werkstatt/kosten/arbeiten; ServicebuchEintrag hier im Frontend nennt
|
||||
// sie betrieb/notiz und wird nirgends dazwischen übersetzt (Service.tsx
|
||||
// liest fahrzeug.service["buch"] ungemappt durch) - ein
|
||||
// Schema-Auseinanderlaufen zwischen den beiden Oberflächen, das beim Bau
|
||||
// dieses CSV-Exports auffiel, aber ein eigenes Thema ist (siehe AGENTS.md).
|
||||
// Der Export muss die echten Feldnamen lesen, sonst zeigt jede exportierte
|
||||
// Zeile eine leere Werkstatt/Kosten-Spalte.
|
||||
csvHerunterladen(
|
||||
"wartungsplan",
|
||||
["Datum", "km", "Art", "Werkstatt", "Kosten €"],
|
||||
wartungsplan.map((e) => {
|
||||
const roh = e as Record<string, unknown>
|
||||
const werkstatt = typeof roh.werkstatt === "string" ? roh.werkstatt : ""
|
||||
const kosten = typeof roh.kosten === "number" ? roh.kosten : null
|
||||
return [e.datum ?? "", e.km != null ? de(e.km) : "", e.art ?? "", werkstatt, kosten != null ? eur(kosten) : ""]
|
||||
}),
|
||||
wartungsplan.map((e) => [
|
||||
e.datum ?? "",
|
||||
e.km != null ? de(e.km) : "",
|
||||
e.art ?? "",
|
||||
e.werkstatt ?? "",
|
||||
e.kosten != null ? eur(e.kosten) : "",
|
||||
]),
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ import {
|
||||
oelMeldungsPrognose,
|
||||
oelwechselPrognose,
|
||||
} from "../daten/service"
|
||||
import { datum, de, isoTag } from "../format"
|
||||
import { datum, de, eur, isoTag } from "../format"
|
||||
import type { SeitenName } from "../navigation"
|
||||
import { SymbolInspektion, SymbolOelwechsel } from "../symbole"
|
||||
import { Leerzustand, NaviKachel, Wertzeile, Werteliste, bestaetigen } from "./bausteine"
|
||||
@@ -32,8 +32,9 @@ export interface ServicebuchEintrag {
|
||||
datum?: string
|
||||
km?: number
|
||||
art?: string
|
||||
betrieb?: string
|
||||
notiz?: string
|
||||
werkstatt?: string
|
||||
kosten?: number | null
|
||||
arbeiten?: string
|
||||
[weitere: string]: unknown
|
||||
}
|
||||
|
||||
@@ -373,18 +374,31 @@ export function Servicebuch() {
|
||||
onChange={(e) => setzeEntwurf((alt) => ({ ...alt, km: Number(e.target.value) }))}
|
||||
/>
|
||||
</Feld>
|
||||
<Feld label="Betrieb">
|
||||
<Feld label="Werkstatt">
|
||||
<input
|
||||
className="dm-eingabe"
|
||||
value={entwurf.betrieb ?? ""}
|
||||
onChange={(e) => setzeEntwurf((alt) => ({ ...alt, betrieb: e.target.value }))}
|
||||
value={entwurf.werkstatt ?? ""}
|
||||
onChange={(e) => setzeEntwurf((alt) => ({ ...alt, werkstatt: e.target.value }))}
|
||||
/>
|
||||
</Feld>
|
||||
<Feld label="Notiz" last>
|
||||
<Feld label="Kosten" unit="€">
|
||||
<input
|
||||
className="dm-eingabe"
|
||||
value={entwurf.notiz ?? ""}
|
||||
onChange={(e) => setzeEntwurf((alt) => ({ ...alt, notiz: e.target.value }))}
|
||||
inputMode="decimal"
|
||||
value={entwurf.kosten ?? ""}
|
||||
onChange={(e) =>
|
||||
setzeEntwurf((alt) => ({
|
||||
...alt,
|
||||
kosten: e.target.value === "" ? null : Number(e.target.value),
|
||||
}))
|
||||
}
|
||||
/>
|
||||
</Feld>
|
||||
<Feld label="Durchgeführte Arbeiten" last>
|
||||
<input
|
||||
className="dm-eingabe"
|
||||
value={entwurf.arbeiten ?? ""}
|
||||
onChange={(e) => setzeEntwurf((alt) => ({ ...alt, arbeiten: e.target.value }))}
|
||||
/>
|
||||
</Feld>
|
||||
<div style={{ marginTop: 14 }}>
|
||||
@@ -428,8 +442,9 @@ export function Servicebuch() {
|
||||
label="Kilometerstand"
|
||||
wert={eintrag.km != null ? `${de(eintrag.km)} km` : "—"}
|
||||
/>
|
||||
<Wertzeile label="Betrieb" wert={eintrag.betrieb || "—"} />
|
||||
{eintrag.notiz && <Wertzeile label="Notiz" wert={eintrag.notiz} />}
|
||||
<Wertzeile label="Werkstatt" wert={eintrag.werkstatt || "—"} />
|
||||
<Wertzeile label="Kosten" wert={eintrag.kosten != null ? eur(eintrag.kosten) : "noch offen"} />
|
||||
{eintrag.arbeiten && <Wertzeile label="Durchgeführte Arbeiten" wert={eintrag.arbeiten} />}
|
||||
</>
|
||||
}
|
||||
/>
|
||||
|
||||
@@ -104,8 +104,8 @@ export const beispielProfil: Profil = {
|
||||
vereinbart: {},
|
||||
autohaus: { name: "Audi Zentrum", adresse: "Musterweg 1", tel: "089 1234", mail: "a@b.de" },
|
||||
buch: [
|
||||
{ datum: "2026-02-10", km: 40000, art: "Ölwechsel", betrieb: "Audi Zentrum" },
|
||||
{ datum: "2025-03-05", km: 25000, art: "Inspektion", betrieb: "Audi Zentrum" },
|
||||
{ datum: "2026-02-10", km: 40000, art: "Ölwechsel", werkstatt: "Audi Zentrum" },
|
||||
{ datum: "2025-03-05", km: 25000, art: "Inspektion", werkstatt: "Audi Zentrum" },
|
||||
],
|
||||
},
|
||||
technik: [
|
||||
|
||||
Reference in New Issue
Block a user