src/Workflows/Remove-XrmWorkflow.ps1

<#
    .SYNOPSIS
    Delete a process (classic workflow, cloud flow, action, business rule, business process flow).

    .DESCRIPTION
    Delete a workflow row, optionally turning it off first.
    Raises an error when the process is managed (remove it by uninstalling its solution) or does not exist.

    .PARAMETER XrmClient
    Xrm connector initialized to target instance. Use latest one by default. (Dataverse ServiceClient)

    .PARAMETER WorkflowReference
    Reference of the process (workflow) to delete.

    .PARAMETER Deactivate
    Turn the process off before deleting it (the platform refuses to delete an activated classic workflow).

    .OUTPUTS
    System.Void.

    .EXAMPLE
    $flow = Get-XrmWorkflows -XrmClient $xrmClient -Category 5 -Name "Old sync" | Select-Object -First 1;
    Remove-XrmWorkflow -XrmClient $xrmClient -WorkflowReference $flow.Reference -Deactivate;

    .LINK
    https://github.com/AymericM78/PowerDataOps/blob/main/documentation/commands/Remove-XrmWorkflow.md
#>

function Remove-XrmWorkflow {
    [CmdletBinding(SupportsShouldProcess)]
    [OutputType([System.Void])]
    param
    (
        [Parameter(Mandatory = $false, ValueFromPipeline)]
        [Microsoft.PowerPlatform.Dataverse.Client.ServiceClient]
        $XrmClient = $Global:XrmClient,

        [Parameter(Mandatory = $true)]
        [ValidateNotNull()]
        [Microsoft.Xrm.Sdk.EntityReference]
        $WorkflowReference,

        [Parameter(Mandatory = $false)]
        [switch]
        $Deactivate
    )
    begin {
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters);
    }
    process {
        $workflow = $XrmClient | Get-XrmRecord -LogicalName "workflow" -Id $WorkflowReference.Id -Columns "name", "statecode", "ismanaged" -IfExists -AsEntity;
        if (-not $workflow) {
            throw "Process '$($WorkflowReference.Id)' not found.";
        }
        if ($workflow["ismanaged"]) {
            throw "Process '$($workflow["name"])' ($($WorkflowReference.Id)) is managed: uninstall its solution to remove it.";
        }

        if ($Deactivate -and $workflow["statecode"].Value -ne 0) {
            $XrmClient | Disable-XrmWorkflow -WorkflowReference $WorkflowReference -ErrorAction Stop | Out-Null;
        }
        $XrmClient | Remove-XrmRecord -LogicalName "workflow" -Id $WorkflowReference.Id;
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }
}

Export-ModuleMember -Function Remove-XrmWorkflow -Alias *;