Jan Büren [Mon, 16 Jan 2017 11:03:18 +0000 (12:03 +0100)]
SelfTests: check_overpayments verbessert
i)
chart_link muss nicht mehr über JOIN chart c c.link mit der
acc_trans vereint werden
ii)
Der Test hat keine sinnvollen Daten an den Benutzer zurück-
gegeben. Jetzt wird die Kunden- und die Rechnungsnummer gemeldet
iii)
Die Datenmenge nach aktuellem Geschäftsjahr zu filtern ist ent-
sprechend angepasst (aktuelle Zahlungen -> Analyse aller vorhergenden
Daten (trans_id) unabhängig vom Zeitraum).
Jan Büren [Mon, 16 Jan 2017 10:44:45 +0000 (11:44 +0100)]
false positive in SelfTests gefiltert (Periode)
Hintergrund:
Um nur die Daten-Analyse auf das aktuelle Geschäftsjahr (Geschäftsjahr gleich
Kalender-Jahr) zu machen, wird für die meisten Tests mit transdate == current_year
gefiltert.
Problem: Periodenübergreifende Buchungen (Zahlungsein- und -ausgänge) werden
nicht berücksichtigt und schlagen entsprechend Fehlarlam.
Optimierung: Es werden nur die Buchungen des aktuellen Geschäftsjahr angeschaut
und weitere acc_trans Daten ohne Zeitfilter über die trans_id gruppiert.
Vorrangig werden nun svg Dateien aus dem Verzeichnis ./image/icons/svg/*.svg verwendet.
Falls dort kein Icon auffindbar ist wird nach ./image/icons/16x16/*.png gesucht.
Es gibt seit langem ein svg Icon für den GoBD Export.
Das wird nun sichtbar. GGf anpassen.
Das Verzeichnis icon_svg wurde in icons/svg umbenannt.
Moritz Bunkus [Fri, 13 Jan 2017 12:53:34 +0000 (13:53 +0100)]
kivi.call_jquery: Funktion zum Aufrufen beliebiger jQuery-Funktionen
An vielen Stellen schicken wir vom Backend aus nur die Namen
aufzurufender JavaScript-Funktionen an den Browser. Der sucht dann die
auszuführende Funktion mittels »kivi.get_function_by_name« aus dem
Namensraum heraus und führt sie anschließend mit »func.apply(…)« aus.
Leider ist es damit nicht so einfach möglich, jQuery-Funktionen
auszuführen, da diese als »this«-Argument ein jQuery-fiziertes Objekt
erwarten. Außerdem geht ein »namespace("jQuery.fn.resetForm")« schlicht
nicht bzw. tut nicht das, was man erwartet.
Daher die Funktion »kivi.call_jquery«. Ihr übergibt man:
1. einen jQuery-Selektor, der das »this«-Argument der aufzurufenden
Funktion repräsentiert,
2. den Namen der aufzurufenden Funktion und
3. optional weitere Argumente.
Würde man z.B. einen Wert in einem Input setzen wollen, so sähe der
Aufruf in der Console so aus:
Interessant wird die Verwendung an Stellen, wo nur Funktionsnamen
übergeben werden dürfen, z.B. bei »call«-Actions bei der ActionBar. Hier
sähe z.B. eine Action zum Zurücksetzen einer Form wie folgt aus:
Moritz Bunkus [Fri, 13 Jan 2017 13:08:33 +0000 (14:08 +0100)]
kivi.submit_form_with_action: fügt Hidden-»action« mit Wert zu Form hinzu & submittet
Zuerst werden alle existierenden Inputs namens »action« entfernt, damit
sich die Inputs nicht ins Gehege kommen. Anschließend wird ein neues
Hidden namens »action« mit dem übergebenen Wert erstellt, der Form
hinzugefügt, und die Form wird über $(selector).submit() sumittet.
Moritz Bunkus [Wed, 11 Jan 2017 09:43:34 +0000 (10:43 +0100)]
PrintOptions-Helfer: sub opthash Paket-lokal anstelle von sub-lokal
Wir nutzen Named-Sub-in-Named-Sub nie, daher auch hier
nicht. Ursprünglich war die Funktion in bin/mozilla/io.pl, da ergab es
noch Sinn, um den Funktionsnamensraum nicht zu überladen. Aber nach dem
Verschieben in ein eigenes Paket ist das nicht mehr nötig.
Moritz Bunkus [Fri, 13 Jan 2017 10:27:38 +0000 (11:27 +0100)]
Mahnungen: Funktion »Diese Sprache verwenden« gefixt Teil 2
Wenn die Checkbox angehakt ist, so soll die Benutzer*in die Möglichkeit
haben, über die Druckoptionen einen Sprache für alle zu erzeugenden
Mahnungen auszuwählen. Ist die Checkbox aus, so wird die Sprache des
Kunden der jeweiligen Mahnung genommen, und dann muss die Sprachauswahl
deaktiviert werden.
Der erste Commit hat nur die Maske zum Erstellen neuer Mahnungen
abgedeckt. Dieser erledigt die Maske zum Anzeigen vorhandener Mahnungen.
Moritz Bunkus [Fri, 13 Jan 2017 10:09:54 +0000 (11:09 +0100)]
Mahnungen: Funktion »Diese Sprache verwenden« gefixt
Wenn die Checkbox angehakt ist, so soll die Benutzer*in die Möglichkeit
haben, über die Druckoptionen einen Sprache für alle zu erzeugenden
Mahnungen auszuwählen. Ist die Checkbox aus, so wird die Sprache des
Kunden der jeweiligen Mahnung genommen, und dann muss die Sprachauswahl
deaktiviert werden.
G. Richardson [Fri, 13 Jan 2017 09:26:31 +0000 (10:26 +0100)]
Part Controller - als neu speichern repariert
alle Buttons (Speichern, Als neu speichern, Löschen) setzen die action
selber (siehe js/kivi.Part.js) , die form braucht daher kein verstecktes
action für dispatch.
Moritz Bunkus [Thu, 12 Jan 2017 15:51:23 +0000 (16:51 +0100)]
Artikelsuche: Überschrift in Bericht wieder ergänzt
Es gibt inzwischen nur noch einen Menüpunkt für Artikelsuche, nicht mehr
einen pro Typ. Der Typ wird dann anhand von Checkboxen unterschieden.
Da dabei durchaus nach mehreren Typen gleichzeitig gesucht werden kann,
ergibt eine Unterscheidung der Überschrift nach zu suchendem Typ wenig
Sinn. Ergo wird als Überschrift immer »Artikel« genutzt.
Jan Büren [Thu, 12 Jan 2017 12:39:14 +0000 (13:39 +0100)]
Mahnungen: Metadaten der Mitarbeiter (Bearbeiter/Verkäufer) setzen
Vorher: salesman_name hat den Namen von employee_name bekommen. Weitere
Daten wurden nicht (mehr) gesetzt.
Aktuell: Jetzt werden die Metadaten von employee_ und salesman_ sauber
gesetzt und die Dokumentation ist entsprechend angepasst.
CAVEAT: Bei mehreren Rechnungen die zusammengefasst werden, werden nur beim
ersten Treffer (teilweise LIMIT 1 in SQL-Anweisungen) die entsprechenden
Daten gesetzt (Hinweis in Doku geschrieben).
Moritz Bunkus [Thu, 12 Jan 2017 10:43:50 +0000 (11:43 +0100)]
ChartPicker: Taskendrücke auf Shift, Ctrl & Alt ignorieren
Andernfalls wird schon beim Drücken eines der Modifier eine Suche
ausgelöst. Das kann besonders nervig sein, wenn man den Focus vom
Browser wegnimmt:
• Alt+Tab drücken, um zum anderen Fenster zu wechseln
• Schon bei Alt wird eine Suche ausgelöst.
• Durch den Focus-Verlust wird ein Blur-Event ausgelöst.
• Und schon ist der interne Zustand ungültig, und das Element wird rot
dargestellt.
Analoges passiert, wenn man z.B. mit Ctrl+F2 zu einem anderen virtuellen
Desktop wechselt.
Noch schlimmer ist, dass bei Shift+Tab ebenfalls zuerst eine Suche
ausgelöst und anschließend verhindert wird, dass der Focus das Element
verlässt.
Moritz Bunkus [Thu, 12 Jan 2017 09:57:13 +0000 (10:57 +0100)]
PartPicker: Taskendrücke auf Shift, Ctrl & Alt ignorieren
Andernfalls wird schon beim Drücken eines der Modifier eine Suche
ausgelöst. Das kann besonders nervig sein, wenn man den Focus vom
Browser wegnimmt:
• Alt+Tab drücken, um zum anderen Fenster zu wechseln
• Schon bei Alt wird eine Suche ausgelöst.
• Durch den Focus-Verlust wird ein Blur-Event ausgelöst.
• Und schon ist der interne Zustand ungültig, und das Element wird rot
dargestellt.
Analoges passiert, wenn man z.B. mit Ctrl+F2 zu einem anderen virtuellen
Desktop wechselt.
Noch schlimmer ist, dass bei Shift+Tab ebenfalls zuerst eine Suche
ausgelöst und anschließend verhindert wird, dass der Focus das Element
verlässt.
Moritz Bunkus [Wed, 11 Jan 2017 09:23:00 +0000 (10:23 +0100)]
LXDebug: bei SHOW_CALLER ersten Caller außerhalb von LXDebug.pm nehmen
Andernfalls wird beim Aufruf von z.B. »SL::Controller::CustomerVendor →
LXDebug::dump() → LXDebug::message()« fälschlicherweise
»LXDebug::dump()« als Caller ausgegeben. Das interessiert die Nutzer*in
aber im Zweifelsfall nicht, sondern »SL::Controller::CustomerVendor«.
Zusammengefasstes Listen von Ware,Erzeugnis,Dienstleistung und Sortimenten
Die Suchmaske für Ware,Erzeugnis,Dienstleistung und Sortiment gilt nun einheitlich für alle Artikeltypen,
deshalb wird nur noch eine Menueauswahl dazu angeboten
Dieses neue Attribut an Artikelklassifizierung erlaubt in Aufträgen und Rechnungen
bestimmte Artikel extra auszuweisen.
Dazu werden diese als extra Variable der Dokumentengeneierung zur Verfügung gestellt.
Siehe neue Dokumentation Kapitel 3.7
Hintergrund:
Preise von Artikeln wie "Verpackung" oder "Transport" müssen
oftmals separat ausgewiesen werden, genauso wie der reine Warenwert
Die Klassifizierung von Artikeln dient einer weiteren Gliederung um zum Beispiel den Einkauf vom Verkauf zu trennen, etc.
Gekennzeichnet durch eine Beschreibung (z.B. "Einkauf") und ein Kürzel (z.B. "E")
Flexibel änderbar und erweiterbar.
- Neue Datenbanktablle und Rose-Objekte, sowie Controller zum Bearbeiten der Tabelle
- Zwei-Zeichen Abkürzung:
Der Typ des Artikel und die Klassifizierung werden durch zwei Buchstaben dargestellt.
Der erste Buchstabe ist eine Lokalisierung des Typs des Artikel ('P','A','S') ,
deutch 'W', 'E', und 'D' für Ware Erzeugnis oder Dienstleistung, ggf. weitere Typen.
Der zweite Buchstabe ist eine Lokalisierung der Klassifizierungsabkürzung (abbreviation).
Die Abkürzungen sind aus dem Part Presenter abholbar:
- SL::Presenter::Part->type_abbreviation($part_type)
- SL::Presenter::Part->classification_abbreviation($classification_id)
Anpassung des CSV Import,
nun wird alternativ zur 'part_type'-Spalte die 'pclass'-Spalte mit zwei Buchstaben geparsed und entsprechend
classification_id, part_type gesetzt.
Bernd Bleßmann [Tue, 10 Jan 2017 16:21:16 +0000 (17:21 +0100)]
CsvImport Aufträge: Positionen nicht fehlerhaft markieren, wenn Auftrag fehlerhaft.
Das zeigt dann im Bericht nicht alle Zeilen als Fehler an, die selber keinen
Fehler enthalten und bei denen nur die Auftragszeile fehlerhaft ist.
Die Markierung ist auch nicht mehr nötig, da nur Aufträge und nicht
Postitionszeilen gespeichert werden.
Bernd Bleßmann [Tue, 10 Jan 2017 16:14:12 +0000 (17:14 +0100)]
CsvImport Aufträge: Keine Aufträge speichern, wenn alle fehlerhaft sind.
Dazu die zu speichernden Einträge mit einem leerem Array initialisieren, denn
sonst nimmt die save_objects-Routine aus der Basis-Klasse alle Einträge.
Das war bisher zwar kein Problem, weil auch alle Positionszeilen vorher bei
fehlerhaften Auftragszeilen als fehlerhaft markiert und somit nicht gespeichert
wurden. Diese Markierung ist jetzt überflüssig (extra commit).
Moritz Bunkus [Thu, 5 Jan 2017 12:22:49 +0000 (13:22 +0100)]
Verkaufs-/Einkaufsbelege: beim Laden der Lieferadresse $form->{shipto_id} nicht überschreiben
Die Semantik in der Datenbank sieht so aus, dass z.B. oe.shipto_id nur
dann gesetzt ist, wenn eine der Lieferadressen aus den Stammdaten
ausgewählt ist. Genauer:
Der Inhalt von $form muss das genau so reflektieren, denn anhand dieses
Feldes $form->{shipto_id} wird dann in den Masken entschieden, was wie
angezeigt wird.
Moritz Bunkus [Wed, 4 Jan 2017 16:01:12 +0000 (17:01 +0100)]
kivi.popup_dialog(): übergebenen close-Handler auch ausführen
Die Funktion kivi.popup_dialog() installiert ihren eigenen
close-Handler, um den in dem Moment noch vorhandenen Dialog zu
entfernen (sofern der Dialog aus HTML-Code erzeugt oder von einer URL
nachgeladen wurde) bzw. zu schließen (sofern ein vorher bereits im DOM
existierendes Element angezeigt wurde). Dadurch werden vom Aufrufer
vergebene close-Handler überschrieben.
Da es mehrere Stellen im Programm gibt, an denen ein close-Handler
übergeben wird, wurde kivi.popup_dialog() nun so erweitert, dass es den
übergebenen Handler speichert und zuerst ausführt und erst anschließend
das Entfernen respektive Schließen durchführt.
Jan Büren [Wed, 28 Dec 2016 20:36:41 +0000 (21:36 +0100)]
Installationsanweisungen für debian/ubuntu geändert
Seit ca. 2015 ist CGI.pm nicht mehr im Perl Core und das
Paket libcgi-perl seit Intrepid nicht mehr vorhanden:
S.a. 2015-04-30 09:26:14 UTC Deleted Intrepid
Jan Büren [Fri, 23 Dec 2016 11:04:38 +0000 (12:04 +0100)]
Webdav-Datei-Aufruf direkt mit Backend-Funktion
Webdav Pfad und Dateiname muss nicht bei der Parameterübergabe
zusammengebaut werden. Besser direkt die Funktion Webdav->full_filedescriptor
hierfür nutzen
Moritz Bunkus [Tue, 20 Dec 2016 09:34:07 +0000 (10:34 +0100)]
Tests: CTI-Test gefixt
Nach Übernahme von Commit cfb460aac »CTI: wenn kein dial_command
vorhanden callto: links rendern« aus der LINET-Installation war dies
aufgrund erweiterter Funktionalität nötig.