kivitendo-erp.git
5 years agoHelper UserPreferences - selectall_ids -> selectcol_array_query
G. Richardson [Tue, 19 Feb 2019 12:08:53 +0000 (13:08 +0100)]
Helper UserPreferences - selectall_ids -> selectcol_array_query

5 years agoSL::DBUtils - selectall_array_query -> selectcol_array_query
G. Richardson [Tue, 19 Feb 2019 11:55:49 +0000 (12:55 +0100)]
SL::DBUtils - selectall_array_query -> selectcol_array_query

selectall_array_query durch selectcol_array_query ersetzt.

Intern wird nun die DBI-Funktion selectcol_arrayref verwendet, anstatt
dies manuell per Schleife zu machen. Der Name selectall_array_query war
irreführend und der neue Name entspricht nun dem, was man erwartet.

5 years agoSL::DBUtils - POD zu AutoCommit aktualisiert + Typos
G. Richardson [Tue, 19 Feb 2019 12:00:46 +0000 (13:00 +0100)]
SL::DBUtils - POD zu AutoCommit aktualisiert + Typos

5 years agoInventory Controller - Datenbankoptimierungen für mini_journal
G. Richardson [Thu, 14 Feb 2019 11:01:10 +0000 (12:01 +0100)]
Inventory Controller - Datenbankoptimierungen für mini_journal

Aus Datenbanksicht war das Inventory mini-journal eine Katastrophe.

Die trans_id Abfrage führte zu einem ersten Seq Scan auf der Tabelle inventory.
  my $query = 'SELECT trans_id FROM inventory GROUP BY trans_id ORDER BY max(itime) DESC LIMIT 10';

Die Rose Manager Abfrage führte dann zu einem zweiten Seq Scan auf der Tabelle inventory:
 $objs = SL::DB::Manager::Inventory->get_all(query => [ trans_id => \@ids ]) if @ids;

Das sind zwei Seq Scans auf eine Tabelle die in kivitendo recht groß werden
kann. Außerdem könnte in der Zwischenzeit ein neuer inventory-Eintrag
dazugekommen sein, der damit ignoriert würde.

Im Template wurde dann auf die Rose-Objekte von part, transfer_type, bin und
warehouse zugegriffen, und da diese noch nicht geladen wurden sorgt das im
Extremfall für 40 weitere Datenbankzugriffe.

Das ist alles schön kompakter perl Code, aber wie könnte man das aus
Datenbanksicht optimieren, also die Anzahl der Zugriffe verringern und nach
Möglichkeit Indexe benutzen?

Die Templatezugriffe können einfach durch ein with_objects verhindert werden:
    with_objects => [ 'parts', 'trans_type', 'bin', 'bin.warehouse' ],

Statt einer separaten Abfrage für die trans_ids könnte man diese als eine
Unterabfrage in get_all einführen:
  query        => [ trans_id => [ \"$query" ] ]

Die get-all-Abfrage kann man aber noch weiter verbessern, indem man nach id
statt trans_id filtert, da es für id im Gegensatz zu trans_id schon einen Index
gibt. Das Ziel für die Unterabfrage sollte also sein, eine Liste von ids zu
bekommen, damit der Index benutzt wird und man sich den Seq Scan spart.

Das mini-Journal zeigt die letzten 10 Lagerbewegungen, die entweder
Einlagerungen, Auslagerungen oder Umlagerungen sein können. Im Fall von
Umlagerungen wären das 2 inventory-Einträge, ansonsten 1. Da wir nicht wissen,
wieviele Umlagerungen dabei sind, holen wir die letzten 20 Einträge, filtern
diese nach den letzten 10 trans_ids, und extrahieren daraus die inventory ids
(zwischen 10 und 20 ids). Die ursprüngliche Abfrage mit dem GROUP BY konnte
keinen index nutzen, da das ORDER BY auf max(itime) statt itime war. Durch das
"limit 20" werden zwar potentiell ein paar Zeilen zu viel geholt, dafür kann
man aber nun einen Index auf inventory(itime) setzen, der von der Abfrage auch
verwendet werden kann, und damit spart man sich auch den letzten Seq Scan auf
inventory.

create index if not exists inventory_itime_idx on inventory (itime);

5 years agoSpalte taxnumber aus Tabelle tax entfernt
G. Richardson [Tue, 22 Jan 2019 13:56:24 +0000 (14:56 +0100)]
Spalte taxnumber aus Tabelle tax entfernt

tax.taxnumber war ein redundanter Eintrag, und entsprach dem Wert von
chart.accno aus tax.chart_id.

Z.B. in SKR04 hatte Steuerschlüssel 3 (Umsatzsteuer 19%) die taxnumber
1776 und die chart_id 775 (chart mit id 775 ist das Konto 1776).

Ein Problem dabei ist, daß wenn man in den Konteneinstellungen die
Kontonummer von 1776 ändert, dies nicht automatisch in tax.taxnumber mit
aktualisiert wurde.

Im Code wurde taxnumber v.A. verwendet, um bei Belegen die Steuern zu
gruppieren, mit der taxnumber als Schlüssel.

taxnumber wurde nun also entfernt, und obwohl zum Gruppieren der Steuern
immer noch diese Kontonummer verwendet wird, wird diese Kontonummer
nicht mehr zum Suchen des entsprechenden Taxeintrags verwendet, sondern
die Suche passiert indirekt über die chart_id.

Das ganze System basiert derzeit darauf, daß es für jeden tax-Eintrag ein
eindeutiges Automatikkonto gibt, in der Praxis muß dies aber nicht der
Fall sein!

5 years agoRefactoring sql-Abfrage für Steuertabelle
G. Richardson [Tue, 22 Jan 2019 14:05:14 +0000 (15:05 +0100)]
Refactoring sql-Abfrage für Steuertabelle

statt 2 subselects pro Automatik- und Skontokonto, jeweils ein Join, um
die Kontonummer und Kontenbeschreibung direkt auszulesen.

5 years agochangelog zu PartPicker sucht nach Kunden- und Lieferanten-Artikel-Nr.
Bernd Bleßmann [Wed, 7 Aug 2019 13:53:48 +0000 (15:53 +0200)]
changelog zu PartPicker sucht nach Kunden- und Lieferanten-Artikel-Nr.

5 years agoAuftrags-Controller: Kunden- bzw. Lieferanten-Art-Nr. in Pos-Zeile anzeigen.
Bernd Bleßmann [Mon, 5 Aug 2019 11:00:28 +0000 (13:00 +0200)]
Auftrags-Controller: Kunden- bzw. Lieferanten-Art-Nr. in Pos-Zeile anzeigen.

… sofern in den Benutzereinstellungen auch die Suche danach ausgewählt ist.

5 years agoAuftrags-Controller: PartPicker filtert nach Kunden- und Lieferanten-Art.-Nr., …
Bernd Bleßmann [Fri, 19 Jul 2019 13:48:09 +0000 (15:48 +0200)]
Auftrags-Controller: PartPicker filtert nach Kunden- und Lieferanten-Art.-Nr., …

… sofern das in den Benutzereinstellungen ausgewählt ist.

5 years agoUserPreferences-Helper f. Part-Picker-Such-Einstellungen in Belegen
Bernd Bleßmann [Fri, 19 Jul 2019 13:45:46 +0000 (15:45 +0200)]
UserPreferences-Helper f. Part-Picker-Such-Einstellungen in Belegen

Hier kann der Benutzer einstellen, ob in Verkauf auch nach Kunden-Artikle-Nr.
und im Einkauf nach Lieferanten-Artikel-Nr. gesucht werden soll.

5 years agoPartPicker nach Kunden- und Lieferanten-Artikel-Nr. suchen und filtern können
Bernd Bleßmann [Fri, 19 Jul 2019 12:20:38 +0000 (14:20 +0200)]
PartPicker nach Kunden- und Lieferanten-Artikel-Nr. suchen und filtern können

5 years agoPart: Filter-Specs für Kunden- und Lieferanten-Artikel.-Nr.
Bernd Bleßmann [Mon, 8 Jul 2019 13:04:22 +0000 (15:04 +0200)]
Part: Filter-Specs für Kunden- und Lieferanten-Artikel.-Nr.

5 years agoPartPicker: Mehrfachauswahl: Ursprüngliche Filter für Dialog merken.
Bernd Bleßmann [Fri, 19 Jul 2019 12:07:34 +0000 (14:07 +0200)]
PartPicker: Mehrfachauswahl: Ursprüngliche Filter für Dialog merken.

Damit klappt das auch hier mit der Suche nach gültigen/ungültigen/allen
Artikeln.

5 years agoRelease 3.5.4 release-3.5.4
Bernd Bleßmann [Wed, 7 Aug 2019 10:13:47 +0000 (12:13 +0200)]
Release 3.5.4

5 years agoChangelog auf Release 3.5.4; Bugfixes ergänzt
Bernd Bleßmann [Wed, 7 Aug 2019 10:07:53 +0000 (12:07 +0200)]
Changelog auf Release 3.5.4; Bugfixes ergänzt

5 years agolocales-Lauf english
Bernd Bleßmann [Wed, 7 Aug 2019 09:59:18 +0000 (11:59 +0200)]
locales-Lauf english

5 years agoVergessene hidden Abteilung für Ein/Verkauf->Berichte->Lieferscheine
Bernd Bleßmann [Tue, 6 Aug 2019 10:41:27 +0000 (12:41 +0200)]
Vergessene hidden Abteilung für Ein/Verkauf->Berichte->Lieferscheine

5 years agoPTC: zur Margenberechnung die Nettozeilensumme nehmen.
Bernd Bleßmann [Mon, 29 Jul 2019 14:23:47 +0000 (16:23 +0200)]
PTC: zur Margenberechnung die Nettozeilensumme nehmen.

So ist der Verhalten in den anderen (alten) Masken. Sonst ergeben sich
unterschiedliche Werte in den verschiedenen Masken, wenn
"Steuer im Preis inbegriffen" gewählt ist.

5 years agoTask-Server: Exceptions als Warnung loggen, nicht als Debugmeldung
Moritz Bunkus [Mon, 29 Jul 2019 13:34:59 +0000 (15:34 +0200)]
Task-Server: Exceptions als Warnung loggen, nicht als Debugmeldung

5 years agoDB-Upgrade-Skripte: Falsche Abhängigkeit 3.5.2 -> 3.5.4 korrigiert
Jan Büren [Mon, 29 Jul 2019 13:18:32 +0000 (15:18 +0200)]
DB-Upgrade-Skripte: Falsche Abhängigkeit 3.5.2 -> 3.5.4 korrigiert

3.5.3 -> 3.5.4

5 years agoRelease 3.5.4-beta1
Jan Büren [Sat, 27 Jul 2019 05:46:33 +0000 (07:46 +0200)]
Release 3.5.4-beta1

5 years agoChangelog auf Release 3.5.4-beta gesetzt
Jan Büren [Sat, 27 Jul 2019 05:46:09 +0000 (07:46 +0200)]
Changelog auf Release 3.5.4-beta gesetzt

5 years agoDokumentation: Release auf 3.5.4 gesetzt
Jan Büren [Sat, 27 Jul 2019 05:42:59 +0000 (07:42 +0200)]
Dokumentation: Release auf 3.5.4 gesetzt

5 years agoDatenbank-Upgrade-Skripte für die 3.5.4
Jan Büren [Sat, 27 Jul 2019 05:40:56 +0000 (07:40 +0200)]
Datenbank-Upgrade-Skripte für die 3.5.4

5 years agogenerische LS-E-Mail auch in Stammdaten editieren ...
Jan Büren [Wed, 13 Feb 2019 09:54:45 +0000 (10:54 +0100)]
generische LS-E-Mail auch in Stammdaten editieren ...

5 years agoController - alten unbenutzten Code entfernt
G. Richardson [Tue, 4 Jun 2019 11:34:02 +0000 (13:34 +0200)]
Controller - alten unbenutzten Code entfernt

5 years agoSL::Dev::Inventory - Typo und Formatierung
G. Richardson [Wed, 20 Feb 2019 12:20:08 +0000 (13:20 +0100)]
SL::Dev::Inventory - Typo und Formatierung

descriptin -> description

lange Zeilen in mehrere Zeilen umformatiert

5 years agoTypo in POD
G. Richardson [Mon, 11 Mar 2019 13:16:58 +0000 (14:16 +0100)]
Typo in POD

5 years agoTypo in POD
G. Richardson [Mon, 11 Mar 2019 13:16:05 +0000 (14:16 +0100)]
Typo in POD

5 years agoDBConnect POD Typo
G. Richardson [Mon, 25 Feb 2019 11:06:20 +0000 (12:06 +0100)]
DBConnect POD Typo

5 years agoungenutzte Spalte "ranking" aus Tabelle "payment_terms" entfernt
G. Richardson [Wed, 6 Feb 2019 13:55:54 +0000 (14:55 +0100)]
ungenutzte Spalte "ranking" aus Tabelle "payment_terms" entfernt

Überbleibsel aus uraltem Zahlungsbedingungsfeature

5 years agoaction Name in POD aktualisiert
G. Richardson [Fri, 1 Feb 2019 09:36:22 +0000 (10:36 +0100)]
action Name in POD aktualisiert

5 years agoSL::DB _register_db Passwort aus $type herausfiltern
G. Richardson [Tue, 19 Feb 2019 12:17:47 +0000 (13:17 +0100)]
SL::DB _register_db Passwort aus $type herausfiltern

Es wurde nach dem falschen String gefiltert.

5 years agoEB/SB Buchungen minimale Kindersicherung für Datumswerte
Jan Büren [Wed, 24 Jul 2019 07:45:35 +0000 (09:45 +0200)]
EB/SB Buchungen minimale Kindersicherung für Datumswerte

Die Funktion lässt den Nutzer zuviele Freiheiten ;-(
Ausreichend wäre es nur ein Datum (vgl. sql-ledger yearend) eingeben
zu lassen und das Folgedatum ist dann automatisch der nächste Tag.

5 years agoKontoauszug verbuchen rückgängig: Mitarbeiter in history protokollieren
Jan Büren [Tue, 23 Jul 2019 07:15:28 +0000 (09:15 +0200)]
Kontoauszug verbuchen rückgängig: Mitarbeiter in history protokollieren

5 years agoKontoauszug rückgängig machen: Nur bei aktuellem Beleg arap.paid neu setzen
Jan Büren [Tue, 23 Jul 2019 07:04:41 +0000 (09:04 +0200)]
Kontoauszug rückgängig machen: Nur bei aktuellem Beleg arap.paid neu setzen

5 years agoHintergrundjobs: einmalige Jobausführung: Daten übergeben können
Moritz Bunkus [Mon, 22 Jul 2019 09:36:59 +0000 (11:36 +0200)]
Hintergrundjobs: einmalige Jobausführung: Daten übergeben können

Entweder, man übergibt `data` als Parameter in
URI-Hash-Form (z.B. '&data.var=value'), als normaler YAML-encodierter
String, so wie er auch in der Datenbank
steht (z.B. '&data=---%0Avar%3Dvalue'), oder man übergibt
JSON-encodierte Daten in
`json_data` (z.B. '&json_data=%7B%22var%22%3A%22value%22%7D`).

5 years agoMahnungs-Tabelle: Fremdschlüsselverknüpfung auf Rechnungstabelle Part 2
Moritz Bunkus [Fri, 19 Jul 2019 13:50:04 +0000 (15:50 +0200)]
Mahnungs-Tabelle: Fremdschlüsselverknüpfung auf Rechnungstabelle Part 2

5 years agoMahnungs-Tabelle: Fremdschlüsselverknüpfung auf Rechnungstabelle
Moritz Bunkus [Fri, 19 Jul 2019 13:16:25 +0000 (15:16 +0200)]
Mahnungs-Tabelle: Fremdschlüsselverknüpfung auf Rechnungstabelle

5 years agoDateTime: Funktionen zum Parsen von YYYY:MM:DD und YYYY:MM:DDTHH:MM:SS
Moritz Bunkus [Fri, 19 Jul 2019 08:08:38 +0000 (10:08 +0200)]
DateTime: Funktionen zum Parsen von YYYY:MM:DD und YYYY:MM:DDTHH:MM:SS

5 years agoHintergrundjobs: Controller-Action zur einmaligen Ausführung eines Jobs
Moritz Bunkus [Thu, 18 Jul 2019 11:46:36 +0000 (13:46 +0200)]
Hintergrundjobs: Controller-Action zur einmaligen Ausführung eines Jobs

Gedacht für Aufruf von extern, gibt JSON zurück. Beispiel:

curl --silent  --user "<username>:<password>" \
  'https://<hostname>/kivitendo/controller.pl?action=BackgroundJob/execute_class&class=CleanAuthSessions'

5 years agoCVars: bei Gültigkeitswechsel aktuellen Wert nicht speichern
Moritz Bunkus [Thu, 18 Jul 2019 08:31:12 +0000 (10:31 +0200)]
CVars: bei Gültigkeitswechsel aktuellen Wert nicht speichern

Wenn man in den Artikelstammdaten eine CVar von ungültig auf gültig
umschaltet, so ist in dem Moment die CVar-Input im Formular nicht
enthalten, sondern nur die Gültigkeits-Checkbox. Wenn dann im Backend
der aktuelle Wert der CVar in die DB gespeichert wird, weil die CVar
ja ab dem Moment gültig ist, so ist der Wert dementsprechend leer
bzw. 0 für numerische Typen.

Der Effekt ist, dass beim nächsten Laden der CVar ein Wert in der DB
steht (leer/0), und dass dieser Wert vorausgewählt ist und nicht der
Standardwert aus der Konfiguration.

Daher sorgt diese Änderung dafür, dass in so einem Fall der aktuelle
CVar-Wert schlicht gar nicht in die DB geschrieben wird. Genauer:

Wenn das Speichern der Gültigkeit gewünscht wird, so wird der Wert nur
dann geschrieben, wenn die CVar sowohl vor dem Speichern als auch nach
dem Speichern gültig ist, sie also weder gerade aktiviert noch gerade
deaktiviert wird. Andernfalls wird die CVar in der DB nicht vorhanden
sein.

5 years agoEinkauf/Verkauf: Bemerkungsfelder gleich groß anzeigen
Moritz Bunkus [Wed, 17 Jul 2019 10:17:16 +0000 (12:17 +0200)]
Einkauf/Verkauf: Bemerkungsfelder gleich groß anzeigen

5 years agoEinkaufsrechnungen: Projektauswahl gefixt
Moritz Bunkus [Wed, 17 Jul 2019 13:59:34 +0000 (15:59 +0200)]
Einkaufsrechnungen: Projektauswahl gefixt

5 years agoEinkauf/Verkauf: keine Validierung bei Update-Button
Moritz Bunkus [Wed, 17 Jul 2019 13:48:13 +0000 (15:48 +0200)]
Einkauf/Verkauf: keine Validierung bei Update-Button

Andernfalls wird z.B. erzwungen, dass die Vorgangsbezeichnung
eingegeben ist, bevor der Update-Button betätigt wird. Das betrifft
auch den Kundenwechsel, der ein automatisches Update triggert, was
wiederum die Validierung triggert.

Wichtig bzgl. Validierung ist letztlich nur, dass die Werte zum
Zeitpunkt des Speicherns gültig sind, egal ob explizites
(»Speicher«, »Als neu speicher«) oder implizites Speichern (»Drucken«,
»E-Mail« etc.).

5 years agoLaTeX: openin_any weniger restriktiv
Moritz Bunkus [Tue, 16 Jul 2019 12:26:29 +0000 (14:26 +0200)]
LaTeX: openin_any weniger restriktiv

Die Einstellung openin_any aus texmf.cnf (oder der Umgebungsvariable
gleichen Namens) kontrolliert, aus welchen Pfaden (PDF)LaTeX
Quelldateien liest: a = any liest aus beliebigen Verzeichnissen, r =
restricted nicht aus Dot-Verzeichnissen und p = paranoid nur aus
dem Ausgabeverzeichnis und seinen Unterverzeichnissen.

Bei kivitendo ist das Ausgabeverzeichnis …/users, die Vorlagen liegen
in …/templates/…, sind also keine Unterverzeichnisse. Aktuelle
LaTeX-Versionen (zumindest ab TeXLive 2019.5…) wenden das nun strikt
an, was dazu führt, dass z.B. das Einbinden von Bildern nicht möglich
ist, wenn die Bilder in …/templates/… anstelle von …/users liegen —
sogar obwohl …/templates/… in $TEXINPUTS enthalten ist.

An dieser Stelle ist zu viel Sicherheit falsch bzw. für unser
aktuelles Layout falsch.

Eine andere mögliche Variante wäre, die LaTeX-Abhandlung direkt in
…/templates anstelle von …/users uz machen. Das erfordert aber
potenziell Eingriff durch den SysAdmin, um Verzeichnisrechte anders zu
setzen. Daher wird das erst mal nicht gemacht.

5 years agoPart-Controller: Kosmetik
Bernd Bleßmann [Thu, 11 Jul 2019 11:30:48 +0000 (13:30 +0200)]
Part-Controller: Kosmetik

5 years agoPart-Controller: Gültigkeit von CVars richtig speichern
Bernd Bleßmann [Thu, 11 Jul 2019 11:30:17 +0000 (13:30 +0200)]
Part-Controller: Gültigkeit von CVars richtig speichern

Das behebt den Bug, dass sich CVars in den Warenstammdaten nicht mehr
ungültig/gültig gesetzt werden konnten.

5 years agoRevert "CVars: in Artikelstammdaten sind alle CVars gültig"
Bernd Bleßmann [Thu, 11 Jul 2019 11:29:36 +0000 (13:29 +0200)]
Revert "CVars: in Artikelstammdaten sind alle CVars gültig"

This reverts commit ab45df2fa087f4b754ef02f238557ab0e28a676b.

CVars in den Warenstammdaten sind nicht immer gültig. Das Problem hier war,
dass das Speichern des Gültig-Flags durch einen anderen Bug nicht funktionierte,
und so Variablen, die als Voreinstellung deaktiviert waren, nicht mehr geändert
werden konnten (auch nicht auf aktiviert/gültig gesetzt werden).
Der Fix für diesen anderen Bug kommt gleich.

5 years agoUpgrade-Datei: Hinweis auf: Task-Server berücksichtigt Memory-Limit
Bernd Bleßmann [Wed, 10 Jul 2019 11:02:22 +0000 (13:02 +0200)]
Upgrade-Datei: Hinweis auf: Task-Server berücksichtigt Memory-Limit

5 years agoChangelog: Task-Server berücksichtig Memory-Limit
Bernd Bleßmann [Wed, 10 Jul 2019 10:56:19 +0000 (12:56 +0200)]
Changelog: Task-Server berücksichtig Memory-Limit

5 years agoDokumentation: Task-Server: Hinweise auf Memory-Limit und Restart (systemd)
Bernd Bleßmann [Wed, 10 Jul 2019 10:41:04 +0000 (12:41 +0200)]
Dokumentation: Task-Server: Hinweise auf Memory-Limit und Restart (systemd)

Ausserdem alle "Taskserver" durch "Task-Server" ersetzt.

5 years agoTask-Server: Debug-Meldung, falls Beendigung wg. Memory-Limit.
Bernd Bleßmann [Wed, 10 Jul 2019 10:40:49 +0000 (12:40 +0200)]
Task-Server: Debug-Meldung, falls Beendigung wg. Memory-Limit.

5 years agomemory_usage_is_too_high von Dispatcher nach System::Process verschoben
Sven Schöling [Mon, 4 Mar 2019 15:59:55 +0000 (16:59 +0100)]
memory_usage_is_too_high von Dispatcher nach System::Process verschoben

(cherry picked from commit c0e3364a21b2da1c61564ddb8d9afa5ab6489f9c)

5 years agotask_server.pl: Speicherlimit beachten
Sven Schöling [Mon, 4 Mar 2019 15:43:35 +0000 (16:43 +0100)]
task_server.pl: Speicherlimit beachten

(cherry picked from commit 7fcf2ca9960d160419aa89824cb4fb3a25188ad9)

5 years agoDokumentation: Andere Pakete an zentraler Stelle bündeln
Jan Büren [Tue, 9 Jul 2019 10:34:23 +0000 (12:34 +0200)]
Dokumentation: Andere Pakete an zentraler Stelle bündeln

Viele Admins überlesen die Notiz, dass postgresql-contrib noch
benötigt wird, wenn die Info 'nur' im Kapitel Datenbank steht.
Kapitel 2.2.3 unterhalb der Perl-Pakete kurz gebündelt und alle
notwendigen nicht Perl Pakete dort mit einem Installationsbefehl gesetzt.

5 years agoDokumentation: weitere Anpassung für openSUSE
Michael Kruschinsky [Tue, 9 Jul 2019 10:20:10 +0000 (12:20 +0200)]
Dokumentation: weitere Anpassung für openSUSE

5 years agoSuSE Installations-Doku überarbeitet
Michael Kruschinsky [Sun, 7 Jul 2019 16:58:57 +0000 (18:58 +0200)]
SuSE Installations-Doku überarbeitet

5 years agoBugfix: Brieffunktion prüft im Einkauf auf Verkaufsbriefrechte
Jan Büren [Fri, 5 Jul 2019 12:24:00 +0000 (14:24 +0200)]
Bugfix: Brieffunktion prüft im Einkauf auf Verkaufsbriefrechte

Ternärer Operator für Fallunterscheidung
(is_sales or is_not_very_much_sales)

5 years agoAuftrags-Controller: item-ids nach Speichern richtig setzen
Bernd Bleßmann [Fri, 5 Jul 2019 12:07:15 +0000 (14:07 +0200)]
Auftrags-Controller: item-ids nach Speichern richtig setzen

Vergessen, den idx in jedem Fall weiterzuzählen. Dadurch konnte es passieren,
das Positionen aus dem Auftrag gelöscht und evtl. Langtexte und Werte der
2. Zeile falsch zugeordnet wurden.

Nachtrag zu:
commit 7749e0e61e5d431a59e33cf497addf9ad682b8af
Author: Bernd Bleßmann <bernd@kivitendo-premium.de>
Date:   Wed May 15 15:18:21 2019 +0200

    OrderController: nach Speichern hiddens der ids wieder setzen, …

    … falls die Makse nicht neu geladen wird.

5 years agoBenutzereinstellungen für Höhe des Scrollbereichs f. Positionen …
Bernd Bleßmann [Fri, 28 Jun 2019 14:27:20 +0000 (16:27 +0200)]
Benutzereinstellungen für Höhe des Scrollbereichs f. Positionen …

… im neuen Auftrags-Controller

5 years agoAuftrags-Controller: Einstellungen/Höhe des Scrollbereichs berücksichtigen …
Bernd Bleßmann [Fri, 28 Jun 2019 14:25:57 +0000 (16:25 +0200)]
Auftrags-Controller: Einstellungen/Höhe des Scrollbereichs berücksichtigen …

… für den Positionsbereich

5 years agoUserPreferences-Helper f. Scrollbar-Einstellungen in Belegen
Bernd Bleßmann [Fri, 28 Jun 2019 14:24:08 +0000 (16:24 +0200)]
UserPreferences-Helper f. Scrollbar-Einstellungen in Belegen

Hier kann die Höhe des scrollbaren Postitionsbereichs im neuen
Auftrags-Controller abgelegt werden.

5 years agoChangelog (Bei DB Verwendungszweck)
Jan Büren [Mon, 17 Jun 2019 09:07:40 +0000 (11:07 +0200)]
Changelog (Bei DB Verwendungszweck)

5 years agoKontoauszug verbuchen, bei DB Verwendungszweck übernehmen
Jan Büren [Mon, 17 Jun 2019 09:06:31 +0000 (11:06 +0200)]
Kontoauszug verbuchen, bei DB Verwendungszweck übernehmen

Dialogbuchungen aus Kontoauszugs-Import erstellen,
der Verwendungszweck wird in die Beschreibung übernommen

5 years agoDialogbuchungen aus Bankimport nicht stornieren
Jan Büren [Sat, 15 Jun 2019 08:12:02 +0000 (10:12 +0200)]
Dialogbuchungen aus Bankimport nicht stornieren

Die acc_trans_ids werden hier auch noch gelöscht und
neu geschrieben. Die Verknüpfungs-Info gehen entsprechend kaputt.
Solange die Periode noch nicht geschlossen ist, ist ein Neuverbuchen
der Bankbewegung wesentlich sinnvoller.

5 years agoPartPicker: auch nach ungültigen oder allen Artikeln suchen können.
Bernd Bleßmann [Sun, 9 Jun 2019 13:46:58 +0000 (15:46 +0200)]
PartPicker: auch nach ungültigen oder allen Artikeln suchen können.

Dazu kann ein Parameter "status" (active/obsolete/all) übergeben werden.
Ohne diesen Parameter ist das Verhalten wie zuvor (nur gültige).

5 years agoWiederkehrende Rechnungen: Druckvorlage nach Auftragssprache auswählen
Moritz Bunkus [Thu, 6 Jun 2019 14:20:48 +0000 (16:20 +0200)]
Wiederkehrende Rechnungen: Druckvorlage nach Auftragssprache auswählen

Bisher wurde immer die Standarddruckvorlage genutzt und die im Auftrag
und damit der Rechnung eingestellte Sprache komplett ignoriert.

Weiterhin wird der Dateiname des Anhangs nach der eingestellten
Sprache gesetzt. Das funktioniert nur, wenn die in kivitendo
konfigurierten Sprachen dieselben Sprachkürzel nutzen, wie kivitendos
Übersetzungen selber heißen (also »de« und »en«).

5 years agoLXDebug: fix level2string für diverse Level, inklusive WARN()
Moritz Bunkus [Thu, 6 Jun 2019 14:07:14 +0000 (16:07 +0200)]
LXDebug: fix level2string für diverse Level, inklusive WARN()

5 years agoTask-Server: CLI-Option zur Ausführung eines einzelnen Jobs
Moritz Bunkus [Thu, 6 Jun 2019 13:54:59 +0000 (15:54 +0200)]
Task-Server: CLI-Option zur Ausführung eines einzelnen Jobs

Führt einen einen bestimmten Job exakt einmal aus, egal, ob der Job
aktiv ist oder was sein nächstes Ausführungsdatum ist. Anschließend
beendet sich der Task-Server wieder.

Das Argument ist die Datenbank-ID aus Tabelle »background_jobs«.

Beispiel:

./scripts/task_server.pl debug --run-job=42

5 years agoAdmin-Controller: Anlegen der Vollzugriffs-Gruppe gefixt
Moritz Bunkus [Thu, 6 Jun 2019 10:29:59 +0000 (12:29 +0200)]
Admin-Controller: Anlegen der Vollzugriffs-Gruppe gefixt

Nach dem Anlegen einer neuen Auth-DB und neuer Session-Tabellen sollte
eigenlich auch eine Gruppe namens »Vollzugriff« angelegt werden, die
Zugriff auf alle Funktionen bekommt — wurde sie aber nicht.

Es gab gleich zwei Probleme mit dem Code:

1. Die Funktion »apply_dbupgrade_scripts« gab nach dem Anlegen der
   Session-Tabellen den Wert 1 zurück (im Sinne von »es wurden
   DB-Upgrade-Scripte angewandt«). Das hat der aufrufende Code aber
   als Gelegenheit genutzt, um den Request zu beenden, bevor der Code
   zur Prüfung, ob es schon Gruppen gibt, überhaupt ausgeführt wurde.

   Hintergrund ist, dass
   »SL::DBUpgrade2->apply_admin_dbupgrade_scripts« selber schon eine
   Webseite rendert und die aufrufende Funktion im Controller das dann
   nicht auch noch machen wollte.

   Doof nur, dass diese Funktion im Controller dann nie wieder
   aufgerufen wurde.

2. Der Test, ob es schon eine Gruppe gibt oder nicht, war falsch. Der
   Code sollte eigentlich eine beliebige Gruppe auslesen und der
   Variablen »$group« zuweisen. Was der Code aber gemacht hat, war eine
   Referenz auf ein leeres Array der Variablen zuzuweisen. Der
   nachfolgende Check auf »ist $group nicht gesetzt?« hat dann
   natürlich nicht gegriffen, denn auch eine leere Array-Referenz ist
   im Perl-Sinne wahr.

5 years agoAdmin-Controller: falscher Funktionsname für Auth-Variablen gefixt
Moritz Bunkus [Thu, 6 Jun 2019 10:27:14 +0000 (12:27 +0200)]
Admin-Controller: falscher Funktionsname für Auth-Variablen gefixt

Die Umstellung auf Auth-Handler mit Einführung der Möglichkeit, sich
auch über HTTP-Basic-Authentifizierung anzumelden, hat als Änderung
mitgebracht, dass die
Authentfizieriungsvariablen (z.B. »{AUTH}admin_password«) nicht mehr
in $::form verbleiben. Einige Controller benötigen diese aber;
z.B. der Admin-Controller, wenn es noch keine Auth-DB oder keine
Session-Tabellen gibt — denn dann ist die einzige Möglichkeit, das von
der Benutzer*in eingegebene Admin-Passwort über mehrere Requests zu
erhalten, es in der Form mitzuschleifen.

Der Admin-Controller war darauf auch schon vorbereitet — leider hatte
aber die Funktion, die diesen Umstand mitteilt, den falschen Namen und
wurde somit niemals aufgerufen.

Dies ist der zweite Teil des Fixes von #376.

5 years agoSessionValue: damit klarkommen, dass Auth-DB & Session-Tabellen nicht existieren
Moritz Bunkus [Thu, 6 Jun 2019 10:23:34 +0000 (12:23 +0200)]
SessionValue: damit klarkommen, dass Auth-DB & Session-Tabellen nicht existieren

Durch die Änderungen letztens, mit der Session-Werte auch bei parallel
laufenden kivitendo-Requests richtig erhalten bleiben, wurde
SessionValue so umgeschrieben, dass es davon ausgeht, dass sowohl die
Auth-DB als auch die Session-Tabellen immer existieren.

Dies ist jedoch während der Erstinstallation nicht der Fall. Diverse
Requests im Admin-Controller müssen ausgeführt werden können, damit
Auth-DB & Session-Tabellen über den Controller angelegt werden können.

Da der Admin-Auth-Handler aber auch mit Sessions funktionieren kann,
fragt er also Session-Werte ab; die wiederum versuchen,
SessionValue-Instanzen zu nutzen.

SessionValue prüft nun bewusst auf Präsenz der Session-Tabellen, bevor
es versucht, aus ihnen zu lesen.

Dies ist Teil des Fixes von #376.

5 years agoMailer: Encoding der Namen von Dateianhängen gefixt
Moritz Bunkus [Wed, 5 Jun 2019 15:02:47 +0000 (17:02 +0200)]
Mailer: Encoding der Namen von Dateianhängen gefixt

Email::MIME encodiert den Dateinamen, der im »Content-Disposition«-
Header enthalten ist, nicht selber. Daher muss der Aufrufer das
tun. Andernfalls kann es bei Nicht-ASCII-Zeichen dann dazu kommen,
dass das empfangene Mail-Programm diese in einem anderen Zeichensatz
interpretiert (z.B. ISO-8859-1), obwohl wir immer UTF-8 senden. Ein
Halleluja für Legacy-Standards.

Weiterhin gibt es einen subtilen Bug in Email::MIME. Eigentlich steht
der Dateiname ja bereits im »attributes«-Hash, das an
»Email::MIME->create()« übergeben wird. Hier könnte man den Dateinamen
schon encodiert reinschreiben.

Das funktioniert auch — aber nur manchmal. Intern scheint das Modul
über die Hash-Keys von »attributes« zu iterieren und je nachdem,
welche Keys es schon gesehen hat, das vom Aufrufer vorgenommene
Encoding rückgängig zu machen. Da die Hash-Key-Reihenfolge aber bei
jedem Aufruf von Perl zufällig gewählt wird, passiert es halt
manchmal, dass diese Keys bereits gesehen wurden und Email::MIME das
Encoding rückgängig macht.

Daher muss der »Content-Disposition«-Header unbedingt nach dem
Erzeugen mit »create« gesetzt werden. Dann lässt Email::MIME ihn auch
genau so, wie er sein soll.

5 years agoPeriodische Rechnungen: find_template-Aufruf gefit
Moritz Bunkus [Wed, 5 Jun 2019 12:55:17 +0000 (14:55 +0200)]
Periodische Rechnungen: find_template-Aufruf gefit

find_template gibt je nach Kontext (Skalar vs. Array) unterschiedliche
Dinge zurück. Innerhalb einer Hashzuweisung herrscht Array-Kontext,
und damit kann je nach Reihenfolge, in der die Hash-Parameter von Perl
ausgewertet werden, der gesamte Hashinhalt schrott sein.

5 years agoModule: weitere Anpassungen für Exception::Lite → Exception::Class
Moritz Bunkus [Wed, 5 Jun 2019 11:54:52 +0000 (13:54 +0200)]
Module: weitere Anpassungen für Exception::Lite → Exception::Class

5 years agoDruckvorlagen RB Syntax-Fix für notes (VK-Angebot)
Jan Büren [Tue, 28 May 2019 12:17:02 +0000 (14:17 +0200)]
Druckvorlagen RB Syntax-Fix für notes (VK-Angebot)

Ist aus Versehen mit der letzten Überarbeitung reingekommen.

5 years agoDoku: Apache 2.2 Direktiven entfernt
Jan Büren [Tue, 28 May 2019 09:52:02 +0000 (11:52 +0200)]
Doku: Apache 2.2 Direktiven entfernt

Der Hinweis für ältere Versionen ist ausreichend.
Entsprechend entfernt.

5 years agoDoku: ghostscript als Paket für LaTeX ergänzt
Jan Büren [Tue, 28 May 2019 07:45:48 +0000 (09:45 +0200)]
Doku: ghostscript als Paket für LaTeX ergänzt

Die Mahnungen benötigen dieses Paket

5 years agoSession Content: Query zum Einlesen gefixt
Moritz Bunkus [Mon, 20 May 2019 14:12:29 +0000 (16:12 +0200)]
Session Content: Query zum Einlesen gefixt

Operatorpräzedenz wurde falsch berücksichtigt.

5 years agoSession Content: Race condition gehoben
Sven Schöling [Wed, 17 Apr 2019 12:30:30 +0000 (14:30 +0200)]
Session Content: Race condition gehoben

Der ursprüngliche Mechanismus hat einfach nur alle Session Variablen
gespeichert und beim Session restore wieder geladen. Es hat sich aber
gezeigt, dass große Daten in der Session Requests deutlich langsamer
machen, also wurde das Flag auto_restore eingeführt. Session Werte, die
nicht automatisch benötigt werden, sollten dann nur bei Bedarf geladen
werden.

Um zu wissen welche Werte existieren wurden aber zum Start des
Requests einmal alle Werte aus der Sessiontabelle geholt, und am Ende
dieser Stand auch wieder hergestellt.

Unter ajax load kann es aber passieren, dass in der Zeit andere Requests
schon Werte eingepflegt haben die dabei gelöscht werden. Das führt dann
zu zufälligen Sessionabbrüchen oder Requestfehlern.

Jetzt werden am Anfang nur und ausschließlich die Daten geladen die auch
auto_restore sind, die dann auch gleich gelöscht werden. nur die Daten
die modifiziert werden, werden am Ende des Requests zurückgespeichert.

Es wäre toll gewesen dafür ein UPSERT zu nehmen, aber das scheitert
daran, dass das ein DB Upgrade auf auth braucht.

5 years agoOrderController: nach Speichern hiddens der ids wieder setzen, …
Bernd Bleßmann [Wed, 15 May 2019 13:18:21 +0000 (15:18 +0200)]
OrderController: nach Speichern hiddens der ids wieder setzen, …

… falls die Makse nicht neu geladen wird.

5 years agoOrderController: Kosmetik
Bernd Bleßmann [Wed, 15 May 2019 13:01:13 +0000 (15:01 +0200)]
OrderController: Kosmetik

5 years agoSessions: keine Prüfung der Quell-IP-Adresse
Moritz Bunkus [Tue, 14 May 2019 14:03:02 +0000 (16:03 +0200)]
Sessions: keine Prüfung der Quell-IP-Adresse

Wenn ein Hostname sowohl A- (IPv4) als auch AAAA-Records (IPv6)
aufweist, nutzen manche Reverse Proxies wie nginx mal IPv4, mal
IPv6. Dadurch prüft kivitendo manchmal (nämlich genau dann, wenn die
Verbindung über IPv4 reinkommt) die Quell-IP. Wurde die Session aber
initial über IPv6 erzeugt, so schlägt die Quell-IP-Prüfung natürlich
fehl.

Die Quell-IP-Prüfung liefert eh einen mehr als fragwürdigen Gewinn an
Sicherheit. Für IPv6, wo sich die Quell-Adresse aufgrund von Techniken
wie Privacy Extensions mitten in der Session ändern kann, haben wir
die Prüfung ja eh schon nicht mehr.

5 years agoDoku: Installations-Anmerkungen für Debian/Ubuntu ergänzt
Jan Büren [Wed, 10 Apr 2019 11:44:52 +0000 (13:44 +0200)]
Doku: Installations-Anmerkungen für Debian/Ubuntu ergänzt

5 years agoDoku: debian 10 getestet
Jan Büren [Wed, 10 Apr 2019 08:56:32 +0000 (10:56 +0200)]
Doku: debian 10 getestet

5 years agoDoku: fix copy-paste Fehler libyaml-perl
Jan Büren [Wed, 10 Apr 2019 08:45:39 +0000 (10:45 +0200)]
Doku: fix copy-paste Fehler libyaml-perl

5 years agoInstallation-Doku typo libdatetime-event-perl -> libdatetime-event-cron-perl
Jan Büren [Wed, 10 Apr 2019 08:31:30 +0000 (10:31 +0200)]
Installation-Doku typo libdatetime-event-perl -> libdatetime-event-cron-perl

5 years agoMerge branch 'f-bundled-perl-modules'
Moritz Bunkus [Fri, 5 Apr 2019 09:21:33 +0000 (11:21 +0200)]
Merge branch 'f-bundled-perl-modules'

5 years agoModule: Dokumentation angepasst
Moritz Bunkus [Fri, 5 Apr 2019 08:03:06 +0000 (10:03 +0200)]
Module: Dokumentation angepasst

5 years agoModule: implizite Anforderung auf Set::Crontab entfernt
Moritz Bunkus [Fri, 5 Apr 2019 07:57:25 +0000 (09:57 +0200)]
Module: implizite Anforderung auf Set::Crontab entfernt

kivitendo nutzt das Modul nicht direkt, sondern nur
DateTime::Event::Cron. Das nutzt Set::Crontab unter der Haube, weshalb
wir keine direkte Abhängigkeit deklarieren sollten.

5 years agoSL::DB::Cache nach SL::DB::Helper::Cache verschoben
Moritz Bunkus [Wed, 3 Apr 2019 15:14:20 +0000 (17:14 +0200)]
SL::DB::Cache nach SL::DB::Helper::Cache verschoben

Da es sich nicht um eine Mapping-Klasse einer Tabelle handelt, sollte
sie nicht direkt innerhalb von SL::DB liegen.

5 years agoTypo: Schwellenwert statt Schwellwert
Jan Büren [Wed, 3 Apr 2019 15:00:19 +0000 (17:00 +0200)]
Typo: Schwellenwert statt Schwellwert

5 years agoPDF::Table - fehlerhafte Headerbearbeitung ab Seite 2
Martin Helmling mh@waldpark.octosoft.eu [Mon, 4 Apr 2016 17:10:03 +0000 (19:10 +0200)]
PDF::Table - fehlerhafte Headerbearbeitung ab Seite 2

ab Seite 2 werden die benötigten Weiten der Spalten um die Zahl der Headerzeilen
nach hinten verschoben. Dann kommt es zu fehlenden Zeilenumbrüchen in manchen Zellen

Da Pushen von leerem Array führt zu diesem Fehler, d.h. es wird doppelt gepushed.
Dieser Fehler war schon in der alten PDF::Table

5 years agoPDF::Table - einige undefined warnings gefixt
Sven Schöling [Fri, 26 Feb 2016 09:19:28 +0000 (10:19 +0100)]
PDF::Table - einige undefined warnings gefixt

5 years agoPDF::Table: Warnungen und "-" Artefakte bei undef entfernt
Sven Schöling [Thu, 25 Feb 2016 17:59:45 +0000 (18:59 +0100)]
PDF::Table: Warnungen und "-" Artefakte bei undef entfernt

5 years agoPDF::Table: Zusätzliche header richtigrum anzeigen
Sven Schöling [Thu, 25 Feb 2016 17:54:44 +0000 (18:54 +0100)]
PDF::Table: Zusätzliche header richtigrum anzeigen

5 years agoPDF::Table: Prop Index korrekt indizieren
Sven Schöling [Thu, 25 Feb 2016 17:25:44 +0000 (18:25 +0100)]
PDF::Table: Prop Index korrekt indizieren

5 years agoPDF::Table: Proportional skalieren statt adaptiv
Sven Schöling [Thu, 25 Feb 2016 17:03:12 +0000 (18:03 +0100)]
PDF::Table: Proportional skalieren statt adaptiv

5 years agoPDF::Table: Rahmen bei umgebrochenen Zeilen in der korrekten Länge zeichnen.
Sven Schöling [Thu, 25 Feb 2016 15:38:41 +0000 (16:38 +0100)]
PDF::Table: Rahmen bei umgebrochenen Zeilen in der korrekten Länge zeichnen.