From b2f0012aaea1c9694a84997dfc2a6595d6e87c6b Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 21 Jun 2017 23:36:59 +0300 Subject: [PATCH] Support updating card on file --- .../Controllers/OnlinePaymentController.php | 8 +- app/Models/Client.php | 9 ++ .../PaymentDrivers/BasePaymentDriver.php | 9 +- resources/lang/en/texts.php | 3 + .../views/payments/braintree/paypal.blade.php | 2 +- .../views/payments/credit_card.blade.php | 7 +- .../views/payments/payment_method.blade.php | 6 +- .../payments/paymentmethods_list.blade.php | 87 ++++++++++--------- .../payments/stripe/bank_transfer.blade.php | 2 +- .../payments/wepay/bank_transfer.blade.php | 2 +- 10 files changed, 84 insertions(+), 51 deletions(-) diff --git a/app/Http/Controllers/OnlinePaymentController.php b/app/Http/Controllers/OnlinePaymentController.php index 34c37fd42fc2..46a4d99a180d 100644 --- a/app/Http/Controllers/OnlinePaymentController.php +++ b/app/Http/Controllers/OnlinePaymentController.php @@ -75,7 +75,7 @@ class OnlinePaymentController extends BaseController ]); } - if (! $invitation->invoice->canBePaid()) { + if (! $invitation->invoice->canBePaid() && ! request()->update) { return redirect()->to('view/' . $invitation->invitation_key); } @@ -120,14 +120,16 @@ class OnlinePaymentController extends BaseController $gatewayTypeId = Session::get($invitation->id . 'gateway_type'); $paymentDriver = $invitation->account->paymentDriver($invitation, $gatewayTypeId); - if (! $invitation->invoice->canBePaid()) { + if (! $invitation->invoice->canBePaid() && ! request()->update) { return redirect()->to('view/' . $invitation->invitation_key); } try { $paymentDriver->completeOnsitePurchase($request->all()); - if ($paymentDriver->isTwoStep()) { + if (request()->update) { + return redirect('/client/dashboard')->withMessage(trans('texts.updated_payment_details')); + } elseif ($paymentDriver->isTwoStep()) { Session::flash('warning', trans('texts.bank_account_verification_next_steps')); } else { Session::flash('message', trans('texts.applied_payment')); diff --git a/app/Models/Client.php b/app/Models/Client.php index d09984343f00..8ee0915933b1 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -559,6 +559,15 @@ class Client extends EntityModel { return $this->payment_terms == -1 ? 0 : $this->payment_terms; } + + public function firstInvitationKey() + { + if ($invoice = $this->invoices->first()) { + if ($invitation = $invoice->invitations->first()) { + return $invitation->invitation_key; + } + } + } } Client::creating(function ($client) { diff --git a/app/Ninja/PaymentDrivers/BasePaymentDriver.php b/app/Ninja/PaymentDrivers/BasePaymentDriver.php index 8791a2e4921d..6822278b67cc 100644 --- a/app/Ninja/PaymentDrivers/BasePaymentDriver.php +++ b/app/Ninja/PaymentDrivers/BasePaymentDriver.php @@ -157,6 +157,11 @@ class BasePaymentDriver return redirect()->to('view/' . $this->invitation->invitation_key); } + $url = 'payment/' . $this->invitation->invitation_key; + if (request()->update) { + $url .= '?update=true'; + } + $data = [ 'details' => ! empty($input['details']) ? json_decode($input['details']) : false, 'accountGateway' => $this->accountGateway, @@ -164,7 +169,7 @@ class BasePaymentDriver 'gateway' => $gateway, 'showAddress' => $this->accountGateway->show_address, 'showBreadcrumbs' => false, - 'url' => 'payment/' . $this->invitation->invitation_key, + 'url' => $url, 'amount' => $this->invoice()->getRequestedAmount(), 'invoiceNumber' => $this->invoice()->invoice_number, 'client' => $this->client(), @@ -293,7 +298,7 @@ class BasePaymentDriver } } - if ($this->isTwoStep()) { + if ($this->isTwoStep() || request()->update) { return; } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 74422734421f..4bf768490d7a 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -2269,6 +2269,9 @@ $LANG = array( 'select_label' => 'Select Label', 'label' => 'Label', 'service' => 'Service', + 'update_payment_details' => 'Update payment details', + 'updated_payment_details' => 'Successfully updated payment details', + 'update_credit_card' => 'Update Credit Card', ); diff --git a/resources/views/payments/braintree/paypal.blade.php b/resources/views/payments/braintree/paypal.blade.php index 89813d203a96..0fdf0b79bbc2 100644 --- a/resources/views/payments/braintree/paypal.blade.php +++ b/resources/views/payments/braintree/paypal.blade.php @@ -29,7 +29,7 @@
@if(isset($amount)) - {!! Button::success(strtoupper(trans('texts.pay_now') . ' - ' . $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) )) + {!! Button::success(request()->update ? strtoupper(trans('texts.submit')) : strtoupper(trans('texts.pay_now') . ' - ' . $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) )) ->submit() ->large() !!} @else diff --git a/resources/views/payments/credit_card.blade.php b/resources/views/payments/credit_card.blade.php index f96d5318df69..46c1843295d8 100644 --- a/resources/views/payments/credit_card.blade.php +++ b/resources/views/payments/credit_card.blade.php @@ -316,11 +316,12 @@

 

@if (isset($invitation)) - {!! Button::normal(strtoupper(trans('texts.cancel')))->large()->asLinkTo($invitation->getLink()) !!} + {!! Button::normal(strtoupper(trans('texts.cancel')))->large()->asLinkTo(HTMLUtils::previousUrl('/credits')) !!}    @endif - @if(isset($amount)) - {!! Button::success(strtoupper(trans('texts.pay_now') . ' - ' . $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) )) + + @if (isset($amount)) + {!! Button::success(request()->update ? strtoupper(trans('texts.submit')) : strtoupper(trans('texts.pay_now') . ' - ' . $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) )) ->submit() ->large() !!} @else diff --git a/resources/views/payments/payment_method.blade.php b/resources/views/payments/payment_method.blade.php index 10b7268d7ecf..a05f983638fd 100644 --- a/resources/views/payments/payment_method.blade.php +++ b/resources/views/payments/payment_method.blade.php @@ -15,7 +15,11 @@
@if ($client && isset($invoiceNumber))

{{ $client->getDisplayName() }}

-

{{ trans('texts.invoice') . ' ' . $invoiceNumber }}|  {{ trans('texts.amount_due') }}: {{ $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) }}

+ @if (request()->update) +

{{ trans('texts.update_payment_details') }}

+ @else +

{{ trans('texts.invoice') . ' ' . $invoiceNumber }}|  {{ trans('texts.amount_due') }}: {{ $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) }}

+ @endif @elseif ($paymentTitle)

{{ $paymentTitle }} @if(isset($paymentSubtitle)) diff --git a/resources/views/payments/paymentmethods_list.blade.php b/resources/views/payments/paymentmethods_list.blade.php index 9058bca53edf..bd540c46af8b 100644 --- a/resources/views/payments/paymentmethods_list.blade.php +++ b/resources/views/payments/paymentmethods_list.blade.php @@ -77,54 +77,63 @@ @endif -@if(!empty($paymentMethods) && count($paymentMethods)) -

{{ trans('texts.payment_methods') }}

- - @foreach ($paymentMethods as $paymentMethod) -
- - {{ trans(payment_type->name))) }}"> - - - @if($paymentMethod->payment_type_id == PAYMENT_TYPE_ACH) - @if($paymentMethod->bank_name) - {{ $paymentMethod->bank_name }} - @else - {{ trans('texts.bank_account') }} - @endif - @elseif($paymentMethod->payment_type_id == PAYMENT_TYPE_PAYPAL) - {{ trans('texts.paypal') . ': ' . $paymentMethod->email }} - @else - {{ trans('texts.credit_card') }} +@if ($invitationKey = $client->firstInvitationKey()) +

+ {{ trans('texts.payment_methods') }} + @if ($account->getGatewayByType(GATEWAY_TYPE_CREDIT_CARD) + && $account->getGatewayByType(GATEWAY_TYPE_TOKEN) + && $account->token_billing_type_id != TOKEN_BILLING_DISABLED) +    + {!! Button::success(strtoupper(trans('texts.update_credit_card')))->asLinkTo(URL::to("/payment/$invitationKey/credit_card?update=true")) !!} @endif +

- - {{ trans('texts.added_on', ['date' => Utils::dateToString($paymentMethod->created_at)]) }} + @if(!empty($paymentMethods) && count($paymentMethods)) + @foreach ($paymentMethods as $paymentMethod) +
+ + {{ trans(payment_type->name))) }}"> + - @if($paymentMethod->payment_type_id == PAYMENT_TYPE_ACH) - @if($paymentMethod->status == PAYMENT_METHOD_STATUS_NEW) - @if($gateway->gateway_id == GATEWAY_STRIPE) - ({{trans('texts.complete_verification')}}) + @if($paymentMethod->payment_type_id == PAYMENT_TYPE_ACH) + @if($paymentMethod->bank_name) + {{ $paymentMethod->bank_name }} @else - [{{ trans('texts.verification_pending') }}] + {{ trans('texts.bank_account') }} @endif - @elseif($paymentMethod->status == PAYMENT_METHOD_STATUS_VERIFICATION_FAILED) - [{{trans('texts.verification_failed')}}] + @elseif($paymentMethod->payment_type_id == PAYMENT_TYPE_PAYPAL) + {{ trans('texts.paypal') . ': ' . $paymentMethod->email }} + @else + {{ trans('texts.credit_card') }} @endif - @endif - | - @if($paymentMethod->id == $paymentMethod->account_gateway_token->default_payment_method_id) - {{trans('texts.used_for_auto_bill')}} - @elseif($paymentMethod->payment_type_id != PAYMENT_TYPE_ACH || $paymentMethod->status == PAYMENT_METHOD_STATUS_VERIFIED) - {{trans('texts.use_for_auto_bill')}} - @endif - | {{ trans('texts.remove') }} -
- @endforeach + - {{ trans('texts.added_on', ['date' => Utils::dateToString($paymentMethod->created_at)]) }} + + @if($paymentMethod->payment_type_id == PAYMENT_TYPE_ACH) + @if($paymentMethod->status == PAYMENT_METHOD_STATUS_NEW) + @if($gateway->gateway_id == GATEWAY_STRIPE) + ({{trans('texts.complete_verification')}}) + @else + [{{ trans('texts.verification_pending') }}] + @endif + @elseif($paymentMethod->status == PAYMENT_METHOD_STATUS_VERIFICATION_FAILED) + [{{trans('texts.verification_failed')}}] + @endif + @endif + | + @if($paymentMethod->id == $paymentMethod->account_gateway_token->default_payment_method_id) + {{trans('texts.used_for_auto_bill')}} + @elseif($paymentMethod->payment_type_id != PAYMENT_TYPE_ACH || $paymentMethod->status == PAYMENT_METHOD_STATUS_VERIFIED) + {{trans('texts.use_for_auto_bill')}} + @endif + | {{ trans('texts.remove') }} + +
+ @endforeach + @endif @endif -
@if (false && $account->getGatewayByType(GATEWAY_TYPE_CREDIT_CARD) && $account->getGatewayByType(GATEWAY_TYPE_TOKEN)) {!! Button::success(strtoupper(trans('texts.add_credit_card'))) diff --git a/resources/views/payments/stripe/bank_transfer.blade.php b/resources/views/payments/stripe/bank_transfer.blade.php index 11df6c30f75b..35690db9bb6e 100644 --- a/resources/views/payments/stripe/bank_transfer.blade.php +++ b/resources/views/payments/stripe/bank_transfer.blade.php @@ -240,7 +240,7 @@ ->large() !!} @if ($accountGateway->getPlaidEnabled() && !empty($amount)) - {!! Button::success(strtoupper(trans('texts.pay_now') . ' - ' . $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) )) + {!! Button::success(request()->update ? strtoupper(trans('texts.submit')) : strtoupper(trans('texts.pay_now') . ' - ' . $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) )) ->submit() ->withAttributes(['style'=>'display:none', 'id'=>'pay_now_button']) ->large() !!} diff --git a/resources/views/payments/wepay/bank_transfer.blade.php b/resources/views/payments/wepay/bank_transfer.blade.php index 6644505d4672..35583082a21e 100644 --- a/resources/views/payments/wepay/bank_transfer.blade.php +++ b/resources/views/payments/wepay/bank_transfer.blade.php @@ -33,7 +33,7 @@ {!! Button::normal(strtoupper(trans('texts.cancel')))->large()->asLinkTo($invitation->getLink()) !!}    @if(isset($amount) && empty($paymentMethodPending)) - {!! Button::success(strtoupper(trans('texts.pay_now') . ' - ' . $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) )) + {!! Button::success(request()->update ? strtoupper(trans('texts.submit')) : strtoupper(trans('texts.pay_now') . ' - ' . $account->formatMoney($amount, $client, CURRENCY_DECORATOR_CODE) )) ->submit() ->large() !!} @else