"+e.messages.message[0].code+": "+e.messages.message[0].text+"
"),document.getElementById("card_button").disabled=!1,document.querySelector("#card_button > svg").classList.add("hidden"),document.querySelector("#card_button > span").classList.remove("hidden")):"Ok"===e.messages.resultCode&&(document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue,document.getElementById("server_response").submit()),!1}},{key:"handle",value:function(){var e=this;return this.cardButton.addEventListener("click",(function(){e.cardButton.disabled=!e.cardButton.disabled,e.handleAuthorization()})),this}}])&&t(r.prototype,n),a&&t(r,a),Object.defineProperty(r,"prototype",{writable:!1}),e}();new r(document.querySelector('meta[name="authorize-public-key"]').content,document.querySelector('meta[name="authorize-login-id"]').content).handle()})(); \ No newline at end of file +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!**************************************************************************!*\ + !*** ./resources/js/clients/payment_methods/authorize-authorize-card.js ***! + \**************************************************************************/ +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +/** + * Invoice Ninja (https://invoiceninja.com) + * + * @link https://github.com/invoiceninja/invoiceninja source repository + * + * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) + * + * @license https://www.elastic.co/licensing/elastic-license + */ +var AuthorizeAuthorizeCard = /*#__PURE__*/function () { + function AuthorizeAuthorizeCard(publicKey, loginId) { + _classCallCheck(this, AuthorizeAuthorizeCard); + this.publicKey = publicKey; + this.loginId = loginId; + this.cardHolderName = document.getElementById("cardholder_name"); + this.cardButton = document.getElementById("card_button"); + } + _createClass(AuthorizeAuthorizeCard, [{ + key: "handleAuthorization", + value: function handleAuthorization() { + if (cvvRequired == "1" && document.getElementById("cvv").value.length < 3) { + var $errors = $('#errors'); + $errors.show().html("CVV is required
"); + document.getElementById('card_button').disabled = false; + document.querySelector('#card_button > svg').classList.add('hidden'); + document.querySelector('#card_button > span').classList.remove('hidden'); + return; + } + var myCard = $('#my-card'); + var authData = {}; + authData.clientKey = this.publicKey; + authData.apiLoginID = this.loginId; + var cardData = {}; + cardData.cardNumber = myCard.CardJs('cardNumber').replace(/[^\d]/g, ''); + cardData.month = myCard.CardJs('expiryMonth').replace(/[^\d]/g, ''); + cardData.year = myCard.CardJs('expiryYear').replace(/[^\d]/g, ''); + cardData.cardCode = document.getElementById("cvv").value.replace(/[^\d]/g, ''); + ; + var secureData = {}; + secureData.authData = authData; + secureData.cardData = cardData; + document.getElementById('card_button').disabled = true; + document.querySelector('#card_button > svg').classList.remove('hidden'); + document.querySelector('#card_button > span').classList.add('hidden'); + Accept.dispatchData(secureData, this.responseHandler); + return false; + } + }, { + key: "responseHandler", + value: function responseHandler(response) { + if (response.messages.resultCode === "Error") { + var i = 0; + var $errors = $('#errors'); // get the reference of the div + $errors.show().html("" + response.messages.message[i].code + ": " + response.messages.message[i].text + "
"); + document.getElementById('card_button').disabled = false; + document.querySelector('#card_button > svg').classList.add('hidden'); + document.querySelector('#card_button > span').classList.remove('hidden'); + } else if (response.messages.resultCode === "Ok") { + document.getElementById("dataDescriptor").value = response.opaqueData.dataDescriptor; + document.getElementById("dataValue").value = response.opaqueData.dataValue; + document.getElementById("server_response").submit(); + } + return false; + } + }, { + key: "handle", + value: function handle() { + var _this = this; + this.cardButton.addEventListener("click", function () { + _this.cardButton.disabled = !_this.cardButton.disabled; + _this.handleAuthorization(); + }); + return this; + } + }]); + return AuthorizeAuthorizeCard; +}(); +var publicKey = document.querySelector('meta[name="authorize-public-key"]').content; +var loginId = document.querySelector('meta[name="authorize-login-id"]').content; +var cvvRequired = document.querySelector('meta[name="authnet-require-cvv"]').content; + +/** @handle */ +new AuthorizeAuthorizeCard(publicKey, loginId).handle(); +/******/ })() +; \ No newline at end of file diff --git a/public/js/clients/payment_methods/authorize-checkout-card.js b/public/js/clients/payment_methods/authorize-checkout-card.js index fdccb142a349..8e0a99f72f43 100644 --- a/public/js/clients/payment_methods/authorize-checkout-card.js +++ b/public/js/clients/payment_methods/authorize-checkout-card.js @@ -1,2 +1,54 @@ -/*! For license information please see authorize-checkout-card.js.LICENSE.txt */ -(()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(t,n){for(var r=0;r"+e.messages.message[0].code+": "+e.messages.message[0].text+"
"),document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}else if("Ok"===e.messages.resultCode){document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue;var t=document.querySelector("input[name=token-billing-checkbox]:checked");t&&(document.getElementById("store_card").value=t.value),document.getElementById("server_response").submit()}return!1})),n(this,"handle",(function(){Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach((function(e){return e.addEventListener("click",(function(e){document.getElementById("save-card--container").style.display="none",document.getElementById("authorize--credit-card-container").style.display="none",document.getElementById("token").value=e.target.dataset.token}))}));var e=document.getElementById("toggle-payment-with-credit-card");e&&e.addEventListener("click",(function(){document.getElementById("save-card--container").style.display="grid",document.getElementById("authorize--credit-card-container").style.display="flex",document.getElementById("token").value=null}));var t=document.getElementById("pay-now");return t&&t.addEventListener("click",(function(e){var t=document.getElementById("token");t.value?a.handlePayNowAction(t.value):a.handleAuthorization()})),a})),this.publicKey=t,this.loginId=r,this.cardHolderName=document.getElementById("cardholder_name")}var r,a,o;return r=e,(a=[{key:"handlePayNowAction",value:function(e){document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),document.getElementById("token").value=e,document.getElementById("server_response").submit()}}])&&t(r.prototype,a),o&&t(r,o),Object.defineProperty(r,"prototype",{writable:!1}),e}();new a(document.querySelector('meta[name="authorize-public-key"]').content,document.querySelector('meta[name="authorize-login-id"]').content).handle()})(); \ No newline at end of file +/******/ (() => { // webpackBootstrap +var __webpack_exports__ = {}; +/*!************************************************************************!*\ + !*** ./resources/js/clients/payments/authorize-credit-card-payment.js ***! + \************************************************************************/ +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +/** + * Invoice Ninja (https://invoiceninja.com) + * + * @link https://github.com/invoiceninja/invoiceninja source repository + * + * @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com) + * + * @license https://www.elastic.co/licensing/elastic-license + */ +var AuthorizeAuthorizeCard = /*#__PURE__*/function () { + function AuthorizeAuthorizeCard(publicKey, loginId) { + var _this = this; + _classCallCheck(this, AuthorizeAuthorizeCard); + _defineProperty(this, "handleAuthorization", function () { + if (cvvRequired == "1" && document.getElementById("cvv").value.length < 3) { + var $errors = $('#errors'); + $errors.show().html("CVV is required
"); + document.getElementById('pay-now').disabled = false; + document.querySelector('#pay-now > svg').classList.add('hidden'); + document.querySelector('#pay-now > span').classList.remove('hidden'); + return; + } + var myCard = $('#my-card'); + var authData = {}; + authData.clientKey = _this.publicKey; + authData.apiLoginID = _this.loginId; + var cardData = {}; + cardData.cardNumber = myCard.CardJs('cardNumber').replace(/[^\d]/g, ''); + cardData.month = myCard.CardJs('expiryMonth').replace(/[^\d]/g, ''); + cardData.year = myCard.CardJs('expiryYear').replace(/[^\d]/g, ''); + cardData.cardCode = document.getElementById("cvv").value.replace(/[^\d]/g, ''); + var secureData = {}; + secureData.authData = authData; + secureData.cardData = cardData; + // If using banking information instead of card information, + // send the bankData object instead of the cardData object. + // + // secureData.bankData = bankData; + var payNowButton = document.getElementById('pay-now'); + if (payNowButton) { + document.getElementById('pay-now').disabled = true; + document.querySelector('#pay-now > svg').classList.remove('hidden'); + document.querySelector('#pay-now > span').classList.add('hidden'); + } + Accept.dispatchData(secureData, _this.responseHandler); + return false; + }); + _defineProperty(this, "responseHandler", function (response) { + if (response.messages.resultCode === "Error") { + var i = 0; + var $errors = $('#errors'); // get the reference of the div + $errors.show().html("" + response.messages.message[i].code + ": " + response.messages.message[i].text + "
"); + document.getElementById('pay-now').disabled = false; + document.querySelector('#pay-now > svg').classList.add('hidden'); + document.querySelector('#pay-now > span').classList.remove('hidden'); + } else if (response.messages.resultCode === "Ok") { + document.getElementById("dataDescriptor").value = response.opaqueData.dataDescriptor; + document.getElementById("dataValue").value = response.opaqueData.dataValue; + var storeCard = document.querySelector('input[name=token-billing-checkbox]:checked'); + if (storeCard) { + document.getElementById("store_card").value = storeCard.value; + } + document.getElementById("server_response").submit(); + } + return false; + }); + _defineProperty(this, "handle", function () { + Array.from(document.getElementsByClassName('toggle-payment-with-token')).forEach(function (element) { + return element.addEventListener('click', function (e) { + document.getElementById('save-card--container').style.display = 'none'; + document.getElementById('authorize--credit-card-container').style.display = 'none'; + document.getElementById('token').value = e.target.dataset.token; + }); + }); + var payWithCreditCardToggle = document.getElementById('toggle-payment-with-credit-card'); + if (payWithCreditCardToggle) { + payWithCreditCardToggle.addEventListener('click', function () { + document.getElementById('save-card--container').style.display = 'grid'; + document.getElementById('authorize--credit-card-container').style.display = 'flex'; + document.getElementById('token').value = null; + }); + } + var payNowButton = document.getElementById('pay-now'); + if (payNowButton) { + payNowButton.addEventListener('click', function (e) { + var token = document.getElementById('token'); + token.value ? _this.handlePayNowAction(token.value) : _this.handleAuthorization(); + }); + } + return _this; + }); + this.publicKey = publicKey; + this.loginId = loginId; + this.cardHolderName = document.getElementById("cardholder_name"); + } + _createClass(AuthorizeAuthorizeCard, [{ + key: "handlePayNowAction", + value: function handlePayNowAction(token_hashed_id) { + document.getElementById('pay-now').disabled = true; + document.querySelector('#pay-now > svg').classList.remove('hidden'); + document.querySelector('#pay-now > span').classList.add('hidden'); + document.getElementById("token").value = token_hashed_id; + document.getElementById("server_response").submit(); + } + }]); + return AuthorizeAuthorizeCard; +}(); +var publicKey = document.querySelector('meta[name="authorize-public-key"]').content; +var loginId = document.querySelector('meta[name="authorize-login-id"]').content; +var cvvRequired = document.querySelector('meta[name="authnet-require-cvv"]').content; + +/** @handle */ +new AuthorizeAuthorizeCard(publicKey, loginId).handle(); +/******/ })() +; \ No newline at end of file diff --git a/public/js/clients/payments/braintree-credit-card.js b/public/js/clients/payments/braintree-credit-card.js index 865b6e406275..793b48d3e9e7 100644 --- a/public/js/clients/payments/braintree-credit-card.js +++ b/public/js/clients/payments/braintree-credit-card.js @@ -1,2 +1,138 @@ -/*! For license information please see braintree-credit-card.js.LICENSE.txt */ -(()=>{function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}function t(t,n){for(var r=0;rCVV is required
"); + + document.getElementById('card_button').disabled = false; + document.querySelector('#card_button > svg').classList.add('hidden'); + document.querySelector('#card_button > span').classList.remove('hidden'); + + return; + } + var myCard = $('#my-card'); var authData = {}; @@ -84,5 +97,9 @@ const loginId = document.querySelector( 'meta[name="authorize-login-id"]' ).content; +const cvvRequired = document.querySelector( + 'meta[name="authnet-require-cvv"]' +).content; + /** @handle */ new AuthorizeAuthorizeCard(publicKey, loginId).handle(); diff --git a/resources/js/clients/payments/authorize-credit-card-payment.js b/resources/js/clients/payments/authorize-credit-card-payment.js index 13524efb3fdb..2d4ec69b3546 100644 --- a/resources/js/clients/payments/authorize-credit-card-payment.js +++ b/resources/js/clients/payments/authorize-credit-card-payment.js @@ -18,6 +18,16 @@ class AuthorizeAuthorizeCard { handleAuthorization = () => { + if (cvvRequired == "1" && document.getElementById("cvv").value.length < 3) { + var $errors = $('#errors'); + $errors.show().html("CVV is required
"); + + document.getElementById('pay-now').disabled = false; + document.querySelector('#pay-now > svg').classList.add('hidden'); + document.querySelector('#pay-now > span').classList.remove('hidden'); + return; + } + var myCard = $('#my-card'); var authData = {}; @@ -141,5 +151,9 @@ const loginId = document.querySelector( 'meta[name="authorize-login-id"]' ).content; +const cvvRequired = document.querySelector( + 'meta[name="authnet-require-cvv"]' +).content; + /** @handle */ new AuthorizeAuthorizeCard(publicKey, loginId).handle(); diff --git a/resources/views/portal/ninja2020/gateways/authorize/credit_card/authorize.blade.php b/resources/views/portal/ninja2020/gateways/authorize/credit_card/authorize.blade.php index f16f3a15873f..6ba12c7118d4 100644 --- a/resources/views/portal/ninja2020/gateways/authorize/credit_card/authorize.blade.php +++ b/resources/views/portal/ninja2020/gateways/authorize/credit_card/authorize.blade.php @@ -6,6 +6,7 @@ + diff --git a/resources/views/portal/ninja2020/gateways/authorize/credit_card/pay.blade.php b/resources/views/portal/ninja2020/gateways/authorize/credit_card/pay.blade.php index 0125dcd18700..650d5dc02cc7 100644 --- a/resources/views/portal/ninja2020/gateways/authorize/credit_card/pay.blade.php +++ b/resources/views/portal/ninja2020/gateways/authorize/credit_card/pay.blade.php @@ -6,6 +6,7 @@ + @endsection diff --git a/resources/views/portal/ninja2020/invoices/payment.blade.php b/resources/views/portal/ninja2020/invoices/payment.blade.php index bc476baca7ed..7d6da3475fce 100644 --- a/resources/views/portal/ninja2020/invoices/payment.blade.php +++ b/resources/views/portal/ninja2020/invoices/payment.blade.php @@ -87,6 +87,18 @@ @endif + @if($settings->client_portal_allow_under_payment || $settings->client_portal_allow_over_payment) +