From 0fea51ba53ede1f4ec95b8ba9d882af1873083ca Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 25 Jun 2023 14:44:38 +1000 Subject: [PATCH] improve resiliency of bank transaction processing --- app/Jobs/Bank/ProcessBankTransactions.php | 31 ++++++-- .../Ninja/GenericNinjaAdminNotification.php | 71 +++++++++++++++++++ 2 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 app/Notifications/Ninja/GenericNinjaAdminNotification.php diff --git a/app/Jobs/Bank/ProcessBankTransactions.php b/app/Jobs/Bank/ProcessBankTransactions.php index 9cd35817a17b..019f93dc333b 100644 --- a/app/Jobs/Bank/ProcessBankTransactions.php +++ b/app/Jobs/Bank/ProcessBankTransactions.php @@ -11,17 +11,19 @@ namespace App\Jobs\Bank; -use App\Helpers\Bank\Yodlee\Yodlee; +use App\Models\Company; use App\Libraries\MultiDB; +use Illuminate\Bus\Queueable; use App\Models\BankIntegration; use App\Models\BankTransaction; -use App\Models\Company; +use App\Helpers\Bank\Yodlee\Yodlee; +use Illuminate\Queue\SerializesModels; +use Illuminate\Queue\InteractsWithQueue; use App\Services\Bank\BankMatchingService; -use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Events\Dispatchable; -use Illuminate\Queue\InteractsWithQueue; -use Illuminate\Queue\SerializesModels; +use Illuminate\Queue\Middleware\WithoutOverlapping; +use App\Notifications\Ninja\GenericNinjaAdminNotification; class ProcessBankTransactions implements ShouldQueue { @@ -70,6 +72,14 @@ class ProcessBankTransactions implements ShouldQueue $this->processTransactions(); } catch(\Exception $e) { nlog("{$this->bank_integration_account_id} - exited abnormally => ". $e->getMessage()); + + $content = [ + "Processing transactions for account: {$this->bank_integration->account->key} failed", + "Exception Details => ", + $e->getMessage(), + ]; + + $this->bank_integration->account->company->notification(new GenericNinjaAdminNotification($content))->ninja(); return; } } while ($this->stop_loop); @@ -152,4 +162,15 @@ class ProcessBankTransactions implements ShouldQueue $this->bank_integration->save(); } } + + + public function middleware() + { + return [new WithoutOverlapping($this->bank_integration_account_id)]; + } + + public function backoff() + { + return [rand(10, 15), rand(30, 40), rand(60, 79), rand(160, 200), rand(3000, 5000)]; + } } diff --git a/app/Notifications/Ninja/GenericNinjaAdminNotification.php b/app/Notifications/Ninja/GenericNinjaAdminNotification.php new file mode 100644 index 000000000000..7b40141aa22a --- /dev/null +++ b/app/Notifications/Ninja/GenericNinjaAdminNotification.php @@ -0,0 +1,71 @@ +message_array as $message) { + $content .= $message . "\n"; + } + + return (new SlackMessage) + ->success() + ->from(ctrans('texts.notification_bot')) + ->image('https://app.invoiceninja.com/favicon.png') + ->content($content); + } +}