Table 172 Standard Customer Sales Code, source in 29
Source29
src/Layers/W1/BaseApp/Sales/Document/StandardCustomerSalesCode.Table.al574 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.Bank.BankAccount;
using Microsoft.Bank.DirectDebit;
using Microsoft.Finance.Currency;
using Microsoft.Finance.Dimension;
using Microsoft.Foundation.ExtendedText;
using Microsoft.Foundation.PaymentTerms;
using Microsoft.Inventory.Item.Catalog;
using Microsoft.Sales.Customer;
/// <summary>
/// Stores the assignment of standard sales codes to specific customers for recurring transactions.
/// </summary>
table 172 "Standard Customer Sales Code"
{
Caption = 'Standard Customer Sales Code';
DataClassification = CustomerContent;
fields
{
/// <summary>
/// Specifies the customer number to which the standard sales code is assigned.
/// </summary>
field(1; "Customer No."; Code[20])
{
Caption = 'Customer No.';
ToolTip = 'Specifies the customer number of the customer to which the standard sales code is assigned.';
NotBlank = true;
TableRelation = Customer;
}
/// <summary>
/// Specifies the standard sales code assigned to this customer.
/// </summary>
field(2; "Code"; Code[10])
{
Caption = 'Code';
ToolTip = 'Specifies a standard sales code from the Standard Sales Code table.';
NotBlank = true;
TableRelation = "Standard Sales Code";
trigger OnValidate()
var
StdSalesCode: Record "Standard Sales Code";
begin
if Code = '' then
exit;
StdSalesCode.Get(Code);
Description := StdSalesCode.Description;
"Currency Code" := StdSalesCode."Currency Code";
end;
}
/// <summary>
/// Contains a description of the standard customer sales code.
/// </summary>
field(3; Description; Text[100])
{
Caption = 'Description';
ToolTip = 'Specifies a description of the standard sales code.';
}
/// <summary>
/// Specifies the date from which the standard sales code is valid for this customer.
/// </summary>
field(4; "Valid From Date"; Date)
{
Caption = 'Valid From Date';
ToolTip = 'Specifies the first day when the Create Recurring Sales Inv. batch job can be used to create sales invoices.';
}
/// <summary>
/// Specifies the date until which the standard sales code is valid for this customer.
/// </summary>
field(5; "Valid To date"; Date)
{
Caption = 'Valid To date';
ToolTip = 'Specifies the last day when the Create Recurring Sales Inv. batch job can be used to create sales invoices.';
}
/// <summary>
/// Specifies the payment method code to use when creating documents with this standard sales code.
/// </summary>
field(6; "Payment Method Code"; Code[10])
{
Caption = 'Payment Method Code';
ToolTip = 'Specifies how to make payment, such as with bank transfer, cash, or check.';
TableRelation = "Payment Method";
}
/// <summary>
/// Specifies the payment terms code to use when creating documents with this standard sales code.
/// </summary>
field(7; "Payment Terms Code"; Code[10])
{
Caption = 'Payment Terms Code';
ToolTip = 'Specifies a formula that calculates the payment due date, payment discount date, and payment discount amount.';
TableRelation = "Payment Terms";
}
/// <summary>
/// Specifies the direct debit mandate to use for payment collection with this standard sales code.
/// </summary>
field(8; "Direct Debit Mandate ID"; Code[35])
{
Caption = 'Direct Debit Mandate ID';
ToolTip = 'Specifies the ID of the direct-debit mandate that this standard customer sales code uses to create sales invoices for direct debit collection.';
TableRelation = "SEPA Direct Debit Mandate" where("Customer No." = field("Customer No."),
Blocked = const(false),
Closed = const(false));
}
/// <summary>
/// Indicates whether the standard customer sales code is blocked from use.
/// </summary>
field(9; Blocked; Boolean)
{
Caption = 'Blocked';
ToolTip = 'Specifies that the related record is blocked from being posted in transactions, for example a customer that is declared insolvent or an item that is placed in quarantine.';
}
/// <summary>
/// Specifies the currency code for the standard sales code.
/// </summary>
field(13; "Currency Code"; Code[10])
{
Caption = 'Currency Code';
Editable = false;
TableRelation = Currency;
}
/// <summary>
/// Specifies how recurring sales lines are inserted on sales quotes for this customer.
/// </summary>
field(15; "Insert Rec. Lines On Quotes"; Option)
{
Caption = 'Insert Rec. Lines On Quotes';
ToolTip = 'Specifies how you want to use standard sales codes on sales quotes.';
DataClassification = SystemMetadata;
OptionCaption = 'Manual,Automatic,Always Ask';
OptionMembers = Manual,Automatic,"Always Ask";
}
/// <summary>
/// Specifies how recurring sales lines are inserted on sales orders for this customer.
/// </summary>
field(16; "Insert Rec. Lines On Orders"; Option)
{
Caption = 'Insert Rec. Lines On Orders';
ToolTip = 'Specifies how you want to use standard sales codes on sales orders.';
DataClassification = SystemMetadata;
OptionCaption = 'Manual,Automatic,Always Ask';
OptionMembers = Manual,Automatic,"Always Ask";
}
/// <summary>
/// Specifies how recurring sales lines are inserted on sales invoices for this customer.
/// </summary>
field(17; "Insert Rec. Lines On Invoices"; Option)
{
Caption = 'Insert Rec. Lines On Invoices';
ToolTip = 'Specifies how you want to use standard sales codes on sales invoices.';
DataClassification = SystemMetadata;
OptionCaption = 'Manual,Automatic,Always Ask';
OptionMembers = Manual,Automatic,"Always Ask";
}
/// <summary>
/// Specifies how recurring sales lines are inserted on sales credit memos for this customer.
/// </summary>
field(18; "Insert Rec. Lines On Cr. Memos"; Option)
{
Caption = 'Insert Rec. Lines On Cr. Memos';
ToolTip = 'Specifies how you want to use standard sales codes on sales credit memos.';
DataClassification = SystemMetadata;
OptionCaption = 'Manual,Automatic,Always Ask';
OptionMembers = Manual,Automatic,"Always Ask";
}
}
keys
{
key(Key1; "Customer No.", "Code")
{
Clustered = true;
}
key(Key2; Code, "Currency Code")
{
}
}
fieldgroups
{
}
trigger OnRename()
begin
Error(RenameErr);
end;
var
RenameErr: Label 'You cannot rename the line.';
/// <summary>
/// Creates a sales invoice using the standard sales code for the customer.
/// </summary>
/// <param name="OrderDate">The order date for the invoice.</param>
/// <param name="PostingDate">The posting date for the invoice.</param>
procedure CreateSalesInvoice(OrderDate: Date; PostingDate: Date)
var
SalesHeader: Record "Sales Header";
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeCreateSalesInvoice(Rec, OrderDate, PostingDate, IsHandled);
if IsHandled then
exit;
TestField(Blocked, false);
SalesHeader.Init();
SalesHeader."No." := '';
SalesHeader."Document Type" := SalesHeader."Document Type"::Invoice;
OnCreateSalesInvoiceOnBeforeSalesHeaderInsert(SalesHeader, Rec);
SalesHeader.Insert(true);
SalesHeader.Validate("Sell-to Customer No.", "Customer No.");
SalesHeader.Validate("Order Date", OrderDate);
SalesHeader.Validate("Posting Date", PostingDate);
SalesHeader.Validate("Document Date", OrderDate);
if "Payment Method Code" <> '' then
SalesHeader.Validate("Payment Method Code", "Payment Method Code");
if "Payment Terms Code" <> '' then
SalesHeader.Validate("Payment Terms Code", "Payment Terms Code");
if "Direct Debit Mandate ID" <> '' then
SalesHeader.Validate("Direct Debit Mandate ID", "Direct Debit Mandate ID");
OnCreateSalesInvoiceOnBeforeSalesHeaderModify(SalesHeader, Rec);
SalesHeader.Modify();
ApplyStdCodesToSalesLines(SalesHeader, Rec);
OnAfterCreateSalesInvoice(SalesHeader, Rec);
end;
/// <summary>
/// Opens a page to select standard customer sales codes and inserts the selected lines into the sales header.
/// </summary>
/// <param name="SalesHeader">The sales header to insert lines into.</param>
procedure InsertSalesLines(var SalesHeader: Record "Sales Header")
var
StdCustSalesCode: Record "Standard Customer Sales Code";
StdCustSalesCodes: Page "Standard Customer Sales Codes";
begin
SalesHeader.TestField("No.");
SalesHeader.TestField("Sell-to Customer No.");
StdCustSalesCode.FilterGroup := 2;
StdCustSalesCode.SetRange("Customer No.", SalesHeader."Sell-to Customer No.");
StdCustSalesCode.FilterGroup := 0;
OnBeforeStdCustSalesCodesSetTableView(StdCustSalesCode, SalesHeader);
StdCustSalesCodes.SetTableView(StdCustSalesCode);
StdCustSalesCodes.LookupMode(true);
if StdCustSalesCodes.RunModal() = ACTION::LookupOK then begin
StdCustSalesCodes.GetSelected(StdCustSalesCode);
if StdCustSalesCode.FindSet() then
repeat
OnInsertSalesLineOnBeforeApplyStdCodesToSalesLines(StdCustSalesCode);
ApplyStdCodesToSalesLines(SalesHeader, StdCustSalesCode);
until StdCustSalesCode.Next() = 0;
end;
end;
/// <summary>
/// Applies the standard sales code lines to the sales document.
/// </summary>
/// <param name="SalesHeader">The sales header to apply lines to.</param>
/// <param name="StdCustSalesCode">The standard customer sales code containing the lines to apply.</param>
procedure ApplyStdCodesToSalesLines(var SalesHeader: Record "Sales Header"; StdCustSalesCode: Record "Standard Customer Sales Code")
var
Currency: Record Currency;
StdSalesLine: Record "Standard Sales Line";
StdSalesCode: Record "Standard Sales Code";
SalesLine: Record "Sales Line";
ItemReferenceMgt: Codeunit "Item Reference Management";
Factor: Integer;
IsHandled: Boolean;
begin
IsHandled := false;
OnBeforeApplyStdCodesToSalesLinesProcedure(SalesHeader, StdCustSalesCode, IsHandled);
if not IsHandled then begin
Currency.Initialize(SalesHeader."Currency Code");
if StdCustSalesCode.Blocked then
exit;
StdCustSalesCode.TestField(Code);
StdCustSalesCode.TestField("Customer No.", SalesHeader."Sell-to Customer No.");
StdSalesCode.Get(StdCustSalesCode.Code);
StdSalesCode.TestField("Currency Code", SalesHeader."Currency Code");
StdSalesLine.SetRange("Standard Sales Code", StdCustSalesCode.Code);
SalesLine."Document Type" := SalesHeader."Document Type";
SalesLine."Document No." := SalesHeader."No.";
SalesLine.SetRange("Document Type", SalesHeader."Document Type");
SalesLine.SetRange("Document No.", SalesHeader."No.");
if SalesHeader."Prices Including VAT" then
Factor := 1
else
Factor := 0;
OnBeforeApplyStdCodesToSalesLinesLoop(StdSalesLine, SalesLine, SalesHeader, StdSalesCode);
SalesLine.LockTable();
StdSalesLine.LockTable();
if StdSalesLine.Find('-') then
repeat
SalesLine.Init();
SalesLine.SetSalesHeader(SalesHeader);
SalesLine."Line No." := 0;
SalesLine.Validate(Type, StdSalesLine.Type);
OnApplyStdCodesToSalesLinesOnAfterValidateType(SalesLine, StdSalesLine);
if StdSalesLine.Type = StdSalesLine.Type::" " then begin
SalesLine.Validate("No.", StdSalesLine."No.");
SalesLine.Description := StdSalesLine.Description;
SalesLine."Sell-to Customer No." := SalesHeader."Sell-to Customer No.";
end else
if not StdSalesLine.EmptyLine() then begin
StdSalesLine.TestField("No.");
SalesLine.Validate("No.", StdSalesLine."No.");
OnApplyStdCodesToSalesLinesOnAfterValidateSalesLineNo(StdCustSalesCode, SalesLine);
if StdSalesLine."Variant Code" <> '' then
SalesLine.Validate("Variant Code", StdSalesLine."Variant Code");
SalesLine.Validate(Quantity, StdSalesLine.Quantity);
if StdSalesLine."Unit of Measure Code" <> '' then
SalesLine.Validate("Unit of Measure Code", StdSalesLine."Unit of Measure Code");
if StdSalesLine.Description <> '' then
SalesLine.Validate(Description, StdSalesLine.Description);
if SalesLine."Item Reference No." <> '' then
ItemReferenceMgt.EnterSalesItemReference(SalesLine);
IsHandled := false;
OnApplyStdCodesToSalesLinesOnBeforeRoundUnitPrice(SalesLine, StdSalesLine, IsHandled);
if not IsHandled then
if (StdSalesLine.Type = StdSalesLine.Type::"G/L Account") or
(StdSalesLine.Type = StdSalesLine.Type::"Charge (Item)")
then
SalesLine.Validate(
"Unit Price",
Round(StdSalesLine."Amount Excl. VAT" *
(SalesLine."VAT %" / 100 * Factor + 1), Currency."Unit-Amount Rounding Precision"));
end;
SalesLine."Shortcut Dimension 1 Code" := StdSalesLine."Shortcut Dimension 1 Code";
SalesLine."Shortcut Dimension 2 Code" := StdSalesLine."Shortcut Dimension 2 Code";
CombineDimensions(SalesLine, StdSalesLine);
OnBeforeApplyStdCodesToSalesLines(SalesLine, StdSalesLine);
if StdSalesLine.InsertLine() then begin
SalesLine."Line No." := GetNextLineNo(SalesLine);
IsHandled := false;
OnApplyStdCodesToSalesLinesOnAfterSetSalesLineLineNo(Rec, SalesLine, IsHandled);
if not IsHandled then
SalesLine.Insert(true);
OnAfterSalesLineInsert(StdSalesLine, SalesLine);
SalesLine.AutoAsmToOrder();
InsertExtendedText(SalesLine, SalesHeader);
OnApplyStdCodesToSalesLinesOnAfterInsertExtendedText(Rec, StdSalesLine, SalesLine);
end;
until StdSalesLine.Next() = 0;
end;
OnAfterApplyStdCodesToSalesLinesLoop(StdSalesLine, SalesLine, SalesHeader, StdSalesCode);
end;
local procedure CombineDimensions(var SalesLine: Record "Sales Line"; StdSalesLine: Record "Standard Sales Line")
var
DimensionManagement: Codeunit DimensionManagement;
DimensionSetIDArr: array[10] of Integer;
begin
DimensionSetIDArr[1] := SalesLine."Dimension Set ID";
DimensionSetIDArr[2] := StdSalesLine."Dimension Set ID";
SalesLine."Dimension Set ID" :=
DimensionManagement.GetCombinedDimensionSetID(
DimensionSetIDArr, SalesLine."Shortcut Dimension 1 Code", SalesLine."Shortcut Dimension 2 Code");
OnAfterCombineDimensions(SalesLine, StdSalesLine);
end;
/// <summary>
/// Inserts extended text for a sales line if applicable.
/// </summary>
/// <param name="SalesLine">The sales line to check and insert extended text for.</param>
procedure InsertExtendedText(SalesLine: Record "Sales Line")
var
TransferExtendedText: Codeunit "Transfer Extended Text";
begin
if SalesLine.Type = SalesLine.Type::" " then
exit;
if TransferExtendedText.SalesCheckIfAnyExtText(SalesLine, false) then
TransferExtendedText.InsertSalesExtText(SalesLine);
end;
/// <summary>
/// Inserts extended text for a sales line using the sales header context.
/// </summary>
/// <param name="SalesLine">The sales line to check and insert extended text for.</param>
/// <param name="SalesHeader">The sales header providing context for the extended text.</param>
procedure InsertExtendedText(SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header")
var
TransferExtendedText: Codeunit "Transfer Extended Text";
begin
if TransferExtendedText.SalesCheckIfAnyExtText(SalesLine, false, SalesHeader) then
TransferExtendedText.InsertSalesExtText(SalesLine);
end;
/// <summary>
/// Gets the next available line number for a sales document.
/// </summary>
/// <param name="SalesLine">The sales line used to determine the document type and number.</param>
/// <returns>Returns the next line number (10000 increments).</returns>
procedure GetNextLineNo(SalesLine: Record "Sales Line"): Integer
begin
SalesLine.SetRange("Document Type", SalesLine."Document Type");
SalesLine.SetRange("Document No.", SalesLine."Document No.");
if SalesLine.FindLast() then
exit(SalesLine."Line No." + 10000);
exit(10000);
end;
/// <summary>
/// Sets filters on the record to find standard sales codes that should be automatically or always-ask inserted.
/// </summary>
/// <param name="SalesHeader">The sales header used to determine document type and customer filters.</param>
procedure SetFilterByAutomaticAndAlwaysAskCodes(SalesHeader: Record "Sales Header")
begin
SetRange("Customer No.", SalesHeader."Sell-to Customer No.");
SetRange("Currency Code", SalesHeader."Currency Code");
case SalesHeader."Document Type" of
SalesHeader."Document Type"::Quote:
SetFilter("Insert Rec. Lines On Quotes", '<>%1', "Insert Rec. Lines On Quotes"::Manual);
SalesHeader."Document Type"::Order:
SetFilter("Insert Rec. Lines On Orders", '<>%1', "Insert Rec. Lines On Orders"::Manual);
SalesHeader."Document Type"::Invoice:
SetFilter("Insert Rec. Lines On Invoices", '<>%1', "Insert Rec. Lines On Invoices"::Manual);
SalesHeader."Document Type"::"Credit Memo":
SetFilter("Insert Rec. Lines On Cr. Memos", '<>%1', "Insert Rec. Lines On Cr. Memos"::Manual);
end;
OnAfterSetFilterByAutomaticAndAlwaysAskCodes(Rec, SalesHeader);
end;
/// <summary>
/// Checks if recurring lines should be automatically inserted for the document type.
/// </summary>
/// <param name="SalesHeader">The sales header to check the document type for.</param>
/// <returns>Returns true if the document type is set to automatic insertion.</returns>
procedure IsInsertRecurringLinesOnDocumentAutomatic(SalesHeader: Record "Sales Header"): Boolean
begin
case SalesHeader."Document Type" of
SalesHeader."Document Type"::Quote:
exit("Insert Rec. Lines On Quotes" = "Insert Rec. Lines On Quotes"::Automatic);
SalesHeader."Document Type"::Order:
exit("Insert Rec. Lines On Orders" = "Insert Rec. Lines On Orders"::Automatic);
SalesHeader."Document Type"::Invoice:
exit("Insert Rec. Lines On Invoices" = "Insert Rec. Lines On Invoices"::Automatic);
SalesHeader."Document Type"::"Credit Memo":
exit("Insert Rec. Lines On Cr. Memos" = "Insert Rec. Lines On Cr. Memos"::Automatic);
else
exit(false);
end;
end;
/// <summary>
/// Checks if recurring lines should be auto-inserted (automatic or always-ask) for the document type.
/// </summary>
/// <param name="SalesHeader">The sales header to check the document type for.</param>
/// <returns>Returns true if the document type is not set to manual insertion.</returns>
procedure ShouldAutoInsertRecurringLinesOnDocument(SalesHeader: Record "Sales Header"): Boolean
begin
case SalesHeader."Document Type" of
SalesHeader."Document Type"::Quote:
exit("Insert Rec. Lines On Quotes" <> "Insert Rec. Lines On Quotes"::Manual);
SalesHeader."Document Type"::Order:
exit("Insert Rec. Lines On Orders" <> "Insert Rec. Lines On Orders"::Manual);
SalesHeader."Document Type"::Invoice:
exit("Insert Rec. Lines On Invoices" <> "Insert Rec. Lines On Invoices"::Manual);
SalesHeader."Document Type"::"Credit Memo":
exit("Insert Rec. Lines On Cr. Memos" <> "Insert Rec. Lines On Cr. Memos"::Manual);
else
exit(false);
end;
end;
[IntegrationEvent(false, false)]
local procedure OnAfterCreateSalesInvoice(var SalesHeader: Record "Sales Header"; StandardCustomerSalesCode: Record "Standard Customer Sales Code")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterCombineDimensions(var SalesLine: Record "Sales Line"; StdSalesLine: Record "Standard Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterApplyStdCodesToSalesLinesLoop(var StdSalesLine: Record "Standard Sales Line"; var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; StdSalesCode: Record "Standard Sales Code")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeApplyStdCodesToSalesLines(var SalesLine: Record "Sales Line"; StdSalesLine: Record "Standard Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeApplyStdCodesToSalesLinesLoop(var StdSalesLine: Record "Standard Sales Line"; var SalesLine: Record "Sales Line"; SalesHeader: Record "Sales Header"; StdSalesCode: Record "Standard Sales Code")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeCreateSalesInvoice(var StandardCustomerSalesCode: Record "Standard Customer Sales Code"; OrderDate: Date; PostingDate: Date; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeStdCustSalesCodesSetTableView(var StandardCustomerSalesCode: Record "Standard Customer Sales Code"; var SalesHeader: Record "Sales Header")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCreateSalesInvoiceOnBeforeSalesHeaderInsert(var SalesHeader: Record "Sales Header"; StandardCustomerSalesCode: Record "Standard Customer Sales Code")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnCreateSalesInvoiceOnBeforeSalesHeaderModify(var SalesHeader: Record "Sales Header"; StandardCustomerSalesCode: Record "Standard Customer Sales Code")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSalesLineInsert(var StdSalesLine: Record "Standard Sales Line"; var SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnBeforeApplyStdCodesToSalesLinesProcedure(var SalesHeader: Record "Sales Header"; StandardCustomerSalesCode: Record "Standard Customer Sales Code"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnInsertSalesLineOnBeforeApplyStdCodesToSalesLines(StdCustSalesCode: Record "Standard Customer Sales Code")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnApplyStdCodesToSalesLinesOnAfterValidateSalesLineNo(StdCustSalesCode: Record "Standard Customer Sales Code"; var SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnApplyStdCodesToSalesLinesOnAfterSetSalesLineLineNo(var StdCustSalesCode: Record "Standard Customer Sales Code"; var SalesLine: Record "Sales Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnApplyStdCodesToSalesLinesOnAfterInsertExtendedText(var StdCustSalesCode: Record "Standard Customer Sales Code"; var StdSalesLine: Record "Standard Sales Line"; var SalesLine: Record "Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnApplyStdCodesToSalesLinesOnBeforeRoundUnitPrice(var SalesLine: Record "Sales Line"; StandardSalesLine: Record "Standard Sales Line"; var IsHandled: Boolean)
begin
end;
[IntegrationEvent(false, false)]
local procedure OnApplyStdCodesToSalesLinesOnAfterValidateType(var SalesLine: Record "Sales Line"; var StandardSalesLine: Record "Standard Sales Line")
begin
end;
[IntegrationEvent(false, false)]
local procedure OnAfterSetFilterByAutomaticAndAlwaysAskCodes(var StandardCustomerSalesCode: Record "Standard Customer Sales Code"; SalesHeader: Record "Sales Header")
begin
end;
}