diff --git a/assets/javascripts/front/checkout/model/payment/card.js b/assets/javascripts/front/checkout/model/payment/card.js index 61e6b6f7..fe97b312 100644 --- a/assets/javascripts/front/checkout/model/payment/card.js +++ b/assets/javascripts/front/checkout/model/payment/card.js @@ -293,9 +293,10 @@ let pagarmeCard = { if (total) { total = pagarmeCard.formatValue(total); } - const cardForm = elem.closest("fieldset"); - const select = cardForm.find(this.installmentsTarget); - const info = cardForm.find(this.installmentsInfoTarget); + const cardForm = elem.closest("form"); + const cardFieldset = elem.closest("fieldset"); + const select = cardFieldset.find(this.installmentsTarget); + const info = cardFieldset.find(this.installmentsInfoTarget); if (!total) { total = cartTotal; } @@ -320,17 +321,17 @@ let pagarmeCard = { } }); ajax.done(function (response) { - pagarmeCard._done(select, info, storageName, JSON.parse(response)); + pagarmeCard._done(select, info, storageName, cardForm, JSON.parse(response)); }); ajax.fail(function () { - pagarmeCard._fail(); + pagarmeCard._fail(cardForm); }); - pagarmeCard.showLoader(); + pagarmeCard.showLoader(cardForm); } return true; }, - _done: function (select, info, storageName, response) { + _done: function (select, info, storageName, event, response) { if (info.length) { info.addClass('pagarme-hidden'); if(response.installmentsConfig > 1) { @@ -339,17 +340,37 @@ let pagarmeCard = { } select.html(response.optionsHtml); sessionStorage.setItem(storageName, response); - this.removeLoader(); + this.removeLoader(event); }, - _fail: function () { - this.removeLoader(); + _fail: function (event) { + this.removeLoader(event); }, - removeLoader: function () { + removeLoader: function (event) { + const formattedEvent = this.formatEventToJQuery(event); + + if (typeof formattedEvent.unblock === 'function') { + formattedEvent.unblock(); + return; + } + if (typeof jQuery.unblockUI === 'function') { jQuery.unblockUI(); } }, - showLoader: function () { + showLoader: function (event) { + const formattedEvent = this.formatEventToJQuery(event); + + if (typeof formattedEvent.block === 'function') { + formattedEvent.block({ + message: null, + overlayCSS: { + background: '#fff', + opacity: 0.6 + } + }); + return; + } + if (typeof jQuery.blockUI === 'function') { jQuery.blockUI({ message: null, @@ -382,11 +403,11 @@ let pagarmeCard = { try { for (let i = 1; !pagarmeCard.isTokenized() && i <= this.limitTokenize; i++) { if (i === this.limit) { - this.removeLoader(); + this.removeLoader(event); throw new Error("Tokenize timeout"); } if (wc_pagarme_checkout.errorTokenize === true) { - this.removeLoader(); + this.removeLoader(event); return; } await pagarmeCard.wait(); diff --git a/assets/javascripts/front/checkout/model/payment/card/tds.js b/assets/javascripts/front/checkout/model/payment/card/tds.js index d57803c7..b83f41c8 100644 --- a/assets/javascripts/front/checkout/model/payment/card/tds.js +++ b/assets/javascripts/front/checkout/model/payment/card/tds.js @@ -216,7 +216,7 @@ const pagarmeTds = { }, callbackTds: (data) => { - pagarmeCard.removeLoader(); + pagarmeCard.removeLoader(pagarmeTds.checkoutEvent); if (data?.error !== undefined) { pagarmeTds.addErrors(data); return; @@ -289,7 +289,7 @@ const pagarmeTds = { start: (event) => { const canTdsRun = pagarmeTds.canTdsRun(); if (canTdsRun) { - pagarmeCard.showLoader(); + pagarmeCard.showLoader(event); pagarmeTds.checkoutEvent = event; pagarmeTds.addTdsAttributeData(); const token = pagarmeTds.getToken(); diff --git a/languages/woo-pagarme-payments-pt_BR.mo b/languages/woo-pagarme-payments-pt_BR.mo index 4e4b498b..5b9a5678 100644 Binary files a/languages/woo-pagarme-payments-pt_BR.mo and b/languages/woo-pagarme-payments-pt_BR.mo differ diff --git a/languages/woo-pagarme-payments-pt_BR.po b/languages/woo-pagarme-payments-pt_BR.po index 2b86b3cc..4a6b90b0 100644 --- a/languages/woo-pagarme-payments-pt_BR.po +++ b/languages/woo-pagarme-payments-pt_BR.po @@ -5,7 +5,7 @@ msgstr "" "Project-Id-Version: WooCommerce Pagar.me Payments 1.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/woo-pagarme-payments\n" "POT-Creation-Date: 2018-06-22 13:58-0300\n" -"PO-Revision-Date: 2024-05-13 09:25-0300\n" +"PO-Revision-Date: 2024-06-06 16:01-0300\n" "Last-Translator: Pagar.me\n" "Language-Team: \n" "Language: pt_BR\n" @@ -1445,3 +1445,6 @@ msgstr "O campo Nome impresso no cartão é obrigatório." msgid "The field exp_month must be between 1 and 12." msgstr "O mês de expiração do cartão deve estar entre 01 e 12." + +msgid "Pagar.me: Payment failed." +msgstr "Pagar.me: Pagamento falhou." diff --git a/src/Block/Checkout/Gateway.php b/src/Block/Checkout/Gateway.php index d540350f..f7aebb96 100644 --- a/src/Block/Checkout/Gateway.php +++ b/src/Block/Checkout/Gateway.php @@ -173,7 +173,14 @@ public function formatElement(string $content, array $element) */ public function getCartTotals() { - return WC()->cart->total; + global $wp; + + if (!isset($wp->query_vars['order-pay'])) { + return WC()->cart->total; + } + $orderId = $wp->query_vars['order-pay']; + $order = wc_get_order($orderId); + return $order->get_total(); } /** diff --git a/src/Controller/Gateways/AbstractGateway.php b/src/Controller/Gateways/AbstractGateway.php index 439e59c3..fddcc2a4 100644 --- a/src/Controller/Gateways/AbstractGateway.php +++ b/src/Controller/Gateways/AbstractGateway.php @@ -119,7 +119,7 @@ public function __construct( $this->has_fields = false; $this->init_form_fields(); $this->init_settings(); - $this->enabled = $this->get_option('enabled', 'no'); + $this->enabled = $this->isEnabled(); $this->title = $this->getTitle(); $this->has_fields = true; if (is_admin()) { @@ -480,4 +480,22 @@ protected function addValidationError($errorMessage) WC_Admin_Settings::add_error($errorMessage); throw new InvalidOptionException(InvalidOptionException::CODE, $errorMessage); } + + protected function isEnabled() + { + global $wp; + $enabled = $this->get_option('enabled', 'no'); + + if (!isset($wp->query_vars['order-pay'])) { + return $enabled; + } + + $orderId = $wp->query_vars['order-pay']; + $order = wc_get_order($orderId); + if (empty($order->get_customer_id())) { + $enabled = 'no'; + } + + return $enabled; + } } diff --git a/src/Helper/Utils.php b/src/Helper/Utils.php index 463e4078..a01687cb 100644 --- a/src/Helper/Utils.php +++ b/src/Helper/Utils.php @@ -131,12 +131,12 @@ public static function is_request_ajax() } /** - * Verify if request is from checkout blocks + * Verify if request is from checkout * * @since 1.0 * @return boolean */ - public static function isReactCheckoutRequest() + public static function isCheckoutRequest() { return strpos(strtolower(self::server('REQUEST_URI')), 'checkout') !== false; } @@ -417,7 +417,7 @@ public static function get_phone_country_code($country) public static function build_customer_address_from_order(Order $order) { - + return array( 'street' => substr($order->getWcOrder()->get_billing_address_1(), 0, 64), 'number' => substr($order->get_meta('billing_number'), 0, 15), diff --git a/src/Model/Checkout.php b/src/Model/Checkout.php index 1bab4151..0b0b718d 100644 --- a/src/Model/Checkout.php +++ b/src/Model/Checkout.php @@ -109,7 +109,7 @@ public function getConfig() public function process(WC_Order $wc_order = null, string $type = CheckoutTypes::TRANSPARENT_VALUE) { if ( - (!Utils::is_request_ajax() && !Utils::isReactCheckoutRequest()) + (!Utils::is_request_ajax() && !Utils::isCheckoutRequest()) || Utils::server('REQUEST_METHOD') !== 'POST' ) { exit(0); diff --git a/src/Model/Order.php b/src/Model/Order.php index 9eb4cda3..eb1f44e3 100644 --- a/src/Model/Order.php +++ b/src/Model/Order.php @@ -118,6 +118,22 @@ public function payment_canceled() $this->log($statusArray); } + public function paymentFailed() + { + $current_status = $this->wc_order->get_status(); + + if ($current_status !== 'failed') { + $this->wc_order->update_status('failed', __('Pagar.me: Payment failed.', 'woo-pagarme-payments')); + } + + $statusArray = [ + 'previous_status' => $current_status, + 'new_status' => $this->wc_order->get_status() + ]; + + $this->log($statusArray); + } + public function update_by_pagarme_status($pagarme_status) { switch ($pagarme_status) { @@ -129,6 +145,8 @@ public function update_by_pagarme_status($pagarme_status) $this->payment_paid(); break; case 'failed': + $this->paymentFailed(); + break; case 'canceled': $this->payment_canceled(); break; diff --git a/src/Model/Payment/CreditCard.php b/src/Model/Payment/CreditCard.php index b8acd187..79ca9437 100644 --- a/src/Model/Payment/CreditCard.php +++ b/src/Model/Payment/CreditCard.php @@ -62,6 +62,7 @@ class CreditCard extends Card implements PaymentInterface */ public function getConfigDataProvider() { + global $wp; $jsConfigProvider = parent::getConfigDataProvider(); $brands = new Brands; foreach ($brands->getBrands() as $class) { @@ -71,6 +72,7 @@ public function getConfigDataProvider() } $jsConfigProvider['tdsEnabled'] = Subscription::hasSubscriptionProductInCart() || Subscription::isChangePaymentSubscription() + || isset($wp->query_vars['order-pay']) ? false : $this->getConfig()->isTdsEnabled(); if ($jsConfigProvider['tdsEnabled']) { diff --git a/src/Model/Subscription.php b/src/Model/Subscription.php index 8eaacdca..9752af71 100644 --- a/src/Model/Subscription.php +++ b/src/Model/Subscription.php @@ -407,7 +407,7 @@ public static function hasSubscriptionFreeTrial() if (!self::hasSubscriptionPlugin()) { return false; } - return \WC_Subscriptions_Cart::all_cart_items_have_free_trial(); + return self::hasSubscriptionProductInCart() && \WC_Subscriptions_Cart::all_cart_items_have_free_trial(); } /** diff --git a/templates/checkout/default.php b/templates/checkout/default.php index b70eb7b1..0153a573 100644 --- a/templates/checkout/default.php +++ b/templates/checkout/default.php @@ -26,5 +26,5 @@ createBlock($this->getPaymentClass(), 'pagarme.checkout.payment', ['payment_instance' => $this->getPaymentInstance()])->toHtml() ?> diff --git a/tests/Block/Checkout/GatewayTest.php b/tests/Block/Checkout/GatewayTest.php new file mode 100644 index 00000000..8259af90 --- /dev/null +++ b/tests/Block/Checkout/GatewayTest.php @@ -0,0 +1,87 @@ + $configMock, + 'gateway' => $gatewayModelMock, + ]; + + global $wp; + $wp->query_vars = [ + 'order-pay' => 1 + ]; + + $orderMock = Mockery::mock(WC_Order::class); + $orderMock->shouldReceive('get_total') + ->andReturn(10); + + Brain\Monkey\Functions\stubs([ + 'wc_get_order' => $orderMock + ]); + + $gatewayBlock = new Gateway($jsonMock, $data); + $this->assertEquals(10, $gatewayBlock->getCartTotals()); + } + + public function testCartTotalsWithOrderPayShouldReturnOrderTotal() + { + $jsonMock = Mockery::mock(Json::class); + + $configMock = Mockery::mock(Config::class); + $gatewayModelMock = Mockery::mock(GatewayModel::class); + $data = [ + 'config' => $configMock, + 'gateway' => $gatewayModelMock, + ]; + + global $wp; + $wp->query_vars = []; + + $wcCheckoutMock = Mockery::mock(WC_Cart::class); + $wcCheckoutMock->total = 20; + $woocommerce = new stdClass(); + $woocommerce->cart = $wcCheckoutMock; + Brain\Monkey\Functions\stubs([ + 'WC' => $woocommerce, + ]); + + $gatewayBlock = new Gateway($jsonMock, $data); + $this->assertEquals(20, $gatewayBlock->getCartTotals()); + } +} diff --git a/tests/Model/CheckoutTest.php b/tests/Model/CheckoutTest.php index bdcb7b54..334b5a1c 100644 --- a/tests/Model/CheckoutTest.php +++ b/tests/Model/CheckoutTest.php @@ -18,7 +18,7 @@ use Pagarme\Core\Kernel\Aggregates\Order; use Pagarme\Core\Kernel\ValueObjects\Id\OrderId; use Pagarme\Core\Kernel\ValueObjects\OrderStatus; -use WC_Checkout; +use WC_Cart; /** * @runTestsInSeparateProcesses @@ -124,7 +124,7 @@ public function testProcessWithTdsAuthenticatedCreditCardPaymentMethodShouldSetA ->andReturn($wcOrderMock); $orderModelMock->shouldReceive('update_meta') ->andReturn([]); - $wcCheckoutMock = Mockery::mock(WC_Checkout::class); + $wcCheckoutMock = Mockery::mock(WC_Cart::class); $wcCheckoutMock->shouldReceive('empty_cart') ->andReturnSelf(); $woocommerce = new stdClass(); diff --git a/tests/Model/Payment/CreditCardTest.php b/tests/Model/Payment/CreditCardTest.php new file mode 100644 index 00000000..53450edc --- /dev/null +++ b/tests/Model/Payment/CreditCardTest.php @@ -0,0 +1,58 @@ +query_vars = [ + 'order-pay' => 1 + ]; + + $result = $creditCardModel->getConfigDataProvider(); + + $this->assertFalse($result['tdsEnabled']); + } + + public function testGetConfigDataProviderWithoutOrderPayShouldNotDisableJavascriptTdsEnabledConfig() + { + $creditCardModel = new CreditCard(); + + $configMock = Mockery::mock('overload:Woocommerce\Pagarme\Model\Config'); + $configMock->shouldReceive('isTdsEnabled') + ->andReturnTrue(); + $configMock->shouldReceive('getTdsMinAmount') + ->andReturn(10); + + $result = $creditCardModel->getConfigDataProvider(); + + $this->assertTrue($result['tdsEnabled']); + } +} \ No newline at end of file diff --git a/vendor/pagarme/ecommerce-module-core/src/Kernel/Aggregates/Order.php b/vendor/pagarme/ecommerce-module-core/src/Kernel/Aggregates/Order.php index cce93df5..17bfa273 100644 --- a/vendor/pagarme/ecommerce-module-core/src/Kernel/Aggregates/Order.php +++ b/vendor/pagarme/ecommerce-module-core/src/Kernel/Aggregates/Order.php @@ -152,12 +152,18 @@ public function applyOrderStatusFromCharges() } if ( - in_array(ChargeStatus::failed()->getStatus(), $listChargeStatus) && in_array(ChargeStatus::canceled()->getStatus(), $listChargeStatus) ) { $this->setStatus(OrderStatus::canceled()); } + if ( + in_array(ChargeStatus::failed()->getStatus(), $listChargeStatus) + ) + { + $this->setStatus(OrderStatus::failed()); + } + if ( $chargesStatusEquals && !$this->getCharges()[0]->getStatus()->equals(ChargeStatus::underpaid()) diff --git a/vendor/pagarme/ecommerce-module-core/src/Payment/Services/ResponseHandlers/OrderHandler.php b/vendor/pagarme/ecommerce-module-core/src/Payment/Services/ResponseHandlers/OrderHandler.php index ad02d838..858f786e 100644 --- a/vendor/pagarme/ecommerce-module-core/src/Payment/Services/ResponseHandlers/OrderHandler.php +++ b/vendor/pagarme/ecommerce-module-core/src/Payment/Services/ResponseHandlers/OrderHandler.php @@ -267,7 +267,7 @@ private function handleOrderStatusFailed(Order $order) $historyComment ); - $order->setStatus(OrderStatus::canceled()); + $order->setStatus(OrderStatus::failed()); $order->getPlatformOrder()->setState(OrderState::canceled()); $order->getPlatformOrder()->save(); @@ -291,7 +291,7 @@ private function handleOrderStatusFailed(Order $order) $sender = $platformOrder->sendEmail($messageComplementEmail); $order->getPlatformOrder()->addHistoryComment( - $i18n->getDashboard('Order canceled.'), + $i18n->getDashboard('Order payment failed.'), $sender );