Sven Schöling [Wed, 8 Aug 2012 14:48:47 +0000 (16:48 +0200)]
Parsing von multipart/formdata beschleuningt.
Die entsprechende Routine hatte einen bösen Fall von Shlemiel the Painter's
algorithm [1]. Dadurch wurden Fileuploads mit mehr als 20k Zeilen extrem
langsam. Binärdaten wie pdfs oder Bilder hat das nicht gestört, aber bei CSV
Imports hat eine 80k Zeilen Datei dann auch mal 2-5min gebraucht, nur um den
Request zu parsen.
Jetzt werden nur die Indizes geparst und hinterher direkt aus dem Request der
substr gezogen. Ausserdem endlich einen Testfall dafür eingebaut.
Sven Schöling [Thu, 2 Aug 2012 14:34:42 +0000 (16:34 +0200)]
Preview Mode bei Imports
Bei großen Imports interessieren einen meist nur die Fehler, oder die ersten
paar zeilen um zu sehen ob der Import so gut aussieht. Diese Modi sind jetzt
verfügbar.
Sven Schöling [Tue, 31 Jul 2012 12:43:30 +0000 (14:43 +0200)]
Warenimport bei grossen Datenbanken.
Der Warenimport hat bisher alle Waren ausgelesen und dann im Hash umsortiert.
Bei einer Datenbank mit 84k Waren hat das 22s gedauert, und 700MB
Arbeitsspeicher gefressen, das ist nicht zumutbar. Nun wird jeder Wert einzeln
aus der Datenbank gesucht.
G. Richardson [Thu, 26 Jul 2012 18:27:18 +0000 (20:27 +0200)]
Erzeugnis: lastcost-Konflikt für makemodel und Komponenten
Sowohl die EK-Preise der Erzeugnis-Komponenten als auch die EK-Preise
der makemodel-Versionen werden in $form->{lastcost_$i} gespeichert und
überlagern sich damit.
Und da diese auch noch im Hintergrund unterschiedlich
formatiert/geparsed werden kam es bei den Erzeugnis-EK-Preisen nach dem
Erneuern zu Formatierungsfehlern.
Da Erzeugnisse aber produziert und nicht eingekauft werden ist hier auch
kein makemodel nötig, so daß es für Erzeugnisse entfernt wurde.
Sven Schöling [Tue, 10 Jul 2012 11:22:57 +0000 (13:22 +0200)]
SelfTests
Es gibt jetzt ein Grundgerüst um Selbsttests durchzuführen, und bei Problemen
einen Administrator per Mail zu benachrichtigen. Die Selbsttests werden Über
das SelfTest Modul für den Taskserver verwaltet, und in config/lx_office.conf
im Block [self_test] konfiguriert. Die Tests werden in TAP ausgeliefert und
können bei Bedarf weiter maschinell ausgewertet werden.
Weitere Tests können von SL::BackgroundJob::SelfTest::Base abgeleitet werden.
Zur Demonstration gibt es einen Selbsttest Transactions, der die Datenbank
auf Fehlbuchungen untersucht.
Sven Schöling [Mon, 2 Jul 2012 13:58:12 +0000 (15:58 +0200)]
Keine Passwörter mehr in Sessions speichern.
Der vorherige Mechanismus hat Passwörter in der Session hinterlegt, um bei
jedem Request überprüfen zu können, ob die Zugriffsrechte immernoch bestehen.
Gedacht war das vor allem für LDAP Authetifizierung, wo der Admin den Zugang
eines Benutzers speichern konnte und das System das sonst nicht mitbekommt.
Ein großes Problem was daraus entsteht ist, dass das Passwort auch akzeptiert
wird, wenn die gehashte Version übergeben wird, weil zur Überprüfungszeit nicht
mehr festgestellt werden kann, ob das gehashte Passwort aus der Session kommt
oder vom User.
Diese Änderung sorgt dafür, dass Passwörter weder im Klartext, noch crypted in
der Session gespeichert werden, sondern der Authetifizierungsstatus.
Eine Session bleibt jetzt eutentifiziert, auch wenn zwischendurch das Passwort
geändert wird. Lokal wird das später abgefangen werden, dass Sessions
invalidiert werden, wenn der Admin das Passwort ändert, im LDAP ist es garnicht
mehr der Fall. Auf der positiven Seite reduziert das den load auf dem LDAP
Server, weil nicht mehr für jeden Request ein Bind passieren muss.
Da die Passwörter nicht mehr verglichen werden müssen, werden gehashte
Passwörter jetzt nicht mehr akzeptiert. Jedes Passwort wird vor dem Vergleichen
unkonditional gehasht.
Die Backend Routinen erkennen jetzt wenn garkein Passwort übergeben wurde, und
triggern dafür den 5s Penalty nicht. Das macht das Aufrufen der Administration
das erste Mal wie erwartet schneller.
Moritz Bunkus [Fri, 22 Jun 2012 08:30:00 +0000 (10:30 +0200)]
Primärschlüsselspaltennamen aus Meta-Informationen holen
Benutzerdefinierte Variablen verweisen auf die Primärschlüsselspalte
ihrer Bezugstabelle. Dieser Spaltenname kann beim Helper mit der
Option 'id' überschrieben werden. Allerdings defaultete er vorher auf
'id', was für viele Tabellen stimmte, nicht aber z.B. für 'contacts',
wo es die Spalte 'cp_cv_id' ist.
Für 'contacts' passierte dann Folgendes, wenn man
'$contact->custom_variables' aufrief:
Die Funktion 'custom_variables' ist eine one-to-many-Relation, sie
erfordert also einen DB-Zugriff. Dafür wird die Spaltenbeziehung
'cvar.trans_id == contacts.primary_key_column_name' herangezogen. Der
'primary_key_column_name' ist nicht angegeben, Defaultwert ist
'id'. RDBO versucht also, die Spalte 'id' aus dem Objekt '$contact'
auszulesen, mappt dafür den Spaltennamen auf den Methodennamen dafür.
Dieses Mapping liefert den leeren String. Das überprüft RDBO in dem
Moment aber nicht, sondern ruft "$object->$method()" auf. Das wirft
eine Exception, RDBO fängt diese ab, überprüft dann, ob '$AUTOLOAD'
einen Paketnamen enthält. Und dann kommt diese wenig erhellende
Fehlermeldung heraus:
Can't locate object method "Contact::" via package "SL::DB" at /usr/share/perl5/Rose/DB/Object.pm line 1646
G. Richardson [Tue, 19 Jun 2012 16:50:02 +0000 (18:50 +0200)]
Bug 1926 - Zufälliger Dateiname für PDF Spooldateien
Beim Erstellen der Spooldatei beim Warteschlangendruck den Dateinamen per
File::Temp::tempfile erstellen. Die bisherige Kombination aus time und PID hat
PDF-Dateien überschrieben, wenn zwei Spooldateien in der gleichen Sekunde
erstellt wurden.
Beispiel alter Spoolname: 134012447722563.pdf
Beispiel neuer Spoolname: kivitendo-spoolJKuGZM.pdf
Jan Büren [Tue, 19 Jun 2012 13:57:39 +0000 (15:57 +0200)]
Buchungsjournal: Feld Referenz in Referenz / Rechnungsnummer umbenannt
Ferner noch drei Sachen übersetzt und entsprechend eine deutsche Übersetzung angelegt.
Hintergrund: Referenz ist irreführend, da bei Verkaufs- und Einkaufsbelegen dieses
Feld in der Maske nicht vorkommt, sondern in dem Fall die Rechnungsnummer gemeint ist.
Referenz kommt allerdings bei Dialogbuchungen genauso vor.
G. Richardson [Wed, 13 Jun 2012 10:05:57 +0000 (12:05 +0200)]
Verkaufsbericht: numerische Sortierung bei Monat
Die alte Abfrage hat im Modus Monat/Ware die Artikel nicht korrekt zusammengefasst
Statt Sortierung nach Monatsname/Rechnungsdatum/Artikelname jetzt einfach Monatsnummer/Artikelname
G. Richardson [Tue, 12 Jun 2012 13:08:34 +0000 (15:08 +0200)]
Verkaufsberichtsortierung um Land, Warengruppen, Kundentyp, Verkäufer und Monat erweitert
Hauptsortierung und Untersortierung sind jetzt nicht mehr auf Ware und Kunde
begrenzt, sondern man kann eine Kombinationen erstellen aus:
* Kunde
* Ware
* Land
* Warengruppe
* Kundentyp
* Verkäufer
* Monat
Es kann jetzt auch nach benutzerdefinierten Variablen gefiltert werden.
Der Verkaufsbericht spaltet sich mit seinen Optionen langsam in zwei
unterschiedliche Bereiche auf, den Artikelmodus, wo die einzelnen Zeilen aus
invoice angezeigt werden, und den Rechnungsmodus, wo nur die Zeilen der
Zwischensummen und Summen angezeigt werden, und die Detailinformationen
aus invoice nur stören.
Default ist Rechnungsmodus, den Artikelmodus kann man per Häkchen auswählen.
Je nachdem auf welcher Ebene man sich befindet machen dann auch Informationen
wie "Durchschnittsverkaufspreis" keinen Sinn mehr.
Bei Zuordnungen wo die Sortierung keinen Wert hat (z.B. Sortierung nach Land,
aber beim Kunden ist kein Land hinterlegt), erscheint als Überschrift "leer",
und alle leeren Werte werden als eine Gruppe zusammengefasst.
Sven Schöling [Fri, 11 May 2012 09:26:49 +0000 (11:26 +0200)]
Bug in CT: SQL Fehler wenn es keine Ansprechpartner gibt aber CVars für Ansprechpartner angelegt wurden. gibt aber CVars für Ansprechpartner angelegt wurden.
Bernd Blessmann [Thu, 10 May 2012 19:37:41 +0000 (21:37 +0200)]
CVars: Options für textfield und text mit den configs setzen.
Sonst gehen diese in den Belegen nach einem Erneuern verloren.
Zum Nachvollziehen: CVar von Typ Textfeld bei Waren anlegen und
in Belegen editierbar machen. Dann Beleg erstellen, Ware eingeben,
2. Zeile ansehen. Erneuern und nochmals 2. Zeile ansehen. Vor diesem
commit schrumpfte das Textfeld.
Weitestgehend mit der PepperShop identisch.
Sollte auch möglichst so bleiben!! Wenn möglich Änderungen am File erplib.php für beide/alle Shop anpassen.
Mehrwert: Artikel aus dem Shop in LxO importieren.
Waren und Lieferanten als benutzerdefinierte Variablen hinzugefügt.
Mit einfachen vendor_ und part_selectoren im L-Plugin, die das
select_tag verwenden. vc_limit wird nicht berücksichtigt und das
ganze ist nur rudimentär getestet.
Jan Büren [Thu, 26 Apr 2012 14:10:59 +0000 (16:10 +0200)]
Bugfix: Warenbericht Haken bei Angeboten oder Anfragen springt NUR zu Aufträgen
Die Callback-URL war nur mit sales_order, bzw. purchase_order zusammengebaut.
Entsprechend den Fall für Angebote (Verkauf, Einkauf) mit berücksichtigt.
Alle vier Fälle durchgetestet:
Sobald es sowohl eine Auftragsnummer, als auch eine Anfrage (Angebots)-Nummer gibt,
wird die Nummer nur noch als Info, nicht mehr
als Link dargestellt, taucht aber nochmal als Extra-Reihe ohne Auftrag auf.
Sven Schöling [Wed, 25 Apr 2012 12:03:54 +0000 (14:03 +0200)]
Bessere Erkennung von optionalen Paketen im Installationscheck
- IO::Socket::SSL wird jetzt als optional geführt.
Wird für LDAP Verbindungen gebraucht wenn TLS benutzt werden soll.
- Wenn Config::Std nicht gefunden wurde, und damit die Konfiguration nicht
eingelesen werden kann, wird Net::LDAP als optional geführt und eine Warnung
ausgegeben, dass evtl nicht aufgelöste Abhängigkeiten existieren.
Sven Schöling [Fri, 20 Apr 2012 14:03:07 +0000 (16:03 +0200)]
Suche nach Ansprechpartnern
Merge aus zwei verschiedenen Implementierungen der gleichen Funktionalität
Features:
- behandelt Ansprechparter als direkte Suchziele wie Kunden und Lieferanten (1)
- Suche ähnlich den bekannten Suchmasken (1)
- Suche nach direktem Suchwort (2)
- Verlinkung einer Schnellsuche in der menunew header Leiste (2)