src/Client/Add-XrmBulkDelete.ps1

<#
    .SYNOPSIS
    Create a bulk delete job.

    .DESCRIPTION
    Submit a BulkDeleteRequest to asynchronously delete records matching a given query expression.

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

    .PARAMETER Query
    QueryExpression defining the records to delete.

    .PARAMETER JobName
    Name of the bulk delete job. (Default: "Bulk Delete")

    .PARAMETER SendEmailNotification
    Whether to send email notification when the job completes. (Default: false)

    .PARAMETER ToRecipients
    Array of system user entity references to receive email notification. (Default: empty)

    .PARAMETER CCRecipients
    Array of system user entity references to receive email notification in CC. (Default: empty)

    .PARAMETER RecurrencePattern
    Recurrence pattern for the bulk delete job. Empty string for one-time execution. (Default: "")

    .PARAMETER StartDateTime
    UTC date/time at which the bulk delete job should start. (Default: now)

    .PARAMETER SourceImportId
    Optional source import unique identifier to scope the deletion.

    .OUTPUTS
    Microsoft.Xrm.Sdk.OrganizationResponse. BulkDelete response containing JobId.

    .EXAMPLE
    $xrmClient = New-XrmClient -ConnectionString $connectionString;
    $query = New-XrmQueryExpression -LogicalName "account" -Columns "accountid";
    $query | Add-XrmQueryCondition -Field "statecode" -Condition Equal -Values @(1);
    $response = Add-XrmBulkDelete -XrmClient $xrmClient -Query $query -JobName "Clean inactive accounts";
    $jobId = $response.Results["JobId"];
#>

function Add-XrmBulkDelete {
    [CmdletBinding()]
    param
    (        
        [Parameter(Mandatory = $false, ValueFromPipeline)]
        [Microsoft.PowerPlatform.Dataverse.Client.ServiceClient]
        $XrmClient = $Global:XrmClient,

        [Parameter(Mandatory = $true)]
        [Microsoft.Xrm.Sdk.Query.QueryExpression]
        $Query,

        [Parameter(Mandatory = $false)]
        [ValidateNotNullOrEmpty()]
        [string]
        $JobName = "Bulk Delete",

        [Parameter(Mandatory = $false)]
        [bool]
        $SendEmailNotification = $false,

        [Parameter(Mandatory = $false)]
        [Guid[]]
        $ToRecipients = @(),

        [Parameter(Mandatory = $false)]
        [Guid[]]
        $CCRecipients = @(),

        [Parameter(Mandatory = $false)]
        [string]
        $RecurrencePattern = "",

        [Parameter(Mandatory = $false)]
        [datetime]
        $StartDateTime = [datetime]::UtcNow,

        [Parameter(Mandatory = $false)]
        [Guid]
        $SourceImportId = [Guid]::Empty
    )
    begin {   
        $StopWatch = [System.Diagnostics.Stopwatch]::StartNew(); 
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Start -Parameters ($MyInvocation.MyCommand.Parameters);
    }    
    process {
        $request = New-XrmRequest -Name "BulkDelete";
        $request | Add-XrmRequestParameter -Name "QuerySet" -Value @($Query) | Out-Null;
        $request | Add-XrmRequestParameter -Name "JobName" -Value $JobName | Out-Null;
        $request | Add-XrmRequestParameter -Name "SendEmailNotification" -Value $SendEmailNotification | Out-Null;
        $request | Add-XrmRequestParameter -Name "ToRecipients" -Value $ToRecipients | Out-Null;
        $request | Add-XrmRequestParameter -Name "CCRecipients" -Value $CCRecipients | Out-Null;
        $request | Add-XrmRequestParameter -Name "RecurrencePattern" -Value $RecurrencePattern | Out-Null;
        $request | Add-XrmRequestParameter -Name "StartDateTime" -Value $StartDateTime | Out-Null;
        if ($SourceImportId -ne [Guid]::Empty) {
            $request | Add-XrmRequestParameter -Name "SourceImportId" -Value $SourceImportId | Out-Null;
        };
        $response = Invoke-XrmRequest -XrmClient $XrmClient -Request $request;
        $response;
    }
    end {
        $StopWatch.Stop();
        Trace-XrmFunction -Name $MyInvocation.MyCommand.Name -Stage Stop -StopWatch $StopWatch;
    }    
}

Export-ModuleMember -Function Add-XrmBulkDelete -Alias *;