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.

Wer aktuell nach CeBIT und SAP by design googelt, landet bei:

kivitendo

Ohne, dass wir google per adWords geschmiert haben. Allerdings haben wir das Sponsor-Paket: “Vortrag – ohne Call for Paper-Stress” der OSB Alliance erworben.
Hier mein Beweis-Screenshot:

sap-by-design-cebit-kivitendo

Das passt super ins Konzept, denn auch bei meinem aktuellen Kundenprojekt werden alle kivitendo-Tipps in den sehr schönen Notizblock von SAP geschrieben …

Alles richtig gemacht!

Wir sehen uns auf der CeBIT!

Buchungsgruppen optimieren

In der Regel fällt erst im laufenden Projekt auf, dass Konten anders zugeordnet gebucht werden sollen.

Unter der Haube, sprich in der Datenbank, lässt sich dies einfach ändern. Allerdings gibt es dann Konflikte, wenn man Gutschriften/Stornos zu Belegen generieren möchte, die auf andere Konten gebucht sind.

Was idiotensicher geht, ist das Ändern der Buchungsgruppe und nochmals bei allen Belegen auf Buchen klicken. Oder man wartet bis zum Geschäftsjahreswechsel mit der Buchungsgruppen-Änderung.

Anbei der SQL-Befehl, um bspw. alle Standard-19 %-Konten anzuzeigen:

select zon.description, chart.accno as income, c.accno as expense from taxzone_charts left join tax_zones zon on (zon.id=taxzone_id) left join chart on (chart.id = income_accno_id) left join chart c on (c.id = expense_accno_id) where buchungsgruppen_id=(select id from buchungsgruppen where description ='Standard 19%');

Jetzt braucht man “nur” die IDs der Konten anzupassen. Am besten unterteilt man Schritt für Schritt noch Aufwands- und Erfolgskonten.

select taxzone_charts.id, zon.description, c.accno as expense,expense_accno_id from taxzone_charts left join tax_zones zon on (zon.id=taxzone_id) left join chart on (chart.id = income_accno_id) left join chart c on (c.id = expense_accno_id) where buchungsgruppen_id=(select id from buchungsgruppen where description ='Standard 19%');

Und das Update:
update taxzone_charts set expense_accno_id=(select id from chart where accno='520000') where id=7;

Offene Forderungen importieren

Aus dem aktuellen kivi-Projekt hat sich die Anforderung ergeben, die Funktion “Kontoauszug verbuchen” direkt von Anfang an zu verwenden.

Hieraus enstand dann die Herausforderung, wie man mit Zahlungseingängen aus dem Vorjahr umgeht.

Hintergrund: Das alte ERP-System (SAP by design) wurde durch kivitendo abgelöst und man ist an einer schnellen Abschaltung interessiert, allein um den Vertrag bei SAP möglichst zeitnah zu kündigen.

SAP by design bietet eine OPOS-Liste mit folgender Struktur an:
offene-forderungen-opos-2015

Dabei kam die Idee auf, dass es doch besser ist, die Forderungen einzeln im System einzuspielen, damit man hier eine bessere Rückverfolgbarkeit der offenen Posten hat.

Ich habe die Gelegenheit genutzt, um den Prototyp Debitorenimport über CSV hierfür zu testen.

Der Debitorenimport kann alle kivitendo-Buchungsfälle abbilden. Allerdings muss hierfür der kivitendo-Administrator etwas kivitendo-/Buchhaltungs-Fachwissen mitbringen.
kivitendo teilt Transaktionen in Haupt- und Nebenbuch ein. Im Nebenbuch stehen die Metadaten des Belegs, die nicht direkt zur FiBu gehören und im Hauptbuch sind Soll und Haben sowie die Steuer ausgewiesen.

Für meinen Anwendungsfall brauche ich nur Netto-Werte, da SAP die Steuer nicht explizit bei der OPOS ausweist. Ferner besteht bei dieser kivitendo-Installation Abteilungspflicht und ich habe mir zusätzlich überlegt, dass man für diese Forderungen der Übersichtlichkeit halber ein eigenes Ertrags- und Forderungenkonto verwendet.

Somit sieht meine Debitorenbuchung an der Oberfläche wie folgt aus:
donut-spain

Die benötigte Struktur des Imports besteht aus einer Zeile mit Rechnungs-Metadaten und aus 2 bis 4 weiteren Zeilen (Sollkonto, Habenkonto, diverse Steuersätze):

Zeile 1: datatype,amount,invnumber,customernumber,customer,transdate,duedate,closed,netamount,invoice,department,employee_id

Zeile 2: datatype,amount,invnumber,chart_id,taxkey,transdate

Die chart_id findet man über die URL des Kontos unter System → Konten anzeigen heraus.

Diese Rechnungen sind geschlossen (closed == true), da sie wahrscheinlich schon vollständig geliefert und ferner keine Verkaufsrechnungen (invoice == false) sind.
Alle anderen Information sind in der OPOS-Liste enthalten, die ich per Skript einfach neu zusammenparse.

Somit ergibt sich für diese Debitorenbuchung folgender Datensatz:

Zeile 1:Rechnung,"1.220,00",RG508216,1215600,"Donut Spain S.A.",23.10.2014,22.11.2014,t,"1.220,00",f,"OPOS 2015",979

Zeile 2:AccTransaction,”-1.220,00″,RG508216,12533,0,23.10.2014

Zeile 3:AccTransaction,”1.220,00″,RG508216,12535,0,23.10.2014

Die einzelnen Zeilen werden etwas schlecht formatiert, deshalb hier nochmal als Screenshot:donuts sa

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.

 

DATEV-Export maximal nutzen

Das Standard-DATEV-Format bietet die Möglichkeit, zwei Kostenstellen mitzuexportieren.

Bisher wurde dieses Feld nicht befüllt, der DATEV-Standard sieht hier auch nur achstellige Nummern vor. Man muss also etwas überlegen, was man hier übergeben könnte.

Im aktuellen Kundenprojekt buchen zwei Mandanten in derselben kivi. Wir haben beim Steuerberater nachgefragt, ob er dies mit einer Trennung der Mandanten durch Buchungspflicht-Abteilungen und einem entsprechenden Filter beim Export abbilden kann.

Hier die Erweiterung des Exports aus Sicht des DATEV-Anwenders.
Die Kostenstelle ist in diesem Fall auf zwei Ebenen, da der Export nach dem ersten Namen gefiltert wird:

Struktur der Abteilungen:

  • wildwuchs ausbau → id 299
  • wildwuchs standard → id 300
  • wildwuchs internes → id 320
  • fuchswild ausbau → id 321
  • fuchswild standard → id 322
  • fuchswild internes → id 324

Filter für DATEV:
abteilungsfilter-datev

In Kostenstelle2 übergebe ich die Datenbank-ID der Abteilung. Somit ist diese eindeutig erfasst und der Steuerberater kann dieselben Abteilungsfilter abbilden (oder sogar noch bessere Auswertungen fahren), als in kivitendo.
Seine Sicht ist dann etwa so:

datev-mit-kostenstellen

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.

 

 

 

 

Selbstheilende kivi (Selftests verwenden)

Durch das sehr gute neue E-Mail-Journal sind mir jetzt auch die automatischen SelfTests ins Auge gefallen.
Ursprünglich sind diese Tests als QS für Voll-Fibu-kivitendo Benutzer entwickelt worden, also solche Betriebe, die auch die Bilanz mit kivitendo selbst erstellen und zeichnen.
Allerdings lassen sich auch hiermit sehr gut Fehleingaben oder andere Problemchen entdecken, bevor sie sich symptomatisch über ein ganzes Geschäftsjahr hinziehen.
Standardmässig werden die SelfTests täglich ausgeführt (insofern konfiguriert) und beinhalten aktuell 17 Tests.

Die Tests geben die Ergebnisse zwar auf Englisch und leicht kryptisch aus, aber für ein geübtes Auge ist dies sicherlich verwertbar, bspw.:

Hier fällt der Test 12 negativ auf, da ar (accounts receivable) überbezahlt ist. Der Test gibt auch noch eine Rechnungsnummer als Hinweis mit aus. Mit dieser Info kann man dann simpel den Zahlungseingang korrigieren, der zwar korrekt ist, in diesem Fall aber der falschen Rechnung (allerdings dem richtigen Kunden) zugeordnet wurde:

Voraussetzung für die Selftests ist, dass es einen Login mit einer gültigen E-Mail-Adresse gibt.
Ferner muss der task_server für diesen Mandanten eingeschaltet sein.
Dann wird man mit folgender Einstellung nur im Fehlerfall benachrichtigt:
selftests-konfigurieren