Moritz Bunkus [Tue, 5 Nov 2019 12:46:38 +0000 (13:46 +0100)]
PDF-Erzeugung: Support fürs Erzeugen von PDF/A-konformen PDFs
Es gibt einen Rose-DB-Helfer `S:D:H:PDF_A`, der die erforderliche
Struktur für `SL::Template::LaTeX` (via
`$form->{TEMPLATE_DRIVER_OPTIONS}->{pdf_a}`) erzeugt. Der Helfer ist
für die üblichen Belegklassen (`S:D:{Order,DeliveryOrder,Invoice}`)
eingebunden.
Weiterhin können über
`$form->{TEMPLATE_DRIVER_OPTIONS}->{pdf_attachments}` Dateien in PDFs
eingebettet werden.
Das Erzeugen funktioniert nur für LaTeX-Vorlagen, nicht für
OpenDocument-Vorlagen.
Für LaTeX werden nun weitere Pakete benötigt, deren Präsenz vom
Installations-Check geprüft werden: `pdfx`, `embedfile`.
Für `embedfile` muss leider eine von uns modifizierte Version benutzt
werden, da der letzte offizielle Release das PDF-Attribut
`/AFRelationship` nicht unterstützt. Dieses Attribut muss aber für
jede in ein PDF/A eingebettete Datei gesetzt sein. Daher liefern wir
die modifizierte Version im neuen Unterverzeichnis `texmf` mit, das
über die Umgebungsvariable `TEXINPUTS` höhere Präferenz bekommt, als
die Systemverzeichnisse.
Die relevante Modifikation ist der folgende Pull-Request:
In der Maske und daher in $::form stehen die Werte in Prozent, in den
DB-Spalten und damit den Rose-Attributen werden sie aber als Faktor
gespeichert, sprich z.B. 0.05 für 5%.
Moritz Bunkus [Fri, 15 Sep 2017 12:35:16 +0000 (14:35 +0200)]
_make_record(_item): Zahlenattribute nicht mit leeren Strings setzen
Wir übergeben diverse Zahlenfelder als hidden inputs, ohne dass wir
prüfen, ob die überhaupt gesetzt sind:
1. Im Aufruf 1 ist z.B. `$::form->{customer_id} = undef`, oder es gibt
sogar nicht mal ein `$::form->{customer_id}`.
2. Dies wird ohne Prüfung auf den tatsächlichen Wert als Hidden
ausgegeben, und endet damit als `<input type="hidden"
name="customer_id" value="">`.
3. In Aufruf 2 kommt das dann als `$::form->{customer_id} = ''` an,
also als leerer String, egal, ob der Wert vorher `undef`, ein
leerer String war oder gar nicht existiert hat.
Wenn man nun, wie `_make_record_item`, über alle Schlüssel aus
`$::form` iteriert, und die korrespondierenden
Attributs-Setter-Funktionen einer RDBO-Instanz mit ihnen aufruft, so
werden somit Zahlen-Setter-Funktionen mit leeren Strings
aufgerufen. Das sorgt dafür, dass später bei einem Aufruf von
`$invoice->customer` versucht wird, ein Customer-Objekt aus der DB zu
laden (da ja durch den Aufruf von `…->customer_id(…)`, also das Setzen
des Relationship-Attributs, signalisiert wurde, dass die Relationship
aktiv ist).
Allerdings ist der Wert des Primärschlüsselattributes nun der leere
String, also im Perl-Sinne `false`. Das wiederum wertet Rose als
Versuch, ein Objekt ohne Angabe eines Primärschlüsselattributs zu
laden, was wiederum zu einer Fehlermeldung führt.
Kurz: Zahlenattribute aus RDBO-Instanzen dürfen gar nicht erst auf
leere Strings gesetzt werden. Sie dürfen nur gesetzt werden, wenn sie
auch tatsächliche Zahlenwerte enthalten sollen.
Moritz Bunkus [Thu, 20 Feb 2020 11:55:06 +0000 (12:55 +0100)]
Unterstützung für PostgreSQL 12
Das Format von `pg_attrdef` wurde in PostgreSQL 12 deutlich geändert;
die Spalte `adsrc` gibt es nicht mehr. Für den Auth-Code ist
allerdings nur interessant, ob es Spalte X in Tabelle Y bereits
gibt. Also auch nur genau diese Informationen auslesen.
Bernd Bleßmann [Thu, 6 Feb 2020 17:52:06 +0000 (18:52 +0100)]
LaTeX: Tilde vor U+00A0 ersetzen, sonst wird aus U+00A0 eine LaTeX-Tilde
Da die Tilde in LaTeX eben für non-breaking whitespace steht, darf diese
nicht durch die mittig gesetzte Tilde ersetzt werden. Deshalb hier die
Reihenfolge ändern.