Page 242 Consolidate Wizard
- App
- Base Application
- Namespace
- Microsoft.Finance.Consolidation
- Versions
- 23-28
- Source table
- 220
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Finance/Consolidation/ConsolidateWizard.Page.al688 lines, Copyright (c) Microsoft Corporation. MIT
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------
namespace Microsoft.Finance.Consolidation;
using Microsoft.Finance.Dimension;
using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Finance.GeneralLedger.Setup;
using System.Telemetry;
/// <summary>
/// Guided consolidation wizard for executing multi-company consolidation processes.
/// Provides step-by-step consolidation setup and execution interface with business unit selection and parameter configuration.
/// </summary>
/// <remarks>
/// Navigate page wizard guiding users through consolidation process setup and execution.
/// Handles business unit selection, consolidation parameters, date ranges, and execution options.
/// Integrates with consolidation engine for seamless multi-step consolidation workflow management.
/// </remarks>
page 242 "Consolidate Wizard"
{
Caption = 'Run Consolidation';
PageType = NavigatePage;
SourceTable = "Business Unit";
SourceTableTemporary = true;
DeleteAllowed = false;
InsertAllowed = false;
SaveValues = true;
layout
{
area(Content)
{
group(Step0)
{
Visible = (Step = 0);
field(StartingDate; TempConsolidationProcess."Starting Date")
{
ApplicationArea = Basic, Suite;
Caption = 'Starting Date';
ClosingDates = true;
ToolTip = 'Specifies the starting date for the consolidation period.';
ShowMandatory = true;
trigger OnValidate()
begin
UpdateOtherDateAfterOneIsEdited(TempConsolidationProcess."Starting Date", TempConsolidationProcess."Ending Date");
if (TempConsolidationProcess."Starting Date" <> 0D) and (TempConsolidationProcess."Ending Date" <> 0D) then
ConsolidateBusinessUnits.ValidateDatesForConsolidation(TempConsolidationProcess."Starting Date", TempConsolidationProcess."Ending Date", true);
UpdateBusinessUnitDefaultConsolidateState();
SetNextActionEnabled();
end;
}
field(EndingDate; TempConsolidationProcess."Ending Date")
{
ApplicationArea = Basic, Suite;
Caption = 'Ending Date';
ClosingDates = true;
ToolTip = 'Specifies the ending date for the consolidation period. This date is used as the posting date of the consolidation entries.';
ShowMandatory = true;
trigger OnValidate()
begin
UpdateOtherDateAfterOneIsEdited(TempConsolidationProcess."Ending Date", TempConsolidationProcess."Starting Date");
if (TempConsolidationProcess."Starting Date" <> 0D) and (TempConsolidationProcess."Ending Date" <> 0D) then
ConsolidateBusinessUnits.ValidateDatesForConsolidation(TempConsolidationProcess."Starting Date", TempConsolidationProcess."Ending Date", true);
UpdateBusinessUnitDefaultConsolidateState();
SetNextActionEnabled();
end;
}
field(JournalTemplateName; TempConsolidationProcess."Journal Template Name")
{
ApplicationArea = Basic, Suite;
Caption = 'Journal Template Name';
TableRelation = "Gen. Journal Template";
Tooltip = 'Specifies the name of the journal template that is used for posting.';
ShowMandatory = true;
Visible = JournalTemplateNameMandatory;
trigger OnValidate()
begin
if (TempConsolidationProcess."Journal Template Name" <> '') and (TempConsolidationProcess."Journal Batch Name" <> '') then
ConsolidateBusinessUnits.ValidateJournalForConsolidation(JournalTemplateNameMandatory, TempConsolidationProcess."Journal Template Name", TempConsolidationProcess."Journal Batch Name", TempConsolidationProcess."Document No.");
SetNextActionEnabled();
end;
}
field(JournalBatchName; TempConsolidationProcess."Journal Batch Name")
{
ApplicationArea = Basic, Suite;
Caption = 'Journal Batch Name';
ToolTip = 'Specifies the name of the journal batch that is used for the posting.';
ShowMandatory = true;
Visible = JournalTemplateNameMandatory;
trigger OnLookup(var Text: Text): Boolean
var
GenJournalLine: Record "Gen. Journal Line";
GenJournalBatch: Record "Gen. Journal Batch";
GenJnlManagement: Codeunit GenJnlManagement;
begin
if TempConsolidationProcess."Journal Template Name" = '' then
exit(false);
GenJournalLine."Journal Template Name" := TempConsolidationProcess."Journal Template Name";
GenJournalLine."Journal Batch Name" := TempConsolidationProcess."Journal Batch Name";
GenJnlManagement.SetJnlBatchName(GenJournalLine);
if GenJournalLine."Journal Batch Name" <> '' then
GenJournalBatch.Get(TempConsolidationProcess."Journal Template Name", GenJournalLine."Journal Batch Name");
Text := GenJournalLine."Journal Batch Name";
exit(true);
end;
trigger OnValidate()
begin
if (TempConsolidationProcess."Journal Template Name" <> '') and (TempConsolidationProcess."Journal Batch Name" <> '') then
ConsolidateBusinessUnits.ValidateJournalForConsolidation(JournalTemplateNameMandatory, TempConsolidationProcess."Journal Template Name", TempConsolidationProcess."Journal Batch Name", TempConsolidationProcess."Document No.");
SetNextActionEnabled();
end;
}
field(DocumentNo; TempConsolidationProcess."Document No.")
{
ApplicationArea = Basic, Suite;
Caption = 'Document No.';
Tooltip = 'Specifies the G/L document number used for posting.';
ShowMandatory = true;
Visible = not JournalTemplateNameMandatory;
trigger OnValidate()
begin
ConsolidateBusinessUnits.ValidateJournalForConsolidation(JournalTemplateNameMandatory, TempConsolidationProcess."Journal Template Name", TempConsolidationProcess."Journal Batch Name", TempConsolidationProcess."Document No.");
SetNextActionEnabled();
end;
}
field(TransferedDimensions; TempConsolidationProcess."Dimensions to Transfer")
{
ApplicationArea = Basic, Suite;
Caption = 'Dimensions';
Editable = false;
ToolTip = 'Specifies the dimensions to transfer from the imported entries.';
trigger OnAssistEdit()
var
Dimension: Record Dimension;
begin
if Dimension.IsEmpty() then
Error(NoDimensionsInConsolidationCompanyErr);
DimensionSelectionBuffer.SetDimSelectionMultiple(3, REPORT::"Import Consolidation from DB", TempConsolidationProcess."Dimensions to Transfer");
end;
}
field(ParentCurrencyCode; TempConsolidationProcess."Parent Currency Code")
{
ApplicationArea = Basic, Suite;
Caption = 'Parent Currency Code';
Tooltip = 'Specifies the parent currency code.';
}
}
group(Step1)
{
Visible = (Step = 1);
label(Description)
{
ApplicationArea = Basic, Suite;
CaptionClass = FullDescriptionTxt;
}
group(BusinessUnitsGroup)
{
Caption = 'Business Units to consolidate';
ShowCaption = false;
Editable = true;
Enabled = true;
repeater(BusinessUnits)
{
field(Code; Rec.Code)
{
ApplicationArea = Basic, Suite;
Caption = 'Code';
Editable = false;
TableRelation = "Business Unit";
DrillDown = true;
StyleExpr = StyleTxt;
}
field(Name; CompanyName)
{
ApplicationArea = Basic, Suite;
Caption = 'Company Name';
ToolTip = 'Specifies the name of business unit.';
Editable = false;
StyleExpr = StyleTxt;
}
field(LastConsolidationEndingDate; LastConsolidationEndingDate)
{
ApplicationArea = Basic, Suite;
Caption = 'Last Consolidation Ending Date';
ToolTip = 'Specifies the last consolidation''s run ending date for this business unit.';
Editable = false;
StyleExpr = StyleTxt;
trigger OnDrillDown()
var
BusUnitInConsProcess: Record "Bus. Unit In Cons. Process";
ConsForBusinessUnits: Page "Cons. for Business Units";
begin
BusUnitInConsProcess.SetRange("Business Unit Code", Rec.Code);
BusUnitInConsProcess.SetRange(Status, BusUnitInConsProcess.Status::Finished);
ConsForBusinessUnits.SetTableView(BusUnitInConsProcess);
ConsForBusinessUnits.Run();
end;
}
field(Consolidate; Rec.Consolidate)
{
ApplicationArea = Basic, Suite;
Caption = 'Consolidate';
ToolTip = 'Specifies if the business unit should be included in the consolidation.';
trigger OnValidate()
var
ImportConsolidationFromAPI: Codeunit "Import Consolidation from API";
begin
if Rec.Consolidate and (Rec."Default Data Import Method" = Rec."Default Data Import Method"::API) then begin
ImportConsolidationFromAPI.AcquireTokenAndStoreInIsolatedStorage(Rec);
if not ImportConsolidationFromAPI.IsStoredTokenValidForBusinessUnit(Rec) then
Error(NotPossibleToGetTokenMsg);
end;
UpdateCurrentRecAccessGrantedState();
end;
}
field(AccessGranted; AccessGranted)
{
ApplicationArea = Basic, Suite;
Caption = 'Access Granted';
ToolTip = 'Specifies if access to the Business Central company of this business unit has been granted.';
OptionCaption = 'Not Needed,No,Yes';
Editable = false;
Visible = false;
}
field("Default Data Import Method"; Rec."Default Data Import Method")
{
ApplicationArea = Basic, Suite;
Caption = 'Data Import Method';
ToolTip = 'Specifies the default data import method for the business unit.';
StyleExpr = StyleTxt;
}
}
}
}
group(Step2)
{
Visible = (Step = 2);
label(CurrencyDescription)
{
ApplicationArea = Basic, Suite;
Caption = 'Review and configure the currency exchange rates used for the business units that require currency translation.';
}
group(CurrencyBusinessUnitsGroup)
{
Caption = 'Business Units to consolidate';
ShowCaption = false;
Editable = true;
Enabled = true;
repeater(CurrencyBusinessUnits)
{
Editable = RequiresCurrencyTranslation;
field(BUCode; Rec.Code)
{
ApplicationArea = Basic, Suite;
Caption = 'Code';
ToolTip = 'Specifies the code of the business unit.';
Editable = false;
TableRelation = "Business Unit";
}
field(BUName; CompanyName)
{
ApplicationArea = Basic, Suite;
Caption = 'Company Name';
ToolTip = 'Specifies the name of business unit.';
Editable = false;
}
field(CurrencyCode; Rec."Currency Code")
{
ApplicationArea = Basic, Suite;
Caption = 'Currency Code';
Editable = false;
ToolTip = 'Specifies the currency code.';
}
field(CurrencySource; Rec."Currency Exchange Rate Table")
{
ApplicationArea = Basic, Suite;
Caption = 'Exchange Rates Source';
Tooltip = 'Specifies where are the exchange rates taken from for the Historical accounts';
}
field(AverageCurrencyFactor; Rec."Income Currency Factor")
{
ApplicationArea = Basic, Suite;
Caption = 'Average Currency Factor';
AutoFormatType = 0;
DecimalPlaces = 2;
trigger OnDrillDown()
begin
if not Rec.Consolidate then
Error(BusinessUnitNotSelectedForConsolidationErr);
UpdateBusinessUnitCurrencyFactors();
end;
}
field(ClosingCurrencyFactor; Rec."Balance Currency Factor")
{
ApplicationArea = Basic, Suite;
Caption = 'Closing Currency Factor';
AutoFormatType = 0;
DecimalPlaces = 2;
trigger OnDrillDown()
begin
if not Rec.Consolidate then
Error(BusinessUnitNotSelectedForConsolidationErr);
UpdateBusinessUnitCurrencyFactors();
end;
}
field(LastClosingCurrencyFactor; Rec."Last Balance Currency Factor")
{
ApplicationArea = Basic, Suite;
Caption = 'Last Closing Currency Factor';
AutoFormatType = 0;
DecimalPlaces = 2;
trigger OnDrillDown()
begin
if not Rec.Consolidate then
Error(BusinessUnitNotSelectedForConsolidationErr);
UpdateBusinessUnitCurrencyFactors();
end;
}
}
}
}
group(Step3)
{
Visible = (Step = 3);
label(ConfirmFinalize)
{
ApplicationArea = Basic, Suite;
Caption = 'Ready to perform the consolidation. Click "Finish" to start the consolidation process.';
}
}
}
}
actions
{
area(Processing)
{
action(Finalize)
{
ApplicationArea = Basic, Suite;
InFooterBar = true;
Caption = 'Finish';
Image = Approve;
Visible = (Step = 3);
trigger OnAction()
begin
ConsolidateBusinessUnits.ValidateConsolidationParameters(TempConsolidationProcess, Rec, true);
if not ConsolidateBusinessUnits.ValidateAndRunConsolidation(TempConsolidationProcess, Rec) then begin
CurrPage.Close();
Error(GetLastErrorText());
end;
Message(ConsolidationScheduledMsg);
CurrPage.Close();
end;
}
action(ActionNext)
{
ApplicationArea = Basic, Suite;
InFooterBar = true;
Caption = 'Next';
Image = NextRecord;
Enabled = NextActionEnabled;
Visible = (Step <> 3);
trigger OnAction()
begin
Step += 1;
if Step = 2 then begin
Rec.SetRange(Consolidate, true);
if Rec.IsEmpty() then begin
Step -= 1;
Rec.Reset();
Message(NoBusinessUnitsSelectedErr);
SetNextActionEnabled();
exit;
end;
ConsolidateBusinessUnits.ValidateBusinessUnitsToConsolidate(Rec, false);
if not BusinessUnitsToConsolidateNeedCurrencyTranslation() then
Step += 1;
end;
SetNextActionEnabled();
end;
}
action(ActionBack)
{
ApplicationArea = Basic, Suite;
InFooterBar = true;
Caption = 'Back';
Image = PreviousRecord;
Enabled = (Step <> 0);
trigger OnAction()
begin
if Step = 3 then
if not BusinessUnitsToConsolidateNeedCurrencyTranslation() then
Step -= 1;
Step -= 1;
if Step = 1 then
Rec.SetRange(Consolidate);
end;
}
action(ConfigureCurrency)
{
ApplicationArea = Basic, Suite;
Caption = 'Configure currency';
InFooterBar = true;
Visible = (Step = 2);
Image = Currency;
trigger OnAction()
begin
if not Rec.Consolidate then
Error(BusinessUnitNotSelectedForConsolidationErr);
UpdateBusinessUnitCurrencyFactors();
end;
}
action(GrantAccess)
{
ApplicationArea = Basic, Suite;
Caption = 'Grant Access';
InFooterBar = true;
Visible = (Step = 1) and AnyBusinessUnitNeedsAccessGranted;
Image = Lock;
trigger OnAction()
var
BusinessUnit: Record "Business Unit";
ImportConsolidationFromAPI: Codeunit "Import Consolidation from API";
begin
CurrPage.SetSelectionFilter(BusinessUnit);
if BusinessUnit.Count() <> 1 then
Error(SelectOneBusinessUnitToProvideAccessErr);
BusinessUnit.FindFirst();
if BusinessUnit."Default Data Import Method" <> BusinessUnit."Default Data Import Method"::API then begin
Message(AccessIsAlreadyGrantedMsg);
exit;
end;
ImportConsolidationFromAPI.AcquireTokenAndStoreInIsolatedStorage(BusinessUnit);
UpdateCurrentRecAccessGrantedState(true);
end;
}
}
}
var
TempConsolidationProcess: Record "Consolidation Process" temporary;
DimensionSelectionBuffer: Record "Dimension Selection Buffer";
ConsolidateBusinessUnits: Codeunit "Consolidate Business Units";
ConsolidationCurrency: Codeunit "Consolidation Currency";
AccessGrantedStates: Dictionary of [Code[20], Integer];
LastConsolidationEndingDate: Date;
CompanyName: Text;
StyleTxt: Text;
FullDescriptionTxt: Text;
Step: Integer;
AccessGranted: Option NotNeeded,No,Yes;
AnyBusinessUnitNeedsAccessGranted, JournalTemplateNameMandatory : Boolean;
NextActionEnabled, RequiresCurrencyTranslation : Boolean;
BusinessUnitNotSelectedForConsolidationErr: Label 'This business unit has not been selected for consolidation.';
NoBusinessUnitsToConsolidateErr: Label 'There are no business units configured for consolidation. You can enable the field "Consolidate" in each of the business unit''s setup page.';
ConsolidationScheduledMsg: Label 'The consolidation has been successful. The current consolidation company has imported the entries from the selected business units.';
AccessIsAlreadyGrantedMsg: Label 'Access is already granted.';
DescriptionTxt: Label 'Select the business units to consolidate in the period %1..%2 with the column "Consolidate".', Comment = '%1 - starting date, %2 - ending date';
DescriptionMissingAuthTxt: Label 'The business units %1 have not been granted access. Select each of them and use the action "Grant Access" to authenticate into these companies.', Comment = '%1 - list of comma separated business units'' codes';
NoDimensionsInConsolidationCompanyErr: Label 'There are no dimensions configured for the current consolidation company. You can add and configure dimensions in the "Dimensions" page.';
SelectOneBusinessUnitToProvideAccessErr: Label 'Select only one business unit to provide access to.';
NotPossibleToGetTokenMsg: Label 'It was not possible to get authorization for this business unit. You can verify the setup in the Business Unit Card page.';
NoBusinessUnitsSelectedErr: Label 'You have to select at least one business unit to consolidate.';
trigger OnOpenPage()
var
BusinessUnit: Record "Business Unit";
GeneralLedgerSetup: Record "General Ledger Setup";
FeatureTelemetry: Codeunit "Feature Telemetry";
ImportConsolidationFromAPI: Codeunit "Import Consolidation from API";
begin
FeatureTelemetry.LogUptake('0000KOK', ImportConsolidationFromAPI.GetFeatureTelemetryName(), Enum::"Feature Uptake Status"::Discovered);
GeneralLedgerSetup.Get();
Clear(TempConsolidationProcess."Dimensions to Transfer");
TempConsolidationProcess."Parent Currency Code" := GeneralLedgerSetup."LCY Code";
JournalTemplateNameMandatory := GeneralLedgerSetup."Journal Templ. Name Mandatory";
FullDescriptionTxt := StrSubstNo(DescriptionTxt, TempConsolidationProcess."Starting Date", TempConsolidationProcess."Ending Date");
BusinessUnit.SetRange(Consolidate, true);
if not BusinessUnit.FindSet() then
Error(NoBusinessUnitsToConsolidateErr);
repeat
if BusinessUnitConfiguredForAutomaticImport(BusinessUnit) then begin
Rec.TransferFields(BusinessUnit);
Rec.Consolidate := GetDefaultConsolidateState(Rec, TempConsolidationProcess."Starting Date", TempConsolidationProcess."Ending Date");
AccessGrantedStates.Add(BusinessUnit.Code, AccessGranted::NotNeeded);
Rec.Insert();
end;
until BusinessUnit.Next() = 0;
SetNextActionEnabled();
end;
trigger OnAfterGetRecord()
begin
UpdateCurrentRecState();
end;
local procedure UpdateOtherDateAfterOneIsEdited(DateEdited: Date; var OtherDate: Date)
begin
if DateEdited = 0D then
exit;
if DateEdited = ClosingDate(DateEdited) then begin
OtherDate := DateEdited;
exit;
end;
if OtherDate = 0D then
exit;
if OtherDate = ClosingDate(OtherDate) then
OtherDate := 0D;
end;
local procedure UpdateBusinessUnitDefaultConsolidateState()
begin
Rec.Reset();
Rec.FindSet();
repeat
Rec.Consolidate := GetDefaultConsolidateState(Rec, TempConsolidationProcess."Starting Date", TempConsolidationProcess."Ending Date");
Rec.Modify();
until Rec.Next() = 0;
end;
local procedure GetDefaultConsolidateState(BusinessUnit: Record "Business Unit"; StartingDate: Date; EndingDate: Date): Boolean
var
ImportConsolidationFromAPI: Codeunit "Import Consolidation from API";
ShouldConsolidateByDefaultDueToAccess: Boolean;
ShouldConsolidateByDefaultDueToDatePeriod: Boolean;
begin
if BusinessUnit."Default Data Import Method" <> BusinessUnit."Default Data Import Method"::API then
ShouldConsolidateByDefaultDueToAccess := true
else
ShouldConsolidateByDefaultDueToAccess := ImportConsolidationFromAPI.IsStoredTokenValidForBusinessUnit(BusinessUnit);
ShouldConsolidateByDefaultDueToDatePeriod := BusinessUnitHasNotBeenConsolidatedInPeriod(BusinessUnit, StartingDate, EndingDate);
exit(ShouldConsolidateByDefaultDueToAccess and ShouldConsolidateByDefaultDueToDatePeriod);
end;
local procedure BusinessUnitHasNotBeenConsolidatedInPeriod(BusinessUnit: Record "Business Unit"; FromDate: Date; ToDate: Date): Boolean
begin
if (FromDate = 0D) or (ToDate = 0D) then
exit(true);
exit(not ConsolidateBusinessUnits.BusinessUnitConsolidationProcessesInDateRange(BusinessUnit, FromDate, ToDate));
end;
local procedure BusinessUnitConfiguredForAutomaticImport(BusinessUnit: Record "Business Unit"): Boolean
begin
if BusinessUnit."Default Data Import Method" = BusinessUnit."Default Data Import Method"::Database then
exit(BusinessUnit."Company Name" <> '');
if BusinessUnit."Default Data Import Method" = BusinessUnit."Default Data Import Method"::API then
exit(BusinessUnit."BC API URL" <> '');
end;
local procedure UpdateBusinessUnitCurrencyFactors()
var
BusinessUnit: Record "Business Unit";
begin
ConsolidationCurrency.ConfigureBusinessUnitCurrencies(Rec, TempConsolidationProcess);
BusinessUnit.Get(Rec.Code);
BusinessUnit."Balance Currency Factor" := Rec."Balance Currency Factor";
BusinessUnit."Last Balance Currency Factor" := Rec."Last Balance Currency Factor";
BusinessUnit."Income Currency Factor" := Rec."Income Currency Factor";
BusinessUnit."Currency Exchange Rate Table" := Rec."Currency Exchange Rate Table";
BusinessUnit.Modify();
end;
local procedure BusinessUnitsToConsolidateNeedCurrencyTranslation(): Boolean
begin
Rec.SetRange(Consolidate, true);
if not Rec.FindSet() then
exit(false);
repeat
if BusinessUnitNeedsCurrencyTranslation(Rec) then
exit(true);
until Rec.Next() = 0;
exit(false);
end;
local procedure BusinessUnitNeedsCurrencyTranslation(BusinessUnit: Record "Business Unit"): Boolean
begin
exit((BusinessUnit."Currency Code" <> '') and (BusinessUnit."Currency Code" <> TempConsolidationProcess."Parent Currency Code"));
end;
local procedure UpdateCurrentRecState()
begin
if (Step = 1) or (Step = 2) then begin
if Rec."Default Data Import Method" = Rec."Default Data Import Method"::Database then
CompanyName := Rec."Company Name";
if Rec."Default Data Import Method" = Rec."Default Data Import Method"::API then
CompanyName := Rec."External Company Name";
end;
if Step = 1 then begin
UpdateCurrentRecAccessGrantedState();
LastConsolidationEndingDate := ConsolidateBusinessUnits.GetLastConsolidationEndingDate(Rec);
end;
if Step = 2 then
RequiresCurrencyTranslation := BusinessUnitNeedsCurrencyTranslation(Rec);
end;
local procedure UpdateCurrentRecAccessGrantedState()
begin
UpdateCurrentRecAccessGrantedState(false);
end;
local procedure UpdateCurrentRecAccessGrantedState(WarnConfig: Boolean)
begin
AccessGranted := GetBusinessUnitAccessGranted(Rec, WarnConfig);
StyleTxt := GetStyleExprForBusinessUnit(Rec, AccessGranted);
AccessGrantedStates.Set(Rec.Code, AccessGranted);
UpdateFullDescription();
end;
local procedure UpdateFullDescription(): Text
var
BusinessUnitCode: Code[20];
BusinessUnitState: Option;
CompaniesTxt: Text;
begin
FullDescriptionTxt := StrSubstNo(DescriptionTxt, TempConsolidationProcess."Starting Date", TempConsolidationProcess."Ending Date");
foreach BusinessUnitCode in AccessGrantedStates.Keys() do begin
BusinessUnitState := AccessGrantedStates.Get(BusinessUnitCode);
if BusinessUnitState = AccessGranted::No then begin
if CompaniesTxt <> '' then
CompaniesTxt += ', ';
CompaniesTxt += BusinessUnitCode;
end;
end;
if CompaniesTxt <> '' then
FullDescriptionTxt += StrSubstNo(DescriptionMissingAuthTxt, CompaniesTxt);
end;
local procedure GetStyleExprForBusinessUnit(BusinessUnit: Record "Business Unit"; AccessGrantedStatus: Option): Text
begin
if not BusinessUnit.Consolidate then
exit('None');
if BusinessUnit."Default Data Import Method" = BusinessUnit."Default Data Import Method"::Database then
exit('Favorable');
if AccessGrantedStatus = AccessGranted::No then
exit('Attention');
exit('Favorable');
end;
local procedure GetBusinessUnitAccessGranted(BusinessUnit: Record "Business Unit"; WarnConfig: Boolean): Option
var
ImportConsolidationFromAPI: Codeunit "Import Consolidation from API";
begin
if BusinessUnit."Default Data Import Method" = BusinessUnit."Default Data Import Method"::Database then
exit(AccessGranted::NotNeeded);
AnyBusinessUnitNeedsAccessGranted := true;
if ImportConsolidationFromAPI.IsStoredTokenValidForBusinessUnit(BusinessUnit) then
exit(AccessGranted::Yes);
if WarnConfig then
Message(NotPossibleToGetTokenMsg);
exit(AccessGranted::No);
end;
local procedure SetNextActionEnabled()
begin
NextActionEnabled := ValidateDatesForConsolidation() and ValidateJournalForConsolidation();
end;
[TryFunction()]
local procedure ValidateDatesForConsolidation()
begin
ConsolidateBusinessUnits.ValidateDatesForConsolidation(TempConsolidationProcess."Starting Date", TempConsolidationProcess."Ending Date", false);
end;
[TryFunction()]
local procedure ValidateJournalForConsolidation()
begin
ConsolidateBusinessUnits.ValidateJournalForConsolidation(JournalTemplateNameMandatory, TempConsolidationProcess."Journal Template Name", TempConsolidationProcess."Journal Batch Name", TempConsolidationProcess."Document No.");
end;
}