Codeunit 396 NoSeriesManagement in 25

App
Business Foundation
Namespace
Microsoft.Foundation.NoSeries
Obsolete
Pending 24.0. Please use the "No. Series" and "No. Series - Batch" codeunits instead

Procedures, 51Events, 26

Versions171819202122232425262728latest

Source242526

Source in 25

src/Business Foundation/App/NoSeries/src/Legacy/NoSeriesManagement.Codeunit.al1040 lines, Copyright (c) Microsoft Corporation. MIT

#if not CLEAN24
#pragma warning disable AL0432
// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------

namespace Microsoft.Foundation.NoSeries;

codeunit 396 NoSeriesManagement
{
    InherentEntitlements = X;
    InherentPermissions = X;
    ObsoleteReason = 'Please use the "No. Series" and "No. Series - Batch" codeunits instead';
    ObsoleteState = Pending;
    ObsoleteTag = '24.0';
    Permissions = tabledata "No. Series Line" = rimd,
                  tabledata "No. Series Line Sales" = r,
                  tabledata "No. Series Line Purchase" = r,
                  tabledata "No. Series" = r;

    trigger OnRun()
    begin
        TryNo := GetNextNo(TryNoSeriesCode, TrySeriesDate, false);
    end;

    var
        GlobalNoSeries: Record "No. Series";
        LastNoSeriesLine: Record "No. Series Line";
        GlobalNoSeriesCode: Code[20];
        WarningNoSeriesCode: Code[20];
        TryNoSeriesCode: Code[20];
        TrySeriesDate: Date;
        TryNo: Code[20];
        UpdateLastUsedDate: Boolean;
        CannotAssignManuallyErr: Label 'You may not enter numbers manually. If you want to enter numbers manually, please activate %1 in %2 %3.', Comment = '%1=Manual Nos. setting,%2=No. Series table caption,%3=No. Series Code';
        CannotAssignAutomaticallyErr: Label 'It is not possible to assign numbers automatically. If you want the program to assign numbers automatically, please activate %1 in %2 %3.', Comment = '%1=Default Nos. setting,%2=No. Series table caption,%3=No. Series Code';
        CannotAssignNewOnDateErr: Label 'You cannot assign new numbers from the number series %1 on %2.', Comment = '%1=No. Series Code,%2=Date';
        CannotAssignNewErr: Label 'You cannot assign new numbers from the number series %1.', Comment = '%1=No. Series Code';
        CannotAssignNewBeforeDateErr: Label 'You cannot assign new numbers from the number series %1 on a date before %2.', Comment = '%1=No. Series Code,%2=Date';
        CannotAssignGreaterErr: Label 'You cannot assign numbers greater than %1 from the number series %2.', Comment = '%1=Last No.,%2=No. Series Code';
        NumberFormatErr: Label 'The number format in %1 must be the same as the number format in %2.', Comment = '%1=No. Series Code,%2=No. Series Code';
        NumberLengthErr: Label 'The number %1 cannot be extended to more than 20 characters.', Comment = '%1=No.';
        PostErr: Label 'You have one or more documents that must be posted before you post document no. %1 according to your company''s No. Series setup.', Comment = '%1=Document No.';
        UnincrementableStringErr: Label 'The value in the %1 field must have a number so that we can assign the next number in the series.', Comment = '%1 = New Field Name';

    [Obsolete('Please use method TestManual(NoSeriesCode: Code[20]) in codeunit "No. Series" instead.', '24.0')]
    procedure TestManual(DefaultNoSeriesCode: Code[20])
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeTestManual(DefaultNoSeriesCode, IsHandled);
        if not IsHandled then
            if DefaultNoSeriesCode <> '' then begin
                GlobalNoSeries.Get(DefaultNoSeriesCode);
                if not GlobalNoSeries."Manual Nos." then
                    Error(CannotAssignManuallyErr, GlobalNoSeries.FieldCaption("Manual Nos."), GlobalNoSeries.TableCaption(), GlobalNoSeries.Code);
            end;
        OnAfterTestManual(DefaultNoSeriesCode);
    end;

    [Obsolete('Please use method IsManual(NoSeriesCode: Code[20]) in codeunit "No. Series" instead.', '24.0')]
    procedure ManualNoAllowed(DefaultNoSeriesCode: Code[20]): Boolean
    begin
        GlobalNoSeries.Get(DefaultNoSeriesCode);
        exit(GlobalNoSeries."Manual Nos.");
    end;

    [Obsolete('Please use method TestManual(NoSeriesCode: Code[20]; DocumentNo: Code[20]) in codeunit "No. Series" instead.', '24.0')]
    procedure TestManualWithDocumentNo(DefaultNoSeriesCode: Code[20]; DocumentNo: Code[20])
    begin
        if DefaultNoSeriesCode <> '' then begin
            GlobalNoSeries.Get(DefaultNoSeriesCode);
            if not GlobalNoSeries."Manual Nos." then
                Error(PostErr, DocumentNo);
        end;
    end;

    [Obsolete('This method is used for compatibility with extension usages of the old OnBeforeInitSeries event. Now the new No. Series is used. InitSeries no longer exist, instead a No. Series is selected and the next number is retrieved.', '24.0')]
    procedure RaiseObsoleteOnBeforeInitSeries(var DefaultNoSeriesCode: Code[20]; OldNoSeriesCode: Code[20]; NewDate: Date; var NewNo: Code[20]; var NewNoSeriesCode: Code[20]; var IsHandled: Boolean)
    begin
        OnBeforeInitSeries(DefaultNoSeriesCode, OldNoSeriesCode, NewDate, NewNo, NewNoSeriesCode, GlobalNoSeries, IsHandled, GlobalNoSeriesCode);
    end;

    [Obsolete('This method is used for compatibility with extension usages of the old OnAfterInitSeries event. Now the new No. Series is used. InitSeries no longer exist, instead a No. Series is selected and the next number is retrieved.', '24.0')]
    procedure RaiseObsoleteOnAfterInitSeries(NoSeriesCode: Code[20]; DefaultNoSeriesCode: Code[20]; NewDate: Date; var NewNo: Code[20])
    var
        NoSeries: Record "No. Series";
    begin
        if NoSeries.Get(NoSeriesCode) then;
        OnAfterInitSeries(NoSeries, DefaultNoSeriesCode, NewDate, NewNo);
    end;

    [Obsolete('Please use AreRelated in the "No. Series" codeunit instead', '24.0')]
    procedure InitSeries(DefaultNoSeriesCode: Code[20]; OldNoSeriesCode: Code[20]; NewDate: Date; var NewNo: Code[20]; var NewNoSeriesCode: Code[20])
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeInitSeries(DefaultNoSeriesCode, OldNoSeriesCode, NewDate, NewNo, NewNoSeriesCode, GlobalNoSeries, IsHandled, GlobalNoSeriesCode);
        if IsHandled then
            exit;

        if NewNo = '' then begin
            GlobalNoSeries.Get(DefaultNoSeriesCode);
            if not GlobalNoSeries."Default Nos." then
                Error(CannotAssignAutomaticallyErr, GlobalNoSeries.FieldCaption("Default Nos."), GlobalNoSeries.TableCaption(), GlobalNoSeries.Code);
            if OldNoSeriesCode <> '' then begin
                GlobalNoSeriesCode := DefaultNoSeriesCode;
                FilterSeries();
                GlobalNoSeries.Code := OldNoSeriesCode;
                if not GlobalNoSeries.Find() then
                    GlobalNoSeries.Get(DefaultNoSeriesCode);
            end;
            NewNo := GetNextNo(GlobalNoSeries.Code, NewDate, true);
            NewNoSeriesCode := GlobalNoSeries.Code;
        end else
            TestManual(DefaultNoSeriesCode);
        OnAfterInitSeries(GlobalNoSeries, DefaultNoSeriesCode, NewDate, NewNo);
    end;

    [Obsolete('Please use the "No. Series" codeunit instead', '24.0')]
    procedure SetDefaultSeries(var NewNoSeriesCode: Code[20]; NoSeriesCode: Code[20])
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSetDefaultSeries(NewNoSeriesCode, NoSeriesCode, IsHandled);
        if IsHandled then
            exit;

        if NoSeriesCode <> '' then begin
            GlobalNoSeries.Get(NoSeriesCode);
            if GlobalNoSeries."Default Nos." then
                NewNoSeriesCode := GlobalNoSeries.Code;
        end;
    end;

    // NewNoSeriesCode specifies the default number series to highlight in the page
    // If this one is not specified then OldNoSeriesCode is used instead as default highlight
    // Otherwise DefaultNoSeriesCode is used if it exist
    // All related no series to DefaultNoSeriesCode are also available for selection
    [Obsolete('Use method LookupRelatedNoSeries in codeunit "No. Series instead.', '24.0')]
    procedure SelectSeries(DefaultNoSeriesCode: Code[20]; OldNoSeriesCode: Code[20]; var NewNoSeriesCode: Code[20]): Boolean
    var
        IsHandled: Boolean;
        Result: Boolean;
    begin
        IsHandled := false;
        OnBeforeSelectSeries(DefaultNoSeriesCode, OldNoSeriesCode, NewNoSeriesCode, Result, IsHandled);
        if IsHandled then
            exit(Result);

        GlobalNoSeriesCode := DefaultNoSeriesCode;
        FilterSeries();
        if NewNoSeriesCode = '' then begin
            if OldNoSeriesCode <> '' then
                GlobalNoSeries.Code := OldNoSeriesCode;
        end else
            GlobalNoSeries.Code := NewNoSeriesCode;
        OnSelectSeriesOnBeforePageRunModal(DefaultNoSeriesCode, GlobalNoSeries);
        if Page.RunModal(0, GlobalNoSeries) = Action::LookupOK then begin
            NewNoSeriesCode := GlobalNoSeries.Code;
            exit(true);
        end;
    end;

    [Obsolete('This is a temporary method for compatibility only.', '24.0')]
    internal procedure RaiseObsoleteOnBeforeSelectSeries(var DefaultNoSeriesCode: Code[20]; OldNoSeriesCode: Code[20]; var NewNoSeriesCode: Code[20]; var Result: Boolean; var IsHandled: Boolean)
    begin
        OnBeforeSelectSeries(DefaultNoSeriesCode, OldNoSeriesCode, NewNoSeriesCode, Result, IsHandled);
    end;

    [Obsolete('This is a temporary method for compatibility only.', '24.0')]
    internal procedure RaiseObsoleteOnSelectSeriesOnBeforePageRunModal(var DefaultNoSeriesCode: Code[20]; var NoSeries: Record "No. Series")
    begin
        OnSelectSeriesOnBeforePageRunModal(DefaultNoSeriesCode, NoSeries);
    end;

    [Obsolete('Use method LookupRelatedNoSeries in codeunit "No. Series" instead.', '24.0')]
    procedure LookupSeries(DefaultNoSeriesCode: Code[20]; var NewNoSeriesCode: Code[20]): Boolean
    begin
        exit(SelectSeries(DefaultNoSeriesCode, NewNoSeriesCode, NewNoSeriesCode));
    end;

    [Obsolete('Use method TestAreRelated in codeunit "No. Series" instead.', '24.0')]
    procedure TestSeries(DefaultNoSeriesCode: Code[20]; NewNoSeriesCode: Code[20])
    begin
        GlobalNoSeriesCode := DefaultNoSeriesCode;
        FilterSeries();
        GlobalNoSeries.Code := NewNoSeriesCode;
#pragma warning disable AA0175
        GlobalNoSeries.Find();
#pragma warning restore AA0175
    end;

    [Obsolete('Use method GetNextNo in codeunit "No. Series" instead.', '24.0')]
    procedure SetSeries(var NewNo: Code[20])
    var
        NoSeriesCode2: Code[20];
    begin
        NoSeriesCode2 := GlobalNoSeries.Code;
        FilterSeries();
        GlobalNoSeries.Code := NoSeriesCode2;
        GlobalNoSeries.Find();
        NewNo := GetNextNo(GlobalNoSeries.Code, 0D, true);
    end;

    [Obsolete('This method will be removed. There is no replacement.', '24.0')]
    procedure FilterSeries()
    var
        NoSeriesRelationship: Record "No. Series Relationship";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeFilterSeries(GlobalNoSeries, GlobalNoSeriesCode, IsHandled);
        if IsHandled then
            exit;

        GlobalNoSeries.Reset();
        NoSeriesRelationship.SetRange(Code, GlobalNoSeriesCode);
        if NoSeriesRelationship.FindSet() then
            repeat
                GlobalNoSeries.Code := NoSeriesRelationship."Series Code";
                GlobalNoSeries.Mark := true;
            until NoSeriesRelationship.Next() = 0;
        if GlobalNoSeries.Get(GlobalNoSeriesCode) then
            GlobalNoSeries.Mark := true;
        GlobalNoSeries.MarkedOnly := true;
    end;

    [Obsolete('This is a temporary method for compatibility only.', '24.0')]
    internal procedure RaiseObsoleteOnBeforeFilterSeries(var NoSeries: Record "No. Series"; NoSeriesCode: Code[20]; IsHandled: Boolean);
    begin
        OnBeforeFilterSeries(NoSeries, NoSeriesCode, IsHandled);
    end;

#pragma warning disable AS0072
    [Obsolete('Please use method GetNextNo(Code[20]; Date) or PeekNextNo(Code[20]; UsageDate) in the codeunit "No. Series" or "No. Series - Batch" instead. GetNextNo(Code[20]; Date; Boolean) does not have the same behavior. Make sure to use the correct parameters.', '24.0')]
    procedure GetNextNo(NoSeriesCode: Code[20]; SeriesDate: Date; ModifySeries: Boolean) Result: Code[20]
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeGetNextNo(NoSeriesCode, SeriesDate, ModifySeries, Result, IsHandled, LastNoSeriesLine);
        if IsHandled then
            exit(Result);

        exit(DoGetNextNo(NoSeriesCode, SeriesDate, ModifySeries, false));
    end;
#pragma warning restore AS0072

    /// <summary>
    /// This method is added for compatibility only.It raises the obsolete OnBeforeGetNextNo event. 
    /// </summary>
    /// <remarks>
    /// There's a bit of a symantic change with this event. You can no longer change things like ModifySeries, UsageDate, SeriesCode using this event
    /// Also, the line record passed is no longer the line from the previous call as that data is not kept anymore in regular scenarios.
    /// </remarks>
    /// <param name="NoSeriesLine">The "Series Code" field is taken from this line on input. If handled, then the actual line used is returned in this parameter.</param>
    /// <param name="UsageDate">The date on which to get a number.</param>
    /// <param name="ModifySeries">Specifies whether the line should be modified.</param>
    /// <param name="Result">The new number from the specified series.</param>
    /// <param name="IsHandled">Specifies whether a subscriber handled the event.</param>
    [Obsolete('This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead', '24.0')]
    internal procedure RaiseObsoleteOnBeforeGetNextNo(var NoSeriesLine: Record "No. Series Line"; UsageDate: Date; ModifySeries: Boolean; var Result: Code[20]; var IsHandled: Boolean)
    var
        NoSeriesLine2: Record "No. Series Line";
    begin
        NoSeriesLine2.Copy(NoSeriesLine);
        OnBeforeGetNextNo(NoSeriesLine2."Series Code", UsageDate, ModifySeries, Result, IsHandled, NoSeriesLine);
        if IsHandled then
            NoSeriesLine.Copy(NoSeriesLine2);
    end;

    [Obsolete('Use DoGetNextNo() instead', '21.0')]
    procedure GetNextNo3(NoSeriesCode: Code[20]; SeriesDate: Date; ModifySeries: Boolean; NoErrorsOrWarnings: Boolean): Code[20]
    begin
        exit(DoGetNextNo(NoSeriesCode, SeriesDate, ModifySeries, NoErrorsOrWarnings));
    end;

    /// <summary>
    /// Gets the next number in a number series.
    /// If ModifySeries is set to true, the number series is incremented when getting the next number.
    /// </summary>
    /// <remark>If you set ModifySeries to false you should manually increment the number series to ensure consistency.</remark>
    /// <param name="NoSeriesCode">The identifier of the number series.</param>
    /// <param name="SeriesDate">The date of the number series. The default date is WorkDate.</param>
    /// <param name="ModifySeries">
    /// Set to true to increment the number series when getting the next number.
    /// Set to false if you want to manually increment the number series.
    /// </param>
    /// <param name="NoErrorsOrWarnings">Set to true to disable errors and warnings.</param>
    /// <returns>The next number in the number series.</returns>
    procedure DoGetNextNo(NoSeriesCode: Code[20]; SeriesDate: Date; ModifySeries: Boolean; NoErrorsOrWarnings: Boolean): Code[20]
    var
        NoSeriesLine: Record "No. Series Line";
        CurrNoSeriesLine: Record "No. Series Line";
    begin
        OnBeforeDoGetNextNo(NoSeriesCode, SeriesDate, ModifySeries, NoErrorsOrWarnings);
        if SeriesDate = 0D then
            SeriesDate := WorkDate();

        FindNoSeriesLine(CurrNoSeriesLine, NoSeriesCode, SeriesDate);
        if ModifySeries or (LastNoSeriesLine."Series Code" = '') or (LastNoSeriesLine."Series Code" <> NoSeriesCode) or ((LastNoSeriesLine."Line No." <> CurrNoSeriesLine."Line No.") and (LastNoSeriesLine."Series Code" = NoSeriesCode)) then begin
            GlobalNoSeries.Get(NoSeriesCode);
            if not FindNoSeriesLine(NoSeriesLine, NoSeriesCode, SeriesDate) then begin
                if NoErrorsOrWarnings then
                    exit('');
                NoSeriesLine.SetRange("Starting Date");
                if not NoSeriesLine.IsEmpty() then
                    Error(CannotAssignNewOnDateErr, NoSeriesCode, SeriesDate);
                Error(CannotAssignNewErr, NoSeriesCode);
            end;
            UpdateLastUsedDate := NoSeriesLine."Last Date Used" <> SeriesDate;
            if ModifySeries and (not (NoSeriesLine.Implementation = "No. Series Implementation"::Sequence) or UpdateLastUsedDate) then begin
                NoSeriesLine.LockTable();
                NoSeriesLine.Find();
            end;
        end else
            NoSeriesLine := LastNoSeriesLine;

        if GlobalNoSeries."Date Order" and (SeriesDate < NoSeriesLine."Last Date Used") then begin
            if NoErrorsOrWarnings then
                exit('');
            Error(CannotAssignNewBeforeDateErr, GlobalNoSeries.Code, NoSeriesLine."Last Date Used");
        end;

        NoSeriesLine."Last Date Used" := SeriesDate;
        if (NoSeriesLine.Implementation = "No. Series Implementation"::Sequence) and (LastNoSeriesLine."Series Code" = '') then
            NoSeriesLine."Last No. Used" := NoSeriesLine.GetNextSequenceNo(ModifySeries)
        else
            if NoSeriesLine."Last No. Used" = '' then begin
                if NoErrorsOrWarnings and (NoSeriesLine."Starting No." = '') then
                    exit('');
                NoSeriesLine.TestField("Starting No.");
                NoSeriesLine."Last No. Used" := NoSeriesLine."Starting No.";
            end else
                if NoSeriesLine."Increment-by No." <= 1 then
                    NoSeriesLine."Last No. Used" := IncStr(NoSeriesLine."Last No. Used")
                else
                    IncrementNoText(NoSeriesLine."Last No. Used", NoSeriesLine."Increment-by No.");

        // Ensure number is within the valid range
        if (NoSeriesLine."Ending No." <> '') and
           (NoSeriesLine."Last No. Used" > NoSeriesLine."Ending No.")
        then begin
            if NoErrorsOrWarnings then
                exit('');
            Error(CannotAssignGreaterErr, NoSeriesLine."Ending No.", NoSeriesCode);
        end;

        if (NoSeriesLine."Ending No." <> '') and
           (NoSeriesLine."Warning No." <> '') and
           (NoSeriesLine."Last No. Used" >= NoSeriesLine."Warning No.") and
           (NoSeriesCode <> WarningNoSeriesCode) and
           (TryNoSeriesCode = '')
        then begin
            if NoErrorsOrWarnings then
                exit('');
            WarningNoSeriesCode := NoSeriesCode;
            Message(CannotAssignGreaterErr, NoSeriesLine."Ending No.", NoSeriesCode);
        end;

        if ModifySeries and NoSeriesLine.Open and (not (NoSeriesLine.Implementation = "No. Series Implementation"::Sequence) or UpdateLastUsedDate) then
            ModifyNoSeriesLine(NoSeriesLine);
        if not ModifySeries then
            LastNoSeriesLine := NoSeriesLine;

        OnAfterGetNextNo3(NoSeriesLine, ModifySeries);
        exit(NoSeriesLine."Last No. Used");
    end;

    procedure FindNoSeriesLine(var NoSeriesLineResult: Record "No. Series Line"; NoSeriesCode: Code[20]; SeriesDate: Date): Boolean
    begin
        SetNoSeriesLineFilter(NoSeriesLineResult, NoSeriesCode, SeriesDate);
        exit(NoSeriesLineResult.FindFirst());
    end;

    procedure IsCurrentNoSeriesLine(NoSeriesLineIn: Record "No. Series Line"): Boolean
    begin
        exit((NoSeriesLineIn."Series Code" = LastNoSeriesLine."Series Code") and (NoSeriesLineIn."Line No." = LastNoSeriesLine."Line No."));
    end;

    internal procedure ModifyNoSeriesLine(var NoSeriesLine: Record "No. Series Line")
    var
        IsHandled: Boolean;
        LastNoUsed: Code[20];
    begin
        IsHandled := false;
        OnBeforeModifyNoSeriesLine(NoSeriesLine, IsHandled);
        if IsHandled then
            exit;
        NoSeriesLine.Validate(Open);
        LastNoUsed := NoSeriesLine."Last No. Used";
        if NoSeriesLine.Implementation = "No. Series Implementation"::Sequence then
            NoSeriesLine."Last No. Used" := '';
        NoSeriesLine.Modify();
        NoSeriesLine."Last No. Used" := LastNoUsed;
    end;

    [Obsolete('Use PeekNextNo from codeunit "No. Series" instead.', '24.0')]
    procedure TryGetNextNo(NoSeriesCode: Code[20]; SeriesDate: Date): Code[20]
    var
        NoSeriesManagement: Codeunit NoSeriesManagement;
    begin
        NoSeriesManagement.SetParametersBeforeRun(NoSeriesCode, SeriesDate);
        if NoSeriesManagement.Run() then
            exit(NoSeriesManagement.GetNextNoAfterRun());
    end;

    [Obsolete('Use SetParametersBeforeRun() instead', '21.0')]
    procedure GetNextNo1(NoSeriesCode: Code[20]; SeriesDate: Date)
    begin
        SetParametersBeforeRun(NoSeriesCode, SeriesDate);
    end;

    procedure SetParametersBeforeRun(NoSeriesCode: Code[20]; SeriesDate: Date)
    begin
        TryNoSeriesCode := NoSeriesCode;
        TrySeriesDate := SeriesDate;
        OnAfterSetParametersBeforeRun(TryNoSeriesCode, TrySeriesDate, WarningNoSeriesCode);
    end;

    [Obsolete('Use GetNextNoAfterRun() instead', '21.0')]
    procedure GetNextNo2(): Code[20]
    begin
        exit(GetNextNoAfterRun());
    end;

    procedure GetNextNoAfterRun(): Code[20]
    begin
        exit(TryNo);
    end;

    [Obsolete('Use the SaveState method in the No. Series - Batch codeunit instead.', '24.0')]
    procedure SaveNoSeries()
    var
        NoSeries: Codeunit "No. Series";
        NoSeriesSequenceImpl: Codeunit "No. Series - Sequence Impl.";
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeSaveNoSeries(LastNoSeriesLine, IsHandled);
        if not IsHandled then
            if LastNoSeriesLine."Series Code" <> '' then begin
                if (LastNoSeriesLine.Implementation = "No. Series Implementation"::Sequence) then
                    if (LastNoSeriesLine."Last No. Used" <> '') and (LastNoSeriesLine."Last No. Used" > NoSeries.GetLastNoUsed(LastNoSeriesLine)) then
                        RestartSequence(LastNoSeriesLine, NoSeriesSequenceImpl.ExtractNoFromCode(LastNoSeriesLine."Last No. Used", LastNoSeriesLine."Series Code"));
                if not (LastNoSeriesLine.Implementation = "No. Series Implementation"::Sequence) or UpdateLastUsedDate then
                    ModifyNoSeriesLine(LastNoSeriesLine);
            end;
        OnAfterSaveNoSeries(LastNoSeriesLine);
    end;

    internal procedure RestartSequence(var NoSeriesLine: Record "No. Series Line"; NewStartingNo: BigInteger)
    begin
        NoSeriesLine.TestField(Implementation, NoSeriesLine.Implementation::Sequence);
        NoSeriesLine.TestField("Sequence Name");
        NoSeriesLine."Starting Sequence No." := NewStartingNo;
        if NoSeriesLine."Last No. Used" = '' then
            NumberSequence.Restart(NoSeriesLine."Sequence Name", NoSeriesLine."Starting Sequence No." - NoSeriesLine."Increment-by No.")
        else begin
            NumberSequence.Restart(NoSeriesLine."Sequence Name", NoSeriesLine."Starting Sequence No.");
            if NumberSequence.Next(NoSeriesLine."Sequence Name") = 0 then;  // Simulate that a number was used
        end;
    end;

    procedure ClearNoSeriesLine()
    begin
        Clear(LastNoSeriesLine);
    end;

    internal procedure SetAllowGaps(var NoSeries: Record "No. Series"; AllowGaps: Boolean)
    var
        NoSeriesLine: Record "No. Series Line";
        StartDate: Date;
    begin
        FindNoSeriesLineToShow(NoSeries, NoSeriesLine);
        StartDate := NoSeriesLine."Starting Date";
        NoSeriesLine.SetRange("Allow Gaps in Nos.", not AllowGaps);
        NoSeriesLine.SetFilter("Starting Date", '>=%1', StartDate);
        NoSeriesLine.LockTable();
        if NoSeriesLine.FindSet() then
            repeat
                NoSeriesLine.Validate("Allow Gaps in Nos.", AllowGaps);
                NoSeriesLine.Modify();
            until NoSeriesLine.Next() = 0;
    end;

    internal procedure FindNoSeriesLineToShow(var NoSeries: Record "No. Series"; var NoSeriesLine: Record "No. Series Line")
    begin
        SetNoSeriesLineFilter(NoSeriesLine, NoSeries.Code, 0D);

        if NoSeriesLine.FindLast() then
            exit;

        NoSeriesLine.Reset();
        NoSeriesLine.SetRange("Series Code", NoSeries.Code);
    end;

    [Obsolete('Please use the method GetNoSeriesLine on the "No. Series" and "No. Series - Batch" codeunits instead', '24.0')]
    procedure SetNoSeriesLineFilter(var NoSeriesLine: Record "No. Series Line"; NoSeriesCode: Code[20]; StartDate: Date)
    begin
        if StartDate = 0D then
            StartDate := WorkDate();

        NoSeriesLine.Reset();
        NoSeriesLine.SetCurrentKey("Series Code", "Starting Date");
        NoSeriesLine.SetRange("Series Code", NoSeriesCode);
        NoSeriesLine.SetRange("Starting Date", 0D, StartDate);
        RaiseObsoleteOnNoSeriesLineFilterOnBeforeFindLast(NoSeriesLine);
        if NoSeriesLine.FindLast() then begin
            NoSeriesLine.SetRange("Starting Date", NoSeriesLine."Starting Date");
            NoSeriesLine.SetRange(Open, true);
        end;
    end;

    internal procedure RaiseObsoleteOnNoSeriesLineFilterOnBeforeFindLast(var NoSeriesLine: Record "No. Series Line")
    begin
        OnNoSeriesLineFilterOnBeforeFindLast(NoSeriesLine);
    end;

    procedure IncrementNoText(var No: Code[20]; IncrementByNo: Decimal)
    var
        BigIntNo: BigInteger;
        BigIntIncByNo: BigInteger;
        StartPos: Integer;
        EndPos: Integer;
        NewNo: Code[20];
    begin
        GetIntegerPos(No, StartPos, EndPos);
        Evaluate(BigIntNo, CopyStr(No, StartPos, EndPos - StartPos + 1));
        BigIntIncByNo := IncrementByNo;
        NewNo := CopyStr(Format(BigIntNo + BigIntIncByNo, 0, 1), 1, MaxStrLen(NewNo));
        ReplaceNoText(No, NewNo, 0, StartPos, EndPos);
    end;

    [Obsolete('Please use the method from "No. Series - Setup" instead.', '24.0')]
    procedure UpdateNoSeriesLine(var NoSeriesLine: Record "No. Series Line"; NewNo: Code[20]; NewFieldName: Text[100])
    var
        NoSeriesLine2: Record "No. Series Line";
        Length: Integer;
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeUpdateNoSeriesLine(NoSeriesLine, NewNo, NewFieldName, IsHandled);
        if IsHandled then
            exit;

        if NewNo <> '' then begin
            if IncStr(NewNo) = '' then
                Error(UnincrementableStringErr, NewFieldName);
            NoSeriesLine2 := NoSeriesLine;
            if NewNo = GetNoText(NewNo) then
                Length := 0
            else begin
                Length := StrLen(GetNoText(NewNo));
                UpdateLength(NoSeriesLine."Starting No.", Length);
                UpdateLength(NoSeriesLine."Ending No.", Length);
                UpdateLength(NoSeriesLine."Last No. Used", Length);
                UpdateLength(NoSeriesLine."Warning No.", Length);
            end;
            UpdateNo(NoSeriesLine."Starting No.", NewNo, Length);
            UpdateNo(NoSeriesLine."Ending No.", NewNo, Length);
            UpdateNo(NoSeriesLine."Last No. Used", NewNo, Length);
            UpdateNo(NoSeriesLine."Warning No.", NewNo, Length);
            if (NewFieldName <> NoSeriesLine.FieldCaption("Last No. Used")) and
               (NoSeriesLine."Last No. Used" <> NoSeriesLine2."Last No. Used")
            then
                Error(NumberFormatErr, NewFieldName, NoSeriesLine.FieldCaption("Last No. Used"));
        end;
    end;

    local procedure UpdateLength(No: Code[20]; var MaxLength: Integer)
    var
        Length: Integer;
    begin
        if No <> '' then begin
            Length := StrLen(DelChr(GetNoText(No), '<', '0'));
            if Length > MaxLength then
                MaxLength := Length;
        end;
    end;

    local procedure UpdateNo(var No: Code[20]; NewNo: Code[20]; Length: Integer)
    var
        StartPos: Integer;
        EndPos: Integer;
        TempNo: Code[20];
    begin
        if No <> '' then
            if Length <> 0 then begin
                No := DelChr(GetNoText(No), '<', '0');
                TempNo := No;
                No := NewNo;
                NewNo := TempNo;
                GetIntegerPos(No, StartPos, EndPos);
                ReplaceNoText(No, NewNo, Length, StartPos, EndPos);
            end;
    end;

    local procedure ReplaceNoText(var No: Code[20]; NewNo: Code[20]; FixedLength: Integer; StartPos: Integer; EndPos: Integer)
    var
        StartNo: Code[20];
        EndNo: Code[20];
        ZeroNo: Code[20];
        NewLength: Integer;
        OldLength: Integer;
    begin
        if StartPos > 1 then
            StartNo := CopyStr(CopyStr(No, 1, StartPos - 1), 1, MaxStrLen(StartNo));
        if EndPos < StrLen(No) then
            EndNo := CopyStr(CopyStr(No, EndPos + 1), 1, MaxStrLen(EndNo));
        NewLength := StrLen(NewNo);
        OldLength := EndPos - StartPos + 1;
        if FixedLength > OldLength then
            OldLength := FixedLength;
        if OldLength > NewLength then
            ZeroNo := CopyStr(PadStr('', OldLength - NewLength, '0'), 1, MaxStrLen(ZeroNo));
        if StrLen(StartNo) + StrLen(ZeroNo) + StrLen(NewNo) + StrLen(EndNo) > 20 then
            Error(NumberLengthErr, No);
        No := CopyStr(StartNo + ZeroNo + NewNo + EndNo, 1, MaxStrLen(No));
    end;

    local procedure GetNoText(No: Code[20]): Code[20]
    var
        StartPos: Integer;
        EndPos: Integer;
    begin
        GetIntegerPos(No, StartPos, EndPos);
        if StartPos <> 0 then
            exit(CopyStr(CopyStr(No, StartPos, EndPos - StartPos + 1), 1, 20));
    end;

    local procedure GetIntegerPos(No: Code[20]; var StartPos: Integer; var EndPos: Integer)
    var
        IsDigit: Boolean;
        i: Integer;
    begin
        StartPos := 0;
        EndPos := 0;
        if No <> '' then begin
            i := StrLen(No);
            repeat
                IsDigit := No[i] in ['0' .. '9'];
                if IsDigit then begin
                    if EndPos = 0 then
                        EndPos := i;
                    StartPos := i;
                end;
                i := i - 1;
            until (i = 0) or (StartPos <> 0) and not IsDigit;
        end;
    end;

    [Obsolete('The No. Series Line Sales table is obsolete. Please use the No. Series Line table instead.', '24.0')]
    [Scope('OnPrem')]
    procedure SetNoSeriesLineSalesFilter(var NoSeriesLineSales: Record "No. Series Line Sales"; NoSeriesCode: Code[20]; StartDate: Date)
    begin
        OnObsoleteSetNoSeriesLineSalesFilter(NoSeriesLineSales, NoSeriesCode, StartDate);
    end;

    [Obsolete('The No. Series Line Purchase table is obsolete. Please use the No. Series Line table instead.', '24.0')]
    [Scope('OnPrem')]
    procedure SetNoSeriesLinePurchaseFilter(var NoSeriesLinePurchase: Record "No. Series Line Purchase"; NoSeriesCode: Code[20]; StartDate: Date)
    begin
        OnObsoleteSetNoSeriesLinePurchaseFilter(NoSeriesLinePurchase, NoSeriesCode, StartDate);
    end;

    [Obsolete('The No. Series Line Sales table is obsolete. Please use the No. Series Line table instead.', '24.0')]
    [Scope('OnPrem')]
    procedure UpdateNoSeriesLineSales(var NoSeriesLineSales: Record "No. Series Line Sales"; NewNo: Code[20]; NewFieldName: Text[30])
    var
        NoSeriesLineSales2: Record "No. Series Line Sales";
        Length: Integer;
    begin
        if NewNo <> '' then begin
            if IncStr(NewNo) = '' then
                Error(UnincrementableStringErr, NewFieldName);
            NoSeriesLineSales2 := NoSeriesLineSales;
            if NewNo = GetNoText(NewNo) then
                Length := 0
            else begin
                Length := StrLen(GetNoText(NewNo));
                UpdateLength(NoSeriesLineSales."Starting No.", Length);
                UpdateLength(NoSeriesLineSales."Ending No.", Length);
                UpdateLength(NoSeriesLineSales."Last No. Used", Length);
                UpdateLength(NoSeriesLineSales."Warning No.", Length);
            end;
            UpdateNo(NoSeriesLineSales."Starting No.", NewNo, Length);
            UpdateNo(NoSeriesLineSales."Ending No.", NewNo, Length);
            UpdateNo(NoSeriesLineSales."Last No. Used", NewNo, Length);
            UpdateNo(NoSeriesLineSales."Warning No.", NewNo, Length);
            if (NewFieldName <> NoSeriesLineSales.FieldCaption("Last No. Used")) and
               (NoSeriesLineSales."Last No. Used" <> NoSeriesLineSales2."Last No. Used")
            then
                Error(
                  NumberFormatErr,
                  NewFieldName, NoSeriesLineSales.FieldCaption("Last No. Used"));
        end;
    end;

    [Obsolete('The No. Series Line Purchase table is obsolete. Please use the No. Series Line table instead.', '24.0')]
    [Scope('OnPrem')]
    procedure UpdateNoSeriesLinePurchase(var NoSeriesLinePurchase: Record "No. Series Line Purchase"; NewNo: Code[20]; NewFieldName: Text[30])
    var
        NoSeriesLinePurchase2: Record "No. Series Line Purchase";
        Length: Integer;
    begin
        if NewNo <> '' then begin
            if IncStr(NewNo) = '' then
                Error(UnincrementableStringErr, NewFieldName);
            NoSeriesLinePurchase2 := NoSeriesLinePurchase;
            if NewNo = GetNoText(NewNo) then
                Length := 0
            else begin
                Length := StrLen(GetNoText(NewNo));
                UpdateLength(NoSeriesLinePurchase."Starting No.", Length);
                UpdateLength(NoSeriesLinePurchase."Ending No.", Length);
                UpdateLength(NoSeriesLinePurchase."Last No. Used", Length);
                UpdateLength(NoSeriesLinePurchase."Warning No.", Length);
            end;
            UpdateNo(NoSeriesLinePurchase."Starting No.", NewNo, Length);
            UpdateNo(NoSeriesLinePurchase."Ending No.", NewNo, Length);
            UpdateNo(NoSeriesLinePurchase."Last No. Used", NewNo, Length);
            UpdateNo(NoSeriesLinePurchase."Warning No.", NewNo, Length);
            if (NewFieldName <> NoSeriesLinePurchase.FieldCaption("Last No. Used")) and
               (NoSeriesLinePurchase."Last No. Used" <> NoSeriesLinePurchase2."Last No. Used")
            then
                Error(
                  NumberFormatErr,
                  NewFieldName, NoSeriesLinePurchase.FieldCaption("Last No. Used"));
        end;
    end;

    [Obsolete('Call TestField on the "No. Series" record, "Date Order" field directly.', '24.0')]
    [Scope('OnPrem')]
    procedure TestDateOrder(NoSeriesCode: Code[20])
    begin
        GlobalNoSeries.Get(NoSeriesCode);
        GlobalNoSeries.TestField("Date Order");
    end;

    [Obsolete('The No. Series module cannot have dependencies to Sales. Please use the method in codeunit "IT - Report Management" instead', '24.0')]
    procedure CheckSalesDocNoGaps(MaxDate: Date)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckSalesDocNoGaps(MaxDate, IsHandled);
        if IsHandled then
            exit;

        OnObsoleteCheckSalesDocNoGaps(MaxDate);
    end;

    [Obsolete('The No. Series module cannot have dependencies to Purchases. Please use the method in codeunit "IT - Report Management" instead', '24.0')]
    procedure CheckPurchDocNoGaps(MaxDate: Date)
    var
        IsHandled: Boolean;
    begin
        IsHandled := false;
        OnBeforeCheckPurchDocNoGaps(MaxDate, IsHandled);
        if IsHandled then
            exit;

        OnObsoleteCheckPurchDocNoGaps(MaxDate);
    end;

    [Obsolete('The No. Series module cannot have dependencies to Sales. Please use the method in codeunit "IT - Report Management" instead', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnObsoleteCheckSalesDocNoGaps(MaxDate: Date)
    begin
    end;

    [Obsolete('The No. Series module cannot have dependencies to Purchases. Please use the method in codeunit "IT - Report Management" instead', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnObsoleteCheckPurchDocNoGaps(MaxDate: Date)
    begin
    end;

    [Obsolete('The No. Series module cannot have dependencies to Sales. Please use the event in codeunit "IT - Report Management" instead', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckPurchDocNoGaps(MaxDate: Date; var IsHandled: Boolean)
    begin
    end;

    [Obsolete('The No. Series module cannot have dependencies to Purchases. Please use the event in codeunit "IT - Report Management" instead', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeCheckSalesDocNoGaps(MaxDate: Date; var IsHandled: Boolean)
    begin
    end;

    [Obsolete('Use method LookupRelatedNoSeries in codeunit "No. Series" instead.', '24.0')]
    procedure GetNoSeriesWithCheck(NewNoSeriesCode: Code[20]; SelectNoSeriesAllowed: Boolean; CurrentNoSeriesCode: Code[20]): Code[20]
    begin
        if not SelectNoSeriesAllowed then
            exit(NewNoSeriesCode);

        GlobalNoSeries.Get(NewNoSeriesCode);
        if GlobalNoSeries."Default Nos." then
            exit(NewNoSeriesCode);

        if SeriesHasRelations(NewNoSeriesCode) then
            if SelectSeries(NewNoSeriesCode, '', CurrentNoSeriesCode) then
                exit(CurrentNoSeriesCode);
        exit(NewNoSeriesCode);
    end;

    [Obsolete('Use method HasRelatedSeries in codeunit "No. Series" instead.', '24.0')]
    procedure SeriesHasRelations(DefaultNoSeriesCode: Code[20]): Boolean
    var
        NoSeriesRelationship: Record "No. Series Relationship";
    begin
        NoSeriesRelationship.Reset();
        NoSeriesRelationship.SetRange(Code, DefaultNoSeriesCode);
        exit(not NoSeriesRelationship.IsEmpty);
    end;

    [Scope('OnPrem')]
    procedure ReverseGetNextNo(NoSeriesCode: Code[20]; SeriesDate: Date; ModifySeries: Boolean): Code[20] // Backwards compatibility for apac
    var
        NoSeriesLine: Record "No. Series Line";
    begin
        if SeriesDate = 0D then
            SeriesDate := WorkDate();

        if ModifySeries or (LastNoSeriesLine."Series Code" = '') then begin
            if ModifySeries then
                NoSeriesLine.LockTable();
            GlobalNoSeries.Get(NoSeriesCode);
            if not FindNoSeriesLine(NoSeriesLine, NoSeriesCode, SeriesDate) then begin
                NoSeriesLine.SetRange("Starting Date");
                if NoSeriesLine.Find('-') then
                    Error(CannotAssignNewOnDateErr, NoSeriesCode, SeriesDate);
                Error(CannotAssignNewErr, NoSeriesCode);
            end;
        end else
            NoSeriesLine := LastNoSeriesLine;
        NoSeriesLine.TestField(Implementation, "No. Series Implementation"::Normal);

        if GlobalNoSeries."Date Order" and (SeriesDate < NoSeriesLine."Last Date Used") then
            Error(CannotAssignNewBeforeDateErr, GlobalNoSeries.Code, NoSeriesLine."Last Date Used");
        NoSeriesLine."Last Date Used" := SeriesDate;
        if NoSeriesLine."Last No. Used" = '' then begin
            NoSeriesLine.TestField("Starting No.");
            NoSeriesLine."Last No. Used" := NoSeriesLine."Starting No.";
        end else
            IncrementNoText(NoSeriesLine."Last No. Used", -NoSeriesLine."Increment-by No.");
        if (NoSeriesLine."Ending No." <> '') and
           (NoSeriesLine."Last No. Used" > NoSeriesLine."Ending No.")
        then
            Error(CannotAssignGreaterErr, NoSeriesLine."Ending No.", NoSeriesCode);
        if (NoSeriesLine."Ending No." <> '') and
           (NoSeriesLine."Warning No." <> '') and
           (NoSeriesLine."Last No. Used" >= NoSeriesLine."Warning No.") and
           (NoSeriesCode <> WarningNoSeriesCode) and
           (TryNoSeriesCode = '')
        then begin
            WarningNoSeriesCode := NoSeriesCode;
            Message(CannotAssignGreaterErr, NoSeriesLine."Ending No.", NoSeriesCode);
        end;
        NoSeriesLine.Validate(Open);

        if ModifySeries then
            NoSeriesLine.Modify()
        else
            LastNoSeriesLine := NoSeriesLine;
        exit(NoSeriesLine."Last No. Used");
    end;

    [Obsolete('This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead', '24.0')]
    internal procedure RaiseObsoleteOnAfterGetNextNo3(var NoSeriesLine: Record "No. Series Line"; ModifySeries: Boolean)
    begin
        OnAfterGetNextNo3(NoSeriesLine, ModifySeries);
    end;

    [Obsolete('This event is obsolete. Please use the extensibility options provided by the No. Series module.', '24.0')]
    [IntegrationEvent(false, false)]
    internal procedure OnAfterGetNextNo3(var NoSeriesLine: Record "No. Series Line"; ModifySeries: Boolean)
    begin
    end;

    [Obsolete('This event is no longer used. Please use the No. Series Batch codeunit instead.', '24.0')]
    // Symbol usage indicates no subscribers
    [IntegrationEvent(false, false)]
    local procedure OnAfterSaveNoSeries(var NoSeriesLine: Record "No. Series Line")
    begin
    end;

    [Obsolete('The No. Series Line Sales table is obsolete. Please use the No. Series Line table instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnAfterSaveNoSeriesSales(var NoSeriesLineSales: Record "No. Series Line Sales")
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnAfterSetParametersBeforeRun(var TryNoSeriesCode: Code[20]; var TrySeriesDate: Date; var WarningNoSeriesCode: Code[20])
    begin
    end;

    [Obsolete('The No. Series Line Purchase table is obsolete. Please use the No. Series Line table instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnAfterSaveNoSeriesPurchase(var NoSeriesLinePurchase: Record "No. Series Line Purchase")
    begin
    end;

    [Obsolete('This event will be removed. There is no replacement. Please use the extensibility options provided by the No. Series module.', '24.0')]
    [IntegrationEvent(false, false)]
    internal procedure OnAfterTestManual(DefaultNoSeriesCode: Code[20])
    begin
    end;

    [Obsolete('This event is obsolete. Please use the extensibility options provided by the No. Series module.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeGetNextNo(var NoSeriesCode: Code[20]; var SeriesDate: Date; var ModifySeries: Boolean; var Result: Code[20]; var IsHandled: Boolean; var NoSeriesLine: Record "No. Series Line")
    begin
    end;

    [Obsolete('This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead', '24.0')]
    internal procedure RaiseObsoleteOnBeforeDoGetNextNo(var NoSeriesCode: Code[20]; var SeriesDate: Date; ModifySeries: Boolean; var NoErrorsOrWarnings: Boolean)
    begin
        OnBeforeDoGetNextNo(NoSeriesCode, SeriesDate, ModifySeries, NoErrorsOrWarnings);
    end;

    [Obsolete('This event is obsolete. Please use the extensibility options provided by the No. Series module.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeDoGetNextNo(var NoSeriesCode: Code[20]; var SeriesDate: Date; var ModifySeries: Boolean; var NoErrorsOrWarnings: Boolean)
    begin
    end;

    [Obsolete('This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead', '24.0')]
    internal procedure RaiseObsoleteOnBeforeModifyNoSeriesLine(var NoSeriesLine: Record "No. Series Line"; var IsHandled: Boolean)
    begin
        OnBeforeModifyNoSeriesLine(NoSeriesLine, IsHandled);
    end;

    [IntegrationEvent(false, false)]
    internal procedure OnBeforeModifyNoSeriesLine(var NoSeriesLine: Record "No. Series Line"; var IsHandled: Boolean)
    begin
    end;

    [Obsolete('This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead', '24.0')]
    internal procedure RaiseObsoleteOnBeforeUpdateNoSeriesLine(var NoSeriesLine: Record "No. Series Line"; NewNo: Code[20]; NewFieldName: Text[100]; var IsHandled: Boolean)
    begin
        OnBeforeUpdateNoSeriesLine(NoSeriesLine, NewNo, NewFieldName, IsHandled);
    end;

    [Obsolete('This event is obsolete. Please use the extensibility options provided by the No. Series module.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeUpdateNoSeriesLine(var NoSeriesLine: Record "No. Series Line"; NewNo: Code[20]; NewFieldName: Text[100]; var IsHandled: Boolean)
    begin
    end;

    procedure ClearStateAndGetNextNo(NoSeriesCode: Code[20]): Code[20]
    begin
        Clear(LastNoSeriesLine);
        Clear(TryNoSeriesCode);
        Clear(GlobalNoSeries);

        exit(GetNextNo(NoSeriesCode, WorkDate(), false));
    end;

    [Obsolete('Please use OnAfterSetNoSeriesCurrentLineFilters in the No. Series module instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnNoSeriesLineFilterOnBeforeFindLast(var NoSeriesLine: Record "No. Series Line")
    begin
    end;

    [Obsolete('This event will be removed. There is no replacement. Please use the No. Series module instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnAfterInitSeries(var NoSeries: Record "No. Series"; DefaultNoSeriesCode: Code[20]; NewDate: Date; var NewNo: Code[20])
    begin
    end;

    [Obsolete('This event will be removed. There is no replacement. Please use the No. Series module instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeFilterSeries(var NoSeries: Record "No. Series"; NoSeriesCode: Code[20]; var IsHandled: Boolean)
    begin
    end;

    [Obsolete('This event will be removed. There is no replacement. Please use the No. Series module instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeInitSeries(var DefaultNoSeriesCode: Code[20]; OldNoSeriesCode: Code[20]; NewDate: Date; var NewNo: Code[20]; var NewNoSeriesCode: Code[20]; var NoSeries: Record "No. Series"; var IsHandled: Boolean; var NoSeriesCode: Code[20])
    begin
    end;

    [Obsolete('This event will be removed. Please use the Page trigger events instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeSelectSeries(var DefaultNoSeriesCode: Code[20]; OldNoSeriesCode: Code[20]; var NewNoSeriesCode: Code[20]; var Result: Boolean; var IsHandled: Boolean)
    begin
    end;

    [Obsolete('This event will be removed. Please use the Page trigger events instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnSelectSeriesOnBeforePageRunModal(DefaultNoSeriesCode: Code[20]; var NoSeries: Record "No. Series")
    begin
    end;

    [Obsolete('This event is no longer used. Please use the No. Series Batch codeunit instead.', '24.0')]
    // Symbol usage indicates no subscribers
    [IntegrationEvent(false, false)]
    local procedure OnBeforeSaveNoSeries(var NoSeriesLine: Record "No. Series Line"; var IsHandled: Boolean)
    begin
    end;

    [Obsolete('This event will be removed. There is no replacement. Please use the No. Series module instead.', '24.0')]
    [IntegrationEvent(false, false)]
    internal procedure OnBeforeTestManual(var DefaultNoSeriesCode: Code[20]; var IsHandled: Boolean);
    begin
    end;

    [Obsolete('This event will be removed. There is no replacement. Please use the No. Series module instead.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnBeforeSetDefaultSeries(var NewNoSeriesCode: Code[20]; var NoSeriesCode: Code[20]; var IsHandled: Boolean);
    begin
    end;

    [Obsolete('The No. Series module cannot have a dependency on Sales. Do not use this event.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnObsoleteSetNoSeriesLineSalesFilter(var NoSeriesLineSales: Record "No. Series Line Sales"; NoSeriesCode: Code[20]; StartDate: Date)
    begin
    end;

    [Obsolete('The No. Series module cannot have a dependency on Purchase. Do not use this event.', '24.0')]
    [IntegrationEvent(false, false)]
    local procedure OnObsoleteSetNoSeriesLinePurchaseFilter(var NoSeriesLinePurchase: Record "No. Series Line Purchase"; NoSeriesCode: Code[20]; StartDate: Date)
    begin
    end;

    [Obsolete('Temporary event for backwards compatibility. Do not use this event.', '24.0')]
    [IntegrationEvent(false, false)]
    internal procedure OnBeforeUpdateLine(var NoSeries: Record "No. Series"; var StartDate: Date; var StartNo: Code[20]; var EndNo: Code[20]; var LastNoUsed: Code[20]; var WarningNo: Code[20]; var IncrementByNo: Integer; var LastDateUsed: Date; var Implementation: Enum "No. Series Implementation"; var IsHandled: Boolean);
    begin
    end;
}
#pragma warning restore AL0432
#endif

Procedures, 51

NameParametersReturnsAccessObsolete
TestManual(Code[20])publicPending 24.0
Please use method TestManual(NoSeriesCode: Code[20]) in codeunit "No. Series" instead.
ManualNoAllowed(Code[20])BooleanpublicPending 24.0
Please use method IsManual(NoSeriesCode: Code[20]) in codeunit "No. Series" instead.
TestManualWithDocumentNo(Code[20], Code[20])publicPending 24.0
Please use method TestManual(NoSeriesCode: Code[20]; DocumentNo: Code[20]) in codeunit "No. Series" instead.
RaiseObsoleteOnBeforeInitSeries(var Code[20], Code[20], Date, var Code[20], var Code[20], var Boolean)publicPending 24.0
This method is used for compatibility with extension usages of the old OnBeforeInitSeries event. Now the new No. Series is used. InitSeries no longer exist, instead a No. Series is selected and the next number is retrieved.
RaiseObsoleteOnAfterInitSeries(Code[20], Code[20], Date, var Code[20])publicPending 24.0
This method is used for compatibility with extension usages of the old OnAfterInitSeries event. Now the new No. Series is used. InitSeries no longer exist, instead a No. Series is selected and the next number is retrieved.
InitSeries(Code[20], Code[20], Date, var Code[20], var Code[20])publicPending 24.0
Please use AreRelated in the "No. Series" codeunit instead
SetDefaultSeries(var Code[20], Code[20])publicPending 24.0
Please use the "No. Series" codeunit instead
SelectSeries(Code[20], Code[20], var Code[20])BooleanpublicPending 24.0
Use method LookupRelatedNoSeries in codeunit "No. Series instead.
RaiseObsoleteOnBeforeSelectSeries(var Code[20], Code[20], var Code[20], var Boolean, var Boolean)internalPending 24.0
This is a temporary method for compatibility only.
RaiseObsoleteOnSelectSeriesOnBeforePageRunModal(var Code[20], var Record No. Series)internalPending 24.0
This is a temporary method for compatibility only.
LookupSeries(Code[20], var Code[20])BooleanpublicPending 24.0
Use method LookupRelatedNoSeries in codeunit "No. Series" instead.
TestSeries(Code[20], Code[20])publicPending 24.0
Use method TestAreRelated in codeunit "No. Series" instead.
SetSeries(var Code[20])publicPending 24.0
Use method GetNextNo in codeunit "No. Series" instead.
FilterSeries()publicPending 24.0
This method will be removed. There is no replacement.
RaiseObsoleteOnBeforeFilterSeries(var Record No. Series, Code[20], Boolean)internalPending 24.0
This is a temporary method for compatibility only.
GetNextNo(Code[20], Date, Boolean)Code[20]publicPending 24.0
Please use method GetNextNo(Code[20]; Date) or PeekNextNo(Code[20]; UsageDate) in the codeunit "No. Series" or "No. Series - Batch" instead. GetNextNo(Code[20]; Date; Boolean) does not have the same behavior. Make sure to use the correct parameters.
RaiseObsoleteOnBeforeGetNextNo(var Record No. Series Line, Date, Boolean, var Code[20], var Boolean)internalPending 24.0
This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead
GetNextNo3(Code[20], Date, Boolean, Boolean)Code[20]publicPending 21.0
Use DoGetNextNo() instead
DoGetNextNo(Code[20], Date, Boolean, Boolean)Code[20]public-
FindNoSeriesLine(var Record No. Series Line, Code[20], Date)Booleanpublic-
IsCurrentNoSeriesLine(Record No. Series Line)Booleanpublic-
ModifyNoSeriesLine(var Record No. Series Line)internal-
TryGetNextNo(Code[20], Date)Code[20]publicPending 24.0
Use PeekNextNo from codeunit "No. Series" instead.
GetNextNo1(Code[20], Date)publicPending 21.0
Use SetParametersBeforeRun() instead
SetParametersBeforeRun(Code[20], Date)public-
GetNextNo2()Code[20]publicPending 21.0
Use GetNextNoAfterRun() instead
GetNextNoAfterRun()Code[20]public-
SaveNoSeries()publicPending 24.0
Use the SaveState method in the No. Series - Batch codeunit instead.
RestartSequence(var Record No. Series Line, BigInteger)internal-
ClearNoSeriesLine()public-
SetAllowGaps(var Record No. Series, Boolean)internal-
FindNoSeriesLineToShow(var Record No. Series, var Record No. Series Line)internal-
SetNoSeriesLineFilter(var Record No. Series Line, Code[20], Date)publicPending 24.0
Please use the method GetNoSeriesLine on the "No. Series" and "No. Series - Batch" codeunits instead
RaiseObsoleteOnNoSeriesLineFilterOnBeforeFindLast(var Record No. Series Line)internal-
IncrementNoText(var Code[20], Decimal)public-
UpdateNoSeriesLine(var Record No. Series Line, Code[20], Text[100])publicPending 24.0
Please use the method from "No. Series - Setup" instead.
SetNoSeriesLineSalesFilter(var Record No. Series Line Sales, Code[20], Date)publicPending 24.0
The No. Series Line Sales table is obsolete. Please use the No. Series Line table instead.
SetNoSeriesLinePurchaseFilter(var Record No. Series Line Purchase, Code[20], Date)publicPending 24.0
The No. Series Line Purchase table is obsolete. Please use the No. Series Line table instead.
UpdateNoSeriesLineSales(var Record No. Series Line Sales, Code[20], Text[30])publicPending 24.0
The No. Series Line Sales table is obsolete. Please use the No. Series Line table instead.
UpdateNoSeriesLinePurchase(var Record No. Series Line Purchase, Code[20], Text[30])publicPending 24.0
The No. Series Line Purchase table is obsolete. Please use the No. Series Line table instead.
TestDateOrder(Code[20])publicPending 24.0
Call TestField on the "No. Series" record, "Date Order" field directly.
CheckSalesDocNoGaps(Date)publicPending 24.0
The No. Series module cannot have dependencies to Sales. Please use the method in codeunit "IT - Report Management" instead
CheckPurchDocNoGaps(Date)publicPending 24.0
The No. Series module cannot have dependencies to Purchases. Please use the method in codeunit "IT - Report Management" instead
GetNoSeriesWithCheck(Code[20], Boolean, Code[20])Code[20]publicPending 24.0
Use method LookupRelatedNoSeries in codeunit "No. Series" instead.
SeriesHasRelations(Code[20])BooleanpublicPending 24.0
Use method HasRelatedSeries in codeunit "No. Series" instead.
ReverseGetNextNo(Code[20], Date, Boolean)Code[20]public-
RaiseObsoleteOnAfterGetNextNo3(var Record No. Series Line, Boolean)internalPending 24.0
This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead
RaiseObsoleteOnBeforeDoGetNextNo(var Code[20], var Date, Boolean, var Boolean)internalPending 24.0
This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead
RaiseObsoleteOnBeforeModifyNoSeriesLine(var Record No. Series Line, var Boolean)internalPending 24.0
This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead
RaiseObsoleteOnBeforeUpdateNoSeriesLine(var Record No. Series Line, Code[20], Text[100], var Boolean)internalPending 24.0
This is a temporary method for compatibility only. Please use the "No. Series" codeunit instead
ClearStateAndGetNextNo(Code[20])Code[20]public-

Events, 26

KindNameParametersObsolete
Integration eventOnObsoleteCheckSalesDocNoGaps(Date)Pending 24.0
The No. Series module cannot have dependencies to Sales. Please use the method in codeunit "IT - Report Management" instead
Integration eventOnObsoleteCheckPurchDocNoGaps(Date)Pending 24.0
The No. Series module cannot have dependencies to Purchases. Please use the method in codeunit "IT - Report Management" instead
Integration eventOnBeforeCheckPurchDocNoGaps(Date, var Boolean)Pending 24.0
The No. Series module cannot have dependencies to Sales. Please use the event in codeunit "IT - Report Management" instead
Integration eventOnBeforeCheckSalesDocNoGaps(Date, var Boolean)Pending 24.0
The No. Series module cannot have dependencies to Purchases. Please use the event in codeunit "IT - Report Management" instead
Integration eventOnAfterGetNextNo3(var Record No. Series Line, Boolean)Pending 24.0
This event is obsolete. Please use the extensibility options provided by the No. Series module.
Integration eventOnAfterSaveNoSeries(var Record No. Series Line)Pending 24.0
This event is no longer used. Please use the No. Series Batch codeunit instead.
Integration eventOnAfterSaveNoSeriesSales(var Record No. Series Line Sales)Pending 24.0
The No. Series Line Sales table is obsolete. Please use the No. Series Line table instead.
Integration eventOnAfterSetParametersBeforeRun(var Code[20], var Date, var Code[20])-
Integration eventOnAfterSaveNoSeriesPurchase(var Record No. Series Line Purchase)Pending 24.0
The No. Series Line Purchase table is obsolete. Please use the No. Series Line table instead.
Integration eventOnAfterTestManual(Code[20])Pending 24.0
This event will be removed. There is no replacement. Please use the extensibility options provided by the No. Series module.
Integration eventOnBeforeGetNextNo(var Code[20], var Date, var Boolean, var Code[20], var Boolean, var Record No. Series Line)Pending 24.0
This event is obsolete. Please use the extensibility options provided by the No. Series module.
Integration eventOnBeforeDoGetNextNo(var Code[20], var Date, var Boolean, var Boolean)Pending 24.0
This event is obsolete. Please use the extensibility options provided by the No. Series module.
Integration eventOnBeforeModifyNoSeriesLine(var Record No. Series Line, var Boolean)-
Integration eventOnBeforeUpdateNoSeriesLine(var Record No. Series Line, Code[20], Text[100], var Boolean)Pending 24.0
This event is obsolete. Please use the extensibility options provided by the No. Series module.
Integration eventOnNoSeriesLineFilterOnBeforeFindLast(var Record No. Series Line)Pending 24.0
Please use OnAfterSetNoSeriesCurrentLineFilters in the No. Series module instead.
Integration eventOnAfterInitSeries(var Record No. Series, Code[20], Date, var Code[20])Pending 24.0
This event will be removed. There is no replacement. Please use the No. Series module instead.
Integration eventOnBeforeFilterSeries(var Record No. Series, Code[20], var Boolean)Pending 24.0
This event will be removed. There is no replacement. Please use the No. Series module instead.
Integration eventOnBeforeInitSeries(var Code[20], Code[20], Date, var Code[20], var Code[20], var Record No. Series, var Boolean, var Code[20])Pending 24.0
This event will be removed. There is no replacement. Please use the No. Series module instead.
Integration eventOnBeforeSelectSeries(var Code[20], Code[20], var Code[20], var Boolean, var Boolean)Pending 24.0
This event will be removed. Please use the Page trigger events instead.
Integration eventOnSelectSeriesOnBeforePageRunModal(Code[20], var Record No. Series)Pending 24.0
This event will be removed. Please use the Page trigger events instead.
Integration eventOnBeforeSaveNoSeries(var Record No. Series Line, var Boolean)Pending 24.0
This event is no longer used. Please use the No. Series Batch codeunit instead.
Integration eventOnBeforeTestManual(var Code[20], var Boolean)Pending 24.0
This event will be removed. There is no replacement. Please use the No. Series module instead.
Integration eventOnBeforeSetDefaultSeries(var Code[20], var Code[20], var Boolean)Pending 24.0
This event will be removed. There is no replacement. Please use the No. Series module instead.
Integration eventOnObsoleteSetNoSeriesLineSalesFilter(var Record No. Series Line Sales, Code[20], Date)Pending 24.0
The No. Series module cannot have a dependency on Sales. Do not use this event.
Integration eventOnObsoleteSetNoSeriesLinePurchaseFilter(var Record No. Series Line Purchase, Code[20], Date)Pending 24.0
The No. Series module cannot have a dependency on Purchase. Do not use this event.
Integration eventOnBeforeUpdateLine(var Record No. Series, var Date, var Code[20], var Code[20], var Code[20], var Code[20], var Integer, var Date, var Enum No. Series Implementation, var Boolean)Pending 24.0
Temporary event for backwards compatibility. Do not use this event.