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

ProcessTransactionImport.php 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace App\Jobs;
  3. use App\Models\Accounting\Account;
  4. use App\Models\Banking\BankAccount;
  5. use App\Models\Banking\ConnectedBankAccount;
  6. use App\Models\Company;
  7. use App\Services\PlaidService;
  8. use App\Services\TransactionService;
  9. use Illuminate\Bus\Queueable;
  10. use Illuminate\Contracts\Queue\ShouldQueue;
  11. use Illuminate\Foundation\Bus\Dispatchable;
  12. use Illuminate\Queue\InteractsWithQueue;
  13. use Illuminate\Queue\SerializesModels;
  14. use Illuminate\Support\Carbon;
  15. class ProcessTransactionImport implements ShouldQueue
  16. {
  17. use Dispatchable;
  18. use InteractsWithQueue;
  19. use Queueable;
  20. use SerializesModels;
  21. protected Company $company;
  22. protected Account $account;
  23. protected BankAccount $bankAccount;
  24. protected ConnectedBankAccount $connectedBankAccount;
  25. protected string $startDate;
  26. /**
  27. * Create a new job instance.
  28. */
  29. public function __construct(Company $company, Account $account, BankAccount $bankAccount, ConnectedBankAccount $connectedBankAccount, string $startDate)
  30. {
  31. $this->company = $company;
  32. $this->account = $account;
  33. $this->bankAccount = $bankAccount;
  34. $this->connectedBankAccount = $connectedBankAccount;
  35. $this->startDate = $startDate;
  36. }
  37. /**
  38. * Execute the job.
  39. */
  40. public function handle(PlaidService $plaid, TransactionService $transactionService): void
  41. {
  42. $accessToken = $this->connectedBankAccount->access_token;
  43. $endDate = Carbon::now()->toDateString();
  44. $startDate = Carbon::parse($this->startDate)->toDateString();
  45. $allTransactions = [];
  46. $offset = 0;
  47. $transactionsResponse = $plaid->getTransactions($accessToken, $startDate, $endDate, [
  48. 'account_ids' => [$this->connectedBankAccount->external_account_id],
  49. ]);
  50. $allTransactions = [...$allTransactions, ...$transactionsResponse->transactions];
  51. $totalTransactions = $transactionsResponse->total_transactions;
  52. while (count($allTransactions) < $totalTransactions) {
  53. $offset += count($transactionsResponse->transactions);
  54. $transactionsResponse = $plaid->getTransactions($accessToken, $startDate, $endDate, [
  55. 'account_ids' => [$this->connectedBankAccount->external_account_id],
  56. 'offset' => $offset,
  57. ]);
  58. $allTransactions = [...$allTransactions, ...$transactionsResponse->transactions];
  59. }
  60. if (count($allTransactions) > 0) {
  61. $postedTransactions = array_filter($allTransactions, static fn ($transaction) => $transaction->pending === false);
  62. $currentBalance = $transactionsResponse->accounts[0]->balances->current;
  63. $transactionService->createStartingBalanceIfNeeded($this->company, $this->account, $this->bankAccount, $postedTransactions, $currentBalance, $startDate);
  64. $transactionService->storeTransactions($this->company, $this->bankAccount, $postedTransactions);
  65. }
  66. }
  67. }