Codeunit 5332 Lookup CRM Tables, source in 29

Source29

src/Layers/W1/BaseApp/Integration/Dataverse/LookupCRMTables.Codeunit.al518 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.Dataverse;

using Microsoft.Integration.D365Sales;
using Microsoft.Integration.SyncEngine;
using System.Reflection;

codeunit 5332 "Lookup CRM Tables"
{

    trigger OnRun()
    begin
    end;

    procedure Lookup(CRMTableID: Integer; NAVTableId: Integer; SavedCRMId: Guid; var CRMId: Guid): Boolean
    var
        IntTableFilter: Text;
        Handled: Boolean;
    begin
        IntTableFilter := GetIntegrationTableFilter(CRMTableID, NAVTableId);

        OnLookupCRMTables(CRMTableID, NAVTableId, SavedCRMId, CRMId, IntTableFilter, Handled);
        if Handled then
            exit(true);

        case CRMTableID of
            DATABASE::"CRM Account":
                exit(LookupCRMAccount(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Contact":
                exit(LookupCRMContact(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Systemuser":
                exit(LookupCRMSystemuser(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Transactioncurrency":
                exit(LookupCRMCurrency(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Pricelevel":
                exit(LookupCRMPriceList(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Product":
                exit(LookupCRMProduct(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Uomschedule":
                exit(LookupCRMUomschedule(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Opportunity":
                exit(LookupCRMOpportunity(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Quote":
                exit(LookupCRMQuote(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Uom":
                exit(LookupCRMUom(SavedCRMId, CRMId, IntTableFilter));
            DATABASE::"CRM Salesorder":
                exit(LookupCRMSalesorder(SavedCRMId, CRMId, IntTableFilter));
        end;
        exit(false);
    end;

    procedure LookupOptions(CRMTableID: Integer; NAVTableId: Integer; SavedCRMOptionId: Integer; var CRMOptionId: Integer; var CRMOptionCode: Text[250]): Boolean
    var
        IntTableFilter: Text;
        Handled: Boolean;
    begin
        IntTableFilter := GetIntegrationTableFilter(CRMTableID, NAVTableId);

        OnLookupCRMOption(CRMTableID, NAVTableId, SavedCRMOptionId, CRMOptionId, CRMOptionCode, IntTableFilter, Handled);
        if Handled then
            exit(true);

        case CRMTableID of
            DATABASE::"CRM Payment Terms":
                exit(LookupCRMPaymentTerm(SavedCRMOptionId, CRMOptionId, CRMOptionCode, IntTableFilter));
            DATABASE::"CRM Freight Terms":
                exit(LookupCRMFreightTerm(SavedCRMOptionId, CRMOptionId, CRMOptionCode, IntTableFilter));
            DATABASE::"CRM Shipping Method":
                exit(LookupCRMShippingMethod(SavedCRMOptionId, CRMOptionId, CRMOptionCode, IntTableFilter));
        end;
        exit(false);
    end;

    local procedure LookupCRMAccount(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMAccount: Record "CRM Account";
        OriginalCRMAccount: Record "CRM Account";
        CRMAccountList: Page "CRM Account List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMAccount.Get(CRMId) then
                CRMAccountList.SetRecord(CRMAccount);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMAccount.Get(SavedCRMId) then
                    CRMAccountList.SetCurrentlyCoupledCRMAccount(OriginalCRMAccount);
        end;
        CRMAccount.SetView(IntTableFilter);
        CRMAccountList.SetTableView(CRMAccount);
        CRMAccountList.LookupMode(true);
        Commit();
        if CRMAccountList.RunModal() = ACTION::LookupOK then begin
            CRMAccountList.GetRecord(CRMAccount);
            CRMId := CRMAccount.AccountId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMContact(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMContact: Record "CRM Contact";
        OriginalCRMContact: Record "CRM Contact";
        CRMContactList: Page "CRM Contact List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMContact.Get(CRMId) then
                CRMContactList.SetRecord(CRMContact);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMContact.Get(SavedCRMId) then
                    CRMContactList.SetCurrentlyCoupledCRMContact(OriginalCRMContact);
        end;
        CRMContact.SetView(IntTableFilter);
        CRMContactList.SetTableView(CRMContact);
        CRMContactList.LookupMode(true);
        Commit();
        if CRMContactList.RunModal() = ACTION::LookupOK then begin
            CRMContactList.GetRecord(CRMContact);
            CRMId := CRMContact.ContactId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMSystemuser(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMSystemuser: Record "CRM Systemuser";
        OriginalCRMSystemuser: Record "CRM Systemuser";
        CRMSystemuserList: Page "CRM Systemuser List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMSystemuser.Get(CRMId) then
                CRMSystemuserList.SetRecord(CRMSystemuser);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMSystemuser.Get(SavedCRMId) then
                    CRMSystemuserList.SetCurrentlyCoupledCRMSystemuser(OriginalCRMSystemuser);
        end;
        CRMSystemuser.SetView(IntTableFilter);
        CRMSystemuserList.SetTableView(CRMSystemuser);
        CRMSystemuserList.LookupMode(true);
        Commit();
        if CRMSystemuserList.RunModal() = ACTION::LookupOK then begin
            CRMSystemuserList.GetRecord(CRMSystemuser);
            CRMId := CRMSystemuser.SystemUserId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMCurrency(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMTransactioncurrency: Record "CRM Transactioncurrency";
        OriginalCRMTransactioncurrency: Record "CRM Transactioncurrency";
        CRMTransactionCurrencyList: Page "CRM TransactionCurrency List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMTransactioncurrency.Get(CRMId) then
                CRMTransactionCurrencyList.SetRecord(CRMTransactioncurrency);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMTransactioncurrency.Get(SavedCRMId) then
                    CRMTransactionCurrencyList.SetCurrentlyCoupledCRMTransactioncurrency(OriginalCRMTransactioncurrency);
        end;
        CRMTransactioncurrency.SetView(IntTableFilter);
        CRMTransactionCurrencyList.SetTableView(CRMTransactioncurrency);
        CRMTransactionCurrencyList.LookupMode(true);
        Commit();
        if CRMTransactionCurrencyList.RunModal() = ACTION::LookupOK then begin
            CRMTransactionCurrencyList.GetRecord(CRMTransactioncurrency);
            CRMId := CRMTransactioncurrency.TransactionCurrencyId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMPriceList(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMPricelevel: Record "CRM Pricelevel";
        OriginalCRMPricelevel: Record "CRM Pricelevel";
        CRMPricelevelList: Page "CRM Pricelevel List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMPricelevel.Get(CRMId) then
                CRMPricelevelList.SetRecord(CRMPricelevel);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMPricelevel.Get(SavedCRMId) then
                    CRMPricelevelList.SetCurrentlyCoupledCRMPricelevel(OriginalCRMPricelevel);
        end;
        CRMPricelevel.SetView(IntTableFilter);
        CRMPricelevelList.SetTableView(CRMPricelevel);
        CRMPricelevelList.LookupMode(true);
        Commit();
        if CRMPricelevelList.RunModal() = ACTION::LookupOK then begin
            CRMPricelevelList.GetRecord(CRMPricelevel);
            CRMId := CRMPricelevel.PriceLevelId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMProduct(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMProduct: Record "CRM Product";
        OriginalCRMProduct: Record "CRM Product";
        CRMProductList: Page "CRM Product List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMProduct.Get(CRMId) then
                CRMProductList.SetRecord(CRMProduct);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMProduct.Get(SavedCRMId) then
                    CRMProductList.SetCurrentlyCoupledCRMProduct(OriginalCRMProduct);
        end;
        CRMProduct.SetView(IntTableFilter);
        CRMProductList.SetTableView(CRMProduct);
        CRMProductList.LookupMode(true);
        Commit();
        if CRMProductList.RunModal() = ACTION::LookupOK then begin
            CRMProductList.GetRecord(CRMProduct);
            CRMId := CRMProduct.ProductId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMUomschedule(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMUomschedule: Record "CRM Uomschedule";
        OriginalCRMUomschedule: Record "CRM Uomschedule";
        CRMUnitGroupList: Page "CRM UnitGroup List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMUomschedule.Get(CRMId) then
                CRMUnitGroupList.SetRecord(CRMUomschedule);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMUomschedule.Get(SavedCRMId) then
                    CRMUnitGroupList.SetCurrentlyCoupledCRMUomschedule(OriginalCRMUomschedule);
        end;
        CRMUomschedule.SetView(IntTableFilter);
        CRMUnitGroupList.SetTableView(CRMUomschedule);
        CRMUnitGroupList.LookupMode(true);
        Commit();
        if CRMUnitGroupList.RunModal() = ACTION::LookupOK then begin
            CRMUnitGroupList.GetRecord(CRMUomschedule);
            CRMId := CRMUomschedule.UoMScheduleId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMOpportunity(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMOpportunity: Record "CRM Opportunity";
        OriginalCRMOpportunity: Record "CRM Opportunity";
        CRMOpportunityList: Page "CRM Opportunity List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMOpportunity.Get(CRMId) then
                CRMOpportunityList.SetRecord(CRMOpportunity);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMOpportunity.Get(SavedCRMId) then
                    CRMOpportunityList.SetCurrentlyCoupledCRMOpportunity(OriginalCRMOpportunity);
        end;
        CRMOpportunity.SetView(IntTableFilter);
        CRMOpportunityList.SetTableView(CRMOpportunity);
        CRMOpportunityList.LookupMode(true);
        Commit();
        if CRMOpportunityList.RunModal() = ACTION::LookupOK then begin
            CRMOpportunityList.GetRecord(CRMOpportunity);
            CRMId := CRMOpportunity.OpportunityId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMQuote(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMQuote: Record "CRM Quote";
        OriginalCRMQuote: Record "CRM Quote";
        CRMSalesQuoteList: Page "CRM Sales Quote List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMQuote.Get(CRMId) then
                CRMSalesQuoteList.SetRecord(CRMQuote);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMQuote.Get(SavedCRMId) then
                    CRMSalesQuoteList.SetCurrentlyCoupledCRMQuote(OriginalCRMQuote);
        end;
        CRMQuote.SetView(IntTableFilter);
        CRMSalesQuoteList.SetTableView(CRMQuote);
        CRMSalesQuoteList.LookupMode(true);
        Commit();
        if CRMSalesQuoteList.RunModal() = ACTION::LookupOK then begin
            CRMSalesQuoteList.GetRecord(CRMQuote);
            CRMId := CRMQuote.QuoteId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMUom(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMUom: Record "CRM Uom";
        OriginalCRMUom: Record "CRM Uom";
        CRMUnitList: Page "CRM Unit List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMUom.Get(CRMId) then
                CRMUnitList.SetRecord(CRMUom);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMUom.Get(SavedCRMId) then
                    CRMUnitList.SetCurrentlyCoupledCRMUnit(OriginalCRMUom);
        end;
        CRMUom.SetView(IntTableFilter);
        CRMUnitList.SetTableView(CRMUom);
        CRMUnitList.LookupMode(true);
        Commit();
        if CRMUnitList.RunModal() = ACTION::LookupOK then begin
            CRMUnitList.GetRecord(CRMUom);
            CRMId := CRMUom.UoMId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMSalesorder(SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text): Boolean
    var
        CRMSalesorder: Record "CRM Salesorder";
        OriginalCRMSalesorder: Record "CRM Salesorder";
        CRMSalesOrderList: Page "CRM Sales Order List";
    begin
        if not IsNullGuid(CRMId) then begin
            if CRMSalesorder.Get(CRMId) then
                CRMSalesOrderList.SetRecord(CRMSalesorder);
            if not IsNullGuid(SavedCRMId) then
                if OriginalCRMSalesorder.Get(SavedCRMId) then
                    CRMSalesOrderList.SetCurrentlyCoupledCRMSalesorder(OriginalCRMSalesorder);
        end;
        CRMSalesorder.SetView(IntTableFilter);
        CRMSalesOrderList.SetTableView(CRMSalesorder);
        CRMSalesOrderList.LookupMode(true);
        Commit();
        if CRMSalesOrderList.RunModal() = ACTION::LookupOK then begin
            CRMSalesOrderList.GetRecord(CRMSalesorder);
            CRMId := CRMSalesorder.SalesOrderId;
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMPaymentTerm(SavedCRMId: Integer; var CRMOptionId: Integer; var CRMOptionCode: Text[250]; IntTableFilter: Text): Boolean
    var
        CRMPaymentTerms: Record "CRM Payment Terms";
        OriginalCRMPaymentTerms: Record "CRM Payment Terms";
        CRMPaymentTermsList: Page "CRM Payment Terms List";
    begin
        if CRMOptionId <> 0 then begin
            CRMPaymentTermsList.LoadRecords();
            CRMPaymentTerms := CRMPaymentTermsList.GetRec(CRMOptionId);
            if CRMPaymentTerms."Option Id" <> 0 then
                CRMPaymentTermsList.SetRecord(CRMPaymentTerms);
            if SavedCRMId <> 0 then begin
                OriginalCRMPaymentTerms := CRMPaymentTermsList.GetRec(SavedCRMId);
                if OriginalCRMPaymentTerms."Option Id" <> 0 then
                    CRMPaymentTermsList.SetCurrentlyMappedCRMPaymentTermOptionId(SavedCRMId);
            end;
        end;
        CRMPaymentTerms.SetView(IntTableFilter);
        CRMPaymentTermsList.SetTableView(CRMPaymentTerms);
        CRMPaymentTermsList.LookupMode(true);
        Commit();
        if CRMPaymentTermsList.RunModal() = ACTION::LookupOK then begin
            CRMPaymentTermsList.GetRecord(CRMPaymentTerms);
            CRMOptionId := CRMPaymentTerms."Option Id";
            CRMOptionCode := CRMPaymentTerms."Code";
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMFreightTerm(SavedCRMId: Integer; var CRMOptionId: Integer; var CRMOptionCode: Text[250]; IntTableFilter: Text): Boolean
    var
        CRMFreightTerms: Record "CRM Freight Terms";
        OriginalCRMFreightTerms: Record "CRM Freight Terms";
        CRMFreightTermsList: Page "CRM Freight Terms List";
    begin
        if CRMOptionId <> 0 then begin
            CRMFreightTermsList.LoadRecords();
            CRMFreightTerms := CRMFreightTermsList.GetRec(CRMOptionId);
            if CRMFreightTerms."Option Id" <> 0 then
                CRMFreightTermsList.SetRecord(CRMFreightTerms);
            if SavedCRMId <> 0 then begin
                OriginalCRMFreightTerms := CRMFreightTermsList.GetRec(SavedCRMId);
                if OriginalCRMFreightTerms."Option Id" <> 0 then
                    CRMFreightTermsList.SetCurrentlyMappedCRMFreightTermOptionId(SavedCRMId);
            end;
        end;
        CRMFreightTerms.SetView(IntTableFilter);
        CRMFreightTermsList.SetTableView(CRMFreightTerms);
        CRMFreightTermsList.LookupMode(true);
        Commit();
        if CRMFreightTermsList.RunModal() = ACTION::LookupOK then begin
            CRMFreightTermsList.GetRecord(CRMFreightTerms);
            CRMOptionId := CRMFreightTerms."Option Id";
            CRMOptionCode := CRMFreightTerms."Code";
            exit(true);
        end;
        exit(false);
    end;

    local procedure LookupCRMShippingMethod(SavedCRMId: Integer; var CRMOptionId: Integer; var CRMOptionCode: Text[250]; IntTableFilter: Text): Boolean
    var
        CRMShippingMethod: Record "CRM Shipping Method";
        OriginalCRMShippingMethod: Record "CRM Shipping Method";
        CRMShippingMethodList: Page "CRM Shipping Method List";
    begin
        if CRMOptionId <> 0 then begin
            CRMShippingMethodList.LoadRecords();
            CRMShippingMethod := CRMShippingMethodList.GetRec(CRMOptionId);
            if CRMShippingMethod."Option Id" <> 0 then
                CRMShippingMethodList.SetRecord(CRMShippingMethod);
            if SavedCRMId <> 0 then begin
                OriginalCRMShippingMethod := CRMShippingMethodList.GetRec(SavedCRMId);
                if OriginalCRMShippingMethod."Option Id" <> 0 then
                    CRMShippingMethodList.SetCurrentlyMappedCRMPShippingMethodOptionId(SavedCRMId);
            end;
        end;
        CRMShippingMethod.SetView(IntTableFilter);
        CRMShippingMethodList.SetTableView(CRMShippingMethod);
        CRMShippingMethodList.LookupMode(true);
        Commit();
        if CRMShippingMethodList.RunModal() = ACTION::LookupOK then begin
            CRMShippingMethodList.GetRecord(CRMShippingMethod);
            CRMOptionId := CRMShippingMethod."Option Id";
            CRMOptionCode := CRMShippingMethod."Code";
            exit(true);
        end;
        exit(false);
    end;

    procedure GetIntegrationTableFilter(CRMTableId: Integer; NAVTableId: Integer): Text
    var
        IntegrationTableMapping: Record "Integration Table Mapping";
    begin
        IntegrationTableMapping.SetRange(Type, IntegrationTableMapping.Type::Dataverse);
        IntegrationTableMapping.SetRange("Synch. Codeunit ID", CODEUNIT::"CRM Integration Table Synch.");
        IntegrationTableMapping.SetRange("Table ID", NAVTableId);
        IntegrationTableMapping.SetRange("Integration Table ID", CRMTableId);
        IntegrationTableMapping.SetRange("Delete After Synchronization", false);
        if IntegrationTableMapping.FindFirst() then
            exit(IntegrationTableMapping.GetIntegrationTableFilter());
        exit('');
    end;

    procedure GetIntegrationTableMappingView(TableId: Integer): Text
    var
        "Field": Record "Field";
        IntegrationTableMapping: Record "Integration Table Mapping";
        RecRef: array[2] of RecordRef;
        FieldRef: array[2] of FieldRef;
        FieldFilter: array[2] of Text;
        NoFilter: Dictionary of [Integer, Boolean];
    begin
        RecRef[1].Open(TableId);
        RecRef[2].Open(TableId);

        IntegrationTableMapping.SetRange(Type, IntegrationTableMapping.Type::Dataverse);
        IntegrationTableMapping.SetRange("Synch. Codeunit ID", CODEUNIT::"CRM Integration Table Synch.");
        IntegrationTableMapping.SetRange("Integration Table ID", TableId);
        IntegrationTableMapping.SetRange("Delete After Synchronization", false);
        IntegrationTableMapping.SetRange("Int. Table UID Field Type", Field.Type::GUID);
        if IntegrationTableMapping.FindSet() then
            repeat
                FieldFilter[2] := IntegrationTableMapping.GetIntegrationTableFilter();
                if FieldFilter[2] <> '' then begin
                    RecRef[2].SetView(FieldFilter[2]);

                    Field.SetRange(TableNo, TableId);
                    Field.SetFilter(ObsoleteState, '<>%1', Field.ObsoleteState::Removed);
                    if Field.FindSet() then
                        repeat
                            if not NoFilter.ContainsKey(Field."No.") then begin
                                FieldRef[1] := RecRef[1].Field(Field."No.");
                                FieldRef[2] := RecRef[2].Field(Field."No.");

                                FieldFilter[1] := FieldRef[1].GetFilter;
                                FieldFilter[2] := FieldRef[2].GetFilter;

                                if FieldFilter[2] <> '' then
                                    if FieldFilter[1] = '' then
                                        FieldRef[1].SetFilter(FieldFilter[2])
                                    else
                                        FieldRef[1].SetFilter(StrSubstNo('%1|%2', FieldFilter[1], FieldFilter[2]))
                                else begin
                                    NoFilter.Add(Field."No.", true);
                                    FieldRef[1].SetFilter('');
                                end;
                            end;
                        until Field.Next() = 0;
                end;
            until IntegrationTableMapping.Next() = 0;

        exit(RecRef[1].GetView(false));
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookupCRMTables(CRMTableID: Integer; NAVTableId: Integer; SavedCRMId: Guid; var CRMId: Guid; IntTableFilter: Text; var Handled: Boolean)
    begin
    end;

    [IntegrationEvent(false, false)]
    local procedure OnLookupCRMOption(CRMTableID: Integer; NAVTableId: Integer; SavedCRMOptionId: Integer; var CRMOptionId: Integer; var CRMOptionCode: Text[250]; IntTableFilter: Text; var Handled: Boolean)
    begin
    end;
}