Codeunit 7011 Price Source List, source in 29

Source29

src/Layers/W1/BaseApp/Pricing/Source/PriceSourceList.Codeunit.al291 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.Pricing.Source;

using Microsoft.Pricing.Calculation;
using Microsoft.Pricing.PriceList;

codeunit 7011 "Price Source List"
{
    var
        TempPriceSource: Record "Price Source" temporary;
        PriceType: Enum "Price Type";
        CurrentLevel: Integer;
        InconsistentPriceTypeErr: Label 'The source added to the list must have the Price Type equal to %1',
            Comment = '%1 - price type value';

    procedure Init()
    begin
        CurrentLevel := 0;
        PriceType := PriceType::Any;
        TempPriceSource.Reset();
        TempPriceSource.DeleteAll();
    end;

    procedure GetMinMaxLevel(var Level: array[2] of Integer)
    var
        TempPriceSourceLocal: Record "Price Source" temporary;
    begin
        TempPriceSourceLocal.Copy(TempPriceSource, true);
        TempPriceSourceLocal.Reset();
        if TempPriceSourceLocal.IsEmpty() then begin
            Level[2] := Level[1] - 1;
            exit;
        end;

        TempPriceSourceLocal.SetCurrentKey(Level);
        TempPriceSourceLocal.FindFirst();
        Level[1] := TempPriceSourceLocal.Level;
        TempPriceSourceLocal.FindLast();
        Level[2] := TempPriceSourceLocal.Level;
    end;

    procedure GetPriceType(): Enum "Price Type";
    begin
        exit(PriceType);
    end;

    local procedure ValidatePriceType(NewPriceType: Enum "Price Type")
    begin
        if PriceType = PriceType::Any then
            PriceType := NewPriceType
        else
            if (PriceType <> NewPriceType) and (NewPriceType <> NewPriceType::Any) then
                Error(InconsistentPriceTypeErr, PriceType);
    end;

    procedure SetPriceType(NewPriceType: Enum "Price Type")
    begin
        ValidatePriceType(NewPriceType);
    end;

    procedure IncLevel()
    begin
        CurrentLevel += 1;
    end;

    procedure SetLevel(Level: Integer)
    begin
        CurrentLevel := Level;
    end;

    procedure Add(SourceType: Enum "Price Source Type"; SourceNo: Code[20])
    begin
        if SourceNo = '' then
            exit;
        TempPriceSource.NewEntry(SourceType, CurrentLevel);
        TempPriceSource.Validate("Source No.", SourceNo);
        OnAddOnBeforeInsert(TempPriceSource);
        ValidatePriceType(TempPriceSource."Price Type");
        TempPriceSource.Insert(true);
    end;

    procedure Add(SourceType: Enum "Price Source Type"; ParentSourceNo: Code[20]; SourceNo: Code[20])
    begin
        if SourceNo = '' then
            exit;
        TempPriceSource.NewEntry(SourceType, CurrentLevel);
        TempPriceSource.Validate("Parent Source No.", ParentSourceNo);
        TempPriceSource.Validate("Source No.", SourceNo);
        OnAddOnBeforeInsert(TempPriceSource);
        ValidatePriceType(TempPriceSource."Price Type");
        TempPriceSource.Insert(true);
    end;

    procedure Add(SourceType: Enum "Price Source Type"; SourceId: Guid)
    begin
        if IsNullGuid(SourceId) then
            exit;
        TempPriceSource.NewEntry(SourceType, CurrentLevel);
        TempPriceSource.Validate("Source ID", SourceId);
        OnAddOnBeforeInsert(TempPriceSource);
        ValidatePriceType(TempPriceSource."Price Type");
        TempPriceSource.Insert(true);
    end;

    procedure Add(SourceType: Enum "Price Source Type")
    begin
        TempPriceSource.NewEntry(SourceType, CurrentLevel);
        ValidatePriceType(TempPriceSource."Price Type");
        TempPriceSource.Insert(true);
    end;

    procedure Add(PriceSource: Record "Price Source")
    begin
        PriceSource.Level := CurrentLevel;
        TempPriceSource.TransferFields(PriceSource);
        ValidatePriceType(TempPriceSource."Price Type");
        TempPriceSource.Insert(true);
    end;

    procedure AddChildren(PriceSource: Record "Price Source")
    var
        TempChildPriceSource: Record "Price Source" temporary;
    begin
        OnBeforeAddChildren(PriceSource, TempChildPriceSource);
        if TempChildPriceSource.FindSet() then
            repeat
                Add(TempChildPriceSource);
            until TempChildPriceSource.Next() = 0;
    end;

    procedure AddJobAsSources(JobNo: Code[20]; JobTaskNo: Code[20])
    begin
        if JobNo <> '' then begin
            IncLevel();
            Add("Price Source Type"::"All Jobs");
            IncLevel();
            Add("Price Source Type"::Job, JobNo);
            if JobTaskNo <> '' then begin
                IncLevel();
                Add("Price Source Type"::"Job Task", JobNo, JobTaskNo);
            end;
        end;
    end;

    procedure GetValue(SourceType: Enum "Price Source Type") Result: Code[20];
    var
        TempPriceSourceLocal: Record "Price Source" temporary;
        PriceSourceInterface: Interface "Price Source";
    begin
        TempPriceSourceLocal.Copy(TempPriceSource, true);
        TempPriceSourceLocal.Reset();
        TempPriceSourceLocal.SetRange("Source Type", SourceType);
        if TempPriceSourceLocal.FindFirst() then begin
            PriceSourceInterface := TempPriceSourceLocal."Source Type";
            Result := TempPriceSourceLocal."Source No.";
        end;
        OnAfterGetValue(SourceType, Result);
    end;

    procedure Copy(var FromPriceSourceList: Codeunit "Price Source List")
    begin
        Init();
        FromPriceSourceList.GetList(TempPriceSource);
    end;

    procedure GetList(var ToTempPriceSource: Record "Price Source" temporary) Found: Boolean
    begin
        if ToTempPriceSource.IsTemporary then
            ToTempPriceSource.Copy(TempPriceSource, true);
        Found := ToTempPriceSource.FindSet();
        UpdatePriceTypeSourceGroup(ToTempPriceSource)
    end;

    local procedure UpdatePriceTypeSourceGroup(var PriceSource: Record "Price Source")
    begin
        if PriceSource."Price Type" = PriceSource."Price Type"::Any then
            PriceSource."Price Type" := PriceType;
        if PriceSource."Source Group" = PriceSource."Source Group"::All then
            case PriceType of
                PriceType::Sale:
                    PriceSource."Source Group" := PriceSource."Source Group"::Customer;
                PriceType::Purchase:
                    PriceSource."Source Group" := PriceSource."Source Group"::Vendor;
            end;
    end;

    procedure First(var PriceSource: Record "Price Source"; AtLevel: Integer): Boolean;
    begin
        TempPriceSource.Reset();
        TempPriceSource.SetCurrentKey(Level);
        TempPriceSource.SetRange(Level, AtLevel);
        exit(GetRecordIfFound(TempPriceSource.FindSet(), PriceSource))
    end;

    procedure Next(var PriceSource: Record "Price Source"): Boolean;
    begin
        exit(GetRecordIfFound(TempPriceSource.Next() > 0, PriceSource))
    end;

    local procedure GetRecordIfFound(Found: Boolean; var PriceSource: Record "Price Source"): Boolean
    begin
        if Found then begin
            PriceSource := TempPriceSource;
            CurrentLevel := TempPriceSource.Level;
        end else
            Clear(PriceSource);
        exit(Found)
    end;

    procedure GetSourceGroup(var DtldPriceCalculationSetup: Record "Dtld. Price Calculation Setup"): Boolean;
    var
        PriceSource: Record "Price Source";
    begin
        if GetSourceGroup(PriceSource) then begin
            DtldPriceCalculationSetup."Source Group" := PriceSource."Source Group";
            DtldPriceCalculationSetup."Source Type" := PriceSource."Source Type";
            DtldPriceCalculationSetup."Source No." := PriceSource.GetGroupNo();
            exit(true);
        end;
    end;

    local procedure GetSourceGroup(var FoundPriceSource: Record "Price Source"): Boolean;
    var
        TempPriceSourceLocal: Record "Price Source" temporary;
    begin
        TempPriceSourceLocal.Copy(TempPriceSource, true);
        TempPriceSourceLocal.Reset();
        TempPriceSourceLocal.SetCurrentKey(Level);
        TempPriceSourceLocal.SetAscending(Level, false);
        TempPriceSourceLocal.SetFilter("Source Group", '<>%1', TempPriceSourceLocal."Source Group"::All);
        if TempPriceSourceLocal.IsEmpty() then
            exit(false);
        TempPriceSourceLocal.SetFilter("Source No.", '<>%1', '');
        if TempPriceSourceLocal.FindFirst() then begin
            FoundPriceSource := TempPriceSourceLocal;
            exit(true);
        end;
        TempPriceSourceLocal.SetRange("Source No.");
        if TempPriceSourceLocal.FindFirst() then begin
            FoundPriceSource := TempPriceSourceLocal;
            exit(true);
        end;
    end;

    procedure Remove(SourceType: Enum "Price Source Type"): Boolean;
    var
        PriceSource: Record "Price Source";
    begin
        PriceSource.SetRange("Source Type", SourceType);
        exit(Remove(PriceSource));
    end;

    procedure RemoveAtLevel(SourceType: Enum "Price Source Type"; Level: Integer): Boolean;
    var
        PriceSource: Record "Price Source";
    begin
        PriceSource.SetRange(Level, Level);
        PriceSource.SetRange("Source Type", SourceType);
        exit(Remove(PriceSource));
    end;

    local procedure Remove(var PriceSource: Record "Price Source"): Boolean
    var
        TempPriceSourceLocal: Record "Price Source" temporary;
    begin
        TempPriceSourceLocal.Copy(TempPriceSource, true);
        TempPriceSourceLocal.CopyFilters(PriceSource);
        if not TempPriceSourceLocal.IsEmpty() then begin
            TempPriceSourceLocal.DeleteAll();
            exit(true);
        end;
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAddOnBeforeInsert(var PriceSource: Record "Price Source")
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnAfterGetValue(SourceType: Enum "Price Source Type"; var Result: Code[20])
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnBeforeAddChildren(PriceSource: Record "Price Source"; var TempChildPriceSource: Record "Price Source" temporary)
    begin
    end;
}