mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2024-11-10 05:02:36 +01:00
Refresh and remove accounts
This commit is contained in:
parent
f7eb506e0d
commit
6f9baa1c37
41
app/Exceptions/YodleeApiException.php
Normal file
41
app/Exceptions/YodleeApiException.php
Normal file
@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Exception;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Response;
|
||||
|
||||
class YodleeApiException extends Exception
|
||||
{
|
||||
/**
|
||||
* Report the exception.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function report()
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the exception into an HTTP response.
|
||||
*
|
||||
* @param Request $request
|
||||
* @return Response
|
||||
*/
|
||||
public function render($request)
|
||||
{
|
||||
|
||||
// $msg = 'Unable to refund the transaction';
|
||||
$msg = ctrans('texts.error');
|
||||
|
||||
if ($this->getMessage() && strlen($this->getMessage()) >= 1) {
|
||||
$msg = $this->getMessage();
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => $msg,
|
||||
], 400);
|
||||
}
|
||||
}
|
@ -71,7 +71,7 @@ class AccountTransformer implements AccountTransformerInterface
|
||||
$data = [];
|
||||
|
||||
if(!property_exists($yodlee_account, 'account'))
|
||||
return [];
|
||||
return $data;
|
||||
|
||||
foreach($yodlee_account->account as $account)
|
||||
{
|
||||
@ -93,7 +93,7 @@ class AccountTransformer implements AccountTransformerInterface
|
||||
'provider_account_id' => $account->providerAccountId,
|
||||
'provider_id' => $account->providerId,
|
||||
'provider_name' => $account->providerName,
|
||||
'nickname' => $account?->nickname,
|
||||
'nickname' => property_exists($account, 'nickname') ? $account->nickname : '',
|
||||
'current_balance' => property_exists($account, 'currentBalance') ? $account->currentBalance->amount : 0,
|
||||
'account_currency' => property_exists($account, 'currency') ? $account->currentBalance->currency : '',
|
||||
];
|
||||
|
@ -120,7 +120,7 @@ class IncomeTransformer implements BankRevenueInterface
|
||||
$data = [];
|
||||
|
||||
if(!property_exists($transaction, 'transaction'))
|
||||
return [];
|
||||
return $data;
|
||||
|
||||
foreach($transaction->transaction as $transaction)
|
||||
{
|
||||
|
@ -153,12 +153,30 @@ class Yodlee
|
||||
|
||||
}
|
||||
|
||||
if($response->failed())
|
||||
throw new YodleeApiException($response->body());
|
||||
|
||||
}
|
||||
|
||||
public function deleteAccount($account_id)
|
||||
{
|
||||
|
||||
$token = $this->getAccessToken();
|
||||
|
||||
$response = Http::withHeaders($this->getHeaders(["Authorization" => "Bearer {$token}"]))->delete($this->getEndpoint(). "/accounts/{$account_id}", []);
|
||||
|
||||
if($response->successful()){
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
if($response->failed())
|
||||
throw new YodleeApiException($response->body());
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function getTransactions($params = [])
|
||||
{
|
||||
$token = $this->getAccessToken();
|
||||
|
@ -14,6 +14,7 @@ namespace App\Http\Controllers\Bank;
|
||||
use App\Helpers\Bank\Yodlee\Yodlee;
|
||||
use App\Http\Controllers\BaseController;
|
||||
use App\Http\Requests\Yodlee\YodleeAuthRequest;
|
||||
use App\Models\BankIntegration;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class YodleeController extends BaseController
|
||||
@ -50,9 +51,6 @@ class YodleeController extends BaseController
|
||||
$yodlee = new Yodlee($token);
|
||||
$yodlee->setTestMode();
|
||||
|
||||
if(!is_string($token))
|
||||
dd($token);
|
||||
|
||||
$data = [
|
||||
'access_token' => $yodlee->getAccessToken(),
|
||||
'fasttrack_url' => $yodlee->getFastTrackUrl(),
|
||||
@ -66,18 +64,5 @@ class YodleeController extends BaseController
|
||||
|
||||
}
|
||||
|
||||
public function refreshAccounts(YodleeAdminRequest $request)
|
||||
{
|
||||
|
||||
$token = auth()->user()->account->bank_integration_account_id;
|
||||
|
||||
if(!$token)
|
||||
return response()->json(['message' => 'No bank integrations are present. Please add a bank account. '],400);
|
||||
|
||||
$yodlee = new Yodlee($token);
|
||||
$yodlee->setTestMode();
|
||||
|
||||
$yodlee->getAccounts();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -426,8 +426,8 @@ class BankIntegrationController extends BaseController
|
||||
*
|
||||
*
|
||||
* @OA\Post(
|
||||
* path="/api/v1/bank_integrations/remote_accounts",
|
||||
* operationId="getRemoteAccounts",
|
||||
* path="/api/v1/bank_integrations/refresh_accounts",
|
||||
* operationId="getRefreshAccounts",
|
||||
* tags={"bank_integrations"},
|
||||
* summary="Gets the list of accounts from the remote server",
|
||||
* description="Adds an bank_integration to a company",
|
||||
@ -456,7 +456,7 @@ class BankIntegrationController extends BaseController
|
||||
* ),
|
||||
* )
|
||||
*/
|
||||
public function remoteAccounts(AdminBankIntegrationRequest $request)
|
||||
public function refreshAccounts(AdminBankIntegrationRequest $request)
|
||||
{
|
||||
// As yodlee is the first integration we don't need to perform switches yet, however
|
||||
// if we add additional providers we can reuse this class
|
||||
@ -467,12 +467,61 @@ class BankIntegrationController extends BaseController
|
||||
return response()->json(['message' => 'Not yet authenticated with Bank Integration service'], 400);
|
||||
|
||||
$yodlee = new Yodlee($bank_account_id);
|
||||
$yodlee->setTestMode();
|
||||
|
||||
$accounts = $yodlee->getAccounts();
|
||||
|
||||
return response()->json($accounts, 200);
|
||||
foreach($accounts as $account)
|
||||
{
|
||||
|
||||
if(!BankIntegration::where('bank_account_id', $account['id'])->where('company_id', auth()->user()->company()->id)->exists())
|
||||
{
|
||||
$bank_integration = new BankIntegration();
|
||||
$bank_integration->company_id = auth()->user()->company()->id;
|
||||
$bank_integration->account_id = auth()->user()->account_id;
|
||||
$bank_integration->user_id = auth()->user()->id;
|
||||
$bank_integration->bank_account_id = $account['id'];
|
||||
$bank_integration->bank_account_type = $account['account_type'];
|
||||
$bank_integration->bank_account_name = $account['account_name'];
|
||||
$bank_integration->bank_account_status = $account['account_status'];
|
||||
$bank_integration->bank_account_number = $account['account_number'];
|
||||
$bank_integration->provider_id = $account['provider_id'];
|
||||
$bank_integration->provider_name = $account['provider_name'];
|
||||
$bank_integration->nickname = $account['nickname'];
|
||||
$bank_integration->balance = $account['current_balance'];
|
||||
$bank_integration->currency = $account['account_currency'];
|
||||
|
||||
$bank_integration->save();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return response()->json(BankIntegration::query()->company(), 200);
|
||||
}
|
||||
|
||||
public function removeAccount(AdminBankIntegrationRequest $request, $acc_id)
|
||||
{
|
||||
|
||||
$bank_account_id = auth()->user()->account->bank_integration_account_id;
|
||||
|
||||
if(!$bank_account_id)
|
||||
return response()->json(['message' => 'Not yet authenticated with Bank Integration service'], 400);
|
||||
|
||||
$company_id = auth()->user()->company()->id;
|
||||
|
||||
$bi = BankIntegration::withTrashed()->where('bank_account_id', $acc_id)->where('company_id', $company_id)->firstOrFail();
|
||||
|
||||
$yodlee = new Yodlee($bank_account_id);
|
||||
$yodlee->setTestMode();
|
||||
$res = $yodlee->deleteAccount($acc_id);
|
||||
|
||||
$this->bank_integration_repo->delete($bi);
|
||||
|
||||
return $this->itemResponse($bi->fresh());
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function getTransactions(AdminBankIntegrationRequest $request)
|
||||
{
|
||||
//handle API failures we have only accounts for success
|
||||
@ -498,7 +547,6 @@ class BankIntegrationController extends BaseController
|
||||
|
||||
$transactions = (new BankService(auth()->user()->company()))->match();
|
||||
|
||||
|
||||
return response()->json($transactions, 200, [], JSON_PRETTY_PRINT);
|
||||
|
||||
}
|
||||
|
@ -11,8 +11,11 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
|
||||
class BankIntegration extends BaseModel
|
||||
{
|
||||
use SoftDeletes;
|
||||
|
||||
protected $fillable = [
|
||||
];
|
||||
|
@ -47,7 +47,7 @@ class BankIntegrationTransformer extends EntityTransformer
|
||||
{
|
||||
return [
|
||||
'id' => (string) $this->encodePrimaryKey($bank_integration->id),
|
||||
'provider_bank_name' => (string)$bank_integration->provider_bank_name ?: '',
|
||||
'provider_name' => (string)$bank_integration->provider_name ?: '',
|
||||
'provider_id' => (int) $bank_integration->provider_id ?: 0,
|
||||
'bank_account_id' => (int) $bank_integration->bank_account_id ?: 0,
|
||||
'bank_account_name' => (string) $bank_integration->bank_account_name ?: '',
|
||||
@ -57,6 +57,10 @@ class BankIntegrationTransformer extends EntityTransformer
|
||||
'balance' => (float)$bank_integration->balance ?: 0,
|
||||
'currency' => (string)$bank_integration->currency ?: '',
|
||||
'nickname' => (string)$bank_integration->nickname ?: '',
|
||||
'is_deleted' => (bool) $bank_integration->is_deleted,
|
||||
'created_at' => (int) $bank_integration->created_at,
|
||||
'updated_at' => (int) $bank_integration->updated_at,
|
||||
'archived_at' => (int) $bank_integration->deleted_at,
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@ return new class extends Migration
|
||||
$table->unsignedInteger('company_id');
|
||||
$table->unsignedInteger('user_id');
|
||||
|
||||
$table->text('provider_bank_name'); //providerName ie Chase
|
||||
$table->text('provider_name'); //providerName ie Chase
|
||||
$table->bigInteger('provider_id'); //id of the bank
|
||||
$table->bigInteger('bank_account_id'); //id
|
||||
$table->text('bank_account_name')->nullable(); //accountName
|
||||
|
@ -107,9 +107,10 @@ Route::group(['middleware' => ['throttle:10,1','api_secret_check','email_db']],
|
||||
Route::group(['middleware' => ['throttle:300,1', 'api_db', 'token_auth', 'locale'], 'prefix' => 'api/v1', 'as' => 'api.'], function () {
|
||||
Route::put('accounts/{account}', [AccountController::class, 'update'])->name('account.update');
|
||||
Route::resource('bank_integrations', BankIntegrationController::class); // name = (clients. index / create / show / update / destroy / edit
|
||||
Route::post('bank_integrations/remote_accounts', [BankIntegrationController::class, 'remoteAccounts'])->name('bank_integrations.remote_accounts');
|
||||
Route::post('bank_integrations/refresh_accounts', [BankIntegrationController::class, 'refreshAccounts'])->name('bank_integrations.refresh_accounts');
|
||||
Route::post('bank_integrations/transactions', [BankIntegrationController::class, 'getTransactions'])->name('bank_integrations.transactions');
|
||||
|
||||
Route::post('bank_integrations/remove_account/{acc_id}', [BankIntegrationController::class, 'removeAccount'])->name('bank_integrations.remove_account');
|
||||
|
||||
Route::post('check_subdomain', [SubdomainController::class, 'index'])->name('check_subdomain');
|
||||
Route::get('ping', [PingController::class, 'index'])->name('ping');
|
||||
Route::get('health_check', [PingController::class, 'health'])->name('health_check');
|
||||
|
Loading…
Reference in New Issue
Block a user