Report 706 Status, source in 29

Source29

src/Layers/W1/BaseApp/Inventory/Reports/Status.Report.al328 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.Inventory.Reports;

using Microsoft.Inventory.Item;
using Microsoft.Inventory.Ledger;

report 706 Status
{
    ApplicationArea = Basic, Suite, Advanced;
    Caption = 'Status';
    UsageCategory = ReportsAndAnalysis;
    DefaultRenderingLayout = RDLCLayout;

    dataset
    {
        dataitem(Item; Item)
        {
            DataItemTableView = sorting("No.") where(Type = const(Inventory));
            PrintOnlyIfDetail = true;
            RequestFilterFields = "No.", "Inventory Posting Group", "Statistics Group", "Location Filter";
            column(AsofStatusDate; StrSubstNo(Text000, Format(StatusDate)))
            {
            }
            column(CompanyName; COMPANYPROPERTY.DisplayName())
            {
            }
            column(ItemTableCaption; TableCaption + ': ' + ItemFilter)
            {
            }
            column(ItemFilter; ItemFilter)
            {
            }
            column(No_Item; "No.")
            {
            }
            column(Description_Item; Description)
            {
            }
            column(BaseUnitofMeasure_Item; "Base Unit of Measure")
            {
                IncludeCaption = true;
            }
            column(CostingMethod_Item; "Costing Method")
            {
                IncludeCaption = true;
            }
            column(InvtValue; InvtValue)
            {
                AutoFormatType = 1;
            }
            column(LocationFilter_Item; "Location Filter")
            {
            }
            column(VariantFilter_Item; "Variant Filter")
            {
            }
            column(GlobalDim1Filter_Item; "Global Dimension 1 Filter")
            {
            }
            column(GlobalDim2Filter_Item; "Global Dimension 2 Filter")
            {
            }
            column(StatusCaption; StatusCaptionLbl)
            {
            }
            column(PageCaption; PageCaptionLbl)
            {
            }
            column(UnitCostCaption; UnitCostCaptionLbl)
            {
            }
            column(PostingDateCaption; PostingDateCaptionLbl)
            {
            }
            column(QuantityCaption; QuantityCaptionLbl)
            {
            }
            column(InventoryValuationCaption; InventoryValuationCaptionLbl)
            {
            }
            column(TotalCaption; TotalCaptionLbl)
            {
            }
            column(HereofPositiveCaption; HereofPositiveCaptionLbl)
            {
            }
            column(HereofNegativeCaption; HereofNegativeCaptionLbl)
            {
            }
            column(IsAverageCostItem; IsAverageCostItem)
            {
            }
            dataitem("Item Ledger Entry"; "Item Ledger Entry")
            {
                DataItemLink = "Item No." = field("No."), "Location Code" = field("Location Filter"), "Variant Code" = field("Variant Filter"), "Global Dimension 1 Code" = field("Global Dimension 1 Filter"), "Global Dimension 2 Code" = field("Global Dimension 2 Filter");
                DataItemTableView = sorting("Item No.", "Entry Type", "Variant Code", "Drop Shipment", "Location Code", "Posting Date", "Entry No.");
                column(PostingDate_ItemLedgerEntry; Format("Posting Date"))
                {
                }
                column(EntryType_ItemLedgerEntry; "Entry Type")
                {
                    IncludeCaption = true;
                }
                column(RemainingQty; RemainingQty)
                {
                    DecimalPlaces = 0 : 2;
                }
                column(UnitCost; UnitCost)
                {
                    AutoFormatType = 2;
                }
                column(InvtValue2; InvtValue)
                {
                    AutoFormatType = 1;
                }
                column(DocumentNo_ItemLedgerEntry; "Document No.")
                {
                    IncludeCaption = true;
                }
                column(Description2_Item; Item.Description)
                {
                }
                column(AvgCost; AvgCost)
                {
                    AutoFormatType = 2;
                }

                trigger OnAfterGetRecord()
                begin
                    if Item."Costing Method" = Item."Costing Method"::Average then
                        RemainingQty := Quantity
                    else begin
                        CalcRemainingQty();
                        if RemainingQty = 0 then
                            CurrReport.Skip();
                    end;

                    CalcUnitCost();
                    InvtValue := UnitCost * Abs(RemainingQty);
                end;

                trigger OnPreDataItem()
                begin
                    SetRange("Posting Date", 0D, StatusDate);
                    SetRange("Drop Shipment", false);

                    Clear(RemainingQty);
                    Clear(InvtValue);
                end;
            }

            trigger OnAfterGetRecord()
            begin
                IsAverageCostItem := "Costing Method" = "Costing Method"::Average;
            end;

            trigger OnPreDataItem()
            begin
                Clear(RemainingQty);
                Clear(InvtValue);
            end;
        }
    }

    requestpage
    {
        AboutTitle = 'About Status';
        AboutText = 'Helps you monitor and manage your inventory operations effectively by providing real-time insights into the current state of your inventory. Might allow you to optimize your supply chain processes and reduce cost associated with inventory.';
        SaveValues = true;

        layout
        {
            area(content)
            {
                group(Options)
                {
                    Caption = 'Options';
                    field(StatusDate; StatusDate)
                    {
                        ApplicationArea = Basic, Suite;
                        Caption = 'Status Date';
                        ToolTip = 'Specifies the status date.';

                        trigger OnValidate()
                        begin
                            if StatusDate = 0D then
                                Error(Text001);
                        end;
                    }
                }
            }
        }

        actions
        {
        }

        trigger OnOpenPage()
        begin
            if StatusDate = 0D then
                StatusDate := WorkDate();
        end;
    }

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

    labels
    {
    }

    trigger OnPreReport()
    begin
        ItemFilter := Item.GetFilters();

        ValueEntry.SetCurrentKey("Item Ledger Entry No.");
        ValueEntry.SetRange("Posting Date", 0D, StatusDate);
        ValueEntry.SetFilter("Variant Code", Item.GetFilter("Variant Filter"));
        ValueEntry.SetFilter("Location Code", Item.GetFilter("Location Filter"));
        ValueEntry.SetFilter("Global Dimension 1 Code", Item.GetFilter("Global Dimension 1 Filter"));
        ValueEntry.SetFilter("Global Dimension 2 Code", Item.GetFilter("Global Dimension 2 Filter"));
    end;

    var
        ValueEntry: Record "Value Entry";
        StatusDate: Date;
        ItemFilter: Text;
        InvtValue: Decimal;
        UnitCost: Decimal;
        RemainingQty: Decimal;
        AvgCost: Decimal;
        StatusCaptionLbl: Label 'Status';
        PageCaptionLbl: Label 'Page';
        UnitCostCaptionLbl: Label 'Unit Cost';
        PostingDateCaptionLbl: Label 'Posting Date';
        QuantityCaptionLbl: Label 'Quantity';
        InventoryValuationCaptionLbl: Label 'Inventory Valuation';
        TotalCaptionLbl: Label 'Total';
        HereofPositiveCaptionLbl: Label 'Hereof Positive';
        HereofNegativeCaptionLbl: Label 'Hereof Negative';
        IsAverageCostItem: Boolean;

#pragma warning disable AA0074
#pragma warning disable AA0470
        Text000: Label 'As of %1';
#pragma warning restore AA0470
        Text001: Label 'Enter the Status Date';
#pragma warning restore AA0074

    local procedure CalcRemainingQty()
    var
        ItemApplnEntry: Record "Item Application Entry";
    begin
        RemainingQty := "Item Ledger Entry".Quantity;

        if "Item Ledger Entry".Positive then begin
            ItemApplnEntry.Reset();
            ItemApplnEntry.SetCurrentKey(
              "Inbound Item Entry No.", "Outbound Item Entry No.", "Cost Application");
            ItemApplnEntry.SetRange("Inbound Item Entry No.", "Item Ledger Entry"."Entry No.");
            ItemApplnEntry.SetFilter("Outbound Item Entry No.", '<>%1', 0);
            ItemApplnEntry.SetRange("Posting Date", 0D, StatusDate);
            if ItemApplnEntry.Find('-') then
                repeat
                    SumQty(RemainingQty, ItemApplnEntry."Outbound Item Entry No.", ItemApplnEntry.Quantity);
                until ItemApplnEntry.Next() = 0;
        end else begin
            ItemApplnEntry.Reset();
            ItemApplnEntry.SetCurrentKey("Outbound Item Entry No.", "Item Ledger Entry No.", "Cost Application");
            ItemApplnEntry.SetRange("Outbound Item Entry No.", "Item Ledger Entry"."Entry No.");
            ItemApplnEntry.SetRange("Item Ledger Entry No.", "Item Ledger Entry"."Entry No.");
            ItemApplnEntry.SetRange("Posting Date", 0D, StatusDate);
            if ItemApplnEntry.Find('-') then
                repeat
                    SumQty(RemainingQty, ItemApplnEntry."Inbound Item Entry No.", -ItemApplnEntry.Quantity);
                until ItemApplnEntry.Next() = 0;
        end;
    end;

    local procedure SumQty(var RemainingQty: Decimal; EntryNo: Integer; AppliedQty: Decimal)
    var
        ItemLedgEntry: Record "Item Ledger Entry";
    begin
        ItemLedgEntry.Get(EntryNo);
        if (ItemLedgEntry.Quantity * AppliedQty < 0) or
           (ItemLedgEntry."Posting Date" > StatusDate)
        then
            exit;

        RemainingQty := RemainingQty + AppliedQty;
    end;

    local procedure CalcUnitCost()
    begin
        ValueEntry.SetRange("Item Ledger Entry No.", "Item Ledger Entry"."Entry No.");
        UnitCost := 0;

        if ValueEntry.Find('-') then
            repeat
                if ValueEntry."Partial Revaluation" then
                    SumUnitCost(UnitCost, ValueEntry."Cost Amount (Actual)" + ValueEntry."Cost Amount (Expected)", ValueEntry."Valued Quantity")
                else
                    SumUnitCost(UnitCost, ValueEntry."Cost Amount (Actual)" + ValueEntry."Cost Amount (Expected)", "Item Ledger Entry".Quantity);
            until ValueEntry.Next() = 0;
    end;

    local procedure SumUnitCost(var UnitCost: Decimal; CostAmount: Decimal; Quantity: Decimal)
    begin
        UnitCost := UnitCost + CostAmount / Abs(Quantity);
    end;

    procedure InitializeRequest(NewStatusDate: Date)
    begin
        StatusDate := NewStatusDate;
    end;
}