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

ProcessTransactionImport.php 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. public function __construct(
  22. protected Company $company,
  23. protected Account $account,
  24. protected BankAccount $bankAccount,
  25. protected ConnectedBankAccount $connectedBankAccount,
  26. protected string $startDate
  27. ) {
  28. }
  29. /**
  30. * Execute the job.
  31. */
  32. public function handle(PlaidService $plaid, TransactionService $transactionService): void
  33. {
  34. $accessToken = $this->connectedBankAccount->access_token;
  35. $endDate = Carbon::now()->toDateString();
  36. $startDate = Carbon::parse($this->startDate)->toDateString();
  37. $allTransactions = [];
  38. $offset = 0;
  39. $transactionsResponse = $plaid->getTransactions($accessToken, $startDate, $endDate, [
  40. 'account_ids' => [$this->connectedBankAccount->external_account_id],
  41. ]);
  42. $allTransactions = [...$allTransactions, ...$transactionsResponse->transactions];
  43. $totalTransactions = $transactionsResponse->total_transactions;
  44. while (count($allTransactions) < $totalTransactions) {
  45. $offset += count($transactionsResponse->transactions);
  46. $transactionsResponse = $plaid->getTransactions($accessToken, $startDate, $endDate, [
  47. 'account_ids' => [$this->connectedBankAccount->external_account_id],
  48. 'offset' => $offset,
  49. ]);
  50. $allTransactions = [...$allTransactions, ...$transactionsResponse->transactions];
  51. }
  52. $existingTransactionIds = $this->bankAccount->transactions->pluck('plaid_transaction_id')->toArray();
  53. $newTransactions = array_filter($allTransactions, static function ($transaction) use ($existingTransactionIds) {
  54. return ! in_array($transaction->transaction_id, $existingTransactionIds) && $transaction->pending === false;
  55. });
  56. if (count($newTransactions) > 0) {
  57. $currentBalance = $transactionsResponse->accounts[0]->balances->current;
  58. $transactionService->createStartingBalanceIfNeeded($this->company, $this->account, $this->bankAccount, $newTransactions, $currentBalance, $startDate);
  59. $transactionService->storeTransactions($this->company, $this->bankAccount, $newTransactions);
  60. $this->connectedBankAccount->update([
  61. 'last_imported_at' => Carbon::now(),
  62. ]);
  63. }
  64. }
  65. }