Add economic_transfer_executor and economic_transfer_queue classes for handling e-conomic invoice transfer logic, queue management, and processing. Include unit tests for Redis cache validation.

This commit is contained in:
Jeppe Bundgaard
2026-04-08 11:20:08 +02:00
parent 551161b692
commit ba23ad6e8f
23 changed files with 18863 additions and 388 deletions
@@ -0,0 +1,78 @@
<?php
it('guards all economic invoice queue endpoints before constructing queue service', function (): void {
$content = file_get_contents(app_path('routes/economicInvoiceRoute.php'));
expect($content)->not->toBeFalse();
$guardCount = preg_match_all('/\$this->ensureEconomicTransferQueueIsAvailable\(\);/', (string)$content);
$queueInitCount = preg_match_all('/new economic_transfer_queue\(\);/', (string)$content);
expect($guardCount)->toBe(6);
expect($queueInitCount)->toBe(6);
$endpointPatterns = [
"/\\\$this->post\\('\\/economic\\/invoice\\/draft\\/export'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
"/\\\$this->post\\('\\/economic\\/invoice\\/export'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
"/\\\$this->get\\('\\/economic\\/invoice\\/draft\\/export\\/status'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
"/\\\$this->post\\('\\/economic\\/invoice\\/draft\\/export\\/retry'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
"/\\\$this->get\\('\\/economic\\/invoice\\/export\\/status'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
"/\\\$this->post\\('\\/economic\\/invoice\\/export\\/retry'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
];
foreach ($endpointPatterns as $pattern) {
expect(preg_match($pattern, (string)$content))->toBe(1);
}
});
it('guards all collected-invoice queue endpoints before constructing queue service', function (): void {
$content = file_get_contents(app_path('routes/orderInvoicesRoute.php'));
expect($content)->not->toBeFalse();
$guardCount = preg_match_all('/\$this->ensureEconomicTransferQueueIsAvailable\(\);/', (string)$content);
$queueInitCount = preg_match_all('/new economic_transfer_queue\(\);/', (string)$content);
expect($guardCount)->toBe(3);
expect($queueInitCount)->toBe(4);
$endpointPatterns = [
"/\\\$this->get\\('\\/collected-invoices\\/economic\\/queue'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
"/\\\$this->get\\('\\/collected-invoices\\/economic\\/queue\\/status'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
"/\\\$this->post\\('\\/collected-invoices\\/economic\\/queue\\/retry'.*?\\\$this->ensureEconomicTransferQueueIsAvailable\\(\\);.*?new economic_transfer_queue\\(\\);/s",
];
foreach ($endpointPatterns as $pattern) {
expect(preg_match($pattern, (string)$content))->toBe(1);
}
expect($content)->toContain('if (!$this->isEconomicTransferQueueAvailable()) {');
expect($content)->toContain('$result = $this->exportCollectedInvoiceSynchronously($collected_order_invoices, $send_as_is);');
expect($content)->toContain('private function exportCollectedInvoiceSynchronously(collected_order_invoices_o $collected_order_invoices, bool $send_as_is): array');
expect($content)->toContain('private function isEconomicTransferQueueAvailable(): bool');
});
it('uses a consistent unavailable-service contract for missing queue dependencies', function (): void {
$invoiceRouteContent = file_get_contents(app_path('routes/economicInvoiceRoute.php'));
$orderInvoicesRouteContent = file_get_contents(app_path('routes/orderInvoicesRoute.php'));
expect($invoiceRouteContent)->not->toBeFalse();
expect($orderInvoicesRouteContent)->not->toBeFalse();
expect($invoiceRouteContent)->toContain('private function ensureEconomicTransferQueueIsAvailable(): void');
expect($invoiceRouteContent)->toContain("!class_exists('\\\\classes\\\\economic_transfer_executor')");
expect($invoiceRouteContent)->toContain("!class_exists('\\\\classes\\\\economic_transfer_queue_schema_bootstrap')");
expect($invoiceRouteContent)->toContain('!class_exists(economic_transfer_queue::class)');
expect($orderInvoicesRouteContent)->toContain('private function isEconomicTransferQueueAvailable(): bool');
expect($orderInvoicesRouteContent)->toContain("class_exists('\\\\classes\\\\economic_transfer_executor')");
expect($orderInvoicesRouteContent)->toContain("class_exists('\\\\classes\\\\economic_transfer_queue_schema_bootstrap')");
expect($orderInvoicesRouteContent)->toContain('class_exists(economic_transfer_queue::class)');
expect($orderInvoicesRouteContent)->toContain('if (!$this->isEconomicTransferQueueAvailable()) {');
foreach ([$invoiceRouteContent, $orderInvoicesRouteContent] as $content) {
expect($content)->toContain('private function ensureEconomicTransferQueueIsAvailable(): void');
expect($content)->toContain("Economic transfer queue is unavailable in this deployment', 503");
expect($content)->not->toContain("require_once __DIR__ . '/../classes/economic_transfer_executor.php';");
expect($content)->not->toContain("require_once __DIR__ . '/../classes/economic_transfer_queue_schema_bootstrap.php';");
expect($content)->not->toContain("require_once __DIR__ . '/../classes/economic_transfer_queue.php';");
}
});