Extending Banking Export
This article provides an overview for partners extending Continia Banking. It introduces the public extensibility points used for payment export and reconciliation and shows the minimum AL patterns for common scenarios.
Use this article to determine where to extend and which pattern to use.
To choose the correct extensibility surface
The following table maps each scenario to the surface that handles it and the pattern you apply.
| Scenario | Surface | How to extend |
|---|---|---|
| Override creditor or debtor identity for Vendor, Customer, or Employee journal lines. | 1 (migrated) | Subscribe to OnBeforeGet*Information* events on CTS-CB Pmt. Entry Mgt. Publ. and populate the Alt. Pmt. Creditor or Alt. Pmt. Debtor buffer. |
| Provide creditor and bank details for custom ad hoc payments. | 1 (ad hoc) | Subscribe to the three OnBeforeFillAlternate* events on CTS-CB Pmt. Entry Mgt. Publ. and set Handled := true for each scope you populate. |
| Include additional remittance text. | 2 | Subscribe to OnAfterCalcRemForJournalLine or OnAfterCalcRemForSuggestion on CTS-PE Rem. Info. Pub.. |
Warning
If your solution subscribes to events on CTS-CB Pmt. Entry Mgt. Ext. Publ., those subscriptions continue to work in Continia Banking 2026 release wave 1 (version 28.1). However, this publisher and its buffers are obsolete and will be removed in a future release. To ensure compatibility, migrate to the new public publisher CTS-CB Pmt. Entry Mgt. Publ.
Migrated events for master data overrides - Surface 1
Use surface 1 for migrated events to override values that Continia derives from master data (vendor, customer, or employee). The engine provides a temporary, scope-specific buffer. Write your values directly to this buffer.
To override Vendor creditor data
- Create a subscriber codeunit and set
SingleInstance = true. - Subscribe to
OnBeforeGetVendorInformationAsCreditoronCTS-CB Pmt. Entry Mgt. Publ.. - Read your override record. If no override exists, exit the procedure.
- Assign the override values to the
Alt. Pmt. Creditorbuffer fields. - (Optional) Set
Delete Empty Valuestotrueto clear engine values when overrides are blank.
Example
codeunit 50000 "Banking Vendor Creditor Subscriber"
{
SingleInstance = true;
[EventSubscriber(
ObjectType::Codeunit,
Codeunit::"CTS-CB Pmt. Entry Mgt. Publ.",
'OnBeforeGetVendorInformationAsCreditor',
'',
false,
false)]
local procedure OverrideVendorCreditor(
VendorNo: Code[20];
var AltPmtCreditor: Record "CTS-CB Alt. Pmt. Creditor" temporary)
var
VendorOverride: Record "MyApp Vendor Override";
begin
if not VendorOverride.Get(VendorNo) then
exit;
AltPmtCreditor."Creditor Name" := VendorOverride.OverrideName;
AltPmtCreditor."Creditor Address" := VendorOverride.OverrideAddress;
// Optional: clear engine values when overrides are blank.
// AltPmtCreditor."Delete Empty Values" := true;
end;
}
How Continia applies the override
- Continia loads data from the master record.
- Your buffer values are merged with the engine values.
- Non-blank buffer fields override system values.
- Blank buffer fields are ignored, unless
Delete Empty Values = true.
Ad hoc events for custom payees - Surface 1
Use surface 1 for ad hoc events when a journal line does not reference a standard payee (vendor, customer, or employee). For ad hoc payments, Continia raises three separate events, one for each data scope:
- Account
- Creditor
- Creditor bank
Subscribe only to the scopes that you populate. Set Handled := true for each scope you take over.
To provide full ad hoc payee information
- Create a subscriber codeunit with
SingleInstance = true. - Add a helper procedure that identifies your ad hoc scenario.
- Subscribe to
OnBeforeFillAlternateAccountand assign the routing values. SetHandled := true. - Subscribe to
OnBeforeFillAlternateCreditorand assign creditor identity and address fields. SetHandled := true. - Subscribe to
OnBeforeFillAlternateCreditorBankand assign IBAN, SWIFT, and bank details. SetHandled := true.
Example
codeunit 50001 "Banking AdHoc Subscriber"
{
SingleInstance = true;
[EventSubscriber(
ObjectType::Codeunit,
Codeunit::"CTS-CB Pmt. Entry Mgt. Publ.",
'OnBeforeFillAlternateAccount',
'',
false,
false)]
local procedure FillAccount(
GenJournalLine: Record "Gen. Journal Line";
var AltPmtAccount: Record "CTS-CB Alt. Pmt. Account" temporary;
var Handled: Boolean)
begin
if not IsAdHoc(GenJournalLine) then
exit;
AltPmtAccount."Alternate Account No." := 'YOUR-ROUTING-CODE';
Handled := true;
end;
[EventSubscriber(
ObjectType::Codeunit,
Codeunit::"CTS-CB Pmt. Entry Mgt. Publ.",
'OnBeforeFillAlternateCreditor',
'',
false,
false)]
local procedure FillCreditor(
GenJournalLine: Record "Gen. Journal Line";
var AltPmtCreditor: Record "CTS-CB Alt. Pmt. Creditor" temporary;
var Handled: Boolean)
begin
if not IsAdHoc(GenJournalLine) then
exit;
AltPmtCreditor."Creditor Name" := 'Acme Industries';
AltPmtCreditor."Creditor Address" := 'Hovedgaden 1';
AltPmtCreditor."Creditor City" := 'Copenhagen';
AltPmtCreditor."Creditor Country Code" := 'DK';
Handled := true;
end;
[EventSubscriber(
ObjectType::Codeunit,
Codeunit::"CTS-CB Pmt. Entry Mgt. Publ.",
'OnBeforeFillAlternateCreditorBank',
'',
false,
false)]
local procedure FillBank(
GenJournalLine: Record "Gen. Journal Line";
var AltPmtCreditorBank: Record "CTS-CB Alt. Pmt. Creditor Bank" temporary;
var Handled: Boolean)
begin
if not IsAdHoc(GenJournalLine) then
exit;
AltPmtCreditorBank."Creditor IBAN" := 'DK5000400440116243';
AltPmtCreditorBank."Creditor Swift" := 'DABADKKK';
Handled := true;
end;
local procedure IsAdHoc(GenJournalLine: Record "Gen. Journal Line"): Boolean
begin
// Replace this with the logic that identifies the ad hoc case for your scenario.
exit(GenJournalLine."Account Type" = GenJournalLine."Account Type"::"G/L Account");
end;
}
Note
Scope is enforced by the buffer schema. Each event exposes only the fields that apply to that scope. The AL compiler prevents you from writing creditor identity fields to a bank buffer, and vice versa.
Include additional remittance text - Surface 2
Use surface 2 to add supplementary remittance text. Choose the event based on when your data is available.
| Event | When it runs | Context |
|---|---|---|
OnAfterCalcRemForJournalLine | After remittance lines are transferred to a journal line. | GenJournalLine |
OnAfterCalcRemForSuggestion | After remittance is written for a suggestion. | PaymentSuggestionHead |
Insert one record per line into the buffer. Continia assigns line numbers automatically.
To include additional remittance text
- Create a subscriber codeunit and set
SingleInstance = true. - Subscribe to
OnAfterCalcRemForJournalLineonCTS-PE Rem. Info. Pub.. - Read your additional remittance text record using
GenJournalLine."CTS-CB End To End Id"as the key. If no record exists, exit the procedure. - Insert one record per advice line into the
Alt. Rem. Info. Linebuffer. Use a helper procedure to truncate the text to the field length. - (Optional) Set
ReplaceSystemRows := trueto delete Continia's system rows before the buffer is processed.
Example
codeunit 50102 "Banking Long Advice Subscriber"
{
SingleInstance = true;
[EventSubscriber(
ObjectType::Codeunit,
Codeunit::"CTS-PE Rem. Info. Pub.",
'OnAfterCalcRemForJournalLine',
'',
false,
false)]
local procedure AppendLongAdvice(
GenJournalLine: Record "Gen. Journal Line";
var AltRemInfoLine: Record "CTS-CB Alt. Rem. Info. Line" temporary;
var ReplaceSystemRows: Boolean)
var
LongAdvice: Record "MyApp Long Advice";
begin
if not LongAdvice.Get(GenJournalLine."CTS-CB End To End Id") then
exit;
InsertLine(AltRemInfoLine, 1, 'Invoice ' + LongAdvice."Invoice No.");
InsertLine(AltRemInfoLine, 2, 'Reference: ' + LongAdvice.Reference);
// Optional: set ReplaceSystemRows := true to replace system remittance lines.
end;
local procedure InsertLine(
var AltRemInfoLine: Record "CTS-CB Alt. Rem. Info. Line";
EntryNo: Integer;
LineText: Text)
begin
AltRemInfoLine.Init();
AltRemInfoLine."Entry No." := EntryNo;
AltRemInfoLine."Remittance Text" :=
CopyStr(LineText, 1, MaxStrLen(AltRemInfoLine."Remittance Text"));
AltRemInfoLine.Insert();
end;
}
Behavior details
Remittance Textis truncated to 180 characters.- In the journal-line scope,
End To End Idfalls back to the journal line value if blank. - In the suggestion scope,
End To End Idis ignored. ReplaceSystemRows := truehas no effect if the buffer is empty. Continia preserves system rows unless you provide at least one replacement record.