Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
namespace Microsoft.DataMigration.SL;

using System.Integration;
using Microsoft.Finance.GeneralLedger.Account;
using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Finance.Dimension;

Expand All @@ -14,6 +15,7 @@ codeunit 47000 "SL Account Migrator"
Access = Internal;

var
BeginningBalanceDescriptionTxt: Label 'Beginning Balance for ', Locked = true;
PostingGroupCodeTxt: Label 'SL', Locked = true;
PostingGroupDescriptionTxt: Label 'Migrated from SL', Locked = true;
GLModuleIDLbl: Label 'GL', Locked = true;
Expand Down Expand Up @@ -111,8 +113,157 @@ codeunit 47000 "SL Account Migrator"
Sender.ModifyGLAccount(true);
end;

[EventSubscriber(ObjectType::Codeunit, Codeunit::"GL Acc. Data Migration Facade", OnCreateOpeningBalanceTrx, '', true, true)]
local procedure OnCreateOpeningBalanceTrx(var Sender: Codeunit "GL Acc. Data Migration Facade"; RecordIdToMigrate: RecordId)
begin
CreateOpeningBalanceTrx(Sender, RecordIdToMigrate);
end;

internal procedure CreateOpeningBalanceTrx(var Sender: Codeunit "GL Acc. Data Migration Facade"; RecordIdToMigrate: RecordId)
var
SLAccountStaging: Record "SL Account Staging";
SLCompanyAdditionalSettings: Record "SL Company Additional Settings";
begin
if RecordIdToMigrate.TableNo <> Database::"SL Account Staging" then
exit;
if not SLCompanyAdditionalSettings.GetGLModuleEnabled() then
exit;
if SLCompanyAdditionalSettings.GetMigrateOnlyGLMaster() then
exit;

SLAccountStaging.Get(RecordIdToMigrate);
if SLAccountStaging.IncomeBalance then
exit;

CreateGLAccountBeginningBalance(SLAccountStaging);
end;

internal procedure CreateGLAccountBeginningBalance(SLAcccountStaging: Record "SL Account Staging");
var
GenJournalLine: Record "Gen. Journal Line";
GLAccount: Record "G/L Account";
SLAcctHist: Record "SL AcctHist";
SLCompanyAdditionalSettings: Record "SL Company Additional Settings";
SLFiscalPeriods: Record "SL Fiscal Periods";
SLGLSetup: Record "SL GLSetup";
DataMigrationFacadeHelper: Codeunit "Data Migration Facade Helper";
SLPopulateAccountHistory: Codeunit "SL Populate Account History";
PostingGroupCode: Code[10];
SubSegment_1: Code[20];
SubSegment_2: Code[20];
SubSegment_3: Code[20];
SubSegment_4: Code[20];
SubSegment_5: Code[20];
SubSegment_6: Code[20];
SubSegment_7: Code[20];
SubSegment_8: Code[20];
BeginningBalanceDate: Date;
BeginningBalance: Decimal;
InitialYear: Integer;
PreviousYear: Integer;
NbrOfSegments: Integer;
DimSetID: Integer;
BeginningBalancePeriodTxt: Label '-00', Locked = true;
begin
if not GLAccount.Get(SLAcccountStaging.AcctNum) then
exit;
if not SLGLSetup.Get(GLModuleIDLbl) then
exit;

SLCompanyAdditionalSettings.GetSingleInstance();
InitialYear := SLCompanyAdditionalSettings.GetInitialYear();
if InitialYear = 0 then
exit;
PreviousYear := InitialYear - 1;
if SLFiscalPeriods.Get(SLGLSetup.NbrPer, PreviousYear) then
BeginningBalanceDate := SLFiscalPeriods.PerEndDT
else
exit;

NbrOfSegments := SLPopulateAccountHistory.GetNumberOfSegments();

PostingGroupCode := PostingGroupCodeTxt + Format(InitialYear) + BeginningBalancePeriodTxt;
SLAcctHist.SetRange(CpnyID, CompanyName());
SLAcctHist.SetRange(Acct, SLAcccountStaging.AcctNum);
SLAcctHist.SetRange(LedgerID, SLGLSetup.LedgerID);
SLAcctHist.SetRange(FiscYr, Format(InitialYear));

if SLAcctHist.FindSet() then
repeat
if SLAcccountStaging.AccountCategory = 2 then
BeginningBalance := SLAcctHist.BegBal * -1
else
BeginningBalance := SLAcctHist.BegBal;
if BeginningBalance <> 0 then begin
CreateBeginningBalanceGenJournalBatchIfNeeded(PostingGroupCode, InitialYear);
DataMigrationFacadeHelper.CreateGeneralJournalLine(
GenJournalLine,
PostingGroupCode,
PostingGroupCode,
BeginningBalanceDescriptionTxt + Format(InitialYear),
GenJournalLine."Account Type"::"G/L Account",
SLAcccountStaging.AcctNum,
BeginningBalanceDate,
0D,
BeginningBalance,
BeginningBalance,
'',
'');

SubSegment_1 := CopyStr(SLPopulateAccountHistory.GetSubAcctSegmentText(SLAcctHist.Sub, 1, NbrOfSegments), 1, MaxStrLen(SubSegment_1));
SubSegment_2 := CopyStr(SLPopulateAccountHistory.GetSubAcctSegmentText(SLAcctHist.Sub, 2, NbrOfSegments), 1, MaxStrLen(SubSegment_2));
SubSegment_3 := CopyStr(SLPopulateAccountHistory.GetSubAcctSegmentText(SLAcctHist.Sub, 3, NbrOfSegments), 1, MaxStrLen(SubSegment_3));
SubSegment_4 := CopyStr(SLPopulateAccountHistory.GetSubAcctSegmentText(SLAcctHist.Sub, 4, NbrOfSegments), 1, MaxStrLen(SubSegment_4));
SubSegment_5 := CopyStr(SLPopulateAccountHistory.GetSubAcctSegmentText(SLAcctHist.Sub, 5, NbrOfSegments), 1, MaxStrLen(SubSegment_5));
SubSegment_6 := CopyStr(SLPopulateAccountHistory.GetSubAcctSegmentText(SLAcctHist.Sub, 6, NbrOfSegments), 1, MaxStrLen(SubSegment_6));
SubSegment_7 := CopyStr(SLPopulateAccountHistory.GetSubAcctSegmentText(SLAcctHist.Sub, 7, NbrOfSegments), 1, MaxStrLen(SubSegment_7));
SubSegment_8 := CopyStr(SLPopulateAccountHistory.GetSubAcctSegmentText(SLAcctHist.Sub, 8, NbrOfSegments), 1, MaxStrLen(SubSegment_8));

DimSetID := CreateDimSet(SubSegment_1, SubSegment_2, SubSegment_3, SubSegment_4, SubSegment_5, SubSegment_6, SubSegment_7, SubSegment_8);
GenJournalLine.Validate("Dimension Set ID", DimSetID);
GenJournalLine.Modify(true);
end;
until SLAcctHist.Next() = 0;
end;

internal procedure CreateBeginningBalanceGenJournalBatchIfNeeded(GeneralJournalBatchCode: Code[10]; InitialYear: Integer)
var
GenJournalBatch: Record "Gen. Journal Batch";
TemplateName: Code[10];
begin
TemplateName := CreateBeginningBalanceGenJournalTemplateIfNeeded(GeneralJournalBatchCode, InitialYear);
GenJournalBatch.SetRange("Journal Template Name", TemplateName);
GenJournalBatch.SetRange(Name, GeneralJournalBatchCode);
if not GenJournalBatch.FindFirst() then begin
GenJournalBatch.Init();
GenJournalBatch.Validate("Journal Template Name", TemplateName);
GenJournalBatch.SetupNewBatch();
GenJournalBatch.Validate(Name, GeneralJournalBatchCode);
GenJournalBatch.Validate(Description, BeginningBalanceDescriptionTxt + Format(InitialYear));
GenJournalBatch.Insert(true);
end;
end;

internal procedure CreateBeginningBalanceGenJournalTemplateIfNeeded(GenJournalBatchCode: Code[10]; InitialYear: Integer): Code[10]
var
GenJournalTemplate: Record "Gen. Journal Template";
begin
GenJournalTemplate.SetRange(Type, GenJournalTemplate.Type::General);
GenJournalTemplate.SetRange(Recurring, false);
if not GenJournalTemplate.FindFirst() then begin
Clear(GenJournalTemplate);
GenJournalTemplate.Validate(Name, GenJournalBatchCode);
GenJournalTemplate.Validate(Type, GenJournalTemplate.Type::General);
GenJournalTemplate.Validate(Recurring, false);
GenJournalTemplate.Validate(Description, BeginningBalanceDescriptionTxt + Format(InitialYear));
GenJournalTemplate.Insert(true);
end;
exit(GenJournalTemplate.Name);
end;

internal procedure GenerateGLTransactionBatches(SLAccountStaging: Record "SL Account Staging");
var
GenJournalBatch: Record "Gen. Journal Batch";
GenJournalLine: Record "Gen. Journal Line";
SLAccountTransactions: Record "SL AccountTransactions";
SLFiscalPeriods: Record "SL Fiscal Periods";
Expand Down Expand Up @@ -140,14 +291,14 @@ codeunit 47000 "SL Account Migrator"
if SLAccountStaging.AccountCategory = 4 then // Income
SLAccountTransactions.Balance := (-1 * SLAccountTransactions.Balance);

CreateGeneralJournalBatchIfNeeded(CopyStr(PostingGroupCode, 1, 10));
CreateGeneralJournalBatchIfNeeded(CopyStr(PostingGroupCode, 1, MaxStrLen(GenJournalBatch.Name)));
BatchDocumentNo := PostingGroupCodeTxt + GLModuleIDLbl + SLAccountTransactions.Year + PostingGroupPeriod;
BatchDescription := DescriptionTrxTxt + SLAccountTransactions.Year + '-' + PostingGroupPeriod;

if SLFiscalPeriods.Get(SLAccountTransactions.PERIODID, SLAccountTransactions.Year) then
DataMigrationFacadeHelper.CreateGeneralJournalLine(
GenJournalLine,
CopyStr(PostingGroupCode, 1, 10),
CopyStr(PostingGroupCode, 1, MaxStrLen(GenJournalLine."Journal Batch Name")),
CopyStr(BatchDocumentNo, 1, MaxStrLen(BatchDocumentNo)),
CopyStr(BatchDescription, 1, MaxStrLen(BatchDescription)),
GenJournalLine."Account Type"::"G/L Account",
Expand All @@ -168,8 +319,9 @@ codeunit 47000 "SL Account Migrator"
var
GenJournalBatch: Record "Gen. Journal Batch";
TemplateName: Code[10];
GeneralLbl: Label 'GENERAL', Locked = true;
begin
TemplateName := CreateGeneralJournalTemplateIfNeeded('GENERAL');
TemplateName := CreateGeneralJournalTemplateIfNeeded(GeneralLbl);
GenJournalBatch.SetRange("Journal Template Name", TemplateName);
GenJournalBatch.SetRange(Name, GeneralJournalBatchCode);
if not GenJournalBatch.FindFirst() then begin
Expand Down Expand Up @@ -223,25 +375,97 @@ codeunit 47000 "SL Account Migrator"
exit(NewDimSetID);
end;

internal procedure CreateDimSet(SubSegment_1: Code[20]; SubSegment_2: Code[20]; SubSegment_3: Code[20]; SubSegment_4: Code[20]; SubSegment_5: Code[20]; SubSegment_6: Code[20]; SubSegment_7: Code[20]; SubSegment_8: Code[20]): Integer
var
TempDimensionSetEntry: Record "Dimension Set Entry" temporary;
DimensionValue: Record "Dimension Value";
SLSegments: Record "SL Segments";
SLHelperFunctions: Codeunit "SL Helper Functions";
DimensionManagement: Codeunit DimensionManagement;
NewDimSetID: Integer;
begin
if SLSegments.FindSet() then
repeat
if DimensionValue.Get(SLHelperFunctions.CheckDimensionName(SLSegments.Id), GetSegmentValue(SubSegment_1, SubSegment_2, SubSegment_3, SubSegment_4, SubSegment_5, SubSegment_6, SubSegment_7, SubSegment_8, SLSegments.SegmentNumber)) then begin
TempDimensionSetEntry.Init();
TempDimensionSetEntry.Validate("Dimension Code", DimensionValue."Dimension Code");
TempDimensionSetEntry.Validate("Dimension Value Code", DimensionValue.Code);
TempDimensionSetEntry.Validate("Dimension Value ID", DimensionValue."Dimension Value ID");
TempDimensionSetEntry.Insert(true);
end;
until SLSegments.Next() = 0;

NewDimSetID := DimensionManagement.GetDimensionSetID(TempDimensionSetEntry);
TempDimensionSetEntry.DeleteAll();
exit(NewDimSetID);
end;

internal procedure GetSegmentValue(MigrationSlAccountTrans: Record "SL AccountTransactions"; SegmentNumber: Integer): Code[20]
var
SLSegments: Record "SL Segments";
begin
case SegmentNumber of
1:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_1, 1, MaxStrLen(SLSegments.Id)));
2:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_2, 1, MaxStrLen(SLSegments.Id)));
3:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_3, 1, MaxStrLen(SLSegments.Id)));
4:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_4, 1, MaxStrLen(SLSegments.Id)));
5:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_5, 1, MaxStrLen(SLSegments.Id)));
6:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_6, 1, MaxStrLen(SLSegments.Id)));
7:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_7, 1, MaxStrLen(SLSegments.Id)));
8:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_8, 1, MaxStrLen(SLSegments.Id)));
end;
end;

internal procedure GetSegmentValue(SubSegment_1: Code[20]; SubSegment_2: Code[20]; SubSegment_3: Code[20]; SubSegment_4: Code[20]; SubSegment_5: Code[20]; SubSegment_6: Code[20]; SubSegment_7: Code[20]; SubSegment_8: Code[20]; SegmentNumber: Integer): Code[20]
begin
case SegmentNumber of
1:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_1, 1, 20));
exit(SubSegment_1);
2:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_2, 1, 20));
exit(SubSegment_2);
3:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_3, 1, 20));
exit(SubSegment_3);
4:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_4, 1, 20));
exit(SubSegment_4);
5:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_5, 1, 20));
exit(SubSegment_5);
6:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_6, 1, 20));
exit(SubSegment_6);
7:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_7, 1, 20));
exit(SubSegment_7);
8:
exit(CopyStr(MigrationSlAccountTrans.SubSegment_8, 1, 20));
exit(SubSegment_8);
end;
end;

internal procedure AreAllSegmentNumbersEmpty(SubSegment_1: Code[20]; SubSegment_2: Code[20]; SubSegment_3: Code[20]; SubSegment_4: Code[20]; SubSegment_5: Code[20]; SubSegment_6: Code[20]; SubSegment_7: Code[20]; SubSegment_8: Code[20]): Boolean
begin
exit(
CodeIsEmpty(SubSegment_1) and
CodeIsEmpty(SubSegment_2) and
CodeIsEmpty(SubSegment_3) and
CodeIsEmpty(SubSegment_4) and
CodeIsEmpty(SubSegment_5) and
CodeIsEmpty(SubSegment_6) and
CodeIsEmpty(SubSegment_7) and
CodeIsEmpty(SubSegment_8)
);
end;

internal procedure CodeIsEmpty(TheCode: Code[20]): Boolean
var
CodeText: Text[20];
begin
CodeText := TheCode;
CodeText := CopyStr(CodeText.Trim(), 1, MaxStrLen(CodeText));
exit(CodeText = '');
end;
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,13 +55,13 @@ codeunit 47019 "SL Populate Accounts"
begin
case (SLAccountType.Trim().Substring(2, 1)) of
'A':
exit(true);
exit(false);
'L':
exit(true);
'I':
exit(false);
'I':
exit(true);
'E':
exit(false);
exit(true);
end;
end;
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ codeunit 47003 "SL Populate Fiscal Periods"
FPDateBeg: Date;
FPDateEnd: Date;
CurFiscalYear: Integer;
PrevFiscalYear: Integer;
FirstFiscalYear: Integer;
Index: Integer;
IndexYear: Integer;
Expand All @@ -47,8 +46,6 @@ codeunit 47003 "SL Populate Fiscal Periods"
SLGLSetup.Reset();
if SLGLSetup.FindFirst() then begin
Evaluate(CurFiscalYear, CopyStr(SLGLSetup.PerNbr, 1, YearLength));
Evaluate(PrevFiscalYear, CopyStr(SLGLSetup.PerNbr, 1, YearLength));
PrevFiscalYear := PrevFiscalYear - 1;
NumberOfPeriods := SLGLSetup.NbrPer;
BeginFiscalYear := SLGLSetup.BegFiscalYr;
FiscalPerEnd00 := SLGLSetup.FiscalPerEnd00;
Expand Down
Loading
Loading