mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-06-20 19:10:55 -04:00
* stripe: ach * stripe: klarna * stripe: bank transfer * assets build * stripe: bacs * stripe: bancontact * stripe: becs * stripe: eps * stripe: fpx * stripe: giropay * stripe: ideal * stripe: przelewy24 * stripe: sepa * stripe: sofort * assets build * assets build * pass context payload into livewirePaymentView * update checkout.com * update livewire method interface * stripe: acss * align methods with interface (array $data)
169 lines
6.6 KiB
JavaScript
Vendored
169 lines
6.6 KiB
JavaScript
Vendored
/**
|
|
* Invoice Ninja (https://invoiceninja.com).
|
|
*
|
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
|
*
|
|
* @copyright Copyright (c) 2024. Invoice Ninja LLC (https://invoiceninja.com)
|
|
*
|
|
* @license https://www.elastic.co/licensing/elastic-license
|
|
*/
|
|
|
|
import { wait } from '../wait';
|
|
|
|
wait('#stripe-ach-payment').then(() => ach());
|
|
|
|
function ach() {
|
|
let payNow = document.getElementById('pay-now');
|
|
|
|
if (payNow) {
|
|
Array.from(
|
|
document.getElementsByClassName('toggle-payment-with-token')
|
|
).forEach((element) =>
|
|
element.addEventListener('click', (element) => {
|
|
document.querySelector('input[name=source]').value =
|
|
element.target.dataset.token;
|
|
})
|
|
);
|
|
payNow.addEventListener('click', function () {
|
|
let payNowButton = document.getElementById('pay-now');
|
|
payNowButton.disabled = true;
|
|
payNowButton.querySelector('svg').classList.remove('hidden');
|
|
payNowButton.querySelector('span').classList.add('hidden');
|
|
document.getElementById('server-response').submit();
|
|
});
|
|
}
|
|
|
|
document.getElementById('new-bank').addEventListener('click', (ev) => {
|
|
if (!document.getElementById('accept-terms').checked) {
|
|
errors.textContent =
|
|
'You must accept the mandate terms prior to making payment.';
|
|
errors.hidden = false;
|
|
return;
|
|
}
|
|
|
|
errors.hidden = true;
|
|
|
|
let stripe;
|
|
|
|
let publishableKey = document.querySelector(
|
|
'meta[name="stripe-publishable-key"]'
|
|
).content;
|
|
|
|
let stripeConnect = document.querySelector(
|
|
'meta[name="stripe-account-id"]'
|
|
)?.content;
|
|
|
|
if (stripeConnect) {
|
|
stripe = Stripe(publishableKey, { stripeAccount: stripeConnect });
|
|
} else {
|
|
stripe = Stripe(publishableKey);
|
|
}
|
|
|
|
let newBankButton = document.getElementById('new-bank');
|
|
newBankButton.disabled = true;
|
|
newBankButton.querySelector('svg').classList.remove('hidden');
|
|
newBankButton.querySelector('span').classList.add('hidden');
|
|
|
|
ev.preventDefault();
|
|
const accountHolderNameField = document.getElementById(
|
|
'account-holder-name-field'
|
|
);
|
|
const emailField = document.getElementById('email-field');
|
|
const clientSecret = document.querySelector(
|
|
'meta[name="client_secret"]'
|
|
)?.content;
|
|
// Calling this method will open the instant verification dialog.
|
|
stripe
|
|
.collectBankAccountForPayment({
|
|
clientSecret: clientSecret,
|
|
params: {
|
|
payment_method_type: 'us_bank_account',
|
|
payment_method_data: {
|
|
billing_details: {
|
|
name: accountHolderNameField.value,
|
|
email: emailField.value,
|
|
},
|
|
},
|
|
},
|
|
expand: ['payment_method'],
|
|
})
|
|
.then(({ paymentIntent, error }) => {
|
|
if (error) {
|
|
console.error(error.message);
|
|
errors.textContent = error.message;
|
|
errors.hidden = false;
|
|
resetButtons();
|
|
|
|
// PaymentMethod collection failed for some reason.
|
|
} else if (paymentIntent.status === 'requires_payment_method') {
|
|
// Customer canceled the hosted verification modal. Present them with other
|
|
// payment method type options.
|
|
|
|
errors.textContent =
|
|
'We were unable to process the payment with this account, please try another one.';
|
|
errors.hidden = false;
|
|
resetButtons();
|
|
return;
|
|
} else if (paymentIntent.status === 'requires_confirmation') {
|
|
let bank_account_response = document.getElementById(
|
|
'bank_account_response'
|
|
);
|
|
bank_account_response.value = JSON.stringify(paymentIntent);
|
|
|
|
confirmPayment(stripe, clientSecret);
|
|
}
|
|
|
|
resetButtons();
|
|
return;
|
|
});
|
|
});
|
|
|
|
function confirmPayment(stripe, clientSecret) {
|
|
stripe
|
|
.confirmUsBankAccountPayment(clientSecret)
|
|
.then(({ paymentIntent, error }) => {
|
|
console.log(paymentIntent);
|
|
if (error) {
|
|
console.error(error.message);
|
|
// The payment failed for some reason.
|
|
} else if (paymentIntent.status === 'requires_payment_method') {
|
|
// Confirmation failed. Attempt again with a different payment method.
|
|
|
|
errors.textContent =
|
|
'We were unable to process the payment with this account, please try another one.';
|
|
errors.hidden = false;
|
|
resetButtons();
|
|
} else if (paymentIntent.status === 'processing') {
|
|
// Confirmation succeeded! The account will be debited.
|
|
|
|
let gateway_response =
|
|
document.getElementById('gateway_response');
|
|
gateway_response.value = JSON.stringify(paymentIntent);
|
|
document.getElementById('server-response').submit();
|
|
} else if (
|
|
paymentIntent.next_action?.type ===
|
|
'verify_with_microdeposits' ||
|
|
paymentIntent.next_action?.type === 'requires_source_action'
|
|
) {
|
|
errors.textContent =
|
|
'You will receive an email with details on how to verify your bank account and process payment.';
|
|
errors.hidden = false;
|
|
document.getElementById('new-bank').style.visibility =
|
|
'hidden';
|
|
|
|
let gateway_response =
|
|
document.getElementById('gateway_response');
|
|
gateway_response.value = JSON.stringify(paymentIntent);
|
|
document.getElementById('server-response').submit();
|
|
}
|
|
});
|
|
}
|
|
|
|
function resetButtons() {
|
|
let newBankButton = document.getElementById('new-bank');
|
|
newBankButton.disabled = false;
|
|
newBankButton.querySelector('svg').classList.add('hidden');
|
|
newBankButton.querySelector('span').classList.remove('hidden');
|
|
}
|
|
}
|