Wir haben für interne Zwecke ein System im Betrieb welches per aqbanking die Umsätze der letzten 10 Tage von der Bank holt und diese in eine CSV Datei packt. Die Transaktionen in CSV Datei werden dann in eine Datenbanktabelle importiert und stehen von dort aus für die weitere Verarbeitung dann zur Verfügung.
Ein folgender Ansatz auf Basis von aqbanking könnte also wie folgt aussehen
Datenbankstruktur
CREATE TABLE IF NOT EXISTS `transactions` ( `id` int(11) NOT NULL auto_increment, `sha1` varchar(40) NOT NULL, `account` varchar(8) NOT NULL, `valutadate` date NOT NULL, `value` float NOT NULL, `subject` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM ;
Cronjob/Shellscript
#!/bin/bash FROMDATE=`date --date '-10 day' +%Y%m%d` /usr/bin/aqbanking-cli -P /root/dbpin request --account=012345678 --fromdate=${FROMDATE} --ctxfile=result.ctx --transactions /usr/bin/aqbanking-cli listtrans --ctxfile=result.ctx --outfile=/tmp/banktransactions.csv /bin/chmod 666 /tmp/banktransactions.csv
Teile des PHP Codes welche die CSV Datei importiert
(zu Demo-Zwecken; mittels copy&paste nicht funktionsfähig.)
<?php function saveNewTransaction($d){ $m['subject'] = trim($d['purpose'].' '.$d['purpose1'].' '.$d['purpose2'].' '.$d['purpose3'].' '.$d['purpose4'].' '.$d['purpose5'].' '.$d['purpose6'].' '.$d['purpose7'].' '.$d['purpose8'].' '.$d['purpose9'].' '.$d['purpose10'].' '.$d['purpose11']); $m['value'] = $d['value_value']; $m['valutadate'] = $d['valutadate']; $m['account'] = $d['localAccountNumber']; $m['sha1'] = sha1($m['subject'].$m['value'].$m['valutadate'].$m['account']); // check if already exists? $resCheck = mysql_query("SELECT id FROM transactions WHERE sha1='$m[sha1]'"); if (mysql_num_rows($resCheck) > 0) return -1; mysql_query("INSERT INTO transactions (sha1, account, valutadate, value, subject) VALUES ('$m[sha1]','$m[account]','$m[valutadate]','$m[value]','$m[subject]')"); $id = mysql_insert_id(); if ($id){ error_log('Transaktion #'.$id.'erfolgreich gespeichert'); return $id; } else { return false; } } function dta2database(){ $arrayCSV = $this->checkCSVImport(); if (is_array($arrayCSV)){ foreach($arrayCSV as $key => $value){ $d['localAccountNumber'] = $value[2]; $d['valutadate'] = $value[6]; $d['value_value'] = $value[7]; $d['purpose'] = $value[12]; $d['purpose1'] = $value[13]; $d['purpose2'] = $value[14]; $d['purpose3'] = $value[15]; $d['purpose4'] = $value[16]; $d['purpose5'] = $value[17]; $d['purpose6'] = $value[18]; $d['purpose7'] = $value[19]; $d['purpose8'] = $value[20]; $d['purpose9'] = $value[21]; $d['purpose10'] = $value[22]; $d['purpose11'] = $value[23]; $this->saveNewTransaction($d); } } } function checkCSVImport(){ // save file and start check $file = '/tmp/banktransactions.csv'; if (!file_exists($file)){ error_log('CSV Datei nicht gefunden'); return false; } $fehler = false; $handle = fopen($file, "r"); while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) $array[] = $data; fclose($handle); unset($array[0]); //headlines canceln; if (!is_array($array)){ error_log('CSV Datei beinhaltet keine Datensätze'); return false; } foreach($array as $key => $value){ if (count($array[$key]) != 32){ // anzahl der felder pro datensatz überprüfen $error[$key][] = 'Ungütige Anzahl Felder ('.count($array[$key]).' statt 32)'; $fehler = true; } } if ($fehler) return false; return $array; }
Die API von g*Sales ist zwar Beta und es wird natürlich auch noch Veränderungen geben aber bei gutem Programmcode sollten diese Änderungen keine großen Auswirkungen bzw. keinen großen Aufwand erfordern um das Add-On entsprechend mitzuziehen.
Kommentare