Implement move collected invoice to customer functionality with API endpoint and associated tests

This commit is contained in:
Jeppe Bundgaard
2026-06-09 13:12:55 +02:00
parent fb1f0883e1
commit aca8be51dc
7 changed files with 237 additions and 1 deletions
@@ -606,6 +606,76 @@ class collected_order_invoices_o extends db
self::deleteCached('asArray', $this->id);
}
/**
* Move this invoice collection and all attached orders to another customer.
*
* @return array<string,mixed>
* @throws Exception
*/
public function moveToCustomer(int $target_customer_number): array
{
global $db;
self::requireSelected();
self::requireValidCustomer((string)$target_customer_number);
if ($target_customer_number <= 0) {
throw new Exception('Target customer number must be greater than zero');
}
if (!empty($this->external_id->value()) || $this->booked_invoice_id->value() !== null) {
throw new Exception('Invoice collections with an external or booked invoice cannot be moved');
}
$source_customer_number = (int)$this->customer_number->value();
if ($source_customer_number === $target_customer_number) {
return [
'invoice_collection_id' => (int)$this->id,
'source_customer_number' => $source_customer_number,
'target_customer_number' => $target_customer_number,
'moved_order_ids' => [],
'moved_order_count' => 0,
'changed' => false,
];
}
$invoice_collection_id = (int)$this->id;
$result = $db->query("SELECT id FROM orders WHERE invoice_collection_id = {$invoice_collection_id}");
$order_ids = array_map(
static fn(array $row): int => (int)$row['id'],
$db->fetch_all($result)
);
$db->conn()->begin_transaction();
try {
$this->customer_number->set($target_customer_number);
foreach ( $order_ids as $order_id ) {
$order = (new orders_o())->select($order_id);
if (!$order->exists()) {
continue;
}
$order->customer_id->set($target_customer_number);
$order->objectChanged();
}
$this->objectChanged();
$db->conn()->commit();
} catch (\Throwable $e) {
$db->conn()->rollback();
throw $e;
}
return [
'invoice_collection_id' => $invoice_collection_id,
'source_customer_number' => $source_customer_number,
'target_customer_number' => $target_customer_number,
'moved_order_ids' => $order_ids,
'moved_order_count' => count($order_ids),
'changed' => true,
];
}
/**
* Get the external id of the invoice collection
* @throws Exception If the request was not successful