Commit graph

9 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
4102ebfe5b Editor-Ueberarbeitung 1.5.0: Anhaenge-Kacheln, echte Seitengeometrie, Arbeiten ohne Reload [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 13s
Anhaenge-Spalte: Kachelraster mit Server-Thumbnails statt Dateinamen-Liste (Bilder per GD,
PDFs per PDF.js), Grossansicht per Klick, Auswahlreihenfolge sichtbar, Sortierung/Filter
(Aufnahmezeit per eigenem EXIF-Parser, da im Prod-Container ohne exif-Modul), ziehbare
Spaltenbreite, Kachelgroesse, Drag & Drop auf Seitenliste/Arbeitsflaeche/Raster-Plaetze.

Arbeitstisch zeigt jetzt Kopf-, Inhalts- und Fussbereich passend zur echten Seitengeometrie
(bericht_page_geometry()) - Editor und PDF-Erzeugung rechnen mit denselben Werten, das PDF
setzt die Arbeitsflaeche 1:1 statt sie ein zweites Mal einzupassen.

Neu: Bild einer Seite austauschen (auch einzelne Raster-Plaetze), Seiten mehrfach markieren
und sammeln loeschen/duplizieren, Autosave mit Verlassen-Warnung, Tastenkuerzel, kein
location.reload() mehr nach Hinzufuegen/Loeschen/Hochladen (ajax/fragments.php).

Nebenbei behoben: dol_dir_list() ohne mode=1 (Dateigroesse leer), PDF.js-Worker-Pfad ohne
/custom-Praefix, PDFs liefen als Download statt inline, Groessen-Select blieb leer,
Mehrfach-Upload nahm nur die erste Datei, Race-Condition bei schnellem Seitenwechsel.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-22 00:33:20 +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
52810b2b91 Doku: Modul-Version 1.3.1 + ChangeLog (customers.php-Uebersetzung, PWA-Layout) [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 18s
- modBericht.class.php: version 1.1.0 -> 1.3.1 (war seit 1.1.0 nie nachgezogen)
- ChangeLog 1.3.1: Zahlart/Zahlungsbedingung-Uebersetzung + PWA-Formular-Layout-Fix
2026-07-18 14:55:31 +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
ca2b796b36 Feature: Lieferschein-Unterschrift via ODT-Hook + PWA-Signatur-Workflow
All checks were successful
Deploy bericht / deploy (push) Successful in 6s
- Neuer API-Endpoint api/shipments.php: Liste Lieferungen zu Auftrag, PDF-Stream, confirm (Unterschrift stempeln)
- ODT-Hook actions_bericht.class.php: ersetzt {signature} Platzhalter via odfphp->setImage, setzt {signer_name}/{signed_at}/{gps}
- Backup-Roundtrip: generateDocument-Backup → signed.pdf erzeugen → Original wiederherstellen
- JWT-Fallback in _jwt.php: ?jwt= Query-Param für <img>/<object> ohne Authorization-Header
- Admin: BERICHT_SIGNATURE_IMAGE_RATIO Feld, Toggle BERICHT_TAB_ON_SHIPMENT, Signature-Box-Editor
- DB: llx_bericht_signature_box für pro-Template mm-Box-Geometrie
- element_type='shipment' in modBericht + lib/bericht.lib.php
- element_element Richtung: commande=source, shipping=target (fk_target=expedition_id)
- DOL_DATA_ROOT-Auflösung für EXPEDITION_ADDON_PDF_ODT_PATH
- Sprachen: de_DE + en_US mit neuen Schlüsseln für Signatur-Workflow

[deploy]

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 06:48:42 +02:00
0fbfb1bf27 feat: Phase 1.3 + 1.7 + Schema 1.4/1.5 — Format/Orient + Kunden-Tab
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
Phase 1.3 Seitenformat A4/A3/A5/Letter + Hoch/Quer:
- Neue Spalten page_format, page_orientation in llx_bericht
- Bericht-Meta zeigt Format + Orientation Selects
- Auto-Save via neuem ajax/save_meta.php
- generate_pdf + preview_pdf nutzen die gewählten Werte
- Bilder werden dynamisch via getPageWidth/getPageHeight skaliert
  (statt hardcoded 210x297 für A4)

Phase 1.4 + 1.5 Schema-Vorbereitung:
- Neue Tabelle llx_bericht_page_image für Multi-Image-Seiten
- Spalten layout, image_scale, image_align in llx_bericht_page
- DB-Migrationen im init() für bestehende Installationen
  (ALTER TABLE mit Error-Suppress)
- Grid-Rendering im Editor/PDF folgt im nächsten Commit
  (siehe CLAUDE.md TODO)

Phase 1.7 Tab "Berichte" auf Kundenkarte:
- Neue Konstante BERICHT_TAB_ON_THIRDPARTY (default 1)
- Tab-Definition in modBericht für 'thirdparty' Element
- Neue Datei bericht_thirdparty.php
- UNION-SQL über bericht JOIN commande/facture/propal mit fk_soc
- Read-only flache Tabelle sortiert nach Datum
- Pro Bericht: Quelle (Symbol + Ref-Link), Status, Öffnen/Zur Quelle

Version-Bump 1.0.0 → 1.1.0, ChangeLog ergänzt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-08 22:20:09 +02:00
923b50d65a feat: Initiales Release Bericht-Modul v1.0.0 [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
Dolibarr-Modul für Arbeitsberichte aus Rechnungs-Anhängen mit Browser-PDF-Editor.

- Reiter "Bericht" auf Rechnungen, Aufträgen und Angeboten
- Anhänge-Browser inkl. verknüpfter Objekte (Auftrag → Rechnung)
- PDF.js + Fabric.js Browser-Editor: Pfeile, Kreise, Rechtecke, Freihand, Text
- SortableJS Seiten-Verwaltung mit Drag&Drop
- ODT-Deckblatt mit Platzhaltern, Templates im Admin verwaltbar
- TCPDF + FPDI Finalisierung mit eingebrannten Annotationen
- ECM-Verknüpfung: PDF erscheint unter Verknüpfte Dokumente
- Auftragsnummer aus existierendem Extrafield options_auftragsnummer
- Mehrere Berichte pro Dokument
- Beim Aktivieren werden vorhandene Extrafields nicht überschrieben

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 15:18:59 +02:00