Report 6080 Serv. Pricing Profitability

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

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Service/Reports/ServPricingProfitability.Report.al312 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.Service.Reports;

using Microsoft.Finance.Currency;
using Microsoft.Sales.Customer;
using Microsoft.Service.History;
using Microsoft.Service.Ledger;
using Microsoft.Service.Pricing;
using Microsoft.Utilities;

report 6080 "Serv. Pricing Profitability"
{
    DefaultLayout = RDLC;
    RDLCLayout = './Service/Reports/ServPricingProfitability.rdlc';
    ApplicationArea = Service;
    Caption = 'Service Pricing Profitability';
    UsageCategory = ReportsAndAnalysis;

    dataset
    {
        dataitem("Service Price Group"; "Service Price Group")
        {
            PrintOnlyIfDetail = true;
            RequestFilterFields = "Code";
            column(TodayFormatted; Format(Today, 0, 4))
            {
            }
            column(CompanyName; COMPANYPROPERTY.DisplayName())
            {
            }
            column(ServPriceGrFilterCaption; TableCaption + ':' + ServPriceGrFilter)
            {
            }
            column(ServPriceGrpSetupCaption; "Serv. Price Group Setup".TableCaption + ':' + ServPriceGrSetupFilter)
            {
            }
            column(CustomerCaption; Customer.TableCaption + ':' + CustomerFilter)
            {
            }
            column(ServicePriceGroupCode; Code)
            {
            }
            column(ProfitAmt; ProfitAmt)
            {
            }
            column(Profit; ProfitPct)
            {
            }
            column(CostAmt; CostAmt)
            {
            }
            column(DiscountAmt; DiscountAmt)
            {
            }
            column(InvoiceAmt; InvoiceAmt)
            {
            }
            column(UsageAmt; UsageAmt)
            {
            }
            column(PageCaption; PageCaptionLbl)
            {
            }
            column(ServicePricingProfitabilityCaption; ServicePricingProfitabilityCaptionLbl)
            {
            }
            column(ServicePriceGroupCodeCaption; ServicePriceGroupCodeCaptionLbl)
            {
            }
            column(TotalforGroupCaption; TotalforGroupCaptionLbl)
            {
            }
            dataitem("Serv. Price Group Setup"; "Serv. Price Group Setup")
            {
                DataItemLink = "Service Price Group Code" = field(Code);
                DataItemTableView = sorting("Service Price Group Code");
                PrintOnlyIfDetail = true;
                RequestFilterFields = "Adjustment Type", "Starting Date";
                column(AdjmtType_ServPriceGrpSetup; "Adjustment Type")
                {
                }
                column(Amt_ServPriceGroupSetup; Amount)
                {
                }
                column(AdjmtType_ServPriceGrpSetupCaption; FieldCaption("Adjustment Type"))
                {
                }
                column(Amt_ServPriceGroupSetupCaption; FieldCaption(Amount))
                {
                }
                column(ServPriceGrpCode_ServPriceGrpSetup; "Service Price Group Code")
                {
                }
                column(FaultAreaCode_ServPriceGrpSetup; "Fault Area Code")
                {
                }
                column(CustPriceGrpCode_ServPriceGrpSetup; "Cust. Price Group Code")
                {
                }
                column(CurrencyCode_ServPriceGrpSetup; "Currency Code")
                {
                }
                column(StarteDate_ServPriceGrpSetup; "Starting Date")
                {
                }
                column(CustNo_ServShpItemLineCaption; "Service Shipment Item Line".FieldCaption("Customer No."))
                {
                }
                column(NameCaption; NameCaptionLbl)
                {
                }
                column(UsageAmountCaption; UsageAmountCaptionLbl)
                {
                }
                column(InvoiceAmountCaption; InvoiceAmountCaptionLbl)
                {
                }
                column(DiscountAmountCaption; DiscountAmountCaptionLbl)
                {
                }
                column(CostAmountCaption; CostAmountCaptionLbl)
                {
                }
                column(ProfitAmountCaption; ProfitAmountCaptionLbl)
                {
                }
                column(ProfitCaption; ProfitCaptionLbl)
                {
                }
                dataitem("Service Shipment Item Line"; "Service Shipment Item Line")
                {
                    DataItemLink = "Service Price Group Code" = field("Service Price Group Code");
                    DataItemTableView = sorting("Service Price Group Code", "Adjustment Type", "Base Amount to Adjust", "Customer No.");
                    RequestFilterFields = "Customer No.";
                    column(CustNo_ServShpItemLine; "Customer No.")
                    {
                    }
                    column(CustomerName; Customer.Name)
                    {
                    }
                    column(TotalCaption; TotalCaptionLbl)
                    {
                    }

                    trigger OnAfterGetRecord()
                    begin
                        UsageAmt := 0;
                        InvoiceAmt := 0;
                        DiscountAmt := 0;
                        CostAmt := 0;
                        ProfitPct := 0;
                        ProfitAmt := 0;

                        if not Customer.Get("Customer No.") then
                            Customer.Name := '';
                        SetRange("Customer No.", "Customer No.");
                        repeat
                            GetServShipmentHeader();
                            if NewHeader then begin
                                ServLedgerEntry.Reset();
                                ServLedgerEntry.SetCurrentKey(
                                  "Service Order No.",
                                  "Service Item No. (Serviced)",
                                  "Entry Type",
                                  "Moved from Prepaid Acc.",
                                  "Posting Date",
                                  Open,
                                  Type);
                                ServLedgerEntry.SetRange("Service Order No.", ServShipmentHeader."Order No.");
                                ServLedgerEntry.SetRange("Entry Type", ServLedgerEntry."Entry Type"::Usage);
                                ServLedgerEntry.SetRange("Posting Date", ServShipmentHeader."Posting Date");
                                ServLedgerEntry.CalcSums("Amount (LCY)");
                                UsageAmt += ServLedgerEntry."Amount (LCY)";
                            end;
                            ServInvHeader.Reset();
                            ServInvHeader.SetCurrentKey("Order No.");
                            ServInvHeader.SetRange("Order No.", ServShipmentHeader."Order No.");
                            if ServInvHeader.Find('-') then
                                repeat
                                    ServInvLine.Reset();
                                    ServInvLine.SetCurrentKey("Document No.", "Service Item Line No.", Type, "No.");
                                    ServInvLine.SetRange("Document No.", ServInvHeader."No.");
                                    ServInvLine.SetRange("Service Item Line No.", "Service Shipment Item Line"."Line No.");
                                    if ServInvLine.Find('-') then
                                        repeat
                                            CostAmt += Round(ServInvLine."Unit Cost (LCY)" * ServInvLine.Quantity, Currency."Amount Rounding Precision");
                                            InvoiceAmt += CurrExchRate.ExchangeAmtFCYToLCY(
                                                ServShipmentHeader."Posting Date",
                                                ServShipmentHeader."Currency Code",
                                                Round(ServInvLine."Unit Price" * ServInvLine.Quantity, Currency."Amount Rounding Precision"),
                                                ServShipmentHeader."Currency Factor");
                                            DiscountAmt += CurrExchRate.ExchangeAmtFCYToLCY(
                                                ServShipmentHeader."Posting Date",
                                                ServShipmentHeader."Currency Code",
                                                ServInvLine."Line Discount Amount",
                                                ServShipmentHeader."Currency Factor");
                                        until ServInvLine.Next() = 0;
                                until ServInvHeader.Next() = 0;

                        until Next() = 0;
                        SetRange("Customer No.");

                        ProfitAmt := InvoiceAmt - CostAmt;
                        if InvoiceAmt <> 0 then
                            ProfitPct := Round(ProfitAmt * 100 / InvoiceAmt, 0.00001)
                        else
                            ProfitPct := 0;
                    end;

                    trigger OnPreDataItem()
                    begin
                        Clear(UsageAmt);
                        Clear(InvoiceAmt);
                        Clear(DiscountAmt);
                        Clear(CostAmt);
                        Clear(ProfitAmt);
                    end;
                }

                trigger OnPreDataItem()
                begin
                    Clear(UsageAmt);
                    Clear(InvoiceAmt);
                    Clear(DiscountAmt);
                    Clear(CostAmt);
                    Clear(ProfitAmt);
                end;
            }

            trigger OnPreDataItem()
            begin
                Clear(UsageAmt);
                Clear(InvoiceAmt);
                Clear(DiscountAmt);
                Clear(CostAmt);
                Clear(ProfitAmt);
            end;
        }
    }

    requestpage
    {
        AboutTitle = 'About Service Pricing Profitability';
        AboutText = 'Analyze profits from your service pricing.';
        layout
        {
        }

        actions
        {
        }
    }

    labels
    {
    }

    trigger OnPreReport()
    var
        FormatDocument: Codeunit "Format Document";
    begin
        Currency.InitRoundingPrecision();
        ServPriceGrFilter := "Service Price Group".GetFilters();
        ServPriceGrSetupFilter := "Serv. Price Group Setup".GetFilters();
        CustomerFilter := FormatDocument.GetRecordFiltersWithCaptions(Customer);
    end;

    var
        CurrExchRate: Record "Currency Exchange Rate";
        Customer: Record Customer;
        ServShipmentHeader: Record "Service Shipment Header";
        ServInvHeader: Record "Service Invoice Header";
        ServInvLine: Record "Service Invoice Line";
        ServLedgerEntry: Record "Service Ledger Entry";
        Currency: Record Currency;
        ServPriceGrFilter: Text;
        ServPriceGrSetupFilter: Text;
        CustomerFilter: Text;
        UsageAmt: Decimal;
        InvoiceAmt: Decimal;
        DiscountAmt: Decimal;
        CostAmt: Decimal;
        ProfitPct: Decimal;
        ProfitAmt: Decimal;
        NewHeader: Boolean;
        PageCaptionLbl: Label 'Page';
        ServicePricingProfitabilityCaptionLbl: Label 'Service Pricing Profitability';
        ServicePriceGroupCodeCaptionLbl: Label 'Service Price Group Code';
        TotalforGroupCaptionLbl: Label 'Total for Group';
        NameCaptionLbl: Label 'Name';
        UsageAmountCaptionLbl: Label 'Usage Amount';
        InvoiceAmountCaptionLbl: Label 'Invoice Amount';
        DiscountAmountCaptionLbl: Label 'Discount Amount';
        CostAmountCaptionLbl: Label 'Cost Amount';
        ProfitAmountCaptionLbl: Label 'Profit Amount';
        ProfitCaptionLbl: Label 'Profit %';
        TotalCaptionLbl: Label 'Total';

    local procedure GetServShipmentHeader()
    begin
        NewHeader := false;
        if ServShipmentHeader."No." <> "Service Shipment Item Line"."No." then begin
            ServShipmentHeader.Get("Service Shipment Item Line"."No.");
            NewHeader := true;
        end;
    end;
}