Seitenhistorie
...
- die Generierung einer anwendungsspezifischen SEPA-Kreditoren-ID (auf Basis der tatsächlichen Daten Ihrer Firma)
- die Gestaltung des zu übermittelnden Verwendungszweck für SEPA-Lastschriften
- due die Ermittellung aller in einem SEPA-Export zu berücksichtigenden Zahlungsreferenzen
...
Außerdem ist die Initialisierung der tatsächlich eingesetzten Prozesslogik in zwei Regeln einzusetzen.
Klasse | Funktion | Java-Package | Anzupassende Methoden |
---|---|---|---|
SEPALogic | Template für anwendungspezifische Prozesslogik | org.nuclet.sepa.logic |
|
| |||
ExportSEPAMessage | erstellt eine Vorschau der zu exportierenden SEPA-Zahlungen | org.nuclet.sepa.rule | custom(CustomContext) |
ExportSEPAMessageAndProcessReferences | erzeugt einen SEPA-Export und markiert die exportierten Objekte | org.nuclet.sepa.rule | changeState(StateChangeContext) |
Tabelle 4.8.3: Übersicht, Anpassungen in Prozesslogik
4.8.3.1 SEPALogic
Hinweis |
---|
Bitte verwenden Sie die Klasse SEPALogic nur als Template für Ihre eigene Impementierung. Dazu führen Sie bitte die folgenden Schritte durch:
|
Die Klasse SEPALogic dient als Vorlage zur Ergänzung der grundlegenden Abläufe in der Prozesslogik.
Diese Logik ist an drei Stellen für den Anwendungsfall "Lastschriften" und an drei Stellen für den Anwendungsfall "Überweisungen" von Ihnen anwendungsspezifisch zu ergänzen:
Lastschriften
- Die Methode createCreditorIdentification(SEPAExport) generiert die SEPA-Kreditoren-ID. Diese ID dient der Identifizierung Ihrer Firma im SEPA-Zahlungverkehr.
- Mit der Methode createRemittanceInfromationcreateRemittanceInformation(AbstractDebitorWrapper,...) lässt sich der Verwendungszweck für SEPA-Lastschriften individuell gestalten.
- Die Methode fetchPaymentReferencesfetchDirectDebitReferences() sollte alle Zahlungsreferenzen ermitteln, die in einem SEPA-Export zu berücksichtigen sind.
Ein Beispiel dazu ist jeweils in einem Kommentarblock angegeben, dieses Beispiel ist an das tatsächlich genutzte Währungsbusinessobjekt (bzw. dessen BusinessObject-Klasse) anzupassen.
Überweisungen
- Die Methode createDebitorIdentification(SEPAExport) generiert die SEPA-Debitoren-ID. Diese ID dient der Identifizierung Ihrer Firma im SEPA-Zahlungverkehr.
- Mit der Methode createRemittanceInformation(AbstractCreditorWrapper,...) lässt sich der Verwendungszweck für SEPA-Überweisungen individuell gestalten.
- Die Methode fetchCreditTransferReferences() sollte alle Zahlungsreferenzen ermitteln, die in einem SEPA-Export zu berücksichtigen sind.
Ein Beispiel dazu ist jeweils in einem Kommentarblock angegeben.
Codeblock | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
Codeblock | ||||||||
| ||||||||
package org.nuclet.sepa.logic; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.xml.bind.JAXBElement; import org.nuclos.api.businessobject.BusinessObject; import org.nuclos.api.businessobject.Query; import org.nuclos.api.context.JobContext; import org.nuclos.api.context.RuleContext; import org.nuclos.api.exception.BusinessException; import org.nuclos.api.provider.BusinessObjectProvider; import org.nuclos.api.provider.QueryProvider; import org.nuclet.bffscommon.logging.LogLevel; import org.nuclet.bffscommon.logic.AbstractBusinessLogic; import org.nuclet.sepa.SEPAExport; import org.nuclet.sepa.SEPAPaymentType; import org.nuclet.sepa.jaxb.sdd.Document; import org.nuclet.sepa.logic.*; import org.nuclet.sepa.logic.PAINDocumentCreator.PaymentType; import org.nuclet.sepa.logic.PAINDocumentCreator.SequenceType; import org.nuclet.sepa.wrapper.*; // @replace! //** // * Concrete class implementing the declarations found in abstract class AbstractSEPALogic * * @note import org.nuclet.businesstemplate.Client; // import org.nuclet.businesstemplate.ClientBilling; // import org.nuclet.businesstemplate.ClientBillingPosition; // import org.nuclet.businesstemplate.Supplier; // import org.nuclet.businesstemplate.SupplierBilling; // import org.nuclet.businesstemplate.SupplierBillingPosition; /** * Concrete class implementing the declarations found in abstract class AbstractSEPALogic * * @note This class is to be read as a dummy implementation. Its methods should be overwritten * and filled/adapted with application specific code. * * @usage org.nuclet.sepa.job.SEPAExportJob * * @version 12.0 * @date 2103.0302.20142015 * @nuclet org.nuclet.SEPA * @nucletversion 12.0.0 * @sincenucletversion 1.0.0 * @since 21.03.2014 * * @author frank.lehmann@nuclos.de * */ public class SEPALogic extends AbstractSEPALogic { private static final LogLevel LOGLEVEL = LogLevel.DEBUG; public SEPALogic(final JobContext context) { super(context, LOGLEVEL); } public SEPALogic(final JobContext context, final LogLevel logLevel) { super(context, logLevel); } } public public SEPALogic(final RuleContext context, final LogLevel logLevel) { super(context, logLevel); } public SEPALogic(final RuleContext context) { super(context, LOGLEVEL); } /** * } /** * Builds Builds a creditor identification, based on a given SEPA export (direct debit initiation) * * @note To be implemented in a dedicated subclass! * @see org.nuclet.sepa.logic.CreditorIdentification * * @param boSEPAExport A given oject of type <code>SEPAExport</code> * * @return a creditor identification, based on a given SEPA export * * @throws BusinessException * @throws BusinessException SPA.483.001 * @throws BusinessException SPA.483.001 */ */ protected CreditorIdentification createCreditorIdentification(final SEPAExport boSEPAExport) throws BusinessException { // @replace! // // Im folgenden Beispiel wird der Kreditorenstammdatensatz in der Tabelle // finalder Query qryCreditor = QueryProvider.create(Person.class) Kunden ("Client") gespeichert und als "intern" ("is internal") gekennzeichnet. // Die Kreditorenkennung wird .where(Person.BffsStammdaten.eq(Boolean.TRUE)); also aus genau jenem Stammdatensatz erzeugt. // // final List<Person>Query lstPersonenqryCreditor = QueryProvider.executecreate(qryCreditorClient.class); // .where(Client.IsInternal.eq(Boolean.TRUE)); // final List<Client> lstClients = QueryProvider.execute(qryCreditor); // // logDebug("Creditor list size: " + lstPersonenlstClients.size()); // // if (lstPersonenlstClients != null && lstPersonenlstClients.size() == 1) { // final Client boCreditor final Person boCreditor = lstPersonenlstClients.iterator().next(); // // final CreditorIdentification creditorId = new CreditorIdentification( // boCreditor.getName(), // boCreditor.getBic(), // boCreditorboCreditor.getIban(), // boCreditor.getGlaeubigerIdSepagetSEPACreditorId()); // // return creditorId; // } else if (lstPersonenlstClients != null && lstPersonenlstClients.size() > 1) { // throw new BusinessException("More than one clients marked as \"internal\" exist!"); // } else { // throw new BusinessException("EsClient sind mehrere Personen-Datensätze als \"BFFS-Stammdaten\" gekennzeichnetmarked as \"internal\" is missing!"); // } else { return null; } /** * Builds //a creditor identification, based on throwa new BusinessException("Der BFFS-Stammdatensatz in der Entität \"Person\" fehlt!"); // } return null; } /** * Builds the remittance information, related to the given debitor and reference * * @param debitor An object of type <code>AbstractDebitorWrapper</code>, representing the debitor * @param reference An object of type <code>AbstractReferenceWrapper</code>, representing the reference * @param bgdAmount The payment amount, related to the given debitor and reference * * @return the remittance information, related to the given debitor and reference * * @throws BusinessException */ public String createRemittanceInformation(final AbstractDebitorWrapper debitor, final AbstractReferenceWrapper reference, final BigDecimal bgdAmount) throws BusinessException { // @replace! // // final StringBuffer sbRemittanceInfo = new StringBuffer(); // // final Rechnung boRechnung = (Rechnung)reference.getBusinessObject(); // final Long lngRatenartId = boRechnung.getRatenartId(); // final Ratenart boRatenart = QueryProvider.getById(Ratenart.class, lngRatenartId); // // if ("monatlich".equals(boRatenart.getName())) { // sbRemittanceInfo.append("KTO. "); // sbRemittanceInfo.append(debitor.getSEPAMandateIdentification()); // sbRemittanceInfo.append(" DATUM "); // given SEPA export (credit transfer initiation) * * @note To be implemented in a dedicated subclass! * @see org.nuclet.sepa.logic.CreditorIdentification * * @param boSEPAExport A given oject of type <code>SEPAExport</code> * * @return a debitor identification, based on a given SEPA export * * @throws BusinessException * @throws BusinessException SPA.483.001 */ protected DebitorIdentification createDebitorIdentification(final SEPAExport boSEPAExport) throws BusinessException { // @replace! // // Im folgenden Beispiel wird der Debitorenstammdatensatz in der Tabelle // der Kunden ("Client") gespeichert und als "intern" ("is internal") gekennzeichnet. // Die Debitorenkennung wird also aus genau jenem Stammdatensatz erzeugt. // // final Query qryDebitor = QueryProvider.create(Client.class) // .where(Client.IsInternal.eq(Boolean.TRUE)); // final List<Client> lstClients = QueryProvider.execute(qryDebitor); // // logDebug("Debitor list size: " + lstClients.size()); // // if (lstClients != null && lstClients.size() == 1) { // final Client boDebitor = lstClients.iterator().next(); // // final DebitorIdentification debitorId = new DebitorIdentification( // boDebitor.getName(), // boDebitor.getBic(), // boDebitor.getIban(), // boDebitor.getSEPACreditorId()); // // return debitorId; // } else if (lstClients != null && lstClients.size() > 1) { // throw new BusinessException("More than one clients marked as \"internal\" exist!"); // } else { // throw new BusinessException("Client marked as \"internal\" is missing!"); // } return null; } /** * Builds the remittance information, related to the given creditor and reference * * @param creditor An object of type <code>AbstractCreditorWrapper</code>, representing the debitor * @param reference An object of type <code>AbstractCreditorReferenceWrapper</code>, representing the reference * @param bgdAmount The payment amount, related to the given debitor and reference * * @return the remittance information, related to the given debitor and reference * * @throws BusinessException */ public String createRemittanceInformation(final AbstractCreditorWrapper debitor, final AbstractCreditorReferenceWrapper reference, final BigDecimal bgdAmount) throws BusinessException { // @replace! // // final SupplierBilling boSupplierBilling = (SupplierBilling)reference.getBusinessObject(); // final StringBuffer sbRemittanceInfo = new StringBuffer(); // // sbRemittanceInfo.append("ACCT. "); // sbRemittanceInfo.append(creditor.getSEPAMandateIdentification()); // sbRemittanceInfo.append(" DATE "); // sbRemittanceInfo.append(reference.getReferenceDate()); // sbRemittanceInfo.append(" BETRAGAMNT. "); // sbRemittanceInfo.append(bgdAmount); // sbRemittanceInfosbRemittanceInfo.append(" RNRBGNR "); // sbRemittanceInfo.append(reference.getDirectDebitReferencegetCreditTransferReference()); // // return sbRemittanceInfo.append(" INCL. GEBÜHR FÜR MONATLICHE ABBUCHUNG"toString(); return null; } // } else {/** * Builds the remittance information, related to //the given debitor and sbRemittanceInfo.append("KTO. ");reference * * @param debitor An object of type <code>AbstractDebitorWrapper<//code>, representing the sbRemittanceInfo.append(debitor.getSEPAMandateIdentification()); * @param reference An object of type <code>AbstractReferenceWrapper<//code>, representing the reference * sbRemittanceInfo.append(" DATUM "); // sbRemittanceInfo.append(reference.getReferenceDate()); // sbRemittanceInfo.append(" BETRAG "); // sbRemittanceInfo.append(bgdAmount); // sbRemittanceInfo.append(" RNR "); // sbRemittanceInfo.append(reference.getDirectDebitReference()); // } // // return sbRemittanceInfo.toString(); return null; } /** * Fetches all payment@param bgdAmount The payment amount, related to the given debitor and reference * * @return the remittance information, related to the given debitor and reference * * @throws BusinessException */ public String createRemittanceInformation(final AbstractDebitorWrapper debitor, final AbstractDebitorReferenceWrapper reference, final BigDecimal bgdAmount) throws BusinessException { // @replace! // // final ClientBilling boClientBilling = (ClientBilling)reference.getBusinessObject(); // final StringBuffer sbRemittanceInfo = new StringBuffer(); // // sbRemittanceInfo.append("ACCT. "); // sbRemittanceInfo.append(debitor.getSEPAMandateIdentification()); // sbRemittanceInfo.append(" DATE "); // sbRemittanceInfo.append(reference.getReferenceDate()); // sbRemittanceInfo.append(" AMNT. "); // sbRemittanceInfo.append(bgdAmount); // sbRemittanceInfo.append(" BGNR "); // sbRemittanceInfo.append(reference.getDirectDebitReference()); // // return sbRemittanceInfo.toString(); return null; } /** * Fetches all credit transfer references that are to be included in a given SEPA export (credit transfer initiation) * * @param boSEPAExport A given SEPA export * * @throws BusinessException */ protected List<AbstractPaymentReferenceWrapper>List<AbstractCreditTransferReferenceWrapper> fetchPaymentReferencesfetchCreditTransferReferences(final SEPAExport boSEPAExport) throws BusinessException BusinessException { { // @replace! // // final List<AbstractPaymentReferenceWrapper>List<AbstractCreditTransferReferenceWrapper> lstPaymentReferenceslstCreditTransferReferences = new ArrayList<AbstractPaymentReferenceWrapper>ArrayList<AbstractCreditTransferReferenceWrapper>(); // // final Query qryForderungenqrySupplierBillingPositions = QueryProvider.create(ForderungSupplierBillingPosition.class) // .where(ForderungSupplierBillingPosition.FaelligkeitsdatumDueDate.Gte(boSEPAExport.getDateFrom())) // .and(ForderungSupplierBillingPosition.Faelligkeitsdatum.Lte(boSEPAExport.getDateUntil())) // .and(ForderungSupplierBillingPosition.ExportdatumSepaSEPAExportDate.isNull()) // .and(ForderungSupplierBillingPosition.OffenIsOpen.eq(Boolean.TRUE)) // .orderBy(ForderungSupplierBillingPosition.RechnungSupplierBilling, Boolean.TRUE) // ..orderBy(ForderungSupplierBillingPosition.FaelligkeitsdatumDueDate, Boolean.TRUE); // final List<Forderung>List<SupplierBillingPosition> lstForderungenlstSupplierBillingPositions = QueryProvider.execute(qryForderungenqrySupplierBillingPositions); // // for (final ForderungSupplierBillingPosition boForderungboSupplierBillingPosition : lstForderungenlstSupplierBillingPositions) { // lstPaymentReferenceslstCreditTransferReferences.add(new PaymentReferenceWrapper(boForderungcreditTransferReferenceFacade.getWrapper(boSupplierBillingPosition)); // } // // return lstCreditTransferReferences; return null; } // // return lstPaymentReferences; return null; } } |
4.8.3.2 ExportSEPAMessage
In der Klasse ExportSEPAMessage ist die Klasse SEPALogic gegen die von Ihnen im Abschnitt 4.8.3.1 erstellte Prozesslogik auszutauschen.
Codeblock | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
package org.nuclet.sepa.rule;
import org.nuclos.api.annotation.Rule;
import org.nuclos.api.context.CustomContext;
import org.nuclos.api.exception.BusinessException;
import org.nuclos.api.rule.CustomRule;
import org.nuclet.sepa.*;
import org.nuclet.sepa.logic.*;
// @replace!
//
// Bitte an dieser Stelle Ihre eigene Prozesslogik einsetzen
// import de.ihrefirma.sepa.logic.SEPALogic;
/**
* @name ExportSEPAMesssage
* @description Export the SEPA messsage that is related to a given SEPA export
* @usage
* @change
*
* @version 1.0
* @date 21.03.2014
* @nuclet org.nuclet.SEPA
* @nucletversion 1.0.0
* @sincenucletversion 1.0.0
* @since 21.03.2014
*
* @author frank.lehmann@nuclos.de
*
*/
@Rule(name="ExportSEPAMesssage", description="Export SEPA Messsage")
public class ExportSEPAMesssage implements CustomRule
{
public void custom(CustomContext context) throws BusinessException
{
// @replace!
//
// Bitte an dieser Stelle Ihre eigene Prozesslogik einsetzen
SEPALogic logic = new SEPALogic(context);
logic.initialize(context);
logic.export(context.getBusinessObject(SEPAExport.class));
}
} |
4.8.3.3 ExportSEPAMessageAndProcessReferences
In der Klasse ExportSEPAMessageAndProcessReferences ist die Klasse SEPALogic gegen die von Ihnen im Abschnitt 4.8.3.1 erstellte Prozesslogik auszutauschen.
/**
* Fetches all direct debit references that are to be included in a given SEPA export (direct debit initiation)
*
* @param boSEPAExport A given SEPA export
*
* @throws BusinessException
*/
protected List<AbstractDirectDebitReferenceWrapper> fetchDirectDebitReferences(final SEPAExport boSEPAExport)
throws
BusinessException
{
// @replace!
//
// final List<AbstractDirectDebitReferenceWrapper> lstDirectDebitReferences = new ArrayList<AbstractDirectDebitReferenceWrapper>();
//
// final Query qryClientBillingPositions = QueryProvider.create(ClientBillingPosition.class)
// .where(ClientBillingPosition.DueDate.Gte(boSEPAExport.getDateFrom()))
// .and(ClientBillingPosition.Faelligkeitsdatum.Lte(boSEPAExport.getDateUntil()))
// .and(ClientBillingPosition.SEPAExportDate.isNull())
// .and(ClientBillingPosition.IsOpen.eq(Boolean.TRUE))
// .orderBy(ClientBillingPosition.ClientBilling, Boolean.TRUE)
// .orderBy(ClientBillingPosition.DueDate, Boolean.TRUE);
// final List<ClientBillingPosition> lstClientBillingPositions = QueryProvider.execute(qryClientBillingPositions);
//
// for (final ClientBillingPosition boClientBillingPosition : lstClientBillingPositions) {
// lstDirectDebitReferences.add(directDebitReferenceFacade.getWrapper(boClientBillingPosition));
// }
//
// return lstDirectDebitReferences;
return null;
}
}
|
4.8.3.2 ExportSEPAMessage
In der Klasse ExportSEPAMessage ist die Klasse SEPALogic gegen die von Ihnen im Abschnitt 4.8.3.1 erstellte Prozesslogik auszutauschen.
Codeblock | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
package org.nuclet.sepa.rule;
import org.nuclos.api.annotation.Rule;
import org.nuclos.api.context.CustomContext;
import org.nuclos.api.exception.BusinessException;
import org.nuclos.api.rule.CustomRule;
import org.nuclet.sepa.SEPAExport;
import org.nuclet.sepa.logic.SEPALogic;
/**
* @name ExportSEPAMesssage
* @description Export SEPA message without processing the references
* @usage
* @change
*
* @version 2.0
* @date 30.01.2015
* @nuclet org.nuclet.SEPA
* @nucletversion 2.0.0
* @sincenucletversion 1.0.0
* @since 14.03.2013
*
* @author frank.lehmann@nuclos.de
*/
@Rule(name="ExportSEPAMesssage", description="Export SEPA Messsage")
public class ExportSEPAMesssage implements CustomRule
{
public void custom(CustomContext context) throws BusinessException
{
final SEPAExport boSEPAExport = context.getBusinessObject(SEPAExport.class);
SEPALogic logic = new SEPALogic(context);
logic.initialize(context, boSEPAExport);
logic.export();
}
} |
4.8.3.3 ExportSEPAMessageAndProcessReferences
In der Klasse ExportSEPAMessageAndProcessReferences ist die Klasse SEPALogic gegen die von Ihnen im Abschnitt 4.8.3.1 erstellte Prozesslogik auszutauschen.
Codeblock | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
package org.nuclet.sepa.rule;
import org.nuclos.api.annotation.Rule;
import org.nuclos.api.context.StateChangeContext;
import org.nuclos.api.exception.BusinessException;
import org.nuclos.api.rule.StateChangeRule;
import org.nuclet.sepa.SEPAExport;
import org.nuclet.sepa.logic.SEPALogic;
/**
* @name ExportSEPAMesssageAndProcessReferences
* @description Export SEPA messsage and process references
* @usage
* @change
*
* @version 2.0
* @date 30.01.2015
* @nuclet org.nuclet.SEPA
* @nucletversion 2.0.0
* @sincenucletversion 1.0.0
* @since 21.03.2014
*
* @author frank.lehmann@nuclos.de
*/
@Rule(name="ExportSEPAMesssageAndProcessReferences", description="Export SEPA messsage and process references")
public class ExportSEPAMesssageAndProcessReferences implements StateChangeRule
{
public void changeState(StateChangeContext context) throws BusinessException
{
final SEPAExport boSEPAExport = context.getBusinessObject(SEPAExport.class);
| ||||||||
Codeblock | ||||||||
| ||||||||
package org.nuclet.sepa.rule; import org.nuclos.api.annotation.Rule; import org.nuclos.api.context.StateChangeContext; import org.nuclos.api.exception.BusinessException; import org.nuclos.api.rule.StateChangeRule; import org.nuclet.bffs.sepa.BFFSSepaLogic; import org.nuclet.sepa.*; import org.nuclet.sepa.logic.*; // @replace! // // Bitte an dieser Stelle Ihre eigene Prozesslogik einsetzen // import de.ihrefirma.sepa.logic.SEPALogic; /** * @name ExportSEPAMesssageAndProcessReferences * @description Export the SEPA messsage that is related to a given SEPA export and process all references * @usage * @change * * @version 1.0 * @date 21.03.2014 * @nuclet org.nuclet.SEPA * @nucletversion 1.0.0 * @sincenucletversion 1.0.0 * @since 21.03.2014 * * @author frank.lehmann@nuclos.de * */ @Rule(name="ExportSEPAMesssageAndProcessReferences", description="Export SEPA messsage and process references") public class ExportSEPAMesssageAndProcessReferences implements StateChangeRule { public void changeState(StateChangeContext context) throws BusinessException { final SEPAExport boSEPAExport = context.getBusinessObject(SEPAExport.class); // @replace! // // Bitte an dieser Stelle Ihre eigene Prozesslogik einsetzen SEPALogic logic = new SEPALogic(context); logic.initialize(context, boSEPAExport); logic.export(boSEPAExport); logic.processReferences(boSEPAExport); } } |
...