Commit graph

11 commits

Author SHA1 Message Date
Eduard Wisch
6949702f5a Foto-Upload: identische Datei kein zweites Mal ablegen (v1.6.0) [deploy]
An Auftrag (PROV105) lagen 34 Fotos, davon 11 exakte Wiederholungen: eine Serie
lief bei ausgeschaltetem Display nur halb durch, der zweite Anlauf lud alles
noch einmal hoch.

- bericht_find_identical_file() vergleicht die hochgeladene Datei gegen den
  Zielordner (Groesse als Vorfilter, md5 nur bei Kandidaten)
- eingebaut in beide Upload-Wege: api/orders.php?action=upload_photo (PWA) und
  mobile_upload.php (Token-Link)
- bei Treffer wird nichts gespeichert, die Antwort traegt duplicate:true UND den
  relpath der vorhandenen Datei — ohne relpath wertet die PWA den Upload als
  nicht bestaetigt und wiederholt ihn endlos (lib/api.js)

Funktion isoliert geprueft: identischer Inhalt wird gefunden, neuer Inhalt und
gleiche Groesse mit anderem Inhalt liefern null (kein Fehlalarm).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-28 18:41:50 +02:00
Eduard Wisch
a8d8291c3a API 1.5.1: Thumbnails, Aufnahmezeit, Seitenfelder, Textnotizen
Die API-Seite zur Baustelle-PWA holt nach, was der Editor mit 1.5.0 bekommen hat.

photo.php kann jetzt size=thumb&w=<px> und rendert ueber bericht_attachment_thumb()
(GD, Cache, EXIF-Rotation) statt die Originaldatei auszuliefern. size=small konnte nur
ein von Dolibarr vorgefertigtes thumbs/<name>_small.<ext> liefern - fuer Uploads ueber
orders.php?action=upload_photo gibt es das nicht, dort laeuft kein vignette(). Die PWA
lud dadurch fuer jede Kachel das komplette Foto: gemessen 9,8 KB statt 235 KB je Kachel.
Antwort mit ETag aus der mtime, Folgeaufrufe enden mit 304.

orders.php?action=photos liefert taken_at (EXIF-Aufnahmezeit ueber bericht_file_taken_at,
sonst Dateidatum) und sortiert danach statt nach filemtime.

reports.php gibt je Seite title und composite_path aus. title konnte ueber pages.php
gesetzt werden, kam aber nie zurueck. composite_path ist das im Editor gebaute
Seitenbild - ohne das zeigen Clients nur das Rohbild ohne Anmerkungen, bei
Raster-Layouts eines von bis zu sechs Bildern und bei title_only gar keins.

Neu: api/note.php - Textnotizen zum Auftrag, aufgebaut wie die Sprachnotiz. Die Notiz
liegt als notiz_<betreff>_<datum>.txt im Auftragsverzeichnis und ist damit auch im
Dolibarr-Auftrag und in der Anhaenge-Spalte des Editors sichtbar. Liste, Lesen, Anlegen,
Aendern, Loeschen. Der file-Parameter wird gegen ^notiz_[A-Za-z0-9_.-]*\.txt$ geprueft;
gegen Pfad-Ausbrueche getestet.

ROADMAP.md wiederhergestellt - sie war mit eb37a4b geloescht worden, weil alle Punkte
abgehakt waren. Sie bleibt ab jetzt liegen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 18:11:42 +02:00
Eduard Wisch
3ab13e2e23 Kein Stunden-Dummy mehr beim Direkt-Freigeben (1.4.0)
api/orders.php?action=create gibt den Auftrag mit validate=true jetzt ohne
jede Position frei. Bisher hing das Backend vorher eine Std-Lohn-Zeile mit
Menge 1 an (Kundenkarten-Default, sonst Fallback-Produkt).

Die Annahme, Commande::valid() scheitere an einem leeren Auftrag, ist falsch -
weder valid() noch confirm_validate pruefen auf Zeilen, gesperrt ist nur die
Button-Darstellung in commande/card.php (KB #355/#989, gegen Dolibarr 22.0.2
verifiziert). Die Alibi-Zeile verfaelschte total_ht, tauchte als offene Rest-
menge in der Lieferauflistung auf, stand im Kunden-PDF und liess sich nach der
Freigabe nicht mehr per deleteLine() entfernen. Die Leistungen kommen aus dem
Stundenzettel.

- Antwortfeld added_line entfaellt (die Baustelle-PWA hat es nie ausgewertet)
- Konstante BERICHT_ORDER_DEFAULT_SERVICE_REF wird nicht mehr verwendet
- Gleiche Umstellung in der Stunden-App (Stundenzettel 2.17.0), die mit der
  neuen Aktion create_order jetzt ebenfalls Auftraege anlegen kann

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-15 16:25:59 +02:00
Eduard Wisch
d86a8f32c9 Feature: PWA-Auftragsanlage — Ihr Zeichen Pflicht, Liefertermin, Auto-Freigabe [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 14s
- api/orders.php: ref_client ("Ihr Zeichen") jetzt serverseitig Pflicht
  (Dolibarr-Core selbst verlangt nur den Kunden)
- Neuer Parameter date_livraison (Unix-TS) -> Commande->delivery_date
- Neuer Parameter validate: haengt vor der Freigabe automatisch eine
  Std-Lohn-Zeile an (Kundenkarten-Default stundenzettel_default_service,
  sonst Fallback-Produkt ueber neue Konstante
  BERICHT_ORDER_DEFAULT_SERVICE_REF, Default ELEK-STD-M), dann valid().
  Preis: kundenspezifischer Preis (PRODUIT_CUSTOMER_PRICES) vor Standardpreis.
- Response um ref_client, date_livraison, validated, added_line,
  validate_warning erweitert
- Doku: README (Endpoint + Konstante), ChangeLog 1.3.0
- CLAUDE.md: PWA-Stack-Angabe korrigiert (Vanilla JS statt SvelteKit)
2026-07-18 13:35:31 +02:00
Eduard Wisch
74e4509eee Fix: Dateigrößen mit glob+filesize statt dol_dir_list (korrigiert 0B Bug) [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 5s
2026-04-17 13:06:07 +02:00
Eduard Wisch
0682b6ce37 Debug: Logging für dol_dir_list Ausgabe in orders.php
All checks were successful
Deploy bericht / deploy (push) Has been skipped
2026-04-17 13:05:25 +02:00
Eduard Wisch
641e16a2bc [deploy] API: Schnell-Auftrag-Anlage + Kunden-Defaults + JWT 30 Tage
All checks were successful
Deploy bericht / deploy (push) Successful in 5s
- POST /api/orders.php?action=create: legt Draft-Auftrag an, übernimmt
  Kunden-Defaults (Zahlungsbedingung, Zahlart, Bankkonto, Incoterms,
  Lieferadresse) und setzt Hauptansprechpartner als externen Kontakt.
  Titel wird in Extrafield options_auftragsbeschreibung abgelegt.
- /api/customers.php: liefert cond_reglement_label + mode_reglement_label
  damit die PWA die übernommenen Defaults anzeigen kann.
- JWT-TTL von 7 auf 30 Tage hochgesetzt — deckt Urlaubszeiten ab und
  verhindert häufiges Neu-Anmelden.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 17:42:39 +02:00
Eduard Wisch
062e5c1b50 API: ref_client (Kunden-Bestellnr.) in Auftragsliste hinzugefügt
All checks were successful
Deploy bericht / deploy (push) Successful in 5s
[deploy]

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-04-16 10:49:47 +02:00
9271ec279f Foto-Upload vom Bericht entkoppeln: Fotos landen im Auftragsordner
All checks were successful
Deploy bericht / deploy (push) Successful in 2s
- Token-Tabelle: fk_bericht → fk_element + element_type (generisch)
- Migration: bestehende Tokens auf neue Spalten migrieren
- upload_photo API: Foto direkt nach commande/{ref}/, kein Bericht/BerichtPage mehr
- mobile_upload.php: Upload-Ziel über Token-Methode getUploadDir() ermitteln
- Token-Erstellung: element_id + element_type statt berichtid (abwärtskompatibel)
- QR-Modal: Token für Auftrag statt für Bericht; Polling auf Anhänge-Änderung [deploy]

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-10 13:48:09 +02:00
046b26665f fix: Foto-Upload hängt an neuestem Entwurf, nicht blind an [0]
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- Wenn mehrere Berichte zum Auftrag existieren, wird der erste
  gefundene ENTWURF (status=0) wiederverwendet
- Finalisierte Berichte werden NICHT mehr mit neuen Seiten überschrieben
- Optional ?bericht_id=X um gezielt in einen bestimmten Bericht hochzuladen
- Wenn alle Berichte final sind, wird automatisch ein neuer Entwurf angelegt

So kann die PWA mehrere Fotos hintereinander in denselben Bericht
packen, statt pro Upload einen neuen anzulegen.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-09 00:44:28 +02:00
bed611cd8b feat: Phase 2.3 + 2.4 — REST-API mit JWT-Auth
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- api/_jwt.php: HS256 JWT encode/decode/from_request, Secret aus
  dolibarr_main_instance_unique_id, 7 Tage TTL
- api/_inc.php: gemeinsamer API-Init mit CORS, JSON-Helpers,
  api_authenticate() lädt User aus JWT und prüft bericht/read
- api/auth.php: POST { login, password } → JWT mit user + perms
- api/orders.php:
  - GET /api/orders.php — Liste der Aufträge des Users (Multi-User
    Filter über fk_user_*, Admin sieht alle)
  - GET /api/orders.php?id=X — Auftrags-Detail mit Kunde + Berichten
  - GET /api/orders.php?id=X&action=photos — Anhänge
  - POST /api/orders.php?id=X&action=upload_photo — Foto hochladen,
    Bericht wird automatisch angelegt falls nicht vorhanden
- api/reports.php:
  - GET /api/reports.php?id=X — Bericht-Detail + Seiten
  - POST /api/reports.php?id=X&action=finalize — Status auf final

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-08 22:40:52 +02:00