Tankstellen-Nadel, doppeltes Tanken-Symbol, Tankstellenname, packageClassList

Fuenf Meldungen des Eigentuemers, vier davon behoben:

1. Tankstellen-Nadel war bei 32 px ein dunkler Fleck (poi zeichnet nur
   einen Ring). Gefuellter Punkt in currentColor zwischen Silhouette und
   Symbol - die Geometrie stand im Pfad. Rot wurde ausdruecklich
   abgelehnt, die Umsetzung aendert keine Farbe.

2. Tanken-Symbol im Standort-Blatt wurde gefuellt UND umrandet, weil das
   CI-Symbol zusaetzlich stroke-Attribute mitbekam. Jetzt ueber ciSVG
   wie das Parkplatz-Symbol daneben; in der App dafuer imRaster an
   SymbolTanken (der 0,84-Faktor gilt nur in der Reiterleiste).

3. Tankstellenname: der Bestand hat zwei Bauformen - aeltere Belege
   tragen den Betreiber in station_name und die Anschrift daneben.
   Neu tankstelleTeile() liest beide Felder, entfernt Firmierungen,
   kuerzt Strassen und trennt die Hausnummer auch ohne Leerzeichen.
   Uebersicht: Marke, Strasse, Ort. Einzelbeleg: zwei Zeilen.
   adresseTeilen() hat keinen Aufrufer mehr und ist entfernt.

4. Zwischenablage und Kalendereintrag hatten denselben Grund: Capacitor 8
   registriert nur, was in packageClassList steht, und cap sync traegt
   dort ausschliesslich npm-Pakete ein. Beide app-eigenen Plugins lagen
   im Programm und wurden nie registriert. ios-teilen-einrichten.mjs
   traegt sie jetzt nach, ios-signieren.sh bricht ab, wenn sie im
   fertigen .ipa fehlen.

5. Geteilter Beleg nur mit Datum und Uhrzeit bleibt offen - der Weg
   nutzt denselben belegLesen()-Pfad wie eine gewaehlte Datei, es fehlt
   der konkrete Beleg oder die Protokollzeile.

tsc sauber, 246 Tests, vite build sauber, Panel als Modul geparst,
audi_ha_test auf 2026.9.4.20 ohne Traceback. Panel und App liefern fuer
die Tankstelle byteweise dasselbe.
This commit is contained in:
2026-09-04 16:34:46 +02:00
parent cefb235f6d
commit a99ae432fc
14 changed files with 543 additions and 78 deletions
+152
View File
@@ -10574,3 +10574,155 @@ laeuft ja auf `.17` und bekommt `.19` erst, wenn die Instanz sie ausliefert. Der
Weg bleibt: **erst die Integration auf der realen Instanz aktualisieren**
(Einstellungen -> Version -> pruefen, installieren, neu starten), danach bietet
die App den Schritt `.17` -> `.19` an, und der geht vorwaerts.
## CM. Fuenf Meldungen: die Nadel, zwei Symbole, der Tankstellenname - und der Grund, aus dem zwei eigene Plugins nie liefen (2026.9.4.20)
### 1. Die Tankstellen-Nadel war ein schwarzer Fleck
Gerendert und angesehen statt beurteilt: die Silhouette ist `#182634`, und das
`poi`-Symbol darueber zeichnet nur einen duennen **Ring**. Bei echter
Kartengroesse (32 px) verschwindet der Ring, uebrig bleibt eine dunkle Flaeche -
waehrend die Fahrzeug-Nadel daneben durch das gefuellte Auto-Piktogramm sofort
liest.
Vier Varianten nebeneinander gestellt (dunkel / Audi-Rot / weiss mit Kontur /
weiss mit dunklem Punkt), jeweils gross und bei 32 px. **Rot vom Eigentuemer
ausdruecklich abgelehnt** - am Code war zu dem Zeitpunkt nichts geaendert.
Umgesetzt ist die Variante, die **keine Farbe anfasst**: ein gefuellter Punkt in
`currentColor` zwischen Silhouette und Symbol. Seine Geometrie steht im Pfad
ohnehin (`poi-s`: 11.5/8.5 r3.5, `poi-l`: 23.5/17.5 r7.5) - erfunden ist daran
nichts. Beide Codebasen.
### 2. Das Tanken-Symbol im Standort-Blatt wurde doppelt gezeichnet
Gemeldet als "dicker und dunkler als das Parkplatz-Icon". Der Grund steht im
Markup: `ICONS.fuel` **ist** laengst das gefuellte CI-Symbol `fuel-station-s`,
bekam an dieser einen Stelle aber zusaetzlich
`stroke="currentColor" stroke-width="1.5"` mit - die Flaeche wurde also gefuellt
UND umrandet. Exakt die Falle, die am 02.09.2026 schon `.profilbtn svg` mit dem
Zahnrad hatte.
Jetzt derselbe Weg wie fuer `CI.parking` daneben (`ciSVG(...)`, ohne
Strichattribute). Dazu die Groesse: gemessen fuellt `parking` das Raster mit
23x23, `fuel-station-s` roh 19x22, mit dem 0,84-Faktor der Reiterleiste nur noch
16,0x18,5. Neben dem randfuellenden Parkplatz-Symbol passt die **ungeskalierte**
Fassung. In der App bekam `SymbolTanken` dafuer ein `imRaster` - der 0,84-Faktor
ist die Kalibrierung fuer die Reiterleiste und gilt nur dort.
### 3. Tankstellenname: der Bestand hat zwei Bauformen
Gemeldet: im Beleg vom 10.11.2025 steht in der Uebersicht noch die Firmierung
("...GmbH"). An den echten Datensaetzen nachgesehen - und die Ursache ist die
Datenlage, nicht die Anzeige:
| | `station_name` | `station_address` |
|---|---|---|
| bis 2025 | `TC Sengül GmbH` (der **Betreiber**) | `Nürnberger Str.74, 91522 Ansbach` |
| ab 08.2026 | `Shell, Pascalstr. 8, Ingolstadt` | `None` |
Die Markenerkennung lief nur ueber `station_name`. Bei den aelteren Belegen
steht die Marke dort gar nicht - also blieb die Firmierung stehen, waehrend die
Anschrift daneben ungenutzt blieb.
Neu `tankstelleTeile()` (beide Codebasen, wortgleich): liest **beide** Felder,
zerlegt in Marke / Strasse / Hausnummer / Postleitzahl / Ort. Firmierungen
(GmbH, mbH, OHG, KG, AG, e. K., Inh., & Co) fallen heraus, Strassen werden
gekuerzt (`Nürnberger Straße` wird `Nürnberger Str.`), und die Hausnummer wird
auch ohne Leerzeichen davor abgetrennt - so drucken die Kassen es (`Str.74`).
Daraus die beiden vom Eigentuemer verlangten Formen:
| Beleg | Uebersicht | Einzelbeleg |
|---|---|---|
| `TC Sengül GmbH` + Anschrift | `Nürnberger Str., Ansbach` | `Nürnberger Str. 74` / `91522 Ansbach` |
| `Shell, Pascalstr. 8, Ingolstadt` | `Shell, Pascalstr., Ingolstadt` | `Shell, Pascalstr. 8` / `Ingolstadt` |
| `Shell, SÖLDEN` | `Shell, SÖLDEN` | `Shell` / `SÖLDEN` |
Geschrieben wie eine Anschrift: das Komma trennt nur die Marke ab, zwischen
Strasse und Nummer und zwischen Postleitzahl und Ort steht keins.
**Ein Rueckfall bleibt bewusst:** ergibt die Zerlegung gar nichts - nur eine
Firmierung, keine Anschrift -, steht weiter der rohe Name da. Ihn dann
wegzulassen hiesse, eine bekannte Tankstelle "unbekannt" zu nennen.
`adresseTeilen()` hat damit keinen Aufrufer mehr und ist in beiden Codebasen
entfernt (samt seiner Tests).
### 4. Zwei eigene Plugins waren im Programm - und trotzdem tot
Gemeldet: die Zwischenablage meldet "die App muss erst aktualisiert werden",
obwohl frisch installiert. Und, kurz darauf: der Kalendereintrag erzeugt weiter
nur eine ics-Datei.
**Beides derselbe Grund**, gefunden durch Lesen der Capacitor-Quellen statt
durch Vermuten. `CapacitorBridge.swift`, `registerPlugins()` liest
`packageClassList` aus der `capacitor.config.json` des Buendels und loest jeden
Eintrag ueber `NSClassFromString` auf.
**Capacitor 8 sucht Plugin-Klassen NICHT im Programm.** Registriert wird
ausschliesslich, was in dieser Liste steht. Und die erzeugt `cap sync` aus den
installierten **npm-Paketen** - app-eigene Plugins sind keine. In der
ausgelieferten `.ipa` nachgesehen, dort stehen genau sechs Fremd-Plugins:
SecureStorage, AppPlugin, FilesystemPlugin, PreferencesPlugin, SharePlugin,
CapacitorUpdaterPlugin.
`BelegZwischenablagePlugin` und `KalenderTerminPlugin` fehlen - beide liegen
nachweislich im Programm (5 Treffer im Binaerprogramm), werden aber nie
registriert. Folgen, beide gemeldet:
* `Capacitor.isPluginAvailable("BelegZwischenablage")` ist `false` - daher die
Meldung ueber die angeblich noetige Aktualisierung.
* `KalenderTermin` scheitert mit `UNIMPLEMENTED`, der Rueckfall auf Datei plus
Teilen-Blatt greift, und der kann den Kalender **prinzipiell nie erreichen**
(Abschnitt BS). Daher "nur eine ics-Datei, kein Eintrag".
`scripts/ios-teilen-einrichten.mjs` traegt die Klassen jetzt nach jedem
`cap sync` in `ios/App/App/capacitor.config.json` nach. Die Namen liest es aus
den Swift-Dateien selbst (der objc-Name), damit sie nicht an zwei Stellen
gepflegt werden; der Schritt ist idempotent (zweiter Lauf ergaenzt 0 Eintraege,
geprueft).
Dazu ein **Waechter am fertigen `.ipa`**: fehlt eine der Klassen in
`packageClassList`, bricht `ios-signieren.sh` ab. Gegen die ausgelieferte
Fassung geprueft - er schlaegt dort korrekt an. Dieselbe Linie wie bei der
`CFBundleVersion` (Abschnitt CD).
Die Fehlermeldung in `zwischenablage.ts` nannte eine **geratene Ursache** ("kommt
nur mit einer neu installierten App") - die war nachweislich falsch, der
Eigentuemer hatte frisch installiert. Sie nennt jetzt nur noch die Tatsache.
**Merkposten, zum zweiten Mal nach dem Preferences-Plugin (Abschnitt BR):** bei
einem Plugin, das eine Systemgrenze ueberbrueckt, den Quelltext der Bruecke
lesen, nicht die Dokumentation.
### 5. Geteilter Beleg: nur Datum und Uhrzeit - noch offen
Der Weg selbst ist geprueft und in Ordnung: ein ueber das Teilen-Blatt
hereingereichter Beleg laeuft durch **exakt denselben** `belegLesen()`-Pfad wie
eine von Hand gewaehlte Datei (`Tanken.tsx`), inklusive Dateiname aus dem Pfad.
Es gibt dort keinen zweiten, aermeren Zweig.
Damit bleibt die Auswertung selbst, und die haengt am konkreten PDF - das hier
nicht vorliegt. **Nicht geraten**: um es zu entscheiden, braucht es den Beleg
(unter `tests/belegparser/belege/`, das ist gitignored) oder die Protokollzeile
der Instanz zu diesem Hochladen.
### Verifiziert
`tsc --noEmit` sauber, **246 Tests** (von 244; 6 neue fuer die Zerlegung an den
echten Belegen, eine Erwartung bewusst geaendert), `vite build` sauber, Panel als
**Modul** geparst, `node --check` und `bash -n` auf beiden Skripten,
`audi_ha_test` auf `2026.9.4.20` sauber gestartet, kein Traceback.
**Panel und App liefern fuer die Tankstelle byteweise dasselbe** - die
Panel-Funktionen dafuer aus dem Buendel geschnitten und in Node gegen dieselben
sieben Faelle laufen lassen, nicht nachgebaut.
**Live in der App**: in der Tankliste steht nirgends mehr "GmbH", der gemeldete
Beleg liest sich `Nürnberger Str., Ansbach`, und der Einzelbeleg zeigt
`Nürnberger Str. 74` / `91522 Ansbach`.
**Nicht geprueft, weil es ohne Mac nicht geht:** dass die Registrierung auf dem
Geraet greift. Das zeigt erst der naechste Xcode-Lauf - und der bricht jetzt ab,
wenn sie fehlt.