Report 1004 Close Inventory Period - Test

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

Procedures, 1Events, 2

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Inventory/Reports/CloseInventoryPeriodTest.Report.al384 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.Assembly.History;
using Microsoft.Inventory.Costing;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Setup;
using Microsoft.Utilities;
using System.Environment;
using System.Utilities;

report 1004 "Close Inventory Period - Test"
{
    Caption = 'Close Inventory Period - Test';
    EnableHyperlinks = true;
    DefaultRenderingLayout = RDLCLayout;

    dataset
    {
        dataitem("Inventory Period"; "Inventory Period")
        {
            DataItemTableView = sorting("Ending Date");
            RequestFilterFields = "Ending Date";
            dataitem(Header; "Integer")
            {
                DataItemTableView = sorting(Number) where(Number = const(1));
                column(CompanyName; COMPANYPROPERTY.DisplayName())
                {
                }
                column(TodayFormatted; Format(Today, 0, 4))
                {
                }
                column(Name_InvtPeriod; "Inventory Period".Name)
                {
                }
                column(EndingDateFormat_InvtPeriod; Format("Inventory Period"."Ending Date"))
                {
                }
                column(ClosedFormat_InvtPeriod; Format("Inventory Period".Closed))
                {
                }
                column(PageNoCaption; PageCaptionLbl)
                {
                }
                column(CloseInventoryPeriodTestCaption; CloseInventPeriodTestCaptionLbl)
                {
                }
                column(ClosedCaption_InvtPeriod; "Inventory Period".FieldCaption(Closed))
                {
                }
                column(NameCaption_InvtPeriod; "Inventory Period".FieldCaption(Name))
                {
                }
                column(PeriodEndingDateCaption; EndingDateCaptionLbl)
                {
                }
                column(PeriodErrorText; PeriodErrorText)
                {
                }
                dataitem("Avg. Cost Adjmt. Entry Point"; "Avg. Cost Adjmt. Entry Point")
                {
                    DataItemTableView = sorting("Item No.", "Cost Is Adjusted", "Valuation Date");

                    trigger OnAfterGetRecord()
                    begin
                        if "Item No." <> LastItemNoStored then begin
                            StoreItemInErrorBuffer("Item No.", DATABASE::"Avg. Cost Adjmt. Entry Point", Text008, '', '', 0);
                            LastItemNoStored := "Item No.";
                        end;
                    end;

                    trigger OnPreDataItem()
                    begin
                        SetRange("Cost Is Adjusted", false);
                        SetRange("Valuation Date", 0D, "Inventory Period"."Ending Date");
                        LastItemNoStored := '';
                    end;
                }
                dataitem("Inventory Adjmt. Entry (Order)"; "Inventory Adjmt. Entry (Order)")
                {
                    DataItemTableView = sorting("Cost is Adjusted", "Allow Online Adjustment") where("Cost is Adjusted" = const(false), "Is Finished" = const(true));

                    trigger OnAfterGetRecord()
                    var
                        ValueEntry: Record "Value Entry";
                    begin
                        ValueEntry.SetCurrentKey("Order Type", "Order No.", "Order Line No.");
                        ValueEntry.SetRange("Order Type", "Order Type");
                        ValueEntry.SetRange("Order No.", "Order No.");
                        ValueEntry.SetRange("Order Line No.", "Order Line No.");
                        case "Order Type" of
                            "Order Type"::Production:
                                ValueEntry.SetRange("Item Ledger Entry Type", ValueEntry."Item Ledger Entry Type"::Output);
                            "Order Type"::Assembly:
                                ValueEntry.SetRange("Item Ledger Entry Type", ValueEntry."Item Ledger Entry Type"::"Assembly Output");
                            else
                                OnCaseOrderTypeElse(ValueEntry);
                        end;
                        ValueEntry.SetRange("Valuation Date", 0D, "Inventory Period"."Ending Date");

                        if not ValueEntry.IsEmpty() then
                            StoreOrderInErrorBuffer("Inventory Adjmt. Entry (Order)");
                    end;
                }
                dataitem("Item Ledger Entry"; "Item Ledger Entry")
                {
                    DataItemTableView = sorting("Item No.", Open, "Variant Code", Positive, "Location Code", "Posting Date", "Entry No.");

                    trigger OnAfterGetRecord()
                    begin
                        StoreItemInErrorBuffer("Item No.", DATABASE::"Item Ledger Entry", StrSubstNo(Text003, "Entry No."), '', '', 0);
                    end;

                    trigger OnPreDataItem()
                    begin
                        SetRange(Open, true);
                        SetRange(Positive, false);
                        SetRange("Posting Date", 0D, "Inventory Period"."Ending Date");
                    end;
                }
                dataitem(Item; Item)
                {
                    DataItemTableView = sorting("No.");
                    column(Description_Item; Description)
                    {
                    }
                    column(No_Item; "No.")
                    {
                    }
                    column(NoteText; NoteText)
                    {
                    }
                    column(DescriptionCaption_Item; FieldCaption(Description))
                    {
                    }
                    column(ItemHyperlink; ItemHyperlink)
                    {
                    }
                    column(NoCaption_Item; FieldCaption("No."))
                    {
                    }
                    dataitem(ItemErrorLoop; "Integer")
                    {
                        DataItemTableView = sorting(Number);
                        column(TempItemErrorBufferErrorText; TempItemErrorBuffer."Error Text")
                        {
                        }

                        trigger OnAfterGetRecord()
                        begin
                            GetErrorBuffer(TempItemErrorBuffer, Number = 1);
                        end;

                        trigger OnPreDataItem()
                        begin
                            TempItemErrorBuffer.SetRange("Source No.", Item."No.");
                            TempItemErrorBuffer.SetRange("Source Table", DATABASE::"Avg. Cost Adjmt. Entry Point");
                            SetRange(Number, 1, TempItemErrorBuffer.Count);
                        end;
                    }
                    dataitem(ItemOrderErrorLoop; "Integer")
                    {
                        DataItemTableView = sorting(Number);
                        column(ItemOrderErrorLoopErrorText; TempItemErrorBuffer."Error Text")
                        {
                        }
                        column(ErrorHyperlink; ErrorHyperlink)
                        {
                        }
                        column(ErrorHyperlinkAnchor; ErrorHyperlinkAnchor)
                        {
                        }

                        trigger OnAfterGetRecord()
                        begin
                            GetErrorBuffer(TempItemErrorBuffer, Number = 1);

                            if TempItemErrorBufferBookmark.Get(TempItemErrorBuffer."Error No.") then begin
                                ErrorHyperlink := GenerateHyperlink(TempItemErrorBufferBookmark."Error Text", TempItemErrorBufferBookmark."Source Ref. No.");
                                ErrorHyperlinkAnchor := TempItemErrorBufferBookmark."Source No." + ':';
                            end else begin
                                ErrorHyperlink := '';
                                ErrorHyperlinkAnchor := '';
                            end;
                        end;

                        trigger OnPreDataItem()
                        begin
                            TempItemErrorBuffer.SetRange("Source No.", Item."No.");
                            TempItemErrorBuffer.SetRange("Source Table", DATABASE::"Inventory Adjmt. Entry (Order)");
                            SetRange(Number, 1, TempItemErrorBuffer.Count);
                        end;
                    }
                    dataitem(ItemLedgErrorLoop; "Integer")
                    {
                        DataItemTableView = sorting(Number);
                        column(ItemLedgErrorLoopErrorText; TempItemErrorBuffer."Error Text")
                        {
                        }

                        trigger OnAfterGetRecord()
                        begin
                            GetErrorBuffer(TempItemErrorBuffer, Number = 1);
                        end;

                        trigger OnPreDataItem()
                        begin
                            TempItemErrorBuffer.SetRange("Source No.", Item."No.");
                            TempItemErrorBuffer.SetRange("Source Table", DATABASE::"Item Ledger Entry");
                            if not TempItemErrorBuffer.IsEmpty() and (NoteText = '') then
                                NoteText := Text004;
                            SetRange(Number, 1, TempItemErrorBuffer.Count);
                        end;
                    }

                    trigger OnAfterGetRecord()
                    var
                        RecRef: RecordRef;
                    begin
                        RecRef.GetTable(Item);
                        ItemHyperlink := GenerateHyperlink(Format(RecRef.RecordId, 0, 10), PAGE::"Item Card");
                    end;

                    trigger OnPostDataItem()
                    begin
                        TempItemErrorBuffer.Reset();
                        TempItemErrorBuffer.DeleteAll();
                        TempItemErrorBufferBookmark.Reset();
                        TempItemErrorBufferBookmark.DeleteAll();
                    end;

                    trigger OnPreDataItem()
                    begin
                        Item2.MarkedOnly(true);
                        Copy(Item2);
                    end;
                }
            }

            trigger OnAfterGetRecord()
            begin
                if "Ending Date" = 0D then
                    PeriodErrorText := StrSubstNo(Text001, FieldCaption("Ending Date"), Name)
                else
                    PeriodErrorText := '';
            end;
        }
    }

    requestpage
    {

        layout
        {
        }

        actions
        {
        }
    }

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

    labels
    {
    }

    var
        Item2: Record Item;
        TempItemErrorBuffer: Record "Error Buffer" temporary;
        TempItemErrorBufferBookmark: Record "Error Buffer" temporary;
        ClientTypeManagement: Codeunit "Client Type Management";
        PeriodErrorText: Text[250];
        NoteText: Text[250];
        ItemHyperlink: Text;
        ErrorHyperlink: Text;
        ErrorHyperlinkAnchor: Code[21];
        LastItemNoStored: Code[20];

#pragma warning disable AA0074
        Text001: Label '%1 is missing in Inventory Period %2.', Comment = '%1 = FIELDCAPTION("Ending Date"), %2 = "Name"';
#pragma warning disable AA0470
        Text003: Label 'Item Ledger Entry %1 is open.*';
#pragma warning restore AA0470
        Text004: Label '*Close the open Item Ledger Entry, for example by posting related inbound transactions, in order to resolve the negative inventory and thereby allow the Inventory Period to be closed.';
#pragma warning restore AA0074
        PageCaptionLbl: Label 'Page';
        CloseInventPeriodTestCaptionLbl: Label 'Close Inventory Period - Test';
        EndingDateCaptionLbl: Label 'Ending Date';
#pragma warning disable AA0074
        Text008: Label 'The item has entries in this period that have not been adjusted.';
#pragma warning disable AA0470
        Text009: Label 'This %1 Order has not been adjusted.';
#pragma warning restore AA0470
        Text010: Label 'Posted Assembly';
#pragma warning restore AA0074

    procedure StoreItemInErrorBuffer(ItemNo: Code[20]; SourceTableNo: Integer; ErrorText: Text[250]; Recordbookmark: Text[250]; HyperlinkSourceRecNo: Code[20]; HyperlinkPageID: Integer)
    begin
        TempItemErrorBuffer."Error No." += 1;
        TempItemErrorBuffer."Error Text" := ErrorText;
        TempItemErrorBuffer."Source Table" := SourceTableNo;
        TempItemErrorBuffer."Source No." := ItemNo;
        TempItemErrorBuffer.Insert();

        if Recordbookmark <> '' then begin
            TempItemErrorBufferBookmark."Error No." := TempItemErrorBuffer."Error No.";
            TempItemErrorBufferBookmark."Error Text" := Recordbookmark;
            TempItemErrorBufferBookmark."Source No." := HyperlinkSourceRecNo;
            TempItemErrorBufferBookmark."Source Ref. No." := HyperlinkPageID;
            TempItemErrorBufferBookmark.Insert();
        end;

        if ItemNo <> '' then begin
            Item2.Get(ItemNo);
            Item2.Mark(true);
        end;
    end;

    local procedure StoreOrderInErrorBuffer(InventoryAdjmtEntryOrder: Record "Inventory Adjmt. Entry (Order)")
    var
        PostedAssemblyHeader: Record "Posted Assembly Header";
        RecRef: RecordRef;
        Bookmark: Text[250];
    begin
        OnStoreOrderInErrorBuffer(InventoryAdjmtEntryOrder);
        case InventoryAdjmtEntryOrder."Order Type" of
            InventoryAdjmtEntryOrder."Order Type"::Assembly:
                begin
                    PostedAssemblyHeader.SetRange("Order No.", InventoryAdjmtEntryOrder."Order No.");
                    if PostedAssemblyHeader.FindSet() then
                        repeat
                            RecRef.GetTable(PostedAssemblyHeader);
                            Bookmark := Format(RecRef.RecordId, 0, 10);
                            StoreItemInErrorBuffer(
                                InventoryAdjmtEntryOrder."Item No.", DATABASE::"Inventory Adjmt. Entry (Order)",
                                StrSubstNo(Text009, Text010), Bookmark, PostedAssemblyHeader."No.", PAGE::"Posted Assembly Order");
                        until PostedAssemblyHeader.Next() = 0;
                end;
        end;
    end;

    local procedure GetErrorBuffer(var TempItemErrorBuffer: Record "Error Buffer" temporary; GetFirstRecord: Boolean)
    begin
        if GetFirstRecord then
            TempItemErrorBuffer.FindSet()
        else
            TempItemErrorBuffer.Next();
    end;

    local procedure GenerateHyperlink(Bookmark: Text[250]; PageID: Integer): Text
    begin
        if Bookmark = '' then
            exit('');

        // Generates a URL such as dynamicsnav://hostname:port/instance/company/runpage?page=pageId&bookmark=recordId&mode=View.
        exit(GetUrl(ClientTypeManagement.GetCurrentClientType(), CompanyName, OBJECTTYPE::Page, PageID) +
          StrSubstNo('&amp;bookmark=%1&mode=View', Bookmark));
    end;

    [IntegrationEvent(false, false)]
    local procedure OnCaseOrderTypeElse(var ValueEntry: Record "Value Entry");
    begin
    end;

    [IntegrationEvent(true, false)]
    local procedure OnStoreOrderInErrorBuffer(InventoryAdjmtEntryOrder: Record "Inventory Adjmt. Entry (Order)")
    begin
    end;
}