Page 161 Purchase Statistics, source in 29
Source29
src/Layers/W1/BaseApp/Purchases/Document/PurchaseStatistics.Page.al428 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.Purchases.Document;
using Microsoft.Finance.Currency;
using Microsoft.Finance.VAT.Calculation;
using Microsoft.Purchases.Posting;
using Microsoft.Purchases.Setup;
using Microsoft.Purchases.Vendor;
page 161 "Purchase Statistics"
{
Caption = 'Purchase Statistics';
DeleteAllowed = false;
InsertAllowed = false;
LinksAllowed = false;
PageType = ListPlus;
SourceTable = "Purchase Header";
layout
{
area(content)
{
group(General)
{
Caption = 'General';
field(Amount; TotalPurchLine."Line Amount")
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
CaptionClass = GetCaptionClass(Text001, false);
Caption = 'Amount';
Editable = false;
ToolTip = 'Specifies the net amount of all the lines in the purchase document.';
}
field(InvDiscountAmount; TotalPurchLine."Inv. Discount Amount")
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
Caption = 'Inv. Discount Amount';
ToolTip = 'Specifies the invoice discount amount for the purchase document.';
trigger OnValidate()
begin
UpdateInvDiscAmount();
end;
}
field(TotalAmount1; TotalAmount1)
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
CaptionClass = GetCaptionClass(Text002, false);
Caption = 'Total';
ToolTip = 'Specifies the total amount less any invoice discount amount and excluding VAT for the purchase document.';
trigger OnValidate()
begin
UpdateTotalAmount();
end;
}
field(VATAmount; VATAmount)
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
CaptionClass = '3,' + Format(VATAmountText);
Caption = 'VAT Amount';
Editable = false;
ToolTip = 'Specifies the total VAT amount that has been calculated for all the lines in the purchase document.';
}
field(TotalAmount2; TotalAmount2)
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Rec."Currency Code";
AutoFormatType = 1;
CaptionClass = GetCaptionClass(Text002, true);
Caption = 'Total Incl. VAT';
Editable = false;
ToolTip = 'Specifies the total amount including VAT that will be posted to the vendor''s account for all the lines in the purchase document. This is the amount that you owe the vendor based on this purchase document. If the document is a credit memo, it is the amount that the vendor owes you.';
}
field("TotalPurchLineLCY.Amount"; TotalPurchLineLCY.Amount)
{
ApplicationArea = Basic, Suite;
AutoFormatType = 1;
Caption = 'Purchase (LCY)';
Editable = false;
ToolTip = 'Specifies your total purchases. It is calculated from amounts excluding VAT on all completed and open purchase invoices and credit memos.';
}
field(Quantity; TotalPurchLine.Quantity)
{
ApplicationArea = Basic, Suite;
Caption = 'Quantity';
DecimalPlaces = 0 : 5;
Editable = false;
ToolTip = 'Specifies the total quantity of G/L account entries, items, and/or resources in the purchase document.';
}
#pragma warning disable AA0100
field("TotalPurchLine.""Units per Parcel"""; TotalPurchLine."Units per Parcel")
#pragma warning restore AA0100
{
ApplicationArea = Basic, Suite;
Caption = 'Parcels';
DecimalPlaces = 0 : 5;
Editable = false;
ToolTip = 'Specifies the total number of parcels in the purchase document.';
}
#pragma warning disable AA0100
field("TotalPurchLine.""Net Weight"""; TotalPurchLine."Net Weight")
#pragma warning restore AA0100
{
ApplicationArea = Basic, Suite;
Caption = 'Net Weight';
DecimalPlaces = 0 : 5;
Editable = false;
ToolTip = 'Specifies the total net weight of the items in the purchase document.';
}
#pragma warning disable AA0100
field("TotalPurchLine.""Gross Weight"""; TotalPurchLine."Gross Weight")
#pragma warning restore AA0100
{
ApplicationArea = Basic, Suite;
Caption = 'Gross Weight';
DecimalPlaces = 0 : 5;
Editable = false;
ToolTip = 'Specifies the total gross weight of the items in the purchase document.';
}
#pragma warning disable AA0100
field("TotalPurchLine.""Unit Volume"""; TotalPurchLine."Unit Volume")
#pragma warning restore AA0100
{
ApplicationArea = Basic, Suite;
Caption = 'Volume';
DecimalPlaces = 0 : 5;
Editable = false;
ToolTip = 'Specifies the total volume of the items in the purchase document.';
}
}
part(SubForm; "VAT Specification Subform")
{
ApplicationArea = Basic, Suite;
}
group(Vendor)
{
Caption = 'Vendor';
#pragma warning disable AA0100
field("Vend.""Balance (LCY)"""; Vend."Balance (LCY)")
#pragma warning restore AA0100
{
ApplicationArea = Basic, Suite;
AutoFormatType = 1;
Caption = 'Balance (LCY)';
Editable = false;
ToolTip = 'Specifies the balance on the vendor''s account.';
}
}
}
}
actions
{
}
trigger OnAfterGetRecord()
begin
CurrPage.Caption(StrSubstNo(Text000, Rec."Document Type"));
if PrevNo = Rec."No." then begin
GetVATSpecification();
exit;
end;
PrevNo := Rec."No.";
Rec.FilterGroup(2);
Rec.SetRange("No.", PrevNo);
Rec.FilterGroup(0);
CalculateTotals();
end;
trigger OnOpenPage()
begin
Rec.PrepareOpeningDocumentStatistics();
PurchSetup.Get();
AllowInvDisc :=
not (PurchSetup."Calc. Inv. Discount" and VendInvDiscRecExists(Rec."Invoice Disc. Code"));
AllowVATDifference :=
PurchSetup."Allow VAT Difference" and
not (Rec."Document Type" in [Rec."Document Type"::Quote, Rec."Document Type"::"Blanket Order"]);
OnOpenPageOnBeforeSetEditable(AllowInvDisc, AllowVATDifference, Rec, PurchSetup);
CurrPage.Editable := AllowVATDifference or AllowInvDisc;
SetVATSpecification();
end;
trigger OnClosePage()
var
PurchCalcDiscountByType: Codeunit "Purch - Calc Disc. By Type";
begin
PurchCalcDiscountByType.ResetRecalculateInvoiceDisc(Rec);
end;
trigger OnQueryClosePage(CloseAction: Action): Boolean
begin
GetVATSpecification();
if TempVATAmountLine.GetAnyLineModified() then
UpdateVATOnPurchLines();
exit(true);
end;
var
#pragma warning disable AA0074
#pragma warning disable AA0470
Text000: Label 'Purchase %1 Statistics';
#pragma warning restore AA0470
Text001: Label 'Amount';
Text002: Label 'Total';
#pragma warning disable AA0470
Text003: Label '%1 must not be 0.';
Text004: Label '%1 must not be greater than %2.';
Text005: Label 'You cannot change the invoice discount because a vendor invoice discount with the code %1 exists.';
#pragma warning restore AA0470
#pragma warning restore AA0074
PurchSetup: Record "Purchases & Payables Setup";
protected var
Vend: Record Vendor;
TempVATAmountLine: Record "VAT Amount Line" temporary;
TotalPurchLine: Record "Purchase Line";
TotalPurchLineLCY: Record "Purchase Line";
PurchPost: Codeunit "Purch.-Post";
VATAmount: Decimal;
TotalAmount1: Decimal;
TotalAmount2: Decimal;
VATAmountText: Text[30];
PrevNo: Code[20];
AllowInvDisc: Boolean;
AllowVATDifference: Boolean;
local procedure UpdateHeaderInfo()
var
CurrExchRate: Record "Currency Exchange Rate";
UseDate: Date;
begin
TotalPurchLine."Inv. Discount Amount" := TempVATAmountLine.GetTotalInvDiscAmount();
TotalAmount1 :=
TotalPurchLine."Line Amount" - TotalPurchLine."Inv. Discount Amount";
VATAmount := TempVATAmountLine.GetTotalVATAmount();
if Rec."Prices Including VAT" then begin
TotalAmount1 := TempVATAmountLine.GetTotalAmountInclVAT();
TotalAmount2 := TotalAmount1 - VATAmount;
TotalPurchLine."Line Amount" := TotalAmount1 + TotalPurchLine."Inv. Discount Amount";
end else
TotalAmount2 := TotalAmount1 + VATAmount;
if Rec."Prices Including VAT" then
TotalPurchLineLCY.Amount := TotalAmount2
else
TotalPurchLineLCY.Amount := TotalAmount1;
if Rec."Currency Code" <> '' then begin
if (Rec."Document Type" in [Rec."Document Type"::"Blanket Order", Rec."Document Type"::Quote]) and
(Rec."Posting Date" = 0D)
then
UseDate := WorkDate()
else
UseDate := Rec."Posting Date";
TotalPurchLineLCY.Amount :=
CurrExchRate.ExchangeAmtFCYToLCY(
UseDate, Rec."Currency Code", TotalPurchLineLCY.Amount, Rec."Currency Factor");
end;
OnAfterUpdateHeaderInfo();
end;
local procedure GetVATSpecification()
begin
CurrPage.SubForm.PAGE.GetTempVATAmountLine(TempVATAmountLine);
if TempVATAmountLine.GetAnyLineModified() then
UpdateHeaderInfo();
end;
local procedure SetVATSpecification()
begin
CurrPage.SubForm.PAGE.SetTempVATAmountLine(TempVATAmountLine);
CurrPage.SubForm.PAGE.InitGlobals(
Rec."Currency Code", AllowVATDifference, AllowVATDifference,
Rec."Prices Including VAT", AllowInvDisc, Rec."VAT Base Discount %");
end;
protected procedure UpdateTotalAmount()
var
SaveTotalAmount: Decimal;
begin
CheckAllowInvDisc();
if Rec."Prices Including VAT" then begin
SaveTotalAmount := TotalAmount1;
UpdateInvDiscAmount();
TotalAmount1 := SaveTotalAmount;
end;
TotalPurchLine."Inv. Discount Amount" := TotalPurchLine."Line Amount" - TotalAmount1;
UpdateInvDiscAmount();
end;
protected procedure UpdateInvDiscAmount()
var
InvDiscBaseAmount: Decimal;
begin
CheckAllowInvDisc();
InvDiscBaseAmount := TempVATAmountLine.GetTotalInvDiscBaseAmount(false, Rec."Currency Code");
if InvDiscBaseAmount = 0 then
Error(Text003, TempVATAmountLine.FieldCaption("Inv. Disc. Base Amount"));
if TotalPurchLine."Inv. Discount Amount" / InvDiscBaseAmount > 1 then
Error(
Text004,
TotalPurchLine.FieldCaption("Inv. Discount Amount"),
TempVATAmountLine.FieldCaption("Inv. Disc. Base Amount"));
TempVATAmountLine.SetInvoiceDiscountAmount(
TotalPurchLine."Inv. Discount Amount", Rec."Currency Code", Rec."Prices Including VAT", Rec."VAT Base Discount %");
CurrPage.SubForm.PAGE.SetTempVATAmountLine(TempVATAmountLine);
UpdateHeaderInfo();
Rec."Invoice Discount Calculation" := Rec."Invoice Discount Calculation"::Amount;
Rec."Invoice Discount Value" := TotalPurchLine."Inv. Discount Amount";
Rec.Modify();
UpdateVATOnPurchLines();
end;
protected procedure GetCaptionClass(FieldCaption: Text[100]; ReverseCaption: Boolean): Text[80]
begin
if Rec."Prices Including VAT" xor ReverseCaption then
exit('2,1,' + FieldCaption);
exit('2,0,' + FieldCaption);
end;
procedure UpdateVATOnPurchLines()
var
PurchLine: Record "Purchase Line";
begin
GetVATSpecification();
if TempVATAmountLine.GetAnyLineModified() then begin
PurchLine.UpdateVATOnLines(0, Rec, PurchLine, TempVATAmountLine);
PurchLine.UpdateVATOnLines(1, Rec, PurchLine, TempVATAmountLine);
end;
PrevNo := '';
end;
local procedure VendInvDiscRecExists(InvDiscCode: Code[20]): Boolean
var
VendInvDisc: Record "Vendor Invoice Disc.";
begin
VendInvDisc.SetRange(Code, InvDiscCode);
exit(VendInvDisc.FindFirst());
end;
local procedure CheckAllowInvDisc()
begin
if not AllowInvDisc then
Error(Text005, Rec."Invoice Disc. Code");
end;
local procedure CalculateTotals()
var
PurchLine: Record "Purchase Line";
TempPurchLine: Record "Purchase Line" temporary;
begin
Clear(PurchLine);
Clear(TotalPurchLine);
Clear(TotalPurchLineLCY);
Clear(PurchPost);
PurchPost.GetPurchLines(Rec, TempPurchLine, 0);
Clear(PurchPost);
PurchPost.SumPurchLinesTemp(
Rec, TempPurchLine, 0, TotalPurchLine, TotalPurchLineLCY, VATAmount, VATAmountText);
OnCalculateTotalsOnAfterPurchPostSumPurchLinesTemp(Rec, TempPurchLine, AllowVATDifference, TotalAmount1, TotalAmount2, VATAmount, TotalPurchLine, TotalPurchLineLCY);
if Rec."Prices Including VAT" then begin
TotalAmount2 := TotalPurchLine.Amount;
TotalAmount1 := TotalAmount2 + VATAmount;
TotalPurchLine."Line Amount" := TotalAmount1 + TotalPurchLine."Inv. Discount Amount";
end else begin
TotalAmount1 := TotalPurchLine.Amount;
TotalAmount2 := TotalPurchLine."Amount Including VAT";
end;
if Vend.Get(Rec."Pay-to Vendor No.") then
Vend.CalcFields("Balance (LCY)")
else
Clear(Vend);
PurchLine.CalcVATAmountLines(0, Rec, TempPurchLine, TempVATAmountLine);
TempVATAmountLine.ModifyAll(Modified, false);
SetVATSpecification();
OnAfterCalculateTotals(Rec, TotalPurchLine, TotalPurchLineLCY, TempVATAmountLine, TotalAmount1, TotalAmount2);
end;
[IntegrationEvent(true, false)]
local procedure OnAfterCalculateTotals(var PurchHeader: Record "Purchase Header"; var TotalPurchLine: Record "Purchase Line"; var TotalPurchLineLCY: Record "Purchase Line"; var TempVATAmountLine: Record "VAT Amount Line" temporary; var TotalAmt1: Decimal; var TotalAmt2: Decimal)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAfterUpdateHeaderInfo()
begin
end;
[IntegrationEvent(true, false)]
local procedure OnCalculateTotalsOnAfterPurchPostSumPurchLinesTemp(var PurchHeader: Record "Purchase Header"; var TempPurchLine: Record "Purchase Line"; var AllowVATDifference: Boolean; var TotalAmount1: Decimal; var TotalAmount2: Decimal; var VATAmount: Decimal; var PurchaseLineTotal: Record "Purchase Line"; var PurchaseLineTotalLCY: Record "Purchase Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnOpenPageOnBeforeSetEditable(var AllowInvDisc: Boolean; var AllowVATDifference: Boolean; PurchaseHeader: Record "Purchase Header"; var PurchSetup: Record "Purchases & Payables Setup")
begin
end;
}