Phase 7c: restliche Screens - alle 21 Seiten stehen
Fahrzeugdaten, Batterieverlauf, Service mit Werkstatt und Servicebuch, Reifen, die ganze Versicherungs- und Steuergruppe, Einstellungen in voller Tiefe und die Live-Ansicht. Portiert dazu: die eigene Oelwechsel-Prognose (rechnet ab dem letzten Wechsel im Servicebuch neu, weil der Langzeitschnitt dafuer zu traege ist), Kalenderdateien fuer Termine und die CSV-Ausgabe im deutschen Format. Die Live-Ansicht ist gebaut, aber ueber einen Schalter abgeschaltet: die Werte dafuer liefert erst der FMM003. Ein Menuepunkt mit lauter Nullen waere schlechter als keiner. Zwei Stellen, an denen die App bewusst zurueckhaltend ist: ein unbekannter Pruefpunkt erscheint als hohler Ring statt als geratenes Gruen, und der Reifen-Kilometerstand wird nie zurueckgeschrieben, weil ihn der Server fortschreibt. 49 Tests, darunter ein Rendertest ueber alle 21 Seiten in beiden Layouts mit Beispieldaten in der Form, die das Backend wirklich liefert.
This commit is contained in:
@@ -0,0 +1,213 @@
|
||||
/**
|
||||
* 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 },
|
||||
{ label: "Tür vorne rechts", ok: true },
|
||||
{ label: "Fenster vorne links", ok: false },
|
||||
{ label: "Motorhaube", ok: null },
|
||||
],
|
||||
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,
|
||||
wlan_name: "Audi_MMI",
|
||||
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: "[email protected]" },
|
||||
buch: [
|
||||
{ datum: "2026-02-10", km: 40000, art: "Ölwechsel", betrieb: "Audi Zentrum" },
|
||||
{ datum: "2025-03-05", km: 25000, art: "Inspektion", betrieb: "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: "pyscript.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
|
||||
}
|
||||
Reference in New Issue
Block a user