Codeunit 6473 Serv. Item Track Navigate Mgt

App
Base Application
Namespace
Microsoft.Service.Item
Versions
25-28

Versions171819202122232425262728

Source29

Source in 29

src/Layers/W1/BaseApp/Service/ServItemTrackNavigateMgt.Codeunit.al340 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.Item;

using Microsoft.Inventory.Item;
using Microsoft.Inventory.Ledger;
using Microsoft.Inventory.Tracking;
using Microsoft.Service.Contract;
using Microsoft.Service.Document;
using Microsoft.Service.History;
using Microsoft.Service.Loaner;
using System.IO;

codeunit 6473 "Serv. Item Track Navigate Mgt"
{
    var
        ServItemLine: Record "Service Item Line";
        Loaner: Record Loaner;
        ServiceItem: Record "Service Item";
        ServiceItemComponent: Record "Service Item Component";
        ServContractLine: Record "Service Contract Line";
        FiledContractLine: Record "Filed Contract Line";
        ItemTrackingSetup: Record "Item Tracking Setup";
        RecRef: RecordRef;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Navigate Mgt.", 'OnFindTrackingRecordsOnAfterFindSerialNo', '', true, false)]
    local procedure OnFindTrackingRecordsOnAfterFindSerialNo(var TempRecordBuffer: Record "Record Buffer" temporary; var ItemFilters: Record Item; sender: Codeunit "Item Tracking Navigate Mgt.");
    begin
        FindSerialNoServItemLine(ItemFilters, sender);
        FindSerialNoLoaner(ItemFilters, sender);
        FindSerialNoServiceItem(ItemFilters, sender);
        FindSerialNoServiceItemComponent(ItemFilters, sender);
        FindSerialNoServContractLine(ItemFilters, sender);
        FindSerialNoFiledContractLine(ItemFilters, sender);
    end;

    local procedure FindSerialNoServItemLine(var ItemFilters: Record Item; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    begin
        if not ServItemLine.ReadPermission then
            exit;

        ServItemLine.Reset();
        if ServItemLine.SetCurrentKey("Serial No.") then;
        ServItemLine.SetFilter("Serial No.", ItemFilters.GetFilter("Serial No. Filter"));
        ServItemLine.SetFilter("Item No.", ItemFilters.GetFilter("No."));
        ServItemLine.SetFilter("Variant Code", ItemFilters.GetFilter("Variant Filter"));
        if ServItemLine.FindSet() then
            repeat
                RecRef.GetTable(ServItemLine);
                Clear(ItemTrackingSetup);
                ItemTrackingSetup."Serial No." := ServItemLine."Serial No.";
                ItemTrackingNavigateMgt.InsertBufferRec(RecRef, ItemTrackingSetup, ServItemLine."Item No.", ServItemLine."Variant Code");
            until ServItemLine.Next() = 0;
    end;

    local procedure FindSerialNoServiceItem(var ItemFilters: Record Item; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    begin
        if not ServiceItem.ReadPermission then
            exit;

        ServiceItem.Reset();
        if ServiceItem.SetCurrentKey("Serial No.") then;
        ServiceItem.SetFilter("Serial No.", ItemFilters.GetFilter("Serial No. Filter"));
        ServiceItem.SetFilter("Item No.", ItemFilters.GetFilter("No."));
        ServiceItem.SetFilter("Variant Code", ItemFilters.GetFilter("Variant Filter"));
        if ServiceItem.FindSet() then
            repeat
                RecRef.GetTable(ServiceItem);
                Clear(ItemTrackingSetup);
                ItemTrackingSetup."Serial No." := ServiceItem."Serial No.";
                ItemTrackingNavigateMgt.InsertBufferRec(RecRef, ItemTrackingSetup, ServiceItem."Item No.", ServiceItem."Variant Code");
            until ServiceItem.Next() = 0;
    end;

    local procedure FindSerialNoServiceItemComponent(var ItemFilters: Record Item; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    begin
        if not ServiceItemComponent.ReadPermission then
            exit;

        ServiceItemComponent.Reset();
        if ServiceItemComponent.SetCurrentKey("Serial No.") then;
        ServiceItemComponent.SetFilter("Serial No.", ItemFilters.GetFilter("Serial No. Filter"));
        ServiceItemComponent.SetFilter("Parent Service Item No.", ItemFilters.GetFilter("No."));
        ServiceItemComponent.SetFilter("Variant Code", ItemFilters.GetFilter("Variant Filter"));
        if ServiceItemComponent.FindSet() then
            repeat
                RecRef.GetTable(ServiceItemComponent);
                Clear(ItemTrackingSetup);
                ItemTrackingSetup."Serial No." := ServiceItemComponent."Serial No.";
                ItemTrackingNavigateMgt.InsertBufferRec(RecRef, ItemTrackingSetup, ServiceItemComponent."Parent Service Item No.", ServiceItemComponent."Variant Code");
            until ServiceItemComponent.Next() = 0;
    end;

    local procedure FindSerialNoServContractLine(var ItemFilters: Record Item; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    begin
        if not ServContractLine.ReadPermission then
            exit;

        ServContractLine.Reset();
        if ServContractLine.SetCurrentKey("Serial No.") then;
        ServContractLine.SetFilter("Serial No.", ItemFilters.GetFilter("Serial No. Filter"));
        ServContractLine.SetFilter("Item No.", ItemFilters.GetFilter("No."));
        ServContractLine.SetFilter("Variant Code", ItemFilters.GetFilter("Variant Filter"));
        if ServContractLine.FindSet() then
            repeat
                RecRef.GetTable(ServContractLine);
                Clear(ItemTrackingSetup);
                ItemTrackingSetup."Serial No." := ServContractLine."Serial No.";
                ItemTrackingNavigateMgt.InsertBufferRec(RecRef, ItemTrackingSetup, ServContractLine."Item No.", ServContractLine."Variant Code");
            until ServContractLine.Next() = 0;
    end;

    local procedure FindSerialNoLoaner(var ItemFilters: Record Item; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    begin
        if not Loaner.ReadPermission then
            exit;

        Loaner.Reset();
        if Loaner.SetCurrentKey("Serial No.") then;
        Loaner.SetFilter("Serial No.", ItemFilters.GetFilter("Serial No. Filter"));
        Loaner.SetFilter("Item No.", ItemFilters.GetFilter("No."));
        if Loaner.FindSet() then
            repeat
                RecRef.GetTable(Loaner);
                Clear(ItemTrackingSetup);
                ItemTrackingSetup."Serial No." := Loaner."Serial No.";
                ItemTrackingNavigateMgt.InsertBufferRec(RecRef, ItemTrackingSetup, Loaner."Item No.", '');
            until Loaner.Next() = 0;
    end;

    local procedure FindSerialNoFiledContractLine(var ItemFilters: Record Item; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    begin
        if not FiledContractLine.ReadPermission then
            exit;

        FiledContractLine.Reset();
        if FiledContractLine.SetCurrentKey("Serial No.") then;
        FiledContractLine.SetFilter("Serial No.", ItemFilters.GetFilter("Serial No. Filter"));
        FiledContractLine.SetFilter("Item No.", ItemFilters.GetFilter("No."));
        FiledContractLine.SetFilter("Variant Code", ItemFilters.GetFilter("Variant Filter"));
        if FiledContractLine.FindSet() then
            repeat
                RecRef.GetTable(FiledContractLine);
                Clear(ItemTrackingSetup);
                ItemTrackingSetup."Serial No." := FiledContractLine."Serial No.";
                ItemTrackingNavigateMgt.InsertBufferRec(RecRef, ItemTrackingSetup, FiledContractLine."Item No.", FiledContractLine."Variant Code");
            until FiledContractLine.Next() = 0;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Navigate Mgt.", 'OnSearchValueEntriesOnAfterFindValueEntry', '', true, false)]
    local procedure OnSearchValueEntriesOnAfterFindValueEntry(ValueEntry: Record "Value Entry"; sender: Codeunit "Item Tracking Navigate Mgt.");
    begin
        case ValueEntry."Document Type" of
            ValueEntry."Document Type"::"Service Invoice":
                FindServInvoice(ValueEntry."Document No.", sender);
            ValueEntry."Document Type"::"Service Credit Memo":
                FindServCrMemo(ValueEntry."Document No.", sender);
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Data Collection", 'OnCanIncludeReservEntryToTrackingSpecOnCaseElse', '', true, false)]
    local procedure OnCanIncludeReservEntryToTrackingSpecOnCaseElse(TempReservEntry: Record "Reservation Entry"; var Result: Boolean);
    var
        ServiceLine: Record "Service Line";
    begin
        if (TempReservEntry."Reservation Status" = TempReservEntry."Reservation Status"::Prospect) and
       (TempReservEntry."Source Type" = Database::"Service Line") and
       (TempReservEntry."Source Subtype" = 2) then begin
            ServiceLine.Get(TempReservEntry."Source Subtype", TempReservEntry."Source ID", TempReservEntry."Source Ref. No.");
            if ServiceLine."Shipment No." <> '' then
                Result := false;
        end;
    end;

    local procedure FindServInvoice(DocumentNo: Code[20]; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    var
        ServInvHeader: Record "Service Invoice Header";
    begin
        if not ServInvHeader.ReadPermission then
            exit;

        if ServInvHeader.Get(DocumentNo) then begin
            RecRef.GetTable(ServInvHeader);
            ItemTrackingNavigateMgt.InsertBufferRecFromItemLedgEntry();
        end;
    end;

    local procedure FindServCrMemo(DocumentNo: Code[20]; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    var
        ServCrMemoHeader: Record "Service Cr.Memo Header";
    begin
        if not ServCrMemoHeader.ReadPermission then
            exit;

        if ServCrMemoHeader.Get(DocumentNo) then begin
            RecRef.GetTable(ServCrMemoHeader);
            ItemTrackingNavigateMgt.InsertBufferRecFromItemLedgEntry();
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Navigate Mgt.", 'OnFindReservEntryOnBeforeCaseDocumentType', '', true, false)]
    local procedure OnFindReservEntryOnBeforeCaseDocumentType(var ReservationEntry: Record "Reservation Entry"; var sender: Codeunit "Item Tracking Navigate Mgt.");
    begin
        case ReservationEntry."Source Type" of
            Database::"Service Line":
                FindServiceLines(ReservationEntry, sender);
        end;
    end;

    local procedure FindServiceLines(ReservationEntry: Record "Reservation Entry"; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    var
        ServLine: Record "Service Line";
    begin
        if not ServLine.ReadPermission then
            exit;

        if ServLine.Get(ReservationEntry."Source Subtype", ReservationEntry."Source ID", ReservationEntry."Source Ref. No.") then begin
            RecRef.GetTable(ServLine);
            ItemTrackingNavigateMgt.InsertBufferRecFromReservEntry();
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Navigate Mgt.", 'OnFindItemLedgerEntryOnBeforeCaseDocumentType', '', true, false)]
    local procedure OnFindItemLedgerEntryOnBeforeCaseDocumentType(var ItemLedgerEntry: Record "Item Ledger Entry"; var sender: Codeunit "Item Tracking Navigate Mgt.")
    begin
        case ItemLedgerEntry."Document Type" of
            ItemLedgerEntry."Document Type"::"Service Shipment":
                FindServShptHeader(ItemLedgerEntry."Document No.", sender);
            ItemLedgerEntry."Document Type"::"Service Invoice":
                FindServInvoice(ItemLedgerEntry."Document No.", sender);
            ItemLedgerEntry."Document Type"::"Service Credit Memo":
                FindServCrMemo(ItemLedgerEntry."Document No.", sender);
        end;
    end;

    local procedure FindServShptHeader(DocumentNo: Code[20]; var ItemTrackingNavigateMgt: Codeunit "Item Tracking Navigate Mgt.")
    var
        ServShptHeader: Record "Service Shipment Header";
    begin
        if not ServShptHeader.ReadPermission then
            exit;

        if ServShptHeader.Get(DocumentNo) then begin
            RecRef.GetTable(ServShptHeader);
            ItemTrackingNavigateMgt.InsertBufferRecFromItemLedgEntry();
            // Find Invoice if it exists
            ItemTrackingNavigateMgt.SearchValueEntries();
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Item Tracking Navigate Mgt.", 'OnShowTable', '', true, false)]
    local procedure OnShowTable(TableNo: Integer; var TempRecordBuffer: Record "Record Buffer" temporary)
    begin
        case TableNo of
            Database::"Service Item Line":
                Page.Run(0, ServItemLine);
            Database::Loaner:
                Page.Run(0, Loaner);
            Database::"Service Item":
                Page.Run(0, ServiceItem);
            Database::"Service Item Component":
                Page.Run(0, ServiceItemComponent);
            Database::"Service Contract Line":
                Page.Run(0, ServContractLine);
            Database::"Filed Contract Line":
                Page.Run(0, FiledContractLine);
            Database::"Service Shipment Header":
                ShowServiceShipmentHeader(TableNo, TempRecordBuffer);
            Database::"Service Invoice Header":
                ShowServiceInvoiceHeader(TableNo, TempRecordBuffer);
            Database::"Service Cr.Memo Header":
                ShowServiceCrMemoHeader(TableNo, TempRecordBuffer);
            Database::"Service Line":
                ShowServiceLine(TableNo, TempRecordBuffer);
        end;
    end;

    local procedure ShowServiceLine(TableNo: Integer; var TempRecordBuffer: Record "Record Buffer" temporary)
    var
        TempServLine: Record "Service Line" temporary;
    begin
        TempServLine.DeleteAll();
        TempRecordBuffer.SetRange("Table No.", TableNo);
        if TempRecordBuffer.FindSet() then
            repeat
                RecRef := TempRecordBuffer.RecordId.GetRecord();
                RecRef.SetTable(TempServLine);
                TempServLine.Insert();
            until TempRecordBuffer.Next() = 0;
        Page.Run(0, TempServLine);
    end;

    local procedure ShowServiceShipmentHeader(TableNo: Integer; var TempRecordBuffer: Record "Record Buffer" temporary)
    var
        TempServShptHeader: Record "Service Shipment Header" temporary;
    begin
        TempServShptHeader.DeleteAll();
        TempRecordBuffer.SetRange("Table No.", TableNo);
        if TempRecordBuffer.FindSet() then
            repeat
                RecRef := TempRecordBuffer.RecordId.GetRecord();
                RecRef.SetTable(TempServShptHeader);
                TempServShptHeader.Insert();
            until TempRecordBuffer.Next() = 0;
        Page.Run(0, TempServShptHeader);
    end;

    local procedure ShowServiceInvoiceHeader(TableNo: Integer; var TempRecordBuffer: Record "Record Buffer" temporary)
    var
        TempServiceInvoiceHeader: Record "Service Invoice Header" temporary;
    begin
        TempServiceInvoiceHeader.DeleteAll();
        TempRecordBuffer.SetRange("Table No.", TableNo);
        if TempRecordBuffer.FindSet() then
            repeat
                RecRef := TempRecordBuffer.RecordId.GetRecord();
                RecRef.SetTable(TempServiceInvoiceHeader);
                TempServiceInvoiceHeader.Insert();
            until TempRecordBuffer.Next() = 0;
        Page.Run(0, TempServiceInvoiceHeader);
    end;

    local procedure ShowServiceCrMemoHeader(TableNo: Integer; var TempRecordBuffer: Record "Record Buffer" temporary)
    var
        TempServiceCrMemoHeader: Record "Service Cr.Memo Header" temporary;
    begin
        TempServiceCrMemoHeader.DeleteAll();
        TempRecordBuffer.SetRange("Table No.", TableNo);
        if TempRecordBuffer.FindSet() then
            repeat
                RecRef := TempRecordBuffer.RecordId.GetRecord();
                RecRef.SetTable(TempServiceCrMemoHeader);
                TempServiceCrMemoHeader.Insert();
            until TempRecordBuffer.Next() = 0;
        Page.Run(0, TempServiceCrMemoHeader);
    end;
}