Codeunit 1202 Import Payroll Transaction

App
Base Application
Namespace
Microsoft.Finance.Payroll
Versions
17-28

Procedures, 2Events, 2

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Finance/Payroll/ImportPayrollTransaction.Codeunit.al143 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.Finance.Payroll;

using Microsoft.Finance.GeneralLedger.Journal;
using System.IO;
using System.Utilities;

/// <summary>
/// Handles payroll data file import and conversion to General Journal entries.
/// Integrates with Data Exchange Framework for flexible file format support.
/// </summary>
/// <remarks>
/// Supports CSV and TXT file formats. Uses Data Exchange Definitions for parsing and mapping.
/// Extensibility: OnBeforeGetFileName event for custom file selection logic.
/// </remarks>
codeunit 1202 "Import Payroll Transaction"
{
    Permissions = TableData "Data Exch." = rimd;

    trigger OnRun()
    begin
    end;

    var
        FileMgt: Codeunit "File Management";
#pragma warning disable AA0074
        ImportPayrollTransCap: Label 'Select Payroll Transaction';
#pragma warning restore AA0074
        FileFilterTxt: Label 'Text Files(*.txt;*.csv)|*.txt;*.csv';
        FileFilterExtensionTxt: Label 'txt,csv', Locked = true;
        ProcessingSetupErr: Label 'You must specify either a reading/writing XMLport or a reading/writing codeunit.';

    /// <summary>
    /// Prompts user to select a payroll file and imports it to General Journal lines.
    /// </summary>
    /// <param name="GenJournalLine">Target journal line for importing payroll data</param>
    /// <param name="DataExchDefCode">Data exchange definition code for file parsing</param>
    procedure SelectAndImportPayrollDataToGL(var GenJournalLine: Record "Gen. Journal Line"; DataExchDefCode: Code[20])
    var
        TempBlob: Codeunit "Temp Blob";
        FileName: Text;
    begin
        FileName := GetFileName(GenJournalLine, TempBlob, DataExchDefCode);
        if FileName <> '' then
            ImportPayrollDataToGL(GenJournalLine, FileName, TempBlob, DataExchDefCode);
    end;

    local procedure GetFileName(var GenJournalLine: Record "Gen. Journal Line"; var TempBlob: Codeunit "Temp Blob"; DataExchDefCode: Code[20]) FileName: Text
    begin
        OnBeforeGetFileName(GenJournalLine, TempBlob, DataExchDefCode, FileName);

        if FileName = '' then
            FileName := FileMgt.BLOBImportWithFilter(TempBlob, ImportPayrollTransCap, '', FileFilterTxt, FileFilterExtensionTxt);
    end;

    /// <summary>
    /// Imports payroll data from file and creates General Journal entries using Data Exchange Framework.
    /// </summary>
    /// <param name="GenJournalLine">Template journal line for new entries</param>
    /// <param name="FileName">Name of the payroll file being imported</param>
    /// <param name="TempBlob">BLOB containing the file data</param>
    /// <param name="DataExchDefCode">Data exchange definition for parsing</param>
    procedure ImportPayrollDataToGL(GenJournalLine: Record "Gen. Journal Line"; FileName: Text; TempBlob: Codeunit "Temp Blob"; DataExchDefCode: Code[20])
    var
        GenJournalLineTemplate: Record "Gen. Journal Line";
        DataExch: Record "Data Exch.";
        DataExchDef: Record "Data Exch. Def";
    begin
        DataExchDef.Get(DataExchDefCode);
        if (DataExchDef."Reading/Writing XMLport" <> 0) = (DataExchDef."Reading/Writing Codeunit" <> 0) then
            Error(ProcessingSetupErr);

        PrepareGenJournalLine(GenJournalLineTemplate, GenJournalLine);
        CreateDataExch(DataExch, FileName, TempBlob, DataExchDefCode);
        ImportPayrollFile(DataExch);
        MapDataToGenJournalLine(DataExch, GenJournalLineTemplate);
    end;

    local procedure CreateDataExch(var DataExch: Record "Data Exch."; FileName: Text; TempBlob: Codeunit "Temp Blob"; DataExchDefCode: Code[20])
    var
        Source: InStream;
    begin
        TempBlob.CreateInStream(Source);
        DataExch.InsertRec(CopyStr(FileName, 1, MaxStrLen(DataExch."File Name")), Source, DataExchDefCode);
    end;

    local procedure ImportPayrollFile(DataExch: Record "Data Exch.")
    var
        DataExchDef: Record "Data Exch. Def";
        Source: InStream;
    begin
        DataExch."File Content".CreateInStream(Source);
        DataExch.SetRange("Entry No.", DataExch."Entry No.");
        DataExchDef.Get(DataExch."Data Exch. Def Code");
        if DataExchDef."Reading/Writing XMLport" <> 0 then
            XMLPORT.Import(DataExchDef."Reading/Writing XMLport", Source, DataExch)
        else
            if DataExchDef."Reading/Writing Codeunit" <> 0 then
                CODEUNIT.Run(DataExchDef."Reading/Writing Codeunit", DataExch);
    end;

    local procedure MapDataToGenJournalLine(DataExch: Record "Data Exch."; GenJournalLineTemplate: Record "Gen. Journal Line")
    var
        ProcessDataExch: Codeunit "Process Data Exch.";
        RecRef: RecordRef;
    begin
        RecRef.GetTable(GenJournalLineTemplate);
        ProcessDataExch.ProcessAllLinesColumnMapping(DataExch, RecRef);
    end;

    local procedure PrepareGenJournalLine(var GenJournalLineTemplate: Record "Gen. Journal Line"; GenJournalLine: Record "Gen. Journal Line")
    begin
        GenJournalLineTemplate."Journal Template Name" := GenJournalLine."Journal Template Name";
        GenJournalLineTemplate."Journal Batch Name" := GenJournalLine."Journal Batch Name";
        GenJournalLineTemplate.SetUpNewLine(GenJournalLine, GenJournalLine."Balance (LCY)", true);
        GenJournalLineTemplate."Account Type" := GenJournalLineTemplate."Account Type"::"G/L Account";

        GenJournalLine.SetRange("Journal Template Name", GenJournalLine."Journal Template Name");
        GenJournalLine.SetRange("Journal Batch Name", GenJournalLine."Journal Batch Name");
        if GenJournalLine.FindLast() then begin
            GenJournalLineTemplate."Line No." := GenJournalLine."Line No.";
            GenJournalLineTemplate."Document No." := IncStr(GenJournalLine."Document No.");
        end else
            GenJournalLineTemplate."Document No." := GenJournalLine."Document No.";
    end;

    /// <summary>
    /// Allows customization of file selection process for payroll imports.
    /// </summary>
    /// <param name="GenJournalLine">Target journal line context</param>
    /// <param name="TempBlob">BLOB to store selected file data</param>
    /// <param name="DataExchDefCode">Data exchange definition code</param>
    /// <param name="FileName">File name that can be set by subscribers</param>
    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetFileName(var GenJournalLine: Record "Gen. Journal Line"; var TempBlob: Codeunit "Temp Blob"; DataExchDefCode: Code[20]; var FileName: Text)
    begin
    end;
}