Codeunit 5632 FA Jnl.-Post Line

App
Base Application
Namespace
Microsoft.FixedAssets.Posting
Versions
17-28

Procedures, 8Events, 34

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/FixedAssets/FixedAsset/FAJnlPostLine.Codeunit.al777 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.FixedAssets.Posting;

using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Finance.VAT.Calculation;
using Microsoft.FixedAssets.Depreciation;
using Microsoft.FixedAssets.FixedAsset;
using Microsoft.FixedAssets.Insurance;
using Microsoft.FixedAssets.Journal;
using Microsoft.FixedAssets.Ledger;
using Microsoft.FixedAssets.Maintenance;

codeunit 5632 "FA Jnl.-Post Line"
{
    Permissions = TableData "FA Ledger Entry" = r,
                  TableData "FA Register" = rm,
                  TableData "Maintenance Ledger Entry" = r,
                  TableData "Ins. Coverage Ledger Entry" = r;

    trigger OnRun()
    begin
    end;

    var
        FA: Record "Fixed Asset";
        FA2: Record "Fixed Asset";
        DeprBook: Record "Depreciation Book";
        FADeprBook: Record "FA Depreciation Book";
        FALedgEntry: Record "FA Ledger Entry";
        MaintenanceLedgEntry: Record "Maintenance Ledger Entry";
        FAInsertLedgEntry: Codeunit "FA Insert Ledger Entry";
        FAJnlCheckLine: Codeunit "FA Jnl.-Check Line";
        DuplicateDeprBook: Codeunit "Duplicate Depr. Book";
        CalculateDisposal: Codeunit "Calculate Disposal";
        CalculateDepr: Codeunit "Calculate Depreciation";
        CalculateAcqCostDepr: Codeunit "Calculate Acq. Cost Depr.";
        MakeFALedgEntry: Codeunit "Make FA Ledger Entry";
        MakeMaintenanceLedgEntry: Codeunit "Make Maintenance Ledger Entry";
        NonDeductibleVAT: Codeunit "Non-Deductible VAT";
        FANo: Code[20];
        BudgetNo: Code[20];
        DeprBookCode: Code[10];
        FAPostingType: Enum "FA Journal Line FA Posting Type";
        FAPostingDate: Date;
        Amount2: Decimal;
        SalvageValue: Decimal;
        DeprUntilDate: Boolean;
        DeprAcqCost: Boolean;
        ErrorEntryNo: Integer;
        ResultOnDisposal: Integer;

#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label '%2 must not be %3 in %4 %5 = %6 for %1.';
        Text001: Label '%2 = %3 must be canceled first for %1.';
        Text002: Label '%1 is not a %2.';
        Text003: Label '%1 = %2 already exists for %5 (%3 = %4).';
#pragma warning restore AA0470
#pragma warning restore AA0074

    procedure FAJnlPostLine(FAJnlLine: Record "FA Journal Line"; CheckLine: Boolean)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFAJnlPostLine(FAJnlLine, FAInsertLedgEntry, CheckLine, IsHandled);
        if not IsHandled then begin
            FAInsertLedgEntry.SetGLRegisterNo(0);
            if FAJnlLine."FA No." = '' then
                exit;
            if FAJnlLine."Posting Date" = 0D then
                FAJnlLine."Posting Date" := FAJnlLine."FA Posting Date";
            if CheckLine then
                FAJnlCheckLine.CheckFAJnlLine(FAJnlLine);
            DuplicateDeprBook.DuplicateFAJnlLine(FAJnlLine);
            FANo := FAJnlLine."FA No.";
            BudgetNo := FAJnlLine."Budgeted FA No.";
            DeprBookCode := FAJnlLine."Depreciation Book Code";
            FAPostingType := FAJnlLine."FA Posting Type";
            FAPostingDate := FAJnlLine."FA Posting Date";
            Amount2 := FAJnlLine.Amount;
            SalvageValue := FAJnlLine."Salvage Value";
            DeprUntilDate := FAJnlLine."Depr. until FA Posting Date";
            DeprAcqCost := FAJnlLine."Depr. Acquisition Cost";
            ErrorEntryNo := FAJnlLine."FA Error Entry No.";
            if FAJnlLine."FA Posting Type" = FAJnlLine."FA Posting Type"::Maintenance then begin
                MakeMaintenanceLedgEntry.CopyFromFAJnlLine(MaintenanceLedgEntry, FAJnlLine);
                PostMaintenance();
            end else begin
                MakeFALedgEntry.CopyFromFAJnlLine(FALedgEntry, FAJnlLine);
                PostFixedAsset();
            end;
        end;

        OnAfterFAJnlPostLine(FAJnlLine);
    end;

    procedure GenJnlPostLine(GenJnlLine: Record "Gen. Journal Line"; FAAmount: Decimal; VATAmount: Decimal; NextTransactionNo: Integer; NextGLEntryNo: Integer; GLRegisterNo: Integer)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGenJnlPostLine(GenJnlLine, FAInsertLedgEntry, FAAmount, VATAmount, NextTransactionNo, NextGLEntryNo, GLRegisterNo, IsHandled);
        if not IsHandled then begin
            FAInsertLedgEntry.SetGLRegisterNo(GLRegisterNo);
            FAInsertLedgEntry.DeleteAllGLAcc();
            if GenJnlLine."Account No." = '' then
                exit;
            if GenJnlLine."FA Posting Date" = 0D then
                GenJnlLine."FA Posting Date" := GenJnlLine."Posting Date";
            if GenJnlLine."Journal Template Name" = '' then
                GenJnlLine.Quantity := 0;
            DuplicateDeprBook.DuplicateGenJnlLine(GenJnlLine, FAAmount);
            FANo := GenJnlLine."Account No.";
            BudgetNo := GenJnlLine."Budgeted FA No.";
            DeprBookCode := GenJnlLine."Depreciation Book Code";
            FAPostingType := Enum::"FA Journal Line FA Posting Type".FromInteger(GenJnlLine."FA Posting Type".AsInteger() - 1);
            FAPostingDate := GenJnlLine."FA Posting Date";
            Amount2 := FAAmount;
            SalvageValue := GenJnlLine.ConvertAmtFCYToLCYForSourceCurrency(GenJnlLine."Salvage Value");
            DeprUntilDate := GenJnlLine."Depr. until FA Posting Date";
            DeprAcqCost := GenJnlLine."Depr. Acquisition Cost";
            ErrorEntryNo := GenJnlLine."FA Error Entry No.";
            if GenJnlLine."FA Posting Type" = GenJnlLine."FA Posting Type"::Maintenance then begin
                MakeMaintenanceLedgEntry.CopyFromGenJnlLine(MaintenanceLedgEntry, GenJnlLine);
                MaintenanceLedgEntry.Amount := FAAmount;
                MaintenanceLedgEntry."VAT Amount" := VATAmount;
                MaintenanceLedgEntry."Transaction No." := NextTransactionNo;
                MaintenanceLedgEntry."G/L Entry No." := NextGLEntryNo;
                OnBeforePostMaintenanceFromGenJnlLine(GenJnlLine, FALedgEntry, FAAmount, VATAmount);
                PostMaintenance();
            end else begin
                MakeFALedgEntry.CopyFromGenJnlLine(FALedgEntry, GenJnlLine);
                FALedgEntry.Amount := FAAmount;
                FALedgEntry."VAT Amount" := VATAmount;
                FALedgEntry."Transaction No." := NextTransactionNo;
                FALedgEntry."G/L Entry No." := NextGLEntryNo;
                OnBeforePostFixedAssetFromGenJnlLine(GenJnlLine, FALedgEntry, FAAmount, VATAmount, GLRegisterNo);
                PostFixedAsset();
            end;

            FAInsertLedgEntry.CopyRecordLinksToFALedgEntry(GenJnlLine);
        end;

        OnAfterGenJnlPostLine(GenJnlLine);
    end;

    local procedure PostFixedAsset()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePostFixedAsset(FANo, DeprBookCode, FAPostingType, FALedgEntry, IsHandled);
        if IsHandled then
            exit;

        FA.LockTable();
        DeprBook.Get(DeprBookCode);
        FA.Get(FANo);
        IsHandled := false;
        OnPostFixedAssetOnBeforeFixedAssetTestField(FALedgEntry, Amount2, IsHandled);
        if not IsHandled then begin
            FA.TestField(Blocked, false);
            FA.TestField(Inactive, false);
        end;
        FADeprBook.Get(FANo, DeprBookCode);
        MakeFALedgEntry.CopyFromFACard(FALedgEntry, FA, FADeprBook);
        FAInsertLedgEntry.SetLastEntryNo(true);
        if (FALedgEntry."FA Posting Group" = '') and (FALedgEntry."G/L Entry No." > 0) then begin
            FADeprBook.TestField("FA Posting Group");
            FALedgEntry."FA Posting Group" := FADeprBook."FA Posting Group";
        end;
        if DeprUntilDate then
            PostDeprUntilDate(FALedgEntry, 0);
        if FAPostingType = FAPostingType::Disposal then
            PostDisposalEntry(FALedgEntry)
        else begin
            IsHandled := false;
            OnPostFixedAssetPostDisposalEntryForOtherFAPostingType(FAPostingType, IsHandled);
            if IsHandled then
                PostDisposalEntry(FALedgEntry)
            else begin
                if PostBudget() then
                    SetBudgetAssetNo();
                if not DeprLine() then begin
                    OnPostFixedAssetOnBeforeInsertEntry(FALedgEntry);
                    FAInsertLedgEntry.SetOrgGenJnlLine(true);
                    FAInsertLedgEntry.InsertFA(FALedgEntry);
                    FAInsertLedgEntry.SetOrgGenJnlLine(false);
                end;
                PostSalvageValue(FALedgEntry);
            end;
        end;
        if DeprAcqCost then
            PostDeprUntilDate(FALedgEntry, 1);
        FAInsertLedgEntry.SetLastEntryNo(false);
        if PostBudget() then
            PostBudgetAsset();

        OnAfterPostFixedAsset(FA, FALedgEntry);
    end;

    local procedure PostMaintenance()
    begin
        FA.LockTable();
        DeprBook.Get(DeprBookCode);
        FA.Get(FANo);
        FADeprBook.Get(FANo, DeprBookCode);
        MakeMaintenanceLedgEntry.CopyFromFACard(MaintenanceLedgEntry, FA, FADeprBook);
        if not DeprBook."Allow Identical Document No." and (MaintenanceLedgEntry."Journal Batch Name" <> '') then
            CheckMaintDocNo(MaintenanceLedgEntry);
        if (MaintenanceLedgEntry."FA Posting Group" = '') and (MaintenanceLedgEntry."G/L Entry No." > 0) then begin
            FADeprBook.TestField("FA Posting Group");
            MaintenanceLedgEntry."FA Posting Group" := FADeprBook."FA Posting Group";
        end;
        if PostBudget() then
            SetBudgetAssetNo();
        OnPostMaintenanceOnBeforeInsertEntry(MaintenanceLedgEntry);
        FAInsertLedgEntry.SetOrgGenJnlLine(true);
        FAInsertLedgEntry.InsertMaintenance(MaintenanceLedgEntry);
        FAInsertLedgEntry.SetOrgGenJnlLine(false);
        if PostBudget() then
            PostBudgetAsset();
    end;

    local procedure PostDisposalEntry(var FALedgEntry: Record "FA Ledger Entry")
    var
        MaxDisposalNo: Integer;
        SalesEntryNo: Integer;
        DisposalType: Option FirstDisposal,SecondDisposal,ErrorDisposal,LastErrorDisposal;
        OldDisposalMethod: Option " ",Net,Gross;
        EntryAmounts: array[14] of Decimal;
        EntryNumbers: array[14] of Integer;
        i: Integer;
        j: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePostDisposalEntry(FALedgEntry, DeprBook, FANo, ErrorEntryNo, IsHandled, FAInsertLedgEntry);
        if IsHandled then
            exit;

        FALedgEntry."Disposal Calculation Method" := DeprBook."Disposal Calculation Method" + 1;
        CalculateDisposal.GetDisposalType(
          FANo, DeprBookCode, ErrorEntryNo, DisposalType,
          OldDisposalMethod, MaxDisposalNo, SalesEntryNo);
        if (MaxDisposalNo > 0) and
           (FALedgEntry."Disposal Calculation Method" <> OldDisposalMethod)
        then
            Error(
              Text000,
              FAName(), DeprBook.FieldCaption("Disposal Calculation Method"), FALedgEntry."Disposal Calculation Method",
              DeprBook.TableCaption(), DeprBook.FieldCaption(Code), DeprBook.Code);
        if ErrorEntryNo = 0 then
            FALedgEntry."Disposal Entry No." := MaxDisposalNo + 1
        else
            if SalesEntryNo <> ErrorEntryNo then
                Error(Text001,
                  FAName(), FALedgEntry.FieldCaption("Disposal Entry No."), MaxDisposalNo);
        if DisposalType = DisposalType::FirstDisposal then
            PostReverseType(FALedgEntry);
        if DeprBook."Disposal Calculation Method" = DeprBook."Disposal Calculation Method"::Gross then
            FAInsertLedgEntry.SetOrgGenJnlLine(true);
        FAInsertLedgEntry.InsertFA(FALedgEntry);
        FAInsertLedgEntry.SetOrgGenJnlLine(false);
        FALedgEntry."Automatic Entry" := true;
        FAInsertLedgEntry.SetNetdisposal(false);
        if (DeprBook."Disposal Calculation Method" =
            DeprBook."Disposal Calculation Method"::Net) and
           DeprBook."VAT on Net Disposal Entries"
        then
            FAInsertLedgEntry.SetNetdisposal(true);

        if DisposalType = DisposalType::FirstDisposal then begin
            CalculateDisposal.CalcGainLoss(FANo, DeprBookCode, EntryAmounts);
            for i := 1 to 14 do
                if EntryAmounts[i] <> 0 then begin
                    FALedgEntry."FA Posting Category" := CalculateDisposal.SetFALedgerPostingCategory(i);
                    FALedgEntry."FA Posting Type" := "FA Ledger Entry FA Posting Type".FromInteger(CalculateDisposal.SetFAPostingType(i));
                    FALedgEntry.Amount := EntryAmounts[i];
                    if i = 1 then
                        FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::Gain;
                    if i = 2 then
                        FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::Loss;
                    if i > 2 then
                        FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::" ";
                    if i = 10 then
                        SetResultOnDisposal(FALedgEntry);
                    FAInsertLedgEntry.InsertFA(FALedgEntry);
                    PostAllocation(FALedgEntry);
                end;
        end;
        if DisposalType = DisposalType::SecondDisposal then begin
            CalculateDisposal.CalcSecondGainLoss(FANo, DeprBookCode, FALedgEntry.Amount, EntryAmounts);
            for i := 1 to 2 do
                if EntryAmounts[i] <> 0 then begin
                    FALedgEntry."FA Posting Category" := CalculateDisposal.SetFALedgerPostingCategory(i);
                    FALedgEntry."FA Posting Type" := "FA Ledger Entry FA Posting Type".FromInteger(CalculateDisposal.SetFAPostingType(i));
                    FALedgEntry.Amount := EntryAmounts[i];
                    if i = 1 then
                        FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::Gain;
                    if i = 2 then
                        FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::Loss;
                    FAInsertLedgEntry.InsertFA(FALedgEntry);
                    PostAllocation(FALedgEntry);
                end;
        end;
        if DisposalType in
           [DisposalType::ErrorDisposal, DisposalType::LastErrorDisposal]
        then begin
            CalculateDisposal.GetErrorDisposal(
              FANo, DeprBookCode, DisposalType = DisposalType::ErrorDisposal, MaxDisposalNo,
              EntryAmounts, EntryNumbers);
            if DisposalType = DisposalType::ErrorDisposal then
                j := 2
            else begin
                j := 14;
                ResultOnDisposal := CalcResultOnDisposal(FANo, DeprBookCode);
            end;
            for i := 1 to j do
                if EntryNumbers[i] <> 0 then begin
                    FALedgEntry.Amount := EntryAmounts[i];
                    FALedgEntry."Entry No." := EntryNumbers[i];
                    FALedgEntry."FA Posting Category" := CalculateDisposal.SetFALedgerPostingCategory(i);
                    FALedgEntry."FA Posting Type" := "FA Ledger Entry FA Posting Type".FromInteger(CalculateDisposal.SetFAPostingType(i));
                    if i = 1 then
                        FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::Gain;
                    if i = 2 then
                        FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::Loss;
                    if i > 2 then
                        FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::" ";
                    if i = 10 then
                        FALedgEntry."Result on Disposal" := ResultOnDisposal;
                    FAInsertLedgEntry.InsertFA(FALedgEntry);
                    PostAllocation(FALedgEntry);
                end;
        end;
        OnPostDisposalEntryOnAfterPostDisposalType(FAInsertLedgEntry, FALedgEntry, DisposalType, EntryAmounts);
        FAInsertLedgEntry.CorrectEntries();
        FAInsertLedgEntry.SetNetdisposal(false);

        OnAfterPostDisposalEntry(FALedgEntry, DeprBook, FANo, FAInsertLedgEntry);
    end;

    local procedure PostDeprUntilDate(FALedgEntry: Record "FA Ledger Entry"; Type: Option UntilDate,AcqCost)
    var
        DepreciationAmount: Decimal;
        Custom1Amount: Decimal;
        NumberOfDays: Integer;
        Custom1NumberOfDays: Integer;
        DummyEntryAmounts: array[4] of Decimal;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforePostDeprUntilDate(FALedgEntry, FAPostingDate, Type, IsHandled);
        if IsHandled then
            exit;
        if NonDeductibleVAT.IsNonDedFALedgEntryInFirstAcquisition(FALedgEntry) then
            exit;
        FALedgEntry."Automatic Entry" := true;
        FALedgEntry."FA No./Budgeted FA No." := '';
        FALedgEntry."FA Posting Category" := FALedgEntry."FA Posting Category"::" ";
        FALedgEntry."No. of Depreciation Days" := 0;
        if Type = Type::UntilDate then
            CalculateDepr.Calculate(
              DepreciationAmount, Custom1Amount, NumberOfDays, Custom1NumberOfDays,
              FANo, DeprBookCode, FAPostingDate, DummyEntryAmounts, 0D, 0)
        else
            CalculateAcqCostDepr.DeprCalc(
              DepreciationAmount, Custom1Amount, FANo, DeprBookCode,
              Amount2 + SalvageValue, Amount2);
        if Custom1Amount <> 0 then begin
            FALedgEntry."FA Posting Type" := FALedgEntry."FA Posting Type"::"Custom 1";
            FALedgEntry.Amount := Custom1Amount;
            FALedgEntry."No. of Depreciation Days" := Custom1NumberOfDays;
            FAInsertLedgEntry.InsertFA(FALedgEntry);
            if FALedgEntry."G/L Entry No." > 0 then
                FAInsertLedgEntry.InsertBalAcc(FALedgEntry);
        end;
        if DepreciationAmount <> 0 then begin
            FALedgEntry."FA Posting Type" := FALedgEntry."FA Posting Type"::Depreciation;
            FALedgEntry.Amount := DepreciationAmount;
            FALedgEntry."No. of Depreciation Days" := NumberOfDays;
            FAInsertLedgEntry.InsertFA(FALedgEntry);
            if FALedgEntry."G/L Entry No." > 0 then
                FAInsertLedgEntry.InsertBalAcc(FALedgEntry);
        end;
    end;

    local procedure PostSalvageValue(FALedgEntry: Record "FA Ledger Entry")
    begin
        if (SalvageValue = 0) or (FAPostingType <> FAPostingType::"Acquisition Cost") then
            exit;
        FALedgEntry."Entry No." := 0;
        FALedgEntry."Automatic Entry" := true;
        FALedgEntry.Amount := SalvageValue;
        FALedgEntry."FA Posting Type" := FALedgEntry."FA Posting Type"::"Salvage Value";
        OnPostSalvageValueOnBeforeInsertEntry(FALedgEntry);
        FAInsertLedgEntry.InsertFA(FALedgEntry);
    end;

    local procedure PostBudget(): Boolean
    begin
        exit(BudgetNo <> '');
    end;

    local procedure SetBudgetAssetNo()
    begin
        FA2.Get(BudgetNo);
        if not FA2."Budgeted Asset" then begin
            FA."No." := FA2."No.";
            DeprBookCode := '';
            Error(Text002, FAName(), FA.FieldCaption("Budgeted Asset"));
        end;
        if FAPostingType = FAPostingType::Maintenance then
            MaintenanceLedgEntry."FA No./Budgeted FA No." := BudgetNo
        else
            FALedgEntry."FA No./Budgeted FA No." := BudgetNo;
    end;

    local procedure PostBudgetAsset()
    var
        FA2: Record "Fixed Asset";
        FAPostingType2: Enum "FA Ledger Entry FA Posting Type";
        IsHandled: Boolean;
        SkipTestFieldsBlockedAndInactive: Boolean;
    begin
        IsHandled := false;
        OnBeforePostBudgetAsset(FALedgEntry, BudgetNo, IsHandled);
        if IsHandled then
            exit;

        FA2.Get(BudgetNo);
        SkipTestFieldsBlockedAndInactive := false;
        OnPostBudgetAssetOnBeforeFixedAssetTestField(FALedgEntry, BudgetNo, SkipTestFieldsBlockedAndInactive);
        if not SkipTestFieldsBlockedAndInactive then begin
            FA2.TestField(Blocked, false);
            FA2.TestField(Inactive, false);
        end;
        if FAPostingType = FAPostingType::Maintenance then begin
            MaintenanceLedgEntry."Automatic Entry" := true;
            MaintenanceLedgEntry."G/L Entry No." := 0;
            MaintenanceLedgEntry."FA No./Budgeted FA No." := MaintenanceLedgEntry."FA No.";
            MaintenanceLedgEntry."FA No." := BudgetNo;
            MaintenanceLedgEntry.Amount := -Amount2;
            OnPostBudgetAssetOnBeforeInsertMaintenanceLedgEntry(MaintenanceLedgEntry);
            FAInsertLedgEntry.InsertMaintenance(MaintenanceLedgEntry);
        end else begin
            FALedgEntry."Automatic Entry" := true;
            FALedgEntry."G/L Entry No." := 0;
            FALedgEntry."FA No./Budgeted FA No." := FALedgEntry."FA No.";
            FALedgEntry."FA No." := BudgetNo;
            if SalvageValue <> 0 then begin
                FALedgEntry.Amount := -SalvageValue;
                FAPostingType2 := FALedgEntry."FA Posting Type";
                FALedgEntry."FA Posting Type" := FALedgEntry."FA Posting Type"::"Salvage Value";
                FAInsertLedgEntry.InsertFA(FALedgEntry);
                FALedgEntry."FA Posting Type" := FAPostingType2;
            end;
            FALedgEntry.Amount := -Amount2;
            OnPostBudgetAssetOnBeforeInsertFAEntry(FALedgEntry);
            FAInsertLedgEntry.InsertFA(FALedgEntry);
        end;
    end;

    procedure PostReverseType(FALedgEntry: Record "FA Ledger Entry")
    var
        EntryAmounts: array[4] of Decimal;
        i: Integer;
    begin
        OnBeforePostReverseType(FALedgEntry);
        CalculateDisposal.CalcReverseAmounts(FANo, DeprBookCode, EntryAmounts);
        FALedgEntry."FA Posting Category" := FALedgEntry."FA Posting Category"::" ";
        FALedgEntry."Automatic Entry" := true;
        for i := 1 to 4 do
            if EntryAmounts[i] <> 0 then begin
                FALedgEntry.Amount := EntryAmounts[i];
                FALedgEntry."FA Posting Type" := "FA Ledger Entry FA Posting Type".FromInteger(CalculateDisposal.SetReverseType(i));
                FAInsertLedgEntry.InsertFA(FALedgEntry);
                if FALedgEntry."G/L Entry No." > 0 then
                    FAInsertLedgEntry.InsertBalAcc(FALedgEntry);
            end;
    end;

    procedure PostGLBalAcc(FALedgEntry: Record "FA Ledger Entry"; AllocatedPct: Decimal)
    begin
        OnBeforePostGLBalAcc(FALedgEntry, AllocatedPct);
        if AllocatedPct > 0 then begin
            FALedgEntry."Entry No." := 0;
            FALedgEntry."Automatic Entry" := true;
            FALedgEntry.Amount := -FALedgEntry.Amount;
            FALedgEntry.Correction := not FALedgEntry.Correction;
            FAInsertLedgEntry.InsertBalDisposalAcc(FALedgEntry);
            FALedgEntry.Correction := not FALedgEntry.Correction;
            FAInsertLedgEntry.InsertBalAcc(FALedgEntry);
        end;
    end;

    local procedure PostAllocation(var FALedgEntry: Record "FA Ledger Entry")
    var
        FAPostingGr: Record "FA Posting Group";
        IsHandled: Boolean;
    begin
        OnBeforePostAllocation(FALedgEntry, IsHandled);
        if IsHandled then
            exit;

        if FALedgEntry."G/L Entry No." = 0 then
            exit;
        case FALedgEntry."FA Posting Type" of
            FALedgEntry."FA Posting Type"::"Gain/Loss":
                if DeprBook."Disposal Calculation Method" = DeprBook."Disposal Calculation Method"::Net then begin
                    FAPostingGr.GetPostingGroup(FALedgEntry."FA Posting Group", DeprBook.Code);
                    FAPostingGr.CalcFields("Allocated Gain %", "Allocated Loss %");
                    if FALedgEntry."Result on Disposal" = FALedgEntry."Result on Disposal"::Gain then
                        PostGLBalAcc(FALedgEntry, FAPostingGr."Allocated Gain %")
                    else
                        PostGLBalAcc(FALedgEntry, FAPostingGr."Allocated Loss %");
                end;
            FALedgEntry."FA Posting Type"::"Book Value on Disposal":
                begin
                    FAPostingGr.GetPostingGroup(FALedgEntry."FA Posting Group", DeprBook.Code);
                    FAPostingGr.CalcFields("Allocated Book Value % (Gain)", "Allocated Book Value % (Loss)");
                    if FALedgEntry."Result on Disposal" = FALedgEntry."Result on Disposal"::Gain then
                        PostGLBalAcc(FALedgEntry, FAPostingGr."Allocated Book Value % (Gain)")
                    else
                        PostGLBalAcc(FALedgEntry, FAPostingGr."Allocated Book Value % (Loss)");
                end;
        end;
        OnAfterPostAllocation(FALedgEntry);
    end;

    local procedure DeprLine(): Boolean
    var
        IsHandled: Boolean;
        Result: Boolean;
    begin
        IsHandled := false;
        Result := false;
        OnBeforeDeprLine(FAPostingType, DeprUntilDate, Amount2, IsHandled, Result);
        if IsHandled then
            exit(Result);
        exit((Amount2 = 0) and (FAPostingType = FAPostingType::Depreciation) and DeprUntilDate);
    end;

    procedure FindFirstGLAcc(var FAGLPostBuf: Record "FA G/L Posting Buffer"): Boolean
    begin
        exit(FAInsertLedgEntry.FindFirstGLAcc(FAGLPostBuf));
    end;

    procedure GetNextGLAcc(var FAGLPostBuf: Record "FA G/L Posting Buffer"): Integer
    begin
        exit(FAInsertLedgEntry.GetNextGLAcc(FAGLPostBuf));
    end;

    local procedure FAName(): Text[200]
    var
        DepreciationCalc: Codeunit "Depreciation Calculation";
    begin
        exit(DepreciationCalc.FAName(FA, DeprBookCode));
    end;

    procedure SetResultOnDisposal(var FALedgEntry: Record "FA Ledger Entry")
    var
        FADeprBook: Record "FA Depreciation Book";
    begin
        FADeprBook."FA No." := FALedgEntry."FA No.";
        FADeprBook."Depreciation Book Code" := FALedgEntry."Depreciation Book Code";
        FADeprBook.CalcFields("Gain/Loss");
        OnSetResultOnDisposalOnAfterCalcGainLoss(FADeprBook);
        if FADeprBook."Gain/Loss" <= 0 then
            FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::Gain
        else
            FALedgEntry."Result on Disposal" := FALedgEntry."Result on Disposal"::Loss;
    end;

    local procedure CalcResultOnDisposal(FANo: Code[20]; DeprBookCode: Code[10]): Integer
    var
        FADeprBook: Record "FA Depreciation Book";
        FALedgEntry: Record "FA Ledger Entry";
    begin
        FADeprBook."FA No." := FANo;
        FADeprBook."Depreciation Book Code" := DeprBookCode;
        FADeprBook.CalcFields("Gain/Loss");
        OnCalcResultOnDisposalOnAfterCalcGainLoss(FADeprBook);
        if FADeprBook."Gain/Loss" <= 0 then
            exit(FALedgEntry."Result on Disposal"::Gain);

        exit(FALedgEntry."Result on Disposal"::Loss);
    end;

    local procedure CheckMaintDocNo(MaintenanceLedgEntry: Record "Maintenance Ledger Entry")
    var
        OldMaintenanceLedgEntry: Record "Maintenance Ledger Entry";
        FAJnlLine2: Record "FA Journal Line";
    begin
        OldMaintenanceLedgEntry.SetCurrentKey("FA No.", "Depreciation Book Code", "Document No.");
        OldMaintenanceLedgEntry.SetRange("FA No.", MaintenanceLedgEntry."FA No.");
        OldMaintenanceLedgEntry.SetRange("Depreciation Book Code", MaintenanceLedgEntry."Depreciation Book Code");
        OldMaintenanceLedgEntry.SetRange("Document No.", MaintenanceLedgEntry."Document No.");
        if OldMaintenanceLedgEntry.FindFirst() then begin
            FAJnlLine2."FA Posting Type" := FAJnlLine2."FA Posting Type"::Maintenance;
            Error(
              Text003,
              OldMaintenanceLedgEntry.FieldCaption("Document No."),
              OldMaintenanceLedgEntry."Document No.",
              FAJnlLine2.FieldCaption("FA Posting Type"),
              FAJnlLine2."FA Posting Type",
              FAName());
        end;
    end;

    procedure UpdateRegNo(GLRegNo: Integer)
    var
        FAReg: Record "FA Register";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateRegNo(GLRegNo, IsHandled);
        if IsHandled then
            exit;
        if FAReg.FindLast() then begin
            FAReg."G/L Register No." := GLRegNo;
            FAReg.Modify();
        end;
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterFAJnlPostLine(var FAJournalLine: Record "FA Journal Line")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterGenJnlPostLine(var GenJournalLine: Record "Gen. Journal Line")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterPostDisposalEntry(var FALedgEntry: Record "FA Ledger Entry"; DeprBook: Record "Depreciation Book"; FANo: Code[20]; var FAInsertLedgEntry: Codeunit "FA Insert Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPostFixedAsset(var FA: Record "Fixed Asset"; FALedgEntry: Record "FA Ledger Entry")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeFAJnlPostLine(var FAJournalLine: Record "FA Journal Line"; var FAInsertLedgerEntry: Codeunit "FA Insert Ledger Entry"; CheckLine: Boolean; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeGenJnlPostLine(var GenJournalLine: Record "Gen. Journal Line"; var FAInsertLedgerEntry: Codeunit "FA Insert Ledger Entry"; FAAmount: Decimal; VATAmount: Decimal; NextTransactionNo: Integer; NextGLEntryNo: Integer; GLRegisterNo: Integer; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforePostAllocation(var FALedgEntry: Record "FA Ledger Entry"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostBudgetAsset(var FALedgerEntry: Record "FA Ledger Entry"; BudgetNo: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostReverseType(var FALedgEntry: Record "FA Ledger Entry")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforePostDeprUntilDate(var FALedgEntry: Record "FA Ledger Entry"; var FAPostingDate: Date; Type: Option; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforePostDisposalEntry(var FALedgEntry: Record "FA Ledger Entry"; DeprBook: Record "Depreciation Book"; FANo: Code[20]; ErrorEntryNo: Integer; var IsHandled: Boolean; var FAInsertLedgEntry: Codeunit "FA Insert Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostFixedAsset(FANo: Code[20]; DeprBookCode: Code[10]; FAPostingType: Enum "FA Journal Line FA Posting Type"; FALedgEntry: Record "FA Ledger Entry"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostMaintenanceFromGenJnlLine(var GenJournalLine: Record "Gen. Journal Line"; var FALedgerEntry: Record "FA Ledger Entry"; FAAmount: Decimal; VATAmount: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostFixedAssetFromGenJnlLine(var GenJournalLine: Record "Gen. Journal Line"; var FALedgerEntry: Record "FA Ledger Entry"; FAAmount: Decimal; VATAmount: Decimal; GLRegisterNo: Integer)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostFixedAssetOnBeforeInsertEntry(var FALedgEntry: Record "FA Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostSalvageValueOnBeforeInsertEntry(var FALedgEntry: Record "FA Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostMaintenanceOnBeforeInsertEntry(var MaintenanceLedgEntry: Record "Maintenance Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostBudgetAssetOnBeforeFixedAssetTestField(var FALedgEntry: Record "FA Ledger Entry"; BudgetNo: Code[20]; var SkipTestFieldsBlockedAndInactive: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostBudgetAssetOnBeforeInsertMaintenanceLedgEntry(var MaintenanceLedgEntry: Record "Maintenance Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostBudgetAssetOnBeforeInsertFAEntry(var FALedgEntry: Record "FA Ledger Entry")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterPostAllocation(var FALedgerEntry: Record "FA Ledger Entry");
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforePostGLBalAcc(FALedgerEntry: Record "FA Ledger Entry"; var AllocatedPct: Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostFixedAssetPostDisposalEntryForOtherFAPostingType(FAPostingType: Enum "FA Journal Line FA Posting Type"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeDeprLine(FAPostingType: Enum "FA Journal Line FA Posting Type"; DeprUntilDate: Boolean; Amount2: Decimal; var IsHandled: Boolean; var Result: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateRegNo(GLRegNo: Integer; var IsHandled: Boolean);
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostFixedAssetOnBeforeFixedAssetTestField(FALedgerEntry: Record "FA Ledger Entry"; Amount2: Decimal; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnPostDisposalEntryOnAfterPostDisposalType(var FAInsertLedgerEntry: Codeunit "FA Insert Ledger Entry"; var FALedgerEntry: Record "FA Ledger Entry"; DisposalType: Option; EntryAmounts: array[14] of Decimal)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnSetResultOnDisposalOnAfterCalcGainLoss(var FADepreciationBook: Record "FA Depreciation Book")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCalcResultOnDisposalOnAfterCalcGainLoss(var FADepreciationBook: Record "FA Depreciation Book")
    begin
    end;
}