Codeunit 5918 ServOrder-Check Response Time
- App
- Base Application
- Namespace
- Microsoft.Service.Document
- Versions
- 17-28
Versions171819202122232425262728
Source29
Source in 29
src/Layers/W1/BaseApp/Service/Document/ServOrderCheckResponseTime.Codeunit.al230 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.Document;
using Microsoft.Foundation.Calendar;
using Microsoft.Inventory.Location;
using Microsoft.Service.Contract;
using Microsoft.Service.Email;
using Microsoft.Service.Maintenance;
using Microsoft.Service.Setup;
using System.Threading;
codeunit 5918 "ServOrder-Check Response Time"
{
TableNo = "Job Queue Entry";
trigger OnRun()
begin
ServMgtSetup.Get();
ServMgtSetup.TestField("First Warning Within (Hours)");
RepairStatus.SetRange(Initial, true);
if not RepairStatus.FindFirst() then
Error(Text005, RepairStatus.TableCaption(), RepairStatus.FieldCaption(Initial));
Clear(ServItemLine);
Clear(ServHeader);
ServHeader.SetCurrentKey(Status, "Response Date", "Response Time", Priority);
ServHeader.SetRange(Status, ServHeader.Status::Pending);
if ServHeader.FindSet() then
repeat
CheckDate1 := WorkDate();
CheckTime1 := Time;
CalculateCheckDate(CheckDate1, CheckTime1, ServMgtSetup."First Warning Within (Hours)");
ServItemLine.SetCurrentKey("Document Type", "Document No.", "Response Date");
ServItemLine.SetRange("Document Type", ServHeader."Document Type");
ServItemLine.SetRange("Document No.", ServHeader."No.");
ServItemLine.SetFilter("Response Date", '>%1&<=%2', 0D, CheckDate1);
ServItemLine.SetFilter("Repair Status Code", RepairStatus.Code);
if ServItemLine.FindSet() then begin
if ServHeader."Responsibility Center" <> '' then
RespCenter.Get(ServHeader."Responsibility Center");
repeat
WarningStatus := CheckResponseTime(ServItemLine."Response Date", ServItemLine."Response Time");
if WarningStatus > ServHeader."Warning Status" then
case WarningStatus of
1:
if RespCenter."E-Mail" <> '' then
SendEMail(RespCenter."E-Mail")
else
SendEMail(ServMgtSetup."Send First Warning To");
2:
if RespCenter."E-Mail" <> '' then
SendEMail(RespCenter."E-Mail")
else
SendEMail(ServMgtSetup."Send Second Warning To");
3:
if RespCenter."E-Mail" <> '' then
SendEMail(RespCenter."E-Mail")
else
SendEMail(ServMgtSetup."Send Third Warning To");
end;
until ServItemLine.Next() = 0;
end;
until ServHeader.Next() = 0
else // No Pending ServiceHeaders -> deactivate the job queue entry.
Rec.SetStatus(Rec.Status::"On Hold");
end;
var
ServHeader: Record "Service Header";
ServItemLine: Record "Service Item Line";
ServMgtSetup: Record "Service Mgt. Setup";
RespCenter: Record "Responsibility Center";
ServHour: Record "Service Hour";
RepairStatus: Record "Repair Status";
WarningStatus: Integer;
CheckDate1: Date;
CheckDate2: Date;
CheckDate3: Date;
CheckTime1: Time;
CheckTime2: Time;
CheckTime3: Time;
#pragma warning disable AA0074
#pragma warning disable AA0470
Text000: Label '%1. Warning Message for Service Order %2';
Text001: Label 'Check the response time for service order %1';
#pragma warning restore AA0470
Text004: Label 'Email address is missing.';
#pragma warning disable AA0470
Text005: Label '%1 with the field %2 selected cannot be found.';
#pragma warning restore AA0470
#pragma warning restore AA0074
ServHrNotSetupErr: Label '%1 is not setup. Please set it up before running this scenario.', Comment = '%1 = page name';
local procedure CheckResponseTime(ResponseDate: Date; ResponseTime: Time): Integer
begin
if ResponseDate = 0D then
exit(0);
if ServMgtSetup."Third Warning Within (Hours)" <> 0 then begin
CheckDate3 := WorkDate();
CheckTime3 := Time;
CalculateCheckDate(CheckDate3, CheckTime3, ServMgtSetup."Third Warning Within (Hours)");
if ResponseDate < CheckDate3 then
exit(3);
if ResponseDate = CheckDate3 then
if ResponseTime < CheckTime3 then
exit(3);
end;
if ServMgtSetup."Second Warning Within (Hours)" <> 0 then begin
CheckDate2 := WorkDate();
CheckTime2 := Time;
CalculateCheckDate(CheckDate2, CheckTime2, ServMgtSetup."Second Warning Within (Hours)");
if ResponseDate < CheckDate2 then
exit(2);
if ResponseDate = CheckDate2 then
if ResponseTime < CheckTime2 then
exit(2);
end;
if ResponseDate < CheckDate1 then
exit(1);
if ResponseDate = CheckDate1 then
if ResponseTime < CheckTime1 then
exit(1);
exit(0);
end;
local procedure SendEMail(SendtoAddress: Text[80])
var
ServEmailQueue: Record "Service Email Queue";
begin
if SendtoAddress = '' then
Error(Text004);
ServHeader."Warning Status" := WarningStatus;
ServHeader.Modify();
ServEmailQueue.Init();
ServEmailQueue."To Address" := SendtoAddress;
ServEmailQueue."Copy-to Address" := '';
ServEmailQueue."Subject Line" := StrSubstNo(Text000, Format(WarningStatus), ServHeader."No.");
ServEmailQueue."Body Line" := StrSubstNo(Text001, ServHeader."No.");
ServEmailQueue."Attachment Filename" := '';
ServEmailQueue."Document Type" := ServEmailQueue."Document Type"::"Service Order";
ServEmailQueue."Document No." := ServHeader."No.";
ServEmailQueue.Status := ServEmailQueue.Status::" ";
ServEmailQueue.Insert(true);
ServEmailQueue.ScheduleInJobQueue();
end;
local procedure CalculateCheckDate(var CheckDate: Date; var CheckTime: Time; HoursAhead: Decimal)
var
CalChange: Record "Customized Calendar Change";
ServMgtSetup: Record "Service Mgt. Setup";
CalendarMgmt: Codeunit "Calendar Management";
ServiceHours: Page "Default Service Hours";
TotTime: Decimal;
LastTotTime: Decimal;
HoursLeft: Decimal;
HoursOnLastDay: Decimal;
Holiday: Boolean;
TempDate: Date;
TempDay: Integer;
begin
ServMgtSetup.Get();
ServMgtSetup.TestField("Base Calendar Code");
CalendarMgmt.SetSource(ServMgtSetup, CalChange);
ServHour.Reset();
ServHour.SetRange("Service Contract No.", '');
ServHour.SetRange("Service Contract Type", ServHour."Service Contract Type"::" ");
TotTime := 0;
LastTotTime := 0;
TempDate := CheckDate;
HoursLeft := HoursAhead * 3600000;
if ServHour.IsEmpty() then
Error(ServHrNotSetupErr, ServiceHours.Caption);
repeat
TempDay := Date2DWY(TempDate, 1) - 1;
HoursOnLastDay := 0;
ServHour.SetRange(Day, TempDay);
if ServHour.FindFirst() then begin
if ServHour."Valid on Holidays" then
Holiday := false
else
Holiday := CalendarMgmt.IsNonworkingDay(TempDate, CalChange);
if not Holiday then begin
if TempDate = CheckDate then begin
if CheckTime < ServHour."Ending Time" then
if HoursLeft > CalendarMgmt.CalcTimeDelta(ServHour."Ending Time", CheckTime) then begin
TotTime := TotTime + CalendarMgmt.CalcTimeDelta(ServHour."Ending Time", CheckTime);
HoursOnLastDay := CalendarMgmt.CalcTimeDelta(ServHour."Ending Time", CheckTime);
end else begin
TotTime := TotTime + HoursLeft;
HoursOnLastDay := HoursLeft;
end;
end else
if HoursLeft > CalendarMgmt.CalcTimeDelta(ServHour."Ending Time", ServHour."Starting Time") then begin
TotTime := TotTime + CalendarMgmt.CalcTimeDelta(ServHour."Ending Time", ServHour."Starting Time");
HoursOnLastDay := CalendarMgmt.CalcTimeDelta(ServHour."Ending Time", ServHour."Starting Time");
end else begin
TotTime := TotTime + HoursLeft;
HoursOnLastDay := HoursLeft;
end;
if LastTotTime < TotTime then begin
HoursLeft := HoursLeft - (TotTime - LastTotTime);
LastTotTime := TotTime;
end;
end;
end;
TempDate := TempDate + 1;
until HoursLeft <= 0;
if TotTime > 0 then begin
if CheckDate = TempDate - 1 then
CheckTime := CheckTime + HoursOnLastDay
else
CheckTime := ServHour."Starting Time" + HoursOnLastDay;
CheckDate := TempDate - 1;
end;
end;
}