您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

ProcessTransactionUpdate.php 3.2KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. protected Company $company;
  20. protected string $item_id;
  21. /**
  22. * Create a new job instance.
  23. */
  24. public function __construct(Company $company, string $item_id)
  25. {
  26. $this->company = $company;
  27. $this->item_id = $item_id;
  28. }
  29. /**
  30. * Execute the job.
  31. */
  32. public function handle(PlaidService $plaidService, TransactionService $transactionService): void
  33. {
  34. $connectedBankAccounts = $this->company->connectedBankAccounts()
  35. ->where('item_id', $this->item_id)
  36. ->where('import_transactions', true)
  37. ->get();
  38. foreach ($connectedBankAccounts as $connectedBankAccount) {
  39. /** @var ConnectedBankAccount $connectedBankAccount */
  40. $accessToken = $connectedBankAccount->access_token;
  41. $bankAccount = $connectedBankAccount->bankAccount;
  42. $allTransactions = [];
  43. $offset = 0;
  44. $bufferDays = 15;
  45. $lastImportedAtDate = Carbon::parse($connectedBankAccount->last_imported_at);
  46. $startDate = $lastImportedAtDate->subDays($bufferDays)->toDateString();
  47. $endDate = Carbon::now()->toDateString();
  48. $transactionsResponse = $plaidService->getTransactions($accessToken, $startDate, $endDate, [
  49. 'account_ids' => [$connectedBankAccount->external_account_id],
  50. ]);
  51. $allTransactions = [...$allTransactions, ...$transactionsResponse->transactions];
  52. $totalTransactions = $transactionsResponse->total_transactions;
  53. while (count($allTransactions) < $totalTransactions) {
  54. $offset += count($transactionsResponse->transactions);
  55. $transactionsResponse = $plaidService->getTransactions($accessToken, $startDate, $endDate, [
  56. 'account_ids' => [$connectedBankAccount->external_account_id],
  57. 'offset' => $offset,
  58. ]);
  59. $allTransactions = [...$allTransactions, ...$transactionsResponse->transactions];
  60. }
  61. $existingTransactionIds = $bankAccount->transactions()->pluck('plaid_transaction_id')->toArray();
  62. $newTransactions = array_filter($allTransactions, static function ($transaction) use ($existingTransactionIds) {
  63. return ! in_array($transaction->transaction_id, $existingTransactionIds, true) && $transaction->pending === false;
  64. });
  65. if (count($newTransactions) > 0) {
  66. $transactionService->storeTransactions($this->company, $bankAccount, $newTransactions);
  67. $connectedBankAccount->update([
  68. 'last_imported_at' => Carbon::now(),
  69. ]);
  70. }
  71. }
  72. }
  73. }