Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

ProcessTransactionImport.php 3.3KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. $existingTransactionIds = $this->bankAccount->transactions->pluck('plaid_transaction_id')->toArray();
  61. $newTransactions = array_filter($allTransactions, static function ($transaction) use ($existingTransactionIds) {
  62. return ! in_array($transaction->transaction_id, $existingTransactionIds) && $transaction->pending === false;
  63. });
  64. if (count($newTransactions) > 0) {
  65. $currentBalance = $transactionsResponse->accounts[0]->balances->current;
  66. $transactionService->createStartingBalanceIfNeeded($this->company, $this->account, $this->bankAccount, $newTransactions, $currentBalance, $startDate);
  67. $transactionService->storeTransactions($this->company, $this->bankAccount, $newTransactions);
  68. $this->connectedBankAccount->update([
  69. 'last_imported_at' => Carbon::now(),
  70. ]);
  71. }
  72. }
  73. }