Codeunit 1541 Workflow Webhook Events, source in 29

Source29

src/Layers/W1/BaseApp/System/Workflow/WorkflowWebhookEvents.Codeunit.al262 lines, Copyright (c) Microsoft Corporation. MIT

namespace System.Automation;

using Microsoft.Finance.GeneralLedger.Journal;
using Microsoft.Inventory.Item;
using Microsoft.Inventory.Journal;
using Microsoft.Inventory.Requisition;
using Microsoft.Purchases.Document;
using Microsoft.Purchases.Vendor;
using Microsoft.Sales.Customer;
using Microsoft.Sales.Document;
using Microsoft.Upgrade;
using System.Upgrade;

codeunit 1541 "Workflow Webhook Events"
{

    trigger OnRun()
    begin
    end;

    var
        WorkflowWebhookResponseReceivedEventTxt: Label 'A response is received from a subscribed webhook.';

    procedure WorkflowWebhookResponseReceivedEventCode(): Code[128]
    begin
        exit('WORKFLOWWEBHOOKRESPONSERECEIVEDEVENT');
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Workflow Event Handling", 'OnAddWorkflowEventPredecessorsToLibrary', '', false, false)]
    local procedure AddWorkflowWebhookEventHierarchiesToLibrary(EventFunctionName: Code[128])
    var
        WorkflowEventHandling: Codeunit "Workflow Event Handling";
    begin
        case EventFunctionName of
            WorkflowWebhookResponseReceivedEventCode():
                begin
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendCustomerForApprovalCode());
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendGeneralJournalBatchForApprovalCode());
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendGeneralJournalLineForApprovalCode());
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendItemJournalBatchForApprovalCode());
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendRequisitionWkshBatchForApprovalCode());
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendItemForApprovalCode());
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendPurchaseDocForApprovalCode());
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendSalesDocForApprovalCode());
                    WorkflowEventHandling.AddEventPredecessor(WorkflowWebhookResponseReceivedEventCode(),
                      WorkflowEventHandling.RunWorkflowOnSendVendorForApprovalCode());
                end;
        end;
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Workflow Event Handling", 'OnAddWorkflowEventsToLibrary', '', false, false)]
    local procedure AddWorkflowWebhookEventsToLibrary()
    var
        WorkflowEventHandling: Codeunit "Workflow Event Handling";
    begin
        WorkflowEventHandling.AddEventToLibrary(WorkflowWebhookResponseReceivedEventCode(), DATABASE::"Workflow Webhook Entry",
          WorkflowWebhookResponseReceivedEventTxt, 0, false);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Workflow Event Handling", 'OnAddWorkflowTableRelationsToLibrary', '', false, false)]
    local procedure AddWorkflowWebhookTableRelationsToLibrary()
    var
        DummyCustomer: Record Customer;
        DummyItem: Record Item;
        DummyGenJournalBatch: Record "Gen. Journal Batch";
        DummyGenJournalLine: Record "Gen. Journal Line";
        DummyItemJournalBatch: Record "Item Journal Batch";
        DummyRequisitionWkshName: Record "Requisition Wksh. Name";
        DummyPurchaseHeader: Record "Purchase Header";
        DummySalesHeader: Record "Sales Header";
        DummyVendor: Record Vendor;
        DummyWorkflowWebhookEntry: Record "Workflow Webhook Entry";
        WorkflowSetup: Codeunit "Workflow Setup";
    begin
        WorkflowSetup.InsertTableRelation(DATABASE::Customer, DummyCustomer.FieldNo(SystemId),
          DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        WorkflowSetup.InsertTableRelation(DATABASE::"Gen. Journal Batch", DummyGenJournalBatch.FieldNo(SystemId),
          DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        WorkflowSetup.InsertTableRelation(DATABASE::"Gen. Journal Line", DummyGenJournalLine.FieldNo(SystemId),
          DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        WorkflowSetup.InsertTableRelation(Database::"Item Journal Batch", DummyItemJournalBatch.FieldNo(SystemId),
          Database::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        WorkflowSetup.InsertTableRelation(Database::"Requisition Wksh. Name", DummyRequisitionWkshName.FieldNo(SystemId),
          Database::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        WorkflowSetup.InsertTableRelation(DATABASE::Item, DummyItem.FieldNo(SystemId),
          DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        WorkflowSetup.InsertTableRelation(DATABASE::"Purchase Header", DummyPurchaseHeader.FieldNo(SystemId),
          DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        WorkflowSetup.InsertTableRelation(DATABASE::"Sales Header", DummySalesHeader.FieldNo(SystemId),
          DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        WorkflowSetup.InsertTableRelation(DATABASE::Vendor, DummyVendor.FieldNo(SystemId),
          DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));

        CleanupOldIntegrationIdsTableRelation();
    end;

    procedure CleanupOldIntegrationIdsTableRelation()
    var
        DummyCustomer: Record Customer;
        DummyItem: Record Item;
        DummyGenJournalBatch: Record "Gen. Journal Batch";
        DummyGenJournalLine: Record "Gen. Journal Line";
        DummyItemJournalBatch: Record "Item Journal Batch";
        DummyRequisitionWkshName: Record "Requisition Wksh. Name";
        DummyPurchaseHeader: Record "Purchase Header";
        DummySalesHeader: Record "Sales Header";
        DummyVendor: Record Vendor;
        DummyWorkflowWebhookEntry: Record "Workflow Webhook Entry";
        UpgradeTag: Codeunit "Upgrade Tag";
        UpgradeTagDefinitions: Codeunit "Upgrade Tag Definitions";
    begin
        CleanupIntegrationRecordTableRelation(DATABASE::Customer, DummyCustomer.FieldNo(SystemId), 8000, DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        CleanupIntegrationRecordTableRelation(DATABASE::"Gen. Journal Batch", DummyGenJournalBatch.FieldNo(SystemId), 8000, DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        CleanupIntegrationRecordTableRelation(DATABASE::"Gen. Journal Line", DummyGenJournalLine.FieldNo(SystemId), 8000, DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        CleanupIntegrationRecordTableRelation(Database::"Item Journal Batch", DummyItemJournalBatch.FieldNo(SystemId), 8000, Database::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        CleanupIntegrationRecordTableRelation(Database::"Requisition Wksh. Name", DummyRequisitionWkshName.FieldNo(SystemId), 8000, Database::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        CleanupIntegrationRecordTableRelation(DATABASE::Item, DummyItem.FieldNo(SystemId), 8000, DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        CleanupIntegrationRecordTableRelation(DATABASE::"Purchase Header", DummyPurchaseHeader.FieldNo(SystemId), 8000, DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        CleanupIntegrationRecordTableRelation(DATABASE::"Sales Header", DummySalesHeader.FieldNo(SystemId), 8000, DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));
        CleanupIntegrationRecordTableRelation(DATABASE::Vendor, DummyVendor.FieldNo(SystemId), 8000, DATABASE::"Workflow Webhook Entry", DummyWorkflowWebhookEntry.FieldNo("Data ID"));

        if not UpgradeTag.HasUpgradeTag(UpgradeTagDefinitions.GetRemoveOldWorkflowTableRelationshipRecordsTag()) then
            UpgradeTag.SetUpgradeTag(UpgradeTagDefinitions.GetRemoveOldWorkflowTableRelationshipRecordsTag());
    end;

    local procedure CleanupIntegrationRecordTableRelation(TableId: Integer; FieldId: Integer; OldFieldId: Integer; RelatedTableId: Integer; RelatedFieldId: Integer)
    var
        WorkflowTableRelation: Record "Workflow - Table Relation";
        OldWorkflowTableRelation: Record "Workflow - Table Relation";
    begin
        // Only cleanup old if the new field exists
        if not WorkflowTableRelation.Get(TableID, FieldId, RelatedTableId, RelatedFieldId) then
            exit;

        if not OldWorkflowTableRelation.Get(TableId, OldFieldId, RelatedTableId, RelatedFieldId) then
            exit;

        OldWorkflowTableRelation.Delete(true);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Workflow Webhook Management", 'OnCancelWorkflow', '', false, false)]
    local procedure HandleOnCancelWorkflow(WorkflowWebhookEntry: Record "Workflow Webhook Entry")
    var
        WorkflowManagement: Codeunit "Workflow Management";
    begin
        WorkflowManagement.HandleEvent(WorkflowWebhookResponseReceivedEventCode(), WorkflowWebhookEntry);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Workflow Webhook Management", 'OnContinueWorkflow', '', false, false)]
    local procedure HandleOnContinueWorkflow(WorkflowWebhookEntry: Record "Workflow Webhook Entry")
    var
        WorkflowManagement: Codeunit "Workflow Management";
    begin
        WorkflowManagement.HandleEvent(WorkflowWebhookResponseReceivedEventCode(), WorkflowWebhookEntry);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Workflow Webhook Management", 'OnRejectWorkflow', '', false, false)]
    local procedure HandleOnRejectWorkflow(WorkflowWebhookEntry: Record "Workflow Webhook Entry")
    var
        WorkflowManagement: Codeunit "Workflow Management";
    begin
        WorkflowManagement.HandleEvent(WorkflowWebhookResponseReceivedEventCode(), WorkflowWebhookEntry);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnCancelCustomerApprovalRequest', '', false, false)]
    local procedure HandleOnCancelCustomerApprovalRequest(var Customer: Record Customer)
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        // Handles the scenario when a Customer is deleted after it's been sent approval
        WorkflowWebhookManagement.FindAndCancel(Customer.RecordId);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnCancelItemApprovalRequest', '', false, false)]
    local procedure HandleOnCancelItemApprovalRequest(var Item: Record Item)
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        // Handles the scenario when an Item is deleted after it's been sent approval
        WorkflowWebhookManagement.FindAndCancel(Item.RecordId);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnCancelGeneralJournalBatchApprovalRequest', '', false, false)]
    local procedure HandleOnCancelGeneralJournalBatchApprovalRequest(var GenJournalBatch: Record "Gen. Journal Batch")
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        // Handles the scenario when a General Journal Batch is deleted after it's been sent approval
        WorkflowWebhookManagement.FindAndCancel(GenJournalBatch.RecordId, true);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnCancelGeneralJournalLineApprovalRequest', '', false, false)]
    local procedure HandleOnCancelGeneralJournalLineApprovalRequest(var GenJournalLine: Record "Gen. Journal Line")
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        // Handles the scenario when a General Journal Line is deleted after it's been sent approval
        WorkflowWebhookManagement.FindAndCancel(GenJournalLine.RecordId, true);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnCancelItemJournalBatchApprovalRequest', '', false, false)]
    local procedure HandleOnCancelItemJournalBatchApprovalRequest(var ItemJournalBatch: Record "Item Journal Batch")
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        // Handles the scenario when a Item Journal Batch is deleted after it's been sent approval
        WorkflowWebhookManagement.FindAndCancel(ItemJournalBatch.RecordId(), true);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnCancelRequisitionWkshBatchApprovalRequest', '', false, false)]
    local procedure HandleOnCancelRequisitionWkshBatchApprovalRequest(var RequisitionWkshName: Record "Requisition Wksh. Name")
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        // Handles the scenario when a Requisition Worksheet Batch is deleted after it's been sent approval
        WorkflowWebhookManagement.FindAndCancel(RequisitionWkshName.RecordId(), true);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnCancelVendorApprovalRequest', '', false, false)]
    local procedure HandleOnCancelVendorApprovalRequest(var Vendor: Record Vendor)
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        // Handles the scenario when a Vendor is deleted after it's been sent approval
        WorkflowWebhookManagement.FindAndCancel(Vendor.RecordId);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnCancelVendorBankAccountApprovalRequest', '', false, false)]
    local procedure HandleOnCancelVendorBankAccountApprovalRequest(var VendorBankAccount: Record "Vendor Bank Account")
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        // Handles the scenario when a Vendor Bank Account is deleted after it's been sent approval
        WorkflowWebhookManagement.FindAndCancel(VendorBankAccount.RecordId);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnDeleteRecordInApprovalRequest', '', false, false)]
    local procedure HandleOnDeleteRecordInApprovalRequest(RecordIDToApprove: RecordID)
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        WorkflowWebhookManagement.DeleteWorkflowWebhookEntries(RecordIDToApprove);
    end;

    [EventSubscriber(ObjectType::Codeunit, Codeunit::"Approvals Mgmt.", 'OnRenameRecordInApprovalRequest', '', false, false)]
    local procedure HandleOnRenameRecordInApprovalRequest(OldRecordId: RecordID; NewRecordId: RecordID)
    var
        WorkflowWebhookManagement: Codeunit "Workflow Webhook Management";
    begin
        WorkflowWebhookManagement.RenameRecord(OldRecordId, NewRecordId);
    end;
}