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