mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-11-03 23:47:32 -05:00 
			
		
		
		
	PayPal: New payment flow (#81)
* extract payment view and data * scaffold pay livewire * express * fix for checkout interface * card * rest * ppcp * assets build * fix for duplicate pay button
This commit is contained in:
		
							parent
							
								
									2baebffc32
								
							
						
					
					
						commit
						05d7211c4c
					
				@ -141,7 +141,7 @@ class CreditCard implements MethodInterface, LivewireMethodInterface
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private function paymentData(array $data): array
 | 
					    public function paymentData(array $data): array
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $data['gateway'] = $this->checkout;
 | 
					        $data['gateway'] = $this->checkout;
 | 
				
			||||||
        $data['company_gateway'] = $this->checkout->company_gateway;
 | 
					        $data['company_gateway'] = $this->checkout->company_gateway;
 | 
				
			||||||
 | 
				
			|||||||
@ -97,7 +97,7 @@ class PayPalExpressPaymentDriver extends BaseDriver
 | 
				
			|||||||
            ->send();
 | 
					            ->send();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if ($response->isRedirect()) {
 | 
					        if ($response->isRedirect()) {
 | 
				
			||||||
            return $response->redirect();
 | 
					            return redirect($response->getRedirectUrl());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // $this->sendFailureMail($response->getMessage() ?: '');
 | 
					        // $this->sendFailureMail($response->getMessage() ?: '');
 | 
				
			||||||
@ -246,4 +246,16 @@ class PayPalExpressPaymentDriver extends BaseDriver
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return 0;
 | 
					        return 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function livewirePaymentView(array $data): string
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->processPaymentView($data);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return ''; // Gateway is offsite.
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function processPaymentViewData(array $data): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return $data;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -85,30 +85,13 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    public function processPaymentView($data)
 | 
					    public function processPaymentView($data)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        $data = $this->processPaymentViewData($data);
 | 
				
			||||||
        $this->init()->checkPaymentsReceivable();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $data['gateway'] = $this;
 | 
					 | 
				
			||||||
        $this->payment_hash->data = array_merge((array) $this->payment_hash->data, ['amount' => $data['total']['amount_with_fee']]);
 | 
					 | 
				
			||||||
        $this->payment_hash->save();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $data['client_id'] = config('ninja.paypal.client_id');
 | 
					 | 
				
			||||||
        $data['token'] = $this->getClientToken();
 | 
					 | 
				
			||||||
        $data['order_id'] = $this->createOrder($data);
 | 
					 | 
				
			||||||
        $data['funding_source'] = $this->paypal_payment_method;
 | 
					 | 
				
			||||||
        $data['gateway_type_id'] = $this->gateway_type_id;
 | 
					 | 
				
			||||||
        $data['merchantId'] = $this->company_gateway->getConfigField('merchantId');
 | 
					 | 
				
			||||||
        $data['currency'] = $this->client->currency()->code;
 | 
					 | 
				
			||||||
        $data['guid'] = $this->risk_guid;
 | 
					 | 
				
			||||||
        $data['identifier'] = "s:INN_".$this->company_gateway->getConfigField('merchantId')."_CHCK";
 | 
					 | 
				
			||||||
        $data['pp_client_reference'] = $this->getClientHash();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if($this->gateway_type_id == 29) {
 | 
					        if($this->gateway_type_id == 29) {
 | 
				
			||||||
            return render('gateways.paypal.ppcp.card', $data);
 | 
					            return render('gateways.paypal.ppcp.card', $data);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            return render('gateways.paypal.ppcp.pay', $data);
 | 
					            return render('gateways.paypal.ppcp.pay', $data);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -453,4 +436,34 @@ class PayPalPPCPPaymentDriver extends PayPalBasePaymentDriver
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function processPaymentViewData(array $data): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->init()->checkPaymentsReceivable();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data['gateway'] = $this;
 | 
				
			||||||
 | 
					        $this->payment_hash->data = array_merge((array) $this->payment_hash->data, ['amount' => $data['total']['amount_with_fee']]);
 | 
				
			||||||
 | 
					        $this->payment_hash->save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data['client_id'] = config('ninja.paypal.client_id');
 | 
				
			||||||
 | 
					        $data['token'] = $this->getClientToken();
 | 
				
			||||||
 | 
					        $data['order_id'] = $this->createOrder($data);
 | 
				
			||||||
 | 
					        $data['funding_source'] = $this->paypal_payment_method;
 | 
				
			||||||
 | 
					        $data['gateway_type_id'] = $this->gateway_type_id;
 | 
				
			||||||
 | 
					        $data['merchantId'] = $this->company_gateway->getConfigField('merchantId');
 | 
				
			||||||
 | 
					        $data['currency'] = $this->client->currency()->code;
 | 
				
			||||||
 | 
					        $data['guid'] = $this->risk_guid;
 | 
				
			||||||
 | 
					        $data['identifier'] = "s:INN_".$this->company_gateway->getConfigField('merchantId')."_CHCK";
 | 
				
			||||||
 | 
					        $data['pp_client_reference'] = $this->getClientHash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $data;
 | 
				
			||||||
 | 
					    } 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function livewirePaymentView(array $data): string 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if ($this->gateway_type_id == 29) {
 | 
				
			||||||
 | 
					            return 'gateways.paypal.ppcp.card_livewire';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return 'gateways.paypal.ppcp.pay_livewire';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -31,30 +31,13 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    public function processPaymentView($data)
 | 
					    public function processPaymentView($data)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        $data = $this->processPaymentViewData($data);
 | 
				
			||||||
        $this->init();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $data['gateway'] = $this;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $this->payment_hash->data = array_merge((array) $this->payment_hash->data, ['amount' => $data['total']['amount_with_fee']]);
 | 
					 | 
				
			||||||
        $this->payment_hash->save();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        $data['client_id'] = $this->company_gateway->getConfigField('clientId');
 | 
					 | 
				
			||||||
        $data['token'] = $this->getClientToken();
 | 
					 | 
				
			||||||
        $data['order_id'] = $this->createOrder($data);
 | 
					 | 
				
			||||||
        $data['funding_source'] = $this->paypal_payment_method;
 | 
					 | 
				
			||||||
        $data['gateway_type_id'] = $this->gateway_type_id;
 | 
					 | 
				
			||||||
        $data['currency'] = $this->client->currency()->code;
 | 
					 | 
				
			||||||
        $data['guid'] = $this->risk_guid;
 | 
					 | 
				
			||||||
        $data['identifier'] = "s:INN_ACDC_CHCK";
 | 
					 | 
				
			||||||
        $data['pp_client_reference'] = $this->getClientHash();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if($this->gateway_type_id == 29) {
 | 
					        if($this->gateway_type_id == 29) {
 | 
				
			||||||
            return render('gateways.paypal.ppcp.card', $data);
 | 
					            return render('gateways.paypal.ppcp.card', $data);
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            return render('gateways.paypal.pay', $data);
 | 
					            return render('gateways.paypal.pay', $data);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@ -407,4 +390,35 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function processPaymentViewData(array $data): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data['gateway'] = $this;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $this->payment_hash->data = array_merge((array) $this->payment_hash->data, ['amount' => $data['total']['amount_with_fee']]);
 | 
				
			||||||
 | 
					        $this->payment_hash->save();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        $data['client_id'] = $this->company_gateway->getConfigField('clientId');
 | 
				
			||||||
 | 
					        $data['token'] = $this->getClientToken();
 | 
				
			||||||
 | 
					        $data['order_id'] = $this->createOrder($data);
 | 
				
			||||||
 | 
					        $data['funding_source'] = $this->paypal_payment_method;
 | 
				
			||||||
 | 
					        $data['gateway_type_id'] = $this->gateway_type_id;
 | 
				
			||||||
 | 
					        $data['currency'] = $this->client->currency()->code;
 | 
				
			||||||
 | 
					        $data['guid'] = $this->risk_guid;
 | 
				
			||||||
 | 
					        $data['identifier'] = "s:INN_ACDC_CHCK";
 | 
				
			||||||
 | 
					        $data['pp_client_reference'] = $this->getClientHash();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return $data;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function livewirePaymentView(array $data): string 
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        if ($this->gateway_type_id == 29) {
 | 
				
			||||||
 | 
					            return 'gateways.paypal.ppcp.card_livewire';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return 'gateways.paypal.pay_livewire';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										109
									
								
								public/build/assets/app-234e3402.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										109
									
								
								public/build/assets/app-234e3402.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										9
									
								
								public/build/assets/authorize-credit-card-payment-f92567bc.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/authorize-credit-card-payment-f92567bc.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var m=Object.defineProperty;var y=(n,e,t)=>e in n?m(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var o=(n,e,t)=>(y(n,typeof e!="symbol"?e+"":e,t),t);import{$ as h}from"./simple-card-4314d842.js";import{i as g,w as p}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class v{constructor(e,t){o(this,"handleAuthorization",()=>{var c,l,s,i;if(this.cvvRequired=="1"&&document.getElementById("cvv").value.length<3){const r=document.getElementById("errors");r&&(r.innerText="CVV is required",r.style.display="block"),document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden");return}var e={};e.clientKey=this.publicKey,e.apiLoginID=this.loginId;var t={};t.cardNumber=(c=this.sc.value("number"))==null?void 0:c.replace(/[^\d]/g,""),t.month=(l=this.sc.value("month"))==null?void 0:l.replace(/[^\d]/g,""),t.year=`20${(s=this.sc.value("year"))==null?void 0:s.replace(/[^\d]/g,"")}`,t.cardCode=(i=this.sc.value("cvv"))==null?void 0:i.replace(/[^\d]/g,"");var a={};return a.authData=e,a.cardData=t,document.getElementById("pay-now")&&(document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden")),Accept.dispatchData(a,this.responseHandler),!1});o(this,"responseHandler",e=>{if(e.messages.resultCode==="Error"){var t=0;const a=document.getElementById("errors");a&&(a.innerText=`${e.messages.message[t].code}: ${e.messages.message[t].text}`,a.style.display="block"),document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}else if(e.messages.resultCode==="Ok"){document.getElementById("dataDescriptor").value=e.opaqueData.dataDescriptor,document.getElementById("dataValue").value=e.opaqueData.dataValue;let a=document.querySelector("input[name=token-billing-checkbox]:checked");a&&(document.getElementById("store_card").value=a.value),document.getElementById("server_response").submit()}return!1});o(this,"handle",()=>{Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(a=>a.addEventListener("click",d=>{document.getElementById("save-card--container").style.display="none",document.getElementById("authorize--credit-card-container").style.display="none",document.getElementById("token").value=d.target.dataset.token}));let e=document.getElementById("toggle-payment-with-credit-card");e&&e.addEventListener("click",()=>{document.getElementById("save-card--container").style.display="grid",document.getElementById("authorize--credit-card-container").style.display="flex",document.getElementById("token").value=null});let t=document.getElementById("pay-now");return t&&t.addEventListener("click",a=>{let d=document.getElementById("token");d.value?this.handlePayNowAction(d.value):this.handleAuthorization()}),this});this.publicKey=e,this.loginId=t,this.cardHolderName=document.getElementById("cardholder_name"),this.sc=new h({fields:{card:{number:"#number",date:"#date",cvv:"#cvv"}}}),this.sc.mount(),this.cvvRequired=document.querySelector('meta[name="authnet-require-cvv"]').content}handlePayNowAction(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()}}function u(){const n=document.querySelector('meta[name="authorize-public-key"]').content,e=document.querySelector('meta[name="authorize-login-id"]').content;new v(n,e).handle()}g()?u():p("#authorize-net-credit-card-payment").then(()=>u());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/braintree-credit-card-60bd8878.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/braintree-credit-card-60bd8878.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import{i as l,w as s}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class c{initBraintreeDataCollector(){window.braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content},function(t,r){window.braintree.dataCollector.create({client:r,paypal:!0},function(n,e){n||(document.querySelector("input[name=client-data]").value=e.deviceData)})})}mountBraintreePaymentWidget(){window.braintree.dropin.create({authorization:document.querySelector("meta[name=client-token]").content,container:"#dropin-container",threeDSecure:document.querySelector("input[name=threeds_enable]").value.toLowerCase()==="true"},this.handleCallback)}handleCallback(t,r){if(t){console.error(t);return}let n=document.getElementById("pay-now"),e=JSON.parse(document.querySelector("input[name=threeds]").value);n.addEventListener("click",()=>{r.requestPaymentMethod({threeDSecure:{challengeRequested:!0,amount:e.amount,email:e.email,billingAddress:{givenName:e.billingAddress.givenName,surname:e.billingAddress.surname,phoneNumber:e.billingAddress.phoneNumber,streetAddress:e.billingAddress.streetAddress,extendedAddress:e.billingAddress.extendedAddress,locality:e.billingAddress.locality,region:e.billingAddress.region,postalCode:e.billingAddress.postalCode,countryCodeAlpha2:e.billingAddress.countryCodeAlpha2}}},function(i,a){if(i){console.log(i),dropin.clearSelectedPaymentMethod(),alert("There was a problem verifying this card, please contact your merchant");return}if(document.querySelector("input[name=threeds_enable]").value==="true"&&!a.liabilityShifted){console.log("Liability did not shift",a),alert("There was a problem verifying this card, please contact your merchant");return}n.disabled=!0,n.querySelector("svg").classList.remove("hidden"),n.querySelector("span").classList.add("hidden"),document.querySelector("input[name=gateway_response]").value=JSON.stringify(a);let d=document.querySelector('input[name="token-billing-checkbox"]:checked');d&&(document.querySelector('input[name="store_card"]').value=d.value),document.getElementById("server-response").submit()})})}handle(){this.initBraintreeDataCollector(),this.mountBraintreePaymentWidget(),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(r=>r.addEventListener("click",n=>{document.getElementById("dropin-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=n.target.dataset.token,document.getElementById("pay-now-with-token").classList.remove("hidden"),document.getElementById("pay-now").classList.add("hidden")})),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",r=>{document.getElementById("dropin-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value="",document.getElementById("pay-now-with-token").classList.add("hidden"),document.getElementById("pay-now").classList.remove("hidden")});let t=document.getElementById("pay-now-with-token");t.addEventListener("click",r=>{t.disabled=!0,t.querySelector("svg").classList.remove("hidden"),t.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()})}}function o(){new c().handle()}l()?o():s("#braintree-credit-card-payment","meta[name=client-token]").then(()=>o());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/eway-credit-card-0119725d.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/eway-credit-card-0119725d.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										9
									
								
								public/build/assets/forte-ach-payment-546428ee.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/forte-ach-payment-546428ee.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var s=Object.defineProperty;var d=(n,e,t)=>e in n?s(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var o=(n,e,t)=>(d(n,typeof e!="symbol"?e+"":e,t),t);import{i,w as u}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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://opensource.org/licenses/AAL
 | 
				
			||||||
 | 
					 */class c{constructor(e){o(this,"handleAuthorization",()=>{var e=document.getElementById("account-number").value,t=document.getElementById("routing-number").value,r={api_login_id:this.apiLoginId,account_number:e,routing_number:t,account_type:"checking"};return document.getElementById("pay-now")&&(document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden")),forte.createToken(r).success(this.successResponseHandler).error(this.failedResponseHandler),!1});o(this,"successResponseHandler",e=>(document.getElementById("payment_token").value=e.onetime_token,document.getElementById("server_response").submit(),!1));o(this,"failedResponseHandler",e=>{var t='<div class="alert alert-failure mb-4"><ul><li>'+e.response_description+"</li></ul></div>";return document.getElementById("forte_errors").innerHTML=t,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden"),!1});o(this,"handle",()=>{let e=document.getElementById("pay-now");return e&&e.addEventListener("click",t=>{this.handleAuthorization()}),this});this.apiLoginId=e}}function a(){const n=document.querySelector('meta[name="forte-api-login-id"]').content;new c(n).handle()}i()?a():u("#force-ach-payment").then(()=>a());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/forte-credit-card-payment-3ff75b59.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/forte-credit-card-payment-3ff75b59.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var c=Object.defineProperty;var l=(n,e,t)=>e in n?c(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var a=(n,e,t)=>(l(n,typeof e!="symbol"?e+"":e,t),t);import{i as u,w as m}from"./wait-8f4ae121.js";import{$ as p}from"./simple-card-4314d842.js";/**
 | 
				
			||||||
 | 
					 * 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://opensource.org/licenses/AAL
 | 
				
			||||||
 | 
					 */class y{constructor(e){a(this,"handleAuthorization",()=>{var r,o,d,s;const e={api_login_id:this.apiLoginId,card_number:(r=this.sc.value("number"))==null?void 0:r.replace(/[^\d]/g,""),expire_year:`20${(o=this.sc.value("year"))==null?void 0:o.replace(/[^\d]/g,"")}`,expire_month:(d=this.sc.value("month"))==null?void 0:d.replace(/[^\d]/g,""),cvv:(s=this.sc.value("cvv"))==null?void 0:s.replace(/[^\d]/g,"")};return document.getElementById("pay-now")&&(document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden")),forte.createToken(e).success(this.successResponseHandler).error(this.failedResponseHandler),!1});a(this,"successResponseHandler",e=>(document.getElementById("payment_token").value=e.onetime_token,document.getElementById("card_brand").value=e.card_type,document.getElementById("server_response").submit(),!1));a(this,"failedResponseHandler",e=>{var t='<div class="alert alert-failure mb-4"><ul><li>'+e.response_description+"</li></ul></div>";return document.getElementById("forte_errors").innerHTML=t,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden"),!1});a(this,"handle",()=>{let e=document.getElementById("pay-now");return e&&e.addEventListener("click",t=>{this.handleAuthorization()}),this});this.apiLoginId=e,this.cardHolderName=document.getElementById("cardholder_name"),this.sc=new p({fields:{card:{number:"#number",date:"#date",cvv:"#cvv"}}}),this.sc.mount()}}function i(){const n=document.querySelector('meta[name="forte-api-login-id"]').content;new y(n).handle()}u()?i():m("#forte-credit-card-payment").then(()=>i());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/mollie-credit-card-d81afbd4.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/mollie-credit-card-d81afbd4.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import{i as d,w as l}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class c{constructor(){var e,t;this.mollie=Mollie((e=document.querySelector("meta[name=mollie-profileId]"))==null?void 0:e.content,{testmode:(t=document.querySelector("meta[name=mollie-testmode]"))==null?void 0:t.content,locale:"en_US"})}createCardHolderInput(){let e=this.mollie.createComponent("cardHolder");e.mount("#card-holder");let t=document.getElementById("card-holder-error");return e.addEventListener("change",function(n){n.error&&n.touched?t.textContent=n.error:t.textContent=""}),this}createCardNumberInput(){let e=this.mollie.createComponent("cardNumber");e.mount("#card-number");let t=document.getElementById("card-number-error");return e.addEventListener("change",function(n){n.error&&n.touched?t.textContent=n.error:t.textContent=""}),this}createExpiryDateInput(){let e=this.mollie.createComponent("expiryDate");e.mount("#expiry-date");let t=document.getElementById("expiry-date-error");return e.addEventListener("change",function(n){n.error&&n.touched?t.textContent=n.error:t.textContent=""}),this}createCvvInput(){let e=this.mollie.createComponent("verificationCode");e.mount("#cvv");let t=document.getElementById("cvv-error");return e.addEventListener("change",function(n){n.error&&n.touched?t.textContent=n.error:t.textContent=""}),this}handlePayNowButton(){if(document.getElementById("pay-now").disabled=!0,document.querySelector("input[name=token]").value!=="")return document.querySelector("input[name=gateway_response]").value="",document.getElementById("server-response").submit();this.mollie.createToken().then(function(e){let t=e.token,n=e.error;if(n){document.getElementById("pay-now").disabled=!1;let o=document.getElementById("errors");o.innerText=n.message,o.hidden=!1;return}let r=document.querySelector('input[name="token-billing-checkbox"]:checked');r&&(document.querySelector('input[name="store_card"]').value=r.value),document.querySelector("input[name=gateway_response]").value=t,document.querySelector("input[name=token]").value="",document.getElementById("server-response").submit()})}handle(){this.createCardHolderInput().createCardNumberInput().createExpiryDateInput().createCvvInput(),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(e=>e.addEventListener("click",t=>{document.getElementById("mollie--payment-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=t.target.dataset.token})),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",e=>{document.getElementById("mollie--payment-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value=""}),document.getElementById("pay-now").addEventListener("click",()=>this.handlePayNowButton())}}function a(){new c().handle()}d()?a():l("#mollie-credit-card-payment").then(()=>a());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/paytrace-credit-card-7f87b811.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/paytrace-credit-card-7f87b811.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import{i as o,w as i}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class d{constructor(){var t;this.clientKey=(t=document.querySelector("meta[name=paytrace-client-key]"))==null?void 0:t.content}get creditCardStyles(){return{font_color:"#000",border_color:"#a1b1c9",border_style:"dotted",font_size:"13pt",input_border_radius:"3px",input_border_width:"1px",input_font:"Times New Roman, arial, fantasy",input_font_weight:"400",input_margin:"5px 0px 5px 0px",input_padding:"0px 5px 0px 5px",label_color:"#a0aec0",label_size:"16px",label_width:"150px",label_font:"Times New Roman, sans-serif, serif",label_font_weight:"light",label_margin:"5px 0px 0px 0px",label_padding:"0px 5px 0px 5px",background_color:"white",height:"30px",width:"370px",padding_bottom:"0px"}}get codeStyles(){return{font_color:"#000",border_color:"#a1b1c9",border_style:"dotted",font_size:"13pt",input_border_radius:"2px",input_border_width:"1px",input_font:"serif, cursive, fantasy",input_font_weight:"700",input_margin:"5px 0px 5px 20px",input_padding:"0px 5px 0px 5px",label_color:"#a0aec0",label_size:"16px",label_width:"150px",label_font:"sans-serif, arial, serif",label_font_weight:"bold",label_margin:"5px 0px 0px 20px",label_padding:"2px 5px 2px 5px",background_color:"white",height:"30px",width:"150px",padding_bottom:"2px"}}get expStyles(){return{font_color:"#000",border_color:"#a1b1c9",border_style:"dashed",font_size:"12pt",input_border_radius:"0px",input_border_width:"2px",input_font:"arial, cursive, fantasy",input_font_weight:"400",input_margin:"5px 0px 5px 0px",input_padding:"0px 5px 0px 5px",label_color:"#a0aec0",label_size:"16px",label_width:"150px",label_font:"arial, fantasy, serif",label_font_weight:"normal",label_margin:"5px 0px 0px 0px",label_padding:"2px 5px 2px 5px",background_color:"white",height:"30px",width:"85px",padding_bottom:"2px",type:"dropdown"}}updatePayTraceLabels(){window.PTPayment.getControl("securityCode").label.text(document.querySelector("meta[name=ctrans-cvv]").content),window.PTPayment.getControl("creditCard").label.text(document.querySelector("meta[name=ctrans-card_number]").content),window.PTPayment.getControl("expiration").label.text(document.querySelector("meta[name=ctrans-expires]").content)}setupPayTrace(){return window.PTPayment.setup({styles:{code:this.codeStyles,cc:this.creditCardStyles,exp:this.expStyles},authorization:{clientKey:this.clientKey}})}handlePaymentWithCreditCard(t){t.target.parentElement.disabled=!0,document.getElementById("errors").hidden=!0,window.PTPayment.validate(n=>{if(n.length>=1){let e=document.getElementById("errors");return e.textContent=n[0].description,e.hidden=!1,t.target.parentElement.disabled=!1}this.ptInstance.process().then(e=>{document.getElementById("HPF_Token").value=e.message.hpf_token,document.getElementById("enc_key").value=e.message.enc_key;let a=document.querySelector('input[name="token-billing-checkbox"]:checked');a&&(document.querySelector('input[name="store_card"]').value=a.value),document.getElementById("server_response").submit()}).catch(e=>{document.getElementById("errors").textContent=JSON.stringify(e),document.getElementById("errors").hidden=!1,console.log(e)})})}handlePaymentWithToken(t){t.target.parentElement.disabled=!0,document.getElementById("server_response").submit()}handle(){var t;Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(n=>n.addEventListener("click",e=>{document.getElementById("paytrace--credit-card-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=e.target.dataset.token})),(t=document.getElementById("toggle-payment-with-credit-card"))==null||t.addEventListener("click",n=>{document.getElementById("paytrace--credit-card-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value="",this.setupPayTrace().then(e=>{this.ptInstance=e,this.updatePayTraceLabels()})}),document.getElementById("pay-now").addEventListener("click",n=>document.querySelector("input[name=token]").value===""?this.handlePaymentWithCreditCard(n):this.handlePaymentWithToken(n)),Array.from(document.getElementsByClassName("toggle-payment-with-token")).length===0&&!o()&&document.getElementById("toggle-payment-with-credit-card").click()}}function r(){new d().handle()}o()?r():i("#paytrace-credit-card-payment").then(()=>r());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/razorpay-aio-f8e8c7f0.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/razorpay-aio-f8e8c7f0.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import{i,w as d}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */function o(){var a;let e=JSON.parse((a=document.querySelector("meta[name=razorpay-options]"))==null?void 0:a.content);e.handler=function(n){document.getElementById("razorpay_payment_id").value=n.razorpay_payment_id,document.getElementById("razorpay_signature").value=n.razorpay_signature,document.getElementById("server-response").submit()},e.modal={ondismiss:function(){t.disabled=!1}};let r=new Razorpay(e),t=document.getElementById("pay-now");t.onclick=function(n){t.disabled=!0,r.open()}}i()?o():d("#razorpay-hosted-payment").then(()=>o());
 | 
				
			||||||
							
								
								
									
										4
									
								
								public/build/assets/simple-card-4314d842.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								public/build/assets/simple-card-4314d842.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										9
									
								
								public/build/assets/square-credit-card-2fc5c3fa.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/square-credit-card-2fc5c3fa.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import{i,w as d}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class s{constructor(){this.appId=document.querySelector("meta[name=square-appId]").content,this.locationId=document.querySelector("meta[name=square-locationId]").content,this.isLoaded=!1}async init(){this.payments=Square.payments(this.appId,this.locationId),this.card=await this.payments.card(),await this.card.attach("#card-container"),this.isLoaded=!0;let e=document.querySelector(".sq-card-iframe-container");e&&e.setAttribute("style","150px !important"),document.querySelector(".toggle-payment-with-token")&&document.getElementById("card-container").classList.add("hidden")}async completePaymentWithoutToken(e){document.getElementById("errors").hidden=!0,e.target.parentElement.disabled=!0;let t=await this.card.tokenize(),o;try{const n={amount:document.querySelector("meta[name=amount]").content,billingContact:JSON.parse(document.querySelector("meta[name=square_contact]").content),currencyCode:document.querySelector("meta[name=currencyCode]").content,intent:"CHARGE"};o=(await this.payments.verifyBuyer(t.token,n)).token}catch{e.target.parentElement.disabled=!0}if(document.querySelector('input[name="verificationToken"]').value=o,t.status==="OK"){document.getElementById("sourceId").value=t.token;let n=document.querySelector('input[name="token-billing-checkbox"]:checked');return n&&(document.querySelector('input[name="store_card"]').value=n.value),document.getElementById("server_response").submit()}document.getElementById("errors").textContent=t.errors[0].message,document.getElementById("errors").hidden=!1,e.target.parentElement.disabled=!1}async completePaymentUsingToken(e){return e.target.parentElement.disabled=!0,document.getElementById("server_response").submit()}async verifyBuyer(e){const t={amount:document.querySelector("meta[name=amount]").content,billingContact:document.querySelector("meta[name=square_contact]").content,currencyCode:document.querySelector("meta[name=currencyCode]").content,intent:"CHARGE"};return(await this.payments.verifyBuyer(e,t)).token}async handle(){document.getElementById("payment-list").classList.add("hidden"),await this.init().then(()=>{var e,t,o,n;(e=document.getElementById("authorize-card"))==null||e.addEventListener("click",a=>this.completePaymentWithoutToken(a)),(t=document.getElementById("pay-now"))==null||t.addEventListener("click",a=>document.querySelector("input[name=token]").value?this.completePaymentUsingToken(a):this.completePaymentWithoutToken(a)),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(a=>a.addEventListener("click",async r=>{document.getElementById("card-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=r.target.dataset.token})),(o=document.getElementById("toggle-payment-with-credit-card"))==null||o.addEventListener("click",async a=>{document.getElementById("card-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value=""}),document.getElementById("loader").classList.add("hidden"),document.getElementById("payment-list").classList.remove("hidden"),(n=document.getElementById("toggle-payment-with-credit-card"))==null||n.click()})}}function c(){new s().handle()}i()?c():d("#square-credit-card-payment").then(()=>c());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-alipay-1457b63d.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-alipay-1457b63d.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var i=Object.defineProperty;var c=(n,e,t)=>e in n?i(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var r=(n,e,t)=>(c(n,typeof e!="symbol"?e+"":e,t),t);import{i as a,w as d}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class l{constructor(e,t){r(this,"setupStripe",()=>(this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key),this));this.key=e,this.stripeConnect=t,this.errors=document.getElementById("errors")}async handle(){document.getElementById("pay-now").addEventListener("click",async e=>{document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden");const{error:t}=await this.stripe.confirmAlipayPayment(document.querySelector("meta[name=ci_intent]").content,{return_url:`${document.querySelector("meta[name=return_url]").content}`});document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),t&&(this.errors.textContent="",this.errors.textContent=result.error.message,this.errors.hidden=!1)})}}function o(){var t,s;const n=((t=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:t.content)??"",e=((s=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:s.content)??"";new l(n,e).setupStripe().handle()}a()?o():d("#stripe-alipay-payment").then(()=>o());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-bacs-c9a61b93.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-bacs-c9a61b93.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var a=Object.defineProperty;var c=(n,e,t)=>e in n?a(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var s=(n,e,t)=>(c(n,typeof e!="symbol"?e+"":e,t),t);import{i as d,w as u}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class l{constructor(e,t){s(this,"setupStripe",()=>(this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key),this));s(this,"payment_data");s(this,"handle",()=>{this.onlyAuthorization?document.getElementById("authorize-bacs").addEventListener("click",e=>{document.getElementById("authorize-bacs").disabled=!0,document.querySelector("#authorize-bacs > svg").classList.remove("hidden"),document.querySelector("#authorize-bacs > span").classList.add("hidden"),location.href=document.querySelector("meta[name=stripe-redirect-url]").content}):(this.payNowButton=document.getElementById("pay-now"),document.getElementById("pay-now").addEventListener("click",e=>{this.payNowButton.disabled=!0,this.payNowButton.querySelector("svg").classList.remove("hidden"),this.payNowButton.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()}),this.payment_data=Array.from(document.getElementsByClassName("toggle-payment-with-token")),this.payment_data.length>0?this.payment_data.forEach(e=>e.addEventListener("click",t=>{document.querySelector("input[name=token]").value=t.target.dataset.token})):(this.errors.textContent=document.querySelector("meta[name=translation-payment-method-required]").content,this.errors.hidden=!1,this.payNowButton.disabled=!0,this.payNowButton.querySelector("span").classList.remove("hidden"),this.payNowButton.querySelector("svg").classList.add("hidden")))});this.key=e,this.errors=document.getElementById("errors"),this.stripeConnect=t,this.onlyAuthorization=onlyAuthorization}}function r(){var t,o,i;const n=((t=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:t.content)??"",e=((o=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:o.content)??"";(i=document.querySelector('meta[name="only-authorization"]'))==null||i.content,new l(n,e).setupStripe().handle()}d()?r():u("#stripe-bacs-payment").then(()=>r());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-bancontact-4a0d7a40.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-bancontact-4a0d7a40.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var s=Object.defineProperty;var a=(n,t,e)=>t in n?s(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var r=(n,t,e)=>(a(n,typeof t!="symbol"?t+"":t,e),e);import{i,w as m}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class l{constructor(t,e){r(this,"setupStripe",()=>(this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key),this));r(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",t=>{let e=document.getElementById("errors");if(!document.getElementById("bancontact-name").value){e.textContent=document.querySelector("meta[name=translation-name-required]").content,e.hidden=!1,console.log("name");return}document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmBancontactPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{billing_details:{name:document.getElementById("bancontact-name").value}},return_url:document.querySelector('meta[name="return-url"]').content})})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}}function c(){var e,o;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((o=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:o.content)??"";new l(n,t).setupStripe().handle()}i()?c():m("#stripe-bancontact-payment").then(()=>c());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-bank-transfer-4ab58b35.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-bank-transfer-4ab58b35.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import{i as p,w as y}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */p()?c():y("#stripe-bank-transfer-payment").then(()=>c());function c(){var r,o,s;const m=(r=document.querySelector('meta[name="stripe-client-secret"]'))==null?void 0:r.content,i=(o=document.querySelector('meta[name="stripe-return-url"]'))==null?void 0:o.content,d={clientSecret:m,appearance:{theme:"stripe",variables:{colorPrimary:"#0570de",colorBackground:"#ffffff",colorText:"#30313d",colorDanger:"#df1b41",fontFamily:"Ideal Sans, system-ui, sans-serif",spacingUnit:"2px",borderRadius:"4px"}}},e=Stripe(document.querySelector('meta[name="stripe-publishable-key"]').getAttribute("content")),t=((s=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:s.content)??"";t&&(e.stripeAccount=t);const n=e.elements(d);n.create("payment").mount("#payment-element"),document.getElementById("payment-form").addEventListener("submit",async l=>{l.preventDefault(),document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden");const{error:a}=await e.confirmPayment({elements:n,confirmParams:{return_url:i}});if(a){document.getElementById("pay-now").disabled=!1,document.querySelector("svg").classList.remove("hidden"),document.querySelector("span").classList.add("hidden");const u=document.querySelector("#errors");u.textContent=a.message}})}
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-becs-483b1b23.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-becs-483b1b23.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var c=Object.defineProperty;var r=(n,t,e)=>t in n?c(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var o=(n,t,e)=>(r(n,typeof t!="symbol"?t+"":t,e),e);import{i,w as d}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class l{constructor(t,e){o(this,"setupStripe",()=>{this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key);const t=this.stripe.elements(),s={style:{base:{color:"#32325d",fontSize:"16px","::placeholder":{color:"#aab7c4"},":-webkit-autofill":{color:"#32325d"}},invalid:{color:"#fa755a",iconColor:"#fa755a",":-webkit-autofill":{color:"#fa755a"}}},disabled:!1,hideIcon:!1,iconStyle:"default"};return this.auBankAccount=t.create("auBankAccount",s),this.auBankAccount.mount("#becs-iban"),this});o(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",t=>{let e=document.getElementById("errors");if(document.getElementById("becs-name").value===""){document.getElementById("becs-name").focus(),e.textContent=document.querySelector("meta[name=translation-name-required]").content,e.hidden=!1;return}if(document.getElementById("becs-email-address").value===""){document.getElementById("becs-email-address").focus(),e.textContent=document.querySelector("meta[name=translation-email-required]").content,e.hidden=!1;return}if(!document.getElementById("becs-mandate-acceptance").checked){document.getElementById("becs-mandate-acceptance").focus(),e.textContent=document.querySelector("meta[name=translation-terms-required]").content,e.hidden=!1,console.log("Terms");return}document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmAuBecsDebitPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{au_becs_debit:this.auBankAccount,billing_details:{name:document.getElementById("becs-name").value,email:document.getElementById("becs-email-address").value}}}).then(s=>s.error?this.handleFailure(s.error.message):this.handleSuccess(s))})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}handleSuccess(t){document.querySelector('input[name="gateway_response"]').value=JSON.stringify(t.paymentIntent),document.getElementById("server-response").submit()}handleFailure(t){let e=document.getElementById("errors");e.textContent="",e.textContent=t,e.hidden=!1,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}}function a(){var e,s;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((s=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:s.content)??"";new l(n,t).setupStripe().handle()}i()?a():d("#stripe-becs-payment").then(()=>a());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-browserpay-c23582f0.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-browserpay-c23582f0.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import{i as o,w as i}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class m{constructor(){var e;this.clientSecret=(e=document.querySelector("meta[name=stripe-pi-client-secret]"))==null?void 0:e.content}init(){var t,n;let e={};return document.querySelector("meta[name=stripe-account-id]")&&(e.apiVersion="2020-08-27",e.stripeAccount=(t=document.querySelector("meta[name=stripe-account-id]"))==null?void 0:t.content),this.stripe=Stripe((n=document.querySelector("meta[name=stripe-publishable-key]"))==null?void 0:n.content,e),this.elements=this.stripe.elements(),this}createPaymentRequest(){return this.paymentRequest=this.stripe.paymentRequest(JSON.parse(document.querySelector("meta[name=payment-request-data").content)),this}createPaymentRequestButton(){this.paymentRequestButton=this.elements.create("paymentRequestButton",{paymentRequest:this.paymentRequest})}handlePaymentRequestEvents(e,t){document.querySelector("#errors").hidden=!0,this.paymentRequest.on("paymentmethod",function(n){e.confirmCardPayment(t,{payment_method:n.paymentMethod.id},{handleActions:!1}).then(function(r){r.error?(document.querySelector("#errors").innerText=r.error.message,document.querySelector("#errors").hidden=!1,n.complete("fail")):(n.complete("success"),r.paymentIntent.status==="requires_action"?e.confirmCardPayment(t).then(function(s){s.error?(n.complete("fail"),document.querySelector("#errors").innerText=s.error.message,document.querySelector("#errors").hidden=!1):(document.querySelector('input[name="gateway_response"]').value=JSON.stringify(s.paymentIntent),document.getElementById("server-response").submit())}):(document.querySelector('input[name="gateway_response"]').value=JSON.stringify(r.paymentIntent),document.getElementById("server-response").submit()))})})}handle(){this.init().createPaymentRequest().createPaymentRequestButton(),this.paymentRequest.canMakePayment().then(e=>{var t;if(e)return this.paymentRequestButton.mount("#payment-request-button");document.querySelector("#errors").innerHTML=JSON.parse((t=document.querySelector("meta[name=no-available-methods]"))==null?void 0:t.content),document.querySelector("#errors").hidden=!1}),this.handlePaymentRequestEvents(this.stripe,this.clientSecret)}}function a(){new m().handle()}o()?a():i("#stripe-browserpay-payment").then(()=>a());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-credit-card-5487be17.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-credit-card-5487be17.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					import{i as c,w as u}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class m{constructor(e,t,n,r){this.key=e,this.secret=t,this.onlyAuthorization=n,this.stripeConnect=r}setupStripe(){return this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key),this.elements=this.stripe.elements(),this}createElement(){var e;return this.cardElement=this.elements.create("card",{hidePostalCode:((e=document.querySelector("meta[name=stripe-require-postal-code]"))==null?void 0:e.content)==="0",value:{postalCode:document.querySelector("meta[name=client-postal-code]").content},hideIcon:!1}),this}mountCardElement(){return this.cardElement.mount("#card-element"),this}completePaymentUsingToken(){let e=document.querySelector("input[name=token]").value,t=document.getElementById("pay-now");this.payNowButton=t,this.payNowButton.disabled=!0,this.payNowButton.querySelector("svg").classList.remove("hidden"),this.payNowButton.querySelector("span").classList.add("hidden"),this.stripe.handleCardPayment(this.secret,{payment_method:e}).then(n=>n.error?this.handleFailure(n.error.message):this.handleSuccess(n))}completePaymentWithoutToken(){let e=document.getElementById("pay-now");this.payNowButton=e,this.payNowButton.disabled=!0,this.payNowButton.querySelector("svg").classList.remove("hidden"),this.payNowButton.querySelector("span").classList.add("hidden");let t=document.getElementById("cardholder-name");this.stripe.handleCardPayment(this.secret,this.cardElement,{payment_method_data:{billing_details:{name:t.value}}}).then(n=>n.error?this.handleFailure(n.error.message):this.handleSuccess(n))}handleSuccess(e){document.querySelector('input[name="gateway_response"]').value=JSON.stringify(e.paymentIntent);let t=document.querySelector('input[name="token-billing-checkbox"]:checked');t&&(document.querySelector('input[name="store_card"]').value=t.value),document.getElementById("server-response").submit()}handleFailure(e){let t=document.getElementById("errors");t.textContent="",t.textContent=e,t.hidden=!1,this.payNowButton.disabled=!1,this.payNowButton.querySelector("svg").classList.add("hidden"),this.payNowButton.querySelector("span").classList.remove("hidden")}handleAuthorization(){let e=document.getElementById("cardholder-name"),t=document.getElementById("authorize-card");this.payNowButton=t,this.payNowButton.disabled=!0,this.payNowButton.querySelector("svg").classList.remove("hidden"),this.payNowButton.querySelector("span").classList.add("hidden"),this.stripe.handleCardSetup(this.secret,this.cardElement,{payment_method_data:{billing_details:{name:e.value}}}).then(n=>n.error?this.handleFailure(n.error.message):this.handleSuccessfulAuthorization(n))}handleSuccessfulAuthorization(e){document.getElementById("gateway_response").value=JSON.stringify(e.setupIntent),document.getElementById("server_response").submit()}handle(){this.setupStripe(),this.onlyAuthorization?(this.createElement().mountCardElement(),document.getElementById("authorize-card").addEventListener("click",()=>this.handleAuthorization())):(Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(e=>e.addEventListener("click",t=>{document.getElementById("stripe--payment-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=t.target.dataset.token})),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",e=>{document.getElementById("stripe--payment-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value=""}),this.createElement().mountCardElement(),document.getElementById("pay-now").addEventListener("click",()=>{try{return document.querySelector("input[name=token]").value?this.completePaymentUsingToken():this.completePaymentWithoutToken()}catch(e){console.log(e.message)}}))}}function l(){var a,s,i,d;const o=((a=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:a.content)??"",e=((s=document.querySelector('meta[name="stripe-secret"]'))==null?void 0:s.content)??"",t=((i=document.querySelector('meta[name="only-authorization"]'))==null?void 0:i.content)??"",n=((d=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:d.content)??"";new m(o,e,t,n).handle()}c()?l():u("#stripe-credit-card-payment").then(()=>l());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-eps-0c461508.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-eps-0c461508.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var i=Object.defineProperty;var a=(n,t,e)=>t in n?i(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var s=(n,t,e)=>(a(n,typeof t!="symbol"?t+"":t,e),e);import{i as c,w as l}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class m{constructor(t,e){s(this,"setupStripe",()=>{this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key);let t=this.stripe.elements();var e={style:{base:{padding:"10px 12px",color:"#32325d",fontSize:"16px","::placeholder":{color:"#aab7c4"}}}};return this.eps=t.create("epsBank",e),this.eps.mount("#eps-bank-element"),this});s(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",t=>{let e=document.getElementById("errors");if(!document.getElementById("eps-name").value){e.textContent=document.querySelector("meta[name=translation-name-required]").content,e.hidden=!1;return}document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmEpsPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{eps:this.eps,billing_details:{name:document.getElementById("eps-name").value}},return_url:document.querySelector('meta[name="return-url"]').content})})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}}function o(){var e,r;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((r=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:r.content)??"";new m(n,t).setupStripe().handle()}c()?o():l("#stripe-eps-payment").then(()=>o());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-fpx-c82fd7dc.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-fpx-c82fd7dc.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var i=Object.defineProperty;var a=(n,t,e)=>t in n?i(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var s=(n,t,e)=>(a(n,typeof t!="symbol"?t+"":t,e),e);import{i as c,w as d}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class l{constructor(t,e){s(this,"setupStripe",()=>{this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key);let t=this.stripe.elements(),e={base:{padding:"10px 12px",color:"#32325d",fontSize:"16px"}};return this.fpx=t.create("fpxBank",{style:e,accountHolderType:"individual"}),this.fpx.mount("#fpx-bank-element"),this});s(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",t=>{document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmFpxPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{fpx:this.fpx},return_url:document.querySelector('meta[name="return-url"]').content}).then(e=>{e.error&&this.handleFailure(e.error.message)})})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}handleFailure(t){let e=document.getElementById("errors");e.textContent="",e.textContent=t,e.hidden=!1,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}}function o(){var e,r;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((r=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:r.content)??"";new l(n,t).setupStripe().handle()}c()?o():d("#stripe-fpx-payment").then(()=>o());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-giropay-aedb4a64.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-giropay-aedb4a64.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var i=Object.defineProperty;var c=(n,t,e)=>t in n?i(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var r=(n,t,e)=>(c(n,typeof t!="symbol"?t+"":t,e),e);import{i as a,w as m}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class d{constructor(t,e){r(this,"setupStripe",()=>(this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key),this));r(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",t=>{let e=document.getElementById("errors");if(!document.getElementById("giropay-mandate-acceptance").checked){e.textContent=document.querySelector("meta[name=translation-terms-required]").content,e.hidden=!1,console.log("Terms");return}document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmGiropayPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{billing_details:{name:document.getElementById("giropay-name").value}},return_url:document.querySelector('meta[name="return-url"]').content})})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}}function s(){var e,o;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((o=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:o.content)??"";new d(n,t).setupStripe().handle()}a()?s():m("#stripe-giropay-payment").then(()=>s());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-ideal-95836518.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-ideal-95836518.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var s=Object.defineProperty;var a=(n,t,e)=>t in n?s(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var r=(n,t,e)=>(a(n,typeof t!="symbol"?t+"":t,e),e);import{i as l,w as c}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class d{constructor(t,e){r(this,"setupStripe",()=>{this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key);let t=this.stripe.elements();var e={style:{base:{padding:"10px 12px",color:"#32325d",fontSize:"16px","::placeholder":{color:"#aab7c4"}}}};return this.ideal=t.create("idealBank",e),this.ideal.mount("#ideal-bank-element"),this});r(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",t=>{let e=document.getElementById("errors");if(!document.getElementById("ideal-name").value){e.textContent=document.querySelector("meta[name=translation-name-required]").content,e.hidden=!1,console.log("name");return}document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmIdealPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{ideal:this.ideal,billing_details:{name:document.getElementById("ideal-name").value}},return_url:document.querySelector('meta[name="return-url"]').content})})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}}function o(){var e,i;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((i=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:i.content)??"";new d(n,t).setupStripe().handle()}l()?o():c("#stripe-ideal-payment").then(()=>o());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-klarna-93dcc6f1.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-klarna-93dcc6f1.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var c=Object.defineProperty;var m=(n,e,t)=>e in n?c(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var o=(n,e,t)=>(m(n,typeof e!="symbol"?e+"":e,t),t);import{i as d,w as i}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class l{constructor(e,t){o(this,"setupStripe",()=>(this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key),this));o(this,"handleError",e=>{document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden"),this.errors.textContent="",this.errors.textContent=e,this.errors.hidden=!1});o(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",e=>{let t=document.getElementById("errors"),r=document.getElementById("klarna-name").value;/^[A-Za-z\s]*$/.test(r)?(document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmKlarnaPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{billing_details:{name:r,email:document.querySelector("meta[name=email]").content,address:{line1:document.querySelector("meta[name=address-1]").content,line2:document.querySelector("meta[name=address-2]").content,city:document.querySelector("meta[name=city]").content,postal_code:document.querySelector("meta[name=postal_code]").content,state:document.querySelector("meta[name=state]").content,country:document.querySelector("meta[name=country]").content}}},return_url:document.querySelector('meta[name="return-url"]').content}).then(a=>{if(a.hasOwnProperty("error"))return this.handleError(a.error.message)})):(document.getElementById("klarna-name-correction").hidden=!1,document.getElementById("klarna-name").textContent=r.replace(/^[A-Za-z\s]*$/,""),document.getElementById("klarna-name").focus(),t.textContent=document.querySelector("meta[name=translation-name-without-special-characters]").content,t.hidden=!1)})});this.key=e,this.errors=document.getElementById("errors"),this.stripeConnect=t}}function s(){var t,r;const n=((t=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:t.content)??"",e=((r=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:r.content)??"";new l(n,e).setupStripe().handle()}d()?s():i("#stripe-klarna-payment").then(()=>s());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-przelewy24-5db060c5.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-przelewy24-5db060c5.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var c=Object.defineProperty;var s=(n,t,e)=>t in n?c(n,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[t]=e;var o=(n,t,e)=>(s(n,typeof t!="symbol"?t+"":t,e),e);import{i as d,w as m}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class i{constructor(t,e){o(this,"setupStripe",()=>{this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key);let t=this.stripe.elements();var e={style:{base:{padding:"10px 12px",color:"#32325d",fontSize:"16px","::placeholder":{color:"#aab7c4"}}}};return this.p24bank=t.create("p24Bank",e),this.p24bank.mount("#p24-bank-element"),this});o(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",t=>{let e=document.getElementById("errors");if(document.getElementById("p24-name").value===""){document.getElementById("p24-name").focus(),e.textContent=document.querySelector("meta[name=translation-name-required]").content,e.hidden=!1;return}if(document.getElementById("p24-email-address").value===""){document.getElementById("p24-email-address").focus(),e.textContent=document.querySelector("meta[name=translation-email-required]").content,e.hidden=!1;return}if(!document.getElementById("p24-mandate-acceptance").checked){document.getElementById("p24-mandate-acceptance").focus(),e.textContent=document.querySelector("meta[name=translation-terms-required]").content,e.hidden=!1;return}document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmP24Payment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{p24:this.p24bank,billing_details:{name:document.getElementById("p24-name").value,email:document.getElementById("p24-email-address").value}},payment_method_options:{p24:{tos_shown_and_accepted:document.getElementById("p24-mandate-acceptance").checked}},return_url:document.querySelector('meta[name="return-url"]').content}).then(function(a){a.error?(e.textContent=a.error.message,e.hidden=!1,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")):a.paymentIntent.status==="succeeded"&&(window.location=document.querySelector('meta[name="return-url"]').content)})})});this.key=t,this.errors=document.getElementById("errors"),this.stripeConnect=e}}function r(){var e,a;const n=((e=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:e.content)??"",t=((a=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:a.content)??"";new i(n,t).setupStripe().handle()}d()?r():m("#stripe-przelewy24-payment").then(()=>r());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-sepa-9ab85221.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-sepa-9ab85221.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var s=Object.defineProperty;var c=(a,e,t)=>e in a?s(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var o=(a,e,t)=>(c(a,typeof e!="symbol"?e+"":e,t),t);import{i,w as l}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */class d{constructor(e,t){o(this,"setupStripe",()=>{this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key);const e=this.stripe.elements();var t={base:{color:"#32325d",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',fontSmoothing:"antialiased",fontSize:"16px","::placeholder":{color:"#aab7c4"},":-webkit-autofill":{color:"#32325d"}},invalid:{color:"#fa755a",iconColor:"#fa755a",":-webkit-autofill":{color:"#fa755a"}}},n={style:t,supportedCountries:["SEPA"],placeholderCountry:document.querySelector('meta[name="country"]').content};return this.iban=e.create("iban",n),this.iban.mount("#sepa-iban"),document.getElementById("sepa-name").value=document.querySelector("meta[name=client_name]").content,document.getElementById("sepa-email-address").value=document.querySelector("meta[name=client_email]").content,this});o(this,"handle",()=>{let e=document.getElementById("errors");Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach(t=>t.addEventListener("click",n=>{document.getElementById("stripe--payment-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=n.target.dataset.token})),document.getElementById("toggle-payment-with-new-bank-account").addEventListener("click",t=>{document.getElementById("stripe--payment-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value=""}),document.getElementById("pay-now").addEventListener("click",t=>{if(document.querySelector("input[name=token]").value.length!==0)document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmSepaDebitPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:document.querySelector("input[name=token]").value}).then(n=>n.error?this.handleFailure(n.error.message):this.handleSuccess(n));else{if(document.getElementById("sepa-name").value===""){document.getElementById("sepa-name").focus(),e.textContent=document.querySelector("meta[name=translation-name-required]").content,e.hidden=!1;return}if(document.getElementById("sepa-email-address").value===""){document.getElementById("sepa-email-address").focus(),e.textContent=document.querySelector("meta[name=translation-email-required]").content,e.hidden=!1;return}if(!document.getElementById("sepa-mandate-acceptance").checked){e.textContent=document.querySelector("meta[name=translation-terms-required]").content,e.hidden=!1;return}document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmSepaDebitPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{sepa_debit:this.iban,billing_details:{name:document.getElementById("sepa-name").value,email:document.getElementById("sepa-email-address").value}}}).then(n=>n.error?this.handleFailure(n.error.message):this.handleSuccess(n))}})});this.key=e,this.errors=document.getElementById("errors"),this.stripeConnect=t}handleSuccess(e){document.querySelector('input[name="gateway_response"]').value=JSON.stringify(e.paymentIntent);let t=document.querySelector('input[name="token-billing-checkbox"]:checked');t&&(document.querySelector('input[name="store_card"]').value=t.value),document.querySelector("input[name=token]").value.length>2&&(document.querySelector('input[name="store_card"]').value=!1),document.getElementById("server-response").submit()}handleFailure(e){let t=document.getElementById("errors");t.textContent="",t.textContent=e,t.hidden=!1,document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden")}handleSuccess(e){document.querySelector('input[name="gateway_response"]').value=JSON.stringify(e.paymentIntent);let t=document.querySelector('input[name="token-billing-checkbox"]:checked');t&&(document.querySelector('input[name="store_card"]').value=t.value),document.getElementById("server-response").submit()}}function r(){var t,n;const a=((t=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:t.content)??"",e=((n=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:n.content)??"";new d(a,e).setupStripe().handle()}i()?r():l("#stripe-sepa-payment").then(()=>r());
 | 
				
			||||||
							
								
								
									
										9
									
								
								public/build/assets/stripe-sofort-fbef42bb.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								public/build/assets/stripe-sofort-fbef42bb.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					var c=Object.defineProperty;var i=(n,e,t)=>e in n?c(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t;var r=(n,e,t)=>(i(n,typeof e!="symbol"?e+"":e,t),t);import{i as a,w as u}from"./wait-8f4ae121.js";/**
 | 
				
			||||||
 | 
					 * 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 
 | 
				
			||||||
 | 
					 */class m{constructor(e,t){r(this,"setupStripe",()=>(this.stripeConnect?this.stripe=Stripe(this.key,{stripeAccount:this.stripeConnect}):this.stripe=Stripe(this.key),this));r(this,"handle",()=>{document.getElementById("pay-now").addEventListener("click",e=>{document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.stripe.confirmSofortPayment(document.querySelector("meta[name=pi-client-secret").content,{payment_method:{sofort:{country:document.querySelector('meta[name="country"]').content}},return_url:document.querySelector('meta[name="return-url"]').content})})});this.key=e,this.errors=document.getElementById("errors"),this.stripeConnect=t}}function s(){var t,o;const n=((t=document.querySelector('meta[name="stripe-publishable-key"]'))==null?void 0:t.content)??"",e=((o=document.querySelector('meta[name="stripe-account-id"]'))==null?void 0:o.content)??"";new m(n,e).setupStripe().handle()}a()?s():u("#stripe-sofort-payment").then(()=>s());
 | 
				
			||||||
@ -15,7 +15,7 @@
 | 
				
			|||||||
    "file": "assets/wait-8f4ae121.js"
 | 
					    "file": "assets/wait-8f4ae121.js"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "resources/js/app.js": {
 | 
					  "resources/js/app.js": {
 | 
				
			||||||
    "file": "assets/app-e0713224.js",
 | 
					    "file": "assets/app-234e3402.js",
 | 
				
			||||||
    "imports": [
 | 
					    "imports": [
 | 
				
			||||||
      "_index-08e160a7.js",
 | 
					      "_index-08e160a7.js",
 | 
				
			||||||
      "__commonjsHelpers-725317a4.js"
 | 
					      "__commonjsHelpers-725317a4.js"
 | 
				
			||||||
@ -350,7 +350,7 @@
 | 
				
			|||||||
    "src": "resources/js/setup/setup.js"
 | 
					    "src": "resources/js/setup/setup.js"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "resources/sass/app.scss": {
 | 
					  "resources/sass/app.scss": {
 | 
				
			||||||
    "file": "assets/app-608daae2.css",
 | 
					    "file": "assets/app-4e969b65.css",
 | 
				
			||||||
    "isEntry": true,
 | 
					    "isEntry": true,
 | 
				
			||||||
    "src": "resources/sass/app.scss"
 | 
					    "src": "resources/sass/app.scss"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,196 @@
 | 
				
			|||||||
 | 
					<div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden p-5 bg-white sm:gap-4"
 | 
				
			||||||
 | 
					    id="paypal-payment">
 | 
				
			||||||
 | 
					    <style type="text/css">
 | 
				
			||||||
 | 
					        .loader {
 | 
				
			||||||
 | 
					            width: 48px;
 | 
				
			||||||
 | 
					            height: 48px;
 | 
				
			||||||
 | 
					            border-radius: 50%;
 | 
				
			||||||
 | 
					            position: relative;
 | 
				
			||||||
 | 
					            animation: rotate 1s linear infinite
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .loader::before,
 | 
				
			||||||
 | 
					        .loader::after {
 | 
				
			||||||
 | 
					            content: "";
 | 
				
			||||||
 | 
					            box-sizing: border-box;
 | 
				
			||||||
 | 
					            position: absolute;
 | 
				
			||||||
 | 
					            inset: 0px;
 | 
				
			||||||
 | 
					            border-radius: 50%;
 | 
				
			||||||
 | 
					            border: 5px solid #454545;
 | 
				
			||||||
 | 
					            animation: prixClipFix 2s linear infinite;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        .loader::after {
 | 
				
			||||||
 | 
					            border-color: #FF3D00;
 | 
				
			||||||
 | 
					            animation: prixClipFix 2s linear infinite, rotate 0.5s linear infinite reverse;
 | 
				
			||||||
 | 
					            inset: 6px;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @keyframes rotate {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					                transform: rotate(0deg)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					                transform: rotate(360deg)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        @keyframes prixClipFix {
 | 
				
			||||||
 | 
					            0% {
 | 
				
			||||||
 | 
					                clip-path: polygon(50% 50%, 0 0, 0 0, 0 0, 0 0, 0 0)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            25% {
 | 
				
			||||||
 | 
					                clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 0, 100% 0, 100% 0)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            50% {
 | 
				
			||||||
 | 
					                clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 100% 100%, 100% 100%)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            75% {
 | 
				
			||||||
 | 
					                clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 100%)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            100% {
 | 
				
			||||||
 | 
					                clip-path: polygon(50% 50%, 0 0, 100% 0, 100% 100%, 0 100%, 0 0)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </style>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <form action="{{ route('client.payments.response') }}" method="post" id="server_response">
 | 
				
			||||||
 | 
					        @csrf
 | 
				
			||||||
 | 
					        <input type="hidden" name="payment_hash" value="{{ $payment_hash }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="company_gateway_id" value="{{ $gateway->company_gateway->id }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="gateway_response" id="gateway_response">
 | 
				
			||||||
 | 
					        <input type="hidden" name="gateway_type_id" id="gateway_type_id" value="{{ $gateway_type_id }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="amount_with_fee" id="amount_with_fee" value="{{ $total['amount_with_fee'] }}" />
 | 
				
			||||||
 | 
					    </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="alert alert-failure mb-4" hidden id="errors"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div id="paypal-button-container" class="paypal-button-container">
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div id="is_working" class="flex mt-4 place-items-center hidden">
 | 
				
			||||||
 | 
					        <span class="loader m-auto"></span>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <script type="application/json" fncls="fnparams-dede7cc5-15fd-4c75-a9f4-36c430ee3a99">
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "f":"{{ $guid }}",
 | 
				
			||||||
 | 
					            "s":"paypal.pay"        // unique ID for each web page
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </script>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@assets
 | 
				
			||||||
 | 
					<script type="text/javascript" src="https://c.paypal.com/da/r/fb.js"></script>
 | 
				
			||||||
 | 
					<script src="https://www.paypal.com/sdk/js?client-id={!! $client_id !!}¤cy={!! $currency !!}&components=buttons,funding-eligibility&intent=capture&enable-funding={!! $funding_source !!}"  data-partner-attribution-id="invoiceninja_SP_PPCP"></script>
 | 
				
			||||||
 | 
					@endassets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@script
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					    const fundingSource = "{!! $funding_source !!}";
 | 
				
			||||||
 | 
					    const clientId = "{{ $client_id }}";
 | 
				
			||||||
 | 
					    const orderId = "{!! $order_id !!}";
 | 
				
			||||||
 | 
					    const environment = "{{ $gateway->company_gateway->getConfigField('testMode') ? 'sandbox' : 'production' }}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    paypal.Buttons({
 | 
				
			||||||
 | 
					        env: environment,
 | 
				
			||||||
 | 
					        fundingSource: fundingSource,
 | 
				
			||||||
 | 
					        client: clientId,
 | 
				
			||||||
 | 
					        createOrder: function(data, actions) {
 | 
				
			||||||
 | 
					            return orderId;  
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        onApprove: function(data, actions) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            console.log(data);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            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(); // or response.json() if the response is 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("on error");
 | 
				
			||||||
 | 
					            console.log(error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document.getElementById("gateway_response").value = error;
 | 
				
			||||||
 | 
					            document.getElementById("server_response").submit();
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        onClick: function (){
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(fundingSource != 'card')
 | 
				
			||||||
 | 
					              document.getElementById('paypal-button-container').hidden = true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document.getElementById('is_working').classList.remove('hidden');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // document.querySelector('div[data-ref="required-fields-container').classList.add('hidden');
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        onInit: function (){
 | 
				
			||||||
 | 
					            console.log("init");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    }).render('#paypal-button-container').catch(function(err) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					      document.getElementById('errors').textContent = err;
 | 
				
			||||||
 | 
					      document.getElementById('errors').hidden = false;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    document.getElementById("server_response").addEventListener('submit', (e) => {
 | 
				
			||||||
 | 
							if (document.getElementById("server_response").classList.contains('is-submitting')) {
 | 
				
			||||||
 | 
								e.preventDefault();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							document.getElementById("server_response").classList.add('is-submitting');
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					@endscript
 | 
				
			||||||
@ -0,0 +1,378 @@
 | 
				
			|||||||
 | 
					@php
 | 
				
			||||||
 | 
					    $gateway_instance = $gateway instanceof \App\Models\CompanyGateway ? $gateway : $gateway->company_gateway;
 | 
				
			||||||
 | 
					    $token_billing_string = 'true';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if($gateway_instance->token_billing == 'off' || $gateway_instance->token_billing == 'optin'){
 | 
				
			||||||
 | 
					        $token_billing_string = 'false';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (isset($pre_payment) && $pre_payment == '1' && isset($is_recurring) && $is_recurring == '1') {
 | 
				
			||||||
 | 
					        $token_billing_string = 'true';
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					@endphp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden py-5 bg-white sm:gap-4"
 | 
				
			||||||
 | 
					    id="paypal-credit-card-payment">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <meta http-equiv="Content-Security-Policy" content="
 | 
				
			||||||
 | 
					        img-src 'self' https://c.paypal.com https://b.stats.paypal.com; 
 | 
				
			||||||
 | 
					        frame-src 'self' https://c.paypal.com; 
 | 
				
			||||||
 | 
					        script-src 'self' https://c.paypal.com;">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <form action="{{ route('client.payments.response') }}" method="post" id="server_response">
 | 
				
			||||||
 | 
					        @csrf
 | 
				
			||||||
 | 
					        <input type="hidden" name="payment_hash" value="{{ $payment_hash }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="company_gateway_id" value="{{ $gateway->company_gateway->id }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="gateway_type_id" id="gateway_type_id" value="{{ $gateway_type_id }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="gateway_response" id="gateway_response">
 | 
				
			||||||
 | 
					        <input type="hidden" name="amount_with_fee" id="amount_with_fee" value="{{ $total['amount_with_fee'] }}"/>
 | 
				
			||||||
 | 
					        <input type="hidden" name="store_card" id="store_card" value="{{ $token_billing_string }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="token" value="" id="token">
 | 
				
			||||||
 | 
					    </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @include('portal.ninja2020.gateways.includes.payment_details')
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  <div class="alert alert-failure mb-4" hidden id="errors"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   <div id="paypal-button-container" class="paypal-button-container"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.pay_with')])
 | 
				
			||||||
 | 
					        @if (count($tokens) > 0)
 | 
				
			||||||
 | 
					            @foreach ($tokens as $token)
 | 
				
			||||||
 | 
					                <label class="mr-4">
 | 
				
			||||||
 | 
					                    <input type="radio" data-token="{{ $token->token }}" name="payment-type"
 | 
				
			||||||
 | 
					                        class="form-radio cursor-pointer toggle-payment-with-token" />
 | 
				
			||||||
 | 
					                    <span class="ml-1 cursor-pointer">**** {{ $token->meta?->last4 }}</span>
 | 
				
			||||||
 | 
					                </label>
 | 
				
			||||||
 | 
					            @endforeach
 | 
				
			||||||
 | 
					        @endisset
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <label>
 | 
				
			||||||
 | 
					            <input type="radio" id="toggle-payment-with-credit-card" class="form-radio cursor-pointer" name="payment-type"
 | 
				
			||||||
 | 
					                checked />
 | 
				
			||||||
 | 
					            <span class="ml-1 cursor-pointer">{{ __('texts.new_card') }}</span>
 | 
				
			||||||
 | 
					        </label>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @endcomponent
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    <div id="checkout-form">
 | 
				
			||||||
 | 
					      <!-- Containers for Card Fields hosted by PayPal -->    
 | 
				
			||||||
 | 
					      <div id="card-number-field-container"></div>
 | 
				
			||||||
 | 
					      <div id="card-name-field-container"></div>
 | 
				
			||||||
 | 
					      <div class="expcvv" style="display:flex;">
 | 
				
			||||||
 | 
					        <div id="card-expiry-field-container" style="width:50%"></div>
 | 
				
			||||||
 | 
					        <div id="card-cvv-field-container" style="width:50%"></div>
 | 
				
			||||||
 | 
					      </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      @include('portal.ninja2020.gateways.includes.save_card')
 | 
				
			||||||
 | 
					      @include('portal.ninja2020.gateways.includes.pay_now', ['id' => 'pay-now'])
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @include('portal.ninja2020.gateways.includes.pay_now', ['id' => 'pay-now-token'])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <script type="application/json" fncls="fnparams-dede7cc5-15fd-4c75-a9f4-36c430ee3a99">
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        "f":"{{ $guid }}",
 | 
				
			||||||
 | 
					        "s":"{{ $identifier }}"        // unique ID for each web page
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    </script>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@assets
 | 
				
			||||||
 | 
					<script type="text/javascript" src="https://c.paypal.com/da/r/fb.js"></script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@if(isset($merchantId))
 | 
				
			||||||
 | 
					    <script src="https://www.paypal.com/sdk/js?client-id={!! $client_id !!}&merchant-id={!! $merchantId !!}&components=card-fields" data-partner-attribution-id="invoiceninja_SP_PPCP"></script>
 | 
				
			||||||
 | 
					@else
 | 
				
			||||||
 | 
					    <script src="https://www.paypal.com/sdk/js?client-id={!! $client_id !!}&components=card-fields" data-partner-attribution-id="invoiceninja_SP_PPCP"></script>
 | 
				
			||||||
 | 
					@endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@endassets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@script
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const clientId = "{{ $client_id }}";
 | 
				
			||||||
 | 
					    const orderId = "{!! $order_id !!}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const cardField = paypal.CardFields({
 | 
				
			||||||
 | 
					        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 (){
 | 
				
			||||||
 | 
					           
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Render each field after checking for eligibility
 | 
				
			||||||
 | 
					  if (cardField.isEligible()) {
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					    //   const nameField = cardField.NameField();
 | 
				
			||||||
 | 
					    //   nameField.render("#card-name-field-container");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const numberField = cardField.NumberField({
 | 
				
			||||||
 | 
					        inputEvents: {
 | 
				
			||||||
 | 
					            onChange: (event)=> {
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      
 | 
				
			||||||
 | 
					      numberField.render("#card-number-field-container");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const cvvField = cardField.CVVField({
 | 
				
			||||||
 | 
					        inputEvents: {
 | 
				
			||||||
 | 
					            onChange: (event)=> {
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      cvvField.render("#card-cvv-field-container");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const expiryField = cardField.ExpiryField({
 | 
				
			||||||
 | 
					        inputEvents: {
 | 
				
			||||||
 | 
					            onChange: (event)=> {
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      expiryField.render("#card-expiry-field-container");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      document.getElementById("pay-now").addEventListener('click', (e) => {
 | 
				
			||||||
 | 
					        document.getElementById('errors').textContent = '';
 | 
				
			||||||
 | 
					        document.getElementById('errors').hidden = true;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        document.getElementById('pay-now').disabled = true;
 | 
				
			||||||
 | 
					        document.querySelector('#pay-now > svg').classList.remove('hidden');
 | 
				
			||||||
 | 
					        document.querySelector('#pay-now > svg').classList.add('justify-center');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        document.querySelector('#pay-now > svg').classList.add('mx-auto');
 | 
				
			||||||
 | 
					        document.querySelector('#pay-now > svg').classList.add('item-center');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        document.querySelector('#pay-now > span').classList.add('hidden');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        cardField.submit().then(() => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }).catch((error) => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            console.log(error);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            let msg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if(!['INVALID_NUMBER','INVALID_CVV','INVALID_EXPIRY'].includes(error.message))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                const errorM = parseError(error.message);
 | 
				
			||||||
 | 
					                msg = handle422Error(errorM);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document.getElementById('pay-now').disabled = false;
 | 
				
			||||||
 | 
					            document.querySelector('#pay-now > svg').classList.add('hidden');
 | 
				
			||||||
 | 
					            document.querySelector('#pay-now > span').classList.remove('hidden');
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if(error.message == 'INVALID_NUMBER'){
 | 
				
			||||||
 | 
					              document.getElementById('errors').textContent = "{{ ctrans('texts.invalid_card_number') }}";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if(error.message == 'INVALID_CVV') {
 | 
				
			||||||
 | 
					              document.getElementById('errors').textContent = "{{ ctrans('texts.invalid_cvv') }}";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if(error.message == 'INVALID_EXPIRY') {
 | 
				
			||||||
 | 
					              document.getElementById('errors').textContent = "{{ ctrans('texts.invalid_cvv') }}";
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else if(msg.description){
 | 
				
			||||||
 | 
					                document.getElementById('errors').textContent = msg?.description;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            document.getElementById('errors').hidden = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function handle422Error(errorData) {
 | 
				
			||||||
 | 
					        const errorDetails = errorData.details || [];
 | 
				
			||||||
 | 
					        const detail = errorDetails[0];        
 | 
				
			||||||
 | 
					        return detail;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    function parseError(errorMessage)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            JSON.parse(errorMessage);
 | 
				
			||||||
 | 
					            return errorMessage;
 | 
				
			||||||
 | 
					        } catch (e) {
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const startIndex = errorMessage.indexOf('{');
 | 
				
			||||||
 | 
					        const endIndex = errorMessage.lastIndexOf('}');
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
 | 
				
			||||||
 | 
					            const jsonString = errorMessage.substring(startIndex, endIndex + 1);
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                const json = JSON.parse(jsonString);
 | 
				
			||||||
 | 
					                return json;
 | 
				
			||||||
 | 
					            } catch (error) {
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					@endscript
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@script
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					  Array
 | 
				
			||||||
 | 
					      .from(document.getElementsByClassName('toggle-payment-with-token'))
 | 
				
			||||||
 | 
					      .forEach((element) => element.addEventListener('click', (e) => {
 | 
				
			||||||
 | 
					          document
 | 
				
			||||||
 | 
					              .getElementById('save-card--container').style.display = 'none';
 | 
				
			||||||
 | 
					          document
 | 
				
			||||||
 | 
					              .getElementById('checkout-form').classList.add('hidden');
 | 
				
			||||||
 | 
					        document
 | 
				
			||||||
 | 
					              .getElementById('pay-now-token').classList.remove('hidden');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          document
 | 
				
			||||||
 | 
					              .getElementById('token').value = e.target.dataset.token;
 | 
				
			||||||
 | 
					      }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let payWithCreditCardToggle = document.getElementById('toggle-payment-with-credit-card');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (payWithCreditCardToggle) {
 | 
				
			||||||
 | 
					      payWithCreditCardToggle
 | 
				
			||||||
 | 
					          .addEventListener('click', () => {
 | 
				
			||||||
 | 
					              document
 | 
				
			||||||
 | 
					                  .getElementById('save-card--container').style.display = 'grid';
 | 
				
			||||||
 | 
					             document
 | 
				
			||||||
 | 
					              .getElementById('checkout-form').classList.remove('hidden');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document
 | 
				
			||||||
 | 
					              .getElementById('pay-now-token').classList.add('hidden');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					              document
 | 
				
			||||||
 | 
					                  .getElementById('token').value = null;
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    payWithCreditCardToggle.click();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  let payNowButton = document.getElementById('pay-now-token');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if (payNowButton) {
 | 
				
			||||||
 | 
					      payNowButton
 | 
				
			||||||
 | 
					          .addEventListener('click', (e) => {
 | 
				
			||||||
 | 
					              
 | 
				
			||||||
 | 
					            if (token) {
 | 
				
			||||||
 | 
					                document.getElementById("token").value = token.value;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                document.getElementById('errors').textContent = '';
 | 
				
			||||||
 | 
					                document.getElementById('errors').hidden = true;
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                document.getElementById('pay-now-token').disabled = true;
 | 
				
			||||||
 | 
					                document.querySelector('#pay-now-token > svg').classList.remove('hidden');
 | 
				
			||||||
 | 
					                document.querySelector('#pay-now-token > svg').classList.add('justify-center');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                document.querySelector('#pay-now-token > svg').classList.add('mx-auto');
 | 
				
			||||||
 | 
					                document.querySelector('#pay-now-token > svg').classList.add('item-center');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                document.querySelector('#pay-now-token > span').classList.add('hidden');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            document.getElementById("gateway_response").value = JSON.stringify( {token: token.value, orderID: "{!! $order_id !!}"} );
 | 
				
			||||||
 | 
					            document.getElementById("server_response").submit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					@endscript
 | 
				
			||||||
@ -0,0 +1,117 @@
 | 
				
			|||||||
 | 
					<div class="rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden p-5 bg-white sm:gap-4"
 | 
				
			||||||
 | 
					    id="paypal-ppcp-payment">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <form action="{{ route('client.payments.response') }}" method="post" id="server_response">
 | 
				
			||||||
 | 
					        @csrf
 | 
				
			||||||
 | 
					        <input type="hidden" name="payment_hash" value="{{ $payment_hash }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="company_gateway_id" value="{{ $gateway->company_gateway->id }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="gateway_type_id" id="gateway_type_id" value="{{ $gateway_type_id }}">
 | 
				
			||||||
 | 
					        <input type="hidden" name="gateway_response" id="gateway_response">
 | 
				
			||||||
 | 
					        <input type="hidden" name="amount_with_fee" id="amount_with_fee" value="{{ $total['amount_with_fee'] }}" />
 | 
				
			||||||
 | 
					    </form>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div class="alert alert-failure mb-4" hidden id="errors"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <div id="paypal-button-container" class="paypal-button-container"></div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <script type="application/json" fncls="fnparams-dede7cc5-15fd-4c75-a9f4-36c430ee3a99">
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            "f":"{{ $guid }}",
 | 
				
			||||||
 | 
					            "s":"paypal.ppcp.pay"        // unique ID for each web page
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    </script>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@assets
 | 
				
			||||||
 | 
					<script type="text/javascript" src="https://c.paypal.com/da/r/fb.js"></script>
 | 
				
			||||||
 | 
					<script src="https://www.paypal.com/sdk/js?client-id={!! $client_id !!}¤cy={!! $currency !!}&merchant-id={!! $merchantId !!}&components=buttons,funding-eligibility&intent=capture&enable-funding={!! $funding_source !!}"  data-partner-attribution-id="invoiceninja_SP_PPCP"></script>
 | 
				
			||||||
 | 
					@endassets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@script
 | 
				
			||||||
 | 
					<script>
 | 
				
			||||||
 | 
					//&buyer-country=US¤cy=USD&enable-funding=venmo
 | 
				
			||||||
 | 
					    const fundingSource = "{!! $funding_source !!}";
 | 
				
			||||||
 | 
					    const clientId = "{{ $client_id }}";
 | 
				
			||||||
 | 
					    const orderId = "{!! $order_id !!}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    paypal.Buttons({
 | 
				
			||||||
 | 
					        env: 'production',
 | 
				
			||||||
 | 
					        fundingSource: fundingSource,
 | 
				
			||||||
 | 
					        client: clientId,
 | 
				
			||||||
 | 
					        createOrder: function(data, actions) {
 | 
				
			||||||
 | 
					            return orderId;  
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        onApprove: function(data, actions) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            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) {
 | 
				
			||||||
 | 
					            document.getElementById("gateway_response").value = error;
 | 
				
			||||||
 | 
					            document.getElementById("server_response").submit();
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        onClick: function (){
 | 
				
			||||||
 | 
					           // document.getElementById('paypal-button-container').hidden = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    }).render('#paypal-button-container').catch(function(err) {
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					      document.getElementById('errors').textContent = err;
 | 
				
			||||||
 | 
					      document.getElementById('errors').hidden = false;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    document.getElementById("server_response").addEventListener('submit', (e) => {
 | 
				
			||||||
 | 
							if (document.getElementById("server_response").classList.contains('is-submitting')) {
 | 
				
			||||||
 | 
								e.preventDefault();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							document.getElementById("server_response").classList.add('is-submitting');
 | 
				
			||||||
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</script>
 | 
				
			||||||
 | 
					@endscript
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user