Author Archives: grichardson

Neue Auftragsmaske in kivitendo

Das aufwändigste neue Feature in der Version 3.4.0, das wahrscheinlich auch den größten Einfluss auf die weitere Entwicklung von kivitendo haben wird, ist der neue Auftragscontroller. Ziel dabei ist es, die alte durch eine neue Auftragsmaske zu ersetzen.
Da die neue Maske aber noch nicht alle Features ihres Vorgängers beherrscht, ist dieses Feature im Menü noch als “experimentell” markiert, und kann parallel zu der alten Auftragsmaske verwendet werden. Jeder kann testen, ob die Funktionalität der neuen Maske schon für den eigenen Einsatz ausreicht. Bei einigen Kundenprojekten von uns ist die Auftragsmaske bereits produktiv im Einsatz.

Langfristig soll die neue Maske auch die technische Grundlage für neue Lieferschein- und Rechnungsmasken bilden.

Neue Auftragsmaske in kivitendo

Die alten Belegmasken haben u. a. zwei große Probleme. Zum einen ist das generell sehr alter Code, der schlecht wartbar ist und es nicht einfach macht, die modernen und benutzerfreundlichen Features von kivitendo, z.B. Kundenpicker, Partpicker, Projektpicker etc., in einzubauen.

Zum anderen wird die alte Maske ab einer gewissen Zahl von Artikeln einfach sehr langsam. Beim Hinzufügen eines neuen Artikels wird die Seite jedes Mal komplett neu aufgebaut  – das dauert mit einer steigenden Anzahl von Auftragspositionen immer länger, so wird das effiziente Bearbeiten irgendwann schlicht unmöglich.

Bei der neuen Maske wurde von Anfang an auf eine schnelle und effiziente Eingabe geachtet. Die Seite wird beim Hinzufügen neuer Artikel nicht mehr jedes Mal neu aufgebaut, sondern dynamisch erweitert und die Gesamtsummen laufend aktualisiert.
Hierfür gibt es oberhalb der Artikelliste eine zentrale Eingabezeile, in der man neue Artikel zu der wachsenden Liste hinzufügt.

Alle Eingabefelder bei denen man aus einer Liste auswählen kann, also z.B. Kunde und Projekt, sind nun über Picker realisiert. Der Kundenpicker reagiert sowohl auf Kundennummer als auch Kundenname und zeigt bei Auswahl auch beides an.

Was die neue Maske im Vergleich zur alten noch nicht kann:

  • es gibt keine Detailszeile mit z.B. Ertrags- und EK-Preis-Informationen
  • Kundendetails anzeigen
  • Kreditlimit-Warnung
  • individuelle Lieferadressen
  • wiederkehrende Rechnungen konfigurieren
  • Preisfaktor ist noch nicht gut getestet
  • Sprache und Währung auswählen
  • die meisten der Workflow-Schritte, z.B. kann man bisher nur einen Lieferschein, nicht aber eine Rechnung oder einen Lieferantenauftrag  aus dem aktuellen Auftrag erstellen

Für viele Anwendungsfälle ist die neue Maske aber dennoch schon geeignet und ausprobieren kann man sie auch in unserer Demo unter “Verkauf  Auftrag erfassen (experimentell)“. Unter “Verkauf → Berichte → Aufträge” kann man auch auswählen, ob man bestehende Aufträge mit der alten oder der neuen Maske öffnet.

Demo-Mandant auf die Version 3.4.0 aktualisiert

Unsere offizielle kivitendo-Demo, die Steigmann Werft unter https://www.kivitendo.de, habe ich eben auf die Version 3.4.0 aktualisiert. Da in den Testsystemen schon lange alles aktualisiert war und ich die UPGRADE-Datei nicht gelesen habe, ist mir das natürlich direkt um die Ohren geflogen.

Was ich unter Ubuntu für unsere Installation nach dem git pull noch gemacht habe:

  • perl scripts/installation_check.pl
  • apt-get install libalgorithm-checkdigits-perl
  • in der Konfigurationsdatei den [task_server] Abschnitt auskommentiert
  • den Webserver neu gestartet
  • im Admin-Bereich angemeldet: /controller.pl?action=Admin/login
  • als Benutzer angemeldet

Alle Updates liefen mit unserem Testdatenbestand flott durch, damit steht die 3.4.0 jetzt offiziell online zum Ausprobieren bereit.

Inventur in kivitendo

Die Anpassung des Warenbestandes in kivitendo nach der Inventur ist über den CSV-Import sehr einfach. Unter System → CSV-Import → Lagerbewegungen/-bestände kann man hierfür eine Liste der frisch gezählten Bestände hochladen. Ein CSV-Liste aller zu zählende Waren exportiert man sich am besten unter Stammdaten → Berichte → Waren.

In diesem Beispiel gibt es die beiden Artikel “Heftzwecken” und “Büroklammern” mit den Artikelnummern 5 und 4, wobei hier nur die Artikelnummer wichtig ist, die Beschreibung wird ignoriert. Die Artikel liegen im Lager “lager1” auf Lagerplatz “Lagerplatz1”, die Inventur fand am 29.12.2015 statt und es wurden 53 Heftzwecken und 33 Büroklammern gezählt, was man jeweils als target_qty (Zielmenge) einträgt. Die Struktur der CSV-Datei sieht wie folgt aus:

partnumber,description,target_qty,shippingdate,warehouse,bin
5,Heftzwecken,53,29.12.2015,lager1,Lagerplatz1
4,Büroklammern,33,29.12.2015,lager1,Lagerplatz1

Beim Import kann man in der Vorschau sehen, was passieren wird:

CSV Import Einstellungen für Inventur

CSV Import Einstellungen für Inventur

Anhand der derzeitigen Menge laut Lagerbestand für das jeweilige Lager bestimmt der Importer, ob Artikel im Rahmen der Inventur eingelagert werden müssen, weil mehr als erwartet da sind, oder ob Artikel ausgelagert werden müssen, weil sich weniger auf Lager befinden. In dem Fall sieht man, daß kivitendo bei beiden Artikeln eine Mengen-Änderung von -7 Artikeln durchführen wird, um auf die vorgegebene Zielmenge zu kommen, da die Lagerbestände zu diesem Zeitpunkt 60 und 40 waren.

Damit der Standardkommentar angezeigt wird, muss man noch “Bei allen Lagerbewegungen ohne Kommentar setzen” einstellen. Der Kommentar ist derzeit auch die einzige Möglichkeit, die Lagerbewegung als Inventur- statt als einfache Korrektur zu markieren.

lager-inventur-umbuchungen

Zu beachten: bis Version 3.3 wurde in den Berichten als Datum immer das Erstellungsdatum verwendet, nicht das Lagerdatum – deshalb kann es hier zu Abweichungen kommen, wenn das Erstellungsdatum vom Lagerdatum abweicht.

 

Stornorechnungen drucken

Für den Fall, dass z.B. das Finanzamt die Stornorechnungen sehen möchte, muss man diese auch ausdrucken können. Hierfür gibt es keine eigene Druckvorlage. Für kivitendo handelt es sich erstmal um eine normale Rechnung, in der aber die Mengen und damit auch die Preise negativ sind.

Stornorechnungen erhalten in kivitendo standardmäßig den Zusatz “Storno zu” vor der ursprünglichen Rechnungsnummer. Die meisten Druckvorlagen setzen das Wort Rechnung in groß und fett und dahinter einfach die Rechnungsnummer:

Rechnung 212

In der gedruckten Stornorechnung wird daraus dann:

Rechnung Storno zu 212

Es gibt aber auch Fälle, in denen einfach nur das Wort “Rechnung” in groß und fett erscheint, und die Rechnungsnummer dann in einem anderen Block steht, zusammen mit Rechnungsdatum, Bearbeiter, eventuell Auftragsnummer etc. Dass es sich um eine Stornorechnung handelt, ist auf den ersten Blick also nicht ersichtilich.

Wie so oft in solchen Fällen, kann man sich mit den Druckvorlagen helfen. In der Dokumentation zu den Druckvorlagen wird direkt am Anfang beschrieben, wie man sich auch die nicht dokumentierten Druckvariablen anzeigen lassen kann. In diesem Fall sind das nämlich die Variablen storno und storno_id. Sowohl die Stornorechnung als auch die stornierte Rechnung haben eine Variable storno mit Wert 1. In der Datenbank, aus der die Variablen kommen, hat die stornierte Rechnung zusätzlich noch einen Eintrag für storno_id, dadurch kann man diese auseinanderhalten. Im Template wird storno_id aber nicht aus der Datenbank ausgelesen und ist daher immer leer, kann also ohne Programmupdate nicht verwendet werden. Helfen kann man sich aber trotzdem, indem man den Umstand nutzt, dass in der Rechnungsnummer das Wort “Storno” vorkommt. Eine mögliche Variante wäre also:

\textbf{<%if storno%><%if invnumber =~ “Storno”%>Storno <%end if%><%end if%> Rechnung}

Für den Fall, dass die Variable storno gesetzt ist und das Wort “Storno” in der Rechnungsnummer vorkommt, wird also das Wort “Storno” innerhalb des fetten Bereichs noch vor das Wort “Rechnung” gesetzt.

 

 

 

 

FrOSCon 2015

Am vergangenen Wochenende waren wir mit Stand und Vorträgen wieder auf der FrOSCon vertreten. Zu ihrem 10-jährigen Jubiläum hatte das FrOSCon-Team auch ein paar prominente Speaker geladen, z.B. Andrew S. Tanenbaum.

Am kivitendo-Stand haben wir am Samstag und Sonntag das Projekt vertreten und dabei reichlich Fragen zu kivitendo beantwortet.
Insgesamt haben wir dieses Jahr drei Vorträge gehalten:

Im ersten Vortrag erzählt Jan von unseren Erfahrungen über die Jahre mit dem Hosting eines eigenen Mailservers:

Am Sonntag habe ich einen Vortrag über Open Source Online Banking gehalten, in dem ich gegen Ende auch auf die Bankerweiterung in kivitendo eingehe:

Und schließlich hat Jan am Sonntag auch noch relativ spontan einen Vortrag über ein aktuelles Migrationsprojekt von SAP zu kivitendo erzählt, nachdem am Donnerstag kurzfristig ein Programmslot frei wurde:

Ich habe mir diesmal zwar keinen Vortrag live angeschaut, aber ein paar Empfehlungen erhalten, die ich mir anschließend als Video angeschaut habe. Ich möchte gerne zwei Vorträge vorstellen, die technisch nicht allzu tief gehen, dafür aber gut vorgetragen und sehr anschaulich und verständlich sind:

In ihrem Vortrag “Rewriting 12 year old code” ist eine der Thesen von Anna Filina, dass ein kompletter Rewrite von alter Software meist fehlschlägt und man besser Stück für Stück Komponenten austauschen sollte.

Das entspricht ja auch dem Konzept von kivitendo – alten Code nach und nach abzulösen und bei der Gelegenheit auch Tests einzuführen. Mit dem Erscheinen von sql-ledger in 1998 blickt kivitendo immerhin auch auf eine Code-Geschichte von mittlerweile 17 Jahren zurück. Und seit dem Erscheinen von lx-office in 2003 wurde immer darauf geachtet, dass man auch von alten Versionen noch auf ein aktuelles kivitendo updaten kann, sodass viele Firmen schon seit vielen Jahren ohne Bruch mit kivitendo arbeiten können.

In einem weiteren sehr schönen Vortrag erklärt Stefan Wintermeyer sehr anschaulich die Grundlagen und prinzipiellen Einschränkungen, die man bei der Optimierung von Webseiten im Hinblick auf Geschwindigkeit berücksichtigen muß:

https://media.ccc.de/browse/conferences/froscon/2015/froscon2015-1536-webperformance_autobahn_oder_fussgangerzone.html

Bankerweiterung in kivitendo 3.3

Das größte neue Feature in kivitendo 3.3 ist die Bankerweiterung, bei der man Kontoauszüge aus einer Bankingsoftware importieren kann, um damit die offenen Posten schnell zu verbuchen. Dabei werden die Zahlungen in der Datenbank mit den entsprechenden Rechnungen verknüpft, sodass diese Informationen auch beim verbesserten Kontenabgleich genutzt werden können. Die Bearbeitung von vielen Zahlungen in kivitendo wird hiermit wesentlich effizienter und die Übersicht beim Zahlungsverkehr erhöht.

Bei den folgenden Firmen, die die Finanzierung dieses Projekts ermöglicht haben, möchte ich mich bedanken:

opendynamic GmbH & Co. KG
c.a.p.e. IT GmbH
CeTaQ GmbH
Kaspers & Wessendorf Unternehmensberater Partnerschaftsgesellschaft
Werner Hahn/V-Solution
Servicelabel GbR

Rose Debugging in der console

So schick die Datenbankabfragen per Rose sind, will man doch ab und an schauen, was da im Hintergrund auf Datenbankebene passiert, also welche SQL-Queries eigentlich generiert werden.

Während man beim alten Code in der kivitendo.conf unter [debug] per
global_level = QUERY
noch alle SQL-Abfragen in der Logdatei protokollieren konnte, muß man bei Rose nun
dbix_log4perl = 1
einstellen, um die von Rose generierten Queries zu sehen. Das produziert dort auch immer unheimlich viel Ouput.

In der Console kann man bei Manager-Methoden einen debug-Parameter übergeben, wo das generierte SQL ebenfalls angezeigt wird:
my $invoices = SL::DB::Manager::Invoice->get_all( where => [ id => 962 ], debug => 1);
SELECT
t1.amount,
t1.cp_id,
t1.currency_id,
< ... snip ... >
t1.type
FROM
ar t1
WHERE
t1.id = ? (962)

Man kann aber auch das Logging explizit für alle Anfragen in der console Session (oder sogar beim Entwickeln von Test-Skripts) anstellen:

$Rose::DB::Object::Manager::Debug = 1;
$Rose::DB::Object::Debug = 1;

Ab dann sieht man direkt in der console, welche SQL-Abfragen im Hintergrund passieren, z.B. bei der Benutzung eines Filters:
SL::DB::Manager::Invoice->get_all(where => [ SL::DB::Manager::Invoice->type_filter('invoice') ]);

SELECT
t1.amount,
t1.cp_id,
t1.currency_id,
< … snip … >
t1.type
FROM
ar t1
WHERE
(
(
t1.storno = ? OR
t1.storno IS NULL
) AND
t1.amount >= ? AND
t1.invoice = ?
) (0, 0, 1)

Ein paar Beispiele zum selber Ausprobieren:

Schnell schauen, welche Abfragen mit with_objects oder require_objects generiert werden:

Alle Artikel, mit LEFT OUTER JOIN auf die Tabelle partsgroup
my $parts = SL::DB::Manager::Part->get_all( with_objects => [ 'partsgroup' ] );

Nur die Waren, die eine Warengruppe haben:
my $parts = SL::DB::Manager::Part->get_all( require_objects => [ 'partsgroup' ] );

Oder der Unterschied in der Abfrage, ob man einen Artikel per
my $part = SL::DB::Part->new( id => 962 )->load;
oder per
my $part = SL::DB::Manager::Part->find_by( id => 962 );
ausliest.

Reise Reise

Ich war ein paar Tage unterwegs und wollte jetzt die Reisekosten in kivitendo verbuchen.
In unserem Demo-Mandanten, der Steigmann-Werft, gibt es für diesen Fall noch kein Beispiel, deshalb will ich das hier nochmal dokumentieren.
Der Mehrwertsteuersatz für Übernachtung und Frühstück unterscheidet sich ja mittlerweile, und es gilt auch den Verpflegungsmehraufwand zu verbuchen.

Als Beispiel nehme ich den Angestellten Herr Müller, der für die Übernachtung 30€ inkl. Frühstück bezahlt, wobei 27€ auf die Übernachtung und 3€ auf das Frühstück entfallen, es geht um insgesamt 5 Übernachtungen und einem An- und Abreisetag.

In SKR04 gibt es dafür die Konten 6660 Reisekosten Arbeitnehmer Übernachtungsaufwand für das Zimmer und 6650 Reisekosten Arbeitnehmer für das Frühstück. Und da Herr Müller gerne alles vor Ort in bar bezahlt, und hinterher die Belege einreicht, haben wir für ihn auch in kivitendo ein eigenes Verbindlichkeitskonto 3638 Verbindlichkeiten Müller eingerichtet, damit die Firma immer weiß, wieviel sie ihm noch zurückzahlen muß.
In kivitendo würde man das als Dialogbuchung wie folgt erfassen:

Beim Verpflegungsaufwand setzt man 12€ pro Tag für normale Arbeitstage mit mehr als 8 Stunden oder Anreisetage an, und 24€ pro Tag bei Abwesenheit von 24h.
Herr Müller ist am Freitag angereist, hatte vier volle Tage vor Ort, und ist am Mittwoch wieder abgereist. Das macht 12 + 4*24 + 12 = 120€.
Bezahlt die Firma allerdings Herrn Müller vor Ort einige der Mahlzeiten, so gibt es Abzüge von dieser Pauschale, und zwar 20% für das Frühstück und jeweils 40% für Mittagessen und Abendessen, bezogen auf die Pauschale für 24h. Das macht beim Frühstück also einen Abzug von 4,80€ und Mittagessen und Abendessen von jeweils 9,60€.
Da die Firma nur das Frühstück bezahlt hat müssen von den 120€ also noch 5*4,80€ abgezogen werden, das macht dann insgesamt 96€. Das betreffende Konto heißt 6664 Reisekosten Arbeitnehmer Verpflegungsmehraufwand und wird wieder gegen das Verbindlichkeitskonto von Herr Müller verbucht.

Den aktuellen Saldo vom Verbindlichkeitskonto von Herrn Müller kann man sich jederzeit im Buchungsjournal, in der Bilanz oder in der SuSa anschauen. Den Ausgleich bucht man wieder per Dialogbuchung. In der Dialogbuchungsmaske wird der aktuelle Saldo des Kontos ebenfalls angezeigt, mit dem praktischen Hinweis, ob der Saldo im Soll oder Haben ist. In diesem Fall beträgt der Saldo von Konto 3638 246€ im Haben, so daß ich das Konto im Soll verbuchen muß, um das Konto zu “leeren”. Das Gegenkonto ist das Bankkonto, von dem aus ich überweise.

Ist Herr Müller mit der Bahn gefahren bucht man die Fahrkarten nach dem gleichen Schema wie oben, das Konto ist 6663 Reisekosten Arbeitnehmer, Fahrtkosten
.

Update: Die gesetzliche Regelung für den Verpflegungsmehraufwand findet sich übrigens in §9 Absatz 4a EStG.

Chemnitzer Linuxtage 2015

Die Chemnitzer Linuxtage haben am kommenden Wochenende wieder ein sehr schönes Vortragsprogramm zusammengestellt.

Ich bin mir gar nicht sicher, wie lange es her ist, aber auf jeden Fall über 10 Jahre, daß ich das letzte Mal die CLT besucht habe. Dieses Jahr ist es wieder soweit, wenn auch “nur” als Besucher.

Für alle kivi-Fans aus der Gegend, denen es zum Anwendertreffen am 16.4. zu weit ist, biete ich aber gerne an, sich am Samstag oder Sonntag zu verabreden, am Besten einfach vorab eine Mail schreiben, dann können wir das organisieren.

Oder sprecht mich einfach spontan an, ich bin dann der mit dem kivitendo T-Shirt.