Bernd Bleßmann [Fri, 20 Nov 2020 19:32:48 +0000 (20:32 +0100)]
CSV-Import Waren: bestehende Makemodels als Array, nicht als Array-Ref
makdemodels verhält sich als makemodels_sorted: Die von Rose erzeugte Methode
berücksichtig offenbar den Kontext - makemodels_sorted gibt immer ein array-ref
Bernd Bleßmann [Fri, 20 Nov 2020 16:02:32 +0000 (17:02 +0100)]
Massenerstellen von RG aus LS: geschlossene LS nicht (erneut) verarbeiten
Geschlossene Lieferscheine werden nicht zum Umwandeln in der Liste angezeigt,
das war auch bisher so. Aber weenn man nach dem Erzeuigen der Rechnungen von
der Folgeseite den Browser-Zurück-Knopf drückt, konnten aus den selben
Lieferscheine durchaus nochmal Rechnungen erzeugt werden. Das wird nun
abgefangen.
Bernd Bleßmann [Fri, 20 Nov 2020 15:34:16 +0000 (16:34 +0100)]
Massenerstellen von Rechnungen aus LS: Aktion nur einmal ausführen
Dafür den Action-Parameter only_once verwenden.
Damit das aber klappt, muss die Prüfung, ob etwas angehakt ist, auch als check
an die Action gehängt werden. Denn sonst wird der Knopf abgeschaltet, auch wenn
nur die Prüfung fehlschlägt, weil man nix angehakt hat.
Moritz Bunkus [Mon, 16 Nov 2020 16:02:38 +0000 (17:02 +0100)]
CSS/JS: Git-Revision von HEAD als GET-Parameter verwenden
Webbrowser cachen CSS & JS sehr aggressiv. Das ist während der
Entwicklung störend, weshalb es bereits seit langem die
Konfigurationsoption `auto_reload_resources` gibt. Ist diese an, so
wird an alle CSS- und JS-URLs ein GET-Parameter `?rand=<Zufallswert>`
angehängt wird, um das Cachen auszuhebeln.
Dieser Commit führt etwas Ähnliches ein, das für den Produktivbetrieb
ohne `auto_reload_resources` gedacht ist. Wenn kivitendo erkennt, dass
es aus git heraus läuft (also ein `.git`-Verzeichnis existiert), so
parset es die Revision von `HEAD` und nimmt das als GET-Parameter
`?rand=<Revision>`. Der Vorteil ist, dass nach Updates einer
Produktivinstallation die Webbrowser der Anwender*innen genau einmal
alle Ressourcen neu laden, weil sich ja die Git-Revisionsnummer
geändert hat. Anschließend können sie die Ressourcen aber wieder
normal cachen, bis das nächste Update kommt.
Es wird hierfür übrigens kein installiertes git-Executable benötigt;
die Infos werden zwecks Performance direkt aus den Dateien gelesen,
anstatt bei jedem Request ein Programm auszuführen.
Zukünftig könnte man ein analoges Verfahren anwenden, wenn es kein
`.git`-Verzeichnis gibt, und dann zumindest die
kivitendo-Versionsnummer verwenden.
Moritz Bunkus [Mon, 16 Nov 2020 14:16:19 +0000 (15:16 +0100)]
L/P.select_tag: Unterstützung für Text-Filter
Gedacht für Selects mit size="123"-Attribut, die also als Liste und
nicht als Combobox gerendert werden.
Es wird direkt oberhalb der Select eine Text-Eingabezeile angezeigt,
die als dynamischer Filter für die Optionen verwendet wird. Bei jeder
Änderung (keyup) werden nur noch diejenigen Einträge in der Select
angezeigt, in deren Text der Suchfilter-Begriff irgendwo
vorkommt (ohne Berücksichtigung von Groß-/Kleinschreibung).
• with_filter=1 schaltet den Filter an
• filter_placeholder=LxERP.t8("Placeholder text") gibt einen
Platzhalter-Text an
Moritz Bunkus [Mon, 16 Nov 2020 16:15:41 +0000 (17:15 +0100)]
L/P.select_tag: Collection, die aus einem leeren Wert besteht, ignorieren
Unter Umständen kann es durch wantarray & Durchschieben in Templates
passieren, dass der $collection-Parameter nicht leer ist (obwohl er
leer sein sollte), und statt dessen ein leerer String ist. Bisher
wurde daraus eine Liste mit einem leeren Eintrag, auch wenn
`with_empty` nicht angegeben war.
Ab sofort solche Einträge einfach als leere Liste werten.
Moritz Bunkus [Fri, 13 Nov 2020 09:36:05 +0000 (10:36 +0100)]
Neuer Auftragscontroller: Drucker-ID an Template-Auswahlmechanismus durchreichen
Der Auswahlmechanismus kann bei der Suche nach der zu verwendenden
Vorlage das beim Drucker hinterlegte Vorlagenkürzel
berücksichtigen. Dafür muss er aber auch gesagt bekommen, welcher
Drucker ausgewählt wurde.
Moritz Bunkus [Tue, 10 Nov 2020 08:30:10 +0000 (09:30 +0100)]
Neuer Angebots-/Auftragscontroller: Unterstützung für Artikelübersetzungen 3
Die longdescription wird jetzt doch als Hidden im Formular mit
übertragen. Dadurch werden gewisse Randfälle und Diskrepanzen zwischen
Form-Inhalt und Datenbank-Inhalt vermieden. Nur hiermit ist es jetzt
auch möglich, auch den Langtext durch die Funktion »aus Stammdaten
aktualisieren« zurückzusetzen.
Moritz Bunkus [Mon, 9 Nov 2020 11:46:42 +0000 (12:46 +0100)]
Einkaufsrechnungen: Redirect nach Buchen auf Bearbeiten, nicht Erfassen
1. In allen anderen Einkaufs- und Verkaufsmasken landet man nach dem
Speichern/Buchen wieder im gerade gespeicherten/gebuchten Beleg.
2. Wenn in der Mandantenkonfiguration das Feature »direktes Erfassen
von Einkaufsrechnungen« aus ist, so darf man gar nicht direkt die
Erfassen-Funktion aufrufen und bekommt folglich nach dem Redirect
eine Fehlermeldung, dass man keine Rechte auf die Funktion habe.
Moritz Bunkus [Mon, 9 Nov 2020 10:19:10 +0000 (11:19 +0100)]
Employee-Controller: beim Gelöscht-Setzen Verknüpfung in Auth-DB lösen
Beim Anlegen von Benutzer*inen in der Auth-DB werden sie nicht
zwangsweise auch in der Mandanten-DB angelegt, z.B. wenn die in dem
Moment noch nicht existiert. Daher werden bei jedem Login in einem
Mandanten alle Benutzer*innen, die in dem Moment mit dem Mandanten
verknüpft sind, in der Mandanten-DB angelegt (falls noch nicht
existierend) und das »gelöscht«-Flag wieder entfernt.
Beim Löschen von Benutzer*innen aus dem Admin-Bereich heraus ist das
soweit auch OK, denn dann wird in der Auth-DB der Eintrag entfernt und
in der Mandanten-DB das Login auf »gelöscht« gesetzt.
Es gibt aber auch im Mandantenbereich einen Controller zum Bearbeiten
von Benutzer*innen, in dem das »gelöscht«-Flag gesetzt werden
kann. Und hier wurde bisher nur die Mandanten-DB angefasst, nicht aber
die Auth-DB. Wenn also hier ein(e) Benutzer*in auf »gelöscht« gesetzt
wird, so wurde beim nächsten Login in den Mandanten in der Auth-DB
nachgesehen, dort war der Account noch verknüpft, also wurde das
»gelöscht«-Flag wieder entfernt.
Fix ist, dass nun auch in der Auth-DB die Verknüpfung des Accounts mit
dem Mandanten entfernt wird. Der Account wird in der Auth-DB aber
nicht gelöscht, weil er ja auch noch auf andere Mandanten Zugriff
haben könnte.
Moritz Bunkus [Mon, 9 Nov 2020 09:41:55 +0000 (10:41 +0100)]
Number-Helper-Tests: Warnungen vermeiden
$config war unbenutzt und wurde deshalb entfernt. Die Variable stammt
aus dem alten form/round_amount.t-Test, wo sie ebenfalls zwar
deklariert war aber nicht benutzt wurde.
Sven Schöling [Fri, 6 Nov 2020 17:06:00 +0000 (18:06 +0100)]
SL::Helper::Number: API Verbesserungen
- API ist jetzt einheitlich ($amount, [$places], %params)
- Benennung ist einheitlich _[format|parse|round]_[number|total]
- Tests aus t/helper/round.t nach t/helper/number.t verschoben
- Tests für alle neuen Funktionen hinzugefügt
- Doku-Update
- SL::Form angepasst
- EXPORT_ALL tag ":ALL" auf caps umgestellt
Bernd Bleßmann [Sun, 25 Oct 2020 13:44:11 +0000 (14:44 +0100)]
Kreditorenbuchung: Maske: Bei Fehlbetrag setzen nach id des Felds suchen
Die js-Funktion zum Fehlbetrag-Setzen suchte nach dem Namen des letzten
paid_-Input-Elements ('^paid_'). Nun kam aber paid_project_ dazu (, weil der
Picker auch das name-Attribut setzt).
Deshalb für die Zahl-Betrags-Elemente Ids setzen und diese nutzen.
Sven Schöling [Tue, 27 Mar 2018 13:19:51 +0000 (15:19 +0200)]
SL::Helper::Number - format_amount aus SL::Form ausgelagert
- Neue Funktionen können direkt exportiert werden.
- Alte Funktionen sind in SL::Form für Kompatibilität auf die neuen
geproxied.
- Tracing debug statements (enter_sub, leave_sub) entfernt
- Zusätzlich noch eine neue Kategorie eingeführt: total, um Werte für
acc_trans immer auf 2 Stellen zu runden.