1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-08 12:12:48 +01:00

updated resources

This commit is contained in:
David Bomba 2024-06-06 11:17:34 +10:00
parent b805bba375
commit e61c2422ee
9 changed files with 90 additions and 46 deletions

View File

@ -369,13 +369,30 @@ class PayPalBasePaymentDriver extends BaseDriver
} }
public function handleProcessingFailure(array $response)
{
SystemLogger::dispatch(
['response' => $response],
SystemLog::CATEGORY_GATEWAY_RESPONSE,
SystemLog::EVENT_GATEWAY_FAILURE,
SystemLog::TYPE_PAYPAL,
$this->client,
$this->client->company ?? $this->company_gateway->company,
);
switch ($response['name']) {
case 'NOT_AUTHORIZED':
throw new PaymentFailed("There was a permissions issue processing this payment, please contact the merchant. ", 401);
break;
default:
throw new PaymentFailed("Unknown error occurred processing payment. Please contact merchant.", 500);
break;
}
}
public function handleRetry($response, $request) { public function handleRetry($response, $request) {
// $response = $r->json();
// nlog($response['details']);
// if(in_array($response['details'][0]['issue'], ['INSTRUMENT_DECLINED', 'PAYER_ACTION_REQUIRED']))
return response()->json($response->json()); return response()->json($response->json());
} }

View File

@ -60,7 +60,7 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
*/ */
public function processPaymentResponse($request) public function processPaymentResponse($request)
{ {
nlog("response");
$this->init(); $this->init();
$request['gateway_response'] = str_replace("Error: ", "", $request['gateway_response']); $request['gateway_response'] = str_replace("Error: ", "", $request['gateway_response']);
@ -73,12 +73,7 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
//capture //capture
if(!isset($response['orderID']) && isset($response['name']) && $response['name'] == "UNPROCESSABLE_ENTITY"){ $orderID = $response['orderID'] ?? $this->payment_hash->data->orderID;
$this->handleDuplicateInvoiceId($this->payment_hash->data->orderID);
$response['orderID'] = $this->payment_hash->data->orderID;
}
$orderID = $response['orderID'];
if($this->company_gateway->require_shipping_address) { if($this->company_gateway->require_shipping_address) {
@ -106,7 +101,10 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
if($r->status() == 422){ if($r->status() == 422){
//handle conditions where the client may need to try again. //handle conditions where the client may need to try again.
return $this->handleRetry($r, $request);
$r = $this->handleDuplicateInvoiceId($orderID);
} }
} }
@ -287,13 +285,19 @@ class PayPalRestPaymentDriver extends PayPalBasePaymentDriver
$r = $this->gatewayRequest('/v2/checkout/orders', 'post', $order); $r = $this->gatewayRequest('/v2/checkout/orders', 'post', $order);
nlog($r->json()); nlog($r->json());
$response = $r->json();
$this->payment_hash->withData("orderID", $r->json()['id']);
return $r->json()['id']; if(!isset($response['id']))
$this->handleProcessingFailure($response);
$this->payment_hash->withData("orderID", $response['id']);
return $response['id'];
} }
/** /**
* processTokenPayment * processTokenPayment
* *

File diff suppressed because one or more lines are too long

View File

@ -240,7 +240,7 @@
"src": "resources/js/setup/setup.js" "src": "resources/js/setup/setup.js"
}, },
"resources/sass/app.scss": { "resources/sass/app.scss": {
"file": "assets/app-d1d7e29f.css", "file": "assets/app-2a1d3e58.css",
"isEntry": true, "isEntry": true,
"src": "resources/sass/app.scss" "src": "resources/sass/app.scss"
} }

View File

@ -1,4 +1,4 @@
<div wire:ignore.self class="@unless($form_only) container mx-auto grid grid-cols-12 @endunless mb-4" data-ref="required-fields-container"> <div wire:ignore.self class="@unless($form_only) container mx-auto grid grid-cols-12 @endunless mb-4 transition-height duration-1000 ease-in-out h-500" data-ref="required-fields-container">
<div class="col-span-12 lg:col-span-6 lg:col-start-4 overflow-hidden @unless($form_only) bg-white shadow rounded-lg @endunless"> <div class="col-span-12 lg:col-span-6 lg:col-start-4 overflow-hidden @unless($form_only) bg-white shadow rounded-lg @endunless">
@unless($form_only) @unless($form_only)
<div class="px-4 py-5 border-b border-gray-200 sm:px-6"> <div class="px-4 py-5 border-b border-gray-200 sm:px-6">

View File

@ -16,7 +16,12 @@
<div class="alert alert-failure mb-4" hidden id="errors"></div> <div class="alert alert-failure mb-4" hidden id="errors"></div>
<div id="paypal-button-container" class="paypal-button-container"></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>
@endsection @endsection
@ -24,7 +29,40 @@
@endsection @endsection
@push('footer') @push('footer')
<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>
<script src="https://www.paypal.com/sdk/js?client-id={!! $client_id !!}&currency={!! $currency !!}&components=buttons,funding-eligibility&intent=capture&enable-funding={!! $funding_source !!}" data-partner-attribution-id="invoiceninja_SP_PPCP"></script> <script src="https://www.paypal.com/sdk/js?client-id={!! $client_id !!}&currency={!! $currency !!}&components=buttons,funding-eligibility&intent=capture&enable-funding={!! $funding_source !!}" data-partner-attribution-id="invoiceninja_SP_PPCP"></script>
<script> <script>
@ -106,6 +144,8 @@
if(fundingSource != 'card') if(fundingSource != 'card')
document.getElementById('paypal-button-container').hidden = true; 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'); document.querySelector('div[data-ref="required-fields-container').classList.add('hidden');
}, },

View File

@ -75,7 +75,6 @@
@endsection @endsection
@push('footer') @push('footer')
<link rel="stylesheet" type="text/css" href=https://www.paypalobjects.com/webstatic/en_US/developer/docs/css/cardfields.css />
@if(isset($merchantId)) @if(isset($merchantId))
<script src="https://www.paypal.com/sdk/js?client-id={!! $client_id !!}&merchantId={!! $merchantId !!}&components=card-fields" data-partner-attribution-id="invoiceninja_SP_PPCP"></script> <script src="https://www.paypal.com/sdk/js?client-id={!! $client_id !!}&merchantId={!! $merchantId !!}&components=card-fields" data-partner-attribution-id="invoiceninja_SP_PPCP"></script>
@ -87,24 +86,7 @@
const clientId = "{{ $client_id }}"; const clientId = "{{ $client_id }}";
const orderId = "{!! $order_id !!}"; const orderId = "{!! $order_id !!}";
const cardStyle = {
'input': {
'font-size': '16px',
'font-family': 'courier, monospace',
'font-weight': 'lighter',
'color': '#ccc',
},
'.invalid': {
'color': 'purple',
},
'.expcvv': {
'display': 'grid',
'grid-template-columns': 'auto'
}
};
const cardField = paypal.CardFields({ const cardField = paypal.CardFields({
// style: cardStyle,
client: clientId, client: clientId,
createOrder: function(data, actions) { createOrder: function(data, actions) {
return orderId; return orderId;
@ -125,7 +107,6 @@
} }
let storeCard = document.querySelector('input[name=token-billing-checkbox]:checked'); let storeCard = document.querySelector('input[name=token-billing-checkbox]:checked');
if (storeCard) { if (storeCard) {
@ -197,7 +178,6 @@
const numberField = cardField.NumberField({ const numberField = cardField.NumberField({
inputEvents: { inputEvents: {
onChange: (event)=> { onChange: (event)=> {
// console.log("returns a stateObject", event);
} }
}, },
}); });
@ -207,7 +187,6 @@
const cvvField = cardField.CVVField({ const cvvField = cardField.CVVField({
inputEvents: { inputEvents: {
onChange: (event)=> { onChange: (event)=> {
// console.log("returns a stateObject", event);
} }
}, },
}); });
@ -216,7 +195,6 @@
const expiryField = cardField.ExpiryField({ const expiryField = cardField.ExpiryField({
inputEvents: { inputEvents: {
onChange: (event)=> { onChange: (event)=> {
// console.log("returns a stateObject", event);
} }
}, },
}); });

View File

@ -50,8 +50,10 @@
document.addEventListener('livewire:init', () => { document.addEventListener('livewire:init', () => {
Livewire.on('passed-required-fields-check', () => { Livewire.on('passed-required-fields-check', () => {
document.querySelector('div[data-ref="required-fields-container"]').classList.add('opacity-25');
document.querySelector('div[data-ref="required-fields-container"]').classList.add('pointer-events-none'); document.querySelector('div[data-ref="required-fields-container"]').classList.toggle('h-0');
// document.querySelector('div[data-ref="required-fields-container"]').classList.add('opacity-25');
// document.querySelector('div[data-ref="required-fields-container"]').classList.add('pointer-events-none');
document.querySelector('div[data-ref="gateway-container"]').classList.remove('opacity-25'); document.querySelector('div[data-ref="gateway-container"]').classList.remove('opacity-25');
document.querySelector('div[data-ref="gateway-container"]').classList.remove('pointer-events-none'); document.querySelector('div[data-ref="gateway-container"]').classList.remove('pointer-events-none');

View File

@ -15,6 +15,9 @@ module.exports = {
fontFamily: { fontFamily: {
sans: ['Open Sans', ...defaultTheme.fontFamily.sans], sans: ['Open Sans', ...defaultTheme.fontFamily.sans],
}, },
transitionProperty: {
'height': 'height'
}
}, },
}, },
plugins: [ plugins: [