diff --git a/includes/class-vindi-api.php b/includes/class-vindi-api.php index 8c0d278..38cd308 100755 --- a/includes/class-vindi-api.php +++ b/includes/class-vindi-api.php @@ -244,6 +244,20 @@ public function activate_subscription($subscription_id) return false; } + + /** + * @param int $subscription_id + * + * @return array|bool|mixed + */ + public function get_subscription($subscription_id) + { + if ($response = $this->request(sprintf('subscriptions/%s', $subscription_id),'GET')['subscription']) + return $response; + + return false; + } + /** * @param int $bill_id * @@ -264,19 +278,22 @@ public function delete_bill($bill_id) */ public function is_subscription_active($subscription_id) { - if (isset($this->recentRequest)) { - unset($this->recentRequest); + if (isset($this->recentRequest) + && $this->recentRequest['id'] == $subscription_id) { + if ($this->recentRequest['status'] != 'canceled') + return true; return false; } - $response = $this->request(sprintf('subscriptions/%s', $subscription_id),'GET')['subscription']; + $response = $this->get_subscription($subscription_id); - if (array_key_exists('status', $response)) { + if ($response && array_key_exists('status', $response)) { if ($response['status'] != 'canceled') { - $this->recentRequest = $subscription_id; + $this->recentRequest = $response; return true; } } + return false; } public function find_customer_by_code($code) diff --git a/includes/class-vindi-bank-slip-gateway.php b/includes/class-vindi-bank-slip-gateway.php index 3d0b784..b0db52a 100644 --- a/includes/class-vindi-bank-slip-gateway.php +++ b/includes/class-vindi-bank-slip-gateway.php @@ -58,7 +58,7 @@ public function payment_fields() $is_single_order = $this->is_single_order(); - if (!($is_trial = $this->container->get_is_active_sandbox())) + if ($is_trial = $this->container->get_is_active_sandbox()) $is_trial = $this->container->api->is_merchant_status_trial_or_sandbox(); $this->container->get_template('bankslip-checkout.html.php', compact('is_trial', 'is_single_order')); diff --git a/includes/class-vindi-creditcard-gateway.php b/includes/class-vindi-creditcard-gateway.php index d256424..063dc3e 100755 --- a/includes/class-vindi-creditcard-gateway.php +++ b/includes/class-vindi-creditcard-gateway.php @@ -175,7 +175,7 @@ public function payment_fields() for ($i = date('Y') ; $i <= date('Y') + 15 ; $i++) $years[] = $i; - if (!($is_trial = $this->container->get_is_active_sandbox())) + if ($is_trial = $this->container->get_is_active_sandbox()) $is_trial = $this->container->api->is_merchant_status_trial_or_sandbox(); $this->container->get_template('creditcard-checkout.html.php', compact( diff --git a/includes/class-vindi-wcs-disable-renewal.php b/includes/class-vindi-wcs-disable-renewal.php new file mode 100644 index 0000000..610baf0 --- /dev/null +++ b/includes/class-vindi-wcs-disable-renewal.php @@ -0,0 +1,37 @@ +get_meta('vindi_wc_subscription_id'))) { + //if it is we disable Woocommerce Subscriptions Renewal order and let Vindi handle it via webhooks + remove_action('woocommerce_scheduled_subscription_payment', + 'WC_Subscriptions_Manager::prepare_renewal', 1); + } + } +} diff --git a/includes/class-vindi-webhook-handler.php b/includes/class-vindi-webhook-handler.php index 71e10ff..dfba25c 100644 --- a/includes/class-vindi-webhook-handler.php +++ b/includes/class-vindi-webhook-handler.php @@ -111,10 +111,10 @@ private function subscription_renew($renew_infos) **/ private function bill_created($data) { - if(empty($data->bill->subscription)) { + if (empty($data->bill->subscription)) { return; } - + $renew_infos = [ 'wc_subscription_id' => $data->bill->subscription->code, 'vindi_subscription_id' => $data->bill->subscription->id, @@ -122,9 +122,9 @@ private function bill_created($data) 'bill_id' => $data->bill->id ]; - if(!$this->subscription_has_order_in_cycle($renew_infos['vindi_subscription_id'], $renew_infos['cycle'])) { + if (!$this->subscription_has_order_in_cycle($renew_infos['vindi_subscription_id'] + , $renew_infos['cycle'])) { $this->subscription_renew($renew_infos); - $this->update_next_payment($data); } } @@ -139,12 +139,13 @@ private function bill_paid($data) } else { $vindi_subscription_id = $data->bill->subscription->id; $cycle = $data->bill->period->cycle; - $order = $this->find_order_by_subscription_and_cycle($vindi_subscription_id, $cycle); } $new_status = $this->container->get_return_status(); - $order->update_status($new_status, __('O Pagamento foi realizado com sucesso pela Vindi.', 'woocommerce-vindi')); + $order->update_status($new_status, __('O Pagamento foi realizado com sucesso pela Vindi.', + 'woocommerce-vindi')); + $this->update_next_payment($data); } /** @@ -190,7 +191,8 @@ private function charge_rejected($data) if($order->get_status() == 'pending'){ $order->update_status('failed', 'Pagamento rejeitado!'); }else{ - throw new Exception('Erro ao trocar status da fatura para "failed" pois a fatura #' . $data->charge->bill->id . ' não está mais pendente!'); + throw new Exception('Erro ao trocar status da fatura para "failed" pois a fatura #' . + $data->charge->bill->id . ' não está mais pendente!'); } } @@ -201,7 +203,7 @@ private function charge_rejected($data) private function subscription_canceled($data) { $subscription = $this->find_subscription_by_id($data->subscription->code); - + if ($this->container->get_synchronism_status() && ($subscription->has_status('cancelled') || $subscription->has_status('pending-cancel') @@ -364,16 +366,27 @@ private function query_order_by_metas(array $metas) return new WP_Query($args); } - /** - * Update next payment schedule of subscription - * @param $next_payment string - * @param $subscription_id int wc subscription id - **/ - private function update_next_payment($data) - { - $subscription = $this->find_subscription_by_id($data->bill->subscription->code); - $next_payment = date('Y-m-d H:i:s', strtotime($data->bill->period->end_at . ' + 3 days')); + /** + * Update next payment schedule of subscription + * + * @param $data object + **/ + private function update_next_payment($data) { - $subscription->update_dates(array('next_payment' => $next_payment)); - } + // let's find the subscription in the API + // we need this step because the actual next billing date does not come from the /bill webhook + $vindi_subscription = $this->container->api->get_subscription($data->bill->subscription->id); + + if ($vindi_subscription && isset($vindi_subscription['next_billing_at'])) { + + // format next payment date + $next_payment = date('Y-m-d H:i:s', strtotime($vindi_subscription['next_billing_at'])); + + // find our wc_subscription + $subscription = $this->find_subscription_by_id($data->bill->subscription->code); + + // update the date to show the user when will be his next payment + $subscription->update_dates(array('next_payment' => $next_payment)); + } + } } diff --git a/vindi-woocommerce-subscriptions.php b/vindi-woocommerce-subscriptions.php index 93768e7..1dec410 100755 --- a/vindi-woocommerce-subscriptions.php +++ b/vindi-woocommerce-subscriptions.php @@ -88,6 +88,7 @@ public function __construct() 'class-vindi-payment.php', 'class-vindi-webhook-handler.php', 'class-vindi-subscription-status-handler.php', + 'class-vindi-wcs-disable-renewal.php', )); $this->settings = new Vindi_Settings();