Report 952 Suggest Job Jnl. Lines, source in 29
Source29
src/Layers/W1/BaseApp/Projects/TimeSheet/SuggestJobJnlLines.Report.al281 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.Projects.TimeSheet;
using Microsoft.Foundation.NoSeries;
using Microsoft.Projects.Project.Job;
using Microsoft.Projects.Project.Journal;
using Microsoft.Projects.Project.Setup;
using Microsoft.Projects.Resources.Resource;
using Microsoft.Projects.Resources.Setup;
report 952 "Suggest Job Jnl. Lines"
{
Caption = 'Suggest Project Jnl. Lines';
ProcessingOnly = true;
dataset
{
}
requestpage
{
SaveValues = true;
layout
{
area(content)
{
group(Options)
{
Caption = 'Options';
field(StartingDate; StartingDate)
{
ApplicationArea = Jobs;
Caption = 'Starting Date';
ToolTip = 'Specifies the date from which the report or batch job processes information.';
}
field(EndingDate; EndingDate)
{
ApplicationArea = Jobs;
Caption = 'Ending Date';
ToolTip = 'Specifies the date to which the report or batch job processes information.';
}
field(ResourceNoFilter; ResourceNoFilter)
{
ApplicationArea = Jobs;
Caption = 'Resource No. Filter';
TableRelation = Resource;
ToolTip = 'Specifies the resource number that the batch job will suggest project lines for.';
}
field(JobNoFilter; JobNoFilter)
{
ApplicationArea = Jobs;
Caption = 'Project No. Filter';
TableRelation = Job;
ToolTip = 'Specifies a filter for the project numbers that will be included in the report.';
}
field(JobTaskNoFilter; JobTaskNoFilter)
{
ApplicationArea = Jobs;
Caption = 'Project Task No. Filter';
ToolTip = 'Specifies a filter for the project task numbers that will be included in the report.';
trigger OnLookup(var Text: Text): Boolean
var
JobTask: Record "Job Task";
begin
JobTask.FilterGroup(2);
if JobNoFilter <> '' then
JobTask.SetFilter("Job No.", JobNoFilter);
JobTask.FilterGroup(0);
if PAGE.RunModal(PAGE::"Job Task List", JobTask) = ACTION::LookupOK then
JobTask.TestField("Job Task Type", JobTask."Job Task Type"::Posting);
JobTaskNoFilter := JobTask."Job Task No.";
end;
}
}
}
}
actions
{
}
}
labels
{
}
trigger OnPostReport()
var
JobsSetup: Record "Jobs Setup";
NoSeries: Codeunit "No. Series";
TimeSheetMgt: Codeunit "Time Sheet Management";
NextDocNo: Code[20];
LineNo: Integer;
QtyToPost: Decimal;
begin
DateFilter := TimeSheetMgt.GetDateFilter(StartingDate, EndingDate);
FillTimeSheetLineBuffer();
if TempTimeSheetLine.FindSet() then begin
JobJnlLine.LockTable();
JobJnlTemplate.Get(JobJnlLine."Journal Template Name");
JobJnlBatch.Get(JobJnlLine."Journal Template Name", JobJnlLine."Journal Batch Name");
JobsSetup.SetLoadFields("Document No. Is Job No.");
JobsSetup.Get();
if not JobsSetup."Document No. Is Job No." then
if JobJnlBatch."No. Series" = '' then
NextDocNo := ''
else
NextDocNo := NoSeries.PeekNextNo(JobJnlBatch."No. Series", TempTimeSheetLine."Time Sheet Starting Date");
JobJnlLine.SetRange("Journal Template Name", JobJnlLine."Journal Template Name");
JobJnlLine.SetRange("Journal Batch Name", JobJnlLine."Journal Batch Name");
if JobJnlLine.FindLast() then;
LineNo := JobJnlLine."Line No.";
repeat
TimeSheetHeader.Get(TempTimeSheetLine."Time Sheet No.");
TimeSheetDetail.SetRange("Time Sheet No.", TempTimeSheetLine."Time Sheet No.");
TimeSheetDetail.SetRange("Time Sheet Line No.", TempTimeSheetLine."Line No.");
if DateFilter <> '' then
TimeSheetDetail.SetFilter(Date, DateFilter);
TimeSheetDetail.SetFilter(Quantity, '<>0');
TimeSheetDetail.SetRange(Posted, false);
if TimeSheetDetail.FindSet() then
repeat
QtyToPost := TimeSheetDetail.GetMaxQtyToPost();
if QtyToPost <> 0 then begin
JobJnlLine.Init();
LineNo := LineNo + 10000;
JobJnlLine."Line No." := LineNo;
JobJnlLine."Time Sheet No." := TimeSheetDetail."Time Sheet No.";
JobJnlLine."Time Sheet Line No." := TimeSheetDetail."Time Sheet Line No.";
JobJnlLine."Time Sheet Date" := TimeSheetDetail.Date;
JobJnlLine.Validate("Job No.", TimeSheetDetail."Job No.");
JobJnlLine."Source Code" := JobJnlTemplate."Source Code";
if TimeSheetDetail."Job Task No." <> '' then
JobJnlLine.Validate("Job Task No.", TimeSheetDetail."Job Task No.");
JobJnlLine.Validate(Type, JobJnlLine.Type::Resource);
JobJnlLine.Validate("No.", TimeSheetHeader."Resource No.");
if TempTimeSheetLine."Work Type Code" <> '' then
JobJnlLine.Validate("Work Type Code", TempTimeSheetLine."Work Type Code");
JobJnlLine.Validate("Posting Date", TimeSheetDetail.Date);
if not JobsSetup."Document No. Is Job No." then begin
JobJnlLine."Document No." := NextDocNo;
NextDocNo := IncStr(NextDocNo);
end;
JobJnlLine."Posting No. Series" := JobJnlBatch."Posting No. Series";
SetJobJournalLineDescription(TempTimeSheetLine.Description, TimeSheetDetail);
JobJnlLine.Validate(Quantity, QtyToPost);
JobJnlLine.Validate(Chargeable, TempTimeSheetLine.Chargeable);
JobJnlLine."Reason Code" := JobJnlBatch."Reason Code";
OnAfterTransferTimeSheetDetailToJobJnlLine(JobJnlLine, JobJnlTemplate, TempTimeSheetLine, TimeSheetDetail, JobJnlBatch, LineNo);
JobJnlLine.Insert();
end;
until TimeSheetDetail.Next() = 0;
OnOnPostReportOnTempTimeSheetLineEndLoop(JobJnlLine, NextDocNo, LineNo);
until TempTimeSheetLine.Next() = 0;
end;
end;
var
JobJnlLine: Record "Job Journal Line";
JobJnlBatch: Record "Job Journal Batch";
JobJnlTemplate: Record "Job Journal Template";
TimeSheetHeader: Record "Time Sheet Header";
TimeSheetLine: Record "Time Sheet Line";
TempTimeSheetLine: Record "Time Sheet Line" temporary;
TimeSheetDetail: Record "Time Sheet Detail";
ResourceNoFilter: Code[1024];
JobNoFilter: Code[1024];
JobTaskNoFilter: Code[1024];
StartingDate: Date;
EndingDate: Date;
DateFilter: Text[30];
procedure SetJobJnlLine(NewJobJnlLine: Record "Job Journal Line")
begin
JobJnlLine := NewJobJnlLine;
end;
procedure InitParameters(NewJobJnlLine: Record "Job Journal Line"; NewResourceNoFilter: Code[1024]; NewJobNoFilter: Code[1024]; NewJobTaskNoFilter: Code[1024]; NewStartingDate: Date; NewEndingDate: Date)
begin
JobJnlLine := NewJobJnlLine;
ResourceNoFilter := NewResourceNoFilter;
JobNoFilter := NewJobNoFilter;
JobTaskNoFilter := NewJobTaskNoFilter;
StartingDate := NewStartingDate;
EndingDate := NewEndingDate;
end;
local procedure FillTimeSheetLineBuffer()
var
SkipLine: Boolean;
begin
if ResourceNoFilter <> '' then
TimeSheetHeader.SetFilter("Resource No.", ResourceNoFilter);
if DateFilter <> '' then begin
TimeSheetHeader.SetFilter("Starting Date", DateFilter);
TimeSheetHeader.SetFilter("Starting Date", '..%1', TimeSheetHeader.GetRangeMax("Starting Date"));
TimeSheetHeader.SetFilter("Ending Date", DateFilter);
TimeSheetHeader.SetFilter("Ending Date", '%1..', TimeSheetHeader.GetRangeMin("Ending Date"));
end;
OnFillTimeSheetLineBufferOnAfterFilterTimeSheetHeader(TimeSheetHeader);
if TimeSheetHeader.FindSet() then
repeat
TimeSheetLine.SetRange("Time Sheet No.", TimeSheetHeader."No.");
TimeSheetLine.SetRange(Type, TimeSheetLine.Type::Job);
TimeSheetLine.SetRange(Status, TimeSheetLine.Status::Approved);
if JobNoFilter <> '' then
TimeSheetLine.SetFilter("Job No.", JobNoFilter);
if JobTaskNoFilter <> '' then
TimeSheetLine.SetFilter("Job Task No.", JobTaskNoFilter);
TimeSheetLine.SetRange(Posted, false);
OnFillTimeSheetLineBufferOnAfterFilterTimeSheetLine(TimeSheetHeader, TimeSheetLine);
if TimeSheetLine.FindSet() then
repeat
TempTimeSheetLine := TimeSheetLine;
OnBeforeInsertTempTimeSheetLine(JobJnlLine, TimeSheetHeader, TempTimeSheetLine, SkipLine);
if not SkipLine then
TempTimeSheetLine.Insert();
until TimeSheetLine.Next() = 0;
until TimeSheetHeader.Next() = 0;
end;
local procedure SetJobJournalLineDescription(TimeSheetDescription: Text[100]; TimeSheetDetail: Record "Time Sheet Detail")
var
ResourcesSetup: Record "Resources Setup";
IsHandled: Boolean;
TimeSheetDescriptionWithDateTok: Label '%1, %2', Locked = true;
begin
OnBeforeSetJobJournalLineDescription(JobJnlLine, TimeSheetDescription, TimeSheetDetail, IsHandled);
if IsHandled then
exit;
ResourcesSetup.ReadIsolation(IsolationLevel::ReadCommitted);
ResourcesSetup.SetLoadFields("Incl. Time Sheet Date in Jnl.");
ResourcesSetup.Get();
if ResourcesSetup."Incl. Time Sheet Date in Jnl." then
JobJnlLine.Description := CopyStr(StrSubstNo(TimeSheetDescriptionWithDateTok, TimeSheetDetail.Date, TimeSheetDescription), 1, MaxStrLen(JobJnlLine.Description))
else
JobJnlLine.Description := CopyStr(TimeSheetDescription, 1, MaxStrLen(JobJnlLine.Description));
end;
[IntegrationEvent(false, false)]
local procedure OnFillTimeSheetLineBufferOnAfterFilterTimeSheetHeader(var TimeSheetHeader: Record "Time Sheet Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnFillTimeSheetLineBufferOnAfterFilterTimeSheetLine(TimeSheetHeader: Record "Time Sheet Header"; var TimeSheetLine: Record "Time Sheet Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertTempTimeSheetLine(JobJournalLine: Record "Job Journal Line"; TimeSheetHeader: Record "Time Sheet Header"; var TempTimeSheetLine: Record "Time Sheet Line" temporary; var SkipLine: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterTransferTimeSheetDetailToJobJnlLine(var JobJournalLine: Record "Job Journal Line"; JobJournalTemplate: Record "Job Journal Template"; var TempTimeSheetLine: Record "Time Sheet Line" temporary; TimeSheetDetail: Record "Time Sheet Detail"; JobJournalBatch: Record "Job Journal Batch"; var LineNo: Integer)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnOnPostReportOnTempTimeSheetLineEndLoop(var JobJournalLine: Record "Job Journal Line"; var NextDocNo: Code[20]; var LineNo: Integer)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeSetJobJournalLineDescription(var JobJournalLine: Record "Job Journal Line"; TimeSheetDescription: Text[100]; TimeSheetDetail: Record "Time Sheet Detail"; var IsHandled: Boolean)
begin
end;
}