Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

ProcessTransactionImport.php 2.9KB

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