Table 5612 FA Depreciation Book

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

Fields, 66Keys, 4Procedures, 23Events, 26

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/FixedAssets/Depreciation/FADepreciationBook.Table.al1591 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.Depreciation;

using Microsoft.Finance.GeneralLedger.Setup;
using Microsoft.FixedAssets.FixedAsset;
using Microsoft.FixedAssets.Ledger;
using Microsoft.FixedAssets.Maintenance;
using Microsoft.FixedAssets.Setup;
using System.Telemetry;

table 5612 "FA Depreciation Book"
{
    Caption = 'FA Depreciation Book';
    Permissions = TableData "FA Ledger Entry" = r,
                  TableData "Maintenance Ledger Entry" = r;
    DataClassification = CustomerContent;

    fields
    {
        field(1; "FA No."; Code[20])
        {
            Caption = 'FA No.';
            ToolTip = 'Specifies the number of the related fixed asset.';
            NotBlank = true;
            TableRelation = "Fixed Asset";
        }
        field(2; "Depreciation Book Code"; Code[10])
        {
            Caption = 'Depreciation Book Code';
            ToolTip = 'Specifies the code for the depreciation book to which the line will be posted if you have selected Fixed Asset in the Type field for this line.';
            NotBlank = true;
            TableRelation = "Depreciation Book";
        }
        field(3; "Depreciation Method"; Enum "FA Depreciation Method")
        {
            Caption = 'Depreciation Method';
            ToolTip = 'Specifies how depreciation is calculated for the depreciation book.';

            trigger OnValidate()
            begin
                ModifyDeprFields();
                case "Depreciation Method" of
                    "Depreciation Method"::"Straight-Line":
                        begin
                            "Declining-Balance %" := 0;
                            "Depreciation Table Code" := '';
                            "First User-Defined Depr. Date" := 0D;
                            "Use DB% First Fiscal Year" := false;
                        end;
                    "Depreciation Method"::"Declining-Balance 1",
                    "Depreciation Method"::"Declining-Balance 2":
                        begin
                            "Straight-Line %" := 0;
                            "No. of Depreciation Years" := 0;
                            "No. of Depreciation Months" := 0;
                            "Fixed Depr. Amount" := 0;
                            "Depreciation Ending Date" := 0D;
                            "Depreciation Table Code" := '';
                            "First User-Defined Depr. Date" := 0D;
                            "Use DB% First Fiscal Year" := false;
                        end;
                    "Depreciation Method"::"DB1/SL",
                    "Depreciation Method"::"DB2/SL":
                        begin
                            "Depreciation Table Code" := '';
                            "First User-Defined Depr. Date" := 0D;
                        end;
                    "Depreciation Method"::"User-Defined":
                        begin
                            "Straight-Line %" := 0;
                            "No. of Depreciation Years" := 0;
                            "No. of Depreciation Months" := 0;
                            "Fixed Depr. Amount" := 0;
                            "Depreciation Ending Date" := 0D;
                            "Declining-Balance %" := 0;
                            "Use DB% First Fiscal Year" := false;
                        end;
                    "Depreciation Method"::Manual:
                        begin
                            "Straight-Line %" := 0;
                            "No. of Depreciation Years" := 0;
                            "No. of Depreciation Months" := 0;
                            "Fixed Depr. Amount" := 0;
                            "Depreciation Ending Date" := 0D;
                            "Declining-Balance %" := 0;
                            "Depreciation Table Code" := '';
                            "First User-Defined Depr. Date" := 0D;
                            "Use DB% First Fiscal Year" := false;
                        end;
                end;
                TestHalfYearConventionMethod();

                if "Depreciation Method" <> "Depreciation Method"::"Straight-Line" then begin
                    DeprBook.Get("Depreciation Book Code");
                    if DeprBook."Use Accounting Period" then
                        Error(MustBeStraightLineTxt, FieldCaption("Depreciation Method"), DeprBook.FieldCaption("Use Accounting Period"), true,
                          DeprBook.TableCaption(), DeprBook.Code);
                end;
            end;
        }
        field(4; "Depreciation Starting Date"; Date)
        {
            Caption = 'Depreciation Starting Date';
            ToolTip = 'Specifies the date on which depreciation of the fixed asset starts.';
            Editable = true;

            trigger OnValidate()
            begin
                ModifyDeprFields();
                VerifyBonusDepreciationEligibility();
                ToggleUseBonusDepreciationOnChangingDepreciationStartingDate();
                CalcDeprPeriod();
            end;
        }
        field(5; "Straight-Line %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Straight-Line %';
            ToolTip = 'Specifies the percentage to depreciate the fixed asset by the straight-line principle, but with a fixed yearly percentage.';
            DecimalPlaces = 2 : 8;
            MinValue = 0;

            trigger OnValidate()
            begin
                ModifyDeprFields();
                if ("Straight-Line %" <> 0) and not LinearMethod() then
                    DeprMethodError();
                AdjustLinearMethod("No. of Depreciation Years", "Fixed Depr. Amount");
            end;
        }
        field(6; "No. of Depreciation Years"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'No. of Depreciation Years';
            ToolTip = 'Specifies the length of the depreciation period, expressed in years.';
            DecimalPlaces = 2 : 8;
            MinValue = 0;

            trigger OnValidate()
            var
                DeprBook2: Record "Depreciation Book";
                IsHandled: Boolean;
                ShowDeprMethodError: Boolean;
            begin
                DeprBook2.Get("Depreciation Book Code");
                OnBeforeValidateNoOfDepreYears("FA No.", DeprBook2, IsHandled);
                if not IsHandled then
                    if DeprBook2."Fiscal Year 365 Days" then
                        Error(FiscalYear365Err);

                IsHandled := false;
                OnValidateNoofDepreciationYearsOnBeforeTestFieldDeprStartingDate(Rec, IsHandled);
                if not IsHandled then
                    TestField("Depreciation Starting Date");
                ModifyDeprFields();
                ShowDeprMethodError := ("No. of Depreciation Years" <> 0) and not LinearMethod();
                OnValidateNoofDepreciationYearsOnAfterCalcShowDeprMethodError(Rec, ShowDeprMethodError);
                if ShowDeprMethodError then
                    DeprMethodError();

                "No. of Depreciation Months" := Round("No. of Depreciation Years" * 12, 0.00000001);
                AdjustLinearMethod("Straight-Line %", "Fixed Depr. Amount");
                "Depreciation Ending Date" := CalcEndingDate();
            end;
        }
        field(7; "No. of Depreciation Months"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'No. of Depreciation Months';
            ToolTip = 'Specifies the length of the depreciation period, expressed in months.';
            DecimalPlaces = 2 : 8;
            MinValue = 0;

            trigger OnValidate()
            var
                DeprBook2: Record "Depreciation Book";
                IsHandled: Boolean;
                ShowDeprMethodError: Boolean;
            begin
                DeprBook2.Get("Depreciation Book Code");
                OnBeforeValidateNoOfDeprMonths("FA No.", DeprBook2, IsHandled);
                if not IsHandled then
                    if DeprBook2."Fiscal Year 365 Days" then
                        Error(FiscalYear365Err);

                IsHandled := false;
                OnValidateNoofDepreciationMonthsOnBeforeTestFieldDeprStartingDate(Rec, IsHandled);
                if not IsHandled then
                    TestField("Depreciation Starting Date");
                ModifyDeprFields();
                ShowDeprMethodError := ("No. of Depreciation Months" <> 0) and not LinearMethod();
                OnValidateNoofDepreciationMonthsOnAfterCalcShowDeprMethodError(Rec, ShowDeprMethodError);
                if ShowDeprMethodError then
                    DeprMethodError();

                "No. of Depreciation Years" := Round("No. of Depreciation Months" / 12, 0.00000001);
                AdjustLinearMethod("Straight-Line %", "Fixed Depr. Amount");
                "Depreciation Ending Date" := CalcEndingDate();
            end;
        }
        field(8; "Fixed Depr. Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            Caption = 'Fixed Depr. Amount';
            ToolTip = 'Specifies an amount to depreciate the fixed asset, by a fixed yearly amount.';
            MinValue = 0;

            trigger OnValidate()
            begin
                ModifyDeprFields();
                if ("Fixed Depr. Amount" <> 0) and not LinearMethod() then
                    DeprMethodError();
                AdjustLinearMethod("Straight-Line %", "No. of Depreciation Years");
            end;
        }
        field(9; "Declining-Balance %"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'Declining-Balance %';
            ToolTip = 'Specifies the percentage to depreciate the fixed asset by the declining-balance principle, but with a fixed yearly percentage.';
            DecimalPlaces = 2 : 8;
            MaxValue = 100;
            MinValue = 0;

            trigger OnValidate()
            begin
                if "Declining-Balance %" >= 100 then
                    FieldError("Declining-Balance %", Text001);
                ModifyDeprFields();
                if ("Declining-Balance %" <> 0) and not DecliningMethod() then
                    DeprMethodError();
            end;
        }
        field(10; "Depreciation Table Code"; Code[10])
        {
            Caption = 'Depreciation Table Code';
            ToolTip = 'Specifies the code of the depreciation table to use if you have selected the User-Defined option in the Depreciation Method field.';
            TableRelation = "Depreciation Table Header";

            trigger OnValidate()
            begin
                ModifyDeprFields();
                if ("Depreciation Table Code" <> '') and not UserDefinedMethod() then
                    DeprMethodError();
            end;
        }
        field(11; "Final Rounding Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            Caption = 'Final Rounding Amount';
            ToolTip = 'Specifies the final rounding amount to use.';
            MinValue = 0;

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(12; "Ending Book Value"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            Caption = 'Ending Book Value';
            ToolTip = 'Specifies the amount to use as the ending book value.';
            MinValue = 0;

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(13; "FA Posting Group"; Code[20])
        {
            Caption = 'FA Posting Group';
            ToolTip = 'Specifies which posting group is used for the depreciation book when posting fixed asset transactions.';
            TableRelation = "FA Posting Group";

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(14; "Depreciation Ending Date"; Date)
        {
            Caption = 'Depreciation Ending Date';
            ToolTip = 'Specifies the date on which depreciation of the fixed asset ends.';

            trigger OnValidate()
            var
                IsHandled: Boolean;
                ShowDeprMethodError: Boolean;
            begin
                IsHandled := false;
                OnValidateDepreciationEndingDateOnBeforeTestFieldDeprStartingDate(Rec, IsHandled);
                if not IsHandled then
                    TestField("Depreciation Starting Date");
                ShowDeprMethodError := ("Depreciation Ending Date" <> 0D) and not LinearMethod();
                OnValidateDepreciationEndingDateOnAfterCalcShowDeprMethodError(Rec, ShowDeprMethodError);
                if ShowDeprMethodError then
                    DeprMethodError();
                ModifyDeprFields();
                OnBeforeCalculateDepreEndingDate(Rec, "Depreciation Ending Date", IsHandled);
                if not IsHandled then
                    CalcDeprPeriod();
            end;
        }
        field(15; "Acquisition Cost"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const("Acquisition Cost"),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Acquisition Cost';
            ToolTip = 'Specifies the total acquisition cost for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(16; Depreciation; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const(Depreciation),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Depreciation';
            ToolTip = 'Specifies the total depreciation for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(17; "Book Value"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "Part of Book Value" = const(true),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Book Value';
            ToolTip = 'Specifies the book value for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(18; "Proceeds on Disposal"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const("Proceeds on Disposal"),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Proceeds on Disposal';
            ToolTip = 'Specifies the total proceeds on disposal for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(19; "Gain/Loss"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const("Gain/Loss"),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Gain/Loss';
            ToolTip = 'Specifies the total gain (credit) or loss (debit) for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(20; "Write-Down"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const("Write-Down"),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Write-Down';
            ToolTip = 'Specifies the total LCY amount of write-down entries for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(21; Appreciation; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const(Appreciation),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Appreciation';
            ToolTip = 'Specifies the total appreciation for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(22; "Custom 1"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const("Custom 1"),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Custom 1';
            ToolTip = 'Specifies the total LCY amount for custom 1 entries for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(23; "Custom 2"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const("Custom 2"),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Custom 2';
            ToolTip = 'Specifies the total LCY amount for custom 2 entries for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(24; "Depreciable Basis"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "Part of Depreciable Basis" = const(true),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Depreciable Basis';
            ToolTip = 'Specifies the depreciable basis amount for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(25; "Salvage Value"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(" "),
                                                              "FA Posting Type" = const("Salvage Value"),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Salvage Value';
            ToolTip = 'Specifies the estimated residual value of a fixed asset when it can no longer be used.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(26; "Book Value on Disposal"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("FA Ledger Entry".Amount where("FA No." = field("FA No."),
                                                              "Depreciation Book Code" = field("Depreciation Book Code"),
                                                              "FA Posting Category" = const(Disposal),
                                                              "FA Posting Type" = const("Book Value on Disposal"),
                                                              "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Book Value on Disposal';
            ToolTip = 'Specifies the total LCY amount of entries posted with the Book Value on Disposal posting type. Entries of this kind are created when you post disposal of a fixed asset to a depreciation book where the Gross method has been selected in the Disposal Calculation Method field.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(27; Maintenance; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            CalcFormula = sum("Maintenance Ledger Entry".Amount where("FA No." = field("FA No."),
                                                                       "Depreciation Book Code" = field("Depreciation Book Code"),
                                                                       "Maintenance Code" = field("Maintenance Code Filter"),
                                                                       "FA Posting Date" = field("FA Posting Date Filter")));
            Caption = 'Maintenance';
            ToolTip = 'Specifies the total maintenance cost for the fixed asset.';
            Editable = false;
            FieldClass = FlowField;
        }
        field(28; "Maintenance Code Filter"; Code[10])
        {
            Caption = 'Maintenance Code Filter';
            FieldClass = FlowFilter;
            TableRelation = Maintenance;
        }
        field(29; "FA Posting Date Filter"; Date)
        {
            Caption = 'FA Posting Date Filter';
            FieldClass = FlowFilter;
        }
        field(30; "Acquisition Date"; Date)
        {
            Caption = 'Acquisition Date';
            ToolTip = 'Specifies the FA posting date of the first posted acquisition cost.';
            Editable = false;
        }
        field(31; "G/L Acquisition Date"; Date)
        {
            Caption = 'G/L Acquisition Date';
            ToolTip = 'Specifies the G/L posting date of the first posted acquisition cost.';
            Editable = false;
        }
        field(32; "Disposal Date"; Date)
        {
            Caption = 'Disposal Date';
            ToolTip = 'Specifies the FA posting date of the first posted disposal amount.';
            Editable = false;
        }
        field(33; "Last Acquisition Cost Date"; Date)
        {
            Caption = 'Last Acquisition Cost Date';
            ToolTip = 'Specifies the total percentage of acquisition cost that can be allocated when acquisition cost is posted.';
            Editable = false;
        }
        field(34; "Last Depreciation Date"; Date)
        {
            Caption = 'Last Depreciation Date';
            ToolTip = 'Specifies the FA posting date of the last posted depreciation.';
            Editable = false;
        }
        field(35; "Last Write-Down Date"; Date)
        {
            Caption = 'Last Write-Down Date';
            ToolTip = 'Specifies the FA posting date of the last posted write-down.';
            Editable = false;
        }
        field(36; "Last Appreciation Date"; Date)
        {
            Caption = 'Last Appreciation Date';
            ToolTip = 'Specifies the sum that applies to appreciations.';
            Editable = false;
        }
        field(37; "Last Custom 1 Date"; Date)
        {
            Caption = 'Last Custom 1 Date';
            ToolTip = 'Specifies the FA posting date of the last posted custom 1 entry.';
            Editable = false;
        }
        field(38; "Last Custom 2 Date"; Date)
        {
            Caption = 'Last Custom 2 Date';
            ToolTip = 'Specifies the FA posting date of the last posted custom 2 entry.';
            Editable = false;
        }
        field(39; "Last Salvage Value Date"; Date)
        {
            Caption = 'Last Salvage Value Date';
            ToolTip = 'Specifies if related salvage value entries are included in the batch job .';
            Editable = false;
        }
        field(40; "FA Exchange Rate"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'FA Exchange Rate';
            ToolTip = 'Specifies a decimal number, which will be used as an exchange rate when duplicating journal lines to this depreciation book.';
            DecimalPlaces = 4 : 4;
            MinValue = 0;

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(41; "Fixed Depr. Amount below Zero"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            BlankZero = true;
            Caption = 'Fixed Depr. Amount below Zero';
            ToolTip = 'Specifies a positive amount if you have selected the Allow Depr. below Zero field in the depreciation book.';
            MinValue = 0;

            trigger OnValidate()
            begin
                ModifyDeprFields();
                "Depr. below Zero %" := 0;
                if "Fixed Depr. Amount below Zero" > 0 then begin
                    DeprBook.Get("Depreciation Book Code");
                    DeprBook.TestField("Allow Depr. below Zero", true);
                    TestField("Use FA Ledger Check", true);
                end;
            end;
        }
        field(42; "Last Date Modified"; Date)
        {
            Caption = 'Last Date Modified';
            Editable = false;
        }
        field(43; "First User-Defined Depr. Date"; Date)
        {
            Caption = 'First User-Defined Depr. Date';
            ToolTip = 'Specifies the starting date for the user-defined depreciation table if you have entered a code in the Depreciation Table Code field.';

            trigger OnValidate()
            begin
                ModifyDeprFields();
                if ("First User-Defined Depr. Date" <> 0D) and not UserDefinedMethod() then
                    DeprMethodError();
            end;
        }
        field(44; "Use FA Ledger Check"; Boolean)
        {
            Caption = 'Use FA Ledger Check';
            ToolTip = 'Specifies which checks to perform before posting a journal line.';
            InitValue = true;

            trigger OnValidate()
            begin
                if not "Use FA Ledger Check" then begin
                    DeprBook.Get("Depreciation Book Code");
                    DeprBook.TestField("Use FA Ledger Check", false);
                    TestField("Fixed Depr. Amount below Zero", 0);
                    TestField("Depr. below Zero %", 0);
                end;
                ModifyDeprFields();
            end;
        }
        field(45; "Last Maintenance Date"; Date)
        {
            Caption = 'Last Maintenance Date';
            Editable = false;
        }
        field(46; "Depr. below Zero %"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'Depr. below Zero %';
            ToolTip = 'Specifies a percentage if you have selected the Allow Depr. below Zero field in the depreciation book.';
            DecimalPlaces = 2 : 8;
            MinValue = 0;

            trigger OnValidate()
            begin
                ModifyDeprFields();
                "Fixed Depr. Amount below Zero" := 0;
                if "Depr. below Zero %" > 0 then begin
                    DeprBook.Get("Depreciation Book Code");
                    DeprBook.TestField("Allow Depr. below Zero", true);
                    TestField("Use FA Ledger Check", true);
                end;
            end;
        }
        field(47; "Projected Disposal Date"; Date)
        {
            Caption = 'Projected Disposal Date';
            ToolTip = 'Specifies the date on which you want to dispose of the fixed asset.';
        }
        field(48; "Projected Proceeds on Disposal"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            BlankZero = true;
            Caption = 'Projected Proceeds on Disposal';
            ToolTip = 'Specifies the expected proceeds from disposal of the fixed asset.';
            MinValue = 0;
        }
        field(50; "Depr. Starting Date (Custom 1)"; Date)
        {
            Caption = 'Depr. Starting Date (Custom 1)';

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(51; "Depr. Ending Date (Custom 1)"; Date)
        {
            Caption = 'Depr. Ending Date (Custom 1)';

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(52; "Accum. Depr. % (Custom 1)"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'Accum. Depr. % (Custom 1)';
            DecimalPlaces = 2 : 8;
            MaxValue = 100;
            MinValue = 0;

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(53; "Depr. This Year % (Custom 1)"; Decimal)
        {
            AutoFormatType = 0;
            BlankZero = true;
            Caption = 'Depr. This Year % (Custom 1)';
            DecimalPlaces = 2 : 8;
            MaxValue = 100;
            MinValue = 0;
        }
        field(54; "Property Class (Custom 1)"; Option)
        {
            Caption = 'Property Class (Custom 1)';
            OptionCaption = ' ,Personal Property,Real Property';
            OptionMembers = " ","Personal Property","Real Property";

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(55; Description; Text[100])
        {
            Caption = 'Description';
            ToolTip = 'Specifies the value in the Description field on the fixed asset card.';
            Editable = false;
        }
        field(56; "Main Asset/Component"; Enum "FA Component Type")
        {
            Caption = 'Main Asset/Component';
            Editable = false;
        }
        field(57; "Component of Main Asset"; Code[20])
        {
            Caption = 'Component of Main Asset';
            Editable = false;
            TableRelation = "Fixed Asset";
        }
        field(58; "FA Add.-Currency Factor"; Decimal)
        {
            AutoFormatType = 0;
            Caption = 'FA Add.-Currency Factor';
            DecimalPlaces = 0 : 15;
            MinValue = 0;
        }
        field(59; "Use Half-Year Convention"; Boolean)
        {
            Caption = 'Use Half-Year Convention';
            ToolTip = 'Specifies that the Half-Year Convention is to be applied to the selected depreciation method.';

            trigger OnValidate()
            begin
                ModifyDeprFields();
                TestHalfYearConventionMethod();
            end;
        }
        field(60; "Use DB% First Fiscal Year"; Boolean)
        {
            Caption = 'Use DB% First Fiscal Year';
            ToolTip = 'Specifies that the depreciation methods DB1/SL and DB2/SL use the declining balance depreciation amount in the first fiscal year.';

            trigger OnValidate()
            begin
                if "Use DB% First Fiscal Year" then
                    if not (("Depreciation Method" = "Depreciation Method"::"DB1/SL") or
                            ("Depreciation Method" = "Depreciation Method"::"DB2/SL"))
                    then
                        DeprMethodError();
            end;
        }
        field(61; "Temp. Ending Date"; Date)
        {
            Caption = 'Temp. Ending Date';
            ToolTip = 'Specifies the ending date of the period during which a temporary fixed depreciation amount will be used.';
        }
        field(62; "Temp. Fixed Depr. Amount"; Decimal)
        {
            AutoFormatType = 1;
            AutoFormatExpression = GetCurrencyCode();
            Caption = 'Temp. Fixed Depr. Amount';
            ToolTip = 'Specifies a temporary fixed depreciation amount.';
        }
        field(63; "Ignore Def. Ending Book Value"; Boolean)
        {
            Caption = 'Ignore Def. Ending Book Value';
            ToolTip = 'Specifies that the default ending book value is ignored, and the value in the Ending Book Value is used.';

            trigger OnValidate()
            begin
                ModifyDeprFields();
            end;
        }
        field(64; "Use Bonus Depreciation"; Boolean)
        {
            Caption = 'Use Bonus Depreciation';
            ToolTip = 'Specifies if the bonus depreciation should be used in this book.';

            trigger OnValidate()
            var
                FASetup: Record "FA Setup";
            begin
                if Rec."Use Bonus Depreciation" then begin
                    FASetup.Get();
                    if not FASetup.BonusDepreciationCorrectlySetup() then
                        Error(BonusDepreciationNotSetupCorrectlyErr);

                    if not EligibleForBonusDepreciation(FASetup) then
                        Error(NotEligibleForBonusDepreciationErr);

                    Rec.CalcFields(Depreciation);
                    if Rec.Depreciation <> 0 then
                        Error(CannotUseBonusDepreciationDepreciationStartedErr);

                    Rec."Bonus Depreciation %" := GetApplicableBonusDeprPct(FASetup);
                end else begin
                    Rec.CalcFields("Bonus Depr. Applied Amount");
                    if Rec."Bonus Depr. Applied Amount" <> 0 then
                        Error(CannotTurnOffBonusDepreciationAlreadyAppliedErr);
                    Rec."Bonus Depreciation %" := 0;
                end;
            end;
        }
        field(65; "Bonus Depr. Applied Amount"; Decimal)
        {
            Caption = 'Bonus Depreciation Applied Amount';
            ToolTip = 'Specifies the amount of bonus depreciation that has been applied to the fixed asset.';
            DecimalPlaces = 0 : 5;
            AutoFormatType = 0;
            FieldClass = FlowField;
            CalcFormula = sum("FA Ledger Entry"."Amount" where("FA No." = field("FA No."),
                                                               "Depreciation Book Code" = field("Depreciation Book Code"),
                                                               "FA Posting Category" = const(" "),
                                                               "FA Posting Type" = const("FA Ledger Entry FA Posting Type"::"Bonus Depreciation"),
                                                               "FA Posting Date" = field("FA Posting Date Filter")));
        }
        field(66; "Bonus Depreciation %"; Decimal)
        {
            Caption = 'Bonus Depreciation %';
            ToolTip = 'Specifies the bonus depreciation percentage for this fixed asset.';
            DecimalPlaces = 0 : 2;
            MinValue = 0;
            MaxValue = 100;
            AutoFormatType = 0;

            trigger OnValidate()
            var
                FASetup: Record "FA Setup";
                MaxPct: Decimal;
            begin
                if not Rec."Use Bonus Depreciation" then
                    exit;

                Rec.CalcFields("Bonus Depr. Applied Amount");
                if Rec."Bonus Depr. Applied Amount" <> 0 then
                    Error(CannotTurnOffBonusDepreciationAlreadyAppliedErr);

                FASetup.Get();
                MaxPct := GetApplicableBonusDeprPct(FASetup);
                if Rec."Bonus Depreciation %" > MaxPct then
                    Error(BonusDeprPctExceedsMaxErr, MaxPct);
            end;
        }
        field(70; "Default FA Depreciation Book"; Boolean)
        {
            Caption = 'Default FA Depreciation Book';
            ToolTip = 'Specifies the depreciation book that is used by default on documents and journals when a fixed asset has more than one depreciation book. A fixed asset can have only one default depreciation book. If a depreciation book is not specified for a fixed asset, the default depreciation book from the fixed asset setup is used.';

            trigger OnValidate()
            var
                DefaultFADeprBook: Record "FA Depreciation Book";
            begin
                if not "Default FA Depreciation Book" then
                    exit;

                DefaultFADeprBook.SetRange("FA No.", "FA No.");
                DefaultFADeprBook.SetFilter("Depreciation Book Code", '<>%1', "Depreciation Book Code");
                DefaultFADeprBook.SetRange("Default FA Depreciation Book", true);
                if not DefaultFADeprBook.IsEmpty() then
                    FieldError("Default FA Depreciation Book", OnlyOneDefaultDeprBookErr);
            end;
        }
    }

    keys
    {
        key(Key1; "FA No.", "Depreciation Book Code")
        {
            Clustered = true;
        }
        key(Key2; "Depreciation Book Code", "FA No.")
        {
        }
        key(Key3; "Depreciation Book Code", "Component of Main Asset", "Main Asset/Component")
        {
        }
        key(Key4; "Main Asset/Component", "Depreciation Book Code")
        {
        }
    }

    fieldgroups
    {
    }

    trigger OnDelete()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeOnDelete(Rec, xRec, IsHandled);
        if IsHandled then
            exit;

        FAMoveEntries.MoveFAEntries(Rec);
    end;

    trigger OnInsert()
    var
        IsHandled: Boolean;
    begin
        "Acquisition Date" := 0D;
        "G/L Acquisition Date" := 0D;
        "Last Acquisition Cost Date" := 0D;
        "Last Salvage Value Date" := 0D;
        "Last Depreciation Date" := 0D;
        "Last Write-Down Date" := 0D;
        "Last Appreciation Date" := 0D;
        "Last Custom 1 Date" := 0D;
        "Last Custom 2 Date" := 0D;
        "Disposal Date" := 0D;
        "Last Maintenance Date" := 0D;
        LockTable();
        FA.LockTable();
        DeprBook.LockTable();
        FA.Get("FA No.");
        DeprBook.Get("Depreciation Book Code");
        Description := FA.Description;
        "Main Asset/Component" := FA."Main Asset/Component";
        "Component of Main Asset" := FA."Component of Main Asset";
        OnBeforeInsertFADeprBook(Rec, IsHandled);
        if not IsHandled then
            if ("No. of Depreciation Years" <> 0) or ("No. of Depreciation Months" <> 0) then
                DeprBook.TestField("Fiscal Year 365 Days", false);
        CheckApplyDeprBookDefaults();
    end;

    trigger OnModify()
    var
        IsHandled: Boolean;
    begin
        "Last Date Modified" := Today;
        LockTable();
        DeprBook.LockTable();
        DeprBook.Get("Depreciation Book Code");
        IsHandled := false;
        OnBeforeModifyFADeprBook(Rec, IsHandled);
        if not IsHandled then
            if ("No. of Depreciation Years" <> 0) or ("No. of Depreciation Months" <> 0) then
                DeprBook.TestField("Fiscal Year 365 Days", false);
        CheckApplyDeprBookDefaults();
    end;

    trigger OnRename()
    begin
        Error(Text000, TableCaption);
    end;

    var
        FAMoveEntries: Codeunit "FA MoveEntries";
        FADateCalculation: Codeunit "FA Date Calculation";
        DepreciationCalculation: Codeunit "Depreciation Calculation";

#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label 'You cannot rename a %1.';
#pragma warning restore AA0470
        Text001: Label 'must not be 100';
#pragma warning disable AA0470
        Text002: Label '%1 is later than %2.';
        Text003: Label 'must not be %1';
#pragma warning restore AA0470
        Text004: Label 'untitled';
#pragma warning restore AA0074
        OnlyOneDefaultDeprBookErr: Label 'Only one fixed asset depreciation book can be marked as the default book';
        FiscalYear365Err: Label 'An ending date for depreciation cannot be calculated automatically when the Fiscal Year 365 Days option is chosen. You must manually enter the ending date.';
        MustBeStraightLineTxt: Label '%1 must be Straight-Line if %2 is %3 in %4: %5.', Comment = '%1="Depreciation Method" Field Caption %2="Use Accounting Period" Field Caption %3="Use Accounting Period" Field Value %4="Depreciation Book" Table Caption %5="Depreciation Book" Value of field Code';
        CannotUseBonusDepreciationDepreciationStartedErr: Label 'Bonus depreciation cannot be used because depreciation has already started for this fixed asset.';
        NotEligibleForBonusDepreciationErr: Label 'This fixed asset is not eligible for bonus depreciation.';
        BonusDepreciationNotSetupCorrectlyErr: Label 'You must open Fixed Asset Setup and set up the effective date and percentage for bonus depreciation.';
        CannotTurnOffBonusDepreciationAlreadyAppliedErr: Label 'Bonus depreciation has already been applied to this fixed asset.';
        BonusDepreciationAlreadyAppliedErr: Label 'The bonus depreciation has already been applied for this depreciation book. This change is making the fixed asset not eligible for bonus depreciation.';
        BonusDepreciationTurnedOnErr: Label 'You must uncheck Use Bonus Depreciation, because this change is making the fixed asset not eligible for bonus depreciation.';
        BonusDeprPctExceedsMaxErr: Label 'The bonus depreciation percentage cannot exceed the applicable maximum of %1%.', Comment = '%1 = maximum percentage';

    protected var
        FA: Record "Fixed Asset";
        DeprBook: Record "Depreciation Book";

    procedure EligibleForBonusDepreciation(FASetup: Record "FA Setup"): Boolean
    var
        AdvBonusDeprSetup: Record "Adv. Bonus Depreciation Setup";
        FixedAsset: Record "Fixed Asset";
        FAClassCode: Code[10];
    begin
        if not FASetup.BonusDepreciationCorrectlySetup() then
            exit(false);

        if Rec."Depreciation Starting Date" = 0D then
            exit(false);

        if Rec."Depreciation Starting Date" >= FASetup."Bonus Depr. Effective Date" then
            exit(true);

        FixedAsset.SetLoadFields("FA Class Code");
        if FixedAsset.Get(Rec."FA No.") then
            FAClassCode := FixedAsset."FA Class Code";

        AdvBonusDeprSetup.SetCurrentKey("Effective Date", "FA Class Code");
        AdvBonusDeprSetup.SetFilter("Effective Date", '<=%1', Rec."Depreciation Starting Date");
        AdvBonusDeprSetup.SetFilter("FA Class Code", '%1|%2', '', FAClassCode);
        if not AdvBonusDeprSetup.IsEmpty() then
            exit(true);

        exit(false);
    end;

    local procedure AdjustLinearMethod(var Amount1: Decimal; var Amount2: Decimal)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeAdjustLinearMethod(Rec, Amount1, Amount2, IsHandled);
        if IsHandled then
            exit;

        Amount1 := 0;
        Amount2 := 0;
        if "No. of Depreciation Years" = 0 then begin
            "No. of Depreciation Months" := 0;
            "Depreciation Ending Date" := 0D;
        end;
    end;

    local procedure ModifyDeprFields()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeModifyDeprFields(Rec, IsHandled);
        if not IsHandled then
            if ("Last Depreciation Date" > 0D) or
               ("Last Write-Down Date" > 0D) or
               ("Last Appreciation Date" > 0D) or
               ("Last Custom 1 Date" > 0D) or
               ("Last Custom 2 Date" > 0D) or
               ("Disposal Date" > 0D)
            then begin
                DeprBook.Get("Depreciation Book Code");
                DeprBook.TestField("Allow Changes in Depr. Fields", true);
            end;

        OnAfterModifyDeprFields(Rec);
    end;

    internal procedure BonusDepreciationApplied(): Boolean
    var
        FALedgerEntry: Record "FA Ledger Entry";
    begin
        FALedgerEntry.ReadIsolation(IsolationLevel::ReadCommitted);
        FALedgerEntry.SetCurrentKey("FA No.", "Depreciation Book Code", "FA Posting Category", "FA Posting Type");
        FALedgerEntry.SetRange("FA No.", Rec."FA No.");
        FALedgerEntry.SetRange("Depreciation Book Code", Rec."Depreciation Book Code");
        FALedgerEntry.SetRange("FA Posting Category", FALedgerEntry."FA Posting Category"::" ");
        FALedgerEntry.SetRange("FA Posting Type", "FA Ledger Entry FA Posting Type"::"Bonus Depreciation");
        exit(not FALedgerEntry.IsEmpty());
    end;

    local procedure VerifyBonusDepreciationEligibility()
    var
        FASetup: Record "FA Setup";
    begin
        if not Rec."Use Bonus Depreciation" then
            exit;

        FASetup.Get();
        if not Rec.EligibleForBonusDepreciation(FASetup) then
            Error(BonusDepreciationTurnedOnErr);

        if (Rec."Depreciation Starting Date" = 0D) or (FASetup."Bonus Depr. Effective Date" = 0D) then
            Error(BonusDepreciationAlreadyAppliedErr);

        if Rec."Depreciation Starting Date" < FASetup."Bonus Depr. Effective Date" then
            if Rec.BonusDepreciationApplied() then
                Error(BonusDepreciationAlreadyAppliedErr);
    end;

    local procedure ToggleUseBonusDepreciationOnChangingDepreciationStartingDate()
    var
        FASetup: Record "FA Setup";
        DepreciationBook: Record "Depreciation Book";
        FeatureTelemetry: Codeunit "Feature Telemetry";
    begin
        DepreciationBook.Get(Rec."Depreciation Book Code");
        if not DepreciationBook."Use Bonus Depreciation" then
            exit;

        FASetup.Get();
        if not FASetup.BonusDepreciationCorrectlySetup() then
            exit;

        if Rec."Depreciation Starting Date" = 0D then begin
            Rec."Use Bonus Depreciation" := false;
            Rec."Bonus Depreciation %" := 0;
            exit;
        end;

        if Rec.EligibleForBonusDepreciation(FASetup) then begin
            Rec."Use Bonus Depreciation" := true;
            Rec."Bonus Depreciation %" := GetApplicableBonusDeprPct(FASetup);
            FeatureTelemetry.LogUsage('0000SEM', 'Fixed Asset', 'Using Bonus Depreciation');
        end else begin
            Rec."Use Bonus Depreciation" := false;
            Rec."Bonus Depreciation %" := 0;
        end;
    end;

    procedure CalcDeprPeriod()
    var
        DepreciationBook2: Record "Depreciation Book";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCalcDeprPeriod(Rec, IsHandled);
        if not IsHandled then begin
            if "Depreciation Starting Date" = 0D then begin
                "Depreciation Ending Date" := 0D;
                "No. of Depreciation Years" := 0;
                "No. of Depreciation Months" := 0;
            end;
            if ("Depreciation Starting Date" = 0D) or ("Depreciation Ending Date" = 0D) then begin
                "No. of Depreciation Years" := 0;
                "No. of Depreciation Months" := 0;
            end else begin
                if "Depreciation Starting Date" > "Depreciation Ending Date" then
                    Error(
                      Text002,
                      FieldCaption("Depreciation Starting Date"), FieldCaption("Depreciation Ending Date"));
                DepreciationBook2.Get("Depreciation Book Code");
                if DepreciationBook2."Fiscal Year 365 Days" then begin
                    "No. of Depreciation Months" := 0;
                    "No. of Depreciation Years" := 0;
                end;
                if not DepreciationBook2."Fiscal Year 365 Days" then begin
                    "No. of Depreciation Months" :=
                      DepreciationCalculation.DeprDays("Depreciation Starting Date", "Depreciation Ending Date", false,
                        DeprBook."Use Accounting Period") / 30;
                    "No. of Depreciation Months" := Round("No. of Depreciation Months", 0.00000001);
                    "No. of Depreciation Years" := Round("No. of Depreciation Months" / 12, 0.00000001);
                end;
                "Straight-Line %" := 0;
                "Fixed Depr. Amount" := 0;
            end;
        end;
        OnAfterCalcDeprPeriod(Rec);
    end;

    procedure CalcEndingDate() EndingDate: Date
    begin
        if "No. of Depreciation Years" = 0 then
            EndingDate := 0D
        else begin
            EndingDate := FADateCalculation.CalculateDate(
                "Depreciation Starting Date", Round("No. of Depreciation Years" * 360, 1), false);
            DeprBook.Get("Depreciation Book Code");
            EndingDate := DepreciationCalculation.Yesterday(EndingDate, false, DeprBook."Use Accounting Period");
            if EndingDate < "Depreciation Starting Date" then
                EndingDate := "Depreciation Starting Date";
        end;
        OnAfterCalcEndingDate(Rec, EndingDate);
    end;

    procedure GetExchangeRate(): Decimal
    var
        DepreciationBook: Record "Depreciation Book";
    begin
        DepreciationBook.Get("Depreciation Book Code");
        if not DepreciationBook."Use FA Exch. Rate in Duplic." then
            exit(0);
        if "FA Exchange Rate" > 0 then
            exit("FA Exchange Rate");
        exit(DepreciationBook."Default Exchange Rate");
    end;

    protected procedure LinearMethod() Result: Boolean
    begin
        Result :=
          "Depreciation Method" in
          ["Depreciation Method"::"Straight-Line",
           "Depreciation Method"::"DB1/SL",
           "Depreciation Method"::"DB2/SL"];
        OnAfterLinearMethod(Rec, Result);
    end;

    protected procedure DecliningMethod(): Boolean
    begin
        exit(
          "Depreciation Method" in
          ["Depreciation Method"::"Declining-Balance 1",
           "Depreciation Method"::"Declining-Balance 2",
           "Depreciation Method"::"DB1/SL",
           "Depreciation Method"::"DB2/SL"]);
    end;

    protected procedure UserDefinedMethod() Result: Boolean
    begin
        Result := Rec."Depreciation Method" = Rec."Depreciation Method"::"User-Defined";
        OnAfterUserDefinedMethod(Rec, Result);
    end;

    protected procedure TestHalfYearConventionMethod()
    begin
        if "Depreciation Method" in
           ["Depreciation Method"::"Declining-Balance 2",
            "Depreciation Method"::"DB2/SL",
            "Depreciation Method"::"User-Defined"]
        then
            TestField("Use Half-Year Convention", false);
    end;

    local procedure DeprMethodError()
    begin
        FieldError("Depreciation Method", StrSubstNo(Text003, "Depreciation Method"));
    end;

    local procedure CheckApplyDeprBookDefaults()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckApplyDeprBookDefaults(Rec, IsHandled);
        if IsHandled then
            exit;

        if not "Ignore Def. Ending Book Value" and
           (DeprBook."Default Ending Book Value" <> 0) and
           ("Ending Book Value" = 0)
        then
            "Ending Book Value" := DeprBook."Default Ending Book Value";
        if (DeprBook."Default Final Rounding Amount" <> 0) and ("Final Rounding Amount" = 0) then
            "Final Rounding Amount" := DeprBook."Default Final Rounding Amount"
    end;

    procedure Caption(): Text
    var
        FixedAsset: Record "Fixed Asset";
        DepreciationBook: Record "Depreciation Book";
    begin
        if "FA No." = '' then
            exit(Text004);
        FixedAsset.Get("FA No.");
        DepreciationBook.Get("Depreciation Book Code");
        exit(
          StrSubstNo(
            '%1 %2 %3 %4', "FA No.", FixedAsset.Description, "Depreciation Book Code", DepreciationBook.Description));
    end;

    procedure DrillDownOnBookValue()
    var
        FALedgerEntry: Record "FA Ledger Entry";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeDrillDownOnBookValue(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Disposal Date" > 0D then
            ShowBookValueAfterDisposal()
        else begin
            SetBookValueFiltersOnFALedgerEntry(FALedgerEntry);
            PAGE.Run(0, FALedgerEntry);
        end;
    end;

    internal procedure DrillDownOnAcquisitionCost()
    var
        FALedgerEntry: Record "FA Ledger Entry";
    begin
        SetAcquisitionCostFiltersOnFALedgerEntry(FALedgerEntry);
        PAGE.Run(0, FALedgerEntry);
    end;

    internal procedure DrillDownOnBonusDeprAppliedAmount()
    var
        FALedgerEntry: Record "FA Ledger Entry";
    begin
        SetBonusDepreciationFiltersOnFALedgerEntry(FALedgerEntry);
        PAGE.Run(0, FALedgerEntry);
    end;

    procedure ShowBookValueAfterDisposal()
    var
        TempFALedgerEntry: Record "FA Ledger Entry" temporary;
        FALedgerEntry: Record "FA Ledger Entry";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeShowBookValueAfterDisposal(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Disposal Date" > 0D then begin
            Clear(TempFALedgerEntry);
            TempFALedgerEntry.DeleteAll();
            TempFALedgerEntry.SetCurrentKey("FA No.", "Depreciation Book Code", "FA Posting Date");
            DepreciationCalculation.SetFAFilter(FALedgerEntry, "FA No.", "Depreciation Book Code", false);
            SetBookValueAfterDisposalFiltersOnFALedgerEntry(FALedgerEntry);
            PAGE.Run(0, FALedgerEntry);
        end else begin
            SetBookValueFiltersOnFALedgerEntry(FALedgerEntry);
            PAGE.Run(0, FALedgerEntry);
        end;
    end;

    procedure CalcBookValue()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCalcBookValue(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Disposal Date" > 0D then
            "Book Value" := 0
        else
            CalcFields("Book Value");
    end;

    procedure SetBookValueFiltersOnFALedgerEntry(var FALedgerEntry: Record "FA Ledger Entry")
    begin
        FALedgerEntry.SetCurrentKey("FA No.", "Depreciation Book Code", "Part of Book Value", "FA Posting Date");
        FALedgerEntry.SetRange("FA No.", "FA No.");
        FALedgerEntry.SetRange("Depreciation Book Code", "Depreciation Book Code");
        FALedgerEntry.SetRange("Part of Book Value", true);
        OnAfterSetBookValueFiltersOnFALedgerEntry(FALedgerEntry);
    end;

    internal procedure SetAcquisitionCostFiltersOnFALedgerEntry(var FALedgerEntry: Record "FA Ledger Entry")
    begin
        FALedgerEntry.SetCurrentKey("FA No.", "Depreciation Book Code", "FA Posting Category", "FA Posting Type", "FA Posting Date");
        FALedgerEntry.SetRange("FA No.", "FA No.");
        FALedgerEntry.SetRange("Depreciation Book Code", "Depreciation Book Code");
        FALedgerEntry.SetRange("FA Posting Category", FALedgerEntry."FA Posting Category"::" ");
        FALedgerEntry.SetRange("FA Posting Type", FALedgerEntry."FA Posting Type"::"Acquisition Cost")
    end;

    internal procedure SetBonusDepreciationFiltersOnFALedgerEntry(var FALedgerEntry: Record "FA Ledger Entry")
    begin
        FALedgerEntry.SetCurrentKey("FA No.", "Depreciation Book Code", "FA Posting Category", "FA Posting Type", "FA Posting Date");
        FALedgerEntry.SetRange("FA No.", "FA No.");
        FALedgerEntry.SetRange("Depreciation Book Code", "Depreciation Book Code");
        FALedgerEntry.SetRange("FA Posting Category", FALedgerEntry."FA Posting Category"::" ");
        FALedgerEntry.SetRange("FA Posting Type", FALedgerEntry."FA Posting Type"::"Bonus Depreciation")
    end;

    procedure LineIsReadyForAcquisition(FANo: Code[20]): Boolean
    var
        FADepreciationBook: Record "FA Depreciation Book";
        FASetup: Record "FA Setup";
    begin
        FASetup.Get();
        exit(FADepreciationBook.Get(FANo, FASetup."Default Depr. Book") and FADepreciationBook.RecIsReadyForAcquisition());
    end;

    procedure RecIsReadyForAcquisition(): Boolean
    var
        FASetup: Record "FA Setup";
    begin
        FASetup.Get();
        if ("Depreciation Book Code" = FASetup."Default Depr. Book") and
           ("FA Posting Group" <> '') and
           ("Depreciation Starting Date" > 0D)
        then begin
            if "Depreciation Method" in
               ["Depreciation Method"::"Straight-Line", "Depreciation Method"::"DB1/SL", "Depreciation Method"::"DB2/SL"]
            then
                exit(("No. of Depreciation Years" > 0) or ("Depreciation Ending Date" <> 0D));
            exit(true);
        end;

        exit(false);
    end;

    procedure UpdateBookValue()
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateBookValue(Rec, IsHandled);
        if IsHandled then
            exit;

        if "Disposal Date" > 0D then
            "Book Value" := 0;
    end;

    local procedure GetApplicableBonusDeprPct(FASetup: Record "FA Setup"): Decimal
    var
        AdvBonusDeprSetup: Record "Adv. Bonus Depreciation Setup";
        FixedAsset: Record "Fixed Asset";
        FAClassCode: Code[10];
        BestPct: Decimal;
        BestDate: Date;
    begin
        FixedAsset.SetLoadFields("FA Class Code");
        if FixedAsset.Get(Rec."FA No.") then
            FAClassCode := FixedAsset."FA Class Code";

        if FASetup."Bonus Depr. Effective Date" <= Rec."Depreciation Starting Date" then begin
            BestPct := FASetup."Bonus Depreciation %";
            BestDate := FASetup."Bonus Depr. Effective Date";
        end;

        AdvBonusDeprSetup.SetCurrentKey("Effective Date", "FA Class Code");
        AdvBonusDeprSetup.SetFilter("Effective Date", '<=%1', Rec."Depreciation Starting Date");
        if AdvBonusDeprSetup.FindSet() then
            repeat
                if (AdvBonusDeprSetup."FA Class Code" = '') or (AdvBonusDeprSetup."FA Class Code" = FAClassCode) then
                    if AdvBonusDeprSetup."Effective Date" >= BestDate then begin
                        BestPct := AdvBonusDeprSetup."Bonus Depreciation %";
                        BestDate := AdvBonusDeprSetup."Effective Date";
                    end;
            until AdvBonusDeprSetup.Next() = 0;

        exit(BestPct);
    end;

    internal procedure BonusDepreciationAmount(): Decimal
    var
        GeneralLedgerSetup: Record "General Ledger Setup";
    begin
        GeneralLedgerSetup.Get();
        Rec.CalcFields("Acquisition Cost");
        exit(Round(Rec."Acquisition Cost" * Rec."Bonus Depreciation %" * 0.01, GeneralLedgerSetup."Amount Rounding Precision"));
    end;

    local procedure SetBookValueAfterDisposalFiltersOnFALedgerEntry(var FALedgerEntry: Record "FA Ledger Entry")
    begin
        SetBookValueFiltersOnFALedgerEntry(FALedgerEntry);
        FALedgerEntry.SetRange("Part of Book Value");
        if GetFilter("FA Posting Date Filter") <> '' then
            FALedgerEntry.SetFilter("FA Posting Date", GetFilter("FA Posting Date Filter"));
    end;

    internal procedure GetCurrencyCode(): Code[10]
    begin
        exit('');
    end;

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

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

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

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeOnDelete(var FADeprecBook: Record "FA Depreciation Book"; xFADeprecBook: Record "FA Depreciation Book"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeAdjustLinearMethod(var FADepreciationBook: Record "FA Depreciation Book"; var Amount1: Decimal; var Amount2: Decimal; var IsHandled: Boolean)
    begin
    end;

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

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

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

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

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

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

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

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateNoOfDepreYears(FANo: Code[20]; DeprecBook: Record "Depreciation Book"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeValidateNoOfDeprMonths(FANo: Code[20]; DeprecBook: Record "Depreciation Book"; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeCalculateDepreEndingDate(var FADeprBook: Record "FA Depreciation Book"; DeprEndDate: Date; var IsHandled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnBeforeModifyFADeprBook(FADepreBook: Record "FA Depreciation Book"; var IsHandled: Boolean)
    begin
    end;

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

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

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

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

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

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

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

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

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