Fahrgestellnummer: expliziter "automatisch"-Schalter statt Nur-wenn-leer-Heuristik

- Neues Profilfeld fahrzeug.fin_automatisch (Standard: an).
- identitaet.py: bei "aus" läuft die Ableitung (samt Mehrfach-Sensor-Abgleich)
  gar nicht erst; bei "an" überschreibt der abgeleitete Wert auch einen
  vorher von Hand eingetragenen - der Schalter selbst entscheidet jetzt, statt
  aus einem leeren Feld zu raten.
- dienste.py: profil_schreiben löst die Ableitung jetzt auch aus, damit das
  Umschalten des Schalters selbst sofort wirkt.
- Panel: Schalter "automatisch" zwischen Label und Textfeld in der
  Fahrgestellnummer-Zeile, Feld wird bei "an" deaktiviert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-28 12:01:10 +02:00
parent c0acc836f0
commit 6b35de458d
7 changed files with 94 additions and 17 deletions
@@ -134,6 +134,10 @@ function profilZuCar(p, status) {
const reifenSatz = (k) => p.reifen.saetze[k] || {};
return {
fin: p.fahrzeug.fin,
// Default true (auch für Profile von vor dieser Funktion, die das Feld
// noch nicht kennen) - deckt sich mit identitaet.py's eigenem
// fahrzeug.get("fin_automatisch", True).
finAutomatisch: p.fahrzeug.fin_automatisch !== false,
details: p.fahrzeug.details,
erstzulassung: p.fahrzeug.erstzulassung,
hu: p.fahrzeug.hauptuntersuchung_faellig,
@@ -198,6 +202,7 @@ function configCarZuProfil(vorherigesProfil) {
p.fahrzeug.kennzeichen = CONFIG.kennzeichen;
p.fahrzeug.hauptuntersuchung_faellig = CAR.hu;
p.fahrzeug.fin = CAR.fin;
p.fahrzeug.fin_automatisch = CAR.finAutomatisch;
p.fahrzeug.erstzulassung = CAR.erstzulassung;
p.fahrzeug.ausfuehrung = CONFIG.ausfuehrung;
p.einstellungen.uebersichtsbild = CONFIG.startbild;
@@ -2520,7 +2525,14 @@ function vEinst() {
<div class="tile"><span class="label">Fahrzeug einrichten</span>
${einrichtenOffen ? `
<div class="feld" style="margin-top:16px"><label for="einFin">Fahrgestellnummer (FIN)</label>
<input id="einFin" value="${esc(CAR.fin || "")}" data-einrichten="fin"></div>
<span style="display:flex;align-items:center;gap:10px;min-width:0">
<span style="display:flex;align-items:center;gap:6px;flex:0 0 auto">
<span class="label" style="margin:0;text-transform:none;letter-spacing:0;font-size:12.5px;color:var(--fg2)">automatisch</span>
<label class="switch"><input type="checkbox" data-fin-automatisch ${CAR.finAutomatisch ? "checked" : ""}><span class="track"></span></label>
</span>
<input id="einFin" value="${esc(CAR.fin || "")}" data-einrichten="fin" ${CAR.finAutomatisch ? "disabled" : ""}
title="${CAR.finAutomatisch ? "Wird automatisch aus den im Setup zugeordneten Sensoren ermittelt - \"automatisch\" ausschalten, um von Hand einzutragen." : ""}">
</span></div>
<div class="feld"><label for="einModell">Modell</label>
<select id="einModell" data-einrichten="modell">
${(FAHRZEUG_MODELLE.includes(CONFIG.fahrzeugtitel) ? FAHRZEUG_MODELLE : [CONFIG.fahrzeugtitel, ...FAHRZEUG_MODELLE])
@@ -5372,6 +5384,7 @@ function ereignisseVerdrahten() {
if (e.target.dataset.steuerzeit !== undefined) { CAR.steuer.zeitraum = e.target.value; profilSpeichern(); render(); return; }
if (e.target.dataset.steuerfaellig !== undefined) { CAR.steuer.faellig = e.target.value; profilSpeichern(); render(); return; }
if (e.target.dataset.steuerlast !== undefined) { CAR.steuer.lastschrift = e.target.checked; profilSpeichern(); render(); return; }
if (e.target.dataset.finAutomatisch !== undefined) { CAR.finAutomatisch = e.target.checked; profilSpeichern(); render(); return; }
const vteil = e.target.dataset.vteil;
if (vteil) {
const [i, feld] = vteil.split("|");
@@ -702,6 +702,10 @@ button.leaf:active { background: var(--tile-2); }
appearance: none;
}
.feld input:focus, .feld select:focus, .notiz:focus { outline: none; border-color: var(--red); }
/* z. B. Fahrgestellnummer bei aktivem "automatisch"-Schalter: der Wert kommt
aus den zugeordneten Sensoren, Handeingabe ist erst nach dem Ausschalten
wieder möglich - das Feld soll das auf den ersten Blick zeigen. */
.feld input:disabled { opacity: .5; cursor: not-allowed; }
/* Label und Eingabe untereinander statt nebeneinander, die Eingabe über die
volle Zeilenbreite - für Felder, deren Wert typischerweise länger ist als
ein Kurztext (Kommentar bei Sommer-/Winterrädern, live wie archiviert).