Page 5380 CRM Sales Order, source in 29
Source29
src/Layers/W1/BaseApp/Integration/D365Sales/CRMSalesOrder.Page.al500 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.Integration.D365Sales;
using Microsoft.Integration.Dataverse;
using Microsoft.Sales.Document;
page 5380 "CRM Sales Order"
{
Caption = 'Sales Order - Microsoft Dynamics 365 Sales';
Editable = false;
PageType = Document;
SourceTable = "CRM Salesorder";
layout
{
area(content)
{
group(General)
{
Caption = 'General';
field(OrderNumber; Rec.OrderNumber)
{
ApplicationArea = Suite;
Caption = 'Order ID';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(Name; Rec.Name)
{
ApplicationArea = Suite;
Caption = 'Name';
}
field(Account; CRMAccountName)
{
ApplicationArea = Suite;
Caption = 'Account';
ToolTip = 'Specifies the coupled Dynamics 365 Sales account.';
trigger OnDrillDown()
var
CRMAccount: Record "CRM Account";
begin
CRMAccount.SetRange(StateCode, CRMAccount.StateCode::Active);
PAGE.Run(PAGE::"CRM Account List", CRMAccount);
end;
}
field(Contact; CRMContactName)
{
ApplicationArea = Suite;
Caption = 'Contact';
ToolTip = 'Specifies the contact person at the customer.';
trigger OnDrillDown()
var
CRMContact: Record "CRM Contact";
begin
CRMContact.SetRange(AccountId, Rec.AccountId);
CRMContact.SetRange(StateCode, CRMContact.StateCode::Active);
PAGE.Run(PAGE::"CRM Contact List", CRMContact);
end;
}
field("Date Fulfilled"; Rec.DateFulfilled)
{
ApplicationArea = Suite;
Caption = 'Date Fulfilled';
}
field(StateCode; Rec.StateCode)
{
ApplicationArea = Suite;
Caption = 'Status';
}
field(StatusCode; Rec.StatusCode)
{
ApplicationArea = Suite;
Caption = 'Status Reason';
}
field(Opportunity; Rec.OpportunityIdName)
{
ApplicationArea = Suite;
Caption = 'Opportunity';
trigger OnDrillDown()
var
CRMOpportunity: Record "CRM Opportunity";
begin
CRMOpportunity.SetRange(AccountId, Rec.AccountId);
PAGE.Run(PAGE::"CRM Opportunity List", CRMOpportunity);
end;
}
field(Quote; Rec.QuoteIdName)
{
ApplicationArea = Suite;
Caption = 'Quote';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
trigger OnDrillDown()
var
CRMQuote: Record "CRM Quote";
begin
CRMQuote.SetRange(AccountId, Rec.AccountId);
CRMQuote.SetRange(StateCode, CRMQuote.StateCode::Active);
PAGE.Run(PAGE::"CRM Sales Quote List", CRMQuote);
end;
}
}
part(Lines; "CRM Sales Order Subform")
{
ApplicationArea = Suite;
Caption = 'Lines';
Editable = false;
SubPageLink = SalesOrderId = field(SalesOrderId);
}
group(Invoicing)
{
Caption = 'Invoicing';
field(PaymentTermsCode; Rec.PaymentTermsCodeEnum)
{
ApplicationArea = Suite;
Caption = 'Payment Terms';
}
field("Price List"; Rec.PriceLevelIdName)
{
ApplicationArea = Suite;
Caption = 'Price List';
trigger OnDrillDown()
var
CRMPricelevel: Record "CRM Pricelevel";
begin
CRMPricelevel.SetRange(TransactionCurrencyId, Rec.TransactionCurrencyId);
CRMPricelevel.SetRange(StateCode, CRMPricelevel.StateCode::Active);
PAGE.Run(PAGE::"CRM Pricelevel List");
end;
}
field(IsPriceLocked; Rec.IsPriceLocked)
{
ApplicationArea = Suite;
Caption = 'Prices Locked';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(TotalAmount; Rec.TotalAmount)
{
ApplicationArea = Suite;
Caption = 'Total Amount';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(TotalLineItemAmount; Rec.TotalLineItemAmount)
{
ApplicationArea = Suite;
Caption = 'Total Detail Amount';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(TotalAmountLessFreight; Rec.TotalAmountLessFreight)
{
ApplicationArea = Suite;
Caption = 'Total Pre-Freight Amount';
ToolTip = 'Specifies data from a corresponding field in a Dynamics 365 Sales entity. ';
}
field(TotalDiscountAmount; Rec.TotalDiscountAmount)
{
ApplicationArea = Suite;
Caption = 'Total Discount Amount';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(TotalTax; Rec.TotalTax)
{
ApplicationArea = Suite;
Caption = 'Total Tax';
}
field(Currency; Rec.TransactionCurrencyIdName)
{
ApplicationArea = Suite;
Caption = 'Currency';
trigger OnDrillDown()
var
CRMTransactioncurrency: Record "CRM Transactioncurrency";
begin
CRMTransactioncurrency.SetRange(StateCode, CRMTransactioncurrency.StateCode::Active);
PAGE.Run(PAGE::"CRM TransactionCurrency List", CRMTransactioncurrency);
end;
}
field(DiscountAmount; Rec.DiscountAmount)
{
ApplicationArea = Suite;
Caption = 'Order Discount Amount';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(DiscountPercentage; Rec.DiscountPercentage)
{
ApplicationArea = Suite;
Caption = 'Order Discount (%)';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(BillTo_Name; Rec.BillTo_Name)
{
ApplicationArea = Suite;
Caption = 'Bill To Name';
}
field(BillTo_ContactName; Rec.BillTo_ContactName)
{
ApplicationArea = Suite;
Caption = 'Bill To Contact Name';
Importance = Additional;
}
field(BillTo_Line1; Rec.BillTo_Line1)
{
ApplicationArea = Suite;
Caption = 'Bill To Street 1';
Importance = Additional;
}
field(BillTo_Line2; Rec.BillTo_Line2)
{
ApplicationArea = Suite;
Caption = 'Bill To Street 2';
Importance = Additional;
}
field(BillTo_Line3; Rec.BillTo_Line3)
{
ApplicationArea = Suite;
Caption = 'Bill To Street 3';
Importance = Additional;
}
field(BillTo_City; Rec.BillTo_City)
{
ApplicationArea = Suite;
Caption = 'Bill To City';
Importance = Additional;
}
field(BillTo_StateOrProvince; Rec.BillTo_StateOrProvince)
{
ApplicationArea = Suite;
Caption = 'Bill To State/Province';
Importance = Additional;
}
field(BillTo_Country; Rec.BillTo_Country)
{
ApplicationArea = Suite;
Caption = 'Bill To Country/Region';
Importance = Additional;
}
field(BillTo_PostalCode; Rec.BillTo_PostalCode)
{
ApplicationArea = Suite;
Caption = 'Bill To ZIP/Postal Code';
Importance = Additional;
}
field(BillTo_Telephone; Rec.BillTo_Telephone)
{
ApplicationArea = Suite;
Caption = 'Bill To Phone';
}
field(BillTo_Fax; Rec.BillTo_Fax)
{
ApplicationArea = Suite;
Caption = 'Bill To Fax';
Importance = Additional;
}
}
group(Shipping)
{
Caption = 'Shipping';
field(RequestDeliveryBy; Rec.RequestDeliveryBy)
{
ApplicationArea = Suite;
Caption = 'Requested Delivery Date';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(ShippingMethodCode; Rec.ShippingMethodCodeEnum)
{
ApplicationArea = Suite;
Caption = 'Shipping Method';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(FreightTermsCode; Rec.FreightTermsCodeEnum)
{
ApplicationArea = Suite;
Caption = 'Freight Terms';
}
field(ShipTo_Name; Rec.ShipTo_Name)
{
ApplicationArea = Suite;
Caption = 'Ship To Name';
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(ShipTo_Line1; Rec.ShipTo_Line1)
{
ApplicationArea = Suite;
Caption = 'Ship To Street 1';
Importance = Additional;
ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
}
field(ShipTo_Line2; Rec.ShipTo_Line2)
{
ApplicationArea = Suite;
Caption = 'Ship To Street 2';
Importance = Additional;
}
field(ShipTo_Line3; Rec.ShipTo_Line3)
{
ApplicationArea = Suite;
Caption = 'Ship To Street 3';
Importance = Additional;
}
field(ShipTo_City; Rec.ShipTo_City)
{
ApplicationArea = Suite;
Caption = 'Ship To City';
Importance = Additional;
}
field(ShipTo_StateOrProvince; Rec.ShipTo_StateOrProvince)
{
ApplicationArea = Suite;
Caption = 'Ship To State/Province';
Importance = Additional;
}
field(ShipTo_Country; Rec.ShipTo_Country)
{
ApplicationArea = Suite;
Caption = 'Ship To Country/Region';
Importance = Additional;
}
field(ShipTo_PostalCode; Rec.ShipTo_PostalCode)
{
ApplicationArea = Suite;
Caption = 'Ship To ZIP/Postal Code';
Importance = Additional;
}
field(ShipTo_Telephone; Rec.ShipTo_Telephone)
{
ApplicationArea = Suite;
Caption = 'Ship To Phone';
Importance = Additional;
}
field(ShipTo_Fax; Rec.ShipTo_Fax)
{
ApplicationArea = Suite;
Caption = 'Ship to Fax';
Importance = Additional;
}
field(ShipTo_FreightTermsCode; Rec.ShipTo_FreightTermsCode)
{
ApplicationArea = Suite;
Caption = 'Ship To Freight Terms';
Importance = Additional;
}
}
}
}
actions
{
area(navigation)
{
group(ActionGroupCRM)
{
Caption = 'Dynamics 365 Sales';
Visible = CRMIntegrationEnabled;
action(CRMGoToSalesOrderHyperlink)
{
ApplicationArea = Suite;
Caption = 'Sales Order';
Enabled = CRMIntegrationEnabled;
Image = CoupledOrder;
ToolTip = 'Open the coupled Dynamics 365 Sales sales order.';
Visible = CRMIntegrationEnabled;
trigger OnAction()
var
CRMIntegrationManagement: Codeunit "CRM Integration Management";
begin
HyperLink(CRMIntegrationManagement.GetCRMEntityUrlFromCRMID(DATABASE::"CRM Salesorder", Rec.SalesOrderId));
end;
}
}
group(ActionGroupNAV)
{
Caption = 'Business Central';
Visible = CRMIntegrationEnabled;
action(NAVOpenSalesOrderCard)
{
ApplicationArea = Suite;
Caption = 'Sales Order';
Enabled = CRMIsCoupledToRecord;
Image = "Order";
ToolTip = 'Open the coupled Dynamics 365 Sales sales order.';
Visible = CRMIntegrationEnabled;
trigger OnAction()
var
SalesHeader: Record "Sales Header";
CRMSalesOrderToSalesOrder: Codeunit "CRM Sales Order to Sales Order";
begin
if CRMSalesOrderToSalesOrder.GetCoupledSalesHeader(Rec, SalesHeader) then
PAGE.RunModal(PAGE::"Sales Order", SalesHeader)
else
Message(GetLastErrorText);
RecalculateRecordCouplingStatus();
end;
}
action(CreateInNAV)
{
ApplicationArea = RelationshipMgmt;
Caption = 'Create in Business Central';
Enabled = CRMIntegrationEnabled and (not CRMIsCoupledToRecord);
Image = New;
ToolTip = 'Create a sales order in Dynamics 365 that is coupled to the Dynamics 365 Sales entity.';
trigger OnAction()
var
SalesHeader: Record "Sales Header";
CRMSalesorder: Record "CRM Salesorder";
CRMProductName: Codeunit "CRM Product Name";
CRMIntegrationManagement: Codeunit "CRM Integration Management";
CRMCouplingManagement: Codeunit "CRM Coupling Management";
CRMSalesOrderToSalesOrder: Codeunit "CRM Sales Order to Sales Order";
begin
if Rec.IsEmpty() then
exit;
if BidirectionalSalesOrderIntEnabled then begin
CRMSalesOrder.SetRange(SalesOrderId, Rec.SalesOrderId);
CRMIntegrationManagement.CreateNewRecordsFromSelectedCRMRecords(CRMSalesorder)
end else begin
Session.LogMessage('0000KVP', StrSubstNo(StartingToCreateSalesOrderTelemetryMsg, CRMProductName.CDSServiceName(), Rec.SalesOrderId), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', CrmTelemetryCategoryTok);
if CRMSalesOrderToSalesOrder.CreateInNAV(Rec, SalesHeader) then begin
Session.LogMessage('0000KVQ', StrSubstNo(CommittingAfterCreateSalesOrderTelemetryMsg, CRMProductName.CDSServiceName(), Rec.SalesOrderId), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', CrmTelemetryCategoryTok);
Commit();
CRMIsCoupledToRecord := CRMCouplingManagement.IsRecordCoupledToNAV(Rec.SalesOrderId, DATABASE::"Sales Header") and CRMIntegrationEnabled;
PAGE.RunModal(PAGE::"Sales Order", SalesHeader);
end;
end;
RecalculateRecordCouplingStatus();
end;
}
}
}
area(Promoted)
{
group(Category_Process)
{
Caption = 'Process';
actionref(CreateInNAV_Promoted; CreateInNAV)
{
}
}
}
}
trigger OnAfterGetCurrRecord()
begin
RecalculateRecordCouplingStatus();
end;
trigger OnOpenPage()
var
CRMConnectionSetup: Record "CRM Connection Setup";
begin
CRMIntegrationEnabled := CRMConnectionSetup.IsEnabled();
BidirectionalSalesOrderIntEnabled := CRMConnectionSetup.IsBidirectionalSalesOrderIntEnabled();
SetCRMAccountAndContactName();
end;
var
CRMIntegrationEnabled: Boolean;
CRMIsCoupledToRecord: Boolean;
BidirectionalSalesOrderIntEnabled: Boolean;
CRMAccountName: Text[160];
CRMContactName: Text[160];
CrmTelemetryCategoryTok: Label 'AL CRM Integration', Locked = true;
StartingToCreateSalesOrderTelemetryMsg: Label 'Starting to create sales order from %1 order %2 via a page action.', Locked = true;
CommittingAfterCreateSalesOrderTelemetryMsg: Label 'Committing after processing %1 order %2 via a page action.', Locked = true;
local procedure SetCRMAccountAndContactName()
var
CRMAccount: Record "CRM Account";
CRMContact: Record "CRM Contact";
CRMSalesOrderToSalesOrder: Codeunit "CRM Sales Order to Sales Order";
begin
if CRMSalesOrderToSalesOrder.GetCRMAccountOfCRMSalesOrder(Rec, CRMAccount) then
CRMAccountName := CRMAccount.Name;
if CRMSalesOrderToSalesOrder.GetCRMContactOfCRMSalesOrder(Rec, CRMContact) then
CRMContactName := CRMContact.FullName;
end;
local procedure RecalculateRecordCouplingStatus()
var
CRMSalesOrderToSalesOrder: Codeunit "CRM Sales Order to Sales Order";
begin
CRMIsCoupledToRecord := CRMIntegrationEnabled;
if CRMIsCoupledToRecord then
CRMIsCoupledToRecord := CRMSalesOrderToSalesOrder.CRMIsCoupledToValidRecord(Rec, DATABASE::"Sales Header");
end;
}