Page 5353 CRM Sales Order List, source in 29

Source29

src/Layers/W1/BaseApp/Integration/D365Sales/CRMSalesOrderList.Page.al322 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 5353 "CRM Sales Order List"
{
    ApplicationArea = Suite;
    Caption = 'Sales Orders - Microsoft Dynamics 365 Sales';
    CardPageID = "CRM Sales Order";
    Editable = false;
    PageType = List;
    SourceTable = "CRM Salesorder";
    UsageCategory = Lists;

    layout
    {
        area(content)
        {
            repeater(Group)
            {
                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(TransactionCurrencyIdName; Rec.TransactionCurrencyIdName)
                {
                    ApplicationArea = Suite;
                    Caption = 'Transaction Currency';
                    ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
                }
                field(PriceLevelIdName; Rec.PriceLevelIdName)
                {
                    ApplicationArea = Suite;
                    Caption = 'Price List';
                }
                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(StateCode; Rec.StateCode)
                {
                    ApplicationArea = Suite;
                    Caption = 'Status';
                    ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
                }
                field(StatusCode; Rec.StatusCode)
                {
                    ApplicationArea = Suite;
                    Caption = 'Status Reason';
                    ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
                }
                field(RequestDeliveryBy; Rec.RequestDeliveryBy)
                {
                    ApplicationArea = Suite;
                    Caption = 'Requested Delivery Date';
                    ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
                }
                field(DateFulfilled; Rec.DateFulfilled)
                {
                    ApplicationArea = Suite;
                    Caption = 'Date Fulfilled';
                }
                field(ShippingMethodCode; Rec.ShippingMethodCodeEnum)
                {
                    ApplicationArea = Suite;
                    Caption = 'Shipping Method';
                    ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
                }
                field(PaymentTermsCode; Rec.PaymentTermsCodeEnum)
                {
                    ApplicationArea = Suite;
                    Caption = 'Payment Terms';
                }
                field(FreightTermsCode; Rec.FreightTermsCodeEnum)
                {
                    ApplicationArea = Suite;
                    Caption = 'Freight Terms';
                }
                field(BillTo_Composite; Rec.BillTo_Composite)
                {
                    ApplicationArea = Suite;
                    Caption = 'Bill To Address';
                }
                field(WillCall; Rec.WillCall)
                {
                    ApplicationArea = Suite;
                    Caption = 'Ship To';
                    ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
                }
                field(ShipTo_Composite; Rec.ShipTo_Composite)
                {
                    ApplicationArea = Suite;
                    Caption = 'Ship To Address';
                    ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
                }
                field(OpportunityIdName; Rec.OpportunityIdName)
                {
                    ApplicationArea = Suite;
                    Caption = 'Opportunity';
                }
                field(QuoteIdName; Rec.QuoteIdName)
                {
                    ApplicationArea = Suite;
                    Caption = 'Quote';
                    ToolTip = 'Specifies information related to the Dynamics 365 Sales connection. ';
                }
                field(ContactIdName; Rec.ContactIdName)
                {
                    ApplicationArea = Suite;
                    Caption = 'Contact';
                }
            }
        }
    }

    actions
    {
        area(navigation)
        {
            group(ActionGroupCRM)
            {
                Caption = 'Dynamics 365 Sales';
                action(CRMGoToSalesOrder)
                {
                    ApplicationArea = Suite;
                    Caption = 'Sales Order';
                    Enabled = HasRecords;
                    Image = CoupledOrder;
                    RunPageOnRec = true;
                    ToolTip = 'Open the coupled Dynamics 365 Sales sales order.';

                    trigger OnAction()
                    var
                        CRMIntegrationManagement: Codeunit "CRM Integration Management";
                    begin
                        if Rec.IsEmpty() then
                            exit;
                        HyperLink(CRMIntegrationManagement.GetCRMEntityUrlFromCRMID(DATABASE::"CRM Salesorder", Rec.SalesOrderId));
                    end;
                }
            }
            group(ActionGroupNAV)
            {
                Caption = 'Business Central';
                Visible = CRMIntegrationEnabled;
                action(CreateInNAV)
                {
                    ApplicationArea = Suite;
                    Caption = 'Create in Business Central';
                    Enabled = (BidirectionalSalesOrderIntEnabled) or (not BidirectionalSalesOrderIntEnabled and (HasRecords and CRMIntegrationEnabled));
                    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";
                        CRMSalesOrderToSalesOrder: Codeunit "CRM Sales Order to Sales Order";
                        CRMIntegrationManagement: Codeunit "CRM Integration Management";
                    begin
                        if Rec.IsEmpty() then
                            exit;

                        if BidirectionalSalesOrderIntEnabled then begin
                            CurrPage.SetSelectionFilter(CRMSalesOrder);
                            CRMIntegrationManagement.CreateNewRecordsFromSelectedCRMRecords(CRMSalesorder);
                        end else begin
                            Session.LogMessage('0000DFA', StrSubstNo(StartingToCreateSalesOrderTelemetryMsg, CRMProductName.CDSServiceName(), Rec.SalesOrderId), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', CrmTelemetryCategoryTok);
                            if CRMSalesOrderToSalesOrder.CreateInNAV(Rec, SalesHeader) then begin
                                Session.LogMessage('0000DFB', StrSubstNo(CommittingAfterCreateSalesOrderTelemetryMsg, CRMProductName.CDSServiceName(), Rec.SalesOrderId), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', CrmTelemetryCategoryTok);
                                Commit();
                                PAGE.RunModal(PAGE::"Sales Order", SalesHeader);
                            end;
                        end;
                    end;
                }
                action(ShowOnlyUncoupled)
                {
                    ApplicationArea = Suite;
                    Caption = 'Hide Coupled Sales Orders';
                    Image = FilterLines;
                    ToolTip = 'Do not show coupled sales orders.';
                    Visible = BidirectionalSalesOrderIntEnabled;

                    trigger OnAction()
                    begin
                        Rec.MarkedOnly(true);
                    end;
                }
                action(ShowAll)
                {
                    ApplicationArea = Suite;
                    Caption = 'Show Coupled Sales Orders';
                    Image = ClearFilter;
                    ToolTip = 'Show coupled sales orders.';
                    Visible = BidirectionalSalesOrderIntEnabled;

                    trigger OnAction()
                    begin
                        Rec.MarkedOnly(false);
                    end;
                }
            }
        }
        area(Promoted)
        {
            group(Category_Process)
            {
                Caption = 'Process';

                actionref(CreateInNAV_Promoted; CreateInNAV)
                {
                }
                actionref(ShowOnlyUncoupled_Promoted; ShowOnlyUncoupled)
                {
                }
                actionref(ShowAll_Promoted; ShowAll)
                {
                }
            }
        }
    }

    trigger OnAfterGetRecord()
    var
        CRMConnectionSetup: Record "CRM Connection Setup";
        CRMIntegrationRecord: Record "CRM Integration Record";
        RecordID: RecordID;
    begin
        if CRMConnectionSetup.IsBidirectionalSalesOrderIntEnabled() then
            if CRMIntegrationRecord.FindRecordIDFromID(Rec.SalesOrderId, Database::"Sales Header", RecordID) then
                if CurrentlyCoupledCRMSalesorder.SalesOrderId = Rec.SalesOrderId then begin
                    Coupled := 'Current';
                    FirstColumnStyle := 'Strong';
                    Rec.Mark(true);
                end else begin
                    Coupled := 'Yes';
                    FirstColumnStyle := 'Subordinate';
                    Rec.Mark(false);
                end
            else begin
                Coupled := 'No';
                FirstColumnStyle := 'None';
                Rec.Mark(true);
            end;
    end;

    trigger OnAfterGetCurrRecord()
    begin
        HasRecords := not IsNullGuid(Rec.SalesOrderId);
    end;

    trigger OnInit()
    begin
        CODEUNIT.Run(CODEUNIT::"CRM Integration Management");
    end;

    trigger OnOpenPage()
    var
        CDSCompany: Record "CDS Company";
        CRMConnectionSetup: Record "CRM Connection Setup";
        LookupCRMTables: Codeunit "Lookup CRM Tables";
        MultipleCompanies: Boolean;
    begin
        BidirectionalSalesOrderIntEnabled := CRMConnectionSetup.IsBidirectionalSalesOrderIntEnabled();
        MultipleCompanies := (CDSCompany.Count > 1);
        if BidirectionalSalesOrderIntEnabled then begin
            Rec.FilterGroup(4);
            Rec.SetView(LookupCRMTables.GetIntegrationTableMappingView(DATABASE::"CRM Salesorder"));
            Rec.FilterGroup(0);
        end else begin
            if MultipleCompanies then begin
                Rec.FilterGroup(4);
                Rec.SetView(LookupCRMTables.GetIntegrationTableMappingView(DATABASE::"CRM Salesorder"));
            end;
            Rec.FilterGroup(2);
            Rec.SetRange(StateCode, Rec.StateCode::Submitted);
            Rec.SetFilter(LastBackofficeSubmit, '%1|%2', 0D, DMY2Date(1, 1, 1900));
            Rec.FilterGroup(0);
        end;
        CRMIntegrationEnabled := CRMConnectionSetup.IsEnabled();
    end;

    var
        CurrentlyCoupledCRMSalesorder: Record "CRM Salesorder";
        CRMProductName: Codeunit "CRM Product Name";
        CRMIntegrationEnabled: Boolean;
        BidirectionalSalesOrderIntEnabled: Boolean;
        HasRecords: Boolean;
        Coupled: Text;
        FirstColumnStyle: Text;
        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;

    procedure SetCurrentlyCoupledCRMSalesorder(CRMSalesorder: Record "CRM Salesorder")
    begin
        CurrentlyCoupledCRMSalesorder := CRMSalesorder;
    end;
}