Report 7054 Res. Price List

App
Base Application
Namespace
Microsoft.Pricing.Reports
Versions
17-28

Procedures, 1

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Pricing/Reports/ResPriceList.Report.al510 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.Reports;

using Microsoft.Finance.Currency;
using Microsoft.Foundation.Address;
using Microsoft.Foundation.Company;
using Microsoft.Pricing.Asset;
using Microsoft.Pricing.Calculation;
using Microsoft.Pricing.PriceList;
using Microsoft.Pricing.Source;
using Microsoft.Projects.Project.Pricing;
using Microsoft.Projects.Resources.Resource;
using Microsoft.Sales.Document;
using Microsoft.Utilities;
using System.Utilities;

report 7054 "Res. Price List"
{
    ApplicationArea = Jobs;
    Caption = 'Resource Price List';
    ToolTip = 'Specifies a list of unit prices for the selected resources. By default, a unit price is based on the price in the Resource Prices window. If there is no valid alternative price, then the unit price from the resource card is used. The report can be used by the company''s salespeople or sent to customers.';
    PreviewMode = PrintLayout;
    UsageCategory = ReportsAndAnalysis;
    DefaultRenderingLayout = RDLCLayout;

    dataset
    {
        dataitem(Resource; Resource)
        {
            RequestFilterFields = Type, "No.";
            column(CompanyAddr1; CompanyAddr[1])
            {
            }
            column(CompanyAddr2; CompanyAddr[2])
            {
            }
            column(CompanyAddr3; CompanyAddr[3])
            {
            }
            column(CompanyAddr4; CompanyAddr[4])
            {
            }
            column(CompanyAddr5; CompanyAddr[5])
            {
            }
            column(CompanyAddr6; CompanyAddr[6])
            {
            }
            column(CompanyAddr7; CompanyAddr[7])
            {
            }
            column(CompanyAddr8; CompanyAddr[8])
            {
            }
            column(StrsubsnoAsofFormatWorkDt; StrSubstNo(AsOfTok, Format(DateReq, 0, 4)))
            {
            }
            column(PhoneNo_CompanyInfo; CompanyInfo."Phone No.")
            {
            }
            column(VATResgNo_CompanyInfo; CompanyInfo."VAT Registration No.")
            {
            }
            column(GiroNo_CompanyInfo; CompanyInfo."Giro No.")
            {
            }
            column(BankName_CompanyInfo; CompanyInfo."Bank Name")
            {
            }
            column(BankAccNo_CompanyInfo; CompanyInfo."Bank Account No.")
            {
            }
            column(ResFldCaptUnitPriceCurrTxt; FieldCaption("Unit Price") + CurrencyText)
            {
            }
            column(No_Resource; "No.")
            {
            }
            column(Type_Resource; Type)
            {
                IncludeCaption = true;
            }
            column(UnitPrice_Resource; "Unit Price")
            {
            }
            column(HomePage_CompanyInfo; CompanyInfo."Home Page")
            {
            }
            column(Email_CompanyInfo; CompanyInfo."E-Mail")
            {
            }
            column(ResourceName; Name)
            {
            }
            column(ResourcePriceListCaption; ResourcePriceListCaptionLbl)
            {
            }
            column(CompanyInfoPhoneNoCaption; CompanyInfoPhoneNoCaptionLbl)
            {
            }
            column(CompanyInfoVATRegistrationNoCaption; CompanyInfoVATRegistrationNoCaptionLbl)
            {
            }
            column(CompanyInfoGiroNoCaption; CompanyInfoGiroNoCaptionLbl)
            {
            }
            column(CompanyInfoBankNameCaption; CompanyInfoBankNameCaptionLbl)
            {
            }
            column(CompanyInfoBankAccountNoCaption; CompanyInfoBankAccountNoCaptionLbl)
            {
            }
            column(ResourceNoCaption; ResourceNoCaptionLbl)
            {
            }
            column(WorkTypeCaption; WorkTypeCaptionLbl)
            {
            }
            column(ResourceNameCaption; ResourceNameCaptionLbl)
            {
            }
            column(WorkTypeDescriptionCaption; WorkTypeDescriptionCaptionLbl)
            {
            }
            dataitem("Integer"; "Integer")
            {
                DataItemTableView = sorting(Number) where(Number = filter(1 ..));
                column(UnitPrice_ResPrice; UnitPrice)
                {
                    AutoFormatType = 2;
                }
                column(WorkTypeCode_ResPrice; WorkType.Code)
                {
                }
                column(Description_WorkType; WorkType.Description)
                {
                }

                trigger OnAfterGetRecord()
                begin
                    if Number = 1 then
                        Ok := TempWorkTypePriceListLine.FindSet()
                    else
                        Ok := TempWorkTypePriceListLine.Next() <> 0;
                    if not Ok then
                        CurrReport.Break();

                    if not FindPrice(TempWorkTypePriceListLine."Work Type Code") then
                        CurrReport.Skip();

                    WorkType.Get(TempPriceListLine."Work Type Code");

                    UnitPrice := TempPriceListLine."Unit Price";
                    if (Currency.Code <> '') and (TempPriceListLine."Currency Code" = '') then
                        UnitPrice :=
                          Round(
                            CurrExchRate.ExchangeAmtLCYToFCY(
                              DateReq, Currency.Code, UnitPrice,
                              CurrExchRate.ExchangeRate(
                                DateReq, Currency.Code)),
                            Currency."Unit-Amount Rounding Precision");
                end;

                trigger OnPostDataItem()
                begin
                    TempWorkTypePriceListLine.Reset();
                    TempWorkTypePriceListLine.SetFilter("Asset No.", '<>%1', '');
                    TempWorkTypePriceListLine.DeleteAll();
                end;

                trigger OnPreDataItem()
                begin
                    TempWorkTypePriceListLine.Reset();
                end;
            }

            trigger OnAfterGetRecord()
            var
                PriceListLine: Record "Price List Line";
            begin
                if FindPrice('') then
                    "Unit Price" := TempPriceListLine."Unit Price";
                if (Currency.Code <> '') and (TempPriceListLine."Currency Code" = '') then
                    "Unit Price" :=
                      Round(
                        CurrExchRate.ExchangeAmtLCYToFCY(
                          DateReq, Currency.Code, "Unit Price",
                          CurrExchRate.ExchangeRate(
                            DateReq, Currency.Code)),
                        Currency."Unit-Amount Rounding Precision");

                PriceListLine.SetRange("Asset Type", "Price Asset Type"::Resource);
                PriceListLine.SetRange("Asset No.", "No.");
                FindWorkTypes(PriceListLine);
                PriceListLine.SetRange("Asset Type", "Price Asset Type"::"Resource Group");
                PriceListLine.SetRange("Asset No.", "Resource Group No.");
                FindWorkTypes(PriceListLine);
            end;

            trigger OnPreDataItem()
            var
                PriceListLine: Record "Price List Line";
                LineNo: Integer;
            begin
                PriceListLine.SetFilter("Currency Code", '%1|%2', Currency.Code, '');
                PriceListLine.SetRange("Asset Type", "Price Asset Type"::Resource);
                PriceListLine.SetRange("Asset No.", '');
                PriceListLine.SetFilter("Work Type Code", '<>%1', '');
                if PriceListLine.FindSet() then
                    repeat
                        TempWorkTypePriceListLine.Init();
                        TempWorkTypePriceListLine."Asset Type" := PriceListLine."Asset Type";
                        TempWorkTypePriceListLine."Work Type Code" := PriceListLine."Work Type Code";
                        LineNo += 1;
                        TempWorkTypePriceListLine."Line No." := LineNo;
                        TempWorkTypePriceListLine.Insert();
                    until PriceListLine.Next() = 0;
            end;
        }
    }

    requestpage
    {

        layout
        {
            area(content)
            {
                group(Options)
                {
                    Caption = 'Options';
                    field(Date; DateReq)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Date';
                        ToolTip = 'Specifies the period for which the prices apply, such as 10/01/20...12/31/20.';
                    }
                    field(Method; PriceCalcMethod)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Price Calculation Method';
                        ToolTip = 'Specifies the price calculation method.';

                        trigger OnValidate()
                        begin
                            ValidateMethod();
                        end;
                    }
                    field(Handler; format(PriceCalculationHandler))
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Price Calculation Handler';
                        ToolTip = 'Specifies the price calculation handler that is defined for the calculation of sales prices for the selected method.';

                        trigger OnAssistEdit()
                        begin
                            Page.RunModal(Page::"Price Calculation Methods");
                        end;
                    }
                    field(SourceTypeCtrl; SourceType)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Assign-to Type';
                        ToolTip = 'Specifies the type of entity to which the price list is assigned. The options are relevant to the entity you are currently viewing.';

                        trigger OnValidate()
                        begin
                            PriceSource.Validate("Source Type", SourceType.AsInteger());
                            SourceNoCtrlEnable := PriceSource.IsSourceNoAllowed();
                            ParentSourceNo := PriceSource."Parent Source No.";
                            SourceNo := PriceSource."Source No.";
                        end;
                    }
                    field(ParentSourceNoCtrl; ParentSourceNo)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Assign-to Project No.';
                        Editable = false;
                        ToolTip = 'Specifies the project to which the prices are assigned. If you choose an entity, the price list will be used only for that entity.';
                    }
                    field(SourceNoCtrl; SourceNo)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Assign-to';
                        Enabled = SourceNoCtrlEnable;
                        ToolTip = 'Specifies the entity to which the prices are assigned. The options depend on the selection in the Assign-to Type field. If you choose an entity, the price list will be used only for that entity.';

                        trigger OnLookup(var Text: Text) Result: Boolean
                        begin
                            Result := PriceSource.LookupNo();
                            if Result then begin
                                ParentSourceNo := PriceSource."Parent Source No.";
                                SourceNo := PriceSource."Source No.";
                                LookupIsComplete := true;
                            end;
                        end;

                        trigger OnValidate()
                        begin
                            if LookupIsComplete then begin
                                SourceNo := PriceSource."Source No.";
                                ParentSourceNo := PriceSource."Parent Source No.";
                            end;
                            if (SourceNo = '') and SourceNoCtrlEnable then
                                Error(MissSourceNoErr);

                            PriceSource.Validate("Source No.", SourceNo);
                            LookupIsComplete := false;

                            Currency.Code := PriceSource."Currency Code";
                            ParentSourceNo := PriceSource."Parent Source No.";
                            SourceNo := PriceSource."Source No.";
                        end;
                    }
                    field("Currency.Code"; Currency.Code)
                    {
                        ApplicationArea = Jobs;
                        Caption = 'Currency Code';
                        TableRelation = Currency;
                        ToolTip = 'Specifies the code for the currency that amounts are shown in.';
                    }
                }
            }
        }

        actions
        {
        }

        trigger OnOpenPage()
        begin
            if SourceType.AsInteger() = 0 then
                SourceType := SourceType::"All Jobs";
            if DateReq = 0D then
                DateReq := WorkDate();

            PriceSource.Validate("Source Type", SourceType);
            SourceNoCtrlEnable := PriceSource.IsSourceNoAllowed();
        end;

        trigger OnAfterGetCurrRecord()
        begin
            ValidateMethod();
        end;
    }

    rendering
    {
        layout(RDLCLayout)
        {
            Type = RDLC;
            LayoutFile = './Pricing/Reports/ResPriceList.rdlc';
            Summary = 'Report layout made in the legacy RDLC format. Use an RDLC editor to modify the layout.';
        }
    }

    labels
    {
        EMailIdCaption = 'EMail';
        HomePageCaption = 'Home Page';
    }

    trigger OnPreReport()
    begin
        if (SourceNo = '') and SourceNoCtrlEnable then
            Error(MissSourceNoErr);
        CompanyInfo.Get();
        FormatAddr.Company(CompanyAddr, CompanyInfo);
        if Currency.Code <> '' then
            CurrencyText := ' (' + Currency.Code + ')';

        PriceSource.Validate("Source Type", SourceType);
        PriceSource.Validate("Parent Source No.", ParentSourceNo);
        PriceSource.Validate("Source No.", SourceNo);
        PriceSource."Currency Code" := Currency.Code;
    end;

    protected var
        Currency: Record Currency;
        PriceSource: Record "Price Source";
        WorkType: Record "Work Type";
        TempPriceListLine: Record "Price List Line" temporary;
        TempWorkTypePriceListLine: Record "Price List Line" temporary;
        DateReq: Date;

    var
        CompanyInfo: Record "Company Information";
        CurrExchRate: Record "Currency Exchange Rate";
        FormatAddr: Codeunit "Format Address";
        PriceCalcMethod: Enum "Price Calculation Method";
        PriceCalculationHandler: Enum "Price Calculation Handler";
        SourceType: Enum "Price Source Type";
        CompanyAddr: array[8] of Text[100];
        LookupIsComplete: Boolean;
        Ok: Boolean;
        CurrencyText: Text[30];
        SourceNoCtrlEnable: Boolean;
        ParentSourceNo: Code[20];
        SourceNo: Code[20];
        UnitPrice: Decimal;
        AsOfTok: Label 'As of %1', Comment = '%1 - a date';
        ResourcePriceListCaptionLbl: Label 'Resource - Price List';
        CompanyInfoPhoneNoCaptionLbl: Label 'Phone No.';
        CompanyInfoVATRegistrationNoCaptionLbl: Label 'VAT Reg. No.';
        CompanyInfoGiroNoCaptionLbl: Label 'Giro No.';
        CompanyInfoBankNameCaptionLbl: Label 'Bank';
        CompanyInfoBankAccountNoCaptionLbl: Label 'Account No.';
        ResourceNoCaptionLbl: Label 'Resource No.';
        WorkTypeCaptionLbl: Label 'Work Type';
        ResourceNameCaptionLbl: Label 'Resource Name';
        WorkTypeDescriptionCaptionLbl: Label 'Work Type Description';
        MissSourceNoErr: Label 'You must specify an Assign-to, if the Assign-to Type is different from All Projects.';

    local procedure FindPrice(WorkTypeCode: Code[10]): Boolean;
    var
        SalesHeader: Record "Sales Header";
        SalesLine: Record "Sales Line";
        PriceCalculationMgt: Codeunit "Price Calculation Mgt.";
        PriceSourceList: Codeunit "Price Source List";
        LineWithPrice: Interface "Line With Price";
        PriceCalculation: Interface "Price Calculation";
    begin
        SalesLine.Init();
        SalesLine.Type := SalesLine.Type::Resource;
        SalesLine."No." := Resource."No.";
        SalesLine."Work Type Code" := WorkTypeCode;
        SalesLine."Posting Date" := DateReq;
        if Currency.Code <> '' then begin
            SalesHeader."Posting Date" := DateReq;
            SalesHeader."Currency Code" := Currency.Code;
            SalesHeader.UpdateCurrencyFactor();
        end;
        SalesLine.GetLineWithPrice(LineWithPrice);
        LineWithPrice.SetLine("Price Type"::Sale, SalesHeader, SalesLine);
        GetSourceList(PriceSourceList);
        LineWithPrice.SetSources(PriceSourceList);
        PriceCalculationMgt.GetHandler(LineWithPrice, PriceCalculation);

        TempPriceListLine.Reset();
        TempPriceListLine.DeleteAll();
        Clear(TempPriceListLine);
        exit(PriceCalculation.FindPrice(TempPriceListLine, false));
    end;

    local procedure GetSourceList(var PriceSourceList: Codeunit "Price Source List")
    begin
        PriceSourceList.Add("Price Source Type"::"All Customers");

        if SourceType = SourceType::Job then
            PriceSourceList.AddJobAsSources(SourceNo, '')
        else
            if SourceType = SourceType::"Job Task" then
                PriceSourceList.AddJobAsSources(ParentSourceNo, SourceNo)
    end;

    local procedure GetPriceHandler(Method: Enum "Price Calculation Method"): Enum "Price Calculation Handler";
    var
        PriceCalculationSetup: record "Price Calculation Setup";
    begin
        if PriceCalculationSetup.FindDefault(Method, PriceCalculationSetup.Type::Sale) then
            exit(PriceCalculationSetup.Implementation);
    end;

    local procedure ValidateMethod()
    begin
        if PriceCalcMethod = PriceCalcMethod::" " then
            PriceCalcMethod := PriceCalcMethod::"Lowest Price";
        PriceCalculationHandler := GetPriceHandler(PriceCalcMethod);
    end;

    local procedure FindWorkTypes(var PriceListLine: Record "Price List Line")
    var
        LineNo: Integer;
    begin
        TempWorkTypePriceListLine.Reset();
        if TempWorkTypePriceListLine.FindLast() then
            LineNo := TempWorkTypePriceListLine."Line No.";

        PriceListLine.SetFilter("Work Type Code", '<>%1', '');
        if PriceListLine.FindSet() then
            repeat
                TempWorkTypePriceListLine.SetRange("Work Type Code", PriceListLine."Work Type Code");
                if TempWorkTypePriceListLine.IsEmpty() then begin
                    TempWorkTypePriceListLine."Asset Type" := PriceListLine."Asset Type";
                    TempWorkTypePriceListLine."Asset No." := PriceListLine."Asset No.";
                    TempWorkTypePriceListLine."Work Type Code" := PriceListLine."Work Type Code";
                    LineNo += 1;
                    TempWorkTypePriceListLine."Line No." := LineNo;
                    TempWorkTypePriceListLine.Insert();
                end;
            until PriceListLine.Next() = 0;
    end;

    procedure InitializeRequest(NewDateReq: Date; NewSourceType: Enum "Job Price Source Type"; NewSourceNo: Code[20]; NewCurrencyCode: Code[10])
    begin
        DateReq := NewDateReq;
        SourceType := "Price Source Type".FromInteger(NewSourceType.AsInteger());
        SourceNo := NewSourceNo;
        Currency.Code := NewCurrencyCode;

        PriceSource.Validate("Source Type", SourceType);
        PriceSource.Validate("Source No.", SourceNo);
        PriceSource."Currency Code" := Currency.Code;
    end;
}