Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

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