Page 1032 Available - Job Planning Lines, source in 29
Source29
src/Layers/W1/BaseApp/Projects/Project/Planning/AvailableJobPlanningLines.Page.al319 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.Project.Planning;
using Microsoft.Foundation.Enums;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Tracking;
using Microsoft.Projects.Project.Job;
page 1032 "Available - Job Planning Lines"
{
Caption = 'Available - Project Planning Lines';
DataCaptionExpression = CaptionText;
DeleteAllowed = false;
Editable = false;
InsertAllowed = false;
LinksAllowed = false;
ModifyAllowed = false;
PageType = List;
Permissions = TableData "Job Planning Line" = rm;
SourceTable = "Job Planning Line";
SourceTableView = sorting(Status, Type, "No.", "Variant Code", "Location Code", "Planning Date");
layout
{
area(content)
{
repeater(Control1)
{
ShowCaption = false;
field(Status; Rec.Status)
{
ApplicationArea = Jobs;
}
field("Document No."; Rec."Document No.")
{
ApplicationArea = Jobs;
}
field("Location Code"; Rec."Location Code")
{
ApplicationArea = Location;
ToolTip = 'Specifies the location code for the item on the project planning line.';
}
field("Planning Date"; Rec."Planning Date")
{
ApplicationArea = Jobs;
ToolTip = 'Specifies the date of the planning line. You can use the planning date for filtering the totals of the project, for example, if you want to see the budgeted usage for a specific month of the year.';
}
field("Remaining Qty. (Base)"; Rec."Remaining Qty. (Base)")
{
ApplicationArea = Jobs;
ToolTip = 'Specifies the remaining quantity of the resource, item, or general ledger account that remains to complete a project, expressed in base units of measure. The quantity is calculated as the difference between Quantity and Qty. Posted.';
}
field("Reserved Quantity"; Rec."Reserved Quantity")
{
ApplicationArea = Reservation;
Editable = false;
}
field(QtyToReserveBase; QtyToReserveBase)
{
ApplicationArea = Reservation;
AutoFormatType = 0;
Caption = 'Available Quantity';
DecimalPlaces = 0 : 5;
Editable = false;
ToolTip = 'Specifies how many units of the item on the line are available for reservation.';
}
field(ReservedQuantity; GetReservedQtyInLine())
{
ApplicationArea = Reservation;
AutoFormatType = 0;
Caption = 'Current Reserved Quantity';
DecimalPlaces = 0 : 5;
ToolTip = 'Specifies the quantity of the item on the document that is currently reserved.';
trigger OnDrillDown()
begin
ReservEntry2.Reset();
Rec.SetReservationFilters(ReservEntry2);
ReservEntry2.SetRange("Reservation Status", ReservEntry2."Reservation Status"::Reservation);
ReservMgt.MarkReservConnection(ReservEntry2, ReservEntry);
PAGE.RunModal(PAGE::"Reservation Entries", ReservEntry2);
UpdateReservFrom();
CurrPage.Update();
end;
}
field("Work Type Code"; Rec."Work Type Code")
{
ApplicationArea = Jobs;
Visible = false;
}
}
}
}
actions
{
area(processing)
{
group("F&unctions")
{
Caption = 'F&unctions';
Image = "Action";
action(Reserve)
{
ApplicationArea = Reservation;
Caption = '&Reserve';
Image = Reserve;
ToolTip = 'Reserve one or more units of the item on the project planning line, either from inventory or from incoming supply.';
trigger OnAction()
begin
ReservEntry.LockTable();
UpdateReservMgt();
Rec.GetReservationQty(QtyReserved, QtyReservedBase, QtyToReserve, QtyToReserveBase);
ReservMgt.CalculateRemainingQty(NewQtyReserved, NewQtyReservedBase);
ReservMgt.CopySign(NewQtyReserved, QtyToReserve);
ReservMgt.CopySign(NewQtyReservedBase, QtyToReserveBase);
if NewQtyReservedBase <> 0 then
if Abs(NewQtyReservedBase) > Abs(QtyToReserveBase) then
CreateReservation(QtyToReserve, QtyToReserveBase)
else
CreateReservation(NewQtyReserved, NewQtyReservedBase)
else
Error(Text000);
end;
}
action(CancelReservation)
{
AccessByPermission = TableData Item = R;
ApplicationArea = Reservation;
Caption = '&Cancel Reservation';
Image = Cancel;
ToolTip = 'Cancel the reservation that exists for the document line that you opened this window for.';
trigger OnAction()
begin
if not Confirm(Text001, false) then
exit;
ReservEntry2.Copy(ReservEntry);
Rec.SetReservationFilters(ReservEntry2);
if ReservEntry2.Find('-') then begin
UpdateReservMgt();
repeat
ReservEngineMgt.CancelReservation(ReservEntry2);
until ReservEntry2.Next() = 0;
UpdateReservFrom();
end;
end;
}
action(ShowDocument)
{
ApplicationArea = Jobs;
Caption = '&Show Document';
Image = View;
ShortCutKey = 'Shift+F7';
ToolTip = 'Open the document that the information on the line comes from.';
trigger OnAction()
var
Job: Record Job;
begin
Job.Get(Rec."Job No.");
PAGE.Run(PAGE::"Job Card", Job);
end;
}
}
}
}
trigger OnAfterGetRecord()
begin
Rec.GetReservationQty(QtyReserved, QtyReservedBase, QtyToReserve, QtyToReserveBase);
end;
trigger OnOpenPage()
begin
ReservEntry.TestField("Source Type");
SetFilters();
end;
var
ReservEntry2: Record "Reservation Entry";
ReservMgt: Codeunit "Reservation Management";
ReservEngineMgt: Codeunit "Reservation Engine Mgt.";
NewQtyReserved: Decimal;
NewQtyReservedBase: Decimal;
CaptionText: Text;
CurrentSubType: Option;
#pragma warning disable AA0074
Text000: Label 'Fully reserved.';
Text001: Label 'Do you want to cancel the reservation?';
#pragma warning disable AA0470
Text003: Label 'Available Quantity is %1.';
#pragma warning restore AA0470
#pragma warning restore AA0074
protected var
ReservEntry: Record "Reservation Entry";
SourceRecRef: RecordRef;
QtyToReserve: Decimal;
QtyToReserveBase: Decimal;
QtyReserved: Decimal;
QtyReservedBase: Decimal;
procedure SetSource(CurrentSourceRecRef: RecordRef; CurrentReservEntry: Record "Reservation Entry")
var
TransferDirection: Enum "Transfer Direction";
begin
SetSource(CurrentSourceRecRef, CurrentReservEntry, TransferDirection::Outbound);
end;
procedure SetSource(CurrentSourceRecRef: RecordRef; CurrentReservEntry: Record "Reservation Entry"; Direction: Enum "Transfer Direction")
begin
Clear(ReservMgt);
SourceRecRef := CurrentSourceRecRef;
ReservEntry := CurrentReservEntry;
ReservMgt.TestItemType(SourceRecRef);
ReservMgt.SetReservSource(SourceRecRef, Direction);
CaptionText := ReservMgt.FilterReservFor(SourceRecRef, ReservEntry, Direction);
end;
local procedure CreateReservation(ReserveQuantity: Decimal; ReserveQuantityBase: Decimal)
var
TrackingSpecification: Record "Tracking Specification";
begin
Rec.CalcFields("Reserved Qty. (Base)");
if Abs(Rec."Remaining Qty. (Base)") + Rec."Reserved Qty. (Base)" < ReserveQuantityBase then
Error(Text003, Abs(Rec."Remaining Qty. (Base)") + Rec."Reserved Quantity");
Rec.TestField("No.", ReservEntry."Item No.");
Rec.TestField("Variant Code", ReservEntry."Variant Code");
Rec.TestField("Location Code", ReservEntry."Location Code");
TrackingSpecification.InitTrackingSpecification(
DATABASE::"Job Planning Line", Rec.Status.AsInteger(), Rec."Job No.", '', 0, Rec."Job Contract Entry No.",
Rec."Variant Code", Rec."Location Code", Rec."Qty. per Unit of Measure");
ReservMgt.CreateReservation(
ReservEntry.Description, Rec."Planning Date", ReserveQuantity, ReserveQuantityBase, TrackingSpecification);
UpdateReservFrom();
end;
local procedure UpdateReservFrom()
begin
SetSource(SourceRecRef, ReservEntry, ReservEntry.GetTransferDirection());
OnAfterUpdateReservFrom(ReservEntry);
end;
local procedure UpdateReservMgt()
begin
Clear(ReservMgt);
ReservMgt.SetReservSource(SourceRecRef, ReservEntry.GetTransferDirection());
OnAfterUpdateReservMgt(ReservEntry);
end;
protected procedure GetReservedQtyInLine(): Decimal
begin
ReservEntry2.Reset();
Rec.SetReservationFilters(ReservEntry2);
ReservEntry2.SetRange("Reservation Status", ReservEntry2."Reservation Status"::Reservation);
exit(ReservMgt.MarkReservConnection(ReservEntry2, ReservEntry));
end;
procedure SetCurrentSubType(SubType: Option)
begin
CurrentSubType := SubType;
end;
local procedure SetFilters()
begin
Rec.SetRange(Status, CurrentSubType);
Rec.SetRange(Type, Rec.Type::Item);
Rec.SetRange("No.", ReservEntry."Item No.");
Rec.SetRange("Variant Code", ReservEntry."Variant Code");
Rec.SetRange("Location Code", ReservEntry."Location Code");
Rec.SetFilter("Planning Date", ReservMgt.GetAvailabilityFilter(ReservEntry."Shipment Date"));
case CurrentSubType of
0, 1, 2, 4:
if ReservMgt.IsPositive() then
Rec.SetFilter("Quantity (Base)", '<0')
else
Rec.SetFilter("Quantity (Base)", '>0');
3, 5:
if not ReservMgt.IsPositive() then
Rec.SetFilter("Quantity (Base)", '<0')
else
Rec.SetFilter("Quantity (Base)", '>0');
end;
OnAfterSetFilters(Rec, ReservEntry);
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSetFilters(var JobPlanningLine: Record "Job Planning Line"; ReservationEntry: Record "Reservation Entry")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAfterUpdateReservFrom(var ReservationEntry: Record "Reservation Entry")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAfterUpdateReservMgt(var ReservationEntry: Record "Reservation Entry")
begin
end;
}