# Angebots-Grundlage LBM Brennpunkt-Manager

Interne Synthese der Vorarbeit als Basis für unser Angebot an den LSVV. Fasst
zusammen, was tatsächlich vorhanden ist, was wir bereits geleistet haben, was
echter Neu-Aufwand wäre, welche Voraussetzungen/Risiken bestehen und welche
Fragen an den Kunden offen sind. Belege stehen in den verlinkten Dokumenten und
im CHANGELOG.

> Stand: laufende Vorarbeit vor dem Angebot. Vertraulich (Aufwands-/Preis-Einschätzung).

---

## 1. Ausgangslage

- Der ursprüngliche Programmierer (Klemens Forster, „KF") hat das Projekt
  verlassen. Wir haben übernommen und modernisieren den bestehenden Custom-Code
  Schritt für Schritt (Strategie: `docs/code-strategie.md`).
- **Unser Arbeitsstand ist KFs Dev-Version.** Alle Features, die KF in seiner Mail
  vom 02.04.2026 beschreibt (Termine, Mitarbeitende, „zuletzt bearbeitet",
  Favoriten, Startseiten-Redesign), stecken bereits im Code — sie waren laut KF
  „nur auf dev" und nie live. Details:
  [`altprogrammierer-angebot.md`](altprogrammierer-angebot.md),
  [`altprogrammierer-konzept.md`](altprogrammierer-konzept.md).
- **Produktion läuft PHP 7.2.34** (phpinfo-Beleg; die cPanel-Anzeige „8.1" war
  irreführend). Unser Code zielt auf **PHP 8.4**. Prod bleibt unangetastet, bis
  die Arbeit fertig ist und der Kunde zustimmt.
- **KFs aktueller Dev-Stand** (`dev.lsvv.ch`) ist **hinter** unserem: rohes
  `mysqli`, Secrets im Repo, CDN-Frontend, alter Token-Bypass, aktuell sogar
  defekt (478 Fatals). **Nichts daraus zu übernehmen** ausser realen
  Konfigurationswerten (s. §7). Auch das **DB-Schema ist identisch** mit unserem
  (Struktur-Dump verglichen: nur wir haben eine Spalte mehr, er keine, die uns
  fehlt).

---

## 2. Offerte-Positionen ↔ Code-Realität

Aus KFs Offerte („Offerte Erweiterung LBM", Zwischensumme CHF 4'130). Status
gegen den tatsächlichen Code geprüft.

| Pos | Titel | Preis | Status im Code |
|-----|-------|-------|----------------|
| 1 | PHP-Upgrade | 0.00 | **Irreführend** — Live ist 7.2, nicht umgestellt. Unser Code zielt auf 8.4. |
| 2 | Sicherheitslücke Dokumente | 400.00 | **Umgesetzt** (Login-Gate über `uploads/download.php`), von uns zusätzlich **gehärtet** (dokumentgebundener Token). |
| 3 | Dokumentvorschau | 500.00 | **Umgesetzt** (PDF/Bild/Office). *Aber:* Office-Vorschau über Microsoft-Dienst — Datenschutz offen (§6). |
| 4 | Export Journal | 160.00 | **Umgesetzt** (Copy, nach Tag gruppiert). |
| 5a | Erweiterte Suche „von-bis" | 120.00 | **Umgesetzt**. |
| 5b | Projektliste „zuletzt bearbeitet" | 120.00 | **Umgesetzt**. |
| 6 | Projekt-Mitarbeitende | 450.00 | **Umgesetzt**, aber rein persistent/visuell (treibt keine Logik). |
| 7 | Termine | 1400.00 | **Umgesetzt** inkl. Erinnerungsmail (Cron). |
| 8 | „Abschliessen"-Button | — | **Nicht umgesetzt** (von KF abgelehnt: Status dynamisch). |
| 9 | Projektstatus-Journal | 80.00 | **Fehlt**. Kleiner Eingriff in `projektUpdate.php`. |
| 10 | Passwort vergessen | 600.00 | **Fehlt** (kompletter Flow). |
| 11 | Koordinaten + Swisstopo/LV95 | 200.00 | **Fehlt** — inkl. **Schema-Erweiterung** `tabProjekt`. |
| 12 | Begriffe umbenennen | 100.00 | **Fehlt/pendent** („Kommentare → Journal"). |

---

## 3. Konzept-Anforderungen (Dok A) ↔ Code

Zusätzlich zum Angebot fordert das Konzept Dinge, die in KFs Offerte **gar nicht**
auftauchen und im Code **fehlen** — mit dem Kunden klären, ob beauftragt:

- **PDF-Dossier eines Brennpunkts drucken** — fehlt.
- **Excel-/Auswertungsexport** (gefilterte Brennpunkte, Jahresbericht) — fehlt.
- **Link teilen (passwortgeschützt)** — fehlt.
- **Volltext-Suche „bis in die Dokumente rein"** — fehlt (Suche nur auf Metadaten).
- **Kamera-Upload** — fehlt.
- **Schema-Lücken in `tabProjekt`** (in beiden Repos bestätigt): **keine
  Koordinaten**, **kein getrenntes Abschlussdatum**, **kein Fazit-Feld**.

---

## 4. Was wir bereits geleistet haben (der Wert der Vorarbeit)

Diese Arbeit macht KFs Dev-Code überhaupt erst **sicher und auf 8.4 deploybar** —
Voraussetzung für ein sauberes Live-Deployment der Features:

- **Datenzugriffs-Schicht:** gesamter DB-Zugriff hinter Repositories
  (`app/Repository/`, Prepared Statements) — testbar, migrationsfreundlich.
- **Stored Procedures → PHP:** alle vier root-eigenen, unsichtbar in der DB
  liegenden Prozeduren durch sichtbare Repository-Logik ersetzt (in git); der
  dev-Fallback `ensure-procs.php` entfällt. `db/schema.sql` versioniert nun die
  DB-Struktur.
- **Konfiguration/Secrets:** zentrale `.env`/`config()`, Secrets aus dem Repo raus.
- **Sicherheit:** SQL-Injection durchgängig geschlossen, CSRF-Schutz
  (`App\Security\Csrf`), Datei-Token dokumentgebunden & kurzlebig
  (`App\Security\DownloadToken`); die Root-`.htaccess` liefert `.env`,
  interne Verzeichnisse und Include-Dateien nicht mehr aus (das Klartext-Leck
  von DB-Passwort/`APP_SECRET` ist geschlossen).
- **PHP-8.4-Kompatibilität:** reale Fatals behoben (Upload, Externe-Org,
  Umbenennen, mysqli-Report-Modus, Nummerngenerierung).
- **Frontend:** Bibliotheken lokalisiert (kein CDN), zentraler Head-Partial,
  FontAwesome auf eine Version vereinheitlicht, jQuery 3.7.1 + PDF.js 4.10.38
  (ESM) aktualisiert, CSS zu einer `css/app.css` konsolidiert.
- **Absicherung:** Golden-Master-Tests, sauberes git-Repo mit nachvollziehbarer
  Historie.

Für das Angebot heisst das: Die abgehakten Features (2–7) bieten wir **nicht als
Neuentwicklung** an, sondern als **Übernahme + Härtung + Live-Migration**.

---

## 5. Sicherheit

**Geschlossen (von uns):**

- Öffentliche Dokumentliste / Dokumente ohne Login — Login-Gate + zusätzlich
  dokumentgebundener, kurzlebiger Token statt des alten Tagestoken-Bypass.
- SQL-Injection (durchgängig Prepared Statements).
- CSRF (fail-closed in `header.php`).
- **`.env`-Klartext-Leck** (DB-Passwort + `APP_SECRET` waren direkt über den
  Browser abrufbar): Die Root-`.htaccess` verweigert nun den Direktzugriff auf
  `.env` und alle Punkt-Dateien, auf `composer.*`/`package*.json`, Markdown-/
  SQL-Dateien sowie die nur serverseitig genutzten Verzeichnisse und
  Include-Dateien. Assets und Seiten bleiben erreichbar.

**Noch offen / einzuplanen:**

- **Office-Vorschau** überträgt interne Dokumente an Microsoft
  (`view.officeapps.live.com`) und braucht eine öffentlich erreichbare URL →
  **DSG-Prüfung** oder Ersatz (nur PDF/Bild, oder serverseitiges Rendering).
- **`cron/test_reminder.php`** (bereits entfernt) war browser-aufrufbar und leakte
  das Log — als Beispiel für vor-Live aufzuräumende Test-Artefakte.
- **Token-Härtung** ist erledigt; für sehr strenge Anforderungen ggf. pro-Abruf
  statt pro-Stunde.

---

## 6. Deployment-Voraussetzungen & To-dos

- **Zwingend:** Live-**PHP-Anhebung** (Code ist PHP-8-only wegen der
  Repository-Syntax) — ohne das kein Deploy des modernisierten Stands.
- **Superuser-IDs:** Prod nutzt `1,2,9,28` (aus KFs `constantsProd.php`); unser
  Default ist `1,2`. **In der Prod-`.env` `SUPERUSERS=1,2,9,28` setzen**, sonst
  verlieren die User 9 und 28 den Admin-/Wartungszugang.
- **Termin-Cron** als **CLI**-Aufruf einrichten (`php .../cron/termin_reminder.php`);
  `mail()`-Zustellbarkeit auf dem Host (SPF/DKIM, Limits) verifizieren.
- **`.mjs`-MIME:** die `.htaccess`-Regel liefert `.mjs` als JS aus (für PDF.js) —
  auf dem Live-Host gegenprüfen.
- **Datenmenge:** Konzept erwartet „vermutlich 1 TB", Hosting-Paket ist deutlich
  kleiner — **Hosting-/Speicher-Frage**, kein Code-Thema.
- **Deploy-Modell:** aktuell `git pull` ohne Build. Eine spätere Laravel-Migration
  bringt einen **Vite-Build-Schritt** mit (s. `docs/laravel-frontend-assets.md`).

---

## 7. Empfehlungen fürs Angebot

**Bereits vorhanden — als „Übernahme + Härtung + Live-Migration" kalkulieren
(nicht als Neuentwicklung):** Termine (7), Mitarbeitende (6), Journal-Export (4),
erweiterte Suche + „zuletzt bearbeitet" (5a/5b), Dokumentvorschau (3),
Sicherheitslücke (2), ZIP-Download, Favoriten, Startseiten-Redesign.

**Echter Neu-Aufwand:** Passwort-vergessen (10), Koordinaten/Swisstopo inkl.
Schema (11), Projektstatus-Journal (9), Begriffe umbenennen (12) sowie die
Konzept-Lücken (PDF-Dossier, Excel-Export, Link-Teilen, Volltext-Suche,
Kamera-Upload), falls beauftragt.

**Risiken/Abhängigkeiten im Angebot kennzeichnen:** Live-PHP-Anhebung
(Voraussetzung), Office-Vorschau-Datenschutz, `mail()`-Zustellbarkeit,
Hosting-Speicher (1 TB), spätere Vite/Laravel-Entscheidung.

---

## 8. Offene Fragen an den Kunden

1. Welche Server-Umgebung gilt verbindlich, und ist ein **Hosting-Wechsel**
   geplant (wegen der 1-TB-Erwartung)?
2. Sind **PDF-Dossier, Excel-Auswertung, Link-Teilen, Volltext-Suche und
   Kamera-Upload** (aus dem Konzept) Teil des Auftrags oder bewusst gestrichen?
3. Ist die **Office-Vorschau über Microsoft** datenschutzrechtlich akzeptiert,
   oder soll sie ersetzt werden?
4. Sollen die von KF mit „?" markierten Positionen **9, 10, 11** beauftragt werden?
5. Sollen **Abschlussdatum** und **Fazit** (Konzept-Eigenschaften, im Schema
   nicht vorhanden) ergänzt werden?

---

## Verweise

- [`code-strategie.md`](code-strategie.md) — Stufenplan der Modernisierung
- [`altprogrammierer-konzept.md`](altprogrammierer-konzept.md) /
  [`altprogrammierer-angebot.md`](altprogrammierer-angebot.md) — die Vorlagen
- [`css-strategie.md`](css-strategie.md) /
  [`laravel-frontend-assets.md`](laravel-frontend-assets.md) — Frontend/Laravel
- `CHANGELOG.md` — was konkret geändert wurde
