Auch wenn man ständig vor der Tastur sitzt und Code oder Texte schreibt, Buchhaltungssätze schreiben ist was anderes. Da ich besser coden kann musste also eine Vereinfachung für Linuxer her, hier am Beispiel der Kreditkarten Partner Abrechnung eines Online Versandhauses.

 

Vorbereitende Schritte

Wenn man in seinem Bereich bei der Kreditkarten Firma eingelogged ist, und dort das Angebot zum Download der Rechnungsdaten nicht nur als PDF sondern auch als CSV findet, hat schon mal gewonnen. Beide angebotenen Formate sind wichtig aus unterschiedlichen Gründen:

  1. Das PDF braucht man für den Buchhaltungsordner.
  2. Die CSV jedoch hilft uns die Buchungssätze rasch in unsere GNUCash Buchhaltung zu importieren.
  3. Alle CSV Dateien, die erforderlich sind, sollen jetzt herunter geladen werden.

CSV konvertieren für den Import in GNUCash

Wir machen das einfach mal schnell mit einem kleinen bash Skript.

Folgendes Bash Skript lokal anpassen und prüfen (Download-/Arbeitsverzeichnis, [MASTER_REC_ID, MASTER_CSV]):

#!/bin/bash

#################
# Example script: -- no warranty -- read and understand the code
# Das Skript kann CSV Rechnungen einer nicht genannten Keditkartenfirma für den GNUCash CSV Import konvertieren.
# Script: convert-lbb2transaction.bash - July/2015 Markus Neubauer (Lizenz GPL)
#################

# Downloadformat ist:
# KK_ID; Kaufdatum; Buchungsdatum; Beschreibung; nix; nix; Abhebung bzw. Einzahlung abhängig vom Vorzeichen
# Feld: 0                          1          2 3         45 6     (7)
# (Kreditkarte-Nr. - 3 Zeichen)000;16.04.2015;;07.04.2015;;;362,69
# Feld: 0              1          2          3                              45 6
# (Kreditkartennummer);26.05.2015;24.05.2015;GOOGLE *AR Labs / GOOGLE.COM/C;;;-0,99
# (Kreditkartennummer);27.05.2015;26.05.2015;GOOGLE *Perdeas / GOOGLE.COM/C;;;-1,08
# [...]

# GNUCash Import Format für die Buchungen/Transactions ist:
# Theorie: Buchungs-Datum;lfnd.Nr.; Beschreibung; Bemerkung; Konto; Einzahlung; Abhebung; Saldo;
# - Das Feld "Konto","Saldo" wird hier später nicht verwendet
# Die hier erzeugte Ausgabe erfolgt daher verkürzt und ist mit TAB's getrennt
# - es ist sicher, da dann in der Beschreibung Komma und Semikolon auftreten könnten.
# - Abhebung ~ withdrawal, Einzahlung ~ deposit
# Doof/Erschwerend ist: Anders als beim Bankkonto fehlt zur Zuordnung oft die Referenz/Bestellummer,
# daher ist das Kaufdatum wichtig! # Format: # "${value_date} ${LFDNR} ${description} ${remarks} ${deposit} ${withdrawal}"
# Anderes Beispiel:
# 2015-06-12  1  XXX Rechnung vom 12.06.2015 ZAHLUNG-LASTSCHRIFT        2,07    0
# 2015-06-09  2  Amazon EU / AMAZON.DE    Kauf 08.06.2015 Karte (Kreditkartennummer)    0    6,98 # [...]
# change to the download directory cd "/DEIN DOWNLOAD VERZEICHNIS" || { echo "You should do some modification before usage..." exit 1 } MASTER_CSV="Kreditkartenabrechnung-*.csv" # so sollte der Download Name beginnen # here we go for DL_FILE in ${MASTER_CSV} do # no such file? [ "${DL_FILE}" == "${MASTER_CSV}" ] && continue OUT_FILE="gc-import-lbb-${DL_FILE#*-}.tab" # ignore file if conversion file already exists # - remove it if you want to have it redone [ -f "${OUT_FILE}" ] && continue # recode to usable format - here in DE if [ -n "`file ${DL_FILE} | grep CRLF`" ]; then recode ibmpc..lat1 "${DL_FILE}" fi MASTER_REC_ID='' LFDNR=0 while IFS=$';' read -r -a REC do [ -z "${REC[0]}" ] && continue # we do not want/need empty records # sometimes they have 7 fields, then the amount is found towards right if [ -n "${REC[7]}" ]; then # shift backward to amount REC[6]=${REC[7]} fi [ -z "${REC[6]}" ] && continue # no amount to book at all
# nicht mehr gültig seit Anfang 2016 #if [ -z "${MASTER_REC_ID}" ]; then # # file starts with account record, not transaction # MASTER_REC_ID="${REC[0]}" #fi # make a proper ISO date (comes for Germans here) value_date="${REC[1]:6:4}-${REC[1]:3:2}-${REC[1]:0:2}" # is it a negative amount record? if [ "${REC[6]##*-}" != "${REC[6]}" ]; then # Vorzeichen und Spaltenwechsel deposit=0 withdrawal=`printf '%7.2f' ${REC[6]##*-}` else deposit=`printf '%7.2f' ${REC[6]}` withdrawal=0 fi if [ "${MASTER_REC_ID}" == "${REC[0]}" ]; then # CC account booking remarks="" if [ $deposit != "0" ]; then description="LBB Rechnung vom ${REC[2]} ${REC[3]}" else description="${REC[3]} vom ${REC[2]}" fi else # Single transaction record description="${REC[3]} Kauf vom ${REC[2]}, Buchung ${REC[1]}" remarks="" fi [ -f "${OUT_FILE}" ] || echo "${OUT_FILE} wird neu erstellt." LFDNR=$(($LFDNR + 1)) # GC Import: Datum; Nr; Beschreibung; Bemerkung; Einzahlung; Abhebung; echo -e "${value_date}\t${LFDNR}\t${description}\t${remarks}\t${deposit}\t${withdrawal}" >> "${OUT_FILE}" done < "${DL_FILE}" done ## eof

TIPP: Die erzeugte Ausgabe Datei endet auf *.csv.tab - als kleiner Hinweis für den Import.


Der Import in GNUCash

Vorher sollte natürlich ein Kreditkarten Konto in GNUCash angelegt worden sein.

In GNUCash finden wir unter dem Menüpunkt: Datei -> Importieren -> Import Transactions from CSV... den nächsten Schritt. Es wird die nächste Import Datei mit dem Namen gc-import-xxx-<DATUM>.csv.tab gewählt und zum nächsten Schritt gesprungen.

Die Ansicht wird jetzt angepasst, erstens ist Tabluator zu wählen und die anderen abzuwählen. Dann müssen die Spalten zugeordnet werden, überall wo keine steht wird deren Bedeutung ausgewählt:

| Datum | Nr | Beschreibung | Bemerkung | Einzahlung | Auszahlung |

Weiter - und jetzt kommt das BH Wissen: Kreditkarten Konto auswählen (bei SKR03 irgendwo um 1300 herum), dort sollte ein Eintrag VISA- oder XXX Kredit Karte stehen und vor dem nächsten Schritt ausgewählt werden.

Im folgenden Schritt sind möglicherweise schon Zuordnungen getroffen, diese prüfen und ggf. korrigieren oder Neu anwählen. Nach dem Anwenden ist es erledigt, dann kommt der Papierkram.

WARNUNG: Mehrmaliges Importieren der gleichen Datei kann zu doppelten Buchungen führen, nach dem Import wird diese daher besser gleich gelöscht.