diff --git a/build/groups.json b/build/groups.json
index e4b7555d17..45b37ba9bc 100644
--- a/build/groups.json
+++ b/build/groups.json
@@ -7742,6 +7742,50 @@
}
]
},
+ {
+ "name": "XML Audit File",
+ "groups": [
+ {
+ "name": "AllExtensions"
+ },
+ {
+ "name": "Financials"
+ },
+ {
+ "name": "FinancialsExtensions"
+ },
+ {
+ "name": "OnPrem",
+ "doNotInstall": true
+ },
+ {
+ "name": "OnPremExtensions",
+ "doNotInstall": true
+ }
+ ]
+ },
+ {
+ "name": "XML Audit File Tests",
+ "groups": [
+ {
+ "name": "AllExtensions"
+ },
+ {
+ "name": "Financials"
+ },
+ {
+ "name": "FinancialsExtensions"
+ },
+ {
+ "name": "OnPrem",
+ "doNotInstall": true
+ },
+ {
+ "name": "OnPremExtensions",
+ "doNotInstall": true
+ }
+ ]
+ },
{
"name": "Payment Practices",
"groups": [
diff --git a/build/projects.json b/build/projects.json
index 22725f15a6..36dbda4087 100644
--- a/build/projects.json
+++ b/build/projects.json
@@ -5636,6 +5636,32 @@
"ruleSetPathMinorRelease": "$ENV:INETROOT\\App\\Rulesets\\MinorRelease\\app.ruleset.json",
"owningteam": "\\AI Business Solutions\\Finance"
},
+ "XML Audit File": {
+ "projectPath": "$env:INETROOT\\App\\Apps\\FR\\XMLAuditFile\\app",
+ "dvdFolder": "Applications\\XMLAuditFile\\Source",
+ "hasTranslations": true,
+ "supportedCountries": [
+ "FR"
+ ],
+ "runStaticCodeAnalysis": true,
+ "logLevel": "warning",
+ "installOnEnvironmentUpdate": true,
+ "ruleSetPath": "$ENV:INETROOT\\App\\Rulesets\\app.ruleset.json",
+ "ruleSetPathMinorRelease": "$ENV:INETROOT\\App\\Rulesets\\MinorRelease\\app.ruleset.json"
+ },
+ "XML Audit File Tests": {
+ "projectPath": "$env:INETROOT\\App\\Apps\\FR\\XMLAuditFile\\test",
+ "dvdFolder": "Applications\\XMLAuditFile\\Test",
+ "supportedCountries": [
+ "FR"
+ ],
+ "isTest": true,
+ "runStaticCodeAnalysis": true,
+ "logLevel": "warning",
+ "ruleSetPath": "$ENV:INETROOT\\App\\Rulesets\\app.ruleset.json",
+ "ruleSetPathMinorRelease": "$ENV:INETROOT\\App\\Rulesets\\MinorRelease\\app.ruleset.json",
+ "owningteam": "\\AI Business Solutions\\Finance"
+ },
"EU 3-Party Trade Purchase": {
"projectPath": "$env:INETROOT\\App\\Apps\\W1\\EU3PartyTradePurchase\\app",
"dvdFolder": "Applications\\EU3PartyTradePurchase\\Source",
diff --git a/src/Apps/FR/FECAuditFile/app/app.json b/src/Apps/FR/FECAuditFile/app/app.json
index 6192768123..50812021e2 100644
--- a/src/Apps/FR/FECAuditFile/app/app.json
+++ b/src/Apps/FR/FECAuditFile/app/app.json
@@ -26,6 +26,10 @@
{
"from": 10826,
"to": 10832
+ },
+ {
+ "from": 10879,
+ "to": 10879
}
],
"resourceExposurePolicy": {
diff --git a/src/Apps/FR/FECAuditFile/app/src/AuditFileExportFormatFEC.EnumExt.al b/src/Apps/FR/FECAuditFile/app/src/AuditFileExportFormatFEC.EnumExt.al
index 1d9b82b10e..d0fb1de077 100644
--- a/src/Apps/FR/FECAuditFile/app/src/AuditFileExportFormatFEC.EnumExt.al
+++ b/src/Apps/FR/FECAuditFile/app/src/AuditFileExportFormatFEC.EnumExt.al
@@ -10,6 +10,7 @@ enumextension 10826 "Audit File Export Format FEC" extends "Audit File Export Fo
{
Caption = 'FEC';
Implementation = "Audit File Export Data Handling" = "Data Handling FEC",
- "Audit File Export Data Check" = "Data Check FEC";
+ "Audit File Export Data Check" = "Data Check FEC",
+ "Audit File Export Page Visibility" = "Page Visibility FEC";
}
}
diff --git a/src/Apps/FR/FECAuditFile/app/src/ExportEngine/AuditExportDocCardFEC.PageExt.al b/src/Apps/FR/FECAuditFile/app/src/ExportEngine/AuditExportDocCardFEC.PageExt.al
index c241990f8d..4156df565d 100644
--- a/src/Apps/FR/FECAuditFile/app/src/ExportEngine/AuditExportDocCardFEC.PageExt.al
+++ b/src/Apps/FR/FECAuditFile/app/src/ExportEngine/AuditExportDocCardFEC.PageExt.al
@@ -38,87 +38,38 @@ pageextension 10826 "Audit Export Doc. Card FEC" extends "Audit File Export Doc.
}
}
}
-
- modify(GLAccountMappingCode)
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- modify("Header Comment")
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- modify(Contact)
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- modify(ZipFileGeneration)
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- modify(SplitByMonth)
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- modify(SplitByDate)
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- modify(CreateMultipleZipFiles)
+ modify(AuditFileExportFormat)
{
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- modify(LatestDataCheckDateTime)
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- modify(DataCheckStatus)
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
- }
- }
- actions
- {
- modify(DataCheck)
- {
- Enabled = not FECFormat;
- Visible = not FECFormat;
+ trigger OnAfterValidate()
+ begin
+ UpdateFECFormat();
+ CurrPage.Update();
+ end;
}
}
var
FECFormat: Boolean;
- trigger OnOpenPage()
- begin
- FECFormat := IsFECFormat();
- end;
-
trigger OnAfterGetCurrRecord()
begin
- FECFormat := IsFECFormat();
+ UpdateFECFormat();
end;
- local procedure IsFECFormat(): Boolean
+ local procedure UpdateFECFormat()
var
AuditFileExportSetup: Record "Audit File Export Setup";
AuditFileExportFormat: enum "Audit File Export Format";
- IsFECFormatSelected: Boolean;
begin
AuditFileExportFormat := Rec."Audit File Export Format";
- if AuditFileExportFormat = 0 then begin // if not initialized yet
+ if AuditFileExportFormat.AsInteger() = 0 then begin // if not initialized yet
AuditFileExportSetup.Get();
AuditFileExportFormat := AuditFileExportSetup."Audit File Export Format";
end;
- IsFECFormatSelected := AuditFileExportFormat = AuditFileExportFormat::FEC;
- exit(IsFECFormatSelected);
+ if Rec."Audit File Export Format" <> AuditFileExportFormat then begin
+ Rec."Audit File Export Format" := AuditFileExportFormat;
+ Rec.Modify(true);
+ end;
+ FECFormat := AuditFileExportFormat = AuditFileExportFormat::FEC;
end;
}
diff --git a/src/Apps/FR/FECAuditFile/app/src/PageVisibilityFEC.Codeunit.al b/src/Apps/FR/FECAuditFile/app/src/PageVisibilityFEC.Codeunit.al
new file mode 100644
index 0000000000..f4ef1bca78
--- /dev/null
+++ b/src/Apps/FR/FECAuditFile/app/src/PageVisibilityFEC.Codeunit.al
@@ -0,0 +1,27 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+codeunit 10879 "Page Visibility FEC" implements "Audit File Export Page Visibility"
+{
+ Access = Internal;
+ InherentEntitlements = X;
+ InherentPermissions = X;
+
+ procedure GetUIVisibility(var FieldVisibility: Dictionary of [Text, Boolean]; var ActionVisibility: Dictionary of [Text, Boolean])
+ begin
+ // FEC format hides certain fields and actions from the base page
+ FieldVisibility.Set('GLAccountMappingCode', false);
+ FieldVisibility.Set('SplitByMonth', false);
+ FieldVisibility.Set('SplitByDate', false);
+ FieldVisibility.Set('HeaderComment', false);
+ FieldVisibility.Set('Contact', false);
+ FieldVisibility.Set('ZipFileGeneration', false);
+ FieldVisibility.Set('CreateMultipleZipFiles', false);
+ FieldVisibility.Set('LatestDataCheckDateTime', false);
+ FieldVisibility.Set('DataCheckStatus', false);
+ ActionVisibility.Set('DataCheck', false);
+ end;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/app.json b/src/Apps/FR/XMLAuditFile/app/app.json
new file mode 100644
index 0000000000..a9e197caee
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/app.json
@@ -0,0 +1,47 @@
+{
+ "id": "6086ffec-252c-43fd-b862-08c689e208c2",
+ "name": "XML Audit File",
+ "publisher": "Microsoft",
+ "version": "$(app_currentVersion)",
+ "brief": "Export G/L entries to XML via Audit File Export framework.",
+ "description": "XML export for general ledger entries using the Audit File Export framework.",
+ "privacyStatement": "https://go.microsoft.com/fwlink/?LinkId=724009",
+ "EULA": "https://go.microsoft.com/fwlink/?linkid=2009120",
+ "help": "https://learn.microsoft.com/en-us/dynamics365/business-central/localfunctionality/france/how-to-export-general-ledger-entries-for-tax-audits",
+ "contextSensitiveHelpUrl": "https://go.microsoft.com/fwlink/?linkid=2204541",
+ "url": "https://go.microsoft.com/fwlink/?LinkId=724011",
+ "logo": "ExtensionLogo.png",
+ "dependencies": [
+ {
+ "id": "a41b0c3e-bf1c-4c97-ad1b-b430a3933ada",
+ "name": "Audit File Export",
+ "publisher": "Microsoft",
+ "version": "$(app_minimumVersion)"
+ }
+ ],
+ "internalsVisibleTo": [
+ {
+ "id": "86cb76b5-cdd3-4a37-809c-1c41b8bb7cab",
+ "name": "XML Audit File Tests",
+ "publisher": "Microsoft"
+ }
+ ],
+ "screenshots": [],
+ "platform": "$(app_platformVersion)",
+ "application": "$(app_minimumVersion)",
+ "idRanges": [
+ {
+ "from": 10803,
+ "to": 10813
+ }
+ ],
+ "resourceExposurePolicy": {
+ "allowDebugging": false,
+ "allowDownloadingSource": false,
+ "includeSourceInSymbolFile": false
+ },
+ "target": "Cloud",
+ "features": [
+ "TranslationFile"
+ ]
+}
\ No newline at end of file
diff --git a/src/Apps/FR/XMLAuditFile/app/extensionlogo.png b/src/Apps/FR/XMLAuditFile/app/extensionlogo.png
new file mode 100644
index 0000000000..79a3aa399d
Binary files /dev/null and b/src/Apps/FR/XMLAuditFile/app/extensionlogo.png differ
diff --git a/src/Apps/FR/XMLAuditFile/app/src/AuditFileExportFormatXML.EnumExt.al b/src/Apps/FR/XMLAuditFile/app/src/AuditFileExportFormatXML.EnumExt.al
new file mode 100644
index 0000000000..4d4d337e92
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/AuditFileExportFormatXML.EnumExt.al
@@ -0,0 +1,16 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+enumextension 10803 "Audit File Export Format XML" extends "Audit File Export Format"
+{
+ value(10803; "GL Entries XML FR")
+ {
+ Caption = 'GL Entries XML FR';
+ Implementation = "Audit File Export Data Handling" = "Data Handling XML",
+ "Audit File Export Data Check" = "Data Check XML",
+ "Audit File Export Page Visibility" = "Page Visibility XML";
+ }
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/DataCheckXML.Codeunit.al b/src/Apps/FR/XMLAuditFile/app/src/DataCheckXML.Codeunit.al
new file mode 100644
index 0000000000..49d5d8551d
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/DataCheckXML.Codeunit.al
@@ -0,0 +1,36 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using Microsoft.CRM.Contact;
+using Microsoft.Foundation.Company;
+
+codeunit 10805 "Data Check XML" implements "Audit File Export Data Check"
+{
+ Access = Internal;
+ InherentEntitlements = X;
+ InherentPermissions = X;
+
+ procedure CheckDataToExport(var AuditFileExportHeader: Record "Audit File Export Header"): Enum "Audit Data Check Status"
+ var
+ Contact: Record Contact;
+ begin
+ Contact.Get(AuditFileExportHeader.Contact);
+ Contact.TestField(Address);
+ end;
+
+ procedure CheckAuditDocReadyToExport(var AuditFileExportHeader: Record "Audit File Export Header"): Enum "Audit Data Check Status"
+ var
+ CompanyInformation: Record "Company Information";
+ begin
+ AuditFileExportHeader.TestField("Starting Date");
+ AuditFileExportHeader.TestField("Ending Date");
+
+ CompanyInformation.Get();
+ CompanyInformation.TestField("Registration No.");
+
+ exit("Audit Data Check Status"::Passed);
+ end;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/DataHandlingXML.Codeunit.al b/src/Apps/FR/XMLAuditFile/app/src/DataHandlingXML.Codeunit.al
new file mode 100644
index 0000000000..b65a5ad450
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/DataHandlingXML.Codeunit.al
@@ -0,0 +1,49 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using System.Utilities;
+
+codeunit 10806 "Data Handling XML" implements "Audit File Export Data Handling"
+{
+ Access = Internal;
+ InherentEntitlements = X;
+ InherentPermissions = X;
+
+ var
+ GLEntriesXMLLbl: Label 'G/L Entries XML';
+
+ procedure GenerateFileContentForAuditFileExportLine(var AuditFileExportLine: Record "Audit File Export Line"; var TempBlob: Codeunit "Temp Blob")
+ var
+ GenerateFileXML: Codeunit "Generate File XML";
+ begin
+ GenerateFileXML.GenerateXMLFile(AuditFileExportLine, TempBlob);
+ end;
+
+ procedure LoadStandardAccounts(StandardAccountType: Enum "Standard Account Type") Result: Boolean;
+ begin
+ end;
+
+ procedure CreateAuditFileExportLines(var Header: Record "Audit File Export Header")
+ var
+ AuditFileExportLine: Record "Audit File Export Line";
+ AuditFileExportMgt: Codeunit "Audit File Export Mgt.";
+ LineNo: Integer;
+ begin
+ AuditFileExportLine.SetRange(ID, Header.ID);
+ AuditFileExportLine.DeleteAll(true);
+
+ AuditFileExportMgt.InsertAuditFileExportLine(AuditFileExportLine, LineNo, Header.ID, "Audit File Export Data Class"::Custom, GLEntriesXMLLbl, Header."Starting Date", Header."Ending Date");
+ end;
+
+ procedure GetFileNameForAuditFileExportLine(var AuditFileExportLine: Record "Audit File Export Line"): Text[1024]
+ begin
+ exit('GLEntries_' + Format(AuditFileExportLine."Ending Date") + '.xml');
+ end;
+
+ procedure InitAuditExportDataTypeSetup();
+ begin
+ end;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/AuditExportDocCardXML.PageExt.al b/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/AuditExportDocCardXML.PageExt.al
new file mode 100644
index 0000000000..848c78eb98
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/AuditExportDocCardXML.PageExt.al
@@ -0,0 +1,41 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+pageextension 10803 "Audit Export Doc. Card XML" extends "Audit File Export Doc. Card"
+{
+ layout
+ {
+ modify(AuditFileExportFormat)
+ {
+ trigger OnAfterValidate()
+ begin
+ UpdateXMLFormat();
+ CurrPage.Update();
+ end;
+ }
+ }
+
+ trigger OnAfterGetCurrRecord()
+ begin
+ UpdateXMLFormat();
+ end;
+
+ local procedure UpdateXMLFormat()
+ var
+ AuditFileExportSetup: Record "Audit File Export Setup";
+ AuditFileExportFormat: Enum "Audit File Export Format";
+ begin
+ AuditFileExportFormat := Rec."Audit File Export Format";
+ if AuditFileExportFormat.AsInteger() = 0 then begin // if not initialized yet
+ AuditFileExportSetup.Get();
+ AuditFileExportFormat := AuditFileExportSetup."Audit File Export Format";
+ end;
+ if Rec."Audit File Export Format" <> AuditFileExportFormat then begin
+ Rec."Audit File Export Format" := AuditFileExportFormat;
+ Rec.Modify(true);
+ end;
+ end;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/AuditFileExportHeaderXML.TableExt.al b/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/AuditFileExportHeaderXML.TableExt.al
new file mode 100644
index 0000000000..713bbd5c2b
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/AuditFileExportHeaderXML.TableExt.al
@@ -0,0 +1,42 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using System.Telemetry;
+
+tableextension 10803 "Audit File Export Header XML" extends "Audit File Export Header"
+{
+ fields
+ {
+ modify("Audit File Export Format")
+ {
+ trigger OnBeforeValidate()
+ var
+ AuditFileExportFormatSetup: Record "Audit File Export Format Setup";
+ begin
+ if Rec."Audit File Export Format" = Rec."Audit File Export Format"::"GL Entries XML FR" then
+ if not AuditFileExportFormatSetup.Get(Rec."Audit File Export Format"::"GL Entries XML FR") then
+ Error(AuditExportFormatSetupNotExistErr);
+ end;
+
+ trigger OnAfterValidate()
+ var
+ FeatureTelemetry: Codeunit "Feature Telemetry";
+ begin
+ if Rec."Audit File Export Format" = Rec."Audit File Export Format"::"GL Entries XML FR" then begin
+ Rec.Validate("Split By Month", false);
+ Rec.Validate("Split By Date", false);
+ Rec.Validate("Create Multiple Zip Files", false);
+
+ FeatureTelemetry.LogUptake('0000QPG', XMLAuditFileTok, Enum::"Feature Uptake Status"::Discovered);
+ end;
+ end;
+ }
+ }
+
+ var
+ AuditExportFormatSetupNotExistErr: Label 'XML export format setup not found. Reinstall extension or add XML format in Audit File Export Format setup.';
+ XMLAuditFileTok: label 'XML Audit File', Locked = true;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/GenerateFileXML.Codeunit.al b/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/GenerateFileXML.Codeunit.al
new file mode 100644
index 0000000000..0d8c4666e0
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/ExportEngine/GenerateFileXML.Codeunit.al
@@ -0,0 +1,80 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using Microsoft.Finance.GeneralLedger.Account;
+using Microsoft.Finance.GeneralLedger.Ledger;
+using System.Telemetry;
+using System.Utilities;
+
+codeunit 10811 "Generate File XML"
+{
+ Access = Internal;
+ InherentEntitlements = X;
+ InherentPermissions = X;
+
+ var
+ StartingDate: Date;
+ EndingDate: Date;
+ ProgressDialog: Dialog;
+ FRGeneralLedgerXMLTok: Label 'FR Export General Ledger Entries to XML File', Locked = true;
+ FRGLXMLFrameworkTok: Label 'FR General Ledger Entries XML generated via Audit File Export Framework';
+ NoEntriesToExportErr: Label 'There are no entries to export within the defined filter. The file was not created.';
+ CreateFileTxt: label 'Creating FEC audit file\';
+ ProcessTransactionsTxt: label 'Processing transactions: #1###', Comment = '#1 - percent of processed G/L Entries';
+
+ procedure GenerateXMLFile(AuditFileExportLine: Record "Audit File Export Line"; var TempBlob: Codeunit "Temp Blob")
+ var
+ AuditFileExportHeader: Record "Audit File Export Header";
+ GLEntry: Record "G/L Entry";
+ FeatureTelemetry: Codeunit "Feature Telemetry";
+ ExportGLEntries: XmlPort "Export G/L Entries FR";
+ OutStream: OutStream;
+ begin
+ AuditFileExportHeader.Get(AuditFileExportLine.ID);
+ CheckGLEntriesExist(AuditFileExportHeader);
+ InitGlobalVariables(AuditFileExportHeader);
+
+ OpenProgressDialog(CreateFileTxt + ProcessTransactionsTxt);
+
+ TempBlob.CreateOutStream(OutStream);
+ GLEntry.SetCurrentKey("Posting Date", "G/L Account No.", "Dimension Set ID");
+ GLEntry.SetRange("Posting Date", StartingDate, EndingDate);
+ ExportGLEntries.InitializeRequest(GLEntry, StartingDate, EndingDate);
+ ExportGLEntries.SetDestination(OutStream);
+ ExportGLEntries.Export();
+
+ FeatureTelemetry.LogUptake('0000QPP', FRGeneralLedgerXMLTok, Enum::"Feature Uptake Status"::"Used");
+ FeatureTelemetry.LogUsage('0000QPQ', FRGeneralLedgerXMLTok, FRGLXMLFrameworkTok);
+ end;
+
+ local procedure CheckGLEntriesExist(AuditFileExportHeader: Record "Audit File Export Header")
+ var
+ GLEntry: Record "G/L Entry";
+ GLAccount: Record "G/L Account";
+ GLAccNoFilter: Text;
+ begin
+ if GLAccount.GetFilter("No.") <> '' then
+ GLAccNoFilter := GLAccount.GetFilter("No.");
+
+ GLEntry.SetCurrentKey("Posting Date", "G/L Account No.", "Dimension Set ID");
+ GLEntry.SetRange("Posting Date", AuditFileExportHeader."Starting Date", AuditFileExportHeader."Ending Date");
+ GLEntry.SetFilter("G/L Account No.", GLAccNoFilter);
+ if GLEntry.IsEmpty() then
+ Error(NoEntriesToExportErr);
+ end;
+
+ local procedure OpenProgressDialog(DialogContent: Text)
+ begin
+ if GuiAllowed() then
+ ProgressDialog.Open(DialogContent);
+ end;
+
+ procedure InitGlobalVariables(AuditFileExportHeader: Record "Audit File Export Header")
+ begin
+ StartingDate := AuditFileExportHeader."Starting Date";
+ EndingDate := AuditFileExportHeader."Ending Date";
+ end;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/ExportGLEntriesFR.XmlPort.al b/src/Apps/FR/XMLAuditFile/app/src/ExportGLEntriesFR.XmlPort.al
new file mode 100644
index 0000000000..b015ce2a9d
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/ExportGLEntriesFR.XmlPort.al
@@ -0,0 +1,209 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using Microsoft.Finance.GeneralLedger.Ledger;
+
+xmlport 10803 "Export G/L Entries FR"
+{
+ Caption = 'Export G/L Entries';
+
+ schema
+ {
+ textelement(FichierAudit)
+ {
+ textelement(FiltreDate)
+ {
+ textelement(StartingDate)
+ {
+ XmlName = 'DateDébut';
+ }
+ textelement(EndingDate)
+ {
+ XmlName = 'DateFin';
+ }
+ }
+ tableelement("g/l entry"; "G/L Entry")
+ {
+ XmlName = 'EcritureComptable';
+ fieldelement("NoSéquence"; "G/L Entry"."Entry No.")
+ {
+ }
+ fieldelement("NoCpteGénéral"; "G/L Entry"."G/L Account No.")
+ {
+ }
+ fieldelement(DateComptabilisation; "G/L Entry"."Posting Date")
+ {
+ }
+ fieldelement(TypeDocument; "G/L Entry"."Document Type")
+ {
+ }
+ fieldelement(NoDocument; "G/L Entry"."Document No.")
+ {
+ }
+ fieldelement("Désignation"; "G/L Entry".Description)
+ {
+ }
+ fieldelement(NoCpteContrepartie; "G/L Entry"."Bal. Account No.")
+ {
+ }
+ fieldelement(Montant; "G/L Entry".Amount)
+ {
+ }
+ fieldelement(CodeAxePrincipale1; "G/L Entry"."Global Dimension 1 Code")
+ {
+ }
+ fieldelement(CodeAxePrincipale2; "G/L Entry"."Global Dimension 2 Code")
+ {
+ }
+ fieldelement(CodeUtilisateur; "G/L Entry"."User ID")
+ {
+ }
+ fieldelement(CodeJournal; "G/L Entry"."Source Code")
+ {
+ }
+ fieldelement(EcritureSysteme; "G/L Entry"."System-Created Entry")
+ {
+ }
+ fieldelement("EcritureExercicePrécédent"; "G/L Entry"."Prior-Year Entry")
+ {
+ }
+ fieldelement(NoProjet; "G/L Entry"."Job No.")
+ {
+ }
+ fieldelement("Quantité"; "G/L Entry".Quantity)
+ {
+ }
+ fieldelement(MontantTVA; "G/L Entry"."VAT Amount")
+ {
+ }
+ fieldelement(CodeCentreDeProfit; "G/L Entry"."Business Unit Code")
+ {
+ }
+ fieldelement(NomFeuille; "G/L Entry"."Journal Batch Name")
+ {
+ }
+ fieldelement(CodeMotif; "G/L Entry"."Reason Code")
+ {
+ }
+ fieldelement(TypeComptaTVA; "G/L Entry"."Gen. Posting Type")
+ {
+ }
+ fieldelement("GroupeComptaMarché"; "G/L Entry"."Gen. Bus. Posting Group")
+ {
+ }
+ fieldelement(GroupeComptaProduit; "G/L Entry"."Gen. Prod. Posting Group")
+ {
+ }
+ fieldelement(TypeCpteContrepartie; "G/L Entry"."Bal. Account Type")
+ {
+ }
+ fieldelement(NoTransaction; "G/L Entry"."Transaction No.")
+ {
+ }
+ fieldelement("MontantDébit"; "G/L Entry"."Debit Amount")
+ {
+ }
+ fieldelement("MontantCrédit"; "G/L Entry"."Credit Amount")
+ {
+ }
+ fieldelement(DateDocument; "G/L Entry"."Document Date")
+ {
+ }
+ fieldelement(NoDocExterne; "G/L Entry"."External Document No.")
+ {
+ }
+ fieldelement(TypeOrigine; "G/L Entry"."Source Type")
+ {
+ }
+ fieldelement(NoOrigine; "G/L Entry"."Source No.")
+ {
+ }
+ fieldelement("GroupeComptaMarchéTVA"; "G/L Entry"."VAT Bus. Posting Group")
+ {
+ }
+ fieldelement(GroupeComptaProduitTVA; "G/L Entry"."VAT Prod. Posting Group")
+ {
+ }
+ fieldelement("Contre-passé"; "G/L Entry".Reversed)
+ {
+ }
+ fieldelement("Contre-passéParNoEcriture"; "G/L Entry"."Reversed by Entry No.")
+ {
+ }
+ fieldelement("NoEcritureContre-passée"; "G/L Entry"."Reversed Entry No.")
+ {
+ }
+ fieldelement(IDLettrage; "G/L Entry"."Applies-to ID")
+ {
+ }
+ fieldelement(Lettre; "G/L Entry".Letter)
+ {
+ }
+ fieldelement(DateLettre; "G/L Entry"."Letter Date")
+ {
+ }
+
+ trigger OnAfterGetRecord()
+ begin
+ if not GuiAllowed() then
+ exit;
+
+ CurrentCount += 1;
+ if ((CurrentCount * 10) mod TotalCount = 0) then begin
+ Window.Update(1, "G/L Entry"."Entry No.");
+ Window.Update(2, "G/L Entry"."Posting Date");
+ end;
+ end;
+ }
+ }
+ }
+
+ requestpage
+ {
+
+ layout
+ {
+ }
+
+ actions
+ {
+ }
+ }
+
+ trigger OnPostXmlPort()
+ begin
+ Window.Close();
+ end;
+
+ trigger OnPreXmlPort()
+ begin
+ Window.Open(
+ Text001Lbl +
+ Text002Lbl +
+ Text003Lbl);
+
+ if GuiAllowed() then begin
+ CurrentCount := 0;
+ TotalCount := "g/l entry".Count;
+ end;
+ end;
+
+ var
+ Text001Lbl: Label 'Exporting G/L Entries to XML File...\\';
+ Text002Lbl: Label 'Entry No. #1######\', Comment = '%1 = Value';
+ Text003Lbl: Label 'Posting Date #2######', Comment = '%2 = Date';
+ Window: Dialog;
+ CurrentCount: Integer;
+ TotalCount: Integer;
+
+ procedure InitializeRequest(var GLEntry: Record "G/L Entry"; StartDate: Date; EndDate: Date)
+ begin
+ "G/L Entry".CopyFilters(GLEntry);
+ StartingDate := Format(StartDate);
+ EndingDate := Format(EndDate);
+ end;
+}
+
diff --git a/src/Apps/FR/XMLAuditFile/app/src/PageVisibilityXML.Codeunit.al b/src/Apps/FR/XMLAuditFile/app/src/PageVisibilityXML.Codeunit.al
new file mode 100644
index 0000000000..7d1f85e0c0
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/PageVisibilityXML.Codeunit.al
@@ -0,0 +1,27 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+codeunit 10813 "Page Visibility XML" implements "Audit File Export Page Visibility"
+{
+ Access = Internal;
+ InherentEntitlements = X;
+ InherentPermissions = X;
+
+ procedure GetUIVisibility(var FieldVisibility: Dictionary of [Text, Boolean]; var ActionVisibility: Dictionary of [Text, Boolean])
+ begin
+ // XML format hides certain fields and actions from the base page
+ FieldVisibility.Set('GLAccountMappingCode', false);
+ FieldVisibility.Set('SplitByMonth', false);
+ FieldVisibility.Set('SplitByDate', false);
+ FieldVisibility.Set('HeaderComment', false);
+ FieldVisibility.Set('Contact', false);
+ FieldVisibility.Set('ZipFileGeneration', false);
+ FieldVisibility.Set('CreateMultipleZipFiles', false);
+ FieldVisibility.Set('LatestDataCheckDateTime', false);
+ FieldVisibility.Set('DataCheckStatus', false);
+ ActionVisibility.Set('DataCheck', false);
+ end;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365BasicISVXML.PermissionSetExt.al b/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365BasicISVXML.PermissionSetExt.al
new file mode 100644
index 0000000000..8c6ec45aa5
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365BasicISVXML.PermissionSetExt.al
@@ -0,0 +1,12 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using System.Security.AccessControl;
+
+permissionsetextension 10803 "D365 BASIC ISV - XML" extends "D365 BASIC ISV"
+{
+ IncludedPermissionSets = "XML - Objects";
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365BasicXML.PermissionSetExt.al b/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365BasicXML.PermissionSetExt.al
new file mode 100644
index 0000000000..2c9eda2175
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365BasicXML.PermissionSetExt.al
@@ -0,0 +1,12 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using System.Security.AccessControl;
+
+permissionsetextension 10804 "D365 BASIC - XML" extends "D365 BASIC"
+{
+ IncludedPermissionSets = "XML - Objects";
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365ReadXML.PermissionSetExt.al b/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365ReadXML.PermissionSetExt.al
new file mode 100644
index 0000000000..a858d0a30b
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365ReadXML.PermissionSetExt.al
@@ -0,0 +1,12 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using System.Security.AccessControl;
+
+permissionsetextension 10805 "D365 READ - XML" extends "D365 READ"
+{
+ IncludedPermissionSets = "XML - Objects";
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365TeamMemberXML.PermissionSetExt.al b/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365TeamMemberXML.PermissionSetExt.al
new file mode 100644
index 0000000000..463add5375
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Permissions/D365TeamMemberXML.PermissionSetExt.al
@@ -0,0 +1,12 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using System.Security.AccessControl;
+
+permissionsetextension 10806 "D365 TEAM MEMBER - XML" extends "D365 TEAM MEMBER"
+{
+ IncludedPermissionSets = "XML - Objects";
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Permissions/IntelligentCloudXML.PermissionSetExt.al b/src/Apps/FR/XMLAuditFile/app/src/Permissions/IntelligentCloudXML.PermissionSetExt.al
new file mode 100644
index 0000000000..f2b754537c
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Permissions/IntelligentCloudXML.PermissionSetExt.al
@@ -0,0 +1,12 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using System.Security.AccessControl;
+
+permissionsetextension 10808 "INTELLIGENT CLOUD - XML" extends "INTELLIGENT CLOUD"
+{
+ IncludedPermissionSets = "XML - Objects";
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Permissions/LocalXML.PermissionSetExt.al b/src/Apps/FR/XMLAuditFile/app/src/Permissions/LocalXML.PermissionSetExt.al
new file mode 100644
index 0000000000..49ff8bbaf9
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Permissions/LocalXML.PermissionSetExt.al
@@ -0,0 +1,12 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using System.Security.AccessControl;
+
+permissionsetextension 10809 "LOCAL - XML" extends LOCAL
+{
+ IncludedPermissionSets = "XML - Objects";
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Permissions/XMLObjects.PermissionSet.al b/src/Apps/FR/XMLAuditFile/app/src/Permissions/XMLObjects.PermissionSet.al
new file mode 100644
index 0000000000..d12c263997
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Permissions/XMLObjects.PermissionSet.al
@@ -0,0 +1,13 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+permissionset 10807 "XML - Objects"
+{
+ Access = Public;
+ Assignable = false;
+
+ Permissions = codeunit "Install XML" = X;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Setup/AuditExportFormatSetupXML.PageExt.al b/src/Apps/FR/XMLAuditFile/app/src/Setup/AuditExportFormatSetupXML.PageExt.al
new file mode 100644
index 0000000000..7cbeddd5f7
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Setup/AuditExportFormatSetupXML.PageExt.al
@@ -0,0 +1,17 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+pageextension 10804 "Audit Export Format Setup XML" extends "Audit File Export Format Setup"
+{
+ actions
+ {
+ modify(SelectExportDataTypes)
+ {
+ Enabled = false;
+ Visible = false;
+ }
+ }
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Setup/AuditFileExportSetupXML.PageExt.al b/src/Apps/FR/XMLAuditFile/app/src/Setup/AuditFileExportSetupXML.PageExt.al
new file mode 100644
index 0000000000..e0d71909d0
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Setup/AuditFileExportSetupXML.PageExt.al
@@ -0,0 +1,32 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+pageextension 10805 "Audit File Export Setup XML" extends "Audit File Export Setup"
+{
+ layout
+ {
+ modify("Data Quality")
+ {
+ Enabled = not XMLFormat;
+ Visible = not XMLFormat;
+ }
+ }
+
+ var
+ XMLFormat: Boolean;
+
+ trigger OnOpenPage()
+ begin
+ XMLFormat := IsXMLFormat();
+ end;
+
+ local procedure IsXMLFormat(): Boolean
+ var
+ AuditFileExportFormat: Enum "Audit File Export Format";
+ begin
+ exit(Rec."Audit File Export Format" = AuditFileExportFormat::"GL Entries XML FR");
+ end;
+}
diff --git a/src/Apps/FR/XMLAuditFile/app/src/Setup/InstallXML.Codeunit.al b/src/Apps/FR/XMLAuditFile/app/src/Setup/InstallXML.Codeunit.al
new file mode 100644
index 0000000000..f28d57c7f3
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/app/src/Setup/InstallXML.Codeunit.al
@@ -0,0 +1,25 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+codeunit 10804 "Install XML"
+{
+ Subtype = Install;
+
+ trigger OnInstallAppPerCompany()
+ var
+ AuditFileExportSetup: Record "Audit File Export Setup";
+ AuditFileExportFormatSetup: Record "Audit File Export Format Setup";
+ AuditFileExportFormat: Enum "Audit File Export Format";
+ AppInfo: ModuleInfo;
+ begin
+ NavApp.GetCurrentModuleInfo(AppInfo);
+ if (AppInfo.DataVersion() <> Version.Create('0.0.0.0')) then
+ exit;
+
+ AuditFileExportSetup.InitSetup(AuditFileExportFormat::"GL Entries XML FR");
+ AuditFileExportFormatSetup.InitSetup(AuditFileExportFormat::"GL Entries XML FR", '', false);
+ end;
+}
diff --git a/src/Apps/FR/XMLAuditFile/test/app.json b/src/Apps/FR/XMLAuditFile/test/app.json
new file mode 100644
index 0000000000..3fc3634f5b
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/test/app.json
@@ -0,0 +1,59 @@
+{
+ "id": "86cb76b5-cdd3-4a37-809c-1c41b8bb7cab",
+ "name": "XML Audit File Tests",
+ "publisher": "Microsoft",
+ "version": "$(app_currentVersion)",
+ "brief": "Tests for the XML Audit File extension.",
+ "description": "Tests for the XML Audit File extension.",
+ "privacyStatement": "https://go.microsoft.com/fwlink/?LinkId=724009",
+ "EULA": "https://go.microsoft.com/fwlink/?linkid=2009120",
+ "help": "https://learn.microsoft.com/en-us/dynamics365/business-central/localfunctionality/france/how-to-export-general-ledger-entries-for-tax-audits",
+ "contextSensitiveHelpUrl": "https://go.microsoft.com/fwlink/?linkid=2204541",
+ "url": "https://go.microsoft.com/fwlink/?LinkId=724011",
+ "logo": "ExtensionLogo.png",
+ "dependencies": [
+ {
+ "id": "5d86850b-0d76-4eca-bd7b-951ad998e997",
+ "name": "Tests-TestLibraries",
+ "publisher": "Microsoft",
+ "version": "$(app_minimumVersion)"
+ },
+ {
+ "id": "5095f467-0a01-4b99-99d1-9ff1237d286f",
+ "publisher": "Microsoft",
+ "name": "Library Variable Storage",
+ "version": "$(app_minimumVersion)"
+ },
+ {
+ "id": "6086ffec-252c-43fd-b862-08c689e208c2",
+ "publisher": "Microsoft",
+ "name": "XML Audit File",
+ "version": "$(app_minimumVersion)"
+ },
+ {
+ "id": "a41b0c3e-bf1c-4c97-ad1b-b430a3933ada",
+ "name": "Audit File Export",
+ "publisher": "Microsoft",
+ "version": "$(app_minimumVersion)"
+ }
+ ],
+ "screenshots": [],
+ "platform": "$(app_platformVersion)",
+ "application": "$(app_minimumVersion)",
+ "idRanges": [
+ {
+ "from": 148006,
+ "to": 148007
+ }
+ ],
+ "resourceExposurePolicy": {
+ "allowDebugging": true,
+ "allowDownloadingSource": true,
+ "includeSourceInSymbolFile": true
+ },
+ "features": [
+ "NoImplicitWith",
+ "TranslationFile"
+ ],
+ "target": "Cloud"
+}
\ No newline at end of file
diff --git a/src/Apps/FR/XMLAuditFile/test/extensionlogo.png b/src/Apps/FR/XMLAuditFile/test/extensionlogo.png
new file mode 100644
index 0000000000..79a3aa399d
Binary files /dev/null and b/src/Apps/FR/XMLAuditFile/test/extensionlogo.png differ
diff --git a/src/Apps/FR/XMLAuditFile/test/src/UTREPExportGLFR.Codeunit.al b/src/Apps/FR/XMLAuditFile/test/src/UTREPExportGLFR.Codeunit.al
new file mode 100644
index 0000000000..71864aa384
--- /dev/null
+++ b/src/Apps/FR/XMLAuditFile/test/src/UTREPExportGLFR.Codeunit.al
@@ -0,0 +1,148 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+using Microsoft.Finance.GeneralLedger.Account;
+using Microsoft.Finance.GeneralLedger.Ledger;
+using Microsoft.Foundation.Company;
+using Microsoft.Utilities;
+
+codeunit 148006 "UT REP Export G/L FR"
+{
+ Subtype = Test;
+ TestType = IntegrationTest;
+ TestPermissions = Disabled;
+
+ var
+ Assert: Codeunit Assert;
+ LibrarySetupStorage: Codeunit "Library - Setup Storage";
+ IsInitialized: Boolean;
+ NoEntriesToExportErr: Label 'There are no entries to export within the defined filter. The file was not created.';
+
+ [Test]
+ procedure MissingStartingDateErrTest()
+ var
+ AuditFileExportHeader: Record "Audit File Export Header";
+ EndingDate: Date;
+ begin
+ Initialize();
+ EndingDate := GetStartingDate();
+ asserterror RunXMLExport('', 0D, EndingDate);
+ Assert.ExpectedTestFieldError(AuditFileExportHeader.FieldCaption("Starting Date"), '');
+ end;
+
+ [Test]
+ procedure MissingEndingDateErrTest()
+ var
+ AuditFileExportHeader: Record "Audit File Export Header";
+ StartingDate: Date;
+ begin
+ Initialize();
+ StartingDate := GetStartingDate();
+ asserterror RunXMLExport('', StartingDate, 0D);
+ Assert.ExpectedTestFieldError(AuditFileExportHeader.FieldCaption("Ending Date"), '');
+ end;
+
+
+ [Test]
+ [HandlerFunctions('ConfirmHandlerYes')]
+ procedure NoEntriesToExportError()
+ var
+ CompanyInformation: Record "Company Information";
+ LibraryRandom: Codeunit "Library - Random";
+ AuditFileExportHeaderID: Integer;
+ StartingDate: Date;
+ begin
+ Initialize();
+ StartingDate := GetStartingDate();
+ CompanyInformation.Get();
+ CompanyInformation.Validate("Registration No.", Format(LibraryRandom.RandIntInRange(100000000, 999999999)));
+ CompanyInformation.Modify();
+ AuditFileExportHeaderID := RunXMLExport('', StartingDate, StartingDate);
+ VerifyError(AuditFileExportHeaderID, NoEntriesToExportErr);
+ end;
+
+ local procedure Initialize()
+ begin
+ LibrarySetupStorage.Restore();
+
+ if IsInitialized then
+ exit;
+
+ SetupXML();
+ LibrarySetupStorage.Save(Database::"Company Information");
+ Commit();
+
+ IsInitialized := true;
+ end;
+
+ procedure SetupXML()
+ var
+ AuditFileExportSetup: Record "Audit File Export Setup";
+ AuditFileExportFormatSetup: Record "Audit File Export Format Setup";
+ begin
+ AuditFileExportSetup.InitSetup("Audit File Export Format"::"GL Entries XML FR");
+ AuditFileExportFormatSetup.InitSetup("Audit File Export Format"::"GL Entries XML FR", '', false);
+ end;
+
+ local procedure GetStartingDate(): Date
+ var
+ GLEntry: Record "G/L Entry";
+ StartingDate: Date;
+ begin
+ StartingDate := WorkDate();
+ repeat
+ StartingDate := CalcDate('<+1D>', StartingDate);
+ GLEntry.SetRange("Posting Date", StartingDate);
+ until not GLEntry.FindFirst();
+ exit(StartingDate);
+ end;
+
+ procedure CreateAuditFileExportDoc(var AuditFileExportHeader: Record "Audit File Export Header"; StartingDate: Date; EndingDate: Date)
+ begin
+ AuditFileExportHeader.Init();
+ AuditFileExportHeader.Validate("Audit File Export Format", "Audit File Export Format"::"GL Entries XML FR");
+ AuditFileExportHeader.Validate("Starting Date", StartingDate);
+ AuditFileExportHeader.Validate("Ending Date", EndingDate);
+ AuditFileExportHeader.Validate("Parallel Processing", false);
+ AuditFileExportHeader.Insert(true);
+ end;
+
+ local procedure RunXMLExport(GLAccountNoFilter: Text; StartDate: Date; EndDate: Date) AuditFileExportHeaderID: Integer
+ var
+ AuditFileExportHeader: Record "Audit File Export Header";
+ GLAccount: Record "G/L Account";
+ AuditFileExportMgt: Codeunit "Audit File Export Mgt.";
+ begin
+ GLAccount.SetFilter("No.", GLAccountNoFilter);
+ CreateAuditFileExportDoc(
+ AuditFileExportHeader, StartDate, EndDate);
+ AuditFileExportMgt.StartExport(AuditFileExportHeader);
+ AuditFileExportHeaderID := AuditFileExportHeader.ID;
+ end;
+
+ local procedure VerifyError(AuditFileExportHeaderID: Integer; ExpectedError: Text)
+ var
+ AuditFileExportLine: Record "Audit File Export Line";
+ ActivityLog: Record "Activity Log";
+ ErrorTextInStream: InStream;
+ ErrorText: Text;
+ begin
+ AuditFileExportLine.SetRange(ID, AuditFileExportHeaderID);
+ AuditFileExportLine.FindFirst();
+ ActivityLog.SetRange("Record ID", AuditFileExportLine.RecordId());
+ ActivityLog.FindLast();
+ ActivityLog.CalcFields("Detailed Info");
+ ActivityLog."Detailed Info".CreateInStream(ErrorTextInStream);
+ ErrorTextInStream.ReadText(ErrorText);
+ Assert.AreEqual(ExpectedError, ErrorText, '');
+ end;
+
+ [ConfirmHandler]
+ procedure ConfirmHandlerYes(Question: Text[1024]; var Reply: Boolean)
+ begin
+ Reply := true;
+ end;
+}
\ No newline at end of file
diff --git a/src/Apps/W1/AuditFileExport/app/app.json b/src/Apps/W1/AuditFileExport/app/app.json
index 33e67cc337..e484db1a56 100644
--- a/src/Apps/W1/AuditFileExport/app/app.json
+++ b/src/Apps/W1/AuditFileExport/app/app.json
@@ -19,6 +19,10 @@
{
"from": 5260,
"to": 5279
+ },
+ {
+ "from": 5310,
+ "to": 5310
}
],
"resourceExposurePolicy": {
diff --git a/src/Apps/W1/AuditFileExport/app/src/AuditFileExportFormat.Enum.al b/src/Apps/W1/AuditFileExport/app/src/AuditFileExportFormat.Enum.al
index 04b78ffe18..041387de06 100644
--- a/src/Apps/W1/AuditFileExport/app/src/AuditFileExportFormat.Enum.al
+++ b/src/Apps/W1/AuditFileExport/app/src/AuditFileExportFormat.Enum.al
@@ -4,14 +4,18 @@
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Finance.AuditFileExport;
-enum 5262 "Audit File Export Format" implements "Audit File Export Data Handling", "Audit File Export Data Check"
+enum 5262 "Audit File Export Format" implements "Audit File Export Data Handling", "Audit File Export Data Check", "Audit File Export Page Visibility"
{
Extensible = true;
+ DefaultImplementation = "Audit File Export Data Handling" = "Audit File Data Handling",
+ "Audit File Export Data Check" = "Audit File Data Check",
+ "Audit File Export Page Visibility" = "Audit File Page Visibility";
value(0; None)
{
Caption = 'None';
Implementation = "Audit File Export Data Handling" = "Audit File Data Handling",
- "Audit File Export Data Check" = "Audit File Data Check";
+ "Audit File Export Data Check" = "Audit File Data Check",
+ "Audit File Export Page Visibility" = "Audit File Page Visibility";
}
}
diff --git a/src/Apps/W1/AuditFileExport/app/src/AuditFileExportPageVisibility.Interface.al b/src/Apps/W1/AuditFileExport/app/src/AuditFileExportPageVisibility.Interface.al
new file mode 100644
index 0000000000..5c16c7ff11
--- /dev/null
+++ b/src/Apps/W1/AuditFileExport/app/src/AuditFileExportPageVisibility.Interface.al
@@ -0,0 +1,17 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+interface "Audit File Export Page Visibility"
+{
+ ///
+ /// Allows implementations to modify the visibility of fields and actions on the Audit File Export Doc. Card page.
+ /// The page initializes all visibility to true before calling this method.
+ /// Implementations can selectively hide elements by setting dictionary values to false.
+ ///
+ /// Dictionary with field control names as keys and visibility state as values.
+ /// Dictionary with action control names as keys and visibility state as values.
+ procedure GetUIVisibility(var FieldVisibility: Dictionary of [Text, Boolean]; var ActionVisibility: Dictionary of [Text, Boolean])
+}
diff --git a/src/Apps/W1/AuditFileExport/app/src/AuditFilePageVisibility.Codeunit.al b/src/Apps/W1/AuditFileExport/app/src/AuditFilePageVisibility.Codeunit.al
new file mode 100644
index 0000000000..e1149add91
--- /dev/null
+++ b/src/Apps/W1/AuditFileExport/app/src/AuditFilePageVisibility.Codeunit.al
@@ -0,0 +1,19 @@
+// ------------------------------------------------------------------------------------------------
+// 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.AuditFileExport;
+
+codeunit 5310 "Audit File Page Visibility" implements "Audit File Export Page Visibility"
+{
+ Access = Internal;
+ InherentEntitlements = X;
+ InherentPermissions = X;
+
+ procedure GetUIVisibility(var FieldVisibility: Dictionary of [Text, Boolean]; var ActionVisibility: Dictionary of [Text, Boolean])
+ begin
+ // Default implementation: no-op
+ // All fields and actions are pre-initialized to visible (true) by the page,
+ // so the default format keeps everything visible.
+ end;
+}
diff --git a/src/Apps/W1/AuditFileExport/app/src/ExportEngine/AuditFileExportDocCard.Page.al b/src/Apps/W1/AuditFileExport/app/src/ExportEngine/AuditFileExportDocCard.Page.al
index 24ce42c614..206167f0e9 100644
--- a/src/Apps/W1/AuditFileExport/app/src/ExportEngine/AuditFileExportDocCard.Page.al
+++ b/src/Apps/W1/AuditFileExport/app/src/ExportEngine/AuditFileExportDocCard.Page.al
@@ -30,6 +30,7 @@ page 5267 "Audit File Export Doc. Card"
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies the G/L account mapping code that represents the reporting period.';
+ Visible = GLAccountMappingCodeVisible;
}
field(StartingDate; Rec."Starting Date")
{
@@ -45,32 +46,37 @@ page 5267 "Audit File Export Doc. Card"
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies if multiple audit files will be generated per month.';
+ Visible = SplitByMonthVisible;
}
field(SplitByDate; Rec."Split By Date")
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies whether multiple audit files will be generated for each day.';
+ Visible = SplitByDateVisible;
}
field("Header Comment"; Rec."Header Comment")
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies the comment that is exported to the header of the audit file';
+ Visible = HeaderCommentVisible;
}
field(Contact; Rec.Contact)
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies the contact that is exported to the header of the audit file';
+ Visible = ContactVisible;
}
field(ZipFileGeneration; Rec."Archive to Zip")
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies that all files will be packed into a Zip archive.';
- Visible = not IsSaaS;
+ Visible = ZipFileGenerationVisible and not IsSaaS;
}
field(CreateMultipleZipFiles; Rec."Create Multiple Zip Files")
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies that multiple Zip files will be generated.';
+ Visible = CreateMultipleZipFilesVisible;
}
}
group(Processing)
@@ -120,11 +126,13 @@ page 5267 "Audit File Export Doc. Card"
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies when the most recent data check was run.';
+ Visible = LatestDataCheckDateTimeVisible;
}
field(DataCheckStatus; Rec."Data check status")
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies the status of the most recent data check.';
+ Visible = DataCheckStatusVisible;
}
}
part(ExportLines; "Audit File Export Subpage")
@@ -149,6 +157,7 @@ page 5267 "Audit File Export Doc. Card"
Image = CheckRulesSyntax;
Caption = 'Data check';
ToolTip = 'Check that data is ready to be exported to the audit file.';
+ Visible = DataCheckActionVisible;
trigger OnAction()
var
@@ -212,6 +221,16 @@ page 5267 "Audit File Export Doc. Card"
IsParallelProcessingAllowed: Boolean;
IsParallelProcessingEnabled: Boolean;
IsSaaS: Boolean;
+ GLAccountMappingCodeVisible: Boolean;
+ SplitByMonthVisible: Boolean;
+ SplitByDateVisible: Boolean;
+ HeaderCommentVisible: Boolean;
+ ContactVisible: Boolean;
+ ZipFileGenerationVisible: Boolean;
+ CreateMultipleZipFilesVisible: Boolean;
+ LatestDataCheckDateTimeVisible: Boolean;
+ DataCheckStatusVisible: Boolean;
+ DataCheckActionVisible: Boolean;
trigger OnOpenPage()
var
@@ -222,6 +241,7 @@ page 5267 "Audit File Export Doc. Card"
if not IsParallelProcessingAllowed then
AuditFileExportMgt.ThrowNoParallelExecutionNotification();
IsSaaS := EnvironmentInformation.IsSaaS();
+ UpdateVisibility();
end;
trigger OnInsertRecord(BelowxRec: Boolean): Boolean
@@ -232,10 +252,68 @@ page 5267 "Audit File Export Doc. Card"
trigger OnAfterGetCurrRecord()
begin
CalcParallelProcessingEnabled();
+ UpdateVisibility();
end;
local procedure CalcParallelProcessingEnabled()
begin
IsParallelProcessingEnabled := Rec."Parallel Processing";
end;
+
+ local procedure UpdateVisibility()
+ var
+ IAuditFileExportPageVisibility: Interface "Audit File Export Page Visibility";
+ FieldVisibility: Dictionary of [Text, Boolean];
+ ActionVisibility: Dictionary of [Text, Boolean];
+ begin
+ InitializeVisibility(FieldVisibility, ActionVisibility);
+ IAuditFileExportPageVisibility := Rec."Audit File Export Format";
+ IAuditFileExportPageVisibility.GetUIVisibility(FieldVisibility, ActionVisibility);
+ ApplyVisibility(FieldVisibility, ActionVisibility);
+ CurrPage.Update();
+ end;
+
+ local procedure InitializeVisibility(var FieldVisibility: Dictionary of [Text, Boolean]; var ActionVisibility: Dictionary of [Text, Boolean])
+ begin
+ // Initialize all field visibility to true
+ FieldVisibility.Set('GLAccountMappingCode', true);
+ FieldVisibility.Set('SplitByMonth', true);
+ FieldVisibility.Set('SplitByDate', true);
+ FieldVisibility.Set('HeaderComment', true);
+ FieldVisibility.Set('Contact', true);
+ FieldVisibility.Set('ZipFileGeneration', true);
+ FieldVisibility.Set('CreateMultipleZipFiles', true);
+ FieldVisibility.Set('LatestDataCheckDateTime', true);
+ FieldVisibility.Set('DataCheckStatus', true);
+
+ // Initialize all action visibility to true
+ ActionVisibility.Set('DataCheck', true);
+ end;
+
+ local procedure ApplyVisibility(FieldVisibility: Dictionary of [Text, Boolean]; ActionVisibility: Dictionary of [Text, Boolean])
+ begin
+ // Apply field visibility
+ if FieldVisibility.ContainsKey('GLAccountMappingCode') then
+ GLAccountMappingCodeVisible := FieldVisibility.Get('GLAccountMappingCode');
+ if FieldVisibility.ContainsKey('SplitByMonth') then
+ SplitByMonthVisible := FieldVisibility.Get('SplitByMonth');
+ if FieldVisibility.ContainsKey('SplitByDate') then
+ SplitByDateVisible := FieldVisibility.Get('SplitByDate');
+ if FieldVisibility.ContainsKey('HeaderComment') then
+ HeaderCommentVisible := FieldVisibility.Get('HeaderComment');
+ if FieldVisibility.ContainsKey('Contact') then
+ ContactVisible := FieldVisibility.Get('Contact');
+ if FieldVisibility.ContainsKey('ZipFileGeneration') then
+ ZipFileGenerationVisible := FieldVisibility.Get('ZipFileGeneration');
+ if FieldVisibility.ContainsKey('CreateMultipleZipFiles') then
+ CreateMultipleZipFilesVisible := FieldVisibility.Get('CreateMultipleZipFiles');
+ if FieldVisibility.ContainsKey('LatestDataCheckDateTime') then
+ LatestDataCheckDateTimeVisible := FieldVisibility.Get('LatestDataCheckDateTime');
+ if FieldVisibility.ContainsKey('DataCheckStatus') then
+ DataCheckStatusVisible := FieldVisibility.Get('DataCheckStatus');
+
+ // Apply action visibility
+ if ActionVisibility.ContainsKey('DataCheck') then
+ DataCheckActionVisible := ActionVisibility.Get('DataCheck');
+ end;
}
diff --git a/src/Layers/FR/BaseApp/Finance/RoleCenters/FinanceManagerRoleCenter.Page.al b/src/Layers/FR/BaseApp/Finance/RoleCenters/FinanceManagerRoleCenter.Page.al
index d3feb36572..85363c1a1f 100644
--- a/src/Layers/FR/BaseApp/Finance/RoleCenters/FinanceManagerRoleCenter.Page.al
+++ b/src/Layers/FR/BaseApp/Finance/RoleCenters/FinanceManagerRoleCenter.Page.al
@@ -27,7 +27,9 @@ using Microsoft.CostAccounting.Reports;
using Microsoft.CostAccounting.Setup;
using Microsoft.EServices.EDocument;
using Microsoft.Finance.Analysis;
+#if not CLEAN28
using Microsoft.Finance.AuditFileExport;
+#endif
using Microsoft.Finance.Consolidation;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Deferral;
@@ -400,16 +402,24 @@ page 8901 "Finance Manager Role Center"
RunObject = page "Item Budget Entries";
Tooltip = 'Open the Item Budget Entries page.';
}
+#if not CLEAN29
group("Group64")
{
Caption = 'Export';
+ ObsoleteReason = 'Use Audit File Export Document with the XML format selected. The Audit File Export and XML Audit File extensions must be installed.';
+ ObsoleteState = Pending;
+ ObsoleteTag = '29.0';
action("Export G/L Entries to XML")
{
ApplicationArea = Basic, Suite;
Caption = 'Export G/L Entries to XML';
RunObject = report "Export G/L Entries to XML";
+ ObsoleteReason = 'Use Audit File Export Document with the XML format selected. The Audit File Export and XML Audit File extensions must be installed.';
+ ObsoleteState = Pending;
+ ObsoleteTag = '29.0';
}
}
+#endif
}
group("Group7")
{
diff --git a/src/Layers/FR/BaseApp/Local/FinancialMgt/AuditFileExport/ExportGLEntries.XmlPort.al b/src/Layers/FR/BaseApp/Local/FinancialMgt/AuditFileExport/ExportGLEntries.XmlPort.al
index fec029c08f..38f9b95495 100644
--- a/src/Layers/FR/BaseApp/Local/FinancialMgt/AuditFileExport/ExportGLEntries.XmlPort.al
+++ b/src/Layers/FR/BaseApp/Local/FinancialMgt/AuditFileExport/ExportGLEntries.XmlPort.al
@@ -1,4 +1,5 @@
-// ------------------------------------------------------------------------------------------------
+#if not CLEAN29
+// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
@@ -9,6 +10,9 @@ using Microsoft.Finance.GeneralLedger.Ledger;
xmlport 10800 "Export G/L Entries"
{
Caption = 'Export G/L Entries';
+ ObsoleteReason = 'Use Audit File Export Document with the XML format selected. The Audit File Export and XML Audit File extensions must be installed.';
+ ObsoleteState = Pending;
+ ObsoleteTag = '29.0';
schema
{
@@ -194,4 +198,4 @@ xmlport 10800 "Export G/L Entries"
EndingDate := Format(EndDate);
end;
}
-
+#endif
diff --git a/src/Layers/FR/BaseApp/Local/FinancialMgt/AuditFileExport/ExportGLEntriestoXML.Report.al b/src/Layers/FR/BaseApp/Local/FinancialMgt/AuditFileExport/ExportGLEntriestoXML.Report.al
index 52ce308a5f..3048a56ab7 100644
--- a/src/Layers/FR/BaseApp/Local/FinancialMgt/AuditFileExport/ExportGLEntriestoXML.Report.al
+++ b/src/Layers/FR/BaseApp/Local/FinancialMgt/AuditFileExport/ExportGLEntriestoXML.Report.al
@@ -1,4 +1,5 @@
-// ------------------------------------------------------------------------------------------------
+#if not CLEAN29
+// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
@@ -15,6 +16,9 @@ report 10820 "Export G/L Entries to XML"
Caption = 'Export G/L Entries to XML';
ProcessingOnly = true;
UsageCategory = ReportsAndAnalysis;
+ ObsoleteReason = 'Use Audit File Export Document with the XML format selected. The Audit File Export and XML Audit File extensions must be installed.';
+ ObsoleteState = Pending;
+ ObsoleteTag = '29.0';
dataset
{
@@ -138,4 +142,4 @@ report 10820 "Export G/L Entries to XML"
OutputFile: File;
Text010: Label 'Default';
}
-
+#endif
diff --git a/src/Layers/FR/Tests/Local/UTREPExportGeneralLedger.Codeunit.al b/src/Layers/FR/Tests/Local/UTREPExportGeneralLedger.Codeunit.al
index 8296d256d6..894ee34370 100644
--- a/src/Layers/FR/Tests/Local/UTREPExportGeneralLedger.Codeunit.al
+++ b/src/Layers/FR/Tests/Local/UTREPExportGeneralLedger.Codeunit.al
@@ -1,4 +1,5 @@
-codeunit 144021 "UT REP Export General Ledger"
+#if not CLEAN29
+codeunit 144044 "UT REP Export General Ledger"
{
// 1 - 3. Purpose of the test is to verify error of Report ID - 10820 (Export G/L Entries to XML).
//
@@ -12,6 +13,9 @@ codeunit 144021 "UT REP Export General Ledger"
Subtype = Test;
TestPermissions = Disabled;
+ ObsoleteReason = 'Run tests in XML Audit File tests extension.';
+ ObsoleteState = Pending;
+ ObsoleteTag = '29.0';
trigger OnRun()
begin
@@ -88,4 +92,4 @@ codeunit 144021 "UT REP Export General Ledger"
ExportGLEntriesToXML.OK().Invoke();
end;
}
-
+#endif
\ No newline at end of file