Page 96 Sales Cr. Memo Subform, source in 29
Source29
src/Layers/W1/BaseApp/Sales/Document/SalesCrMemoSubform.Page.al1545 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.Sales.Document;
using Microsoft.Finance.AllocationAccount;
using Microsoft.Finance.AllocationAccount.Sales;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Dimension;
using Microsoft.Foundation.Attachment;
using Microsoft.Foundation.ExtendedText;
using Microsoft.Inventory.Availability;
using Microsoft.Inventory.BOM;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Item.Catalog;
using Microsoft.Inventory.Location;
using Microsoft.Sales.History;
using Microsoft.Sales.Setup;
using Microsoft.Utilities;
using System.Environment.Configuration;
using System.Integration.Excel;
/// <summary>
/// Displays the line items subform for a sales credit memo document.
/// </summary>
page 96 "Sales Cr. Memo Subform"
{
AutoSplitKey = true;
Caption = 'Lines';
DelayedInsert = true;
LinksAllowed = false;
MultipleNewLines = true;
PageType = ListPart;
SourceTable = "Sales Line";
SourceTableView = where("Document Type" = filter("Credit Memo"));
layout
{
area(content)
{
repeater(Control1)
{
ShowCaption = false;
field(Type; Rec.Type)
{
ApplicationArea = Advanced;
ToolTip = 'Specifies the type of entity that will be posted for this sales line, such as Item, Resource, or G/L Account.';
Visible = not TypeAsTextFieldVisible;
trigger OnValidate()
begin
NoOnAfterValidate();
UpdateEditableOnRow();
UpdateTypeText();
DeltaUpdateTotals();
end;
}
field(FilteredTypeField; TypeAsText)
{
ApplicationArea = Basic, Suite;
Caption = 'Type';
Editable = CurrPageIsEditable;
LookupPageID = "Option Lookup List";
TableRelation = "Option Lookup Buffer"."Option Caption" where("Lookup Type" = const(Sales));
ToolTip = 'Specifies the type of transaction that will be posted with the document line. If you select Comment, then you can enter any text in the Description field, such as a message to a customer. ';
Visible = TypeAsTextFieldVisible;
trigger OnValidate()
begin
TempOptionLookupBuffer.SetCurrentType(Rec.Type.AsInteger());
if TempOptionLookupBuffer.AutoCompleteLookup(TypeAsText, Enum::"Option Lookup Type"::Sales) then
Rec.Validate(Type, TempOptionLookupBuffer.ID);
TempOptionLookupBuffer.ValidateOption(TypeAsText);
UpdateEditableOnRow();
UpdateTypeText();
DeltaUpdateTotals();
end;
}
field("No."; Rec."No.")
{
ApplicationArea = Basic, Suite;
ShowMandatory = not IsCommentLine;
ToolTip = 'Specifies the number of a general ledger account, item, resource, additional cost, or fixed asset, depending on the contents of the Type field.';
trigger OnValidate()
var
Item: Record "Item";
begin
NoOnAfterValidate();
UpdateEditableOnRow();
Rec.ShowShortcutDimCode(ShortcutDimCode);
UpdateTypeText();
DeltaUpdateTotals();
if Rec."Variant Code" = '' then
VariantCodeMandatory := Item.IsVariantMandatory(Rec.Type = Rec.Type::Item, Rec."No.");
CurrPage.Update();
end;
}
field("Item Reference No."; Rec."Item Reference No.")
{
AccessByPermission = tabledata "Item Reference" = R;
ApplicationArea = Suite, ItemReferences;
QuickEntry = false;
Visible = ItemReferenceVisible;
trigger OnLookup(var Text: Text): Boolean
var
ItemReferenceMgt: Codeunit "Item Reference Management";
begin
ItemReferenceMgt.SalesReferenceNoLookUp(Rec);
InsertExtendedText(false);
NoOnAfterValidate();
UpdateEditableOnRow();
DeltaUpdateTotals();
OnItemReferenceNoOnLookup(Rec);
CurrPage.Update();
end;
trigger OnValidate()
begin
InsertExtendedText(false);
NoOnAfterValidate();
UpdateEditableOnRow();
DeltaUpdateTotals();
CurrPage.Update();
end;
}
field("IC Partner Code"; Rec."IC Partner Code")
{
ApplicationArea = Intercompany;
Visible = false;
}
field("IC Partner Ref. Type"; Rec."IC Partner Ref. Type")
{
ApplicationArea = Intercompany;
Visible = false;
}
field("IC Partner Reference"; Rec."IC Partner Reference")
{
ApplicationArea = Intercompany;
Visible = false;
}
field("Variant Code"; Rec."Variant Code")
{
ApplicationArea = Planning;
Visible = false;
ShowMandatory = VariantCodeMandatory;
trigger OnValidate()
var
Item: Record "Item";
begin
DeltaUpdateTotals();
if Rec."Variant Code" = '' then
VariantCodeMandatory := Item.IsVariantMandatory(Rec.Type = Rec.Type::Item, Rec."No.");
end;
}
field(Nonstock; Rec.Nonstock)
{
ApplicationArea = Basic, Suite;
Visible = false;
}
field("Gen. Bus. Posting Group"; Rec."Gen. Bus. Posting Group")
{
ApplicationArea = Basic, Suite;
Visible = false;
trigger OnValidate()
begin
DeltaUpdateTotals();
end;
}
field("Gen. Prod. Posting Group"; Rec."Gen. Prod. Posting Group")
{
ApplicationArea = Basic, Suite;
Visible = false;
trigger OnValidate()
begin
DeltaUpdateTotals();
end;
}
field("VAT Bus. Posting Group"; Rec."VAT Bus. Posting Group")
{
ApplicationArea = Basic, Suite;
Visible = false;
trigger OnValidate()
begin
ForceTotalsCalculation();
DeltaUpdateTotals();
end;
}
field("VAT Prod. Posting Group"; Rec."VAT Prod. Posting Group")
{
ApplicationArea = Basic, Suite;
Visible = false;
trigger OnValidate()
begin
ForceTotalsCalculation();
DeltaUpdateTotals();
end;
}
field(Description; Rec.Description)
{
ApplicationArea = Basic, Suite;
ShowMandatory = not IsCommentLine;
ToolTip = 'Specifies a description of the entry, which is based on the contents of the Type and No. fields.';
trigger OnValidate()
begin
UpdateEditableOnRow();
Rec.RestoreLookupSelection();
if Rec."No." <> xRec."No." then
NoOnAfterValidate();
if Rec."No." = xRec."No." then
exit;
Rec.ShowShortcutDimCode(ShortcutDimCode);
UpdateTypeText();
DeltaUpdateTotals();
end;
trigger OnAfterLookup(Selected: RecordRef)
begin
Rec.SaveLookupSelection(Selected);
end;
}
field("Description 2"; Rec."Description 2")
{
ApplicationArea = Basic, Suite;
Importance = Additional;
Visible = false;
}
field("Return Reason Code"; Rec."Return Reason Code")
{
ApplicationArea = Suite;
Visible = false;
}
field("Location Code"; Rec."Location Code")
{
ApplicationArea = Location;
Editable = not IsBlankNumber;
Enabled = not IsBlankNumber;
trigger OnValidate()
begin
DeltaUpdateTotals();
end;
}
field("Bin Code"; Rec."Bin Code")
{
ApplicationArea = Warehouse;
Visible = false;
}
field(Reserve; Rec.Reserve)
{
ApplicationArea = Reservation;
Visible = false;
trigger OnValidate()
begin
ReserveOnAfterValidate();
end;
}
field(Quantity; Rec.Quantity)
{
ApplicationArea = Basic, Suite;
BlankZero = true;
Editable = not IsBlankNumber;
Enabled = not IsBlankNumber;
ShowMandatory = (Rec.Type <> Rec.Type::" ") and (Rec."No." <> '');
trigger OnValidate()
begin
QuantityOnAfterValidate();
if SalesSetup."Calc. Inv. Discount" and (Rec.Quantity = 0) then
CurrPage.Update(false);
end;
}
field("Reserved Quantity"; Rec."Reserved Quantity")
{
ApplicationArea = Reservation;
BlankZero = true;
Visible = false;
trigger OnDrillDown()
begin
CurrPage.SaveRecord();
Commit();
Rec.ShowReservationEntries(true);
UpdateForm(true);
end;
}
field("Unit of Measure Code"; Rec."Unit of Measure Code")
{
ApplicationArea = Basic, Suite;
Editable = UnitofMeasureCodeIsChangeable;
Enabled = UnitofMeasureCodeIsChangeable;
trigger OnValidate()
begin
UnitofMeasureCodeOnAfterValidate();
end;
}
field("Unit of Measure"; Rec."Unit of Measure")
{
ApplicationArea = Suite;
Visible = false;
}
field("Unit Cost (LCY)"; Rec."Unit Cost (LCY)")
{
ApplicationArea = Basic, Suite;
ToolTip = 'Specifies the unit cost of the item on the line.';
Visible = false;
}
field("Unit Price"; Rec."Unit Price")
{
ApplicationArea = Basic, Suite;
BlankZero = true;
Editable = not IsBlankNumber;
Enabled = not IsBlankNumber;
ShowMandatory = (Rec.Type <> Rec.Type::" ") and (Rec."No." <> '');
trigger OnValidate()
begin
DeltaUpdateTotals();
end;
}
field("Tax Liable"; Rec."Tax Liable")
{
ApplicationArea = SalesTax;
Editable = false;
Visible = false;
}
field("Tax Area Code"; Rec."Tax Area Code")
{
ApplicationArea = SalesTax;
Visible = false;
trigger OnValidate()
begin
RedistributeTotalsOnAfterValidate();
end;
}
field("Tax Group Code"; Rec."Tax Group Code")
{
ApplicationArea = SalesTax;
Editable = not IsCommentLine;
Enabled = not IsCommentLine;
ShowMandatory = Rec."Tax Area Code" <> '';
trigger OnValidate()
begin
RedistributeTotalsOnAfterValidate();
end;
}
field("Line Amount"; Rec."Line Amount")
{
ApplicationArea = Basic, Suite;
BlankZero = true;
Editable = not IsBlankNumber;
Enabled = not IsBlankNumber;
ShowMandatory = (Rec.Type <> Rec.Type::" ") and (Rec."No." <> '');
trigger OnValidate()
begin
DeltaUpdateTotals();
end;
}
field("Line Discount %"; Rec."Line Discount %")
{
ApplicationArea = Basic, Suite;
BlankZero = true;
Editable = not IsBlankNumber;
Enabled = not IsBlankNumber;
trigger OnValidate()
begin
DeltaUpdateTotals();
end;
}
field("Line Discount Amount"; Rec."Line Discount Amount")
{
ApplicationArea = Basic, Suite;
Visible = false;
trigger OnValidate()
begin
DeltaUpdateTotals();
end;
}
field("Allow Invoice Disc."; Rec."Allow Invoice Disc.")
{
ApplicationArea = Basic, Suite;
Visible = false;
trigger OnValidate()
begin
CurrPage.SaveRecord();
AmountWithDiscountAllowed := DocumentTotals.CalcTotalSalesAmountOnlyDiscountAllowed(Rec);
InvoiceDiscountAmount := Round(AmountWithDiscountAllowed * InvoiceDiscountPct / 100, Currency."Amount Rounding Precision");
ValidateInvoiceDiscountAmount();
end;
}
field("Inv. Discount Amount"; Rec."Inv. Discount Amount")
{
ApplicationArea = Basic, Suite;
Visible = false;
trigger OnValidate()
begin
DeltaUpdateTotals();
end;
}
field("Allow Item Charge Assignment"; Rec."Allow Item Charge Assignment")
{
ApplicationArea = ItemCharges;
Visible = false;
}
field("Qty. to Assign"; Rec."Qty. to Assign")
{
ApplicationArea = ItemCharges;
StyleExpr = ItemChargeStyleExpression;
trigger OnDrillDown()
begin
CurrPage.SaveRecord();
Rec.ShowItemChargeAssgnt();
UpdateForm(false);
end;
}
field("Qty. Assigned"; Rec."Qty. Assigned")
{
ApplicationArea = ItemCharges;
BlankZero = true;
trigger OnDrillDown()
begin
CurrPage.SaveRecord();
Rec.ShowItemChargeAssgnt();
UpdateForm(false);
end;
}
field("Allocation Account No."; Rec."Selected Alloc. Account No.")
{
ApplicationArea = All;
Caption = 'Allocation Account No.';
Visible = UseAllocationAccountNumber;
trigger OnValidate()
var
SalesAllocAccMgt: Codeunit "Sales Alloc. Acc. Mgt.";
begin
SalesAllocAccMgt.VerifySelectedAllocationAccountNo(Rec);
end;
}
field("Job No."; Rec."Job No.")
{
ApplicationArea = Jobs;
Visible = false;
trigger OnValidate()
begin
Rec.ShowShortcutDimCode(ShortcutDimCode);
end;
}
field("Job Task No."; Rec."Job Task No.")
{
ApplicationArea = Jobs;
Visible = false;
}
field("Tax Category"; Rec."Tax Category")
{
ApplicationArea = Basic, Suite;
Visible = false;
}
field("Work Type Code"; Rec."Work Type Code")
{
ApplicationArea = Jobs;
Visible = false;
}
field("Blanket Order No."; Rec."Blanket Order No.")
{
ApplicationArea = Suite;
Visible = false;
}
field("Blanket Order Line No."; Rec."Blanket Order Line No.")
{
ApplicationArea = Suite;
Visible = false;
}
field("Appl.-from Item Entry"; Rec."Appl.-from Item Entry")
{
ApplicationArea = Basic, Suite;
Visible = false;
}
field("Appl.-to Item Entry"; Rec."Appl.-to Item Entry")
{
ApplicationArea = Basic, Suite;
Visible = false;
}
field("Deferral Code"; Rec."Deferral Code")
{
ApplicationArea = Suite;
Visible = false;
trigger OnAssistEdit()
begin
CurrPage.SaveRecord();
Commit();
Rec.ShowDeferralSchedule();
end;
}
field("Shortcut Dimension 1 Code"; Rec."Shortcut Dimension 1 Code")
{
ApplicationArea = Dimensions;
Visible = DimVisible1;
}
field("Shortcut Dimension 2 Code"; Rec."Shortcut Dimension 2 Code")
{
ApplicationArea = Dimensions;
Visible = DimVisible2;
}
field(ShortcutDimCode3; ShortcutDimCode[3])
{
ApplicationArea = Dimensions;
CaptionClass = '1,2,3';
TableRelation = "Dimension Value".Code where("Global Dimension No." = const(3),
"Dimension Value Type" = const(Standard),
Blocked = const(false));
Visible = DimVisible3;
trigger OnValidate()
begin
Rec.ValidateShortcutDimCode(3, ShortcutDimCode[3]);
OnAfterValidateShortcutDimCode(Rec, ShortcutDimCode, 3);
end;
}
field(ShortcutDimCode4; ShortcutDimCode[4])
{
ApplicationArea = Dimensions;
CaptionClass = '1,2,4';
TableRelation = "Dimension Value".Code where("Global Dimension No." = const(4),
"Dimension Value Type" = const(Standard),
Blocked = const(false));
Visible = DimVisible4;
trigger OnValidate()
begin
Rec.ValidateShortcutDimCode(4, ShortcutDimCode[4]);
OnAfterValidateShortcutDimCode(Rec, ShortcutDimCode, 4);
end;
}
field(ShortcutDimCode5; ShortcutDimCode[5])
{
ApplicationArea = Dimensions;
CaptionClass = '1,2,5';
TableRelation = "Dimension Value".Code where("Global Dimension No." = const(5),
"Dimension Value Type" = const(Standard),
Blocked = const(false));
Visible = DimVisible5;
trigger OnValidate()
begin
Rec.ValidateShortcutDimCode(5, ShortcutDimCode[5]);
OnAfterValidateShortcutDimCode(Rec, ShortcutDimCode, 5);
end;
}
field(ShortcutDimCode6; ShortcutDimCode[6])
{
ApplicationArea = Dimensions;
CaptionClass = '1,2,6';
TableRelation = "Dimension Value".Code where("Global Dimension No." = const(6),
"Dimension Value Type" = const(Standard),
Blocked = const(false));
Visible = DimVisible6;
trigger OnValidate()
begin
Rec.ValidateShortcutDimCode(6, ShortcutDimCode[6]);
OnAfterValidateShortcutDimCode(Rec, ShortcutDimCode, 6);
end;
}
field(ShortcutDimCode7; ShortcutDimCode[7])
{
ApplicationArea = Dimensions;
CaptionClass = '1,2,7';
TableRelation = "Dimension Value".Code where("Global Dimension No." = const(7),
"Dimension Value Type" = const(Standard),
Blocked = const(false));
Visible = DimVisible7;
trigger OnValidate()
begin
Rec.ValidateShortcutDimCode(7, ShortcutDimCode[7]);
OnAfterValidateShortcutDimCode(Rec, ShortcutDimCode, 7);
end;
}
field(ShortcutDimCode8; ShortcutDimCode[8])
{
ApplicationArea = Dimensions;
CaptionClass = '1,2,8';
TableRelation = "Dimension Value".Code where("Global Dimension No." = const(8),
"Dimension Value Type" = const(Standard),
Blocked = const(false));
Visible = DimVisible8;
trigger OnValidate()
begin
Rec.ValidateShortcutDimCode(8, ShortcutDimCode[8]);
OnAfterValidateShortcutDimCode(Rec, ShortcutDimCode, 8);
end;
}
field("Gross Weight"; Rec."Gross Weight")
{
Caption = 'Unit Gross Weight';
ApplicationArea = Basic, Suite;
Visible = false;
}
field("Net Weight"; Rec."Net Weight")
{
Caption = 'Unit Net Weight';
ApplicationArea = Basic, Suite;
Visible = false;
}
field("Unit Volume"; Rec."Unit Volume")
{
ApplicationArea = Basic, Suite;
Visible = false;
}
field("Units per Parcel"; Rec."Units per Parcel")
{
ApplicationArea = Basic, Suite;
Visible = false;
}
}
group(Control39)
{
ShowCaption = false;
group(Control35)
{
ShowCaption = false;
#pragma warning disable AA0100
field("TotalSalesLine.""Line Amount"""; TotalSalesLine."Line Amount")
#pragma warning restore AA0100
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Currency.Code;
AutoFormatType = 1;
CaptionClass = DocumentTotals.GetTotalLineAmountWithVATAndCurrencyCaption(Currency.Code, TotalSalesHeader."Prices Including VAT");
Caption = 'Subtotal Excl. VAT';
Editable = false;
ToolTip = 'Specifies the sum of the value in the Line Amount Excl. VAT field on all lines in the document.';
}
field("Invoice Discount Amount"; InvoiceDiscountAmount)
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Currency.Code;
AutoFormatType = 1;
CaptionClass = DocumentTotals.GetInvoiceDiscAmountWithVATAndCurrencyCaption(Rec.FieldCaption("Inv. Discount Amount"), Currency.Code);
Caption = 'Invoice Discount Amount';
Editable = InvDiscAmountEditable;
ToolTip = 'Specifies a discount amount that is deducted from the value of the Total Incl. VAT field, based on sales lines where the Allow Invoice Disc. field is selected. You can enter or change the amount manually.';
trigger OnValidate()
begin
DocumentTotals.SalesDocTotalsNotUpToDate();
ValidateInvoiceDiscountAmount();
end;
}
field("Invoice Disc. Pct."; InvoiceDiscountPct)
{
AutoFormatType = 0;
ApplicationArea = Basic, Suite;
Caption = 'Invoice Discount %';
DecimalPlaces = 0 : 3;
Editable = InvDiscAmountEditable;
ToolTip = 'Specifies a discount percentage that is applied to the invoice, based on sales lines where the Allow Invoice Disc. field is selected. The percentage and criteria are defined in the Customer Invoice Discounts page, but you can enter or change the percentage manually.';
trigger OnValidate()
begin
DocumentTotals.SalesDocTotalsNotUpToDate();
AmountWithDiscountAllowed := DocumentTotals.CalcTotalSalesAmountOnlyDiscountAllowed(Rec);
InvoiceDiscountAmount := Round(AmountWithDiscountAllowed * InvoiceDiscountPct / 100, Currency."Amount Rounding Precision");
ValidateInvoiceDiscountAmount();
end;
}
}
group(Control17)
{
ShowCaption = false;
field("Total Amount Excl. VAT"; TotalSalesLine.Amount)
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Currency.Code;
AutoFormatType = 1;
CaptionClass = DocumentTotals.GetTotalExclVATCaption(Currency.Code);
Caption = 'Total Amount Excl. VAT';
DrillDown = false;
Editable = false;
ToolTip = 'Specifies the sum of the value in the Line Amount Excl. VAT field on all lines in the document minus any discount amount in the Invoice Discount Amount field.';
}
field("Total VAT Amount"; VATAmount)
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Currency.Code;
AutoFormatType = 1;
CaptionClass = DocumentTotals.GetTotalVATCaption(Currency.Code);
Caption = 'Total VAT';
Editable = false;
ToolTip = 'Specifies the sum of VAT amounts on all lines in the document.';
}
field("Total Amount Incl. VAT"; TotalSalesLine."Amount Including VAT")
{
ApplicationArea = Basic, Suite;
AutoFormatExpression = Currency.Code;
AutoFormatType = 1;
CaptionClass = DocumentTotals.GetTotalInclVATCaption(Currency.Code);
Caption = 'Total Amount Incl. VAT';
Editable = false;
ToolTip = 'Specifies the sum of the value in the Line Amount Incl. VAT field on all lines in the document minus any discount amount in the Invoice Discount Amount field.';
}
}
}
}
}
actions
{
area(processing)
{
action(InsertExtTexts)
{
AccessByPermission = TableData "Extended Text Header" = R;
ApplicationArea = Suite;
Caption = 'Insert &Ext. Texts';
Image = Text;
ToolTip = 'Insert the extended item description that is set up for the item that is being processed on the line.';
trigger OnAction()
begin
InsertExtendedText(true);
end;
}
action(Dimensions)
{
AccessByPermission = TableData Dimension = R;
ApplicationArea = Dimensions;
Caption = 'Dimensions';
Image = Dimensions;
ShortCutKey = 'Alt+D';
ToolTip = 'View or edit dimensions, such as area, project, or department, that you can assign to sales and purchase documents to distribute costs and analyze transaction history.';
trigger OnAction()
begin
Rec.ShowDimensions();
end;
}
action(DeferralSchedule)
{
ApplicationArea = Suite;
Caption = 'Deferral Schedule';
Enabled = Rec."Deferral Code" <> '';
Image = PaymentPeriod;
ToolTip = 'View or edit the deferral schedule that governs how revenue made with this sales document is deferred to different accounting periods when the document is posted.';
trigger OnAction()
begin
Rec.ShowDeferralSchedule();
end;
}
action(RedistributeAccAllocations)
{
ApplicationArea = All;
Caption = 'Redistribute Account Allocations';
Image = EditList;
#pragma warning disable AA0219
ToolTip = 'Use this action to redistribute the account allocations for this line.';
#pragma warning restore AA0219
trigger OnAction()
var
AllocAccManualOverride: Page "Redistribute Acc. Allocations";
begin
if ((Rec."Type" <> Rec."Type"::"Allocation Account") and (Rec."Selected Alloc. Account No." = '')) then
Error(ActionOnlyAllowedForAllocationAccountsErr);
AllocAccManualOverride.SetParentSystemId(Rec.SystemId);
AllocAccManualOverride.SetParentTableId(Database::"Sales Line");
AllocAccManualOverride.RunModal();
end;
}
action(ReplaceAllocationAccountWithLines)
{
ApplicationArea = All;
Caption = 'Generate lines from Allocation Account Line';
Image = CreateLinesFromJob;
#pragma warning disable AA0219
ToolTip = 'Use this action to replace the Allocation Account line with the actual lines that would be generated from the line itself.';
#pragma warning restore AA0219
trigger OnAction()
var
SalesAllocAccMgt: Codeunit "Sales Alloc. Acc. Mgt.";
begin
if ((Rec."Type" <> Rec."Type"::"Allocation Account") and (Rec."Selected Alloc. Account No." = '')) then
Error(ActionOnlyAllowedForAllocationAccountsErr);
SalesAllocAccMgt.CreateLinesFromAllocationAccountLine(Rec);
Rec.Delete();
CurrPage.Update(false);
end;
}
group("F&unctions")
{
Caption = 'F&unctions';
Image = "Action";
action("E&xplode BOM")
{
AccessByPermission = TableData "BOM Component" = R;
ApplicationArea = Suite;
Caption = 'E&xplode BOM';
Image = ExplodeBOM;
Enabled = Rec.Type = Rec.Type::Item;
ToolTip = 'Add a line for each component on the bill of materials for the selected item. For example, this is useful for selling the parent item as a kit. CAUTION: The line for the parent item will be deleted and only its description will display. To undo this action, delete the component lines and add a line for the parent item again. This action is available only for lines that contain an item.';
trigger OnAction()
begin
ExplodeBOM();
end;
}
action("Get Return &Receipt Lines")
{
AccessByPermission = TableData "Return Receipt Header" = R;
ApplicationArea = SalesReturnOrder;
Caption = 'Get Return &Receipt Lines';
Ellipsis = true;
Image = ReturnReceipt;
ToolTip = 'Select a posted return receipt for the item that you want to assign the item charge to, for example, if you received an invoice for the item charge after you posted the original return receipt.';
trigger OnAction()
begin
GetReturnReceipt();
RedistributeTotalsOnAfterValidate();
end;
}
}
group("&Line")
{
Caption = '&Line';
Image = Line;
group("Item Availability by")
{
Enabled = Rec.Type = Rec.Type::Item;
Caption = 'Item Availability by';
Image = ItemAvailability;
action("Event")
{
ApplicationArea = Basic, Suite;
Caption = 'Event';
Image = "Event";
ToolTip = 'View how the actual and the projected available balance of an item will develop over time according to supply and demand events.';
trigger OnAction()
begin
SalesAvailabilityMgt.ShowItemAvailabilityFromSalesLine(Rec, "Item Availability Type"::"Event");
end;
}
action(Period)
{
ApplicationArea = Basic, Suite;
Caption = 'Period';
Image = Period;
ToolTip = 'Show the projected quantity of the item over time according to time periods, such as day, week, or month.';
trigger OnAction()
begin
SalesAvailabilityMgt.ShowItemAvailabilityFromSalesLine(Rec, "Item Availability Type"::Period);
end;
}
action(Variant)
{
ApplicationArea = Planning;
Caption = 'Variant';
Image = ItemVariant;
ToolTip = 'View or edit the item''s variants. Instead of setting up each color of an item as a separate item, you can set up the various colors as variants of the item.';
trigger OnAction()
begin
SalesAvailabilityMgt.ShowItemAvailabilityFromSalesLine(Rec, "Item Availability Type"::Variant);
end;
}
action(Location)
{
AccessByPermission = TableData Location = R;
ApplicationArea = Location;
Caption = 'Location';
Image = Warehouse;
ToolTip = 'View the actual and projected quantity of the item per location.';
trigger OnAction()
begin
SalesAvailabilityMgt.ShowItemAvailabilityFromSalesLine(Rec, "Item Availability Type"::Location);
end;
}
action(Lot)
{
ApplicationArea = ItemTracking;
Caption = 'Lot';
Image = LotInfo;
RunObject = Page "Item Availability by Lot No.";
RunPageLink = "No." = field("No."),
"Location Filter" = field("Location Code"),
"Variant Filter" = field("Variant Code");
ToolTip = 'View the current and projected quantity of the item in each lot.';
}
action("BOM Level")
{
AccessByPermission = TableData "BOM Buffer" = R;
ApplicationArea = Assembly;
Caption = 'BOM Level';
Image = BOMLevel;
ToolTip = 'View availability figures for items on bills of materials that show how many units of a parent item you can make based on the availability of child items.';
trigger OnAction()
begin
SalesAvailabilityMgt.ShowItemAvailabilityFromSalesLine(Rec, "Item Availability Type"::BOM);
end;
}
}
action("Co&mments")
{
ApplicationArea = Comments;
Caption = 'Co&mments';
Image = ViewComments;
ToolTip = 'View or add comments for the record.';
trigger OnAction()
begin
Rec.ShowLineComments();
end;
}
action("Item Charge &Assignment")
{
AccessByPermission = TableData "Item Charge" = R;
ApplicationArea = ItemCharges;
Caption = 'Item Charge &Assignment';
Enabled = Rec.Type = Rec.Type::"Charge (Item)";
Image = ItemCosts;
ToolTip = 'Record additional direct costs, for example for freight. This action is available only for Charge (Item) line types.';
trigger OnAction()
begin
ItemChargeAssgnt();
SetItemChargeFieldsStyle();
end;
}
action(ItemTrackingLines)
{
ApplicationArea = ItemTracking;
Caption = 'Item &Tracking Lines';
Image = ItemTrackingLines;
ShortCutKey = 'Ctrl+Alt+I';
Enabled = Rec.Type = Rec.Type::Item;
ToolTip = 'View or edit serial, lot and package numbers for the selected item. This action is available only for lines that contain an item.';
trigger OnAction()
begin
Rec.OpenItemTrackingLines();
end;
}
action(DocAttach)
{
ApplicationArea = All;
Caption = 'Attachments';
Image = Attach;
ToolTip = 'Add a file as an attachment. You can attach images as well as documents.';
trigger OnAction()
var
DocumentAttachmentDetails: Page "Document Attachment Details";
RecRef: RecordRef;
begin
RecRef.GetTable(Rec);
DocumentAttachmentDetails.OpenForRecRef(RecRef);
DocumentAttachmentDetails.RunModal();
end;
}
}
group(Errors)
{
Caption = 'Issues';
Image = ErrorLog;
Visible = BackgroundErrorCheck;
ShowAs = SplitButton;
action(ShowLinesWithErrors)
{
ApplicationArea = Basic, Suite;
Caption = 'Show Lines with Issues';
Image = Error;
Visible = BackgroundErrorCheck;
Enabled = not ShowAllLinesEnabled;
ToolTip = 'View a list of sales lines that have issues before you post the document.';
trigger OnAction()
begin
Rec.SwitchLinesWithErrorsFilter(ShowAllLinesEnabled);
end;
}
action(ShowAllLines)
{
ApplicationArea = Basic, Suite;
Caption = 'Show All Lines';
Image = ExpandAll;
Visible = BackgroundErrorCheck;
Enabled = ShowAllLinesEnabled;
ToolTip = 'View all sales lines, including lines with and without issues.';
trigger OnAction()
begin
Rec.SwitchLinesWithErrorsFilter(ShowAllLinesEnabled);
end;
}
}
group("Page")
{
Caption = 'Page';
action(EditInExcel)
{
ApplicationArea = Basic, Suite;
Caption = 'Edit in Excel';
Image = Excel;
Visible = IsSaaSExcelAddinEnabled;
ToolTip = 'Send the data in the sub page to an Excel file for analysis or editing';
AccessByPermission = System "Allow Action Export To Excel" = X;
trigger OnAction()
var
EditinExcel: Codeunit "Edit in Excel";
EditinExcelFilters: Codeunit "Edit in Excel Filters";
begin
EditinExcelFilters.AddFieldV2('Document_No', Enum::"Edit in Excel Filter Type"::Equal, Rec."Document No.", Enum::"Edit in Excel Edm Type"::"Edm.String");
EditinExcel.EditPageInExcel(
'Sales_Cr_Memo_Line',
Page::"Sales Cr. Memo Subform",
EditinExcelFilters,
StrSubstNo(ExcelFileNameTxt, Rec."Document No."));
end;
}
}
}
}
trigger OnAfterGetCurrRecord()
begin
GetTotalSalesHeader();
CalculateTotals();
UpdateEditableOnRow();
UpdateTypeText();
SetItemChargeFieldsStyle();
end;
trigger OnAfterGetRecord()
var
Item: Record Item;
begin
Rec.ShowShortcutDimCode(ShortcutDimCode);
UpdateTypeText();
SetItemChargeFieldsStyle();
if Rec."Variant Code" = '' then
VariantCodeMandatory := Item.IsVariantMandatory(Rec.Type = Rec.Type::Item, Rec."No.");
end;
trigger OnDeleteRecord(): Boolean
var
SalesLineReserve: Codeunit "Sales Line-Reserve";
IsHandled: Boolean;
Result: Boolean;
begin
IsHandled := false;
OnBeforeOnDeleteRecord(Rec, DocumentTotals, Result, IsHandled);
if IsHandled then
exit(Result);
if Rec.Quantity <> 0 then
if Rec.ItemExists(Rec."No.") then begin
if not SalesLineReserve.DeleteLineConfirm(Rec) then
exit(false);
SalesLineReserve.DeleteLine(Rec);
end;
DocumentTotals.SalesDocTotalsNotUpToDate();
end;
trigger OnFindRecord(Which: Text): Boolean
begin
DocumentTotals.SalesCheckAndClearTotals(Rec, xRec, TotalSalesLine, VATAmount, InvoiceDiscountAmount, InvoiceDiscountPct);
exit(Rec.Find(Which));
end;
trigger OnInit()
begin
SalesSetup.Get();
Currency.InitRoundingPrecision();
TempOptionLookupBuffer.FillLookupBuffer(Enum::"Option Lookup Type"::Sales);
TypeAsTextFieldVisible := ApplicationAreaMgmtFacade.IsFoundationEnabled() and not ApplicationAreaMgmtFacade.IsAdvancedEnabled();
end;
trigger OnModifyRecord(): Boolean
begin
DocumentTotals.SalesCheckIfDocumentChanged(Rec, xRec);
end;
trigger OnNewRecord(BelowxRec: Boolean)
begin
Rec.InitType();
SetDefaultType();
Clear(ShortcutDimCode);
UpdateTypeText();
end;
trigger OnOpenPage()
var
AllocationAccountMgt: Codeunit "Allocation Account Mgt.";
begin
UseAllocationAccountNumber := AllocationAccountMgt.UseAllocationAccountNoField();
SetOpenPage();
SetItemReferenceVisibility();
SetDimensionsVisibility();
end;
var
SalesSetup: Record "Sales & Receivables Setup";
TempOptionLookupBuffer: Record "Option Lookup Buffer" temporary;
TransferExtendedText: Codeunit "Transfer Extended Text";
SalesAvailabilityMgt: Codeunit "Sales Availability Mgt.";
SalesCalcDiscountByType: Codeunit "Sales - Calc Discount By Type";
ApplicationAreaMgmtFacade: Codeunit "Application Area Mgmt. Facade";
AmountWithDiscountAllowed: Decimal;
CurrPageIsEditable: Boolean;
IsSaaSExcelAddinEnabled: Boolean;
VariantCodeMandatory: Boolean;
TypeAsText: Text[30];
TypeAsTextFieldVisible: Boolean;
ItemChargeStyleExpression: Text;
UseAllocationAccountNumber: Boolean;
ActionOnlyAllowedForAllocationAccountsErr: Label 'This action is only available for lines that have Allocation Account set as Type.';
ExcelFileNameTxt: Label 'Sales Credit Memo %1 - Lines', Comment = '%1 = document number, ex. 10000';
protected var
Currency: Record Currency;
TotalSalesHeader: Record "Sales Header";
TotalSalesLine: Record "Sales Line";
DocumentTotals: Codeunit "Document Totals";
ShortcutDimCode: array[8] of Code[20];
DimVisible1: Boolean;
DimVisible2: Boolean;
DimVisible3: Boolean;
DimVisible4: Boolean;
DimVisible5: Boolean;
DimVisible6: Boolean;
DimVisible7: Boolean;
DimVisible8: Boolean;
InvDiscAmountEditable: Boolean;
InvoiceDiscountAmount: Decimal;
InvoiceDiscountPct: Decimal;
IsBlankNumber: Boolean;
BackgroundErrorCheck: Boolean;
ShowAllLinesEnabled: Boolean;
IsCommentLine: Boolean;
ItemReferenceVisible: Boolean;
VATAmount: Decimal;
UnitofMeasureCodeIsChangeable: Boolean;
local procedure SetOpenPage()
var
ServerSetting: Codeunit "Server Setting";
DocumentErrorsMgt: Codeunit "Document Errors Mgt.";
begin
OnBeforeSetOpenPage();
IsSaaSExcelAddinEnabled := ServerSetting.GetIsSaasExcelAddinEnabled();
BackgroundErrorCheck := DocumentErrorsMgt.BackgroundValidationEnabled();
end;
/// <summary>
/// Runs the invoice discount calculation with user confirmation.
/// </summary>
procedure ApproveCalcInvDisc()
begin
CODEUNIT.Run(CODEUNIT::"Sales-Disc. (Yes/No)", Rec);
DocumentTotals.SalesDocTotalsNotUpToDate();
end;
/// <summary>
/// Explodes the BOM for the current item line.
/// </summary>
procedure ExplodeBOM()
begin
CODEUNIT.Run(CODEUNIT::"Sales-Explode BOM", Rec);
DocumentTotals.SalesDocTotalsNotUpToDate();
end;
local procedure SetItemReferenceVisibility()
var
ItemReference: Record "Item Reference";
begin
ItemReferenceVisible := not ItemReference.IsEmpty();
end;
local procedure SetDefaultType()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeSetDefaultType(Rec, xRec, IsHandled);
if IsHandled then
exit;
if xRec."Document No." = '' then
Rec.Type := Rec.GetDefaultLineType();
end;
/// <summary>
/// Calculates the invoice discount for the current line.
/// </summary>
procedure CalcInvDisc()
var
SalesCalcDiscount: Codeunit "Sales-Calc. Discount";
begin
SalesCalcDiscount.CalculateInvoiceDiscountOnLine(Rec);
DocumentTotals.SalesDocTotalsNotUpToDate();
end;
/// <summary>
/// Gets return receipts to create credit memo lines.
/// </summary>
procedure GetReturnReceipt()
begin
CODEUNIT.Run(CODEUNIT::"Sales-Get Return Receipts", Rec);
DocumentTotals.SalesDocTotalsNotUpToDate();
end;
/// <summary>
/// Inserts extended text for the current line if available.
/// </summary>
/// <param name="Unconditionally">Whether to insert text without checking conditions.</param>
procedure InsertExtendedText(Unconditionally: Boolean)
begin
if not Unconditionally and (Rec."No." = xRec."No.") then
exit;
OnBeforeInsertExtendedText(Rec, xRec);
if TransferExtendedText.SalesCheckIfAnyExtText(Rec, Unconditionally) then begin
CurrPage.SaveRecord();
Commit();
TransferExtendedText.InsertSalesExtText(Rec);
end;
if TransferExtendedText.MakeUpdate() then
UpdateForm(true);
end;
local procedure ItemChargeAssgnt()
begin
Rec.ShowItemChargeAssgnt();
end;
/// <summary>
/// Updates the current page.
/// </summary>
/// <param name="SetSaveRecord">Whether to save the record before updating.</param>
procedure UpdateForm(SetSaveRecord: Boolean)
begin
CurrPage.Update(SetSaveRecord);
end;
/// <summary>
/// Handles post-validation processing when the No. field changes.
/// </summary>
procedure NoOnAfterValidate()
begin
OnBeforeNoOnAfterValidate(Rec, xRec);
InsertExtendedText(false);
if (Rec.Type = Rec.Type::"Charge (Item)") and (Rec."No." <> xRec."No.") and
(xRec."No." <> '')
then
CurrPage.SaveRecord();
OnAfterNoOnAfterValidate(Rec, xRec);
end;
protected procedure ReserveOnAfterValidate()
begin
if (Rec.Reserve = Rec.Reserve::Always) and (Rec."Outstanding Qty. (Base)" <> 0) then begin
CurrPage.SaveRecord();
Rec.AutoReserve();
end;
end;
protected procedure QuantityOnAfterValidate()
begin
OnBeforeQuantityOnAfterValidate(Rec, xRec);
if Rec.Reserve = Rec.Reserve::Always then begin
CurrPage.SaveRecord();
Rec.AutoReserve();
end;
OnQuantityOnAfterValidateOnBeforeDeltaUpdateTotals(Rec, xRec);
DeltaUpdateTotals();
OnAfterQuantityOnAfterValidate(Rec, xRec);
end;
protected procedure UnitofMeasureCodeOnAfterValidate()
begin
if Rec.Reserve = Rec.Reserve::Always then begin
CurrPage.SaveRecord();
Rec.AutoReserve();
end;
DeltaUpdateTotals();
end;
/// <summary>
/// Updates the editable state of fields based on the current row.
/// </summary>
procedure UpdateEditableOnRow()
begin
IsCommentLine := not Rec.HasTypeToFillMandatoryFields();
IsBlankNumber := IsCommentLine;
UnitofMeasureCodeIsChangeable := not IsCommentLine;
CurrPageIsEditable := CurrPage.Editable();
InvDiscAmountEditable :=
CurrPageIsEditable and not SalesSetup."Calc. Inv. Discount" and
(TotalSalesHeader.Status = TotalSalesHeader.Status::Open);
OnAfterUpdateEditableOnRow(Rec, IsCommentLine, IsBlankNumber);
end;
/// <summary>
/// Calculates the document totals for the subform.
/// </summary>
procedure CalculateTotals()
begin
DocumentTotals.SalesCheckIfDocumentChanged(Rec, xRec);
DocumentTotals.CalculateSalesSubPageTotals(TotalSalesHeader, TotalSalesLine, VATAmount, InvoiceDiscountAmount, InvoiceDiscountPct);
DocumentTotals.RefreshSalesLine(Rec);
end;
/// <summary>
/// Performs incremental update of document totals based on line changes.
/// </summary>
procedure DeltaUpdateTotals()
var
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeDeltaUpdateTotals(Rec, xRec, IsHandled);
if IsHandled then
exit;
DocumentTotals.SalesDeltaUpdateTotals(Rec, xRec, TotalSalesLine, VATAmount, InvoiceDiscountAmount, InvoiceDiscountPct);
if Rec."Line Amount" <> xRec."Line Amount" then
Rec.SendLineInvoiceDiscountResetNotification();
end;
/// <summary>
/// Forces a recalculation of document totals.
/// </summary>
procedure ForceTotalsCalculation()
begin
DocumentTotals.SalesDocTotalsNotUpToDate();
end;
/// <summary>
/// Redistributes invoice discount amounts after validation.
/// </summary>
procedure RedistributeTotalsOnAfterValidate()
var
SalesHeader: Record "Sales Header";
begin
CurrPage.SaveRecord();
SalesHeader.Get(Rec."Document Type", Rec."Document No.");
DocumentTotals.SalesRedistributeInvoiceDiscountAmounts(Rec, VATAmount, TotalSalesLine);
CurrPage.Update(false);
end;
local procedure GetTotalSalesHeader()
begin
DocumentTotals.GetTotalSalesHeaderAndCurrency(Rec, TotalSalesHeader, Currency);
end;
/// <summary>
/// Clears the total sales header variable.
/// </summary>
procedure ClearTotalSalesHeader();
begin
Clear(TotalSalesHeader);
end;
local procedure ValidateInvoiceDiscountAmount()
var
SalesHeader: Record "Sales Header";
begin
SalesHeader.Get(Rec."Document Type", Rec."Document No.");
SalesCalcDiscountByType.ApplyInvDiscBasedOnAmt(InvoiceDiscountAmount, SalesHeader);
CurrPage.Update(false);
end;
/// <summary>
/// Updates the type text display based on the current line type.
/// </summary>
procedure UpdateTypeText()
var
RecRef: RecordRef;
begin
OnBeforeUpdateTypeText(Rec);
RecRef.GetTable(Rec);
TypeAsText := TempOptionLookupBuffer.FormatOption(RecRef.Field(Rec.FieldNo(Type)));
end;
local procedure SetItemChargeFieldsStyle()
begin
ItemChargeStyleExpression := '';
if Rec.AssignedItemCharge() then
ItemChargeStyleExpression := 'Unfavorable';
end;
local procedure SetDimensionsVisibility()
var
DimMgt: Codeunit DimensionManagement;
begin
DimVisible1 := false;
DimVisible2 := false;
DimVisible3 := false;
DimVisible4 := false;
DimVisible5 := false;
DimVisible6 := false;
DimVisible7 := false;
DimVisible8 := false;
DimMgt.UseShortcutDims(
DimVisible1, DimVisible2, DimVisible3, DimVisible4, DimVisible5, DimVisible6, DimVisible7, DimVisible8);
Clear(DimMgt);
OnAfterSetDimensionsVisibility();
end;
[IntegrationEvent(true, false)]
local procedure OnAfterNoOnAfterValidate(var SalesLine: Record "Sales Line"; xSalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterUpdateEditableOnRow(SalesLine: Record "Sales Line"; var IsCommentLine: Boolean; var IsBlankNumber: Boolean);
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterValidateShortcutDimCode(var SalesLine: Record "Sales Line"; var ShortcutDimCode: array[8] of Code[20]; DimIndex: Integer)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeInsertExtendedText(var SalesLine: Record "Sales Line"; var xSalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnBeforeNoOnAfterValidate(var SalesLine: Record "Sales Line"; xSalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeSetDefaultType(var SalesLine: Record "Sales Line"; var xSalesLine: Record "Sales Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeUpdateTypeText(var SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnItemReferenceNoOnLookup(var SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnBeforeSetOpenPage()
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAfterSetDimensionsVisibility();
begin
end;
[IntegrationEvent(true, false)]
local procedure OnQuantityOnAfterValidateOnBeforeDeltaUpdateTotals(var SalesLine: Record "Sales Line"; var xSalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnBeforeDeltaUpdateTotals(var SalesLine: Record "Sales Line"; xSalesLine: Record "Sales Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(true, false)]
local procedure OnBeforeOnDeleteRecord(var SalesLine: Record "Sales Line"; var DocumentTotals: Codeunit "Document Totals"; var Result: Boolean; var IsHandled: Boolean);
begin
end;
[IntegrationEvent(true, false)]
local procedure OnBeforeQuantityOnAfterValidate(var SalesLine: Record "Sales Line"; xSalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(true, false)]
local procedure OnAfterQuantityOnAfterValidate(var SalesLine: Record "Sales Line"; xSalesLine: Record "Sales Line")
begin
end;
}