From 2da7f4e17c77545bffd867b2051a5110e5af6f15 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 12 Aug 2022 15:25:18 +1000 Subject: [PATCH] Data matching for bank integration --- app/Jobs/Bank/ProcessBankTransactions.php | 6 + app/Services/Bank/BankService.php | 3 + .../2022_08_05_023357_bank_integration.php | 1 + tests/Feature/Bank/YodleeApiTest.php | 1 - .../Bank/YodleeBankTransactionTest.php | 126 ++++++++++++++++++ tests/MockAccountData.php | 5 + 6 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/Bank/YodleeBankTransactionTest.php diff --git a/app/Jobs/Bank/ProcessBankTransactions.php b/app/Jobs/Bank/ProcessBankTransactions.php index e2b4880758ef..a2b43bfaac1b 100644 --- a/app/Jobs/Bank/ProcessBankTransactions.php +++ b/app/Jobs/Bank/ProcessBankTransactions.php @@ -12,6 +12,7 @@ namespace App\Jobs\Bank; use App\Helpers\Bank\Yodlee\Yodlee; +use App\Libraries\MultiDB; use App\Models\BankIntegration; use App\Models\BankTransaction; use App\Services\Bank\BankService; @@ -112,6 +113,11 @@ class ProcessBankTransactions implements ShouldQueue BankService::dispatch($company->id, $company->db); + MultiDB::setDb($company->db); + + $this->bank_integration->from_date = now(); + $this->bank_integration->save(); + } } \ No newline at end of file diff --git a/app/Services/Bank/BankService.php b/app/Services/Bank/BankService.php index e3485d65ab4b..ce75382697c7 100644 --- a/app/Services/Bank/BankService.php +++ b/app/Services/Bank/BankService.php @@ -12,6 +12,7 @@ namespace App\Services\Bank; use App\Libraries\MultiDB; +use App\Models\BankTransaction; use App\Models\Company; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; @@ -55,6 +56,7 @@ class BankService implements ShouldQueue { BankTransaction::where('company_id', $this->company->id) ->where('is_matched', false) + ->where('provisional_match', false) ->cursor() ->each(function ($bt){ @@ -67,6 +69,7 @@ class BankService implements ShouldQueue if($invoice) { $bt->invoice_id = $invoice->id; + $bt->provisional_match = true; $bt->save(); } diff --git a/database/migrations/2022_08_05_023357_bank_integration.php b/database/migrations/2022_08_05_023357_bank_integration.php index 83cdf19f4b22..264d3d8d23fd 100644 --- a/database/migrations/2022_08_05_023357_bank_integration.php +++ b/database/migrations/2022_08_05_023357_bank_integration.php @@ -68,6 +68,7 @@ return new class extends Migration $table->unsignedInteger('invoice_id')->nullable(); $table->unsignedInteger('expense_id')->nullable(); $table->boolean('is_matched')->default(0); + $table->boolean('provisional_match')->default(0); $table->boolean('is_deleted')->default(0); $table->timestamps(6); diff --git a/tests/Feature/Bank/YodleeApiTest.php b/tests/Feature/Bank/YodleeApiTest.php index 38db2162d3dc..8a8a7d76a2e5 100644 --- a/tests/Feature/Bank/YodleeApiTest.php +++ b/tests/Feature/Bank/YodleeApiTest.php @@ -487,5 +487,4 @@ nlog($accounts); - } diff --git a/tests/Feature/Bank/YodleeBankTransactionTest.php b/tests/Feature/Bank/YodleeBankTransactionTest.php new file mode 100644 index 000000000000..d563a2e1eec0 --- /dev/null +++ b/tests/Feature/Bank/YodleeBankTransactionTest.php @@ -0,0 +1,126 @@ +markTestSkipped('Skip test no Yodlee API credentials found'); + + $this->makeTestData(); + + $this->withoutMiddleware( + ThrottleRequests::class + ); + } + + public function testDataMatching1() + { + + $this->invoice->number = "super-funk-1234"; + $this->invoice->save(); + + $bank_transaction = BankTransaction::where('company_id', $this->company->id)->first(); + $bank_transaction->description = "super-funk-1234"; + $bank_transaction->save(); + + $this->assertNotNull($this->invoice); + $this->assertNotNull($bank_transaction); + + $invoices = Invoice::where('company_id', $this->company->id)->get(); + + BankTransaction::where('company_id', $this->company->id) + ->where('is_matched', false) + ->where('provisional_match', false) + ->cursor() + ->each(function ($bt) use($invoices){ + + $invoice = $invoices->first(function ($value, $key) use ($bt){ + + return str_contains($value->number, $bt->description); + + }); + + if($invoice) + { + $bt->invoice_id = $invoice->id; + $bt->provisional_match = $invoice->id; + $bt->save(); + } + + }); + + + $this->assertTrue(BankTransaction::where('invoice_id', $this->invoice->id)->exists()); + + } + + + public function testDataMatching2() + { + + $this->invoice->number = "super-funk-1234"; + $this->invoice->save(); + + $bank_transaction = BankTransaction::where('company_id', $this->company->id)->first(); + $bank_transaction->description = "super-funk-123"; + $bank_transaction->save(); + + $this->assertNotNull($this->invoice); + $this->assertNotNull($bank_transaction); + + $invoices = Invoice::where('company_id', $this->company->id)->get(); + + BankTransaction::where('company_id', $this->company->id) + ->where('is_matched', false) + ->where('provisional_match', false) + ->cursor() + ->each(function ($bt) use($invoices){ + + $invoice = $invoices->first(function ($value, $key) use ($bt){ + + return str_contains($value->number, $bt->description); + + }); + + if($invoice) + { + $bt->invoice_id = $invoice->id; + $bt->provisional_match = $invoice->id; + $bt->save(); + } + + }); + + + $this->assertTrue(BankTransaction::where('invoice_id', $this->invoice->id)->exists()); + + } + + + +} \ No newline at end of file diff --git a/tests/MockAccountData.php b/tests/MockAccountData.php index 3e3ea1b51d2e..0ccb86849bc7 100644 --- a/tests/MockAccountData.php +++ b/tests/MockAccountData.php @@ -545,26 +545,31 @@ trait MockAccountData $this->bank_transaction = BankTransaction::factory()->create([ 'user_id' => $user_id, 'company_id' => $this->company->id, + 'bank_integration_id' => $this->bank_integration->id, ]); BankTransaction::factory()->create([ 'user_id' => $user_id, 'company_id' => $this->company->id, + 'bank_integration_id' => $this->bank_integration->id, ]); BankTransaction::factory()->create([ 'user_id' => $user_id, 'company_id' => $this->company->id, + 'bank_integration_id' => $this->bank_integration->id, ]); BankTransaction::factory()->create([ 'user_id' => $user_id, 'company_id' => $this->company->id, + 'bank_integration_id' => $this->bank_integration->id, ]); BankTransaction::factory()->create([ 'user_id' => $user_id, 'company_id' => $this->company->id, + 'bank_integration_id' => $this->bank_integration->id, ]); $invitations = CreditInvitation::whereCompanyId($this->credit->company_id)