Codeunit 435 IC Inbox Import, source in 29
Source29
src/Layers/W1/BaseApp/Finance/Intercompany/Inbox/ICInboxImport.Codeunit.al239 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.Inbox;
using Microsoft.Intercompany;
using Microsoft.Intercompany.Dimension;
using Microsoft.Intercompany.GLAccount;
using Microsoft.Intercompany.Outbox;
using Microsoft.Intercompany.Partner;
using Microsoft.Intercompany.Setup;
using System.IO;
using System.Telemetry;
/// <summary>
/// Handles import of intercompany transactions from external sources into the IC inbox.
/// Processes outbox transactions from partner companies and converts them to inbox transactions for acceptance and processing.
/// </summary>
codeunit 435 "IC Inbox Import"
{
TableNo = "IC Inbox Transaction";
trigger OnRun()
var
ICSetup: Record "IC Setup";
TempICOutboxTrans: Record "IC Outbox Transaction" temporary;
TempICOutboxJnlLine: Record "IC Outbox Jnl. Line" temporary;
TempICInboxOutboxJnlLineDim: Record "IC Inbox/Outbox Jnl. Line Dim." temporary;
TempICOutboxSalesHeader: Record "IC Outbox Sales Header" temporary;
TempICOutboxSalesLine: Record "IC Outbox Sales Line" temporary;
TempICOutboxPurchaseHeader: Record "IC Outbox Purchase Header" temporary;
TempICOutboxPurchaseLine: Record "IC Outbox Purchase Line" temporary;
TempICDocDim: Record "IC Document Dimension" temporary;
TempAllPartnerICInboxTransaction: Record "IC Inbox Transaction" temporary;
TempAllPartnerHandledICInboxTrans: Record "Handled IC Inbox Trans." temporary;
ICInboxJnlLine: Record "IC Inbox Jnl. Line";
ICInboxSalesHeader: Record "IC Inbox Sales Header";
ICInboxSalesLine: Record "IC Inbox Sales Line";
ICInboxPurchaseHeader: Record "IC Inbox Purchase Header";
ICInboxPurchaseLine: Record "IC Inbox Purchase Line";
ICInboxOutboxJnlLineDim: Record "IC Inbox/Outbox Jnl. Line Dim.";
ICInboxDocDim: Record "IC Document Dimension";
ICInboxOutboxMgt: Codeunit ICInboxOutboxMgt;
FileMgt: Codeunit "File Management";
FeatureTelemetry: Codeunit "Feature Telemetry";
ICMapping: Codeunit "IC Mapping";
FileName: Text;
FromICPartnerCode: Code[20];
NewTableID: Integer;
ICPartnerCodeList: List of [Text];
begin
FeatureTelemetry.LogUptake('0000IKQ', ICMapping.GetFeatureTelemetryName(), Enum::"Feature Uptake Status"::Used);
FeatureTelemetry.LogUsage('0000IKR', ICMapping.GetFeatureTelemetryName(), 'IC Inbox Import');
ICSetup.Get();
ICSetup.TestField("IC Partner Code");
if ClientFileName <> '' then
FileName := ClientFileName
else
FileName := FileMgt.UploadFile(ChooseFileTitleMsg, '');
if FileName = '' then
Error(EnterFileNameErr);
ImportInboxTransaction(
ICSetup,
TempICOutboxTrans, TempICOutboxJnlLine, TempICInboxOutboxJnlLineDim, TempICOutboxSalesHeader, TempICOutboxSalesLine,
TempICOutboxPurchaseHeader, TempICOutboxPurchaseLine, TempICDocDim, FromICPartnerCode, FileName);
if TempICOutboxTrans.Find('-') then
repeat
ICInboxOutboxMgt.OutboxTransToInboxOptimized(TempICOutboxTrans, Rec, FromICPartnerCode, ICPartnerCodeList, TempAllPartnerICInboxTransaction, TempAllPartnerHandledICInboxTrans);
TempICOutboxJnlLine.SetRange("Transaction No.", TempICOutboxTrans."Transaction No.");
TempICOutboxJnlLine.SetRange("IC Partner Code", TempICOutboxTrans."IC Partner Code");
TempICOutboxJnlLine.SetRange("Transaction Source", TempICOutboxTrans."Transaction Source");
if TempICOutboxJnlLine.Find('-') then
repeat
ICInboxOutboxMgt.OutboxJnlLineToInbox(Rec, TempICOutboxJnlLine, ICInboxJnlLine);
TempICInboxOutboxJnlLineDim.SetRange("Transaction No.", TempICOutboxTrans."Transaction No.");
TempICInboxOutboxJnlLineDim.SetRange("IC Partner Code", TempICOutboxTrans."IC Partner Code");
TempICInboxOutboxJnlLineDim.SetRange("Transaction Source", TempICOutboxTrans."Transaction Source");
TempICInboxOutboxJnlLineDim.SetRange("Line No.", ICInboxJnlLine."Line No.");
if TempICInboxOutboxJnlLineDim.Find('-') then
repeat
ICInboxOutboxMgt.OutboxJnlLineDimToInbox(
ICInboxJnlLine, TempICInboxOutboxJnlLineDim, ICInboxOutboxJnlLineDim, DATABASE::"IC Inbox Jnl. Line");
until TempICInboxOutboxJnlLineDim.Next() = 0;
until TempICOutboxJnlLine.Next() = 0;
TempICOutboxSalesHeader.SetRange("IC Transaction No.", TempICOutboxTrans."Transaction No.");
TempICOutboxSalesHeader.SetRange("IC Partner Code", TempICOutboxTrans."IC Partner Code");
TempICOutboxSalesHeader.SetRange("Transaction Source", TempICOutboxTrans."Transaction Source");
if TempICOutboxSalesHeader.Find('-') then
repeat
ICInboxOutboxMgt.OutboxSalesHdrToInbox(Rec, TempICOutboxSalesHeader, ICInboxPurchaseHeader);
until TempICOutboxSalesHeader.Next() = 0;
TempICOutboxSalesLine.SetRange("IC Transaction No.", TempICOutboxTrans."Transaction No.");
TempICOutboxSalesLine.SetRange("IC Partner Code", TempICOutboxTrans."IC Partner Code");
TempICOutboxSalesLine.SetRange("Transaction Source", TempICOutboxTrans."Transaction Source");
if TempICOutboxSalesLine.Find('-') then
repeat
ICInboxOutboxMgt.OutboxSalesLineToInbox(Rec, TempICOutboxSalesLine, ICInboxPurchaseLine);
until TempICOutboxSalesLine.Next() = 0;
TempICOutboxPurchaseHeader.SetRange("IC Transaction No.", TempICOutboxTrans."Transaction No.");
TempICOutboxPurchaseHeader.SetRange("IC Partner Code", TempICOutboxTrans."IC Partner Code");
TempICOutboxPurchaseHeader.SetRange("Transaction Source", TempICOutboxTrans."Transaction Source");
if TempICOutboxPurchaseHeader.Find('-') then
repeat
ICInboxOutboxMgt.OutboxPurchHdrToInbox(Rec, TempICOutboxPurchaseHeader, ICInboxSalesHeader);
until TempICOutboxPurchaseHeader.Next() = 0;
TempICOutboxPurchaseLine.SetRange("IC Transaction No.", TempICOutboxTrans."Transaction No.");
TempICOutboxPurchaseLine.SetRange("IC Partner Code", TempICOutboxTrans."IC Partner Code");
TempICOutboxPurchaseLine.SetRange("Transaction Source", TempICOutboxTrans."Transaction Source");
if TempICOutboxPurchaseLine.Find('-') then
repeat
ICInboxOutboxMgt.OutboxPurchLineToInbox(Rec, TempICOutboxPurchaseLine, ICInboxSalesLine);
until TempICOutboxPurchaseLine.Next() = 0;
TempICDocDim.SetRange("Transaction No.", TempICOutboxTrans."Transaction No.");
TempICDocDim.SetRange("IC Partner Code", TempICOutboxTrans."IC Partner Code");
TempICDocDim.SetRange("Transaction Source", TempICOutboxTrans."Transaction Source");
if TempICDocDim.Find('-') then
repeat
case TempICDocDim."Table ID" of
DATABASE::"IC Outbox Sales Header":
NewTableID := DATABASE::"IC Inbox Purchase Header";
DATABASE::"IC Outbox Sales Line":
NewTableID := DATABASE::"IC Inbox Purchase Line";
DATABASE::"IC Outbox Purchase Header":
NewTableID := DATABASE::"IC Inbox Sales Header";
DATABASE::"IC Outbox Purchase Line":
NewTableID := DATABASE::"IC Inbox Sales Line";
end;
ICInboxOutboxMgt.OutboxDocDimToInbox(
TempICDocDim, ICInboxDocDim, NewTableID, FromICPartnerCode, Rec."Transaction Source");
until TempICDocDim.Next() = 0;
OnRunOnAfterTempICOutboxTransLoop(Rec, TempICOutboxTrans);
until TempICOutboxTrans.Next() = 0;
end;
var
#pragma warning disable AA0470
WrongCompanyErr: Label 'The selected xml file contains data sent to %1 %2. Current company''s %3 is %4.', Comment = 'The selected xml file contains data sent to IC Partner 001. Current company''s IC Partner Code is 002.';
#pragma warning restore AA0470
EnterFileNameErr: Label 'Enter the file name.';
ChooseFileTitleMsg: Label 'Choose the file to upload.';
ClientFileName: Text;
[Scope('OnPrem')]
procedure SetFileName(NewFileName: Text)
begin
ClientFileName := NewFileName;
end;
local procedure ImportInboxTransaction(ICSetup: Record "IC Setup"; var TempICOutboxTransaction: Record "IC Outbox Transaction" temporary; var TempICOutboxJnlLine: Record "IC Outbox Jnl. Line" temporary; var TempICInboxOutboxJnlLineDim: Record "IC Inbox/Outbox Jnl. Line Dim." temporary; var TempICOutboxSalesHeader: Record "IC Outbox Sales Header" temporary; var TempICOutboxSalesLine: Record "IC Outbox Sales Line" temporary; var TempICOutboxPurchaseHeader: Record "IC Outbox Purchase Header" temporary; var TempICOutboxPurchaseLine: Record "IC Outbox Purchase Line" temporary; var TempICDocDim: Record "IC Document Dimension" temporary; var FromICPartnerCode: Code[20]; FileName: Text)
var
ICPartner: Record "IC Partner";
ICOutboxImpExpXML: XMLport "IC Outbox Imp/Exp";
IStream: InStream;
IFile: File;
ToICPartnerCode: Code[20];
IsHandled: Boolean;
begin
IFile.Open(FileName);
IFile.CreateInStream(IStream);
IsHandled := false;
OnBeforeImportInboxTransactionProcedure(
ICSetup, IStream,
TempICOutboxTransaction, TempICOutboxJnlLine, TempICInboxOutboxJnlLineDim, TempICOutboxSalesHeader, TempICOutboxSalesLine,
TempICOutboxPurchaseHeader, TempICOutboxPurchaseLine, TempICDocDim, FromICPartnerCode, IsHandled);
if IsHandled then
exit;
ICOutboxImpExpXML.SetSource(IStream);
ICOutboxImpExpXML.Import();
IFile.Close();
FromICPartnerCode := ICOutboxImpExpXML.GetFromICPartnerCode();
ToICPartnerCode := ICOutboxImpExpXML.GetToICPartnerCode();
if ToICPartnerCode <> ICSetup."IC Partner Code" then
Error(
WrongCompanyErr, ICPartner.TableCaption(), ToICPartnerCode,
ICSetup.FieldCaption("IC Partner Code"), ICSetup."IC Partner Code");
ICOutboxImpExpXML.GetICOutboxTrans(TempICOutboxTransaction);
ICOutboxImpExpXML.GetICOutBoxJnlLine(TempICOutboxJnlLine);
ICOutboxImpExpXML.GetICIOBoxJnlDim(TempICInboxOutboxJnlLineDim);
ICOutboxImpExpXML.GetICOutBoxSalesHdr(TempICOutboxSalesHeader);
ICOutboxImpExpXML.GetICOutBoxSalesLine(TempICOutboxSalesLine);
ICOutboxImpExpXML.GetICOutBoxPurchHdr(TempICOutboxPurchaseHeader);
ICOutboxImpExpXML.GetICOutBoxPurchLine(TempICOutboxPurchaseLine);
ICOutboxImpExpXML.GetICSalesDocDim(TempICDocDim);
ICOutboxImpExpXML.GetICSalesDocLineDim(TempICDocDim);
ICOutboxImpExpXML.GetICPurchDocDim(TempICDocDim);
ICOutboxImpExpXML.GetICPurchDocLineDim(TempICDocDim);
FromICPartnerCode := ICOutboxImpExpXML.GetFromICPartnerCode();
end;
/// <summary>
/// Integration event raised before importing inbox transaction data to allow custom import handling.
/// </summary>
/// <param name="ICSetup">IC Setup record with configuration</param>
/// <param name="IStream">Input stream containing transaction data</param>
/// <param name="TempICOutboxTransaction">Temporary outbox transaction records</param>
/// <param name="TempICOutboxJnlLine">Temporary outbox journal line records</param>
/// <param name="TempICInboxOutboxJnlLineDim">Temporary dimension records</param>
/// <param name="TempICOutboxSalesHeader">Temporary sales header records</param>
/// <param name="TempICOutboxSalesLine">Temporary sales line records</param>
/// <param name="TempICOutboxPurchaseHeader">Temporary purchase header records</param>
/// <param name="TempICOutboxPurchaseLine">Temporary purchase line records</param>
/// <param name="TempICDocDim">Temporary document dimension records</param>
/// <param name="FromICPartnerCode">IC partner code sending the data</param>
/// <param name="IsHandled">Set to true to skip standard import processing</param>
[IntegrationEvent(false, false)]
local procedure OnBeforeImportInboxTransactionProcedure(ICSetup: Record "IC Setup"; var IStream: InStream; var TempICOutboxTransaction: Record "IC Outbox Transaction" temporary; var TempICOutboxJnlLine: Record "IC Outbox Jnl. Line" temporary; var TempICInboxOutboxJnlLineDim: Record "IC Inbox/Outbox Jnl. Line Dim." temporary; var TempICOutboxSalesHeader: Record "IC Outbox Sales Header" temporary; var TempICOutboxSalesLine: Record "IC Outbox Sales Line" temporary; var TempICOutboxPurchaseHeader: Record "IC Outbox Purchase Header" temporary; var TempICOutboxPurchaseLine: Record "IC Outbox Purchase Line" temporary; var TempICDocDim: Record "IC Document Dimension" temporary; var FromICPartnerCode: Code[20]; var IsHandled: Boolean)
begin
end;
/// <summary>
/// Integration event raised after processing each outbox transaction during import to allow custom actions.
/// </summary>
/// <param name="IcInboxTransaction">IC Inbox Transaction record created from the outbox transaction</param>
/// <param name="IcOutBoxTransaction">IC Outbox Transaction record that was processed</param>
[IntegrationEvent(false, false)]
local procedure OnRunOnAfterTempICOutboxTransLoop(var IcInboxTransaction: Record "IC Inbox Transaction"; var IcOutBoxTransaction: Record "IC Outbox Transaction")
begin
end;
}