XmlPort 1001 SEPA CT pain.001.001.09
- App
- Base Application
- Namespace
- Microsoft.Bank.DirectDebit
- Versions
- 24-28
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Bank/DirectDebit/SEPACTpain00100109.XmlPort.al472 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.Finance.GeneralLedger.Journal;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Company;
using System.Telemetry;
/// <summary>
/// XMLPort for exporting SEPA credit transfers in pain.001.001.09 format.
/// Generates XML files compliant with SEPA Customer Credit Transfer Initiation standard version 9
/// for submission to banks for automated payment processing.
/// </summary>
xmlport 1001 "SEPA CT pain.001.001.09"
{
Caption = 'SEPA CT pain.001.001.09';
DefaultNamespace = 'urn:iso:std:iso:20022:tech:xsd:pain.001.001.09';
Direction = Export;
Encoding = UTF8;
FormatEvaluate = Xml;
UseDefaultNamespace = true;
schema
{
tableelement("Gen. Journal Line"; "Gen. Journal Line")
{
XmlName = 'Document';
UseTemporary = true;
tableelement(companyinformation; "Company Information")
{
XmlName = 'CstmrCdtTrfInitn';
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(initgptyid)
{
XmlName = 'Id';
textelement(initgptyorgid)
{
XmlName = 'OrgId';
textelement(initgptyothrinitgpty)
{
XmlName = 'Othr';
fieldelement(Id; CompanyInformation."VAT Registration No.")
{
}
}
}
}
}
}
tableelement(paymentexportdatagroup; "Payment Export Data")
{
XmlName = 'PmtInf';
UseTemporary = true;
fieldelement(PmtInfId; PaymentExportDataGroup."Payment Information ID")
{
}
fieldelement(PmtMtd; PaymentExportDataGroup."SEPA Payment Method Text")
{
}
fieldelement(BtchBookg; PaymentExportDataGroup."SEPA Batch Booking")
{
}
fieldelement(NbOfTxs; PaymentExportDataGroup."Line No.")
{
}
fieldelement(CtrlSum; PaymentExportDataGroup.Amount)
{
}
textelement(PmtTpInf)
{
fieldelement(InstrPrty; PaymentExportDataGroup."SEPA Instruction Priority Text")
{
}
textelement(SvcLvl)
{
textelement(Cd)
{
trigger OnBeforePassVariable()
var
GeneralLedgerSetup: Record "General Ledger Setup";
begin
GeneralLedgerSetup.Get();
if GeneralLedgerSetup."SEPA Non-Euro Export" then
Cd := 'NURG'
else
Cd := 'SEPA';
end;
}
}
}
textelement(ReqdExctnDt)
{
fieldelement(Dt; PaymentExportDataGroup."Transfer Date")
{
}
}
textelement(Dbtr)
{
fieldelement(Nm; CompanyInformation.Name)
{
}
textelement(dbtrpstladr)
{
XmlName = '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(dbtrid)
{
XmlName = 'Id';
textelement(dbtrorgid)
{
XmlName = 'OrgId';
fieldelement(AnyBIC; PaymentExportDataGroup."Sender Bank BIC")
{
}
}
trigger OnBeforePassVariable()
begin
if PaymentExportDataGroup."Sender Bank BIC" = '' then
currXMLport.Skip();
end;
}
}
textelement(DbtrAcct)
{
textelement(dbtracctid)
{
XmlName = 'Id';
fieldelement(IBAN; PaymentExportDataGroup."Sender Bank Account No.")
{
MaxOccurs = Once;
MinOccurs = Once;
}
}
}
textelement(DbtrAgt)
{
textelement(dbtragtfininstnid)
{
XmlName = 'FinInstnId';
fieldelement(BICFI; 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")
{
}
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 Batch Booking" = field("SEPA Batch Booking"), "SEPA Charge Bearer Text" = field("SEPA Charge Bearer Text");
LinkTable = PaymentExportDataGroup;
XmlName = 'CdtTrfTxInf';
UseTemporary = true;
textelement(PmtId)
{
fieldelement(EndToEndId; PaymentExportData."End-to-End ID")
{
}
}
textelement(Amt)
{
fieldelement(InstdAmt; PaymentExportData.Amount)
{
fieldattribute(Ccy; PaymentExportData."Currency Code")
{
}
}
}
textelement(CdtrAgt)
{
textelement(cdtragtfininstnid)
{
XmlName = 'FinInstnId';
fieldelement(BICFI; PaymentExportData."Recipient Bank BIC")
{
FieldValidate = yes;
}
}
trigger OnBeforePassVariable()
begin
if PaymentExportData."Recipient Bank BIC" = '' then
currXMLport.Skip();
end;
}
textelement(Cdtr)
{
fieldelement(Nm; PaymentExportData."Recipient Name")
{
}
textelement(cdtrpstladr)
{
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;
}
trigger OnBeforePassVariable()
begin
if (PaymentExportData."Recipient Address" = '') and
(PaymentExportData."Recipient Post Code" = '') and
(PaymentExportData."Recipient City" = '') and
(PaymentExportData."Recipient Country/Region Code" = '')
then
currXMLport.Skip();
end;
}
}
textelement(CdtrAcct)
{
textelement(cdtracctid)
{
XmlName = 'Id';
fieldelement(IBAN; PaymentExportData."Recipient Bank Acc. No.")
{
FieldValidate = yes;
MaxOccurs = Once;
MinOccurs = Once;
}
}
}
textelement(RmtInf)
{
MinOccurs = Zero;
textelement(remittancetext)
{
MinOccurs = Zero;
XmlName = 'Ustrd';
}
trigger OnBeforePassVariable()
var
SeparatorText: Text;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforePassVariableRmtInf(PaymentExportData, RemittanceText, IsHandled);
if IsHandled then
exit;
RemittanceText := '';
TempPaymentExportRemittanceText.SetRange("Pmt. Export Data Entry No.", PaymentExportData."Entry No.");
if not TempPaymentExportRemittanceText.FindSet() then
currXMLport.Skip();
RemittanceText := TempPaymentExportRemittanceText.Text;
if TempPaymentExportRemittanceText.Next() = 0 then
exit;
SeparatorText := ', ';
OnSpecifyRemittanceTextSeparatorText(SeparatorText);
RemittanceText := CopyStr(
StrSubstNo('%1%2%3', RemittanceText, SeparatorText, TempPaymentExportRemittanceText.Text), 1, 140);
end;
}
}
}
trigger OnAfterGetRecord()
begin
if not PaymentExportData.GetPreserveNonLatinCharacters() then
PaymentExportData.CompanyInformationConvertToLatin(CompanyInformation);
end;
}
}
}
requestpage
{
layout
{
}
actions
{
}
}
trigger OnPreXmlPort()
var
FeatureTelemetry: Codeunit "Feature Telemetry";
SEPACTExportFile: Codeunit "SEPA CT-Export File";
begin
FeatureTelemetry.LogUptake('0000N1Z', SEPACTExportFile.FeatureName(), Enum::"Feature Uptake Status"::Used);
FeatureTelemetry.LogUsage('0000N20', SEPACTExportFile.FeatureName(), 'XmlPort SEPA CT pain.001.001.09');
InitData();
end;
var
TempPaymentExportRemittanceText: Record "Payment Export Remittance Text" temporary;
NoDataToExportErr: Label 'There is no data to export.', Comment = '%1=Field;%2=Value;%3=Value';
local procedure InitData()
var
SEPACTFillExportBuffer: Codeunit "SEPA CT-Fill Export Buffer";
PaymentGroupNo: Integer;
begin
SEPACTFillExportBuffer.FillExportBuffer("Gen. Journal Line", PaymentExportData);
PaymentExportData.GetRemittanceTexts(TempPaymentExportRemittanceText);
NoOfTransfers := Format(PaymentExportData.Count);
MessageID := PaymentExportData."Message ID";
CreatedDateTime := Format(CurrentDateTime, 19, 9);
PaymentExportData.CalcSums(Amount);
ControlSum := Format(PaymentExportData.Amount, 0, 9);
PaymentExportData.SetCurrentKey(
"Sender Bank BIC", "SEPA Instruction Priority Text", "Transfer Date",
"SEPA Batch Booking", "SEPA Charge Bearer Text");
if not PaymentExportData.FindSet() then
Error(NoDataToExportErr);
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 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;
[IntegrationEvent(false, false)]
local procedure OnSpecifyRemittanceTextSeparatorText(var SeparatorText: Text)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforePassVariableRmtInf(PaymentExportData: Record "Payment Export Data"; var RemittanceText: Text; var IsHandled: Boolean)
begin
end;
}