From fa37a3b0ba94743228a7e61ef262c6f94361b8f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 20:42:39 +0200 Subject: [PATCH 01/13] Scaffold `BankTransfer` --- app/PaymentDrivers/Mollie/BankTransfer.php | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 app/PaymentDrivers/Mollie/BankTransfer.php diff --git a/app/PaymentDrivers/Mollie/BankTransfer.php b/app/PaymentDrivers/Mollie/BankTransfer.php new file mode 100644 index 000000000000..c5179cb29e16 --- /dev/null +++ b/app/PaymentDrivers/Mollie/BankTransfer.php @@ -0,0 +1,28 @@ + Date: Fri, 24 Sep 2021 20:43:03 +0200 Subject: [PATCH 02/13] Add `BANK_TRANSFER` to Gateway --- app/Models/Gateway.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index 4414a685c9b0..0e05a43835c6 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -90,6 +90,7 @@ class Gateway extends StaticModel case 7: return [ GatewayType::CREDIT_CARD => ['refund' => false, 'token_billing' => true], // Mollie + GatewayType::BANK_TRANSFER => ['refund' => false, 'token_billing' => true], ]; case 15: return [GatewayType::PAYPAL => ['refund' => true, 'token_billing' => false]]; //Paypal From a68af4488e6cce6c26c6742fac6a6957d55d88f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 20:43:21 +0200 Subject: [PATCH 03/13] Add `BankTransfer` to MolliePaymentDriver --- app/PaymentDrivers/MolliePaymentDriver.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/PaymentDrivers/MolliePaymentDriver.php b/app/PaymentDrivers/MolliePaymentDriver.php index 1bffcca72cdf..18b808cb667d 100644 --- a/app/PaymentDrivers/MolliePaymentDriver.php +++ b/app/PaymentDrivers/MolliePaymentDriver.php @@ -24,6 +24,7 @@ use App\Models\Payment; use App\Models\PaymentHash; use App\Models\PaymentType; use App\Models\SystemLog; +use App\PaymentDrivers\Mollie\BankTransfer; use App\PaymentDrivers\Mollie\CreditCard; use App\Utils\Traits\MakesHash; use Illuminate\Support\Facades\Validator; @@ -64,6 +65,7 @@ class MolliePaymentDriver extends BaseDriver */ public static $methods = [ GatewayType::CREDIT_CARD => CreditCard::class, + GatewayType::BANK_TRANSFER => BankTransfer::class, ]; const SYSTEM_LOG_TYPE = SystemLog::TYPE_MOLLIE; @@ -84,6 +86,7 @@ class MolliePaymentDriver extends BaseDriver $types = []; $types[] = GatewayType::CREDIT_CARD; + $types[] = GatewayType::BANK_TRANSFER; return $types; } From 939591611e5e3da626777f08b78e88797fcfcdb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 20:44:47 +0200 Subject: [PATCH 04/13] Initialize MollieApiClient --- app/PaymentDrivers/Mollie/BankTransfer.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/PaymentDrivers/Mollie/BankTransfer.php b/app/PaymentDrivers/Mollie/BankTransfer.php index c5179cb29e16..87309f2ea9c6 100644 --- a/app/PaymentDrivers/Mollie/BankTransfer.php +++ b/app/PaymentDrivers/Mollie/BankTransfer.php @@ -15,9 +15,19 @@ namespace App\PaymentDrivers\Mollie; use App\Http\Requests\Request; use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; use App\PaymentDrivers\Common\MethodInterface; +use App\PaymentDrivers\MolliePaymentDriver; class BankTransfer implements MethodInterface { + protected MolliePaymentDriver $mollie; + + public function __construct(MolliePaymentDriver $mollie) + { + $this->mollie = $mollie; + + $this->mollie->init(); + } + public function authorizeView(array $data) { } public function authorizeResponse(Request $request) { } From 50199332468f2c1efcc2a2db429a10368e375d0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 20:49:40 +0200 Subject: [PATCH 05/13] Authorization --- app/PaymentDrivers/Mollie/BankTransfer.php | 34 ++++++++++++++++--- resources/lang/en/texts.php | 1 + .../mollie/bank_transfer/authorize.blade.php | 8 +++++ 3 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 resources/views/portal/ninja2020/gateways/mollie/bank_transfer/authorize.blade.php diff --git a/app/PaymentDrivers/Mollie/BankTransfer.php b/app/PaymentDrivers/Mollie/BankTransfer.php index 87309f2ea9c6..b35ea6adac9e 100644 --- a/app/PaymentDrivers/Mollie/BankTransfer.php +++ b/app/PaymentDrivers/Mollie/BankTransfer.php @@ -12,10 +12,12 @@ namespace App\PaymentDrivers\Mollie; -use App\Http\Requests\Request; use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; +use App\Http\Requests\Request; use App\PaymentDrivers\Common\MethodInterface; use App\PaymentDrivers\MolliePaymentDriver; +use Illuminate\Http\RedirectResponse; +use Illuminate\View\View; class BankTransfer implements MethodInterface { @@ -28,11 +30,33 @@ class BankTransfer implements MethodInterface $this->mollie->init(); } - public function authorizeView(array $data) { } + /** + * Show the authorization page for bank transfer. + * + * @param array $data + * @return View + */ + public function authorizeView(array $data): View + { + return render('gateways.mollie.bank_transfer.authorize', $data); + } - public function authorizeResponse(Request $request) { } + /** + * Handle the authorization for bank transfer. + * + * @param Request $request + * @return RedirectResponse + */ + public function authorizeResponse(Request $request): RedirectResponse + { + return redirect()->route('client.payment_methods.index'); + } - public function paymentView(array $data) { } + public function paymentView(array $data) + { + } - public function paymentResponse(PaymentResponseRequest $request) { } + public function paymentResponse(PaymentResponseRequest $request) + { + } } diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 04f3816d3927..bb078c1f043b 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -4313,6 +4313,7 @@ $LANG = array( 'unable_to_verify_payment_method' => 'Unable to verify payment method.', 'generic_gateway_error' => 'Gateway configuration error. Please check your credentials.', 'my_documents' => 'My documents', + 'payment_method_cannot_be_preauthorized' => 'This payment method cannot be preauthorized.', ); return $LANG; diff --git a/resources/views/portal/ninja2020/gateways/mollie/bank_transfer/authorize.blade.php b/resources/views/portal/ninja2020/gateways/mollie/bank_transfer/authorize.blade.php new file mode 100644 index 000000000000..abe8eb9470f1 --- /dev/null +++ b/resources/views/portal/ninja2020/gateways/mollie/bank_transfer/authorize.blade.php @@ -0,0 +1,8 @@ +@extends('portal.ninja2020.layout.payments', ['gateway_title' => ctrans('texts.bank_transfer'), 'card_title' => +ctrans('texts.bank_transfer')]) + +@section('gateway_content') + @component('portal.ninja2020.components.general.card-element-single') + {{ __('texts.payment_method_cannot_be_preauthorized') }} + @endcomponent +@endsection From 6c0311dab1c56083f0fe68f4502d8efabf03d034 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 21:17:43 +0200 Subject: [PATCH 06/13] Payments --- app/PaymentDrivers/Mollie/BankTransfer.php | 151 +++++++++++++++++++++ 1 file changed, 151 insertions(+) diff --git a/app/PaymentDrivers/Mollie/BankTransfer.php b/app/PaymentDrivers/Mollie/BankTransfer.php index b35ea6adac9e..6127e9acc91e 100644 --- a/app/PaymentDrivers/Mollie/BankTransfer.php +++ b/app/PaymentDrivers/Mollie/BankTransfer.php @@ -12,12 +12,22 @@ namespace App\PaymentDrivers\Mollie; +use App\Exceptions\PaymentFailed; use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; use App\Http\Requests\Request; +use App\Jobs\Mail\PaymentFailureMailer; +use App\Jobs\Util\SystemLogger; +use App\Models\GatewayType; +use App\Models\Payment; +use App\Models\PaymentType; +use App\Models\SystemLog; use App\PaymentDrivers\Common\MethodInterface; use App\PaymentDrivers\MolliePaymentDriver; +use Exception; use Illuminate\Http\RedirectResponse; +use Illuminate\Routing\Redirector; use Illuminate\View\View; +use Mollie\Api\Resources\Payment as ResourcesPayment; class BankTransfer implements MethodInterface { @@ -52,11 +62,152 @@ class BankTransfer implements MethodInterface return redirect()->route('client.payment_methods.index'); } + /** + * Show the payment page for bank transfer. + * + * @param array $data + * @return Redirector|RedirectResponse + */ public function paymentView(array $data) { + $this->mollie->payment_hash + ->withData('gateway_type_id', GatewayType::BANK_TRANSFER) + ->withData('client_id', $this->mollie->client->id); + + try { + $payment = $this->mollie->gateway->payments->create([ + 'method' => 'banktransfer', + 'amount' => [ + 'currency' => $this->mollie->client->currency()->code, + 'value' => $this->mollie->convertToMollieAmount((float) $this->mollie->payment_hash->data->amount_with_fee), + ], + 'description' => \sprintf('Invoices: %s', collect($data['invoices'])->pluck('invoice_number')), + 'redirectUrl' => route('client.payments.response', [ + 'company_gateway_id' => $this->mollie->company_gateway->id, + 'payment_hash' => $this->mollie->payment_hash->hash, + 'payment_method_id' => GatewayType::BANK_TRANSFER, + ]), + // 'webhookUrl' => $this->mollie->company_gateway->webhookUrl(), + 'webhookUrl' => 'https://invoiceninja.com', + 'metadata' => [ + 'client_id' => $this->mollie->client->hashed_id, + ], + ]); + + $this->mollie->payment_hash->withData('payment_id', $payment->id); + + return redirect( + $payment->getCheckoutUrl() + ); + } catch (\Mollie\Api\Exceptions\ApiException | \Exception $exception) { + return $this->processUnsuccessfulPayment($exception); + } } + /** + * Handle unsuccessful payment. + * + * @param Exception $e + * @throws PaymentFailed + * @return void + */ + public function processUnsuccessfulPayment(\Exception $e): void + { + PaymentFailureMailer::dispatch( + $this->mollie->client, + $e->getMessage(), + $this->mollie->client->company, + $this->mollie->payment_hash->data->amount_with_fee + ); + + SystemLogger::dispatch( + $e->getMessage(), + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_FAILURE, + SystemLog::TYPE_MOLLIE, + $this->mollie->client, + $this->mollie->client->company, + ); + + throw new PaymentFailed($e->getMessage(), $e->getCode()); + } + + /** + * Handle the payments for the bank transfer. + * + * @param PaymentResponseRequest $request + * @return mixed + */ public function paymentResponse(PaymentResponseRequest $request) { + if (! \property_exists($this->mollie->payment_hash->data, 'payment_id')) { + return $this->processUnsuccessfulPayment( + new PaymentFailed('Whoops, something went wrong. Missing required [payment_id] parameter. Please contact administrator. Reference hash: ' . $this->mollie->payment_hash->hash) + ); + } + + try { + $payment = $this->mollie->gateway->payments->get( + $this->mollie->payment_hash->data->payment_id + ); + + if ($payment->status === 'paid') { + return $this->processSuccessfulPayment($payment); + } + + if ($payment->status === 'open') { + return $this->processOpenPayment($payment); + } + + return $this->processUnsuccessfulPayment( + new PaymentFailed(ctrans('texts.status_voided')) + ); + } catch (\Mollie\Api\Exceptions\ApiException | \Exception $exception) { + return $this->processUnsuccessfulPayment($exception); + } + } + + /** + * Handle the successful payment for bank transfer. + * + * @param ResourcesPayment $payment + * @param string $status + * @return RedirectResponse + */ + public function processSuccessfulPayment(\Mollie\Api\Resources\Payment $payment, $status = 'paid'): RedirectResponse + { + $data = [ + 'gateway_type_id' => GatewayType::BANK_TRANSFER, + 'amount' => array_sum(array_column($this->mollie->payment_hash->invoices(), 'amount')) + $this->mollie->payment_hash->fee_total, + 'payment_type' => PaymentType::CREDIT, // @todo: Missing payment type for bank transfer. + 'transaction_reference' => $payment->id, + ]; + + $payment_record = $this->mollie->createPayment( + $data, + $payment->status === 'paid' ? Payment::STATUS_COMPLETED : Payment::STATUS_PENDING + ); + + SystemLogger::dispatch( + ['response' => $payment, 'data' => $data], + SystemLog::CATEGORY_GATEWAY_RESPONSE, + SystemLog::EVENT_GATEWAY_SUCCESS, + SystemLog::TYPE_MOLLIE, + $this->mollie->client, + $this->mollie->client->company, + ); + + return redirect()->route('client.payments.show', ['payment' => $this->mollie->encodePrimaryKey($payment_record->id)]); + } + + /** + * Handle 'open' payment status for bank transfer. + * + * @param ResourcesPayment $payment + * @return RedirectResponse + */ + public function processOpenPayment(\Mollie\Api\Resources\Payment $payment): RedirectResponse + { + return $this->processSuccessfulPayment($payment, 'open'); } } From 993bc919707f2626e73c9e8ffcde5db79ba8af07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 21:18:36 +0200 Subject: [PATCH 07/13] Pass correct `webhookUrl` to payments API --- app/PaymentDrivers/Mollie/BankTransfer.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/PaymentDrivers/Mollie/BankTransfer.php b/app/PaymentDrivers/Mollie/BankTransfer.php index 6127e9acc91e..32ee250f36f2 100644 --- a/app/PaymentDrivers/Mollie/BankTransfer.php +++ b/app/PaymentDrivers/Mollie/BankTransfer.php @@ -87,8 +87,7 @@ class BankTransfer implements MethodInterface 'payment_hash' => $this->mollie->payment_hash->hash, 'payment_method_id' => GatewayType::BANK_TRANSFER, ]), - // 'webhookUrl' => $this->mollie->company_gateway->webhookUrl(), - 'webhookUrl' => 'https://invoiceninja.com', + 'webhookUrl' => $this->mollie->company_gateway->webhookUrl(), 'metadata' => [ 'client_id' => $this->mollie->client->hashed_id, ], From b3e81fd8f24d9825d56999b579516a8f7242fcc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 22:22:42 +0200 Subject: [PATCH 08/13] Add new `PaymentType` --- app/Models/PaymentType.php | 1 + ..._mollie_bank_transfer_to_payment_types.php | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 database/migrations/2021_09_24_201319_add_mollie_bank_transfer_to_payment_types.php diff --git a/app/Models/PaymentType.php b/app/Models/PaymentType.php index b6b28cd4c8f1..37723d0a01f3 100644 --- a/app/Models/PaymentType.php +++ b/app/Models/PaymentType.php @@ -42,6 +42,7 @@ class PaymentType extends StaticModel const SEPA = 29; const GOCARDLESS = 30; const CRYPTO = 31; + const MOLLIE_BANK_TRANSFER = 34; public static function parseCardType($cardName) { diff --git a/database/migrations/2021_09_24_201319_add_mollie_bank_transfer_to_payment_types.php b/database/migrations/2021_09_24_201319_add_mollie_bank_transfer_to_payment_types.php new file mode 100644 index 000000000000..0f00a831f77a --- /dev/null +++ b/database/migrations/2021_09_24_201319_add_mollie_bank_transfer_to_payment_types.php @@ -0,0 +1,24 @@ +id = 34; + $type->name = 'Mollie Bank Transfer'; + $type->gateway_type_id = GatewayType::BANK_TRANSFER; + + $type->save(); + } +} From d7f01efcd666da7d40f8b8b1dfabb36201db993d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 22:27:54 +0200 Subject: [PATCH 09/13] Update `payment_type` & status check --- app/PaymentDrivers/Mollie/BankTransfer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/PaymentDrivers/Mollie/BankTransfer.php b/app/PaymentDrivers/Mollie/BankTransfer.php index 32ee250f36f2..bf8595e090bf 100644 --- a/app/PaymentDrivers/Mollie/BankTransfer.php +++ b/app/PaymentDrivers/Mollie/BankTransfer.php @@ -178,13 +178,13 @@ class BankTransfer implements MethodInterface $data = [ 'gateway_type_id' => GatewayType::BANK_TRANSFER, 'amount' => array_sum(array_column($this->mollie->payment_hash->invoices(), 'amount')) + $this->mollie->payment_hash->fee_total, - 'payment_type' => PaymentType::CREDIT, // @todo: Missing payment type for bank transfer. + 'payment_type' => PaymentType::MOLLIE_BANK_TRANSFER, 'transaction_reference' => $payment->id, ]; $payment_record = $this->mollie->createPayment( $data, - $payment->status === 'paid' ? Payment::STATUS_COMPLETED : Payment::STATUS_PENDING + $status === 'paid' ? Payment::STATUS_COMPLETED : Payment::STATUS_PENDING ); SystemLogger::dispatch( From 6bedf13fdc045edf3341282cfd5013f8638016a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 22:31:19 +0200 Subject: [PATCH 10/13] Uncomment & fix gateway key --- .../Browser/ClientPortal/Gateways/Mollie/CreditCardTest.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Browser/ClientPortal/Gateways/Mollie/CreditCardTest.php b/tests/Browser/ClientPortal/Gateways/Mollie/CreditCardTest.php index fd0bad760aa1..4eb872fab74f 100644 --- a/tests/Browser/ClientPortal/Gateways/Mollie/CreditCardTest.php +++ b/tests/Browser/ClientPortal/Gateways/Mollie/CreditCardTest.php @@ -12,6 +12,7 @@ namespace Tests\Browser\ClientPortal\Gateways\Mollie; +use App\Models\CompanyGateway; use Laravel\Dusk\Browser; use Tests\Browser\Pages\ClientPortal\Login; use Tests\DuskTestCase; @@ -26,9 +27,9 @@ class CreditCardTest extends DuskTestCase $browser->driver->manage()->deleteAllCookies(); } - // $this->disableCompanyGateways(); + $this->disableCompanyGateways(); - // CompanyGateway::where('gateway_key', '3758e7f7c6f4cecf0f4f348b9a00f456')->restore(); + CompanyGateway::where('gateway_key', '1bd651fb213ca0c9d66ae3c336dc77e8')->restore(); $this->browse(function (Browser $browser) { $browser From 8790ccef2e4cb73e8a4a604f6ebca6625a50c3c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 22:31:31 +0200 Subject: [PATCH 11/13] Scaffold BankTransferTest --- .../Gateways/Mollie/BankTransferTest.php | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php diff --git a/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php b/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php new file mode 100644 index 000000000000..c37395f5771e --- /dev/null +++ b/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php @@ -0,0 +1,40 @@ +driver->manage()->deleteAllCookies(); + } + + $this->disableCompanyGateways(); + + CompanyGateway::where('gateway_key', '1bd651fb213ca0c9d66ae3c336dc77e8')->restore(); + + $this->browse(function (Browser $browser) { + $browser + ->visit(new Login()) + ->auth(); + }); + } +} From 73581740dffe9914d84e667e13cffe05b18fca00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 22:39:17 +0200 Subject: [PATCH 12/13] Tests: Successful payment --- .../Gateways/Mollie/BankTransferTest.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php b/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php index c37395f5771e..4af336472ecf 100644 --- a/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php +++ b/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php @@ -37,4 +37,20 @@ class BankTransferTest extends DuskTestCase ->auth(); }); } + + public function testSuccessfulPayment(): void + { + $this->browse(function (Browser $browser) { + $browser + ->visitRoute('client.invoices.index') + ->click('@pay-now') + ->press('Pay Now') + ->clickLink('Bank Transfer') + ->waitForText('Test profile') + ->radio('final_state', 'paid') + ->press('Continue') + ->waitForText('Details of the payment') + ->assertSee('Completed'); + }); + } } From 8b569f3f5a56891a9fac5681a38c27a9816cbb3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Beganovi=C4=87?= Date: Fri, 24 Sep 2021 22:40:39 +0200 Subject: [PATCH 13/13] Tests: Pending payment --- .../Gateways/Mollie/BankTransferTest.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php b/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php index 4af336472ecf..8feb940e928f 100644 --- a/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php +++ b/tests/Browser/ClientPortal/Gateways/Mollie/BankTransferTest.php @@ -53,4 +53,20 @@ class BankTransferTest extends DuskTestCase ->assertSee('Completed'); }); } + + public function testPendingPayment(): void + { + $this->browse(function (Browser $browser) { + $browser + ->visitRoute('client.invoices.index') + ->click('@pay-now') + ->press('Pay Now') + ->clickLink('Bank Transfer') + ->waitForText('Test profile') + ->radio('final_state', 'open') + ->press('Continue') + ->waitForText('Details of the payment') + ->assertSee('Pending'); + }); + } }