Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: manual order with credit card #439

Merged
merged 6 commits into from
Jun 6, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 35 additions & 14 deletions assets/javascripts/front/checkout/model/payment/card.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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) {
Expand All @@ -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,
Expand Down Expand Up @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions assets/javascripts/front/checkout/model/payment/card/tds.js
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ const pagarmeTds = {
},

callbackTds: (data) => {
pagarmeCard.removeLoader();
pagarmeCard.removeLoader(pagarmeTds.checkoutEvent);
if (data?.error !== undefined) {
pagarmeTds.addErrors(data);
return;
Expand Down Expand Up @@ -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();
Expand Down
Binary file modified languages/woo-pagarme-payments-pt_BR.mo
Binary file not shown.
7 changes: 5 additions & 2 deletions languages/woo-pagarme-payments-pt_BR.po
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ 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-07 10:10-0300\n"
"PO-Revision-Date: 2024-05-15 10:20-0300\n"
"Last-Translator: Pagar.me\n"
"Language-Team: \n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 3.4.2\n"
"X-Generator: Poedit 3.4.4\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c;_nc:1,2;_x:1,2c;_ex:1,2c;"
"_nx:4c,1,2;_nx_noop:4c,1,2\n"
Expand Down Expand Up @@ -1368,3 +1368,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."
9 changes: 8 additions & 1 deletion src/Block/Checkout/Gateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

/**
Expand Down
20 changes: 19 additions & 1 deletion src/Controller/Gateways/AbstractGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand Down Expand Up @@ -478,4 +478,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;
}
}
11 changes: 11 additions & 0 deletions src/Helper/Utils.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,17 @@ public static function is_request_ajax()
|| (0 === strpos(self::server('QUERY_STRING'), 'wc-ajax')));
}

/**
* Verify if request is from checkout
*
* @since 1.0
* @return boolean
*/
public static function isCheckoutRequest()
{
return strpos(strtolower(self::server('REQUEST_URI')), 'checkout') !== false;
}

/**
* Get value by array index
*
Expand Down
5 changes: 4 additions & 1 deletion src/Model/Checkout.php
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,10 @@ public function getConfig()
*/
public function process(WC_Order $wc_order = null, string $type = CheckoutTypes::TRANSPARENT_VALUE)
{
if (!Utils::is_request_ajax() || Utils::server('REQUEST_METHOD') !== 'POST') {
if (
(!Utils::is_request_ajax() && !Utils::isCheckoutRequest())
|| Utils::server('REQUEST_METHOD') !== 'POST'
) {
exit(0);
}
if (!$wc_order) {
Expand Down
18 changes: 18 additions & 0 deletions src/Model/Order.php
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/Model/Payment/CreditCard.php
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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']) {
Expand Down
2 changes: 1 addition & 1 deletion src/Model/Subscription.php
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

/**
Expand Down
2 changes: 1 addition & 1 deletion templates/checkout/default.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,5 @@
<?= $this->createBlock($this->getPaymentClass(), 'pagarme.checkout.payment', ['payment_instance' => $this->getPaymentInstance()])->toHtml() ?>
<script type="application/javascript">
var ajaxUrl = "<?= admin_url('admin-ajax.php'); ?>";
var cartTotal = <?= WC()->cart->total ?>;
var cartTotal = <?= $this->getCartTotals() ?>;
</script>
87 changes: 87 additions & 0 deletions tests/Block/Checkout/GatewayTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

namespace Woocommerce\Pagarme\Tests\Block\Checkout;

use Brain;
use Mockery;
use WC_Cart;
use stdClass;
use WC_Order;
use PHPUnit\Framework\TestCase;
use Woocommerce\Pagarme\Model\Config;
use Woocommerce\Pagarme\Block\Checkout\Gateway;
use Woocommerce\Pagarme\Model\Gateway as GatewayModel;
use Woocommerce\Pagarme\Model\Serialize\Serializer\Json;

class GatewayTest extends TestCase
{
public function setUp(): void
{
parent::setUp();

global $wp;
$wp = new stdClass;

Brain\Monkey\setUp();
}
public function tearDown(): void
{
parent::tearDown();

Mockery::close();
Brain\Monkey\tearDown();
}

public function testCartTotalsWithoutOrderPayShouldReturnCartTotal()
{
$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 = [
'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());
}
}
4 changes: 2 additions & 2 deletions tests/Model/CheckoutTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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();
Expand Down
Loading
Loading