Sourcecode-Anpassungen in den Java-Regeln
Java-Package | Java-Klasse | Kurzbeschreibung | |
---|---|---|---|
a | org.nuclet.mt940.logic | MT940Logic | Auslesen aller beim Import und der Zuordnung zu berücksichtigenden Referenzobjekte in Methode getReferences() |
b | org.nuclet.mt940.rule | CheckBankTransactionRef | Behandlung der Referenzobjekte beim manuellen Zuordnen/Entfernen zu/von einem Bankumsatz in Methode checkReferences() |
c | org.nuclet.mt940.wrapper | ConditionsOfPaymentWrapper | Wrapper-Objekt für Zahlungsbedingungen, d.h. hier wird eine Schnittstelle zu tatsächlich verwendeten Zahlungsbedingungen definiert (optional) |
d | org.nuclet.mt940.facade | CurrencyFacade | Definition von notwendigen Datenbankzugriffen auf die tatsächlich genutzte Währungsentität |
e | org.nuclet.mt940.wrapper | CurrencyWrapper | Wrapper-Objekt für Währungen, d.h. hier wird eine Schnittstelle zur tatsächlich genutzten Währungsentität definiert |
f | org.nuclet.mt940.wrapper | ReferenceWrapper | Wrapper-Objekt für Bankumsatz-Referenzen (Rechnungen, o.ä.) |
g | org.nuclet.mt940.facade | ReferenceFacade | Definition von notwendigen Datenbankzugriffen auf die tatsächlich verwendete Referenzentität |
Tabelle 4: Anwendungsspezifische Anpassungen in Java-Regeln
Alle notwendigen Anpassungen werden nun der Reihe nach, Klasse für Klasse, erläutert.
a) MT940Logic
Die Methode getReferences() wird vor dem Importvorgang ausgeführt. Sie dient dazu, alle bereits existierenden Objekte einzulesen, die beim Import der Bankumsätze als mögliche Referenzobjekte herangezogen werden sollen (bspw. Kundenrechnungen, die noch offen sind und nicht bereits zu einem Bankumsatz zugeordnet wurden).
An dieser Stelle sollte also eine Datenbankabfrage implementiert werden, die alle für eine Zuordnung in Frage kommenden Business-Objekte zurückliefert.
Das vorgefertigte und auszutauschende Fragment nutzt die in der Entität „Bankumsatz“ („Bank Transaction“) als Dummy-Referenz eingetragene (und zu ersetzende) BusinessObject-Klasse MT940Reference.
/** * Fetches all references that need to be considered during the MT940 import process, e.g. * all open client billings/invoices that have not yet been linked to other bank transactions * * @note A dummy implementation of <code>org.nuclet.mt940.logic.AbstractMt940Logic</code> has * been provided with this class here, its methods are meant to be implemented with user * specific behaviour. * * @return all references that need to be considered during the MT940 import process; the return * value comes as as <code>Map</code> in which the <code>BusinessObject</code> represents the * map's key while the text, which is meant to be used to link the reference to a bank * transaction, represents the map's value * * @throws BusinessException might be thrown in case of errors or other exceptions * */ public Map<BusinessObject, String> getReferences() throws BusinessException { final HashMap<BusinessObject, String> mpReferences = new HashMap<BusinessObject, String>(); // @replace! // Please, replace this code fragment here with your specific code fitting your needs. // // - MT940Reference is just a placeholder for the BusinessObject you'd like to use. // - If your aim was to link your client billings to your bank transactions, the client // billings being represented by the Nuclos-entity "Client Billing", you would use the // related BusinessObject-class "ClientBilling" here. // - Please, expand the query below to a more specific form. // // - In case only ClientBilling objects of two specific states should be considered, // a fitting code example could look like this: // // final Query<ClientBilling> qryGetReferencesStateAB = QueryProvider.create(ClientBilling.class); // qryGetReferencesStateAB.where(ClientBilling.NuclosState.eq(ProcessClientBillingSM.State_AB.getId())); // // final List<Rechnung> lstReferencesStateAB = QueryProvider.execute(qryGetReferencesStateAB); // // for (final ClientBilling clientBilling : lstReferencesStateAB) { // mpReferences.put(clientBilling, clientBilling.getBillingNumber()); // } // // final Query<ClientBilling> qryGetReferencesStateXY = QueryProvider.create(ClientBilling.class); // qryGetReferencesStateXY.where(ClientBilling.NuclosState.eq(ProcessClientBillingSM.State_XY.getId())); // // final List<ClientBilling> lstReferencesStateXY = QueryProvider.execute(qryGetReferencesStateXY); // // for (final ClientBilling clientBilling : lstReferencesStateXY) { // mpReferences.put(clientBilling, clientBilling.getBillingNumber()); // } // // return mpReferences; // return mpReferences; }
b) CheckBankTransactionRef
Bei der Klasse CheckBankTransactionRef handelt es sich um eine UpdateFinalRule. Sie ist der Entität „Bankumsatz“ („Bank Transaction“) zugeordnet. D.h. sie wird im Anschluss an ein Update eines Objektes vom Typ „Bankumsatz“ aufgerufen.
Ihre Methode checkReferences() ist dafür vorgesehen, im Rahmen eines solchen Update-Events notwendige Änderungen an den zugeordneten Referenzobjeten des Bankumsatzes auszulösen. Denkbar wäre dies bspw. für die folgenden Anwendungsfälle:
einem zuvor nicht referenzierten Bankumsatz wird eine Referenz hinzugefügt
aus einem zuvor referenzierten Bankumsatz wird die Referenz wieder entfernt
in einem zuvor referenzierten Bankumsatz wird alte Referenz gegen eine neue Referenz ausgetauscht
Diese Beispiele beziehen sich auf die Variante, in der jedem Bankumsatz maximal eine Referenz zugewiesen werden kann (MT940_REFERENCE_TYPE = SINGLE). Für den Modus MULTIPLE (ein Bankumsatz mehrere Referenzen besitzen) sind analog vergleichbare Anwendungsfälle denkbar.
Möglicherweise passende Anweisungen wären an dieser Stelle bspw.
ein Markieren des Referenzobjekts als „zugeordnet“/“nicht zugeordnet“
ein Statuswechsel für das Referenzobjekt
das Auslösen von Berechnungsschritten, o.ä. auf dem Referenzobjekt
weitere Modifikationen auf dem Referenzobjekt oder auf Bezugsobjekten des Referenzobjekts (referenzierte Objekte, Unterformulareinträge, etc.)
Unter Umständen wäre es sinnvoll, die zu implementierende Logik mit der Logik aus Punkt b) (MT940Importer) von oben abzugleichen.
Empfehlenswert wäre der Ansatz, die Funktionalität dafür in die Klasse MT940Logic (oder einer eigenen Unterklasse der AbstractMT940Logic) einzugliedern.
/** * Check, if the changes done to the given bank transaction should result in further * changes and/or state changes of the references <code>BusinessObject</code> * * @param context the current context * * @throws BusinessException, in case an error or exception occurs */ private void checkReferences(UpdateContext context) throws BusinessException { // @replace! // // This code segment needs to be filled with application specific behaviour. // // }
e) CurrencyWrapper
Die Klasse CurrencyWrapper dient als Nuclet-Schnittstelle zur tatsächlich genutzten Währungsentität. Der Konstruktor der Klasse und die Methode getIso4217Code() sind mit anwendungsspezifischem Verhalten zu befüllen. Letztere Methode sollte den ISO-4217-Währungscode (siehe dazu Wikipedia) des Währunsobjektes zurückliefern. Beispiele dazu sind in Kommentarblöcken angegeben; diese Beispiele sind bei der Integration also an die tatächlich genutzte Währungsentität (bzw. deren BusinessObject-Klasse) anzupassen.
package org.nuclet.mt940.wrapper; import org.nuclos.api.businessobject.BusinessObject; // @replace // // mit eigenem Code zu ersetzen, Beispiel: // // import org.nuclet.currency.Currency; /** * Konkrete Wrapper-Klasse für Währungsobjekte * */ public class CurrencyWrapper extends AbstractCurrencyWrapper { public CurrencyWrapper(final BusinessObject currency) { // @replace Bitte bei Nuclet-Integration mit eigenem Code ersetzen! // // Beispiel: // // if (currency instanceof Currency) { // this.businessObject = currency; // } } /** * Liefert die Datenbank-ID des Währungsobjektes. */ public Long getId() { return this.businessObject.getId(); } /** * Liefert den ISO-4217-Code des Währungsobjektes. * @see https://de.wikipedia.org/wiki/ISO_4217 * @see https://en.wikipedia.org/wiki/ISO_4217 */ public String getIso4217Code() { // @replace Bitte bei Nuclet-Integration mit eigenem Code ersetzen! // // Beispiel: // // return ((Currency)this.businessObject).getIso4217Code(); return null; } }
f) CurrencyFacade
In der Klasse CurrencyFacade muss die Methode getCurrencyByIso4217Code() mit anwendungsspezifischem Verhalten gefüllt werden. Die Methode erwartet einen ISO-4217-Währungscode (siehe Wikipedia) als Parameter und sollte ein Objekt vom Typ CurrencyWrapper (siehe Punkt e), oben) zurückgeben. Ein Beispiel dazu ist in einem Kommentarblock angegeben, dieses Beispiel ist an die tatächlich genutzte Währungsentität (bzw. deren BusinessObject-Klasse) anzupassen.
package org.nuclet.mt940.facade; import java.util.List; import org.nuclos.api.businessobject.Query; import org.nuclos.api.businessobject.QueryOperation; import org.nuclos.api.businessobject.SearchExpression; import org.nuclos.api.context.JobContext; import org.nuclos.api.context.RuleContext; import org.nuclos.api.exception.BusinessException; import org.nuclos.api.provider.QueryProvider; import org.nuclos.api.provider.BusinessObjectProvider; import org.nuclet.common.facade.AbstractFacade; import org.nuclet.mt940.wrapper.AbstractCurrencyWrapper; // @replace! Bitte bei Nuclet-Integration mit eigenem Code ersetzen! // // Beispiel: // // import org.nuclet.currency.Currency; /** * Facade for Business Objects of type "Currency" * */ public class CurrencyFacade extends AbstractCurrencyFacade { private static final CurrencyFacade instance = new CurrencyFacade(); /** * Liefert die Singleton-Instanz dieser Klasse * */ public static CurrencyFacade getInstance() { return instance; } /** * Fetches the currency which determined by a given ISO 4217 code from the database * * @param strIso4217Code the ISO 4217 code of the currency to be found * * @return the currency which is marked as "base currency" from the database * @throws BusinessException, if more than one currency-objects are found */ public AbstractCurrencyWrapper getCurrencyByIso4217Code(final String strIso4217Code) { // @replace! Bitte bei Nuclet-Integration mit eigenem Code ersetzen! // // Beispiel: // // // final Query<Currency> queryGetCurrency = QueryProvider.create(Currency.class); // queryGetCurrency.where(Currency.Iso4217Code.eq(strIso4217Code)); // // final List<Currency> lstCurrency = QueryProvider.execute(queryGetCurrency); // // if (lstCurrency != null && lstCurrency.size() > 0) { // return new CurrencyWrapper(lstCurrency.get(0)); // } else { // return null; // } return null; } }