CSV-Import von Artikel hat nun für existierende Artikel folgende Optionen:
1. Eigenschaften von existierenden Einträgen aktualisieren
2. Eigenschaften von existierenden Artikeln aktualisieren / Nicht vorhandene überspringen
3. Preise von vorhandenen Artikeln aktualisieren
4. Preise von vorhandenen Artikel aktualisieren / Nicht vorhandene überspringen
5. Mit neuer Artikelnummer einfügen
6. Eintrag überspringen
Zusätzlich können nun Spalten "Lager","Lagerort" als Name oder ID eingelesen werden,
sowie Übersetzungen z.B. als 'description_EN' oder 'description_IT'.
Auch cvars können als 'cvars_<name>' importiert werden.
Ebenfalls sind weitere Bemerkungen an den einzelnen Importzeilen eingebaut.
Neuer Controller für AJAX Request
Verallgemeinern (Teile aus ustva.pl nach SL/USTVA.pm
elster_format angepasst
Die Formate der Steuernummern für Baden-Württemberg und Rheinland-Pfalz
sind in Geierlein anders als früher in taxbird
Geierlein auf gleichem Webserver
Da LocalStorage nur innerhalb einer Domaine funktioniert,
Wurde nun innerhalb Kivitendo der crome/content Baum von Geierlein installiert.
Also
cd geierlein/chrome/content
mkdir {kivitendoDocumentRoot}/geierlein
tar cf - * | tar xf - -C {kivitendoDocumentRoot}/geierlein
Natürlich gibt es auch Möglichkeiten, dies per alias-Config im apache2 zu machen
Konfigurerierbar in kivitendo.conf
Falls geierlein_path gestetzt ist das Feature enabled
Pfadnahme zeigt zu geierleinverzeichnis innerhalb des kivitendo Verzeichnisses
UStVa Einstellungen in Datenbank
Kein finanzamt.ini mehr sondern fa_bufa_nr in Defaults,
über diese BundesFinanzamtnummer greift man auf Finanzamt Rose-Objekt zu.
Das ist nun auch modifizierbar.
Nutzung von Rose,
Sonderfälle in stnr pattern (BaWü)
Falls keine Daten in Defaults wird ein ggf. vorhandenes finanzamt.ini gelesen
und die Daten von dort übernommen
Die Steuernummer wird nun nicht mehr in der Mandantenkonfig
sondern in den UStVa Einstellungen editiert
Bisher Keine Umstellung auf IBAN, BIC (ist dies notwendig?)
Übergabe ohne kz83
Geierlein berechnet das Ergebnis selbst,
es werden nun nur Eingangsbeträge übergeben
Jan Büren [Fri, 26 Aug 2016 15:45:39 +0000 (17:45 +0200)]
1. Version POD zu create_assembly
create_assembly wird transfer_assembly ersetzen.
Dies ist die erste Version alle aktuellen optionalen Verfahren
für 'Erzeugnis fertigen' zu ergänzen.
Aktuell offen ist die Liste der Parameter, sowie das
Verhalten bzgl. best_before
Moritz Bunkus [Thu, 18 Aug 2016 08:15:06 +0000 (10:15 +0200)]
Pflichtenheft: Zugriff auf nicht vorhandenes »visible_item« verhindern
Sind im Baum gerade Textblöcke ausgewählt, so liefert die Funktion
»visible_item« undef zurück, weil aktuell kein Item (= Abschnitt oder
Funktionsblock) sichtbar ist.
Wird in so einem Moment ein Abschnitt oder Funktionsblock per Drag &
Drop verschoben, so darf daher kein Zugriff auf Funktionen von
»visible_item« stattfinden. Die Prüfung, ob aktuell überhaupt Abschnitte
zu sehen sind, muss daher vorher erfolgen.
Moritz Bunkus [Thu, 18 Aug 2016 07:56:24 +0000 (09:56 +0200)]
Rechnungsmassenerstellen: keine DB-Transaktion um convert_to_invoice()
convert_to_invoice() macht selber intern bereits eine Transaktion auf;
daher ist die außen unnötig.
Weiterhin waren die Parameter merkwürdig übergeben:
• Für eine On-The-Fly-Unterscheidung für »diese Parameter« vs. »keine
Parameter« benötigt man keine sub; das geht einfach mit einem ternären
Operator.
• »Keine Parameter« drückt man nicht durch »undef« aus, sondern durch
die leere Liste »()«. Wird »undef« als einziger Parameter übergeben,
so wird in der Funktion de Facto das hier gemacht:
my %hash = (undef);
und das ergibt eine Warnung, dass eine Liste mit ungerader Anzahl von
Elementen in ein Hash umgewandelt werden soll.
Unterschiedliche Versionen von Text::CSV_XS geben beim Aufruf von
»error_diag« unterschiedliche Felder zurück: neuere geben mehr
zurück.
Es gibt aber einen Testcase, der das Fehler-Array auf exakte
Übereinstimmung prüft. Da sorgt also jegliches neu hinzugekommenes Feld
dafür, dass der Test fehlschlägt.
Also nur die Felder explizit an SL::Helper::Csv::Error übergeben, die
uns wirklich interessieren, und nicht das von »error_diag«
zurückgebebene Array 1:1 durchreichen.
Moritz Bunkus [Tue, 16 Aug 2016 14:54:19 +0000 (16:54 +0200)]
SL::DB::Part: Setter für type=assembly bzgl. inventory_accno_id fixen
inventory_accno_id muss für Typ »assembly« immer auf undef stehen. Das
testet auch der Testcase. »type« hat allerdings das Falsche gemacht,
wofür im Testcase versucht wurde, ein Workaround zu implementieren,
indem »inventory_accno_id« explizit überschrieben werden.
Leider schlug der Test manchmal fehl, trotz des Workarounds: je nachdem,
ob beim Anlegen (»new_assembly«) zuerst der Parameter für »type« oder
der für »inventory_accno_id« ausgeführt wurde. Die Reihenfolge der
Ausführung ist deswegen nicht deterministisch, weil in Perl das
Iterieren über Hashes gewollt nichtdeterministisch ist, um
Sicherheitsproblemen vorzubeugen.
Wir wandeln Funktionsparameter beim Anlegen von Rose-Objekten explizit
von Listen in Hashes (SL::DB::Object::assign_attributes); anschließend
wird über das Hash iteriert. Im konkreten Fall enthält das Hash sowohl
»type« als auch »inventory_accno_id«, und je Perls internem Seed
bzgl. der Hashiteration wurde mal die eine, mal die andere
Setter-Funktion zuerst ausgeführt.
Wenn mehrere Rechnungen ausgewählt werden, so verteilt der Algorithmus
schlicht den Betrag der Überweisungen auf die Rechnungen in der
Reihenfolge, in der die Rechnungen ausgewählt wurden. Dabei wird so
lange der volle offene Betrag bezahlt wie möglich, der Rest kommt auf
die folgende Rechnung.
Allerdings ist für das Programm nicht ersichtlich, welche Anteile
welcher Rechnungen des Kunden/Lieferanten tatsächlich damit beglichen
wurden.
Also muss verhindert werden, dass das passiert; eine Warnung genügt
nicht.
Moritz Bunkus [Tue, 16 Aug 2016 08:11:14 +0000 (10:11 +0200)]
Bankauszug: Transaktionsrichtung mit Belegrichtung abgleichen
Erhält man eine Zahlung, so darf man diese nur mit Belegen verbuchen
können, die Zahlungen in Empfangsrichtung bedingen: Verkaufsrechnungen
und Gutschriften im Einkauf.
Analog gilt das auch für ausgehende Zahlungen. Hier passen nur
Einkaufsrechnungen sowie Gutschriften von Verkaufsrechnungen.
Alle anderen Zuordnungen werden mit einem Fehler zurückgewiesen.
Moritz Bunkus [Mon, 15 Aug 2016 15:17:36 +0000 (17:17 +0200)]
Bankauszug verbuchen: Warnungen/Fehler anzeigen; pro Zeile eine DB-Transaktion
Das Verbuchen von Bankauszügen wird nun in Datenbanktransaktionen
gekapselt. Damit die BenutzerIn bei einem Fehler nicht alles erneut
einstellen muss, wird eine Datenbanktransaktion pro
Banktransaktion benutzt.
Treten dabei Warnungen oder Fehler auf, so werden diese nun in einer
Tabelle übersichtlich dargestellt. Die Tabelle enthält sowohl die Daten
der Banktransaktion, bei der das Problem auftrat (entfernte
Kontonummer/BIC, entferne KontobesitzerIn, Betrag, Transaktionsdatum),
als auch Links zu den mit dieser Transaktion verknüpften
Rechnungen. Damit wird die BearbeiterIn in die Lage versetzt, die Fehler
genauer zu analysieren.
Moritz Bunkus [Mon, 15 Aug 2016 14:42:59 +0000 (16:42 +0200)]
Payment-Helfer: with_transaction() anstelle von do_transaction() nutzen
»do_transaction()« kommt von Rose::DB selber. Es schert sich nicht
darum, ob bereits eine Transaktion läuft, sondern macht einfach eine mit
»BEGIN« auf. Am Ende der an »do_transaction()« übergebenen Sub committet
sie dann (oder macht einen Rollback).
Problematisch ist das dann, wenn in dem Moment bereits eine Transaktion
läuft und man eigentlich möchte, dass sowohl die externen Änderungen als
auch die von »pay_invoice()« durchgeführten Änderungen alle ganz oder
alle gar nicht committet werden. Genau das bietet
»SL::DB::with_transaction()«, das nur dann eine neue Transkation
startet, falls noch keine läuft, und den Code ansonsten direkt ausführt.
Anders als »do_transaction()« wertet »with_transaction()« den
Rückgabewert der übergebenen Sub aus. Ist dieser im Perl-Sinne false, so
wird ein Rollback durchgeführt — nicht nur bei einer Ausnahme. Daher
muss in diesem Fall unsere übergebene Sub zusätzlich einen wahren
Wert (hier: »1«) zurückgeben, um Erfolg zu signalisieren.
Sven Schöling [Thu, 4 Aug 2016 11:58:24 +0000 (13:58 +0200)]
Doku: PriceSource Verhalten für Belegumwandlungen
Wie beschrieben in redmine#199:
Wenn ein Kunde einen Kundenrabatt hat, und man aus einem Auftrag einen
Lieferantenauftrag macht, wird die active_discount_source der Artikel
(z.B. "customer_discount/1162") mit auf die Einkaufsseite des Workflows
übernommen, und das fliegt einem dann bei der EK-Rechnung um die Ohren.
Wahrscheinlich wäre es aber besser, beim Wechsel von VK zu EK die
Kundenrabatte und Kundenpreisregeln herauszufiltern, da diese nichts mit
den Vereinbarungen mit dem Lieferanten zu tun haben. Und dann sollten
bei den Positionen die Lieferantenregeln vorbelegt werden, so als ob man
den Auftrag händisch eingegeben hätte.
Jan Büren [Wed, 3 Aug 2016 12:55:24 +0000 (14:55 +0200)]
Workflow Lieferschein -> Rechnung. Kundenrabatt mit Nachkommastellen i.O.
Zu den weiteren lästigen Rabattfehlern nun auch noch der Fall,
wo der Workflow im Lieferschein beginnt und ein Kundenrabatt mit
Nachkommastellen existiert.
Jan Büren [Wed, 3 Aug 2016 12:50:44 +0000 (14:50 +0200)]
Rabatt mit Nachkommastellen Workflow Auftrag -> Rechnung
Ursprüngliche Idee von Waldemar in OD-Bugfixes hier: 3c705b61f32d81c41352fe
Getestet mit: Kundenrabatt, Individuellen-Rabatt, Preisregel-Rabatt
Sowie ferner ohne Rabatt und mit freiem Rabatt ohne Nachkommastellen
Jan Büren [Mon, 1 Aug 2016 13:50:15 +0000 (15:50 +0200)]
do.pl sort Funktion verbessert
parse_amount/format_amount Problem bei Nachkommastellen.
Hintergrund: Ein save mit no_redirect wird benötigt, damit
ein erneutes Update die Reihenfolge auch an der Oberfläche anzeigt.
Leider wird save somit zweimal aufgerufen und damit auch 2x parse_amount
Entsprechend zwischendrin einmal mit format_amount wieder ausgeglichen.
Sven Schöling [Thu, 21 Jul 2016 09:23:35 +0000 (11:23 +0200)]
Sicherheit: ReDoS in trim() umgehen.
trim hat bisher whitespace mit dem regex /^\p{WSpace}+|\p{WSpace}+$/
getrimmt. Der ist aber anfällig gegen große Mengen Whitespace in der
Mitte, weil dann das Backtracking in O(n²) läuft:
Für genau den Fall hat die Perl Engine aber Optimierungen, die bei
Regexes die rechts geankert sind einfach von hinten sucht. Die
funktionieren aber nur wenn einzeln gesucht wird. Also sind das jetzt
zwei separate Regexes.
Das Prüfen ob Lager das "Standard-Lager für Auslagern ohne Prüfung auf Bestand"
ist genügt nicht, es können Bauteile dieses Lager auch als Standardlager haben