Peter Rehm's Blog

apple,development,life & more

Zahlungsverfahren - DTA Dateien per PHP erzeugen

Mit 3 Kommentaren

DTA ist ein in Deutschland existierender Standard für die Abwicklung
von Zahlungen. Die DTA Dateien können von jeder Bank oder per Banking Software
und unter anderem per HBCI verarbeitet werden.

Es gibt einige Szenarios, in denen man mit den DTA Dateien arbeiten könnte.
Z.b. für die Eigenentwicklung einer Finanzsoftware, in der die eingehenden
Rechnungen verwaltet werden. Aus den eingegeben Rechnungen kann man dann
automatsich per DTA Datei die Bezahlung einleiten. Dies wird in einigen großen
Buchhaltungslösungen so eingesetzt.

Es kann aber auch ein Lastschrifteinzug mit einer DTA Datei abgewickelt werden.
So kann man eine Vereinssoftware entwickeln, bei der die Monatsbeiträge per Lastschrift
eingezogen werden.

Wichtig ist, dass in einer DTA Datei entweder nur Überweisungen oder nur Lastschriften
stehen dürfen. Beides vermischt geht nicht!

Diese Dateien kann man sehr einfach mit dem PEAR Package Payment_DTA erzeugen.

Wir fassen nun das Beispiel mit den einzugebenden und zu bezahlenden Rechnungen aus.
Wir geben bei jeder Rechnung die Zahlmodalitäten ein, in dem Fall das Fälligkeitsdatum.
Wurde eine Rechnung bar bezahlt oder bereits überwiesen wird in der Datenbank das
Feld "is_paid" auf 1 gesetzt.

Die Datenbankstruktur sieht wie folgt aus

CODE:
-- 
-- Tabellenstruktur für Tabelle 'bank'
-- 

CREATE TABLE bank (
  bank_id int(11) NOT NULL default '0',
  bank_name text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle 'bills'
-- 

CREATE TABLE bills (
  number text NOT NULL,
  creditor int(11) NOT NULL default '0',
  amount float NOT NULL default '0',
  is_paid int(1) NOT NULL default '0',
  payment_date int(11) NOT NULL default '0',
  transaction_info text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- --------------------------------------------------------

-- 
-- Tabellenstruktur für Tabelle 'creditor'
-- 

CREATE TABLE creditor (
  creditorID int(11) NOT NULL auto_increment,
  company text NOT NULL,
  bank_account int(11) NOT NULL default '0',
  bank_id int(11) NOT NULL default '0',
  PRIMARY KEY  (creditorID)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;


Diese Datenstruktur ist nur ein Beispiel und hab ich nur kurz für den
Eintrag hier geschrieben.

Hier nun eine Beispielanwendung, die mit obiger Datenbankstruktur
arbeitet.

CODE:
<?php
/**
*
* DTA Example in a small Application
*
*/
include("Payment/DTA.php");

$conn=mysql_connect('localhost','root');
$res=mysql_select_db('financedev',$conn);

$mode="download"; // valid: download,display,server

if($mode=='download')
{
header('Content-type: text/plain;');
header('Content-Disposition: attachment; filename="DTAUS0"');
}

$res=mysql_query("SELECT *
   FROM bills
   INNER JOIN creditor
   ON bills.creditor=creditor.creditorID
   INNER JOIN bank on creditor.bank_id=bank.bank_id
   WHERE is_paid=0",$conn);
if(count($res)>0)
{

/**
* Erstellt eine neue DTA Datei, für die Überweisung von Beträgen
* Für Lastschrift der Klasse DTA_DEBIT üebergeben.
*/
$dta_file = new DTA(DTA_CREDIT);

/**
* Absender von den Überweisungen, hier müssen die eigenen Daten angegeben werden,
*/
$dta_file->setAccountFileSender(array(
    "name"           => "Max Mustermann",
    "bank_code"      => 60069860,
    "account_number" => 12345
));

while($row=mysql_fetch_array($res))
{
/**
* Transaktionen hinzufügen
*/
$dta_file->addExchange(
     array(
          "name"           => $row['company'],    // Kontoinhaber
        "bank_code"      => $row['bank_id'],           // BLZ
          "account_number" => $row['bank_account'], // Kontonummer
     ),
     $row['amount'],                                      // Betrag
    array(                                      // Verwendungszweck
          (!empty($row['transaction_info']) ? $row['transaction_info'] : $row['number'] ),
         "---"
     )
);
}

/**
* Speichert Datei
*/
if($mode=='server')
{
$dta_file->saveFile("DTAUS0");
} else {
/**
* Gibt Inhalt aus
*/
echo $dta_file->getFileContent();
}

} else {
return;
}
?>


Achtung Nimmt man DTA_DEBIT, also das Lastschriftverfahren ist der Sender der der
das Geld erhält. Bei DTA_CREDIT ist es der von dessen Konto Geld überwiesen wird.
Dies muss beachtet werden, und erscheint etwas unlogisch. Allerdings ist der Sender
so immer in der Regel der fixe Wert, da alles auf mein Konto überwiesen wird, oder
ich Lastschriften auf mein Konto einziehe.

Geschrieben von Peter Rehm

15.01.2007 um 22:55:05

Abgelegt in PHP

Tags für diesen Artikel: ,