2022-07-28 06:09:13 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Invoice Ninja (https://invoiceninja.com).
|
|
|
|
*
|
|
|
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
|
|
|
*
|
2023-01-28 23:21:40 +01:00
|
|
|
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
|
2022-07-28 06:09:13 +02:00
|
|
|
*
|
|
|
|
* @license https://www.elastic.co/licensing/elastic-license
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\Bank;
|
|
|
|
|
2022-07-28 08:29:42 +02:00
|
|
|
use App\Helpers\Bank\Yodlee\Yodlee;
|
2022-07-28 06:09:13 +02:00
|
|
|
use App\Http\Controllers\BaseController;
|
2022-08-10 03:56:46 +02:00
|
|
|
use App\Http\Requests\Yodlee\YodleeAuthRequest;
|
2022-09-21 13:03:04 +02:00
|
|
|
use App\Jobs\Bank\ProcessBankTransactions;
|
2022-08-11 06:19:35 +02:00
|
|
|
use App\Models\BankIntegration;
|
2022-07-28 06:09:13 +02:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
|
|
|
class YodleeController extends BaseController
|
|
|
|
{
|
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
public function auth(YodleeAuthRequest $request)
|
2022-07-28 06:09:13 +02:00
|
|
|
{
|
|
|
|
|
2022-08-06 10:11:43 +02:00
|
|
|
// create a user at this point
|
|
|
|
// use the one time token here to pull in the actual user
|
2022-08-15 22:03:12 +02:00
|
|
|
// store the user_account_id on the accounts table
|
2022-08-06 10:11:43 +02:00
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
$yodlee = new Yodlee();
|
|
|
|
|
|
|
|
$company = $request->getCompany();
|
|
|
|
|
2022-09-07 07:24:08 +02:00
|
|
|
|
2022-11-04 02:55:17 +01:00
|
|
|
//ensure user is enterprise!!
|
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
if($company->account->bank_integration_account_id){
|
2022-08-15 22:03:12 +02:00
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
$flow = 'edit';
|
2022-08-15 22:03:12 +02:00
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
$token = $company->account->bank_integration_account_id;
|
2022-08-15 22:03:12 +02:00
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
}
|
|
|
|
else{
|
2022-08-15 22:03:12 +02:00
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
$flow = 'add';
|
2022-08-15 22:03:12 +02:00
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
$response = $yodlee->createUser($company);
|
|
|
|
|
|
|
|
$token = $response->user->loginName;
|
|
|
|
|
|
|
|
$company->account->bank_integration_account_id = $token;
|
2022-08-15 22:03:12 +02:00
|
|
|
|
2022-08-10 03:56:46 +02:00
|
|
|
$company->push();
|
|
|
|
|
|
|
|
}
|
2022-08-10 11:49:27 +02:00
|
|
|
|
|
|
|
$yodlee = new Yodlee($token);
|
2022-08-10 03:56:46 +02:00
|
|
|
|
2022-09-07 07:24:08 +02:00
|
|
|
if($request->has('window_closed') && $request->input("window_closed") == "true")
|
|
|
|
$this->getAccounts($company, $token);
|
|
|
|
|
2022-07-28 06:09:13 +02:00
|
|
|
$data = [
|
2022-08-10 03:56:46 +02:00
|
|
|
'access_token' => $yodlee->getAccessToken(),
|
|
|
|
'fasttrack_url' => $yodlee->getFastTrackUrl(),
|
2022-08-15 22:03:12 +02:00
|
|
|
'config_name' => config('ninja.yodlee.config_name'),
|
2022-08-10 03:56:46 +02:00
|
|
|
'flow' => $flow,
|
2022-08-10 11:49:27 +02:00
|
|
|
'company' => $company,
|
|
|
|
'account' => $company->account,
|
2022-09-07 07:24:08 +02:00
|
|
|
'completed' => $request->has('window_closed') ? true : false,
|
2022-07-28 06:09:13 +02:00
|
|
|
];
|
|
|
|
|
|
|
|
return view('bank.yodlee.auth', $data);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2022-09-07 07:24:08 +02:00
|
|
|
private function getAccounts($company, $token)
|
|
|
|
{
|
|
|
|
$yodlee = new Yodlee($token);
|
|
|
|
|
|
|
|
$accounts = $yodlee->getAccounts();
|
|
|
|
|
|
|
|
foreach($accounts as $account)
|
|
|
|
{
|
|
|
|
|
|
|
|
if(!BankIntegration::where('bank_account_id', $account['id'])->where('company_id', $company->id)->exists())
|
|
|
|
{
|
|
|
|
$bank_integration = new BankIntegration();
|
|
|
|
$bank_integration->company_id = $company->id;
|
|
|
|
$bank_integration->account_id = $company->account_id;
|
|
|
|
$bank_integration->user_id = $company->owner()->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'];
|
2022-09-21 13:05:12 +02:00
|
|
|
$bank_integration->from_date = now()->subYear();
|
2022-09-07 07:24:08 +02:00
|
|
|
|
|
|
|
$bank_integration->save();
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
2022-09-21 13:03:04 +02:00
|
|
|
|
|
|
|
|
|
|
|
$company->account->bank_integrations->each(function ($bank_integration) use ($company){
|
|
|
|
|
|
|
|
ProcessBankTransactions::dispatch($company->account->bank_integration_account_id, $bank_integration);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2022-11-05 02:27:01 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Process Yodlee Refresh Webhook.
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @OA\Post(
|
|
|
|
* path="/api/v1/yodlee/refresh",
|
|
|
|
* operationId="yodleeRefreshWebhook",
|
|
|
|
* tags={"yodlee"},
|
|
|
|
* summary="Processing webhooks from Yodlee",
|
|
|
|
* description="Notifies the system when a data point can be refreshed",
|
|
|
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Token"),
|
|
|
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
|
|
|
* @OA\Parameter(ref="#/components/parameters/include"),
|
|
|
|
* @OA\Response(
|
|
|
|
* response=200,
|
|
|
|
* description="",
|
|
|
|
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
|
|
|
|
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
|
|
|
|
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
|
|
|
|
* @OA\JsonContent(ref="#/components/schemas/Credit"),
|
|
|
|
* ),
|
|
|
|
* @OA\Response(
|
|
|
|
* response=422,
|
|
|
|
* description="Validation error",
|
|
|
|
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
|
|
|
|
*
|
|
|
|
* ),
|
|
|
|
* @OA\Response(
|
|
|
|
* response="default",
|
|
|
|
* description="Unexpected Error",
|
|
|
|
* @OA\JsonContent(ref="#/components/schemas/Error"),
|
|
|
|
* ),
|
|
|
|
* )
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
{
|
|
|
|
"event":{
|
|
|
|
"info":"REFRESH.PROCESS_COMPLETED",
|
|
|
|
"loginName":"fri21",
|
|
|
|
"data":{
|
|
|
|
"providerAccount":[
|
|
|
|
{
|
|
|
|
"id":10995860,
|
|
|
|
"providerId":16441,
|
|
|
|
"isManual":false,
|
|
|
|
"createdDate":"2017-12-22T05:47:35Z",
|
|
|
|
"aggregationSource":"USER",
|
|
|
|
"status":"SUCCESS",
|
|
|
|
"requestId":"NSyMGo+R4dktywIu3hBIkc3PgWA=",
|
|
|
|
"dataset":[
|
|
|
|
{
|
|
|
|
"name":"BASIC_AGG_DATA",
|
|
|
|
"additionalStatus":"AVAILABLE_DATA_RETRIEVED",
|
|
|
|
"updateEligibility":"ALLOW_UPDATE",
|
|
|
|
"lastUpdated":"2017-12-22T05:48:16Z",
|
|
|
|
"lastUpdateAttempt":"2017-12-22T05:48:16Z"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
public function refreshWebhook(Request $request)
|
|
|
|
{
|
|
|
|
//we should ignore this one
|
|
|
|
nlog("yodlee refresh");
|
|
|
|
nlog($request->all());
|
|
|
|
|
|
|
|
return response()->json(['message' => 'Success'], 200);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// return response()->json(['message' => 'Unauthorized'], 403);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
{
|
|
|
|
"event":{
|
|
|
|
"notificationId":"63c73475-4db5-49ef-8553-8303337ca7c3",
|
|
|
|
"info":"LATEST_BALANCE_UPDATES",
|
|
|
|
"loginName":"user1",
|
|
|
|
"data":{
|
|
|
|
"providerAccountId":658552,
|
|
|
|
"latestBalanceEvent":[
|
|
|
|
{
|
|
|
|
"accountId":12345,
|
|
|
|
"status":"SUCCESS"
|
|
|
|
},
|
|
|
|
{
|
|
|
|
"accountId":12346,
|
|
|
|
"status":"FAILED"
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
public function balanceWebhook(Request $request)
|
|
|
|
{
|
|
|
|
|
|
|
|
nlog("yodlee refresh");
|
|
|
|
nlog($request->all());
|
|
|
|
|
|
|
|
return response()->json(['message' => 'Success'], 200);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// return response()->json(['message' => 'Unauthorized'], 403);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
{
|
|
|
|
"event":{
|
|
|
|
"data":[
|
|
|
|
{
|
|
|
|
"autoRefresh":{
|
|
|
|
"additionalStatus":"SCHEDULED",
|
|
|
|
"status":"ENABLED"
|
|
|
|
},
|
|
|
|
"accountIds":[
|
|
|
|
1112645899,
|
|
|
|
1112645898
|
|
|
|
],
|
|
|
|
"loginName":"YSL1555332811628",
|
|
|
|
"providerAccountId":11381459
|
|
|
|
}
|
|
|
|
],
|
|
|
|
"notificationTime":"2019-06-14T04:49:39Z",
|
|
|
|
"notificationId":"4e672150-156048777",
|
|
|
|
"info":"AUTO_REFRESH_UPDATES"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
public function refreshUpdatesWebhook(Request $request)
|
|
|
|
{
|
|
|
|
//notifies a user if there are problems with yodlee accessing the data
|
|
|
|
nlog("update refresh");
|
|
|
|
nlog($request->all());
|
|
|
|
|
|
|
|
return response()->json(['message' => 'Success'], 200);
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// return response()->json(['message' => 'Unauthorized'], 403);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
"event": {
|
|
|
|
"notificationId": "64b7ed1a-1530523285",
|
|
|
|
"info": "DATA_UPDATES.USER_DATA",
|
|
|
|
"data": {
|
|
|
|
"userCount": 1,
|
|
|
|
"fromDate": "2017-11-10T10:18:44Z",
|
|
|
|
"toDate": "2017-11-10T11:18:43Z",
|
|
|
|
"userData": [{
|
|
|
|
"user": {
|
|
|
|
"loginName": "YSL1484052178554"
|
|
|
|
},
|
|
|
|
"links": [{
|
|
|
|
"methodType": "GET",
|
|
|
|
"rel": "getUserData",
|
|
|
|
"href": "dataExtracts/userData?fromDate=2017-11-10T10:18:44Z&toDate=2017-11-10T11:18:43Z&loginName=YSL1484052178554"
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
public function dataUpdatesWebhook(Request $request)
|
|
|
|
{
|
|
|
|
//this is the main hook we use for notifications
|
|
|
|
|
|
|
|
nlog("data refresh");
|
|
|
|
nlog($request->all());
|
|
|
|
|
|
|
|
return response()->json(['message' => 'Success'], 200);
|
|
|
|
|
|
|
|
//
|
2022-09-21 13:03:04 +02:00
|
|
|
|
2022-11-05 02:27:01 +01:00
|
|
|
// return response()->json(['message' => 'Unauthorized'], 403);
|
2022-09-07 07:24:08 +02:00
|
|
|
}
|
|
|
|
|
2022-07-28 06:09:13 +02:00
|
|
|
}
|