Table 414 IC Outbox Transaction
- App
- Base Application
- Namespace
- Microsoft.Intercompany.Outbox
- Versions
- 17-28
Fields, 14Keys, 2Procedures, 1Events, 5Obsolete, 2
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Finance/Intercompany/Outbox/ICOutboxTransaction.Table.al414 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.Outbox;
using Microsoft.Intercompany;
using Microsoft.Intercompany.Comment;
using Microsoft.Intercompany.Journal;
using Microsoft.Intercompany.Partner;
using System.Utilities;
/// <summary>
/// Stores intercompany transactions pending transmission to partner companies.
/// Manages outbound transaction staging, status tracking, and partner communication for intercompany operations.
/// </summary>
/// <remarks>
/// Primary staging table for outbound intercompany transactions. Integrates with partner setup, transaction processing, and status management.
/// Key relationships: IC Partner, IC Outbox Sales Header, IC Outbox Purchase Header, IC Outbox Jnl. Line.
/// Extensible via table extensions for custom transaction types and additional status tracking fields.
/// </remarks>
table 414 "IC Outbox Transaction"
{
Caption = 'IC Outbox Transaction';
DataClassification = CustomerContent;
fields
{
/// <summary>
/// Unique identifier for the intercompany outbox transaction.
/// </summary>
field(1; "Transaction No."; Integer)
{
Caption = 'Transaction No.';
Editable = false;
}
/// <summary>
/// Code identifying the intercompany partner for this outbound transaction.
/// </summary>
field(2; "IC Partner Code"; Code[20])
{
Caption = 'IC Partner Code';
Editable = false;
TableRelation = "IC Partner".Code;
}
#if not CLEANSCHEMA29
/// <summary>
/// Source type option indicating the origin of the intercompany transaction.
/// </summary>
field(3; "Source Type"; Option)
{
Caption = 'Source Type';
Editable = false;
OptionCaption = 'Journal Line,Sales Document,Purchase Document';
OptionMembers = "Journal Line","Sales Document","Purchase Document";
ObsoleteReason = 'Replaced by IC Source Type for Enum typing';
ObsoleteState = Removed;
ObsoleteTag = '29.0';
}
#endif
/// <summary>
/// Source type enum indicating the origin of the intercompany transaction.
/// </summary>
field(4; "IC Source Type"; Enum "IC Transaction Source Type")
{
Caption = 'IC Source Type';
Editable = false;
}
/// <summary>
/// Document type classification for the intercompany transaction.
/// </summary>
field(5; "Document Type"; Enum "IC Transaction Document Type")
{
Caption = 'Document Type';
Editable = false;
}
/// <summary>
/// Document number of the source transaction being processed for intercompany transmission.
/// </summary>
field(6; "Document No."; Code[20])
{
Caption = 'Document No.';
Editable = false;
trigger OnLookup()
begin
OnBeforeLookupDocumentNo(Rec);
end;
}
/// <summary>
/// Posting date of the source transaction for intercompany processing.
/// </summary>
field(7; "Posting Date"; Date)
{
Caption = 'Posting Date';
Editable = false;
}
/// <summary>
/// Source classification indicating whether transaction was created by current company or rejected by partner.
/// </summary>
field(8; "Transaction Source"; Option)
{
Caption = 'Transaction Source';
Editable = false;
OptionCaption = 'Rejected by Current Company,Created by Current Company';
OptionMembers = "Rejected by Current Company","Created by Current Company";
}
/// <summary>
/// Document date from the source transaction for intercompany transmission.
/// </summary>
field(9; "Document Date"; Date)
{
Caption = 'Document Date';
Editable = false;
}
/// <summary>
/// Action to be performed on the outbox transaction line during processing.
/// </summary>
field(10; "Line Action"; Option)
{
Caption = 'Line Action';
OptionCaption = 'No Action,Send to IC Partner,Return to Inbox,Cancel';
OptionMembers = "No Action","Send to IC Partner","Return to Inbox",Cancel;
trigger OnValidate()
begin
case "Line Action" of
"Line Action"::"Return to Inbox":
TestField("Transaction Source", "Transaction Source"::"Rejected by Current Company");
"Line Action"::"Send to IC Partner":
OutboxCheckSend();
end;
end;
}
#if not CLEANSCHEMA25
/// <summary>
/// IC Partner G/L account number for the intercompany transaction.
/// </summary>
field(12; "IC Partner G/L Acc. No."; Code[20])
{
Caption = 'IC Partner G/L Acc. No.';
ObsoleteReason = 'Replaced by IC Account No.';
ObsoleteState = Removed;
ObsoleteTag = '25.0';
}
#endif
/// <summary>
/// Source line number from the originating document for transaction traceability.
/// </summary>
field(13; "Source Line No."; Integer)
{
Caption = 'Source Line No.';
}
/// <summary>
/// Account type for intercompany journal transactions.
/// </summary>
field(14; "IC Account Type"; Enum "IC Journal Account Type")
{
Caption = 'IC Account Type';
}
/// <summary>
/// Account number for intercompany journal transactions based on IC Account Type.
/// </summary>
field(15; "IC Account No."; Code[20])
{
Caption = 'IC Account No.';
}
}
keys
{
key(Key1; "Transaction No.", "IC Partner Code", "Transaction Source", "Document Type")
{
Clustered = true;
}
key(Key2; "IC Partner Code")
{
}
}
fieldgroups
{
}
trigger OnDelete()
var
ICOutboxJnlLine: Record "IC Outbox Jnl. Line";
ICOutboxPurchHdr: Record "IC Outbox Purchase Header";
ICOutboxSalesHdr: Record "IC Outbox Sales Header";
ICCommentLine: Record "IC Comment Line";
begin
case "IC Source Type" of
"IC Source Type"::Journal:
begin
ICOutboxJnlLine.SetRange("Transaction No.", "Transaction No.");
ICOutboxJnlLine.SetRange("IC Partner Code", "IC Partner Code");
ICOutboxJnlLine.SetRange("Transaction Source", "Transaction Source");
if ICOutboxJnlLine.FindFirst() then
ICOutboxJnlLine.DeleteAll(true);
end;
"IC Source Type"::"Sales Document":
begin
ICOutboxSalesHdr.SetRange("IC Transaction No.", "Transaction No.");
ICOutboxSalesHdr.SetRange("IC Partner Code", "IC Partner Code");
ICOutboxSalesHdr.SetRange("Transaction Source", "Transaction Source");
if ICOutboxSalesHdr.FindFirst() then
ICOutboxSalesHdr.Delete(true);
end;
"IC Source Type"::"Purchase Document":
begin
ICOutboxPurchHdr.SetRange("IC Transaction No.", "Transaction No.");
ICOutboxPurchHdr.SetRange("IC Partner Code", "IC Partner Code");
ICOutboxPurchHdr.SetRange("Transaction Source", "Transaction Source");
if ICOutboxPurchHdr.FindFirst() then
ICOutboxPurchHdr.Delete(true);
end;
else
OnDeleteOnSourceTypeCase(Rec);
end;
ICCommentLine.SetRange("Table Name", ICCommentLine."Table Name"::"IC Outbox Transaction");
ICCommentLine.SetRange("Transaction No.", "Transaction No.");
ICCommentLine.SetRange("IC Partner Code", "IC Partner Code");
ICCommentLine.SetRange("Transaction Source", "Transaction Source");
if ICCommentLine.Find('-') then
repeat
ICCommentLine.Delete(true);
until ICCommentLine.Next() = 0;
end;
/// <summary>
/// Opens the detailed view for the outbox transaction based on its source type.
/// Displays appropriate page for journal lines, sales documents, or purchase documents.
/// </summary>
procedure ShowDetails()
var
ICOutboxJnlLine: Record "IC Outbox Jnl. Line";
ICOutboxSalesHeader: Record "IC Outbox Sales Header";
ICOutboxPurchHeader: Record "IC Outbox Purchase Header";
ICOutboxJnlLines: Page "IC Outbox Jnl. Lines";
ICOutboxSalesDoc: Page "IC Outbox Sales Doc.";
ICOutboxPurchDoc: Page "IC Outbox Purchase Doc.";
begin
case "IC Source Type" of
"IC Source Type"::Journal:
begin
ICOutboxJnlLine.SetRange("Transaction No.", "Transaction No.");
ICOutboxJnlLine.SetRange("IC Partner Code", "IC Partner Code");
ICOutboxJnlLine.SetRange("Transaction Source", "Transaction Source");
Clear(ICOutboxJnlLines);
ICOutboxJnlLines.SetTableView(ICOutboxJnlLine);
ICOutboxJnlLines.RunModal();
end;
"IC Source Type"::"Sales Document":
begin
ICOutboxSalesHeader.SetRange("IC Transaction No.", "Transaction No.");
ICOutboxSalesHeader.SetRange("IC Partner Code", "IC Partner Code");
ICOutboxSalesHeader.SetRange("Transaction Source", "Transaction Source");
Clear(ICOutboxSalesDoc);
ICOutboxSalesDoc.SetTableView(ICOutboxSalesHeader);
ICOutboxSalesDoc.RunModal();
end;
"IC Source Type"::"Purchase Document":
begin
ICOutboxPurchHeader.SetRange("IC Partner Code", "IC Partner Code");
ICOutboxPurchHeader.SetRange("IC Transaction No.", "Transaction No.");
ICOutboxPurchHeader.SetRange("Transaction Source", "Transaction Source");
Clear(ICOutboxPurchDoc);
ICOutboxPurchDoc.SetTableView(ICOutboxPurchHeader);
ICOutboxPurchDoc.RunModal();
end;
end;
OnAfterShowDetails(Rec);
end;
local procedure OutboxCheckSend()
var
HandledICOutboxTrans: Record "Handled IC Outbox Trans.";
ICOutboxTransaction2: Record "IC Outbox Transaction";
ConfirmManagement: Codeunit "Confirm Management";
IsHandled: Boolean;
#pragma warning disable AA0074
#pragma warning disable AA0470
Text001: Label 'Transaction No. %2 is a copy of Transaction No. %1, which has already been set to Send to IC Partner.\Do you also want to send Transaction No. %2?';
#pragma warning restore AA0470
#pragma warning restore AA0074
TransactionAlreadyExistsInOutboxHandledQst: Label '%1 %2 has already been sent to intercompany partner %3. Resending it will create a duplicate %1 for them. Do you want to send it again?', Comment = '%1 - Document Type, %2 - Document No, %3 - IC parthner code';
SalesInvoicePreviouslySentAsOrderMsg: Label 'A sales order for this invoice has already been sent to intercompany partner %1. Resending it can lead to duplicate information. Do you want to send it?', Comment = '%1 - Intercompany Partner Code';
begin
IsHandled := false;
OnBeforeOutboxCheckSend(Rec, IsHandled);
if IsHandled then
exit;
HandledICOutboxTrans.SetRange("IC Source Type", "IC Source Type");
HandledICOutboxTrans.SetRange("Document Type", "Document Type");
HandledICOutboxTrans.SetRange("Document No.", "Document No.");
OnOutboxCheckSendOnBeforeHandledICOutboxTransFindFirst(Rec, HandledICOutboxTrans);
if HandledICOutboxTrans.FindFirst() then
if not ConfirmManagement.GetResponseOrDefault(
StrSubstNo(
TransactionAlreadyExistsInOutboxHandledQst, HandledICOutboxTrans."Document Type",
HandledICOutboxTrans."Document No.", HandledICOutboxTrans."IC Partner Code"),
true)
then
Error('');
ICOutboxTransaction2.SetRange("IC Source Type", "IC Source Type");
ICOutboxTransaction2.SetRange("Document Type", "Document Type");
ICOutboxTransaction2.SetRange("Document No.", "Document No.");
ICOutboxTransaction2.SetFilter("Transaction No.", '<>%1', "Transaction No.");
ICOutboxTransaction2.SetRange("IC Account Type", "IC Account Type");
ICOutboxTransaction2.SetRange("IC Account No.", "IC Account No.");
ICOutboxTransaction2.SetRange("Source Line No.", "Source Line No.");
ICOutboxTransaction2.SetRange("Line Action", "Line Action"::"Send to IC Partner");
if ICOutboxTransaction2.FindFirst() then
if not ConfirmManagement.GetResponseOrDefault(
StrSubstNo(Text001, ICOutboxTransaction2."Transaction No.", "Transaction No."), true)
then
Error('');
if SalesInvoicePreviouslySentAsOrder() then
if not ConfirmManagement.GetResponseOrDefault(
StrSubstNo(SalesInvoicePreviouslySentAsOrderMsg, Rec."IC Partner Code"), true)
then
Error('');
end;
local procedure SalesInvoicePreviouslySentAsOrder(): Boolean
var
ICOutboxSalesHeader: Record "IC Outbox Sales Header";
HandledICOutboxTrans: Record "Handled IC Outbox Trans.";
begin
if Rec."Document Type" <> Rec."Document Type"::Invoice then
exit(false);
if Rec."IC Source Type" <> Rec."IC Source Type"::"Sales Document" then
exit(false);
if Rec."Transaction Source" <> Rec."Transaction Source"::"Created by Current Company" then
exit(false);
if not ICOutboxSalesHeader.Get(Rec."Transaction No.", Rec."IC Partner Code", Rec."Transaction Source") then
exit(false);
HandledICOutboxTrans.SetRange("IC Partner Code", Rec."IC Partner Code");
HandledICOutboxTrans.SetRange("Transaction Source", Rec."Transaction Source");
HandledICOutboxTrans.SetRange("Document No.", ICOutboxSalesHeader."Order No.");
HandledICOutboxTrans.SetRange("IC Source Type", Rec."IC Source Type");
HandledICOutboxTrans.SetRange("Document Type", HandledICOutboxTrans."Document Type"::Order);
exit(not HandledICOutboxTrans.IsEmpty());
end;
/// <summary>
/// Integration event raised after showing transaction details to enable custom processing.
/// </summary>
/// <param name="IOutboxTransction">IC Outbox Transaction record after details display</param>
/// <remarks>
/// Raised from ShowDetails procedure after displaying transaction details page.
/// </remarks>
[IntegrationEvent(false, false)]
local procedure OnAfterShowDetails(var IOutboxTransction: Record "IC Outbox Transaction")
begin
end;
/// <summary>
/// Integration event raised before document number lookup to enable custom lookup logic.
/// </summary>
/// <param name="ICOutboxTransaction">IC Outbox Transaction record for lookup context</param>
/// <remarks>
/// Raised from Document No. field OnLookup trigger.
/// </remarks>
[IntegrationEvent(false, false)]
local procedure OnBeforeLookupDocumentNo(ICOutboxTransaction: Record "IC Outbox Transaction");
begin
end;
/// <summary>
/// Integration event raised before outbox send validation to enable custom send checks.
/// </summary>
/// <param name="ICOutboxTransaction">IC Outbox Transaction record being validated</param>
/// <param name="IsHandled">Set to true to skip standard send validation</param>
/// <remarks>
/// Raised from OutboxCheckSend procedure before standard validation logic.
/// </remarks>
[IntegrationEvent(false, false)]
local procedure OnBeforeOutboxCheckSend(var ICOutboxTransaction: Record "IC Outbox Transaction"; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Integration event raised before finding handled outbox transactions for send validation.
/// </summary>
/// <param name="ICOutboxTrans">IC Outbox Transaction record being validated</param>
/// <param name="HandledICOutboxTrans">Handled IC Outbox Transactions record for filtering</param>
/// <remarks>
/// Raised from OutboxCheckSend procedure before searching for handled outbox transactions.
/// </remarks>
[IntegrationEvent(false, false)]
local procedure OnOutboxCheckSendOnBeforeHandledICOutboxTransFindFirst(var ICOutboxTrans: Record "IC Outbox Transaction"; var HandledICOutboxTrans: Record "Handled IC Outbox Trans.")
begin
end;
/// <summary>
/// Integration event raised during transaction deletion based on source type.
/// Enables custom cleanup logic for specific source type scenarios.
/// </summary>
/// <param name="ICOutboxTransaction">IC Outbox Transaction record being deleted</param>
/// <remarks>
/// Raised from OnDelete trigger during source type-specific deletion processing.
/// </remarks>
[IntegrationEvent(false, false)]
local procedure OnDeleteOnSourceTypeCase(var ICOutboxTransaction: Record "IC Outbox Transaction")
begin
end;
}