Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

ProcessTransactionUpdate.php 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\Banking\ConnectedBankAccount;
  4. use App\Models\Company;
  5. use App\Services\PlaidService;
  6. use App\Services\TransactionService;
  7. use Illuminate\Bus\Queueable;
  8. use Illuminate\Contracts\Queue\ShouldQueue;
  9. use Illuminate\Foundation\Bus\Dispatchable;
  10. use Illuminate\Queue\InteractsWithQueue;
  11. use Illuminate\Queue\SerializesModels;
  12. use Illuminate\Support\Carbon;
  13. class ProcessTransactionUpdate implements ShouldQueue
  14. {
  15. use Dispatchable;
  16. use InteractsWithQueue;
  17. use Queueable;
  18. use SerializesModels;
  19. public function __construct(
  20. protected Company $company,
  21. protected string $itemId
  22. ) {}
  23. /**
  24. * Execute the job.
  25. */
  26. public function handle(PlaidService $plaidService, TransactionService $transactionService): void
  27. {
  28. $connectedBankAccounts = $this->company->connectedBankAccounts()
  29. ->where('item_id', $this->itemId)
  30. ->where('import_transactions', true)
  31. ->get();
  32. foreach ($connectedBankAccounts as $connectedBankAccount) {
  33. /** @var ConnectedBankAccount $connectedBankAccount */
  34. $accessToken = $connectedBankAccount->access_token;
  35. $bankAccount = $connectedBankAccount->bankAccount;
  36. $allTransactions = [];
  37. $offset = 0;
  38. $bufferDays = 15;
  39. $lastImportedAtDate = Carbon::parse($connectedBankAccount->last_imported_at);
  40. $startDate = $lastImportedAtDate->subDays($bufferDays)->toDateString();
  41. $endDate = Carbon::now()->toDateString();
  42. $transactionsResponse = $plaidService->getTransactions($accessToken, $startDate, $endDate, [
  43. 'account_ids' => [$connectedBankAccount->external_account_id],
  44. ]);
  45. $allTransactions = [...$allTransactions, ...$transactionsResponse->transactions];
  46. $totalTransactions = $transactionsResponse->total_transactions;
  47. while (count($allTransactions) < $totalTransactions) {
  48. $offset += count($transactionsResponse->transactions);
  49. $transactionsResponse = $plaidService->getTransactions($accessToken, $startDate, $endDate, [
  50. 'account_ids' => [$connectedBankAccount->external_account_id],
  51. 'offset' => $offset,
  52. ]);
  53. $allTransactions = [...$allTransactions, ...$transactionsResponse->transactions];
  54. }
  55. $existingTransactionIds = $bankAccount->transactions()->pluck('plaid_transaction_id')->toArray();
  56. $newTransactions = array_filter($allTransactions, static function ($transaction) use ($existingTransactionIds) {
  57. return ! in_array($transaction->transaction_id, $existingTransactionIds, true) && $transaction->pending === false;
  58. });
  59. if (count($newTransactions) > 0) {
  60. $transactionService->storeTransactions($this->company, $bankAccount, $newTransactions);
  61. $connectedBankAccount->update([
  62. 'last_imported_at' => Carbon::now(),
  63. ]);
  64. }
  65. }
  66. }
  67. }