mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-06-03 03:54:34 -04:00
Filters for bank accounts
This commit is contained in:
parent
50398360b9
commit
ef388a0c77
@ -115,6 +115,28 @@ class BankTransactionFilters extends QueryFilters
|
||||
return $this->builder;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Filters the list based on Bank Accounts.
|
||||
*
|
||||
* @param string $ids Comma Separated List of bank account ids
|
||||
* @return Builder
|
||||
*/
|
||||
public function bank_integration_ids(string $ids = ''): Builder
|
||||
{
|
||||
if(strlen($ids) == 0)
|
||||
return $this->builder;
|
||||
|
||||
$ids = $this->transformKeys(explode(",", $ids));
|
||||
|
||||
$this->builder->where(function ($query) use ($ids) {
|
||||
$query->whereIn('bank_integration_id', $ids);
|
||||
});
|
||||
|
||||
return $this->builder;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorts the list based on $sort.
|
||||
*
|
||||
|
@ -94,7 +94,101 @@
|
||||
const clientId = "{{ $client_id }}";
|
||||
const orderId = "{!! $order_id !!}";
|
||||
|
||||
const buttons = paypal.Buttons();
|
||||
const buttons = paypal.Buttons({
|
||||
client: clientId,
|
||||
createOrder: function(data, actions) {
|
||||
return orderId;
|
||||
},
|
||||
onApprove: function(data, actions) {
|
||||
|
||||
const { liabilityShift, orderID } = data;
|
||||
if(liabilityShift) {
|
||||
|
||||
/* Handle liability shift. More information in 3D Secure response parameters */
|
||||
if(liabilityShift == 'NO') {
|
||||
|
||||
document.getElementById('errors').textContent = `Sorry, your transaction could not be processed, Please try a different payment method.`;
|
||||
document.getElementById('errors').hidden = false;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
let storeCard = document.querySelector('input[name=token-billing-checkbox]:checked');
|
||||
|
||||
if (storeCard) {
|
||||
document.getElementById("store_card").value = storeCard.value;
|
||||
}
|
||||
|
||||
document.getElementById("gateway_response").value =JSON.stringify( data );
|
||||
|
||||
formData = JSON.stringify(Object.fromEntries(new FormData(document.getElementById("server_response")))),
|
||||
|
||||
fetch('{{ route('client.payments.response') }}', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
"X-Requested-With": "XMLHttpRequest",
|
||||
"X-CSRF-Token": document.querySelector('meta[name="csrf-token"]').content
|
||||
},
|
||||
body: formData,
|
||||
})
|
||||
.then(response => {
|
||||
if (!response.ok) {
|
||||
throw new Error('Network response was not ok ' + response.statusText);
|
||||
}
|
||||
return response.json();
|
||||
})
|
||||
.then(data => {
|
||||
|
||||
var errorDetail = Array.isArray(data.details) && data.details[0];
|
||||
|
||||
if (errorDetail && ['INSTRUMENT_DECLINED', 'PAYER_ACTION_REQUIRED'].includes(errorDetail.issue)) {
|
||||
return actions.restart();
|
||||
}
|
||||
|
||||
if(data.redirect){
|
||||
window.location.href = data.redirect;
|
||||
return;
|
||||
}
|
||||
|
||||
document.getElementById("gateway_response").value =JSON.stringify( data );
|
||||
document.getElementById("server_response").submit();
|
||||
})
|
||||
.catch(error => {
|
||||
console.error('Error:', error);
|
||||
|
||||
document.getElementById('errors').textContent = `Sorry, your transaction could not be processed...\n\n${error.message}`;
|
||||
document.getElementById('errors').hidden = false;
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
onCancel: function() {
|
||||
|
||||
window.location.href = "/client/invoices/";
|
||||
},
|
||||
// onError: function(error) {
|
||||
|
||||
|
||||
// console.log("submit catch");
|
||||
// const errorM = parseError(error);
|
||||
|
||||
// console.log(errorM);
|
||||
|
||||
// const msg = handle422Error(errorM);
|
||||
|
||||
// document.getElementById('errors').textContent = `Sorry, your transaction could not be processed...\n\n${msg.description}`;
|
||||
// document.getElementById('errors').hidden = false;
|
||||
|
||||
// },
|
||||
onClick: function (){
|
||||
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
@if(strlen($pp_client_reference) > 1)
|
||||
buttons.render('#paypal-button-container');
|
||||
@ -243,6 +337,8 @@
|
||||
|
||||
}).catch((error) => {
|
||||
|
||||
console.log(error);
|
||||
|
||||
let msg;
|
||||
|
||||
if(!['INVALID_NUMBER','INVALID_CVV','INVALID_EXPIRY'].includes(error.message))
|
||||
|
@ -40,6 +40,98 @@ class BankTransactionTest extends TestCase
|
||||
);
|
||||
}
|
||||
|
||||
public function testBankIntegrationFilters()
|
||||
{
|
||||
|
||||
$bi = BankIntegrationFactory::create($this->company->id, $this->user->id, $this->account->id);
|
||||
$bi->bank_account_name = "Bank1";
|
||||
$bi->save();
|
||||
|
||||
$bt = BankTransactionFactory::create($this->company->id, $this->user->id);
|
||||
$bt->bank_integration_id = $bi->id;
|
||||
$bt->status_id = BankTransaction::STATUS_UNMATCHED;
|
||||
$bt->description = 'Fuel';
|
||||
$bt->amount = 10;
|
||||
$bt->currency_code = $this->client->currency()->code;
|
||||
$bt->date = now()->format('Y-m-d');
|
||||
$bt->transaction_id = 1234567890;
|
||||
$bt->category_id = 10000003;
|
||||
$bt->base_type = 'DEBIT';
|
||||
$bt->save();
|
||||
|
||||
|
||||
$bi2 = BankIntegrationFactory::create($this->company->id, $this->user->id, $this->account->id);
|
||||
$bi2->bank_account_name = "Bank2";
|
||||
$bi2->save();
|
||||
|
||||
$bt = BankTransactionFactory::create($this->company->id, $this->user->id);
|
||||
$bt->bank_integration_id = $bi2->id;
|
||||
$bt->status_id = BankTransaction::STATUS_UNMATCHED;
|
||||
$bt->description = 'Fuel';
|
||||
$bt->amount = 20;
|
||||
$bt->currency_code = $this->client->currency()->code;
|
||||
$bt->date = now()->format('Y-m-d');
|
||||
$bt->transaction_id = 1234567890;
|
||||
$bt->category_id = 10000003;
|
||||
$bt->base_type = 'DEBIT';
|
||||
$bt->save();
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token,
|
||||
])->getJson('/api/v1/bank_transactions');
|
||||
|
||||
$response->assertStatus(200);
|
||||
|
||||
$arr = $response->json();
|
||||
|
||||
$transaction_count = count($arr['data']);
|
||||
|
||||
$this->assertGreaterThan(1, $transaction_count);
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token,
|
||||
])->getJson('/api/v1/bank_transactions?bank_integration_ids='.$bi->hashed_id);
|
||||
|
||||
$response->assertStatus(200);
|
||||
|
||||
$arr = $response->json();
|
||||
|
||||
$transaction_count = count($arr['data']);
|
||||
|
||||
$this->assertCount(1, $arr['data']);
|
||||
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token,
|
||||
])->getJson('/api/v1/bank_transactions?bank_integration_ids='.$bi2->hashed_id);
|
||||
|
||||
$response->assertStatus(200);
|
||||
|
||||
$arr = $response->json();
|
||||
|
||||
$transaction_count = count($arr['data']);
|
||||
|
||||
$this->assertCount(1, $arr['data']);
|
||||
|
||||
$response = $this->withHeaders([
|
||||
'X-API-SECRET' => config('ninja.api_secret'),
|
||||
'X-API-TOKEN' => $this->token,
|
||||
])->getJson('/api/v1/bank_transactions?bank_integration_ids='.$bi2->hashed_id.",".$bi->hashed_id);
|
||||
|
||||
$response->assertStatus(200);
|
||||
|
||||
$arr = $response->json();
|
||||
|
||||
$transaction_count = count($arr['data']);
|
||||
|
||||
$this->assertCount(2, $arr['data']);
|
||||
|
||||
|
||||
}
|
||||
|
||||
public function testLinkMultipleExpensesWithDeleteToTransaction()
|
||||
{
|
||||
$data = [];
|
||||
|
Loading…
x
Reference in New Issue
Block a user