XmlPort 1010 SEPA DD pain.008.001.02
- App
- Base Application
- Namespace
- Microsoft.Bank.DirectDebit
- Versions
- 17-28
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Bank/DirectDebit/SEPADDpain00800102.XmlPort.al487 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Bank.DirectDebit;
using Microsoft.Bank.Payment;
using Microsoft.Foundation.Company;
using System.Telemetry;
/// <summary>
/// XMLPort for exporting SEPA direct debits in pain.008.001.02 format.
/// Generates XML files compliant with SEPA Customer Direct Debit Initiation standard
/// for submission to banks for automated payment collection processing.
/// </summary>
xmlport 1010 "SEPA DD pain.008.001.02"
{
Caption = 'SEPA DD pain.008.001.02';
DefaultNamespace = 'urn:iso:std:iso:20022:tech:xsd:pain.008.001.02';
Direction = Export;
Encoding = UTF8;
FormatEvaluate = Xml;
UseDefaultNamespace = true;
schema
{
tableelement("Direct Debit Collection Entry"; "Direct Debit Collection Entry")
{
XmlName = 'Document';
UseTemporary = true;
tableelement(companyinformation; "Company Information")
{
XmlName = 'CstmrDrctDbtInitn';
textelement(GrpHdr)
{
textelement(messageid)
{
XmlName = 'MsgId';
}
textelement(createddatetime)
{
XmlName = 'CreDtTm';
}
textelement(nooftransfers)
{
XmlName = 'NbOfTxs';
}
textelement(controlsum)
{
XmlName = 'CtrlSum';
}
textelement(InitgPty)
{
fieldelement(Nm; CompanyInformation.Name)
{
}
textelement(PstlAdr)
{
fieldelement(StrtNm; CompanyInformation.Address)
{
trigger OnBeforePassField()
begin
if CompanyInformation.Address = '' then
currXMLport.Skip();
end;
}
fieldelement(PstCd; CompanyInformation."Post Code")
{
trigger OnBeforePassField()
begin
if CompanyInformation."Post Code" = '' then
currXMLport.Skip();
end;
}
fieldelement(TwnNm; CompanyInformation.City)
{
trigger OnBeforePassField()
begin
if CompanyInformation.City = '' then
currXMLport.Skip();
end;
}
fieldelement(Ctry; CompanyInformation."Country/Region Code")
{
trigger OnBeforePassField()
begin
if CompanyInformation."Country/Region Code" = '' then
currXMLport.Skip();
end;
}
}
textelement(Id)
{
textelement(OrgId)
{
textelement(Othr)
{
textelement(OrganizationID)
{
XmlName = 'Id';
trigger OnBeforePassVariable()
begin
OrganizationID := paymentexportdatagroup.GetOrganizationID();
end;
}
}
}
}
}
}
tableelement(paymentexportdatagroup; "Payment Export Data")
{
XmlName = 'PmtInf';
UseTemporary = true;
fieldelement(PmtInfId; PaymentExportDataGroup."Payment Information ID")
{
}
textelement(paymentmethoddd)
{
XmlName = 'PmtMtd';
}
fieldelement(BtchBookg; PaymentExportDataGroup."SEPA Batch Booking")
{
}
fieldelement(NbOfTxs; PaymentExportDataGroup."Line No.")
{
}
fieldelement(CtrlSum; PaymentExportDataGroup.Amount)
{
}
textelement(PmtTpInf)
{
textelement(SvcLvl)
{
textelement(servicelevelcodesepa)
{
XmlName = 'Cd';
}
}
textelement(LclInstrm)
{
fieldelement(Cd; PaymentExportDataGroup."SEPA Partner Type Text")
{
}
}
fieldelement(SeqTp; PaymentExportDataGroup."SEPA Direct Debit Seq. Text")
{
}
}
fieldelement(ReqdColltnDt; PaymentExportDataGroup."Transfer Date")
{
}
textelement(Cdtr)
{
textelement(companyinformationname)
{
XmlName = 'Nm';
}
textelement(cdrid)
{
XmlName = 'Id';
textelement(cdrorgid)
{
XmlName = 'OrgId';
fieldelement(BICOrBEI; PaymentExportDataGroup."Sender Bank BIC")
{
}
}
trigger OnBeforePassVariable()
begin
if PaymentExportDataGroup."Sender Bank BIC" = '' then
currXMLport.Skip();
end;
}
}
textelement(CdtrAcct)
{
textelement(cdtracctid)
{
XmlName = 'Id';
fieldelement(IBAN; PaymentExportDataGroup."Sender Bank Account No.")
{
}
}
}
textelement(CdtrAgt)
{
textelement(FinInstnId)
{
fieldelement(BIC; PaymentExportDataGroup."Sender Bank BIC")
{
MaxOccurs = Once;
MinOccurs = Once;
}
}
trigger OnBeforePassVariable()
begin
if PaymentExportDataGroup."Sender Bank BIC" = '' then
currXMLport.Skip();
end;
}
fieldelement(ChrgBr; PaymentExportDataGroup."SEPA Charge Bearer Text")
{
}
textelement(CdtrSchmeId)
{
textelement(cdtrschmeidid)
{
XmlName = 'Id';
textelement(PrvtId)
{
textelement(cdtrschmeidothr)
{
XmlName = 'Othr';
fieldelement(Id; PaymentExportDataGroup."Creditor No.")
{
}
textelement(SchmeNm)
{
textelement(schmenmprtry)
{
XmlName = 'Prtry';
}
}
}
}
}
}
tableelement(paymentexportdata; "Payment Export Data")
{
LinkFields = "Sender Bank BIC" = field("Sender Bank BIC"), "SEPA Instruction Priority Text" = field("SEPA Instruction Priority Text"), "Transfer Date" = field("Transfer Date"), "SEPA Direct Debit Seq. Text" = field("SEPA Direct Debit Seq. Text"), "SEPA Partner Type Text" = field("SEPA Partner Type Text"), "SEPA Batch Booking" = field("SEPA Batch Booking"), "SEPA Charge Bearer Text" = field("SEPA Charge Bearer Text");
LinkTable = PaymentExportDataGroup;
XmlName = 'DrctDbtTxInf';
UseTemporary = true;
textelement(PmtId)
{
fieldelement(InstrId; PaymentExportData."Payment Information ID")
{
}
fieldelement(EndToEndId; PaymentExportData."End-to-End ID")
{
}
}
fieldelement(InstdAmt; PaymentExportData.Amount)
{
fieldattribute(Ccy; PaymentExportData."Currency Code")
{
}
}
textelement(DrctDbtTx)
{
textelement(MndtRltdInf)
{
fieldelement(MndtId; PaymentExportData."SEPA Direct Debit Mandate ID")
{
}
fieldelement(DtOfSgntr; PaymentExportData."SEPA DD Mandate Signed Date")
{
}
}
}
textelement(DbtrAgt)
{
textelement(dbtragtfininstnid)
{
XmlName = 'FinInstnId';
fieldelement(BIC; PaymentExportData."Recipient Bank BIC")
{
}
}
trigger OnBeforePassVariable()
begin
if PaymentExportData."Recipient Bank BIC" = '' then
currXMLport.Skip();
end;
}
textelement(Dbtr)
{
fieldelement(Nm; PaymentExportData."Recipient Name")
{
}
textelement(dbtrpstladr)
{
XmlName = 'PstlAdr';
fieldelement(StrtNm; PaymentExportData."Recipient Address")
{
trigger OnBeforePassField()
begin
if PaymentExportData."Recipient Address" = '' then
currXMLport.Skip();
end;
}
fieldelement(PstCd; PaymentExportData."Recipient Post Code")
{
trigger OnBeforePassField()
begin
if PaymentExportData."Recipient Post Code" = '' then
currXMLport.Skip();
end;
}
fieldelement(TwnNm; PaymentExportData."Recipient City")
{
trigger OnBeforePassField()
begin
if PaymentExportData."Recipient City" = '' then
currXMLport.Skip();
end;
}
fieldelement(Ctry; PaymentExportData."Recipient Country/Region Code")
{
trigger OnBeforePassField()
begin
if PaymentExportData."Recipient Country/Region Code" = '' then
currXMLport.Skip();
end;
}
}
textelement(dbtrid)
{
XmlName = 'Id';
textelement(dbtrorgid)
{
XmlName = 'OrgId';
fieldelement(BICOrBEI; PaymentExportData."Recipient Bank BIC")
{
}
}
trigger OnBeforePassVariable()
begin
if PaymentExportData."Recipient Bank BIC" = '' then
currXMLport.Skip();
end;
}
}
textelement(DbtrAcct)
{
textelement(dbtracctid)
{
XmlName = 'Id';
fieldelement(IBAN; PaymentExportData."Recipient Bank Acc. No.")
{
}
}
}
textelement(RmtInf)
{
textelement(remittancetext)
{
XmlName = 'Ustrd';
trigger OnBeforePassVariable()
begin
if PaymentExportData."Message to Recipient 2" <> '' then
RemittanceText := PaymentExportData."Message to Recipient 2"
else
RemittanceText := PaymentExportData."Message to Recipient 1" + ', ' + PaymentExportData."Document No.";
end;
}
trigger OnBeforePassVariable()
begin
if (PaymentExportData."Message to Recipient 1" = '') and
(PaymentExportData."Message to Recipient 2" = '') and
(PaymentExportData."Document No." = '') then
currXMLport.Skip();
end;
}
}
}
trigger OnAfterGetRecord()
begin
if not PaymentExportData.GetPreserveNonLatinCharacters() then
PaymentExportData.CompanyInformationConvertToLatin(CompanyInformation);
CompanyInformationName := CompanyInformation.Name;
end;
}
}
}
requestpage
{
layout
{
}
actions
{
}
}
trigger OnPreXmlPort()
var
FeatureTelemetry: Codeunit "Feature Telemetry";
SEPADDExportFile: Codeunit "SEPA DD-Export File";
begin
FeatureTelemetry.LogUptake('0000N21', SEPADDExportFile.FeatureName(), Enum::"Feature Uptake Status"::Used);
FeatureTelemetry.LogUsage('0000N22', SEPADDExportFile.FeatureName(), 'XmlPort SEPA DD pain.008.001.02');
InitData();
end;
var
NoDataToExportErr: Label 'There is no data to export. Make sure the %1 field is not set to %2 or %3.', Comment = '%1=Field;%2=Value;%3=Value';
local procedure InitData()
var
DirectDebitCollectionEntry: Record "Direct Debit Collection Entry";
DirectDebitCollection: Record "Direct Debit Collection";
SEPADDFillExportBuffer: Codeunit "SEPA DD-Fill Export Buffer";
PaymentGroupNo: Integer;
begin
SEPADDFillExportBuffer.FillExportBuffer("Direct Debit Collection Entry", PaymentExportData);
PaymentMethodDD := 'DD';
ServiceLevelCodeSEPA := 'SEPA';
SchmeNmPrtry := 'SEPA';
NoOfTransfers := Format(PaymentExportData.Count);
MessageID := PaymentExportData."Message ID";
CreatedDateTime := Format(CurrentDateTime, 19, 9);
PaymentExportData.CalcSums(Amount);
ControlSum := Format(PaymentExportData.Amount, 0, '<Precision,2:2><Standard Format,9>');
PaymentExportData.SetCurrentKey(
"Sender Bank BIC", "SEPA Instruction Priority Text", "Transfer Date",
"SEPA Direct Debit Seq. Text", "SEPA Partner Type Text", "SEPA Batch Booking", "SEPA Charge Bearer Text");
if not PaymentExportData.FindSet() then
Error(NoDataToExportErr, DirectDebitCollectionEntry.FieldCaption(Status),
DirectDebitCollectionEntry.Status::Rejected, DirectDebitCollection.Status::Canceled);
InitPmtGroup();
repeat
if IsNewGroup() then begin
InsertPmtGroup(PaymentGroupNo);
InitPmtGroup();
end;
PaymentExportDataGroup."Line No." += 1;
PaymentExportDataGroup.Amount += PaymentExportData.Amount;
until PaymentExportData.Next() = 0;
InsertPmtGroup(PaymentGroupNo);
end;
local procedure IsNewGroup(): Boolean
begin
exit(
(PaymentExportData."Sender Bank BIC" <> PaymentExportDataGroup."Sender Bank BIC") or
(PaymentExportData."SEPA Instruction Priority Text" <> PaymentExportDataGroup."SEPA Instruction Priority Text") or
(PaymentExportData."Transfer Date" <> PaymentExportDataGroup."Transfer Date") or
(PaymentExportData."SEPA Direct Debit Seq. Text" <> PaymentExportDataGroup."SEPA Direct Debit Seq. Text") or
(PaymentExportData."SEPA Partner Type Text" <> PaymentExportDataGroup."SEPA Partner Type Text") or
(PaymentExportData."SEPA Batch Booking" <> PaymentExportDataGroup."SEPA Batch Booking") or
(PaymentExportData."SEPA Charge Bearer Text" <> PaymentExportDataGroup."SEPA Charge Bearer Text"));
end;
local procedure InitPmtGroup()
begin
PaymentExportDataGroup := PaymentExportData;
PaymentExportDataGroup."Line No." := 0; // used for counting transactions within group
PaymentExportDataGroup.Amount := 0; // used for summarizing transactions within group
end;
local procedure InsertPmtGroup(var PaymentGroupNo: Integer)
begin
PaymentGroupNo += 1;
PaymentExportDataGroup."Entry No." := PaymentGroupNo;
PaymentExportDataGroup."Payment Information ID" :=
CopyStr(
StrSubstNo('%1/%2', PaymentExportData."Message ID", PaymentGroupNo),
1, MaxStrLen(PaymentExportDataGroup."Payment Information ID"));
PaymentExportDataGroup.Insert();
end;
}