From c6e249bb67edb6ffb21c7ad1fe820017dbdf9419 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 25 Jun 2023 14:34:50 +1000 Subject: [PATCH 1/3] Minor fixes for bank transaction processing --- app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php b/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php index 42c0e9bf5895..43d337c5577d 100644 --- a/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php +++ b/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php @@ -127,9 +127,12 @@ class IncomeTransformer implements BankRevenueInterface foreach ($transaction->transaction as $transaction) { //do not store duplicate / pending transactions - if (property_exists($transaction, 'status') && $transaction->status == 'PENDING') { + if (property_exists($transaction, 'status') && $transaction->status == 'PENDING') + continue; + + //some object do no store amounts ignore these + if(!property_exists($transaction, 'amount')) continue; - } $data[] = $this->transformTransaction($transaction); } From fdc67cd5fb027c01ab26c11044c28e88bf25697f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 25 Jun 2023 14:35:58 +1000 Subject: [PATCH 2/3] Handle unavailable properties in Yodlee response --- app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php b/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php index 43d337c5577d..48966aa20382 100644 --- a/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php +++ b/app/Helpers/Bank/Yodlee/Transformer/IncomeTransformer.php @@ -151,7 +151,7 @@ class IncomeTransformer implements BankRevenueInterface 'category_type' => $transaction->categoryType, 'date' => $transaction->date, 'bank_account_id' => $transaction->accountId, - 'description' => $transaction->description->original, + 'description' => $transaction?->description?->original ?? '', 'base_type' => property_exists($transaction, 'baseType') ? $transaction->baseType : $this->calculateBaseType($transaction), ]; } From 0fea51ba53ede1f4ec95b8ba9d882af1873083ca Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 25 Jun 2023 14:44:38 +1000 Subject: [PATCH 3/3] 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); + } +}