b1cd03be51
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>
215 lines
6.3 KiB
TypeScript
215 lines
6.3 KiB
TypeScript
/**
|
|
* Beispieldaten für Rendertests. Aufgebaut wie das, was das Backend
|
|
* tatsächlich liefert (an der laufenden Testinstanz abgelesen), nicht wie es
|
|
* laut Spezifikation aussehen sollte.
|
|
*/
|
|
|
|
import type { DataMetricApi, Fahrt, Fahrzeugstatus, Profil, Tankvorgang } from "../api"
|
|
|
|
export const beispielStatus: Fahrzeugstatus = {
|
|
km: 48250,
|
|
tankprozent: 62,
|
|
reichweite_km: 385,
|
|
batteriespannung: null,
|
|
gesichert: true,
|
|
sicherheitscheck: [
|
|
{ label: "Tür vorne links", ok: true, gruppe: "tueren_klappen" },
|
|
{ label: "Tür vorne rechts", ok: true, gruppe: "tueren_klappen" },
|
|
{ label: "Motorhaube", ok: null, gruppe: "tueren_klappen" },
|
|
{ label: "Fenster vorne links", ok: false, gruppe: "fenster_dach" },
|
|
{ label: "Türschloss vorne links", ok: true, gruppe: "verriegelt" },
|
|
{ label: "Standlicht", ok: true, gruppe: "licht" },
|
|
],
|
|
oelwechsel_faellig_ts: "2027-03-14T00:00:00+00:00",
|
|
oelwechsel_faellig_km: 11750,
|
|
inspektion_faellig_ts: "2027-03-14T00:00:00+00:00",
|
|
inspektion_faellig_km: 11750,
|
|
}
|
|
|
|
export const beispielProfil: Profil = {
|
|
fahrzeug: {
|
|
fin: "WUAZZZF48PA902804",
|
|
titel: "RS 4 Avant",
|
|
zusatz: "competition",
|
|
untertitel: "quattro · 331 kW",
|
|
details: "2.9 TFSI quattro competition",
|
|
kennzeichen: "M AB 1234",
|
|
erstzulassung: "2023-04-01",
|
|
hauptuntersuchung_faellig: "2027-04-01",
|
|
tankvolumen_liter: 58,
|
|
ausfuehrung: "competition",
|
|
},
|
|
einstellungen: {
|
|
nacht_von: "22:00",
|
|
nacht_bis: "06:00",
|
|
fahrten_pausenzeit_min: 15,
|
|
uebersichtsbild: "seitenansicht.webp",
|
|
kraftstoffanbieter: "Shell",
|
|
smartdeal: { aktiv: true, laeuft_ab: null },
|
|
oelwechsel_intervall: {
|
|
modus: "hersteller",
|
|
km: 15000,
|
|
monate: 12,
|
|
hersteller_km: 30000,
|
|
hersteller_monate: 24,
|
|
},
|
|
backup_intervall: "taeglich",
|
|
letztes_backup: "2026-08-10T04:00:00",
|
|
},
|
|
versicherung: {
|
|
gesellschaft: "Beispiel Versicherung",
|
|
vertrag: "Vollkasko",
|
|
nummer: "V-123456",
|
|
service: "0800 111111",
|
|
notfall: "0800 222222",
|
|
beitrag: 840,
|
|
zahlweise: "jährlich",
|
|
gueltigAb: "2026-01-01",
|
|
teile: [
|
|
{ bez: "Haftpflicht", betrag: 320 },
|
|
{ bez: "Vollkasko", betrag: 520 },
|
|
],
|
|
selbst: [["Vollkasko", "500 €"]],
|
|
leistungen: [{ bez: "Werkstattbindung", wert: "nein" }],
|
|
schutzbrief: {
|
|
stand: "2026-01",
|
|
gilt: "Europa",
|
|
versichert: "Fahrzeug und Insassen",
|
|
ausloeser: ["Panne", "Unfall"],
|
|
entweder: [],
|
|
gruppen: ["Abschleppen"],
|
|
nicht: [],
|
|
pflichten: ["Unverzüglich melden"],
|
|
},
|
|
},
|
|
steuer: {
|
|
betrag: 320,
|
|
zeitraum: "jährlich",
|
|
faellig: "2027-04-01",
|
|
grundlage: "Hubraum und CO₂-Ausstoß",
|
|
lastschrift: true,
|
|
finanzamt: "München",
|
|
},
|
|
reifen: {
|
|
aktiv: "sommer",
|
|
anzugsmoment_nm: 140,
|
|
wechsel: { datum: "2026-10-15", vereinbart: false },
|
|
referenz_odo_km: 48250,
|
|
saetze: {
|
|
sommer: { km: 12000, mass: "275/30 R20", marke: "Michelin", druck_vorne: "2,5", druck_hinten: "2,4" },
|
|
winter: { km: 8000, mass: "265/35 R19", marke: "Continental", druck_vorne: "2,6", druck_hinten: "2,5" },
|
|
},
|
|
},
|
|
service: {
|
|
vereinbart: {},
|
|
autohaus: { name: "Audi Zentrum", adresse: "Musterweg 1", tel: "089 1234", mail: "a@b.de" },
|
|
buch: [
|
|
{ datum: "2026-02-10", km: 40000, art: "Ölwechsel", werkstatt: "Audi Zentrum" },
|
|
{ datum: "2025-03-05", km: 25000, art: "Inspektion", werkstatt: "Audi Zentrum" },
|
|
],
|
|
},
|
|
technik: [
|
|
{ gruppe: "Motor", posten: [["Bauart", "V6 Biturbo"], ["Leistung", "331 kW"]] },
|
|
],
|
|
ausstattung: [{ gruppe: "RS-Paket", sonder: ["RS competition"], serie: ["Klimaautomatik"] }],
|
|
}
|
|
|
|
export const beispielFahrten: Fahrt[] = [
|
|
{
|
|
trip_id: "t1",
|
|
ts_start: "2026-08-10T08:00:00+02:00",
|
|
ts_end: "2026-08-10T08:45:00+02:00",
|
|
duration_s: 2700,
|
|
distance_km: 42.5,
|
|
km_quelle: "odometer",
|
|
odo_start: 48200,
|
|
odo_end: 48242.5,
|
|
art: "arbeitsweg",
|
|
source: "ha",
|
|
status: "vollständig",
|
|
},
|
|
{
|
|
trip_id: "t2",
|
|
ts_start: "2026-08-09T23:10:00+02:00",
|
|
ts_end: "2026-08-09T23:40:00+02:00",
|
|
duration_s: 1800,
|
|
distance_km: 18.2,
|
|
km_quelle: "odometer",
|
|
odo_start: 48180,
|
|
odo_end: 48198.2,
|
|
art: "privat",
|
|
source: "manual",
|
|
status: "offen",
|
|
},
|
|
]
|
|
|
|
export const beispielTankvorgaenge: Tankvorgang[] = [
|
|
{
|
|
tank_id: "f1",
|
|
ts: "2026-08-08T17:20:00+02:00",
|
|
liters: 48.7,
|
|
fuel_total_eur: 89.12,
|
|
price_per_l: 1.83,
|
|
station_name: "Shell München Ost",
|
|
station_address: "Musterstraße 5",
|
|
product_name: "V-Power",
|
|
odometer_km: 48100,
|
|
distance_km: 520,
|
|
receipt_file: "beleg-2026-08-08.pdf",
|
|
receipt_no: "4711",
|
|
discount: 3.4,
|
|
source: "beleg",
|
|
status: "vollständig",
|
|
},
|
|
]
|
|
|
|
/** Datenschicht-Ersatz für Tests: liefert Beispieldaten, schreibt ins Leere. */
|
|
export function beispielApi(): DataMetricApi {
|
|
const horcher = { verbindung: [] as ((z: string) => void)[] }
|
|
return {
|
|
rest: {
|
|
zustandLesen: async () => ({
|
|
entity_id: "sensor.audi_dashboard_fahrzeugstatus",
|
|
state: "aktuell",
|
|
attributes: { daten: beispielStatus },
|
|
last_changed: "2026-08-11T09:00:00+00:00",
|
|
last_updated: "2026-08-11T09:00:00+00:00",
|
|
}),
|
|
datenLesen: async () => [],
|
|
dienstAufrufen: async () => null,
|
|
verbindungPruefen: async () => ({ message: "API running." }),
|
|
zugangSetzen: () => {},
|
|
},
|
|
live: {
|
|
aufVerbindung: (h: (z: string) => void) => {
|
|
horcher.verbindung.push(h)
|
|
h("verbunden")
|
|
return () => {}
|
|
},
|
|
aufZustand: () => () => {},
|
|
starten: async () => {},
|
|
beenden: () => {},
|
|
},
|
|
warteschlange: {
|
|
laden: async () => {},
|
|
aufAenderung: (h: (a: unknown[]) => void) => {
|
|
h([])
|
|
return () => {}
|
|
},
|
|
anzahl: 0,
|
|
},
|
|
profilLesen: async () => beispielProfil,
|
|
fahrtenLesen: async () => beispielFahrten,
|
|
tankvorgaengeLesen: async () => beispielTankvorgaenge,
|
|
fahrzeugstatusLesen: async () => beispielStatus,
|
|
profilSchreiben: async () => null,
|
|
belegHochladen: async () => null,
|
|
fahrtAnlegen: async () => null,
|
|
fahrtLoeschen: async () => null,
|
|
tankvorgangAnlegen: async () => null,
|
|
tankvorgangAktualisieren: async () => null,
|
|
tankvorgangLoeschen: async () => null,
|
|
jetztAktualisieren: async () => null,
|
|
} as unknown as DataMetricApi
|
|
}
|