Codeunit 561 IC Data Exchange API, source in 29

Source29

src/Layers/W1/BaseApp/Finance/Intercompany/DataExchange/ICDataExchangeAPI.Codeunit.al1525 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.Intercompany.DataExchange;

using Microsoft.Bank.BankAccount;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.Foundation.Company;
using Microsoft.Intercompany;
using Microsoft.Intercompany.Comment;
using Microsoft.Intercompany.Dimension;
using Microsoft.Intercompany.GLAccount;
using Microsoft.Intercompany.Inbox;
using Microsoft.Intercompany.Journal;
using Microsoft.Intercompany.Outbox;
using Microsoft.Intercompany.Partner;
using Microsoft.Intercompany.Setup;
using System.Globalization;
using System.Telemetry;
using System.Threading;

/// <summary>
/// Implements API-based intercompany data exchange for cross-system communication between partner companies.
/// Provides secure transaction posting, data synchronization, and notification management through web service APIs.
/// </summary>
codeunit 561 "IC Data Exchange API" implements "IC Data Exchange"
{
    Permissions = tabledata "IC Inbox Transaction" = i,
                  tabledata "IC Inbox Jnl. Line" = i,
                  tabledata "IC Inbox Purchase Header" = i,
                  tabledata "IC Inbox Purchase Line" = i,
                  tabledata "IC Inbox Sales Header" = i,
                  tabledata "IC Inbox Sales Line" = i,
                  tabledata "IC Inbox/Outbox Jnl. Line Dim." = i,
                  tabledata "IC Document Dimension" = i,
                  tabledata "IC Comment Line" = i;

    var
        CrossIntercompanyConnector: Codeunit "CrossIntercompany Connector";
        CurrentGlobalLanguage: Integer;
        JsonResponse: JsonArray;
        SelectedToken: JsonToken;
        AttributeToken: JsonToken;

        ICDataExchangeAPIFeatureTelemetryNameTok: Label 'Intercompany Data Exchange API', Locked = true;
        JobQueueCategoryCodeSendNotificationTok: Label 'ICSENDNOT', Locked = true;
        JobQueueCategoryCodeReadTransactionTok: Label 'ICREADTRAN', Locked = true;
        JobQueueCategoryCodeCleanUpTok: Label 'ICCLEANUP', Locked = true;
        JobQueueCategoryCodeAutoAcceptTok: Label 'ICAUTOACC', Locked = true;
        SecurityLogDecriptionTok: Label 'Suspicious IC transaction', Locked = true;
        ICPartnerMissingCurrentCompanyErr: Label 'The current company is not registered as a partner in the list of partners of company %1', Comment = '%1 = Partner company name';
        PartnerMissingTableSetupErr: Label 'Partner %1 has not completed the information required at table %2 for using intercompany.', Comment = '%1 = Partner code, %2 = Table caption';
        WrongICPartnerInboxTypeErr: Label 'Partner %1 inbox type is not valid for this interaction. Only partners with database as Inbox Type can be used.', Comment = '%1 = IC Partner Code';
        WrongICDataExchangeTypeErr: Label 'Partner %1 does not support intercompany communication using APIs. Only partners setup to use API as their data exchange type can use this type of communication.', Comment = '%1 = IC Partner Code';
        SendNotificationJobQueueTxt: Label 'API - Send notification to intercompany partner %1 for operation %2', Comment = '%1 = Partner Code, %2 = Operation Id';
        ReadOutgoingNotificationJobQueueTxt: Label 'API - Read outgoing notification from intercompany partner %1 for operation %2', Comment = '%1 = Partner Code, %2 = Operation Id';
        CleanUpOutgoingNotificationJobQueueTxt: Label 'API - Clean up notification to intercompany partner %1 for operation %2', Comment = '%1 = Partner Code, %2 = Operation Id';
        AutoAcceptTransactionJobQueueTxt: Label 'API - Automatically accept transaction %1 of partner %2 for document %3', Comment = '%1 = Transaction ID, %2 = Partner Code, %3 = Document No.';
        ICPartnerNotFoundErr: Label 'IC Partner %1 not found.', Comment = '%1 = IC Partner Code';
        SentTransactionTelemetryTxt: Label 'Transaction sent to IC Partner %1 from source %2.', Comment = '%1 = Target IC Partner Code, %2 = Source IC Partner Code';
        SecurityLogResultDescriptionTxt: Label 'Mismatch between transaction source intercompany code %1 and current company intercompany code %2.', Comment = '%1 = Source IC Partner Code, %2 = Current company IC Partner Code';

    /// <summary>
    /// Retrieves intercompany G/L accounts from a partner company via API connection.
    /// Populates temporary table with partner's G/L account structure for mapping and synchronization.
    /// </summary>
    /// <param name="ICPartner">Partner company to retrieve G/L accounts from</param>
    /// <param name="TempICPartnerICGLAccount">Temporary table to populate with partner's G/L accounts</param>
    procedure GetICPartnerICGLAccount(ICPartner: Record "IC Partner"; var TempICPartnerICGLAccount: Record "IC G/L Account" temporary)
    begin
        TempICPartnerICGLAccount.Reset();
        TempICPartnerICGLAccount.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerRecordsFromEntityName(ICPartner, 'intercompanyGeneralLedgerAccounts');

        foreach SelectedToken in JsonResponse do
            PopulateICGLAccountFromJson(SelectedToken, TempICPartnerICGLAccount);
    end;

    /// <summary>
    /// Retrieves intercompany dimensions from a partner company via API connection.
    /// Populates temporary table with partner's dimension structure for validation and mapping.
    /// </summary>
    /// <param name="ICPartner">Partner company to retrieve dimensions from</param>
    /// <param name="TempICPartnerICDimension">Temporary table to populate with partner's dimensions</param>
    procedure GetICPartnerICDimension(ICPartner: Record "IC Partner"; var TempICPartnerICDimension: Record "IC Dimension" temporary)
    begin
        TempICPartnerICDimension.Reset();
        TempICPartnerICDimension.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerRecordsFromEntityName(ICPartner, 'intercompanyDimensions');

        foreach SelectedToken in JsonResponse do
            PopulateICDimensionFromJson(SelectedToken, TempICPartnerICDimension);
    end;

    /// <summary>
    /// Retrieves intercompany dimension values from a partner company via API connection.
    /// Populates temporary table with partner's dimension values for transaction validation.
    /// </summary>
    /// <param name="ICPartner">Partner company to retrieve dimension values from</param>
    /// <param name="TempICPartnerICDimensionValue">Temporary table to populate with partner's dimension values</param>
    procedure GetICPartnerICDimensionValue(ICPartner: Record "IC Partner"; var TempICPartnerICDimensionValue: Record "IC Dimension Value" temporary)
    begin
        TempICPartnerICDimensionValue.Reset();
        TempICPartnerICDimensionValue.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerRecordsFromEntityName(ICPartner, 'intercompanyDimensionValues');

        foreach SelectedToken in JsonResponse do
            PopulateICDimensionValueFromJson(SelectedToken, TempICPartnerICDimensionValue);
    end;

    /// <summary>
    /// Retrieves intercompany partner data from the specified partner via API call.
    /// Uses current company's IC Partner Code for authentication and partner identification.
    /// </summary>
    /// <param name="ICPartner">Source intercompany partner for API connection</param>
    /// <param name="TempRegisteredICPartner">Temporary record to store retrieved partner data</param>
    procedure GetICPartnerFromICPartner(ICPartner: Record "IC Partner"; var TempRegisteredICPartner: Record "IC Partner" temporary)
    var
        ICSetup: Record "IC Setup";
    begin
        ICSetup.Get();
        GetICPartnerFromICPartner(ICPartner, ICSetup."IC Partner Code", TempRegisteredICPartner);
    end;

    /// <summary>
    /// Retrieves intercompany partner data using specified partner code for identification.
    /// Allows cross-partner data retrieval with explicit partner code specification.
    /// </summary>
    /// <param name="ICPartner">Source intercompany partner for API connection</param>
    /// <param name="ICPartnerCode">Specific partner code to identify the target partner</param>
    /// <param name="TempRegisteredICPartner">Temporary record to store retrieved partner data</param>
    procedure GetICPartnerFromICPartner(ICPartner: Record "IC Partner"; ICPartnerCode: Code[20]; var TempRegisteredICPartner: Record "IC Partner" temporary)
    var
        TempICPartners: Record "IC Partner" temporary;
    begin
        TempRegisteredICPartner.Reset();
        TempRegisteredICPartner.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerRecordsFromEntityName(ICPartner, 'intercompanyPartners');

        foreach SelectedToken in JsonResponse do
            PopulateICPartnerFromJson(SelectedToken, TempICPartners);


        if not TempICPartners.Get(ICPartnerCode) then
            Error(ICPartnerMissingCurrentCompanyErr, ICPartner."Inbox Details");

        TempRegisteredICPartner.TransferFields(TempICPartners);
        TempRegisteredICPartner.Insert();
    end;

    /// <summary>
    /// Retrieves intercompany setup configuration from a partner company by name.
    /// </summary>
    /// <param name="ICPartnerName">Name of the intercompany partner</param>
    /// <param name="TempICPartnerICSetup">Temporary record to store the retrieved IC setup</param>
    procedure GetICPartnerICSetup(ICPartnerName: Text; var TempICPartnerICSetup: Record "IC Setup" temporary)
    var
        ICPartner: Record "IC Partner";
    begin
        ICPartner.SetRange("Inbox Details", ICPartnerName);
        if not ICPartner.FindFirst() then
            Error(ICPartnerNotFoundErr, ICPartnerName);

        GetICPartnerICSetup(ICPartner, TempICPartnerICSetup);
    end;

    /// <summary>
    /// Retrieves intercompany setup configuration from a partner company.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICSetup">Temporary record to store the retrieved IC setup</param>
    procedure GetICPartnerICSetup(ICPartner: Record "IC Partner"; var TempICPartnerICSetup: Record "IC Setup" temporary)
    begin
        TempICPartnerICSetup.Reset();
        TempICPartnerICSetup.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerRecordsFromEntityName(ICPartner, 'intercompanySetup');

        foreach SelectedToken in JsonResponse do
            PopulateICSetupFromJson(SelectedToken, TempICPartnerICSetup);

        if not TempICPartnerICSetup.FindFirst() then begin
            if System.GuiAllowed() then
                Message(PartnerMissingTableSetupErr, ICPartner."Inbox Details", TempICPartnerICSetup.TableCaption);
            exit;
        end;
    end;

    /// <summary>
    /// Retrieves general ledger setup configuration from a partner company by name.
    /// </summary>
    /// <param name="ICPartnerName">Name of the intercompany partner</param>
    /// <param name="TempICPartnerGeneralLedgerSetup">Temporary record to store the retrieved G/L setup</param>
    procedure GetICPartnerGeneralLedgerSetup(ICPartnerName: Text; var TempICPartnerGeneralLedgerSetup: Record "General Ledger Setup" temporary)
    var
        ICPartner: Record "IC Partner";
    begin
        ICPartner.SetRange("Inbox Details", ICPartnerName);
        if not ICPartner.FindFirst() then
            Error(ICPartnerNotFoundErr, ICPartnerName);

        GetICPartnerGeneralLedgerSetup(ICPartner, TempICPartnerGeneralLedgerSetup);
    end;

    /// <summary>
    /// Retrieves general ledger setup configuration from a partner company.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerGeneralLedgerSetup">Temporary record to store the retrieved G/L setup</param>
    procedure GetICPartnerGeneralLedgerSetup(ICPartner: Record "IC Partner"; var TempICPartnerGeneralLedgerSetup: Record "General Ledger Setup" temporary)
    begin
        TempICPartnerGeneralLedgerSetup.Reset();
        TempICPartnerGeneralLedgerSetup.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerGeneralLedgerSetup(ICPartner);

        foreach SelectedToken in JsonResponse do
            PopulateGeneralLedgerSetupFromJson(SelectedToken, TempICPartnerGeneralLedgerSetup);

        if not TempICPartnerGeneralLedgerSetup.FindFirst() then begin
            if System.GuiAllowed() then
                Message(PartnerMissingTableSetupErr, ICPartner."Inbox Details", TempICPartnerGeneralLedgerSetup.TableCaption);
            exit;
        end;
    end;

    /// <summary>
    /// Retrieves company information from a partner company by name.
    /// </summary>
    /// <param name="ICPartnerName">Name of the intercompany partner</param>
    /// <param name="TempICPartnerCompanyInformation">Temporary record to store the retrieved company information</param>
    procedure GetICPartnerCompanyInformation(ICPartnerName: Text; var TempICPartnerCompanyInformation: Record "Company Information" temporary)
    var
        ICPartner: Record "IC Partner";
    begin
        ICPartner.SetRange("Inbox Details", ICPartnerName);
        if not ICPartner.FindFirst() then
            Error(ICPartnerNotFoundErr, ICPartnerName);

        GetICPartnerCompanyInformation(ICPartner, TempICPartnerCompanyInformation);
    end;

    /// <summary>
    /// Retrieves company information from a partner company.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerCompanyInformation">Temporary record to store the retrieved company information</param>
    procedure GetICPartnerCompanyInformation(ICPartner: Record "IC Partner"; var TempICPartnerCompanyInformation: Record "Company Information" temporary)
    begin
        TempICPartnerCompanyInformation.Reset();
        TempICPartnerCompanyInformation.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerCompanyInformation(ICPartner);

        foreach SelectedToken in JsonResponse do
            PopulateCompanyInformationFromJson(SelectedToken, TempICPartnerCompanyInformation);

        if not TempICPartnerCompanyInformation.FindFirst() then begin
            if System.GuiAllowed() then
                Message(PartnerMissingTableSetupErr, ICPartner."Inbox Details", TempICPartnerCompanyInformation.TableCaption);
            exit;
        end;
    end;

    /// <summary>
    /// Retrieves bank account information from a partner company.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerBankAccount">Temporary record to store the retrieved bank account information</param>
    procedure GetICPartnerBankAccount(ICPartner: Record "IC Partner"; var TempICPartnerBankAccount: Record "Bank Account" temporary)
    var
        GeneralLedgerSetup: Record "General Ledger Setup";
        TempBankAccount: Record "Bank Account" temporary;
        LCYCurrencyCode: Code[10];
    begin
        TempICPartnerBankAccount.Reset();
        TempICPartnerBankAccount.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerBankAccount(ICPartner);

        GeneralLedgerSetup.Get();
        LCYCurrencyCode := GeneralLedgerSetup."LCY Code";
        foreach SelectedToken in JsonResponse do
            PopulateBankAccountFromJson(SelectedToken, TempBankAccount, LCYCurrencyCode);

        TempBankAccount.SetRange(IntercompanyEnable, true);
        if not TempBankAccount.IsEmpty() then begin
            TempBankAccount.FindSet();
            repeat
                TempICPartnerBankAccount.TransferFields(TempBankAccount);
                TempICPartnerBankAccount.Insert();
            until TempBankAccount.Next() = 0;
        end;
    end;

    /// <summary>
    /// Retrieves intercompany inbox transactions from a partner company.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICInboxTransaction">Temporary record to store the retrieved inbox transactions</param>
    procedure GetICPartnerICInboxTransaction(ICPartner: Record "IC Partner"; var TempICPartnerICInboxTransaction: Record "IC Inbox Transaction" temporary)
    begin
        TempICPartnerICInboxTransaction.Reset();
        TempICPartnerICInboxTransaction.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerRecordsFromEntityName(ICPartner, 'intercompanyInboxTransactions');

        foreach SelectedToken in JsonResponse do
            PopulateICInboxTransactionFromJson(SelectedToken, TempICPartnerICInboxTransaction);
    end;

    /// <summary>
    /// Retrieves handled intercompany inbox transactions from a partner company.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerHandledICInboxTransaction">Temporary record to store the retrieved handled inbox transactions</param>
    procedure GetICPartnerHandledICInboxTransaction(ICPartner: Record "IC Partner"; var TempICPartnerHandledICInboxTransaction: Record "Handled IC Inbox Trans." temporary)
    begin
        TempICPartnerHandledICInboxTransaction.Reset();
        TempICPartnerHandledICInboxTransaction.DeleteAll();
        CheckICPartnerSetup(ICPartner);

        JsonResponse := CrossIntercompanyConnector.RequestICPartnerRecordsFromEntityName(ICPartner, 'handledIntercompanyInboxTransactions');

        foreach SelectedToken in JsonResponse do
            PopulateHandledICInboxTransactionFromJson(SelectedToken, TempICPartnerHandledICInboxTransaction);
    end;

    /// <summary>
    /// Posts intercompany transaction data to partner's inbox via API connection.
    /// Handles secure transmission of transaction headers with proper validation and telemetry tracking.
    /// </summary>
    /// <param name="ICPartner">Target partner company to receive the transaction</param>
    /// <param name="TempICPartnerICInboxTransaction">Transaction data to be posted to partner's inbox</param>
    procedure PostICTransactionToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICInboxTransaction: Record "IC Inbox Transaction" temporary)
    var
        ICSetup: Record "IC Setup";
        BufferICInboxTransaction: Record "Buffer IC Inbox Transaction";
        FeatureTelemetry: Codeunit "Feature Telemetry";
        ICMapping: Codeunit "IC Mapping";
        CustomDimensions: Dictionary of [Text, Text];
    begin
        if not TempICPartnerICInboxTransaction.IsEmpty() then begin
            ICSetup.FindFirst();
            // Clean up orphaned buffer records from a previous failed export of the same transaction
            TempICPartnerICInboxTransaction.FindSet();
            repeat
                CleanupOrphanedBufferRecords(TempICPartnerICInboxTransaction."Transaction No.", TempICPartnerICInboxTransaction."IC Partner Code");
            until TempICPartnerICInboxTransaction.Next() = 0;
            // Move temporary records to buffer table so it can be used with the APIs
            TempICPartnerICInboxTransaction.FindSet();
            repeat
                CustomDimensions.Add('Transaction Details', StrSubstNo(SentTransactionTelemetryTxt, ICPartner.Code, TempICPartnerICInboxTransaction."IC Partner Code"));
                FeatureTelemetry.LogUsage('0000LKR', ICMapping.GetFeatureTelemetryName(), ICDataExchangeAPIFeatureTelemetryNameTok, CustomDimensions);
                if TempICPartnerICInboxTransaction."IC Partner Code" <> ICSetup."IC Partner Code" then
                    Session.LogSecurityAudit(SecurityLogDecriptionTok, SecurityOperationResult::Success, StrSubstNo(SecurityLogResultDescriptionTxt, TempICPartnerICInboxTransaction."IC Partner Code", ICSetup."IC Partner Code"), AuditCategory::UserManagement);
                BufferICInboxTransaction.TransferFields(TempICPartnerICInboxTransaction);
                BufferICInboxTransaction.Insert();
            until TempICPartnerICInboxTransaction.Next() = 0;
        end;
    end;

    /// <summary>
    /// Posts intercompany journal line data to partner's inbox via API for transaction processing.
    /// Transfers journal entries between partner companies using staging buffer tables.
    /// </summary>
    /// <param name="ICPartner">Target intercompany partner for journal line posting</param>
    /// <param name="TempICPartnerICInboxJnlLine">Temporary journal line data to post to partner inbox</param>
    procedure PostICJournalLineToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICInboxJnlLine: Record "IC Inbox Jnl. Line" temporary)
    var
        BufferICInboxJnlLine: Record "Buffer IC Inbox Jnl. Line";
        GeneralLedgerSetup: Record "General Ledger Setup";
    begin
        GeneralLedgerSetup.Get();
        if not TempICPartnerICInboxJnlLine.IsEmpty() then begin
            TempICPartnerICInboxJnlLine.FindSet();
            repeat
                BufferICInboxJnlLine.TransferFields(TempICPartnerICInboxJnlLine);
                if BufferICInboxJnlLine."Currency Code" = '' then
                    BufferICInboxJnlLine."Currency Code" := GeneralLedgerSetup."LCY Code";
                if BufferICInboxJnlLine."Currency Code" = ICPartner."Currency Code" then
                    BufferICInboxJnlLine."Currency Code" := '';
                BufferICInboxJnlLine.Insert();
            until TempICPartnerICInboxJnlLine.Next() = 0;
        end;
    end;

    /// <summary>
    /// Posts intercompany purchase header data to partner's inbox via API connection.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICInboxPurchaseHeader">Purchase header data to post to partner inbox</param>
    /// <param name="RegisteredPartner">Registered partner information for vendor mapping</param>
    procedure PostICPurchaseHeaderToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICInboxPurchaseHeader: Record "IC Inbox Purchase Header" temporary; var RegisteredPartner: Record "IC Partner" temporary)
    var
        BufferICInboxPurchaseHeader: Record "Buffer IC Inbox Purch Header";
    begin
        if not TempICPartnerICInboxPurchaseHeader.IsEmpty() then begin
            TempICPartnerICInboxPurchaseHeader.FindSet();
            repeat
                BufferICInboxPurchaseHeader.TransferFields(TempICPartnerICInboxPurchaseHeader);
                BufferICInboxPurchaseHeader."Buy-from Vendor No." := RegisteredPartner."Vendor No.";
                BufferICInboxPurchaseHeader."Pay-to Vendor No." := RegisteredPartner."Vendor No.";
                OnPostICPurchaseHeaderToICPartnerInboxOnBeforeBufferICInboxPurchaseHeaderInsert(BufferICInboxPurchaseHeader, TempICPartnerICInboxPurchaseHeader, ICPartner, RegisteredPartner);
                BufferICInboxPurchaseHeader.Insert();
            until TempICPartnerICInboxPurchaseHeader.Next() = 0;
        end;
    end;

    /// <summary>
    /// Posts intercompany purchase line data to partner's inbox via API connection.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICInboxPurchaseLine">Purchase line data to post to partner inbox</param>
    procedure PostICPurchaseLineToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICInboxPurchaseLine: Record "IC Inbox Purchase Line" temporary)
    var
        BufferICInboxPurchaseLine: Record "Buffer IC Inbox Purchase Line";
    begin
        if not TempICPartnerICInboxPurchaseLine.IsEmpty() then begin
            TempICPartnerICInboxPurchaseLine.FindSet();
            repeat
                BufferICInboxPurchaseLine.TransferFields(TempICPartnerICInboxPurchaseLine);
                BufferICInboxPurchaseLine.Insert();
            until TempICPartnerICInboxPurchaseLine.Next() = 0;
        end;
    end;

    /// <summary>
    /// Posts intercompany sales header data to partner's inbox via API connection.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICInboxSalesHeader">Sales header data to post to partner inbox</param>
    /// <param name="RegisteredPartner">Registered partner information for customer mapping</param>
    procedure PostICSalesHeaderToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICInboxSalesHeader: Record "IC Inbox Sales Header" temporary; var RegisteredPartner: Record "IC Partner" temporary)
    var
        BufferICInboxSalesHeader: Record "Buffer IC Inbox Sales Header";
    begin
        if not TempICPartnerICInboxSalesHeader.IsEmpty() then begin
            TempICPartnerICInboxSalesHeader.FindSet();
            repeat
                BufferICInboxSalesHeader.TransferFields(TempICPartnerICInboxSalesHeader);
                BufferICInboxSalesHeader."Sell-to Customer No." := RegisteredPartner."Customer No.";
                BufferICInboxSalesHeader."Bill-to Customer No." := RegisteredPartner."Customer No.";
                OnPostICSalesHeaderToICPartnerInboxOnBeforeBufferICInboxSalesHeaderInsert(BufferICInboxSalesHeader, TempICPartnerICInboxSalesHeader, ICPartner, RegisteredPartner);
                BufferICInboxSalesHeader.Insert();
            until TempICPartnerICInboxSalesHeader.Next() = 0;
        end;
    end;

    /// <summary>
    /// Posts intercompany sales line data to partner's inbox via API connection.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICInboxSalesLine">Sales line data to post to partner inbox</param>
    procedure PostICSalesLineToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICInboxSalesLine: Record "IC Inbox Sales Line" temporary)
    var
        BufferICInboxSalesLine: Record "Buffer IC Inbox Sales Line";
    begin
        if not TempICPartnerICInboxSalesLine.IsEmpty() then begin
            TempICPartnerICInboxSalesLine.FindSet();
            repeat
                BufferICInboxSalesLine.TransferFields(TempICPartnerICInboxSalesLine);
                OnPostICSalesLineToICPartnerInboxOnBeforeBufferICInboxSalesLineInsert(BufferICInboxSalesLine, TempICPartnerICInboxSalesLine, ICPartner);
                BufferICInboxSalesLine.Insert();
            until TempICPartnerICInboxSalesLine.Next() = 0;
        end;
    end;

    /// <summary>
    /// Posts intercompany journal line dimension data to partner's inbox via API connection.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICInboxOutboxJnlLineDim">Journal line dimension data to post to partner inbox</param>
    procedure PostICJournalLineDimensionToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICInboxOutboxJnlLineDim: Record "IC Inbox/Outbox Jnl. Line Dim." temporary)
    var
        BufferICInOutJnlLineDim: Record "Buffer IC InOut Jnl. Line Dim.";
    begin
        if not TempICPartnerICInboxOutboxJnlLineDim.IsEmpty() then begin
            TempICPartnerICInboxOutboxJnlLineDim.FindSet();
            repeat
                BufferICInOutJnlLineDim.TransferFields(TempICPartnerICInboxOutboxJnlLineDim);
                BufferICInOutJnlLineDim.Insert();
            until TempICPartnerICInboxOutboxJnlLineDim.Next() = 0;
        end;
    end;

    /// <summary>
    /// Posts intercompany document dimension data to partner's inbox via API connection.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICDocDim">Document dimension data to post to partner inbox</param>
    procedure PostICDocumentDimensionToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICDocDim: Record "IC Document Dimension" temporary)
    var
        BufferICDocumentDimension: Record "Buffer IC Document Dimension";
    begin
        if not TempICPartnerICDocDim.IsEmpty() then begin
            TempICPartnerICDocDim.FindSet();
            repeat
                BufferICDocumentDimension.TransferFields(TempICPartnerICDocDim);
                BufferICDocumentDimension.Insert();
            until TempICPartnerICDocDim.Next() = 0;
        end;
    end;

    /// <summary>
    /// Posts intercompany comment line data to partner's inbox via API connection.
    /// </summary>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="TempICPartnerICInboxCommentLine">Comment line data to post to partner inbox</param>
    procedure PostICCommentLineToICPartnerInbox(ICPartner: Record "IC Partner"; var TempICPartnerICInboxCommentLine: Record "IC Comment Line" temporary)
    var
        BufferICCommentLine: Record "Buffer IC Comment Line";
    begin
        if not TempICPartnerICInboxCommentLine.IsEmpty() then begin
            TempICPartnerICInboxCommentLine.FindSet();
            repeat
                BufferICCommentLine.TransferFields(TempICPartnerICInboxCommentLine);
                BufferICCommentLine.Insert();
            until TempICPartnerICInboxCommentLine.Next() = 0;
        end;
    end;

    /// <summary>
    /// Enqueues auto-accepted intercompany inbox transactions for asynchronous processing via job queue.
    /// Automatically processes transactions marked for auto-acceptance to streamline partner transaction flow.
    /// </summary>
    /// <param name="ICPartner">Source intercompany partner for the transaction</param>
    /// <param name="ICInboxTransaction">Inbox transaction to auto-accept and process</param>
    procedure EnqueueAutoAcceptedICInboxTransaction(ICPartner: Record "IC Partner"; ICInboxTransaction: Record "IC Inbox Transaction")
    var
        ICSetup: Record "IC Setup";
        DescriptionText: Text[250];
    begin
        ICSetup.Get();
        if ICSetup."IC Partner Code" = ICInboxTransaction."IC Partner Code" then
            // This means that the transaction is being manage by the current company
            exit;

        DescriptionText := StrSubstNo(AutoAcceptTransactionJobQueueTxt, ICInboxTransaction."Transaction No.", ICInboxTransaction."IC Partner Code", ICInboxTransaction."Document No.");
        ScheduleCrossEnvironmentJobQueue(Codeunit::"IC Auto Accept JR", JobQueueCategoryCodeAutoAcceptTok, DescriptionText, ICPartner.RecordId());
    end;

    local procedure CheckICPartnerSetup(var ICPartner: Record "IC Partner")
    begin
        if ICPartner."Inbox Type" <> Enum::"IC Partner Inbox Type"::Database then
            Error(WrongICPartnerInboxTypeErr, ICPartner.Code);

        if ICPartner."Data Exchange Type" <> Enum::"IC Data Exchange Type"::API then
            Error(WrongICDataExchangeTypeErr, ICPartner.Code);
    end;

    #region Procedures to populate records from Json
#pragma warning disable AA0139 // Ignore warning about possible overflow from JSON Text
    local procedure PopulateICGLAccountFromJson(IndividualToken: JsonToken; var TempICPartnerICGLAccount: Record "IC G/L Account" temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerICGLAccount.Init();

        TempICPartnerICGLAccount."No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'accountNumber');
        TempICPartnerICGLAccount.Name := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'name');
        TempICPartnerICGLAccount."Account Type" := Enum::"G/L Account Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'accountTypeOrdinal'));
        TempICPartnerICGLAccount."Income/Balance" := "G/L Account Report Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'incomeBalanceIndex'));
        TempICPartnerICGLAccount.Blocked := GetValueFromJsonTokenOrFalse(IndividualToken, 'blocked');

        TempICPartnerICGLAccount.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    local procedure PopulateICDimensionFromJson(IndividualToken: JsonToken; var TempICPartnerICDimension: Record "IC Dimension" temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerICDimension.Init();

        TempICPartnerICDimension.Code := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'code');
        TempICPartnerICDimension.Name := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'name');
        TempICPartnerICDimension.Blocked := GetValueFromJsonTokenOrFalse(IndividualToken, 'blocked');

        TempICPartnerICDimension.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    local procedure PopulateICDimensionValueFromJson(IndividualToken: JsonToken; var TempICPartnerICDimensionValue: Record "IC Dimension Value" temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerICDimensionValue.Init();

        TempICPartnerICDimensionValue."Dimension Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'dimensionCode');
        TempICPartnerICDimensionValue.Code := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'code');
        TempICPartnerICDimensionValue.Name := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'name');
        TempICPartnerICDimensionValue."Dimension Value Type" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'dimensionValueTypeIndex');
        TempICPartnerICDimensionValue.Blocked := GetValueFromJsonTokenOrFalse(IndividualToken, 'blocked');

        TempICPartnerICDimensionValue.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    local procedure PopulateICPartnerFromJson(IndividualToken: JsonToken; var TempRegisteredICPartner: Record "IC Partner" temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempRegisteredICPartner.Init();

        TempRegisteredICPartner.Code := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'partnerCode');
        TempRegisteredICPartner.Name := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'name');
        TempRegisteredICPartner."Currency Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'currencyCode');
        TempRegisteredICPartner."Inbox Type" := Enum::"IC Partner Inbox Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'inboxTypeOrdinal'));
        TempRegisteredICPartner."Inbox Details" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'inboxDetails');
        TempRegisteredICPartner."Receivables Account" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'receivablesAccount');
        TempRegisteredICPartner."Payables Account" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'payablesAccount');
        TempRegisteredICPartner."Country/Region Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'countryRegionCode');
        TempRegisteredICPartner.Blocked := GetValueFromJsonTokenOrFalse(IndividualToken, 'blocked');
        TempRegisteredICPartner."Customer No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'customerNumber');
        TempRegisteredICPartner."Vendor No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'vendorNumber');
        TempRegisteredICPartner."Outbound Sales Item No. Type" := Enum::"IC Outb. Sales Item No. Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'outboundSalesItemNumberTypeOrdinal'));
        TempRegisteredICPartner."Outbound Purch. Item No. Type" := Enum::"IC Outb. Purch. Item No. Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'outboundPurchaseItemNumberTypeOrdinal'));
        TempRegisteredICPartner."Cost Distribution in LCY" := GetValueFromJsonTokenOrFalse(IndividualToken, 'costDistributionInLCY');
        TempRegisteredICPartner."Auto. Accept Transactions" := GetValueFromJsonTokenOrFalse(IndividualToken, 'autoAcceptTransactions');
        TempRegisteredICPartner."Data Exchange Type" := Enum::"IC Data Exchange Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'dataExchangeTypeOrdinal'));

        TempRegisteredICPartner.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    local procedure PopulateICSetupFromJson(IndividualToken: JsonToken; var TempICPartnerICSetup: Record "IC Setup" temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerICSetup.Init();

        TempICPartnerICSetup."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        TempICPartnerICSetup."IC Inbox Type" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'icInboxTypeIndex');
        TempICPartnerICSetup."IC Inbox Details" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icInboxDetails');
        TempICPartnerICSetup."Default IC Gen. Jnl. Template" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'defaultICGeneralJournalTemplate');
        TempICPartnerICSetup."Default IC Gen. Jnl. Batch" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'defaultICGeneralJournalBatch');

        TempICPartnerICSetup.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    local procedure PopulateGeneralLedgerSetupFromJson(IndividualToken: JsonToken; var TempICPartnerGeneralLedgerSetup: Record "General Ledger Setup" temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerGeneralLedgerSetup.Init();

        TempICPartnerGeneralLedgerSetup."Allow Posting From" := GetValueFromJsonTokenOrToday(IndividualToken, 'allowPostingFrom');
        TempICPartnerGeneralLedgerSetup."Allow Posting To" := GetValueFromJsonTokenOrToday(IndividualToken, 'allowPostingTo');
        TempICPartnerGeneralLedgerSetup."Additional Reporting Currency" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'additionalReportingCurrency');
        TempICPartnerGeneralLedgerSetup."LCY Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'localCurrencyCode');
        TempICPartnerGeneralLedgerSetup."Local Currency Symbol" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'localCurrencySymbol');

        TempICPartnerGeneralLedgerSetup.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    local procedure PopulateCompanyInformationFromJson(IndividualToken: JsonToken; var TempICPartnerCompanyInformation: Record "Company Information" temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerCompanyInformation.Init();

        TempICPartnerCompanyInformation.Name := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'displayName');
        TempICPartnerCompanyInformation.Address := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'addressLine1');
        TempICPartnerCompanyInformation."Address 2" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'addressLine2');
        TempICPartnerCompanyInformation.City := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'city');
        TempICPartnerCompanyInformation.County := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'state');
        TempICPartnerCompanyInformation."Country/Region Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'country');
        TempICPartnerCompanyInformation."Post Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'postalCode');
        TempICPartnerCompanyInformation."Phone No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'phoneNumber');

        TempICPartnerCompanyInformation.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    internal procedure PopulateICInboxTransactionFromJson(IndividualToken: JsonToken; var TempICPartnerICInboxTransaction: Record "IC Inbox Transaction" temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerICInboxTransaction.Init();

        TempICPartnerICInboxTransaction."Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionNumber');
        TempICPartnerICInboxTransaction."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        TempICPartnerICInboxTransaction."IC Source Type" := Enum::"IC Transaction Source Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'sourceTypeIndex'));
        TempICPartnerICInboxTransaction."Document Type" := Enum::"IC Transaction Document Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'documentTypeOrdinal'));
        TempICPartnerICInboxTransaction."Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'documentNumber');
        TempICPartnerICInboxTransaction."Posting Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'postingDate');
        TempICPartnerICInboxTransaction."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        TempICPartnerICInboxTransaction."Document Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'documentDate');
        TempICPartnerICInboxTransaction."Line Action" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'lineActionIndex');
        TempICPartnerICInboxTransaction."Original Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'originalDocumentNumber');
        TempICPartnerICInboxTransaction."Source Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'sourceLineNumber');
        TempICPartnerICInboxTransaction."IC Account Type" := Enum::"IC Journal Account Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'icAccountTypeOrdinal'));
        TempICPartnerICInboxTransaction."IC Account No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icAccountNumber');

        OnPopulateICInboxTransactionFromJsonOnBeforeInsert(TempICPartnerICInboxTransaction, IndividualToken);
        TempICPartnerICInboxTransaction.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    local procedure PopulateHandledICInboxTransactionFromJson(IndividualToken: JsonToken; var TempICPartnerHandledICInboxTransaction: Record "Handled IC Inbox Trans." temporary)
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerHandledICInboxTransaction.Init();

        TempICPartnerHandledICInboxTransaction."Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionNumber');
        TempICPartnerHandledICInboxTransaction."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        TempICPartnerHandledICInboxTransaction."IC Source Type" := Enum::"IC Transaction Source Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'sourceTypeIndex'));
        TempICPartnerHandledICInboxTransaction."Document Type" := Enum::"IC Transaction Document Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'documentTypeOrdinal'));
        TempICPartnerHandledICInboxTransaction."Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'documentNumber');
        TempICPartnerHandledICInboxTransaction."Posting Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'postingDate');
        TempICPartnerHandledICInboxTransaction."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        TempICPartnerHandledICInboxTransaction."Document Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'documentDate');
        TempICPartnerHandledICInboxTransaction.Status := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'statusIndex');
        TempICPartnerHandledICInboxTransaction."Source Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'sourceLineNumber');
        TempICPartnerHandledICInboxTransaction."IC Account Type" := Enum::"IC Journal Account Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'icAccountTypeOrdinal'));
        TempICPartnerHandledICInboxTransaction."IC Account No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icAccountNumber');

        TempICPartnerHandledICInboxTransaction.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    local procedure PopulateBankAccountFromJson(IndividualToken: JsonToken; var TempICPartnerBankAccount: Record "Bank Account" temporary; LCYCurrencyCode: Code[10])
    var
        CurrencyCode: Code[10];
    begin
        ExtractCurrentUserAndChangeToEnglish();
        TempICPartnerBankAccount.Init();

        TempICPartnerBankAccount."No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'number');
        TempICPartnerBankAccount.Name := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'displayName');
        TempICPartnerBankAccount."Bank Account No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'bankAccountNumber');
        TempICPartnerBankAccount.Blocked := GetValueFromJsonTokenOrFalse(IndividualToken, 'blocked');

        IndividualToken.AsObject().Get('currencyCode', AttributeToken);
        CurrencyCode := AttributeToken.AsValue().AsText();
        if CurrencyCode = LCYCurrencyCode then
            TempICPartnerBankAccount."Currency Code" := ''
        else
            TempICPartnerBankAccount."Currency Code" := CurrencyCode;

        TempICPartnerBankAccount.IBAN := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'iban');
        TempICPartnerBankAccount.IntercompanyEnable := GetValueFromJsonTokenOrFalse(IndividualToken, 'intercompanyEnabled');

        TempICPartnerBankAccount.Insert();
        GlobalLanguage(CurrentGlobalLanguage);
    end;

    [CommitBehavior(CommitBehavior::Ignore)]
    internal procedure PopulateTransactionDataFromICOutgoingNotification(IndividualObject: JsonObject)
    begin
        IndividualObject.Get('bufferIntercompanyInboxTransactions', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICInboxTransactionFromJson(SelectedToken);

        IndividualObject.Get('bufferIntercompanyInboxJournalLines', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICInboxJournalLineFromJson(SelectedToken);

        IndividualObject.Get('bufferIntercompanyInboxPurchaseHeaders', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICInboxPurchaseHeaderFromJson(SelectedToken);

        IndividualObject.Get('bufferIntercompanyInboxPurchaseLines', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICInboxPurchaseLineFromJson(SelectedToken);

        IndividualObject.Get('bufferIntercompanyInboxSalesHeaders', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICInboxSalesHeaderFromJson(SelectedToken);

        IndividualObject.Get('bufferIntercompanyInboxSalesLines', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICInboxSalesLineFromJson(SelectedToken);

        IndividualObject.Get('bufferIntercompanyInOutJournalLineDimensions', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICInboxOutboxJnlLineDimFromJson(SelectedToken);

        IndividualObject.Get('bufferIntercompanyDocumentDimensions', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICDocumentDimensionFromJson(SelectedToken);

        IndividualObject.Get('bufferIntercompanyCommentLines', AttributeToken);
        foreach SelectedToken in AttributeToken.AsArray() do
            PopulateICCommentLineFromJson(SelectedToken);
    end;

    internal procedure PopulateICInboxTransactionFromJson(IndividualToken: JsonToken)
    var
        ICInboxTransaction: Record "IC Inbox Transaction";
    begin
        ICInboxTransaction.Init();

        ICInboxTransaction."Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionNumber');
        ICInboxTransaction."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        ICInboxTransaction."IC Source Type" := Enum::"IC Transaction Source Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'sourceTypeIndex'));
        ICInboxTransaction."Document Type" := Enum::"IC Transaction Document Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'documentTypeOrdinal'));
        ICInboxTransaction."Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'documentNumber');
        ICInboxTransaction."Posting Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'postingDate');
        ICInboxTransaction."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        ICInboxTransaction."Document Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'documentDate');
        ICInboxTransaction."Line Action" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'lineActionIndex');
        ICInboxTransaction."Original Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'originalDocumentNumber');
        ICInboxTransaction."Source Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'sourceLineNumber');
        ICInboxTransaction."IC Account Type" := Enum::"IC Journal Account Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'icAccountTypeOrdinal'));
        ICInboxTransaction."IC Account No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icAccountNumber');

        OnPopulateICInboxTransactionFromJsonOnBeforeInsert(ICInboxTransaction, IndividualToken);
        ICInboxTransaction.Insert();
    end;

    local procedure PopulateICInboxJournalLineFromJson(IndividualToken: JsonToken)
    var
        ICInboxJnlLine: Record "IC Inbox Jnl. Line";
    begin
        ICInboxJnlLine.Init();

        ICInboxJnlLine."Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionNumber');
        ICInboxJnlLine."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        ICInboxJnlLine."Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'lineNumber');
        ICInboxJnlLine."Account Type" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'accountTypeIndex');
        ICInboxJnlLine."Account No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'accountNumber');
        ICInboxJnlLine.Amount := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'amount');
        ICInboxJnlLine.Description := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'description');
        ICInboxJnlLine."VAT Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'vatAmount');
        ICInboxJnlLine."Currency Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'currencyCode');
        ICInboxJnlLine."Due Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'dueDate');
        ICInboxJnlLine."Payment Discount %" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'paymentDiscount');
        ICInboxJnlLine."Payment Discount Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'paymentDiscountDate');
        ICInboxJnlLine.Quantity := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'quantity');
        ICInboxJnlLine."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        ICInboxJnlLine."Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'documentNumber');

        OnPopulateICInboxJournalLineFromJsonOnBeforeInsert(ICInboxJnlLine, IndividualToken);
        ICInboxJnlLine.Insert();
    end;

    local procedure PopulateICInboxPurchaseHeaderFromJson(IndividualToken: JsonToken)
    var
        ICInboxPurchaseHeader: Record "IC Inbox Purchase Header";
    begin
        ICInboxPurchaseHeader.Init();

        ICInboxPurchaseHeader."Document Type" := Enum::"IC Purchase Document Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'documentTypeOrdinal'));
        ICInboxPurchaseHeader."Buy-from Vendor No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'buyFromVendorNumber');
        ICInboxPurchaseHeader."No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'number');
        ICInboxPurchaseHeader."Pay-to Vendor No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'payToVendorNumber');
        ICInboxPurchaseHeader."Ship-to Name" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToName');
        ICInboxPurchaseHeader."Ship-to Address" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToAddress');
        ICInboxPurchaseHeader."Ship-to Address 2" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToAddress2');
        ICInboxPurchaseHeader."Ship-to City" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToCity');
        ICInboxPurchaseHeader."Posting Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'postingDate');
        ICInboxPurchaseHeader."Expected Receipt Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'expectedReceiptDate');
        ICInboxPurchaseHeader."Due Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'dueDate');
        ICInboxPurchaseHeader."Payment Discount %" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'paymentDiscount');
        ICInboxPurchaseHeader."Pmt. Discount Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'paymentDiscountDate');
        ICInboxPurchaseHeader."Currency Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'currencyCode');
        ICInboxPurchaseHeader."Prices Including VAT" := GetValueFromJsonTokenOrFalse(IndividualToken, 'pricesIncludingVat');
        ICInboxPurchaseHeader."Vendor Order No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'vendorOrderNumber');
        ICInboxPurchaseHeader."Vendor Invoice No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'vendorInvoiceNumber');
        ICInboxPurchaseHeader."Vendor Cr. Memo No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'vendorCreditMemoNumber');
        ICInboxPurchaseHeader."Sell-to Customer No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'sellToCustomerNumber');
        ICInboxPurchaseHeader."Ship-to Post Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToPostCode');
        ICInboxPurchaseHeader."Ship-to County" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToCounty');
        ICInboxPurchaseHeader."Ship-to Country/Region Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToCountryRegionCode');
        ICInboxPurchaseHeader."Ship-to Phone No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToPhoneNo');
        ICInboxPurchaseHeader."Document Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'documentDate');
        ICInboxPurchaseHeader."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'intercompanyPartnerCode');
        ICInboxPurchaseHeader."IC Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'intercompanyTransactionNumber');
        ICInboxPurchaseHeader."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        ICInboxPurchaseHeader."Requested Receipt Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'requestedReceiptDate');
        ICInboxPurchaseHeader."Promised Receipt Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'promisedReceiptDate');

        OnPopulateICInboxPurchaseHeaderFromJsonOnBeforeInsert(ICInboxPurchaseHeader, IndividualToken);
        ICInboxPurchaseHeader.Insert();
    end;

    local procedure PopulateICInboxPurchaseLineFromJson(IndividualToken: JsonToken)
    var
        ICInboxPurchaseLine: Record "IC Inbox Purchase Line";
    begin
        ICInboxPurchaseLine.Init();

        ICInboxPurchaseLine."Document Type" := Enum::"IC Inbox Purchase Document Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'documentTypeOrdinal'));
        ICInboxPurchaseLine."Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'documentNumber');
        ICInboxPurchaseLine."Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'lineNumber');
        ICInboxPurchaseLine.Description := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'description');
        ICInboxPurchaseLine."Description 2" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'description2');
        ICInboxPurchaseLine.Quantity := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'quantity');
        ICInboxPurchaseLine."Direct Unit Cost" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'directUnitCost');
        ICInboxPurchaseLine."Line Discount %" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'lineDiscount');
        ICInboxPurchaseLine."Line Discount Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'lineDiscountAmount');
        ICInboxPurchaseLine."Amount Including VAT" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'amountIncludingVat');
        ICInboxPurchaseLine.Amount := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'amount');
        ICInboxPurchaseLine."Inv. Discount Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'invoiceDiscountAmount');
        ICInboxPurchaseLine."Job No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'jobNumber');
        ICInboxPurchaseLine."Indirect Cost %" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'indirectCost');
        ICInboxPurchaseLine."Receipt No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'receiptNumber');
        ICInboxPurchaseLine."Receipt Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'receiptLineNumber');
        ICInboxPurchaseLine."Drop Shipment" := GetValueFromJsonTokenOrFalse(IndividualToken, 'dropShipment');
        ICInboxPurchaseLine."Currency Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'currencyCode');
        ICInboxPurchaseLine."VAT Base Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'vatBaseAmount');
        ICInboxPurchaseLine."Unit Cost" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'unitCost');
        ICInboxPurchaseLine."Line Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'lineAmount');
        ICInboxPurchaseLine."IC Partner Ref. Type" := Enum::"IC Partner Reference Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'icPartnerReferenceTypeOrdinal'));
        ICInboxPurchaseLine."IC Partner Reference" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerReference');
        ICInboxPurchaseLine."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        ICInboxPurchaseLine."IC Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'icTransactionNumber');
        ICInboxPurchaseLine."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        ICInboxPurchaseLine."Item Ref." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'itemReferenceIndex');
        ICInboxPurchaseLine."IC Item Reference No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icItemReferenceNumber');
        ICInboxPurchaseLine."Unit of Measure Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'unitOfMeasureCode');
        ICInboxPurchaseLine."Requested Receipt Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'requestedReceiptDate');
        ICInboxPurchaseLine."Promised Receipt Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'promisedReceiptDate');
        ICInboxPurchaseLine."Return Shipment No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'returnShipmentNumber');
        ICInboxPurchaseLine."Return Shipment Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'returnShipmentLineNumber');

        OnPopulateICInboxPurchaseLineFromJsonOnBeforeInsert(ICInboxPurchaseLine, IndividualToken);
        ICInboxPurchaseLine.Insert();
    end;

    local procedure PopulateICInboxSalesHeaderFromJson(IndividualToken: JsonToken)
    var
        ICInboxSalesHeader: Record "IC Inbox Sales Header";
    begin
        ICInboxSalesHeader.Init();

        ICInboxSalesHeader."Sell-to Customer No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'sellToCustomerNumber');
        ICInboxSalesHeader."No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'number');
        ICInboxSalesHeader."Bill-to Customer No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'billToCustomerNumber');
        ICInboxSalesHeader."Document Type" := Enum::"IC Sales Document Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'documentTypeOrdinal'));
        ICInboxSalesHeader."Ship-to Name" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToName');
        ICInboxSalesHeader."Ship-to Address" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToAddress');
        ICInboxSalesHeader."Ship-to Address 2" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToAddress2');
        ICInboxSalesHeader."Ship-to City" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToCity');
        ICInboxSalesHeader."Posting Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'postingDate');
        ICInboxSalesHeader."Due Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'dueDate');
        ICInboxSalesHeader."Payment Discount %" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'paymentDiscount');
        ICInboxSalesHeader."Pmt. Discount Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'paymentDiscountDate');
        ICInboxSalesHeader."Currency Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'currencyCode');
        ICInboxSalesHeader."Prices Including VAT" := GetValueFromJsonTokenOrFalse(IndividualToken, 'pricesIncludingVat');
        ICInboxSalesHeader."Ship-to Post Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToPostCode');
        ICInboxSalesHeader."Ship-to County" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToCounty');
        ICInboxSalesHeader."Ship-to Country/Region Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToCountryRegionCode');
        ICInboxSalesHeader."Ship-to Phone No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'shipToPhoneNo');
        ICInboxSalesHeader."Document Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'documentDate');
        ICInboxSalesHeader."External Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'externalDocumentNumber');
        ICInboxSalesHeader."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'intercompanyPartnerCode');
        ICInboxSalesHeader."IC Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'intercompanyTransactionNumber');
        ICInboxSalesHeader."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        ICInboxSalesHeader."Requested Delivery Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'requestedDeliveryDate');
        ICInboxSalesHeader."Promised Delivery Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'promisedDeliveryDate');

        OnPopulateICInboxSalesHeaderFromJsonOnBeforeInsert(ICInboxSalesHeader, IndividualToken);
        ICInboxSalesHeader.Insert();
    end;

    local procedure PopulateICInboxSalesLineFromJson(IndividualToken: JsonToken)
    var
        ICInboxSalesLine: Record "IC Inbox Sales Line";
    begin
        ICInboxSalesLine.Init();

        ICInboxSalesLine."Document Type" := Enum::"IC Inbox Sales Document Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'documentTypeOrdinal'));
        ICInboxSalesLine."Document No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'documentNumber');
        ICInboxSalesLine."Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'lineNumber');
        ICInboxSalesLine.Description := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'description');
        ICInboxSalesLine."Description 2" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'description2');
        ICInboxSalesLine.Quantity := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'quantity');
        ICInboxSalesLine."Unit Price" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'unitPrice');
        ICInboxSalesLine."Line Discount %" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'lineDiscount');
        ICInboxSalesLine."Line Discount Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'lineDiscountAmount');
        ICInboxSalesLine."Amount Including VAT" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'amountIncludingVat');
        ICInboxSalesLine.Amount := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'amount');
        ICInboxSalesLine."Inv. Discount Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'invoiceDiscountAmount');
        ICInboxSalesLine."Job No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'jobNumber');
        ICInboxSalesLine."Drop Shipment" := GetValueFromJsonTokenOrFalse(IndividualToken, 'dropShipment');
        ICInboxSalesLine."Currency Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'currencyCode');
        ICInboxSalesLine."VAT Base Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'vatBaseAmount');
        ICInboxSalesLine."Line Amount" := GetValueFromJsonTokenOrDecimalZero(IndividualToken, 'lineAmount');
        ICInboxSalesLine."IC Partner Ref. Type" := Enum::"IC Partner Reference Type".FromInteger(GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'icPartnerReferenceTypeOrdinal'));
        ICInboxSalesLine."IC Partner Reference" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerReference');
        ICInboxSalesLine."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        ICInboxSalesLine."IC Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'icTransactionNumber');
        ICInboxSalesLine."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        ICInboxSalesLine."Item Ref." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'itemReferenceIndex');
        ICInboxSalesLine."IC Item Reference No." := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icItemReferenceNumber');
        ICInboxSalesLine."Unit of Measure Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'unitOfMeasureCode');
        ICInboxSalesLine."Requested Delivery Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'requestedDeliveryDate');
        ICInboxSalesLine."Promised Delivery Date" := GetValueFromJsonTokenOrToday(IndividualToken, 'promisedDeliveryDate');

        OnPopulateICInboxSalesLineFromJsonOnBeforeInsert(ICInboxSalesLine, IndividualToken);
        ICInboxSalesLine.Insert();
    end;

    local procedure PopulateICInboxOutboxJnlLineDimFromJson(IndividualToken: JsonToken)
    var
        ICInboxOutboxJnlLineDim: Record "IC Inbox/Outbox Jnl. Line Dim.";
    begin
        ICInboxOutboxJnlLineDim.Init();

        ICInboxOutboxJnlLineDim."Table ID" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'tableId');
        ICInboxOutboxJnlLineDim."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        ICInboxOutboxJnlLineDim."Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionNumber');
        ICInboxOutboxJnlLineDim."Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'lineNumber');
        ICInboxOutboxJnlLineDim."Dimension Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'dimensionCode');
        ICInboxOutboxJnlLineDim."Dimension Value Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'dimensionValueCode');
        ICInboxOutboxJnlLineDim."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');

        OnPopulateICInboxOutboxJnlLineDimFromJsonOnBeforeInsert(ICInboxOutboxJnlLineDim, IndividualToken);
        ICInboxOutboxJnlLineDim.Insert();
    end;

    local procedure PopulateICDocumentDimensionFromJson(IndividualToken: JsonToken)
    var
        ICDocumentDimension: Record "IC Document Dimension";
    begin
        ICDocumentDimension.Init();

        ICDocumentDimension."Table ID" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'tableId');
        ICDocumentDimension."Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionNumber');
        ICDocumentDimension."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        ICDocumentDimension."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        ICDocumentDimension."Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'lineNumber');
        ICDocumentDimension."Dimension Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'dimensionCode');
        ICDocumentDimension."Dimension Value Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'dimensionValueCode');

        OnPopulateICDocumentDimensionFromJsonOnBeforeInsert(ICDocumentDimension, IndividualToken);
        ICDocumentDimension.Insert();
    end;

    local procedure PopulateICCommentLineFromJson(IndividualToken: JsonToken)
    var
        ICCommentLine: Record "IC Comment Line";
    begin
        ICCommentLine.Init();

        ICCommentLine."Table Name" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'tableNameIndex');
        ICCommentLine."Transaction No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionNumber');
        ICCommentLine."IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'icPartnerCode');
        ICCommentLine."Line No." := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'lineNumber');
        ICCommentLine.Date := GetValueFromJsonTokenOrToday(IndividualToken, 'date');
        ICCommentLine.Comment := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'comment');
        ICCommentLine."Transaction Source" := GetValueFromJsonTokenOrIntegerZero(IndividualToken, 'transactionSourceIndex');
        ICCommentLine."Created By IC Partner Code" := GetValueFromJsonTokenOrEmptyText(IndividualToken, 'createdByIcPartnerCode');

        OnPopulateICCommentLineFromJsonOnBeforeInsert(ICCommentLine, IndividualToken);
        ICCommentLine.Insert();
    end;

    local procedure GetValueFromJsonTokenOrEmptyText(IndividualToken: JsonToken; AttributeName: Text): Text
    begin
        if IndividualToken.AsObject().Get(AttributeName, AttributeToken) then
            exit(AttributeToken.AsValue().AsText());
        exit('');
    end;

    local procedure GetValueFromJsonTokenOrFalse(IndividualToken: JsonToken; AttributeName: Text): Boolean
    begin
        if IndividualToken.AsObject().Get(AttributeName, AttributeToken) then
            exit(AttributeToken.AsValue().AsBoolean());
        exit(false);
    end;

    local procedure GetValueFromJsonTokenOrIntegerZero(IndividualToken: JsonToken; AttributeName: Text): Integer
    begin
        if IndividualToken.AsObject().Get(AttributeName, AttributeToken) then
            exit(AttributeToken.AsValue().AsInteger());
        exit(0);
    end;

    local procedure GetValueFromJsonTokenOrDecimalZero(IndividualToken: JsonToken; AttributeName: Text): Decimal
    begin
        if IndividualToken.AsObject().Get(AttributeName, AttributeToken) then
            exit(AttributeToken.AsValue().AsDecimal());
        exit(0);
    end;

    local procedure GetValueFromJsonTokenOrToday(IndividualToken: JsonToken; AttributeName: Text): Date
    begin
        if IndividualToken.AsObject().Get(AttributeName, AttributeToken) then
            exit(AttributeToken.AsValue().AsDate());
        exit(Today);
    end;

    local procedure ExtractCurrentUserAndChangeToEnglish()
    var
        Language: Codeunit Language;
    begin
        CurrentGlobalLanguage := GlobalLanguage();
        GlobalLanguage(Language.GetDefaultApplicationLanguageId());
    end;
#pragma warning restore AA0139
    #endregion

    internal procedure CreateJsonContentFromICIncomingNotification(var TempICIncomingNotification: Record "IC Incoming Notification" temporary; var ContentJsonText: Text)
    var
        LineJson: JsonObject;
    begin
        LineJson.Add('id', CrossIntercompanyConnector.RemoveCurlyBracketsAndUpperCases(TempICIncomingNotification."Operation ID"));
        LineJson.Add('sourceICPartnerCode', TempICIncomingNotification."Source IC Partner Code");
        LineJson.Add('targetICPartnerCode', TempICIncomingNotification."Target IC Partner Code");
        LineJson.Add('notifiedDateTime', TempICIncomingNotification."Notified DateTime");
        LineJson.WriteTo(ContentJsonText);
    end;

    internal procedure CreateJsonContentFromICOutgoingNotification(var TempICOutgoingNotification: Record "IC Outgoing Notification" temporary; var ContentJsonText: Text)
    var
        LineJson: JsonObject;
    begin
        LineJson.Add('id', CrossIntercompanyConnector.RemoveCurlyBracketsAndUpperCases(TempICOutgoingNotification."Operation ID"));
        LineJson.Add('sourceICPartnerCode', TempICOutgoingNotification."Source IC Partner Code");
        LineJson.Add('targetICPartnerCode', TempICOutgoingNotification."Target IC Partner Code");
        LineJson.WriteTo(ContentJsonText);
    end;

    /// <summary>
    /// Creates and inserts a new incoming notification record for intercompany data exchange tracking.
    /// Initializes notification status and sets up job queue processing for partner communication.
    /// </summary>
    /// <param name="ICIncomingNotification">Incoming notification record to insert and configure</param>
    procedure InsertICIncomingNotification(var ICIncomingNotification: Record "IC Incoming Notification")
    var
        DescriptionText: Text[250];
    begin
        ICIncomingNotification.Status := ICIncomingNotification.Status::Created;
        ICIncomingNotification.SetErrorMessage('');

        DescriptionText := StrSubstNo(ReadOutgoingNotificationJobQueueTxt, ICIncomingNotification."Source IC Partner Code", ICIncomingNotification."Operation ID");
        ScheduleCrossEnvironmentJobQueue(Codeunit::"IC Read Notification JR", JobQueueCategoryCodeReadTransactionTok, DescriptionText);
    end;

    /// <summary>
    /// Schedules cleanup of completed outgoing notification records via job queue processing.
    /// Removes processed notifications to maintain optimal system performance and data hygiene.
    /// </summary>
    /// <param name="ICOutgoingNotification">Outgoing notification record to schedule for cleanup</param>
    procedure CleanupICOutgoingNotification(var ICOutgoingNotification: Record "IC Outgoing Notification")
    var
        DescriptionText: Text[250];
    begin
        DescriptionText := StrSubstNo(CleanUpOutgoingNotificationJobQueueTxt, ICOutgoingNotification."Target IC Partner Code", ICOutgoingNotification."Operation ID");
        ScheduleCrossEnvironmentJobQueue(Codeunit::"IC Sync. Completed JR", JobQueueCategoryCodeCleanUpTok, DescriptionText);
    end;

    local procedure ScheduleCrossEnvironmentJobQueue(CodeunitID: Integer; CategoryCode: Code[10]; DescriptionText: Text[250])
    var
        BlankRecordId: RecordId;
    begin
        ScheduleCrossEnvironmentJobQueue(CodeunitID, CategoryCode, DescriptionText, BlankRecordId);
    end;

    local procedure CheckJobQueueEntryGeneration(var JobQueueEntry: Record "Job Queue Entry"; RecordIdentification: RecordId): Boolean
    var
        BlankRecordId: RecordId;
        CreateJobQueueEntry: Boolean;
    begin
        CreateJobQueueEntry := true;

        // Check if RecordIdentification is not BlankRecordId, implying it's for an ICPartner
        if RecordIdentification <> BlankRecordId then
            JobQueueEntry.SetRange("Record ID to Process", RecordIdentification);

        // Cancel errored or waiting Job Queue Entries exceeding the limit
        JobQueueEntry.SetFilter(Status, '%1|%2', JobQueueEntry.Status::Error, JobQueueEntry.Status::Waiting);
        if JobQueueEntry.Count() >= 2 then begin
            JobQueueEntry.FindSet();
            repeat
                JobQueueEntry.Cancel();
            until JobQueueEntry.Next() = 0;
        end;
        // Limit the number of JQEs per codeunit or per ICPartner
        // If there are at least two JQEs, prevent creating a new one
        JobQueueEntry.SetRange(Status);
        if JobQueueEntry.Count() >= 2 then
            CreateJobQueueEntry := false;

        exit(CreateJobQueueEntry);
    end;

    local procedure ScheduleCrossEnvironmentJobQueue(CodeunitID: Integer; CategoryCode: Code[10]; DescriptionText: Text[250]; RecordIdentification: RecordId)
    var
        JobQueueEntry: Record "Job Queue Entry";
    begin
        JobQueueEntry.SetRange("Object Type to Run", JobQueueEntry."Object Type to Run"::Codeunit);
        JobQueueEntry.SetRange("Object ID to Run", CodeunitID);
        if not CheckJobQueueEntryGeneration(JobQueueEntry, RecordIdentification) then
            exit;
        JobQueueEntry.Reset();
        JobQueueEntry.ReadIsolation := IsolationLevel::ReadCommitted;

        JobQueueEntry."Object Type to Run" := JobQueueEntry."Object Type to Run"::Codeunit;
        JobQueueEntry."Object ID to Run" := CodeunitID;
        JobQueueEntry."Maximum No. of Attempts to Run" := 3;
        JobQueueEntry."Recurring Job" := false;
        JobQueueEntry.Status := JobQueueEntry.Status::"On Hold";
        JobQueueEntry."Job Queue Category Code" := CategoryCode;
        JobQueueEntry."Rerun Delay (sec.)" := 30;
        Clear(JobQueueEntry."Error Message");
        Clear(JobQueueEntry."Error Message Register Id");
        JobQueueEntry.Description := DescriptionText;
        JobQueueEntry."Record ID to Process" := RecordIdentification;
        JobQueueEntry.Insert(true);
        CODEUNIT.Run(CODEUNIT::"Job Queue - Enqueue", JobQueueEntry);
    end;

    local procedure CleanupOrphanedBufferRecords(TransactionNo: Integer; ICPartnerCode: Code[20])
    var
        BufferICInboxTransaction: Record "Buffer IC Inbox Transaction";
        BufferICInboxJnlLine: Record "Buffer IC Inbox Jnl. Line";
        BufferICInboxPurchHeader: Record "Buffer IC Inbox Purch Header";
        BufferICInboxPurchaseLine: Record "Buffer IC Inbox Purchase Line";
        BufferICInboxSalesHeader: Record "Buffer IC Inbox Sales Header";
        BufferICInboxSalesLine: Record "Buffer IC Inbox Sales Line";
        BufferICInOutJnlLineDim: Record "Buffer IC InOut Jnl. Line Dim.";
        BufferICDocumentDimension: Record "Buffer IC Document Dimension";
        BufferICCommentLine: Record "Buffer IC Comment Line";
        ICOutgoingNotification: Record "IC Outgoing Notification";
    begin
        // Delete any associated IC Outgoing Notifications before removing buffer records
        BufferICInboxTransaction.SetRange("Transaction No.", TransactionNo);
        BufferICInboxTransaction.SetRange("IC Partner Code", ICPartnerCode);
        if BufferICInboxTransaction.FindSet() then
            repeat
                if not IsNullGuid(BufferICInboxTransaction."Operation ID") then
                    if ICOutgoingNotification.Get(BufferICInboxTransaction."Operation ID") then
                        ICOutgoingNotification.Delete();
            until BufferICInboxTransaction.Next() = 0
        else
            exit; // Nothing to clean up

        BufferICInboxTransaction.DeleteAll();

        BufferICInboxJnlLine.SetRange("Transaction No.", TransactionNo);
        BufferICInboxJnlLine.SetRange("IC Partner Code", ICPartnerCode);
        if not BufferICInboxJnlLine.IsEmpty() then
            BufferICInboxJnlLine.DeleteAll();

        BufferICInboxPurchHeader.SetRange("IC Transaction No.", TransactionNo);
        BufferICInboxPurchHeader.SetRange("IC Partner Code", ICPartnerCode);
        if not BufferICInboxPurchHeader.IsEmpty() then
            BufferICInboxPurchHeader.DeleteAll();

        BufferICInboxPurchaseLine.SetRange("IC Transaction No.", TransactionNo);
        BufferICInboxPurchaseLine.SetRange("IC Partner Code", ICPartnerCode);
        if not BufferICInboxPurchaseLine.IsEmpty() then
            BufferICInboxPurchaseLine.DeleteAll();

        BufferICInboxSalesHeader.SetRange("IC Transaction No.", TransactionNo);
        BufferICInboxSalesHeader.SetRange("IC Partner Code", ICPartnerCode);
        if not BufferICInboxSalesHeader.IsEmpty() then
            BufferICInboxSalesHeader.DeleteAll();

        BufferICInboxSalesLine.SetRange("IC Transaction No.", TransactionNo);
        BufferICInboxSalesLine.SetRange("IC Partner Code", ICPartnerCode);
        if not BufferICInboxSalesLine.IsEmpty() then
            BufferICInboxSalesLine.DeleteAll();

        BufferICInOutJnlLineDim.SetRange("Transaction No.", TransactionNo);
        BufferICInOutJnlLineDim.SetRange("IC Partner Code", ICPartnerCode);
        if not BufferICInOutJnlLineDim.IsEmpty() then
            BufferICInOutJnlLineDim.DeleteAll();

        BufferICDocumentDimension.SetRange("Transaction No.", TransactionNo);
        BufferICDocumentDimension.SetRange("IC Partner Code", ICPartnerCode);
        if not BufferICDocumentDimension.IsEmpty() then
            BufferICDocumentDimension.DeleteAll();

        BufferICCommentLine.SetRange("Transaction No.", TransactionNo);
        BufferICCommentLine.SetRange("IC Partner Code", ICPartnerCode);
        if not BufferICCommentLine.IsEmpty() then
            BufferICCommentLine.DeleteAll();
    end;

    local procedure AssignOperationIDToBufferObjects(var ICInboxTransaction: Record "IC Inbox Transaction"; OperationID: Guid)
    var
        BufferICInboxTransaction: Record "Buffer IC Inbox Transaction";
        BufferICInboxJnlLine: Record "Buffer IC Inbox Jnl. Line";
        BufferICInboxPurchHeader: Record "Buffer IC Inbox Purch Header";
        BufferICInboxPurchaseLine: Record "Buffer IC Inbox Purchase Line";
        BufferICInboxSalesHeader: Record "Buffer IC Inbox Sales Header";
        BufferICInboxSalesLine: Record "Buffer IC Inbox Sales Line";
        BufferICInOutJnlLineDim: Record "Buffer IC InOut Jnl. Line Dim.";
        BufferICDocumentDimension: Record "Buffer IC Document Dimension";
        BufferICCommentLine: Record "Buffer IC Comment Line";
    begin
        if not BufferICInboxTransaction.Get(ICInboxTransaction."Transaction No.", ICInboxTransaction."IC Partner Code", ICInboxTransaction."Transaction Source", ICInboxTransaction."Document Type") then
            exit;
        BufferICInboxTransaction."Operation ID" := OperationID;
        BufferICInboxTransaction.Modify();

        BufferICInboxJnlLine.SetRange("Transaction No.", ICInboxTransaction."Transaction No.");
        BufferICInboxJnlLine.SetRange("IC Partner Code", ICInboxTransaction."IC Partner Code");
        BufferICInboxJnlLine.SetRange("Transaction Source", ICInboxTransaction."Transaction Source");
        if not BufferICInboxJnlLine.IsEmpty() then begin
            BufferICInboxJnlLine.FindSet();
            repeat
                BufferICInboxJnlLine."Operation ID" := OperationID;
                BufferICInboxJnlLine.Modify();
            until BufferICInboxJnlLine.Next() = 0;
        end;

        BufferICInboxPurchHeader.SetRange("IC Transaction No.", ICInboxTransaction."Transaction No.");
        BufferICInboxPurchHeader.SetRange("IC Partner Code", ICInboxTransaction."IC Partner Code");
        BufferICInboxPurchHeader.SetRange("Transaction Source", ICInboxTransaction."Transaction Source");
        if not BufferICInboxPurchHeader.IsEmpty() then begin
            BufferICInboxPurchHeader.FindSet();
            repeat
                BufferICInboxPurchHeader."Operation ID" := OperationID;
                BufferICInboxPurchHeader.Modify();
            until BufferICInboxPurchHeader.Next() = 0;
        end;

        BufferICInboxPurchaseLine.SetRange("IC Transaction No.", ICInboxTransaction."Transaction No.");
        BufferICInboxPurchaseLine.SetRange("IC Partner Code", ICInboxTransaction."IC Partner Code");
        BufferICInboxPurchaseLine.SetRange("Transaction Source", ICInboxTransaction."Transaction Source");
        if not BufferICInboxPurchaseLine.IsEmpty() then begin
            BufferICInboxPurchaseLine.FindSet();
            repeat
                BufferICInboxPurchaseLine."Operation ID" := OperationID;
                BufferICInboxPurchaseLine.Modify();
            until BufferICInboxPurchaseLine.Next() = 0;
        end;

        BufferICInboxSalesHeader.SetRange("IC Transaction No.", ICInboxTransaction."Transaction No.");
        BufferICInboxSalesHeader.SetRange("IC Partner Code", ICInboxTransaction."IC Partner Code");
        BufferICInboxSalesHeader.SetRange("Transaction Source", ICInboxTransaction."Transaction Source");
        if not BufferICInboxSalesHeader.IsEmpty() then begin
            BufferICInboxSalesHeader.FindSet();
            repeat
                BufferICInboxSalesHeader."Operation ID" := OperationID;
                BufferICInboxSalesHeader.Modify();
            until BufferICInboxSalesHeader.Next() = 0;
        end;

        BufferICInboxSalesLine.SetRange("IC Transaction No.", ICInboxTransaction."Transaction No.");
        BufferICInboxSalesLine.SetRange("IC Partner Code", ICInboxTransaction."IC Partner Code");
        BufferICInboxSalesLine.SetRange("Transaction Source", ICInboxTransaction."Transaction Source");
        if not BufferICInboxSalesLine.IsEmpty() then begin
            BufferICInboxSalesLine.FindSet();
            repeat
                BufferICInboxSalesLine."Operation ID" := OperationID;
                BufferICInboxSalesLine.Modify();
            until BufferICInboxSalesLine.Next() = 0;
        end;

        BufferICInOutJnlLineDim.SetRange("Transaction No.", ICInboxTransaction."Transaction No.");
        BufferICInOutJnlLineDim.SetRange("IC Partner Code", ICInboxTransaction."IC Partner Code");
        BufferICInOutJnlLineDim.SetRange("Transaction Source", ICInboxTransaction."Transaction Source");
        if not BufferICInOutJnlLineDim.IsEmpty() then begin
            BufferICInOutJnlLineDim.FindSet();
            repeat
                BufferICInOutJnlLineDim."Operation ID" := OperationID;
                BufferICInOutJnlLineDim.Modify();
            until BufferICInOutJnlLineDim.Next() = 0;
        end;

        BufferICDocumentDimension.SetRange("Transaction No.", ICInboxTransaction."Transaction No.");
        BufferICDocumentDimension.SetRange("IC Partner Code", ICInboxTransaction."IC Partner Code");
        BufferICDocumentDimension.SetRange("Transaction Source", ICInboxTransaction."Transaction Source");
        if not BufferICDocumentDimension.IsEmpty() then begin
            BufferICDocumentDimension.FindSet();
            repeat
                BufferICDocumentDimension."Operation ID" := OperationID;
                BufferICDocumentDimension.Modify();
            until BufferICDocumentDimension.Next() = 0;
        end;

        BufferICCommentLine.SetRange("Transaction No.", ICInboxTransaction."Transaction No.");
        BufferICCommentLine.SetRange("IC Partner Code", ICInboxTransaction."IC Partner Code");
        BufferICCommentLine.SetRange("Transaction Source", ICInboxTransaction."Transaction Source");
        if not BufferICCommentLine.IsEmpty() then begin
            BufferICCommentLine.FindSet();
            repeat
                BufferICCommentLine."Operation ID" := OperationID;
                BufferICCommentLine.Modify();
            until BufferICCommentLine.Next() = 0;
        end;
    end;

    local procedure IsCrossEnvironmentPartner(PartnerCompanyName: Text): Boolean
    var
        ICPartner: Record "IC Partner";
    begin
        ICPartner.LoadFields("Data Exchange Type");
        ICPartner.ReadIsolation := IsolationLevel::ReadCommitted;
        ICPartner.SetRange(Name, PartnerCompanyName);
        if ICPartner.FindFirst() then
            exit(ICPartner."Data Exchange Type" = Enum::"IC Data Exchange Type"::API);
        exit(false);
    end;

    [EventSubscriber(ObjectType::Report, Report::"Move IC Trans. to Partner Comp", 'OnICInboxTransactionCreated', '', false, false)]
    local procedure OnAfterICInboxTransactionMovedToBuffer(var Sender: Report "Move IC Trans. to Partner Comp"; var ICInboxTransaction: Record "IC Inbox Transaction"; PartnerCompanyName: Text)
    var
        ICOutgoingNotification: Record "IC Outgoing Notification";
        ICSetup: Record "IC Setup";
        DescriptionText: Text[250];
        OperationID: Guid;
    begin
        if not IsCrossEnvironmentPartner(PartnerCompanyName) then
            exit;

        if ICInboxTransaction.IsEmpty() then
            exit;

        OperationID := CreateGuid();
        AssignOperationIDToBufferObjects(ICInboxTransaction, OperationID);

        ICSetup.LoadFields("IC Partner Code");
        ICSetup.ReadIsolation := IsolationLevel::ReadCommitted;
        ICSetup.Get();
        ICOutgoingNotification."Operation ID" := OperationID;
        ICOutgoingNotification."Source IC Partner Code" := ICSetup."IC Partner Code";
        ICOutgoingNotification."Target IC Partner Code" := Sender.GetCurrentPartnerCode();
        ICOutgoingNotification.Status := ICOutgoingNotification.Status::Created;
        ICOutgoingNotification."Notified DateTime" := CurrentDateTime();
        ICOutgoingNotification.SetErrorMessage('');
        ICOutgoingNotification.Insert();

        DescriptionText := StrSubstNo(SendNotificationJobQueueTxt, ICOutgoingNotification."Target IC Partner Code", ICOutgoingNotification."Operation ID");
        ScheduleCrossEnvironmentJobQueue(Codeunit::"IC New Notification JR", JobQueueCategoryCodeSendNotificationTok, DescriptionText);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"IC Data Exchange API", 'OnPopulateTransactionDataFromICOutgoingNotification', '', false, false)]
    local procedure HandledOnPopulate(IndividualObject: JsonObject; var Success: Boolean)
    begin
        PopulateTransactionDataFromICOutgoingNotification(IndividualObject);
        Success := true;
    end;

    /// <summary>
    /// Internal event for populating transaction data from intercompany outgoing notifications.
    /// </summary>
    /// <param name="IndividualObject">JSON object containing transaction data</param>
    /// <param name="Success">Indicates whether population was successful</param>
    [InternalEvent(false, true)]
    internal procedure OnPopulateTransactionDataFromICOutgoingNotification(IndividualObject: JsonObject; var Success: Boolean)
    begin
    end;

    /// <summary>
    /// Integration event raised before inserting buffer IC inbox purchase header data.
    /// </summary>
    /// <param name="BufferICInboxPurchaseHeader">Buffer purchase header record being inserted</param>
    /// <param name="TempICPartnerICInboxPurchaseHeader">Source purchase header data from partner</param>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="RegisteredPartner">Registered partner information</param>
    [IntegrationEvent(false, false)]
    local procedure OnPostICPurchaseHeaderToICPartnerInboxOnBeforeBufferICInboxPurchaseHeaderInsert(var BufferICInboxPurchaseHeader: Record "Buffer IC Inbox Purch Header"; TempICPartnerICInboxPurchaseHeader: Record "IC Inbox Purchase Header" temporary; ICPartner: Record "IC Partner"; RegisteredPartner: Record "IC Partner" temporary)
    begin
    end;

    /// <summary>
    /// Integration event raised before inserting buffer IC inbox sales header data.
    /// </summary>
    /// <param name="BufferICInboxSalesHeader">Buffer sales header record being inserted</param>
    /// <param name="TempICPartnerICInboxSalesHeader">Source sales header data from partner</param>
    /// <param name="ICPartner">Intercompany partner record</param>
    /// <param name="RegisteredPartner">Registered partner information</param>
    [IntegrationEvent(false, false)]
    local procedure OnPostICSalesHeaderToICPartnerInboxOnBeforeBufferICInboxSalesHeaderInsert(var BufferICInboxSalesHeader: Record "Buffer IC Inbox Sales Header"; TempICPartnerICInboxSalesHeader: Record "IC Inbox Sales Header" temporary; ICPartner: Record "IC Partner"; RegisteredPartner: Record "IC Partner" temporary)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostICSalesLineToICPartnerInboxOnBeforeBufferICInboxSalesLineInsert(var BufferICInboxSalesLine: Record "Buffer IC Inbox Sales Line"; TempICPartnerICInboxSalesLine: Record "IC Inbox Sales Line" temporary; ICPartner: Record "IC Partner")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICInboxTransactionFromJsonOnBeforeInsert(var ICInboxTransaction: Record "IC Inbox Transaction"; IndividualToken: JsonToken)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICInboxJournalLineFromJsonOnBeforeInsert(var ICInboxJournalLine: Record "IC Inbox Jnl. Line"; IndividualToken: JsonToken)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICInboxPurchaseLineFromJsonOnBeforeInsert(var ICInboxPurchaseLine: Record "IC Inbox Purchase Line"; IndividualToken: JsonToken)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICInboxSalesHeaderFromJsonOnBeforeInsert(var ICInboxSalesHeader: Record "IC Inbox Sales Header"; IndividualToken: JsonToken)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICInboxSalesLineFromJsonOnBeforeInsert(var ICInboxSalesLine: Record "IC Inbox Sales Line"; IndividualToken: JsonToken)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICInboxOutboxJnlLineDimFromJsonOnBeforeInsert(var ICInboxOutboxJnlLineDim: Record "IC Inbox/Outbox Jnl. Line Dim."; IndividualToken: JsonToken)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICDocumentDimensionFromJsonOnBeforeInsert(var ICDocumentDimension: Record "IC Document Dimension"; IndividualToken: JsonToken)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICInboxPurchaseHeaderFromJsonOnBeforeInsert(var ICInboxPurchaseHeader: Record "IC Inbox Purchase Header"; IndividualToken: JsonToken)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPopulateICCommentLineFromJsonOnBeforeInsert(var ICCommentLine: Record "IC Comment Line"; IndividualToken: JsonToken)
    begin
    end;
}