de.a_weinert.dta
Class DTAus

java.lang.Object
  extended by de.a_weinert.dta.DTAus

@MinDoc(copyright="Copyright 2008  A. Weinert",
        author="Albrecht Weinert",
        version="V.21",
        lastModified="12.02.2010",
        lastModifiedBy="A. Weinert",
        usage="Als Java Anwendung starten; siehe Dokumentation (javaDoc) \n  java java de.a_weinert.dta.DTAus [optionen] xml-Eingabe [DTAUS0.TXT]\n  java java de.a_weinert.dta.DTAus  -? f\u00fcr grunds\u00e4tzliche optioen ",
        purpose="Erzeugt eine DTA Datei f\u00fcr Sammeleinz\u00fcge oder -lastschriften")
public class DTAus
extends Object

DTAus-Datensätze für Sammelüberweisung oder -lastschrift.

Although being part of Frame4J, this class's documentation is intentionally in German language. See this hint, please.

This application creates the message accepted by all German and bigger European banks for bulk transfers from appropriate XML input. Customers having the necessary privileges may put those bulk order by online banking or by sending a disk.

Diese Anwendung erzeugt eine DTAus-Zeichenfolge für Sammellastschriften oder -überweisungen für das Austauschformat DTA oder DTAUS deutscher Banken. Die erzeugte Datei wird per Diskette eingereicht oder per online-banking hochgeladen.

Die DTAus-Zeichenfolge besteht aus ein oder sinnvollerweise mehreren DTAus.Transactionen gleichen Typs. Sie müssen entweder Lastschriften oder Überweisungen sein; und alle Transaktionen haben dasselbe "Auftraggeberkonto".

Diese Klasse kann von anderen als Banking-Anwendungen genutzt werden oder aber als eigenständige Anwendung. (Als Anwendung nutzt sie eine anonyme innere Ableitung von App).   Mit

    java de.a_weinert.dta.DTAus [optionen] xml-Eingabe [DTAUS0.TXT]

transformiert man eine XML-Datei (s.u.) in das DTA-Format. Das Ergebnis kann bei einigen Banken und im Allgemeinen nur mit entsprechender zusätzlicher Vereinbarung als Diskette eingereicht bzw. mit einem online-banking Web-Dienst hochgeladen werden.

Das XML-Format ist anhand des folgenden Beispiels (beziehungsweise von verein.xml) selbsterklärend:

    <?xml version="1.0" encoding="ISO-8859-1"?>
  
    <!-- siehe de.a_weinert.dta.DTAus 
         http://www.a-weinert.de/java/aweinertbib.html -->
  
    <dta type="LK" termin="11.09.2008">
      <!-- LK: Lastschrift; GK: Überweisung; Textinhalt: Beschreibung
           nicht für DTA  -->
      Verein der Meerschweinfreunde, Beitrag 2008
      <konto nr="1234567890" blz="900 900 90" 
       name="Freunde d. Meerschweine e.V.">
       Das Lastschrifteinzugsbeitragskonto des Vereins
      </konto> 
      <!--  gemeinsame(r) Zwecke(e) für alle Transaktionen -->
      <zweck>Mitgliedsbeitrag 2008</zweck>
   
      <transaction betrag="33,90">
        Einzug vom ersten Mitglied
         <konto nr="2345678901" blz="990 890 07" 
           name="Schnuppi Meerschwein">
           Konto des Mitglieds Nr. 1
         </konto> 
       <zweck>abzüglich Aufwand für Heu 20,31</zweck> 
      </transaction>
  
      <transaction betrag="54,21">
        Einzug vom zweiten Mitglied
         <konto nr="3456789012" blz="990 890 07" 
           name="Muri Meerschwein">
           Konto des Mitglieds Nr. 2
         </konto> 
       <zweck>   gemäß Einzusgermächtig. 4.5.  </zweck>
      </transaction>
    </dta>
  
Hinweise: Als Gesamtanzahl der Zwecke sind 2 bis 4 sinnvoll. Mögliche Obergrenzen liegen bei 2, 4 oder 14. Vierzehn ist wohl die bank-gegebene absolute Obergrenze, deren Überschreiten hier eine Exception auslöst.
Die maximale Zahl der Transaktionen scheint prinzipiell in den Tausenden zu liegen, ist für DTAus als Anwendung aber auf 200 begrenzt.

Die Anwendung wurde für die Lastschrift von Vereinsbeiträgen (wenn auch nicht von Meerschweinen) mehrfach erfolgreich genutzt.


© Copyright 2008   Albrecht Weinert

See Also:
Konto, de.a_weinert.dta, TextHelper

Nested Class Summary
 class DTAus.Transaction
          Eine Transaktion (innere Klasse).
 
Field Summary
static String DTA_OUT
          Der Standard-Dateiname für DTA-Austausch-Dateien.
static String DTAtranslate
          Lookup-Tabelle für den (perversen) DTA-Zeichensatz.
static String TYPE_CREDIT
          Typ des Sammelauftrags: Sammelüberweisung.
static String TYPE_DEBIT
          Typ des Sammelauftrags: Lastschrift.
 
Constructor Summary
DTAus(Konto myAccount, String type)
          Erzeugen eines neuen Sammelauftrags.
DTAus(Konto myAccount, String type, ConstTime execdate)
          Erzeugen eines neuen Sammelauftrags.
 
Method Summary
 void addEntry(DTAus.Transaction entry)
          Hinzufügen eines einzelnen Auftrags zu diesem Sammelauftrag.

Das DTAus.Transaction-Objekt, welches hier als Argument benötigt wird, muss mit 'dtaus.new Transaction()' erzeugt werden ('dtaus' ist dabei das aktuelle DTAUS-Objekt).

 void addUsage(CharSequence usage)
          Hinzufügen einer gemeinsamen Verwendungszweckzeile zum Sammelauftrag.
static String check(CharSequence val)
          Prüfen und Aufbereiten einer Zeichenkette für DTA.
static String expand(String st, int len, char filler, boolean alignLeft)
          Begrenzen und Auffüllen einer Zeichenkette auf Länge.
static void main(String[] argv)
          Start der Anwendung (App-Erbe).
static DTAus makeDTAusXML(String xmlInp, PrintWriter log, boolean verbose)
          DTAus-Objekt aus XML-Beschreibung erzeugen.
 String toDTAstring()
          Der Sammelauftrag im DTA-Format.
 String toString()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

TYPE_CREDIT

public static final String TYPE_CREDIT
Typ des Sammelauftrags: Sammelüberweisung.

Wert: "GK" (Überweisung Kunde)

See Also:
Constant Field Values

TYPE_DEBIT

public static final String TYPE_DEBIT
Typ des Sammelauftrags: Lastschrift.

Wert: "GK" (Lastschrift Kunde)

See Also:
Constant Field Values

DTAtranslate

public static final String DTAtranslate
Lookup-Tabelle für den (perversen) DTA-Zeichensatz.

DTA kennt offiziell nur Großbuchstaben und wenige Sonderzeichen.
ÄÖÜß werden perverserweise als [\]~ dargestellt.
Alles Andere wird in Leerzeichen verwandelt. Alternativ dürfte es als Fehler zurückgewiesen werden (was hier nicht geschieht).

DTAtranslate vermittelt (im ISO8859-1-Bereich von 0..255) diese Textverhunzung als Lookup-Tabelle.
charZiel = DTAtranslate.charAt(charQuell);

So wird dann aus "gemäß Einzusgermächtig. 4.5." folgende Scheußlichkeit:  "GEM[~ EINZUSGERM[CHTIG. 4.5".   (Gruß von Cobol und EBCDIC.)

See Also:
check(CharSequence), Constant Field Values

DTA_OUT

public static final String DTA_OUT
Der Standard-Dateiname für DTA-Austausch-Dateien.

Dies ist DTA-Norm. Im Falle einer Diskette beispielsweise muss auf dieser genau eine Datei genau dieses Namens sein. Online-banking-Anwendungen akzeptieren hingegen i.A. den upload beliebig benannter DTAus-Dateien.

Wert: DTAUS0.TXT

See Also:
Constant Field Values
Constructor Detail

DTAus

public DTAus(Konto myAccount,
             String type)
Erzeugen eines neuen Sammelauftrags.

Entspricht DTAus(myAccount, type, null), also sofortige Ausführung.


DTAus

public DTAus(Konto myAccount,
             String type,
             ConstTime execdate)
      throws IllegalArgumentException,
             NullPointerException
Erzeugen eines neuen Sammelauftrags.

myAccount ist dabei das "eigene" Konto, welches bei Sammelüberweisungen als Belastungskonto und bei Sammellastschriften als Gutschriftkonto verwendet wird.

type ist die Art des Sammelauftrags: execdate gibt das Datum an, an dem dieser Sammelauftrag ausgeführt werden soll. Gegebenenfalls muss es zwischen aktuellen Datum und 15 Tage später liegen.

Parameters:
myAccount - Gegenkonto für die enthaltenen Aufträge
type - GK für Sammelüberweisungen und LK für Sammellastschriften
execdate - Ausführungsdatum für diesen Sammelauftrag; null für sofortige Ausführung.
Throws:
IllegalArgumentException - bei falschem type
NullPointerException - ohne Konto
Method Detail

addUsage

public void addUsage(CharSequence usage)
Hinzufügen einer gemeinsamen Verwendungszweckzeile zum Sammelauftrag.

Gemeinsame Verwendungszwecke werden (so vorhanden) bei jeder (hernach) erzeugten TraTransaktion als erste Verwendungszeilen übernommen.

Dies entspricht weitgehender Verwendungspraxis: Häufig sind ja alle erste Zweckzeilen aller (Sammel-) Lastschriften gleich (z.B. "Mitgliedsbeitrag 2009").

See Also:
DTAus.Transaction.addUsage(CharSequence)

addEntry

public void addEntry(DTAus.Transaction entry)
Hinzufügen eines einzelnen Auftrags zu diesem Sammelauftrag.

Das DTAus.Transaction-Objekt, welches hier als Argument benötigt wird, muss mit 'dtaus.new Transaction()' erzeugt werden ('dtaus' ist dabei das aktuelle DTAUS-Objekt).

Parameters:
entry - Hinzuzufügender Einzelauftrag

toString

public String toString()
Overrides:
toString in class Object

toDTAstring

public String toDTAstring()
Der Sammelauftrag im DTA-Format.

Der Rückgabewert kann direkt als Sammelauftrag (Datei für Diskette oder für online banking) verwendet werden.

Implementierungshinweis: Dies ist (aufgrund des Vorgängervorbilds noch) die DTA-Darstellung und verletzt damit die toString()-Semantik. (ToDo: Dies in eine andere Methode tun und fehlendes echtes toString() ergänzen).

Returns:
DTAUS-Datenstrom

check

public static String check(CharSequence val)
                    throws IllegalArgumentException
Prüfen und Aufbereiten einer Zeichenkette für DTA.

Unzulässige (s.u.) Zeichen werden zu Leerzeichen.
Führendes und nachlaufendes white space wird (unter Berücksichtigung dieser Umkodierung) entfernt.

Kleinbuchstaben werden in Großbuchstaben gewandelt.
Und "ÄÖÜß" durch "[\]~" ersetzt. ([sic!], DTA, Cobol-Erbe der Banken). Dies Alles ist DTA-Norm.

Zulässige Zeichen sind: 0 bis 9, A bis Z, Leerzeichen, Punkt ".", Komma ",", Und &, -/+*$% sowie ÄÖÜß.

Throws:
IllegalArgumentException - für Unicode > ü (und damit auch für > 8 Bit)
See Also:
DTAtranslate

expand

public static String expand(String st,
                            int len,
                            char filler,
                            boolean alignLeft)
                     throws IllegalArgumentException
Begrenzen und Auffüllen einer Zeichenkette auf Länge.

Die Zeichenkette st wird links- oder rechtsbündig mit dem Zeichen filler auf die Ziellänge len aufgefüllt (falls sie kürzer ist).

Ist die Ausgangslänge größer als die Ziellänge, wird oberhalb Ziellänge 15 gekürzt und darunter eine Exception ausgelöst. (DTA-) Hintergrund dieses Verhaltens ist, dass das Kürzen von Kontonummern, Beträgen oder Bankleitzahlen (auf die Ziellängen 10 bzw. 8) einen vorher gemachten Fehler kaschieren würde, während das Kürzen von zu langen Namen und Verwendungszwecken auf die DTA-Ziellänge 27 i.A. sinnvoll bzw. gewollt ist.

Parameters:
st - Ausgangszeichenkette
len - Ziellänge
filler - Füllzeichen, i.A. Leerzeichen (Text) oder 0 (Zahlen)
alignLeft - true: linksbündig
Returns:
Die ggf. aufgefüllte oder ggf. gekürzte Zeichenkette.
Throws:
IllegalArgumentException - wenn unter Länge 15 gekürzt werden müsste

makeDTAusXML

public static DTAus makeDTAusXML(String xmlInp,
                                 PrintWriter log,
                                 boolean verbose)
                          throws SAXNotRecognizedException,
                                 SAXNotSupportedException,
                                 ParserConfigurationException,
                                 SAXException,
                                 IOException
DTAus-Objekt aus XML-Beschreibung erzeugen.

Diese Methode stellt die "factory" für ein DTAus-Objekt aus einer XML-Beschreibung dar.
Siehe dazu Klassenbeschreibung.

Diese factory-Methode wird (natürlich) auch von dieser Klasse de.a_weinert.dta.DTAus verwendet, wenn sie als Anwendung (zum Zweck DTA-Datei aus XML) gestartet / verwendet wird. Diese Methode kann natürlich auch in anderen Anwendungen eingesetzt werden.

Parameters:
xmlInp - Dateiname XML Beschreibung
log - Log-Datei
verbose - Log ausführlich
Returns:
DTaus-Objekt bei Erfolg
Throws:
SAXException
ParserConfigurationException
SAXNotSupportedException
SAXNotRecognizedException
IOException

main

public static void main(String[] argv)
Start der Anwendung (App-Erbe).

Aufruf: java de.a_weinert.dta.DTAus [optionen] xml-Datei [dta-Datei]

See Also:
makeDTAusXML(String, PrintWriter, boolean), App