From d55f281636a4d74df843734f6d0f71ec9b4e644b Mon Sep 17 00:00:00 2001 From: RafaMelazzo Date: Mon, 22 Jan 2024 18:49:01 -0300 Subject: [PATCH 1/4] feat: allow installments for subscription --- .../front/checkout/model/payment/card.js | 21 +++-- assets/stylesheets/front/style.css | 17 +++- languages/woo-pagarme-payments-pt_BR.mo | Bin 32451 -> 33115 bytes languages/woo-pagarme-payments-pt_BR.po | 17 +++- src/Block/Checkout/Form/Installments.php | 82 ++++++++++++++++-- src/Block/Checkout/Gateway.php | 3 + src/Controller/Checkout.php | 22 ++++- src/Controller/Gateways/CreditCard.php | 23 +++++ src/Model/CardInstallments.php | 18 ++-- src/Model/Subscription.php | 39 ++++++++- .../checkout/form/card/installments.phtml | 6 ++ 11 files changed, 218 insertions(+), 30 deletions(-) diff --git a/assets/javascripts/front/checkout/model/payment/card.js b/assets/javascripts/front/checkout/model/payment/card.js index 6c59d9e5..e8532bd0 100644 --- a/assets/javascripts/front/checkout/model/payment/card.js +++ b/assets/javascripts/front/checkout/model/payment/card.js @@ -1,5 +1,5 @@ /* globals wc_pagarme_checkout */ - +/*jshint esversion: 8 */ let pagarmeCard = { limitTokenize: 10, tokenExpirationAttribute: 'data-pagarmecheckout-expiration', @@ -7,6 +7,7 @@ let pagarmeCard = { brandTarget: 'input[data-pagarmecheckout-element="brand-input"]', valueTarget: 'input[data-pagarmecheckout-element="order-value"]', installmentsTarget: '[data-pagarme-component="installments"]', + installmentsInfoTarget: '[data-pagarme-component="installments-info"]', mundiCdn: 'https://cdn.mundipagg.com/assets/images/logos/brands/png/', tokenElement: '[data-pagarmecheckout-element="token"]', fieldsetCardElements: 'fieldset[data-pagarmecheckout="card"]', @@ -262,12 +263,16 @@ let pagarmeCard = { } let cardForm = elem.closest("fieldset"); let select = cardForm.find(this.installmentsTarget); - if (!total) + let info = cardForm.find(this.installmentsInfoTarget); + if (!total) { total = cartTotal; + } if ((!total) || (select.data("type") === 2 && !brand) || - (select.data("type") === 1 && elem.data('element') !== "order-value")) + (select.data("type") === 1 && elem.data('element') !== "order-value") + ) { return false; + } let storageName = btoa(brand + total); sessionStorage.removeItem(storageName); let storage = sessionStorage.getItem(storageName); @@ -283,7 +288,7 @@ let pagarmeCard = { } }); ajax.done(function (response) { - pagarmeCard._done(select, storageName, cardForm, response); + pagarmeCard._done(select, info, storageName, cardForm, JSON.parse(response)); }); ajax.fail(function () { pagarmeCard._fail(cardForm); @@ -293,8 +298,12 @@ let pagarmeCard = { return true; }, - _done: function (select, storageName, event, response) { - select.html(response); + _done: function (select, info, storageName, event, response) { + info.addClass('pagarme-hidden'); + if(response.installmentsConfig > 1) { + info.removeClass('pagarme-hidden'); + } + select.html(response.optionsHtml); sessionStorage.setItem(storageName, response); this.removeLoader(event); }, diff --git a/assets/stylesheets/front/style.css b/assets/stylesheets/front/style.css index 84525fd0..39bf8db2 100644 --- a/assets/stylesheets/front/style.css +++ b/assets/stylesheets/front/style.css @@ -1,3 +1,7 @@ +.pagarme-hidden { + display: none!important; +} + #wcmp-checkout-errors { display: none; } @@ -67,6 +71,13 @@ pointer-events: none; } +#payment .payment_methods li[class*="pagarme"] .payment_box .pagarme-installments-info { + display: block; + margin: 0 .75em .25em; + font-size: .9em; + font-style: italic; +} + .woocommerce-order .woocommerce-message .pagarme-response p:last-child { margin-bottom: 0; } @@ -132,7 +143,7 @@ /* sm */ /* @media (min-width: 576px) { - + } */ /* md */ @@ -151,10 +162,10 @@ /* xl */ /* @media (min-width: 1200px) { - + } */ /* xxl */ /* @media (min-width: 1400px) { - + } */ diff --git a/languages/woo-pagarme-payments-pt_BR.mo b/languages/woo-pagarme-payments-pt_BR.mo index 4fba39252abeea77ffa402bd3730988527028dc6..bc6222dc60c7d68a7e0b0d8b4036e571e89eefdf 100644 GIT binary patch delta 7661 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 delta 7144 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 OdiaS8UIjby*Z&VK{wJjX diff --git a/languages/woo-pagarme-payments-pt_BR.po b/languages/woo-pagarme-payments-pt_BR.po index 263c5d9d..ba34a62d 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-01-17 10:24-0300\n" +"PO-Revision-Date: 2024-01-19 11:54-0300\n" "Last-Translator: Pagar.me\n" "Language-Team: \n" "Language: pt_BR\n" @@ -1287,3 +1287,18 @@ msgstr "Habilita boleto para assinatura" msgid "Activates billet payment method for subscriptions." msgstr "Ativa o método de pagamento de boleto para assinaturas." + +msgid "Allow installments for subscription" +msgstr "Permitir parcelamento para assinatura" + +msgid "Enable installments for subscription" +msgstr "Habilita parcelamento para assinatura" + +msgid "Activates credit card installments for subscriptions." +msgstr "Ativa parcelamento de cartão de crédito para assinaturas." + +msgid "Works only for monthly and yearly subscriptions." +msgstr "Funciona apenas para assinaturas mensais e anuais." + +msgid "Your cart has one or more daily or weekly subscription products, which do not allow installments." +msgstr "Seu carrinho possui um ou mais produtos de assinatura diário ou semanal, que não permitem parcelamentos." diff --git a/src/Block/Checkout/Form/Installments.php b/src/Block/Checkout/Form/Installments.php index f19390e3..0e96cd85 100644 --- a/src/Block/Checkout/Form/Installments.php +++ b/src/Block/Checkout/Form/Installments.php @@ -14,11 +14,10 @@ use Woocommerce\Pagarme\Block\Checkout\Gateway; use Woocommerce\Pagarme\Helper\Utils; use Woocommerce\Pagarme\Model\CardInstallments; +use Woocommerce\Pagarme\Model\Subscription; use Woocommerce\Pagarme\View\Checkouts; -global $woocommerce; - -defined( 'ABSPATH' ) || exit; +defined('ABSPATH') || exit; /** * Class Installments @@ -34,6 +33,19 @@ class Installments extends Gateway /** @var int */ protected $sequence = 1; + /** @var int */ + protected $cardInstallments; + + /** @var Subscription */ + protected $subscription; + + public function __construct() + { + parent::__construct(); + $this->cardInstallments = new CardInstallments(); + $this->subscription = new Subscription(); + } + /** * @param int $sequence * @return $this @@ -89,8 +101,7 @@ public function getInstallmentsComponent() public function render_installments($total) { - $cardInstallments = new CardInstallments(); - return $cardInstallments->getInstallmentsByType($total); + return $this->cardInstallments->getInstallmentsByType($total); } /** @@ -100,4 +111,65 @@ public function render() { return $this->render_installments($this->getCartTotals()); } + + /** + * @return bool + */ + public function hasSubscriptionProductInCart() + { + return Subscription::hasSubscriptionProductInCart(); + } + + /** + * @return bool + */ + public function subscriptionAllowInstallments() { + return $this->subscription->allowInstallments(); + } + + /** + * @return bool + */ + public function hasOneInstallmentPeriodInCart() + { + return $this->subscription->hasOneInstallmentPeriodInCart(); + } + + /** + * @return bool + */ + public function isCcInstallmentTypeByFlag() { + $type = intval($this->cardInstallments->config->getCcInstallmentType()) ?? 1; + return $type === CardInstallments::INSTALLMENTS_BY_FLAG; + } + + /** + * @return int + */ + public function getConfiguredMaxCcInstallments(): int { + if ($this->isCcInstallmentTypeByFlag()) { + $flag = Utils::get('flag', false, 'esc_html'); + $configByFlags = $this->cardInstallments->config->getCcInstallmentsByFlag(); + return intval($configByFlags['max_installment'][$flag]); + } + return intval($this->cardInstallments->config->getCcInstallmentsMaximum()); + } + + /** + * @return bool + */ + public function showOneInstallmentInfo() + { + if (!$this->hasSubscriptionProductInCart()) { + return false; + } + if ( + $this->subscriptionAllowInstallments() + && $this->hasOneInstallmentPeriodInCart() + && ($this->getConfiguredMaxCcInstallments() > 1 || $this->isCcInstallmentTypeByFlag()) + ) { + return true; + } + return false; + } } diff --git a/src/Block/Checkout/Gateway.php b/src/Block/Checkout/Gateway.php index 97185951..005fac2b 100644 --- a/src/Block/Checkout/Gateway.php +++ b/src/Block/Checkout/Gateway.php @@ -88,6 +88,9 @@ public function getConfigDataProvider() */ public function getElementId(string $id) { + if (!$this->getPaymentInstance()){ + return; + } return WCMP_PREFIX . '[' . $this->getPaymentInstance()->getMethodCode() . ']' . $id; } diff --git a/src/Controller/Checkout.php b/src/Controller/Checkout.php index 637d8a2e..47b7ebb6 100644 --- a/src/Controller/Checkout.php +++ b/src/Controller/Checkout.php @@ -8,6 +8,7 @@ use Pagarme\Core\Payment\Repositories\CustomerRepository; use Pagarme\Core\Payment\Repositories\SavedCardRepository; +use Woocommerce\Pagarme\Block\Checkout\Form\Installments; use Woocommerce\Pagarme\Controller\Gateways\AbstractGateway; use Woocommerce\Pagarme\Model\CardInstallments; use Woocommerce\Pagarme\Model\Config; @@ -27,13 +28,17 @@ class Checkout /** @var CardInstallments */ protected $cardInstallments; + /** @var Installments */ + protected $installments; + /** * @var Orders */ protected $ordersController; public function __construct( - CardInstallments $cardInstallments = null + CardInstallments $cardInstallments = null, + Installments $installments = null ) { $this->ordersController = new Orders(); add_action('woocommerce_api_' . Model\Checkout::API_REQUEST, array($this, 'process_checkout_transparent')); @@ -51,7 +56,11 @@ public function __construct( ]; $this->cardInstallments = $cardInstallments; if (!$this->cardInstallments) { - $this->cardInstallments = new CardInstallments; + $this->cardInstallments = new CardInstallments(); + } + $this->installments = $installments; + if (!$this->installments) { + $this->installments = new Installments(); } } @@ -109,13 +118,18 @@ public function build_installments() exit(0); } - $html = $this->cardInstallments->renderOptions( + $installmentsConfig = $this->installments->getConfiguredMaxCcInstallments(); + + $optionsHtml = $this->cardInstallments->renderOptions( $this->cardInstallments->getInstallmentsByType( Utils::get('total', false), Utils::get('flag', false, 'esc_html') )); - echo wp_kses_no_null($html); + echo json_encode([ + 'installmentsConfig' => $installmentsConfig, + 'optionsHtml' => wp_kses_no_null($optionsHtml) + ]); exit(); } diff --git a/src/Controller/Gateways/CreditCard.php b/src/Controller/Gateways/CreditCard.php index 176452eb..648eb5b2 100644 --- a/src/Controller/Gateways/CreditCard.php +++ b/src/Controller/Gateways/CreditCard.php @@ -72,6 +72,7 @@ public function append_form_fields() 'cc_installments_by_flag' => $this->field_cc_installment_fields('flags'), 'cc_allow_save' => $this->field_cc_allow_save(), 'cc_allowed_in_subscription' => $this->field_cc_allowed_for_subscription(), + 'cc_subscription_installments' => $this->field_cc_subscription_installments(), ]; } @@ -187,6 +188,28 @@ private function field_cc_allowed_for_subscription() ]; } + /** + * @return array + */ + private function field_cc_subscription_installments() + { + if (!Subscription::hasSubscriptionPlugin()){ + return []; + } + return [ + 'title' => __('Allow installments for subscription', 'woo-pagarme-payments'), + 'type' => 'select', + 'options' => $this->yesnoOptions->toLabelsArray(true), + 'label' => __('Enable installments for subscription', 'woo-pagarme-payments'), + 'default' => $this->config->getData('cc_subscription_installments') ?? strtolower(Yesno::NO), + 'desc_tip' => __('Activates credit card installments for subscriptions.', 'woo-pagarme-payments'), + 'description' => __('Works only for monthly and yearly subscriptions.', 'woo-pagarme-payments'), + 'custom_attributes' => array( + 'data-field' => 'cc-subscription-installments', + ), + ]; + } + /** * @return array */ diff --git a/src/Model/CardInstallments.php b/src/Model/CardInstallments.php index df7d1e2b..e7b0da83 100644 --- a/src/Model/CardInstallments.php +++ b/src/Model/CardInstallments.php @@ -11,7 +11,6 @@ namespace Woocommerce\Pagarme\Model; -use Woocommerce\Pagarme\Model\Subscription; use Woocommerce\Pagarme\Core; use Woocommerce\Pagarme\Helper\Utils; @@ -27,8 +26,10 @@ */ class CardInstallments { - /** @var */ - private $config; + /** @var Config */ + public $config; + + private $subscription; const INSTALLMENTS_FOR_ALL_FLAGS = 1; const INSTALLMENTS_BY_FLAG = 2; @@ -43,6 +44,7 @@ public function __construct( $config = new Config(); } $this->config = $config; + $this->subscription = new Subscription(); } /** @@ -148,7 +150,7 @@ public function renderOptions(array $options) /** * @param array $params - * @return string + * @return array */ private function calcInstallments1(array $params) { @@ -158,7 +160,7 @@ private function calcInstallments1(array $params) /** * @param array $params - * @return string + * @return array */ private function calcInstallments2(array $params) { @@ -183,9 +185,11 @@ private function calcInstallments2(array $params) * @param string|bool $flag * @return int */ - private function getMaxCcInstallments($type, $flag) + public function getMaxCcInstallments($type, $flag) { - if (Subscription::hasSubscriptionProductInCart()) { + if ( + (Subscription::hasSubscriptionProductInCart() && !$this->subscription->allowInstallments()) + || $this->subscription->hasOneInstallmentPeriodInCart()) { return 1; } if ($type === self::INSTALLMENTS_BY_FLAG) { diff --git a/src/Model/Subscription.php b/src/Model/Subscription.php index ba87d60e..6574f90c 100644 --- a/src/Model/Subscription.php +++ b/src/Model/Subscription.php @@ -18,6 +18,7 @@ use Pagarme\Core\Payment\Repositories\CustomerRepository; use Pagarme\Core\Payment\Repositories\SavedCardRepository; use WC_Order; +use WC_Subscriptions_Product; use Woocommerce\Pagarme\Controller\Orders; use Woocommerce\Pagarme\Service\LogService; use Woocommerce\Pagarme\Service\CardService; @@ -29,15 +30,15 @@ class Subscription /** @var Config */ private $config; - /** @var string */ - const API_REQUEST = 'e3hpgavff3cw'; - /** @var Orders */ private $orders; /** @var AbstractGateway */ private $payment; + /** @var array */ + const ONE_INSTALLMENT_PERIODS = ['day', 'week']; + public function __construct( AbstractGateway $payment = null ) @@ -54,7 +55,7 @@ public function __construct( private function addSupportToSubscription(): void { - if (!$this->payment->hasSubscriptionSupport() || !$this->hasSubscriptionPlugin()) { + if (!$this->payment || !$this->payment->hasSubscriptionSupport() || !$this->hasSubscriptionPlugin()) { return; } @@ -93,6 +94,9 @@ private function addSupportToSubscription(): void private function setPaymentEnabled() { + if (!$this->payment) { + return; + } if (!$this->payment->isSubscriptionActive() && $this->hasSubscriptionProductInCart()) { $this->payment->enabled = "no"; } @@ -417,4 +421,31 @@ public static function canUpdatePaymentMethod($update, $new_payment_method, $sub } return $update; } + + /** + * @return boolean + */ + public function allowInstallments(): bool { + return wc_string_to_bool($this->config->getData('cc_subscription_installments')); + } + + /** + * @return boolean + */ + public function hasOneInstallmentPeriodInCart(): bool { + $cartProducts = WC()->cart->cart_contents; + $productsPeriods = []; + + foreach ($cartProducts as $product) { + $productsPeriods[] = WC_Subscriptions_Product::get_period($product['product_id']); + } + + $noInstallmentsPeriods = array_intersect(self::ONE_INSTALLMENT_PERIODS, $productsPeriods); + + if (!empty($noInstallmentsPeriods)) { + return true; + } + + return false; + } } diff --git a/templates/checkout/form/card/installments.phtml b/templates/checkout/form/card/installments.phtml index db30ef34..63878bf1 100644 --- a/templates/checkout/form/card/installments.phtml +++ b/templates/checkout/form/card/installments.phtml @@ -15,9 +15,15 @@ if (!function_exists('add_action')) { exit(0); } ?> + + +showOneInstallmentInfo()) : ?> + + + getInstallmentsComponent() ?> data-total="getCartTotals()); ?>" data-type="getInstallmentsType(); ?>" data-action="select2" data-required="true" data-element="installments" name="getElementId('installment') ?>"> - isInterestForAllFlags()) : ?> - render() as $options) : ?> - - - - - + From d2fc89e15ebb0f118a485ae69d4f98310715673a Mon Sep 17 00:00:00 2001 From: RafaMelazzo Date: Tue, 23 Jan 2024 15:54:59 -0300 Subject: [PATCH 3/4] removing unnecessary functions --- src/Block/Checkout/Form/Installments.php | 29 +++--------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/src/Block/Checkout/Form/Installments.php b/src/Block/Checkout/Form/Installments.php index 0e96cd85..3f3642bc 100644 --- a/src/Block/Checkout/Form/Installments.php +++ b/src/Block/Checkout/Form/Installments.php @@ -112,29 +112,6 @@ public function render() return $this->render_installments($this->getCartTotals()); } - /** - * @return bool - */ - public function hasSubscriptionProductInCart() - { - return Subscription::hasSubscriptionProductInCart(); - } - - /** - * @return bool - */ - public function subscriptionAllowInstallments() { - return $this->subscription->allowInstallments(); - } - - /** - * @return bool - */ - public function hasOneInstallmentPeriodInCart() - { - return $this->subscription->hasOneInstallmentPeriodInCart(); - } - /** * @return bool */ @@ -160,12 +137,12 @@ public function getConfiguredMaxCcInstallments(): int { */ public function showOneInstallmentInfo() { - if (!$this->hasSubscriptionProductInCart()) { + if (!Subscription::hasSubscriptionProductInCart()) { return false; } if ( - $this->subscriptionAllowInstallments() - && $this->hasOneInstallmentPeriodInCart() + $this->subscription->allowInstallments() + && $this->subscription->hasOneInstallmentPeriodInCart() && ($this->getConfiguredMaxCcInstallments() > 1 || $this->isCcInstallmentTypeByFlag()) ) { return true; From 31d13b39f0645fabc24e281a281b41f7c6b07204 Mon Sep 17 00:00:00 2001 From: RafaMelazzo Date: Tue, 23 Jan 2024 16:49:03 -0300 Subject: [PATCH 4/4] fix: when subscriptions not installed --- .../front/checkout/model/payment/card.js | 8 +++++--- src/Controller/Gateways/CreditCard.php | 17 ++++++++--------- src/Model/Subscription.php | 6 ++++-- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/assets/javascripts/front/checkout/model/payment/card.js b/assets/javascripts/front/checkout/model/payment/card.js index e0f7b3cd..3abe978e 100644 --- a/assets/javascripts/front/checkout/model/payment/card.js +++ b/assets/javascripts/front/checkout/model/payment/card.js @@ -299,9 +299,11 @@ let pagarmeCard = { }, _done: function (select, info, storageName, event, response) { - info.addClass('pagarme-hidden'); - if(response.installmentsConfig > 1) { - info.removeClass('pagarme-hidden'); + if (info.length) { + info.addClass('pagarme-hidden'); + if(response.installmentsConfig > 1) { + info.removeClass('pagarme-hidden'); + } } select.html(response.optionsHtml); sessionStorage.setItem(storageName, response); diff --git a/src/Controller/Gateways/CreditCard.php b/src/Controller/Gateways/CreditCard.php index 648eb5b2..7285f70f 100644 --- a/src/Controller/Gateways/CreditCard.php +++ b/src/Controller/Gateways/CreditCard.php @@ -59,7 +59,7 @@ public function isSubscriptionActive(): bool */ public function append_form_fields() { - return [ + $fields = [ 'cc_operation_type' => $this->field_cc_operation_type(), 'cc_soft_descriptor' => $this->field_cc_soft_descriptor(), 'cc_flags' => $this->field_cc_flags(), @@ -71,9 +71,14 @@ public function append_form_fields() 'cc_installments_without_interest' => $this->field_cc_installment_fields('without_interest'), 'cc_installments_by_flag' => $this->field_cc_installment_fields('flags'), 'cc_allow_save' => $this->field_cc_allow_save(), - 'cc_allowed_in_subscription' => $this->field_cc_allowed_for_subscription(), - 'cc_subscription_installments' => $this->field_cc_subscription_installments(), + + ]; + if (Subscription::hasSubscriptionPlugin()) { + $fields['cc_allowed_in_subscription'] = $this->field_cc_allowed_for_subscription(); + $fields['cc_subscription_installments'] = $this->field_cc_subscription_installments(); + } + return $fields; } /** @@ -171,9 +176,6 @@ public function field_cc_allow_save() */ private function field_cc_allowed_for_subscription() { - if (!Subscription::hasSubscriptionPlugin()){ - return []; - } return [ 'title' => __('Active for subscription', 'woo-pagarme-payments'), 'type' => 'select', @@ -193,9 +195,6 @@ private function field_cc_allowed_for_subscription() */ private function field_cc_subscription_installments() { - if (!Subscription::hasSubscriptionPlugin()){ - return []; - } return [ 'title' => __('Allow installments for subscription', 'woo-pagarme-payments'), 'type' => 'select', diff --git a/src/Model/Subscription.php b/src/Model/Subscription.php index 6574f90c..5aa5aa63 100644 --- a/src/Model/Subscription.php +++ b/src/Model/Subscription.php @@ -433,15 +433,17 @@ public function allowInstallments(): bool { * @return boolean */ public function hasOneInstallmentPeriodInCart(): bool { + if (!$this->hasSubscriptionPlugin()) { + return false; + } + $cartProducts = WC()->cart->cart_contents; $productsPeriods = []; - foreach ($cartProducts as $product) { $productsPeriods[] = WC_Subscriptions_Product::get_period($product['product_id']); } $noInstallmentsPeriods = array_intersect(self::ONE_INSTALLMENT_PERIODS, $productsPeriods); - if (!empty($noInstallmentsPeriods)) { return true; }