ws.michalski.sepa.pain.SEPAMessage.java Source code

Java tutorial

Introduction

Here is the source code for ws.michalski.sepa.pain.SEPAMessage.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at 
    
 http://www.apache.org/licenses/LICENSE-2.0
    
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package ws.michalski.sepa.pain;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.UUID;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ws.michalski.sepa.pain.exeptions.SEPAException;
import ws.michalski.sepa.pain.interfaces.Verifable;

/**
 * Diese Klasse implementiert die Container-Klasse fr SEPA-Nachrit pain.001
 * 
 * TODO: In addTransaction berprfen, ob nur berweisungen oder Lastschriften eingefgt werden.
 *       Entscheidend ist die erste Operation. 
 * 
 * @author markus
 * @version 20131110
 */
public class SEPAMessage implements Verifable {

    /**
     * Tag MsgId
     * 
     * Nachrichten ID
     */
    private String messageId;

    /**
     * Tag InitgPty/Nm 
     * 
     * Name des Initiators oder eine Partei welche im Auftrag handelt
     */
    private String name;

    /**
     * 
     */
    private XMLGregorianCalendar createDate;

    /**
     * Tag NbOfTxs
     * Anzahl Transaktionen im Sammler
     */
    private int nbrOfTransaction;

    /**
     * Tag CtrlSum
     * Summe der Betrge aller Transaktionen
     */
    private BigDecimal ctlSum;

    /**
     * Liste von SEPATransactions
     */
    private List<SEPATransaction> transactionsList;

    private Log log;

    /**
     * 
     * @throws DatatypeConfigurationException
     */
    public SEPAMessage() {
        super();

        log = LogFactory.getLog(SEPAMessage.class);

        transactionsList = new ArrayList<SEPATransaction>();
        GregorianCalendar cal = new GregorianCalendar();
        cal.setTime(new Date());
        createDate = SEPAUtility.convert(cal);
        ctlSum = new BigDecimal(0);

        if (log.isTraceEnabled()) {
            log.trace("Konstruktor SEPAMessage.class");
        }

    }

    /**
     * Fgt eine SEPATransaction hinzu
     * @param transaction
     * @throws SEPAException 
     */
    public SEPAMessage addTransaction(SEPATransaction transaction) throws SEPAException {
        transaction.validate();
        transactionsList.add(transaction);
        return this;
    }

    /**
     * berprfen auf Fehler und setzten von default Werten 
     */
    @Override
    public void validate() throws SEPAException {

        // Falls messageId nicht belegt war, wird als UUID belegt
        if (messageId == null) {
            messageId = UUID.randomUUID().toString();
            messageId = messageId.replaceAll("-", "");
        }

        // Falls Name nicht belegt ist, wird vom ersten Debitor/Kreditor genommen

        try {
            if (name == null) {
                SEPATransaction st = transactionsList.get(0);
                if (st instanceof CreditTransaction) {
                    name = ((CreditTransaction) st).getName();
                }
                if (st instanceof DebitTransaction) {
                    name = ((DebitTransaction) st).getName();
                }
            }
        } catch (IndexOutOfBoundsException e) {
            log.error(e);
            throw new SEPAException("Keine transactionsList Postion vorhanden.");
        }

        // Anzahl Transaktionen
        nbrOfTransaction = transactionsList.size();
        //Summe berechnen
        ctlSum = BigDecimal.ZERO;
        for (SEPATransaction st : transactionsList) {
            ctlSum = ctlSum.add(st.getCtlSum());
        }

        // Felder testen
        if (name.length() > 70) {
            throw new SEPAException("Feld Name > 70");
        }
    }

    /**
     * Prft, ob es sich um berweisung (CT) handelt
     * @return
     */
    public boolean hasCreditTransaction() {
        boolean b = false;
        if (transactionsList.size() > 0) {
            SEPATransaction st = transactionsList.get(0);
            if (st instanceof CreditTransaction) {
                b = true;
            }
        }
        return b;
    }

    /**
     * Prft, ob es sich um Lastschrift (DD) handelt
     * @return
     */
    public boolean hasDebitTransaction() {
        boolean b = false;
        if (transactionsList.size() > 0) {
            SEPATransaction st = transactionsList.get(0);
            if (st instanceof DebitTransaction) {
                b = true;
            }
        }
        return b;
    }

    /**
     * Punkt-zu-Punkt-Referenz der anweisenden Partei fr die folgende Partei in der Nachrichten-Kette, 
     * um die Nachricht (Datei) eindeutig zu identifizieren. 
     * 
     * @return
     */
    public String getMessageId() {
        return messageId;
    }

    /**
     * Punkt-zu-Punkt-Referenz der anweisenden Partei fr die folgende Partei in der Nachrichten-Kette, 
     * um die Nachricht (Datei) eindeutig zu identifizieren. 
     * 
     * Wird das Feld nicht gesetzt, wird automatisch eine Id generiert 
     * 
     * @param messageId
     * @return
     */
    public SEPAMessage setMessageId(String messageId) {
        this.messageId = messageId;
        return this;
    }

    /**
     * Name
     * @return
     */
    public String getName() {
        return name;
    }

    /**
     * Name
     * 
     * Falls der Name nicht gesetzt ist, wird automatisch von ersten Transaction ermittelt. 
     * 
     * @param name
     * @return
     */
    public SEPAMessage setName(String name) {
        this.name = name;
        return this;
    }

    /**
     *  Datum und Zeit, wann die ZV-Nachricht durch die anweisende Partei erzeugt wurde. 
     * @return
     */
    public XMLGregorianCalendar getCreateDate() {
        return createDate;
    }

    /**
     *  Datum und Zeit, wann die ZV-Nachricht durch die anweisende Partei erzeugt wurde. 
     *  
     *  Das Feld wird ggf. automatisch gefllt.
     *  
     * @return
     */
    public SEPAMessage setCreateDate(XMLGregorianCalendar createDate) {
        this.createDate = createDate;
        return this;
    }

    /**
     *  Anzahl der einzelnen Transaktionen innerhalb der gesamten Nachricht
     * @return
     */
    public int getNbrOfTransaction() {
        return nbrOfTransaction;
    }

    /**
     * Diese Methode ist nur fr interne Zwecke gedacht. Wert wird automatisch berechnet.
     * Anzahl der einzelnen Transaktionen innerhalb der gesamten Nachricht
     * @param nbrOfTransaction
     */
    public void setNbrOfTransaction(int nbrOfTransaction) {
        this.nbrOfTransaction = nbrOfTransaction;
    }

    /**
     * Summe der Betrge aller Einzeltransaktionen in der gesamten Nachricht 
     * @return
     */
    public BigDecimal getCtlSum() {
        return ctlSum;
    }

    /**
     * Diese Methode ist nur fr interne Zwecke gedacht. Wert wird automatisch berechnet.
     * Summe der Betrge aller Einzeltransaktionen in der gesamten Nachricht 
     * 
     * @param ctlSum
     */
    public void setCtlSum(BigDecimal ctlSum) {
        this.ctlSum = ctlSum;
    }

    /**
     * Liefert eine Liste der Transaktionen zurck
     * @return
     */
    public List<SEPATransaction> getTransactionsList() {
        return transactionsList;
    }

    /**
     * Fgt eine Liste von Transaktionen 
     * @param transactionsList
     */
    public void setTransactionsList(List<SEPATransaction> transactionsList) {
        this.transactionsList = transactionsList;
    }

}