I use this and it works fine.
<?php
use WHMCS\Database\Capsule;
add_hook('PreModuleTerminate', 1, function($vars) {
$invoices = Capsule::table('tblinvoiceitems')
->where('relid', $vars['params']['serviceid'])
->where('type', '!=', 'GroupDiscount')
->get();
logActivity('Auto Cancel Invoice: Starting...');
foreach($invoices as $key){
$invoiceIDs = Capsule::table('tblinvoices')
->where('id', $key->invoiceid)
->where('status', 'Unpaid')
->value('id');
$invoiceLine = Capsule::table('tblinvoiceitems')
->where('invoiceid', $invoiceIDs)
->where('relid', $vars['params']['serviceid'])
->value('id');
$invoiceLines = Capsule::table('tblinvoiceitems')
->where('invoiceid', $invoiceIDs)
->get();
$description = Capsule::table('tblinvoiceitems')
->where('relid', $vars['params']['serviceid'])
->where('invoiceid', $invoiceIDs)
->value('description');
$discountLine = Capsule::table('tblinvoiceitems')
->where('invoiceid', $invoiceIDs)
->where('type', 'GroupDiscount')
->where('description', 'like', '% '.$description.'%')
->value('id');
if($invoiceIDs){
logActivity('Auto Cancel Invoice: Invoice ' . $invoiceIDs . ' has had a line removed. This invoice previously had ' . count($invoiceLines) . ' lines.');
if(count($invoiceLines) > 1){
$command = 'UpdateInvoice';
$postData = array(
'invoiceid' => $invoiceIDs,
'deletelineids' => array($invoiceLine),
);
$results = localAPI($command, $postData);
}elseif(count($invoiceLines) == 1){
logActivity('Auto Cancel Invoice: Invoice ' . $invoiceIDs . ' has been cancelled because the product was terminated.');
$command = 'UpdateInvoice';
$postData = array(
'invoiceid' => $invoiceIDs,
'status' => 'Cancelled',
);
$results = localAPI($command, $postData);
}
if(count($invoiceLines) <= 2 && Capsule::table('tblinvoiceitems')->where('invoiceid', $invoiceIDs)->where('type', 'LateFee')->get()){
logActivity('Auto Cancel Invoice: Invoice ' . $invoiceIDs . ' has been cancelled because the only line was a Late Fee.');
$command = 'UpdateInvoice';
$postData = array(
'invoiceid' => $invoiceIDs,
'status' => 'Cancelled',
);
$results = localAPI($command, $postData);
}
if($discountLine){
logActivity('Auto Cancel Invoice: Invoice ' . $invoiceIDs . ' had a Group Discount. This has been removed.');
$command = 'UpdateInvoice';
$postData = array(
'invoiceid' => $invoiceIDs,
'deletelineids' => array($discountLine),
);
$results = localAPI($command, $postData);
}
}
}
});