From f7bb2833c3add3428fa524fbd9e2079b7ca51f69 Mon Sep 17 00:00:00 2001 From: TheCartpenter Date: Sun, 2 Jun 2024 12:43:53 -0400 Subject: [PATCH] More updates on PayPal Checkout to match new subscriptions --- .../controller/extension/payment/paypal.php | 24 +--- .../admin/model/extension/payment/paypal.php | 16 +-- .../controller/extension/recurring/paypal.php | 24 +--- .../model/extension/payment/paypal.php | 126 +++++++++--------- .../template/extension/recurring/paypal.twig | 4 +- 5 files changed, 81 insertions(+), 113 deletions(-) diff --git a/upload/admin/controller/extension/payment/paypal.php b/upload/admin/controller/extension/payment/paypal.php index de714b764..51375cad2 100644 --- a/upload/admin/controller/extension/payment/paypal.php +++ b/upload/admin/controller/extension/payment/paypal.php @@ -3188,19 +3188,19 @@ public function cancelTracker() { public function recurringButtons() { $content = ''; - if ($this->config->get('payment_paypal_status') && !empty($this->request->get['order_recurring_id'])) { + if ($this->config->get('payment_paypal_status') && !empty($this->request->get['subscription_id'])) { $this->load->language('extension/payment/paypal'); $this->load->model('sale/recurring'); - $data['order_recurring_id'] = $this->request->get['order_recurring_id']; + $data['subscription_id'] = (int)$this->request->get['subscription_id']; - $order_recurring_info = $this->model_sale_recurring->getRecurring($data['order_recurring_id']); + $order_recurring_info = $this->model_sale_recurring->getRecurring($data['subscription_id']); if ($order_recurring_info) { $data['recurring_status'] = $order_recurring_info['status']; - $data['info_url'] = str_replace('&', '&', $this->url->link('extension/payment/paypal/getRecurringInfo', 'user_token=' . $this->session->data['user_token'] . '&order_recurring_id=' . $data['order_recurring_id'], true)); + $data['info_url'] = str_replace('&', '&', $this->url->link('extension/payment/paypal/getRecurringInfo', 'user_token=' . $this->session->data['user_token'] . '&subscription_id=' . $data['subscription_id'], true)); $data['enable_url'] = str_replace('&', '&', $this->url->link('extension/payment/paypal/enableRecurring', 'user_token=' . $this->session->data['user_token'], true)); $data['disable_url'] = str_replace('&', '&', $this->url->link('extension/payment/paypal/disableRecurring', 'user_token=' . $this->session->data['user_token'], true)); @@ -3216,15 +3216,9 @@ public function getRecurringInfo() { } public function enableRecurring() { - if ($this->config->get('payment_paypal_status') && !empty($this->request->post['order_recurring_id'])) { + if ($this->config->get('payment_paypal_status') && !empty($this->request->post['subscription_id'])) { $this->load->language('extension/payment/paypal'); - $this->load->model('extension/payment/paypal'); - - $order_recurring_id = $this->request->post['order_recurring_id']; - - $this->model_extension_payment_paypal->editOrderRecurringStatus($order_recurring_id, 1); - $data['success'] = $this->language->get('success_enable_recurring'); } @@ -3235,15 +3229,9 @@ public function enableRecurring() { } public function disableRecurring() { - if ($this->config->get('payment_paypal_status') && !empty($this->request->post['order_recurring_id'])) { + if ($this->config->get('payment_paypal_status') && !empty($this->request->post['subscription_id'])) { $this->load->language('extension/payment/paypal'); - $this->load->model('extension/payment/paypal'); - - $order_recurring_id = $this->request->post['order_recurring_id']; - - $this->model_extension_payment_paypal->editOrderRecurringStatus($order_recurring_id, 2); - $data['success'] = $this->language->get('success_disable_recurring'); } diff --git a/upload/admin/model/extension/payment/paypal.php b/upload/admin/model/extension/payment/paypal.php index 9505caa21..bda98e4cc 100644 --- a/upload/admin/model/extension/payment/paypal.php +++ b/upload/admin/model/extension/payment/paypal.php @@ -100,7 +100,7 @@ public function getTotalSalesByMonth() { foreach ($query->rows as $result) { $sale_data[date('j', strtotime($result['date_added']))] = array( - 'day' => date('d', strtotime($result['date_added'])), + 'day' => date('d', strtotime($result['date_added'])), 'total' => $result['total'], 'paypal_total' => $result['paypal_total'] ); @@ -130,7 +130,7 @@ public function getTotalSalesByYear() { foreach ($query->rows as $result) { $sale_data[date('n', strtotime($result['date_added']))] = array( - 'month' => date('M', strtotime($result['date_added'])), + 'month' => date('M', strtotime($result['date_added'])), 'total' => $result['total'], 'paypal_total' => $result['paypal_total'] ); @@ -237,10 +237,6 @@ public function getPayPalOrder($order_id) { } } - public function editOrderRecurringStatus($order_recurring_id, $status) { - $this->db->query("UPDATE `" . DB_PREFIX . "order_recurring` SET `status` = '" . (int)$status . "' WHERE `order_recurring_id` = '" . (int)$order_recurring_id . "'"); - } - public function setAgreeStatus() { $this->db->query("UPDATE " . DB_PREFIX . "country SET status = '0' WHERE (iso_code_2 = 'CU' OR iso_code_2 = 'IR' OR iso_code_2 = 'SY' OR iso_code_2 = 'KP')"); $this->db->query("UPDATE " . DB_PREFIX . "zone SET status = '0' WHERE country_id = '220' AND (`code` = '43' OR `code` = '14' OR `code` = '09')"); @@ -360,24 +356,24 @@ public function log($data, $title = null) { public function install() { $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_customer_token` (`customer_id` INT(11) NOT NULL, `payment_method` VARCHAR(20) NOT NULL, `vault_id` VARCHAR(50) NOT NULL, `vault_customer_id` VARCHAR(50) NOT NULL, `card_type` VARCHAR(40) NOT NULL, `card_nice_type` VARCHAR(40) NOT NULL, `card_last_digits` VARCHAR(4) NOT NULL, `card_expiry` VARCHAR(20) NOT NULL, `main_token_status` TINYINT(1) NOT NULL, PRIMARY KEY (`customer_id`, `payment_method`, `vault_id`), KEY `vault_customer_id` (`vault_customer_id`), KEY `main_token_status` (`main_token_status`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order` (`order_id` INT(11) NOT NULL, `paypal_order_id` VARCHAR(20) NOT NULL, `transaction_id` VARCHAR(20) NOT NULL, `transaction_status` VARCHAR(20) NOT NULL, `payment_method` VARCHAR(20) NOT NULL, `vault_id` VARCHAR(50) NOT NULL, `vault_customer_id` VARCHAR(50) NOT NULL, `card_type` VARCHAR(40) NOT NULL, `card_nice_type` VARCHAR(40) NOT NULL, `card_last_digits` VARCHAR(4) NOT NULL, `card_expiry` VARCHAR(20) NOT NULL, `total` DECIMAL(15,2) NOT NULL, `currency_code` VARCHAR(3) NOT NULL, `environment` VARCHAR(20) NOT NULL, `tracking_number` VARCHAR(64) NOT NULL, `carrier_name` VARCHAR(64) NOT NULL, PRIMARY KEY (`order_id`), KEY `paypal_order_id` (`paypal_order_id`), KEY `transaction_id` (`transaction_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); - $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order_recurring` (`paypal_order_recurring_id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL, `order_recurring_id` INT(11) NOT NULL, `date_added` DATETIME NOT NULL, `date_modified` DATETIME NOT NULL, `next_payment` DATETIME NOT NULL, `trial_end` DATETIME DEFAULT NULL, `subscription_end` DATETIME DEFAULT NULL, `currency_code` CHAR(3) NOT NULL, `total` DECIMAL(10, 2) NOT NULL, PRIMARY KEY (`paypal_order_recurring_id`), KEY (`order_id`), KEY (`order_recurring_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); + $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_subscription` (`paypal_subscription_id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL, `subscription_id` INT(11) NOT NULL, `date_added` DATETIME NOT NULL, `date_modified` DATETIME NOT NULL, `next_payment` DATETIME NOT NULL, `trial_end` DATETIME DEFAULT NULL, `subscription_end` DATETIME DEFAULT NULL, `currency_code` CHAR(3) NOT NULL, `total` DECIMAL(10, 2) NOT NULL, PRIMARY KEY (`paypal_subscription_id`), KEY (`order_id`), KEY (`subscription_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); } public function uninstall() { $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_customer_token`"); $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order`"); - $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order_recurring`"); + $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_subscription`"); } public function update() { if ($this->config->get('paypal_version') < '3.0.0') { $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_customer_token`"); $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order`"); - $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order_recurring`"); + $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_subscription`"); $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_customer_token` (`customer_id` INT(11) NOT NULL, `payment_method` VARCHAR(20) NOT NULL, `vault_id` VARCHAR(50) NOT NULL, `vault_customer_id` VARCHAR(50) NOT NULL, `card_type` VARCHAR(40) NOT NULL, `card_nice_type` VARCHAR(40) NOT NULL, `card_last_digits` VARCHAR(4) NOT NULL, `card_expiry` VARCHAR(20) NOT NULL, `main_token_status` TINYINT(1) NOT NULL, PRIMARY KEY (`customer_id`, `payment_method`, `vault_id`), KEY `vault_customer_id` (`vault_customer_id`), KEY `main_token_status` (`main_token_status`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order` (`order_id` INT(11) NOT NULL, `paypal_order_id` VARCHAR(20) NOT NULL, `transaction_id` VARCHAR(20) NOT NULL, `transaction_status` VARCHAR(20) NOT NULL, `payment_method` VARCHAR(20) NOT NULL, `vault_id` VARCHAR(50) NOT NULL, `vault_customer_id` VARCHAR(50) NOT NULL, `card_type` VARCHAR(40) NOT NULL, `card_nice_type` VARCHAR(40) NOT NULL, `card_last_digits` VARCHAR(4) NOT NULL, `card_expiry` VARCHAR(20) NOT NULL, `total` DECIMAL(15,2) NOT NULL, `currency_code` VARCHAR(3) NOT NULL, `environment` VARCHAR(20) NOT NULL, `tracking_number` VARCHAR(64) NOT NULL, `carrier_name` VARCHAR(64) NOT NULL, PRIMARY KEY (`order_id`), KEY `paypal_order_id` (`paypal_order_id`), KEY `transaction_id` (`transaction_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); - $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order_recurring` (`paypal_order_recurring_id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL, `order_recurring_id` INT(11) NOT NULL, `date_added` DATETIME NOT NULL, `date_modified` DATETIME NOT NULL, `next_payment` DATETIME NOT NULL, `trial_end` DATETIME DEFAULT NULL, `subscription_end` DATETIME DEFAULT NULL, `currency_code` CHAR(3) NOT NULL, `total` DECIMAL(10, 2) NOT NULL, PRIMARY KEY (`paypal_order_recurring_id`), KEY (`order_id`), KEY (`order_recurring_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); + $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_subscription` (`paypal_subscription_id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL, `subscription_id` INT(11) NOT NULL, `date_added` DATETIME NOT NULL, `date_modified` DATETIME NOT NULL, `next_payment` DATETIME NOT NULL, `trial_end` DATETIME DEFAULT NULL, `subscription_end` DATETIME DEFAULT NULL, `currency_code` CHAR(3) NOT NULL, `total` DECIMAL(10, 2) NOT NULL, PRIMARY KEY (`paypal_subscription_id`), KEY (`order_id`), KEY (`subscription_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); } elseif ($this->config->get('paypal_version') < '3.1.0') { $this->db->query("ALTER TABLE `" . DB_PREFIX . "paypal_checkout_integration_order` ADD COLUMN `total` DECIMAL(15,2) NOT NULL AFTER `card_expiry`"); $this->db->query("ALTER TABLE `" . DB_PREFIX . "paypal_checkout_integration_order` ADD COLUMN `currency_code` VARCHAR(3) NOT NULL AFTER `total`"); diff --git a/upload/catalog/controller/extension/recurring/paypal.php b/upload/catalog/controller/extension/recurring/paypal.php index 7fded88a1..49ea6f4f6 100644 --- a/upload/catalog/controller/extension/recurring/paypal.php +++ b/upload/catalog/controller/extension/recurring/paypal.php @@ -5,19 +5,19 @@ class ControllerExtensionRecurringPayPal extends Controller { public function index() { $content = ''; - if ($this->config->get('payment_paypal_status') && !empty($this->request->get['order_recurring_id'])) { + if ($this->config->get('payment_paypal_status') && !empty($this->request->get['subscription_id'])) { $this->load->language('extension/recurring/paypal'); $this->load->model('account/recurring'); - $data['order_recurring_id'] = $this->request->get['order_recurring_id']; + $data['subscription_id'] = (int)$this->request->get['subscription_id']; - $order_recurring_info = $this->model_account_recurring->getOrderRecurring($data['order_recurring_id']); + $order_recurring_info = $this->model_account_recurring->getOrderRecurring($data['subscription_id']); if ($order_recurring_info) { $data['recurring_status'] = $order_recurring_info['status']; - $data['info_url'] = str_replace('&', '&', $this->url->link('extension/recurring/paypal/getRecurringInfo', 'order_recurring_id=' . $data['order_recurring_id'], true)); + $data['info_url'] = str_replace('&', '&', $this->url->link('extension/recurring/paypal/getRecurringInfo', 'subscription_id=' . $data['subscription_id'], true)); $data['enable_url'] = str_replace('&', '&', $this->url->link('extension/recurring/paypal/enableRecurring', '', true)); $data['disable_url'] = str_replace('&', '&', $this->url->link('extension/recurring/paypal/disableRecurring', '', true)); @@ -33,15 +33,9 @@ public function getRecurringInfo() { } public function enableRecurring() { - if ($this->config->get('payment_paypal_status') && !empty($this->request->post['order_recurring_id'])) { + if ($this->config->get('payment_paypal_status') && !empty($this->request->post['subscription_id'])) { $this->load->language('extension/recurring/paypal'); - $this->load->model('extension/payment/paypal'); - - $order_recurring_id = $this->request->post['order_recurring_id']; - - $this->model_extension_payment_paypal->editOrderRecurringStatus($order_recurring_id, 1); - $data['success'] = $this->language->get('success_enable_recurring'); } @@ -52,15 +46,9 @@ public function enableRecurring() { } public function disableRecurring() { - if ($this->config->get('payment_paypal_status') && !empty($this->request->post['order_recurring_id'])) { + if ($this->config->get('payment_paypal_status') && !empty($this->request->post['subscription_id'])) { $this->load->language('extension/recurring/paypal'); - $this->load->model('extension/payment/paypal'); - - $order_recurring_id = $this->request->post['order_recurring_id']; - - $this->model_extension_payment_paypal->editOrderRecurringStatus($order_recurring_id, 2); - $data['success'] = $this->language->get('success_disable_recurring'); } diff --git a/upload/catalog/model/extension/payment/paypal.php b/upload/catalog/model/extension/payment/paypal.php index 82bac0e3f..f95eacc8e 100644 --- a/upload/catalog/model/extension/payment/paypal.php +++ b/upload/catalog/model/extension/payment/paypal.php @@ -34,8 +34,8 @@ public function getMethod($address, $total) { return $method_data; } - public function hasProductInCart($product_id, $option = array(), $recurring_id = 0) { - $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "cart WHERE api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "' AND product_id = '" . (int)$product_id . "' AND recurring_id = '" . (int)$recurring_id . "' AND `option` = '" . $this->db->escape(json_encode($option)) . "'"); + public function hasProductInCart($product_id, $option = array(), $subscription_plan_id = 0) { + $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "cart WHERE api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "' AND product_id = '" . (int)$product_id . "' AND subscription_plan_id = '" . (int)$subscription_plan_id . "' AND `option` = '" . $this->db->escape(json_encode($option)) . "'"); return $query->row['total']; } @@ -314,67 +314,63 @@ public function getPayPalOrderByPayPalOrderId($paypal_order_id) { } public function addPayPalOrderRecurring($data) { - $this->db->query("INSERT INTO `" . DB_PREFIX . "paypal_checkout_integration_order_recurring` SET `order_recurring_id` = '" . (int)$data['order_recurring_id'] . "', `order_id` = '" . (int)$data['order_id'] . "', `date_added` = NOW(), `date_modified` = NOW(), `next_payment` = NOW(), `trial_end` = '" . $data['trial_end'] . "', `subscription_end` = '" . $data['subscription_end'] . "', `currency_code` = '" . $this->db->escape($data['currency_code']) . "', `total` = '" . $this->currency->format($data['amount'], $data['currency_code'], false, false) . "'"); + $this->db->query("INSERT INTO `" . DB_PREFIX . "paypal_checkout_integration_subscription` SET `subscription_id` = '" . (int)$data['subscription_id'] . "', `order_id` = '" . (int)$data['order_id'] . "', `date_added` = NOW(), `date_modified` = NOW(), `next_payment` = NOW(), `trial_end` = '" . $data['trial_end'] . "', `subscription_end` = '" . $data['subscription_end'] . "', `currency_code` = '" . $this->db->escape($data['currency_code']) . "', `total` = '" . $this->currency->format($data['amount'], $data['currency_code'], false, false) . "'"); } - public function editPayPalOrderRecurringNextPayment($order_recurring_id, $next_payment) { - $this->db->query("UPDATE `" . DB_PREFIX . "paypal_checkout_integration_order_recurring` SET `next_payment` = '" . $next_payment . "', `date_modified` = NOW() WHERE `order_recurring_id` = '" . (int)$order_recurring_id . "'"); + public function editPayPalOrderRecurringNextPayment($subscription_id, $next_payment) { + $this->db->query("UPDATE `" . DB_PREFIX . "paypal_checkout_integration_subscription` SET `next_payment` = '" . $next_payment . "', `date_modified` = NOW() WHERE `subscription_id` = '" . (int)$subscription_id . "'"); } public function deletePayPalOrderRecurring($order_id) { - $query = $this->db->query("DELETE FROM `" . DB_PREFIX . "paypal_checkout_integration_order_recurring` WHERE `order_id` = '" . (int)$order_id . "'"); + $query = $this->db->query("DELETE FROM `" . DB_PREFIX . "paypal_checkout_integration_subscription` WHERE `order_id` = '" . (int)$order_id . "'"); } - public function getPayPalOrderRecurring($order_recurring_id) { - $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "paypal_checkout_integration_order_recurring` WHERE `order_recurring_id` = '" . (int)$order_recurring_id . "'"); + public function getPayPalOrderRecurring($subscription_id) { + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "paypal_checkout_integration_subscription` WHERE `subscription_id` = '" . (int)$subscription_id . "'"); return $query->row; } public function addOrderRecurring($order_id, $description, $data, $reference) { - $this->db->query("INSERT INTO `" . DB_PREFIX . "order_recurring` SET `order_id` = '" . (int)$order_id . "', `date_added` = NOW(), `status` = '1', `product_id` = '" . (int)$data['product_id'] . "', `product_name` = '" . $this->db->escape($data['name']) . "', `product_quantity` = '" . $this->db->escape($data['quantity']) . "', `recurring_id` = '" . (int)$data['recurring']['recurring_id'] . "', `recurring_name` = '" . $this->db->escape($data['name']) . "', `recurring_description` = '" . $this->db->escape($description) . "', `recurring_frequency` = '" . $this->db->escape($data['recurring']['frequency']) . "', `recurring_cycle` = '" . (int)$data['recurring']['cycle'] . "', `recurring_duration` = '" . (int)$data['recurring']['duration'] . "', `recurring_price` = '" . (float)$data['recurring']['price'] . "', `trial` = '" . (int)$data['recurring']['trial'] . "', `trial_frequency` = '" . $this->db->escape($data['recurring']['trial_frequency']) . "', `trial_cycle` = '" . (int)$data['recurring']['trial_cycle'] . "', `trial_duration` = '" . (int)$data['recurring']['trial_duration'] . "', `trial_price` = '" . (float)$data['recurring']['trial_price'] . "', `reference` = '" . $this->db->escape($reference) . "'"); + $this->db->query("INSERT INTO `" . DB_PREFIX . "subscription` SET `order_id` = '" . (int)$order_id . "', `date_added` = NOW(), `product_id` = '" . (int)$data['product_id'] . "', `product_name` = '" . $this->db->escape($data['name']) . "', `product_quantity` = '" . $this->db->escape($data['quantity']) . "', `recurring_id` = '" . (int)$data['subscription']['recurring_id'] . "', `recurring_name` = '" . $this->db->escape($data['name']) . "', `recurring_description` = '" . $this->db->escape($description) . "', `recurring_frequency` = '" . $this->db->escape($data['subscription']['frequency']) . "', `recurring_cycle` = '" . (int)$data['subscription']['cycle'] . "', `recurring_duration` = '" . (int)$data['subscription']['duration'] . "', `recurring_price` = '" . (float)$data['subscription']['price'] . "', `trial` = '" . (int)$data['subscription']['trial'] . "', `trial_frequency` = '" . $this->db->escape($data['subscription']['trial_frequency']) . "', `trial_cycle` = '" . (int)$data['subscription']['trial_cycle'] . "', `trial_duration` = '" . (int)$data['subscription']['trial_duration'] . "', `trial_price` = '" . (float)$data['subscription']['trial_price'] . "', `reference` = '" . $this->db->escape($reference) . "'"); return $this->db->getLastId(); } - public function editOrderRecurringStatus($order_recurring_id, $status) { - $this->db->query("UPDATE `" . DB_PREFIX . "order_recurring` SET `status` = '" . (int)$status . "' WHERE `order_recurring_id` = '" . (int)$order_recurring_id . "'"); - } - public function deleteOrderRecurring($order_id) { - $query = $this->db->query("SELECT order_recurring_id FROM `" . DB_PREFIX . "order_recurring` WHERE order_id = '" . (int)$order_id . "'"); + $query = $this->db->query("SELECT subscription_id FROM `" . DB_PREFIX . "subscription` WHERE order_id = '" . (int)$order_id . "'"); foreach ($query->rows as $order_recurring) { - $this->deleteOrderRecurringTransaction($order_recurring['order_recurring_id']); + $this->deleteOrderRecurringTransaction($order_recurring['subscription_id']); } - $query = $this->db->query("DELETE FROM `" . DB_PREFIX . "order_recurring` WHERE `order_id` = '" . (int)$order_id . "'"); + $query = $this->db->query("DELETE FROM `" . DB_PREFIX . "subscription` WHERE `order_id` = '" . (int)$order_id . "'"); } public function getOrderRecurrings() { - $query = $this->db->query("SELECT `or`.`order_recurring_id` FROM `" . DB_PREFIX . "order_recurring` `or` JOIN `" . DB_PREFIX . "order` `o` USING(`order_id`) WHERE `o`.`payment_code` = 'paypal' AND `or`.`status` = '1'"); + $query = $this->db->query("SELECT `or`.`subscription_id` FROM `" . DB_PREFIX . "subscription` `or` JOIN `" . DB_PREFIX . "order` `o` USING(`order_id`) WHERE `o`.`payment_code` = 'paypal' AND `or`.`status` = '1'"); $order_recurring_data = array(); foreach ($query->rows as $order_recurring) { - $order_recurring_data[] = $this->getOrderRecurring($order_recurring['order_recurring_id']); + $order_recurring_data[] = $this->getOrderRecurring($order_recurring['subscription_id']); } return $order_recurring_data; } - public function getOrderRecurring($order_recurring_id) { - $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order_recurring` WHERE `order_recurring_id` = '" . (int)$order_recurring_id . "'"); + public function getOrderRecurring($subscription_id) { + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "subscription` WHERE `subscription_id` = '" . (int)$subscription_id . "'"); return $query->row; } public function addOrderRecurringTransaction($data) { - $this->db->query("INSERT INTO `" . DB_PREFIX . "order_recurring_transaction` SET `order_recurring_id` = '" . (int)$data['order_recurring_id'] . "', `reference` = '" . $this->db->escape($data['reference']) . "', `type` = '" . (int)$data['type'] . "', `amount` = '" . (float)$data['amount'] . "', `date_added` = NOW()"); + $this->db->query("INSERT INTO `" . DB_PREFIX . "order_recurring_transaction` SET `subscription_id` = '" . (int)$data['subscription_id'] . "', `reference` = '" . $this->db->escape($data['reference']) . "', `type` = '" . (int)$data['type'] . "', `amount` = '" . (float)$data['amount'] . "', `date_added` = NOW()"); } - public function deleteOrderRecurringTransaction($order_recurring_id) { - $query = $this->db->query("DELETE FROM `" . DB_PREFIX . "order_recurring_transaction` WHERE `order_recurring_id` = '" . (int)$order_recurring_id . "'"); + public function deleteOrderRecurringTransaction($subscription_id) { + $query = $this->db->query("DELETE FROM `" . DB_PREFIX . "order_recurring_transaction` WHERE `subscription_id` = '" . (int)$subscription_id . "'"); } public function recurringPayment($product_data, $order_data, $paypal_order_data) { @@ -387,55 +383,53 @@ public function recurringPayment($product_data, $order_data, $paypal_order_data) $transaction_method = $setting['general']['transaction_method']; - $recurring_name = $product_data['recurring']['name']; + $recurring_name = $product_data['subscription']['name']; - if ($product_data['recurring']['trial'] == 1) { - $price = $product_data['recurring']['trial_price']; - $trial_amt = $this->currency->format($this->tax->calculate($product_data['recurring']['trial_price'], $product_data['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'], false, false) * $product_data['quantity'] . ' ' . $this->session->data['currency']; - $trial_text = sprintf($this->language->get('text_trial'), $trial_amt, $product_data['recurring']['trial_cycle'], $product_data['recurring']['trial_frequency'], $product_data['recurring']['trial_duration']); + if ($product_data['subscription']['trial'] == 1) { + $price = $product_data['subscription']['trial_price']; + $trial_amt = $this->currency->format($this->tax->calculate($product_data['subscription']['trial_price'], $product_data['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'], false, false) * $product_data['quantity'] . ' ' . $this->session->data['currency']; + $trial_text = sprintf($this->language->get('text_trial'), $trial_amt, $product_data['subscription']['trial_cycle'], $product_data['subscription']['trial_frequency'], $product_data['subscription']['trial_duration']); } else { - $price = $product_data['recurring']['price']; + $price = $product_data['subscription']['price']; $trial_text = ''; } - $recurring_amt = $this->currency->format($this->tax->calculate($product_data['recurring']['price'], $product_data['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'], false, false) * $product_data['quantity'] . ' ' . $this->session->data['currency']; - $recurring_description = $trial_text . sprintf($this->language->get('text_recurring'), $recurring_amt, $product_data['recurring']['cycle'], $product_data['recurring']['frequency']); + $recurring_amt = $this->currency->format($this->tax->calculate($product_data['subscription']['price'], $product_data['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'], false, false) * $product_data['quantity'] . ' ' . $this->session->data['currency']; + $recurring_description = $trial_text . sprintf($this->language->get('text_recurring'), $recurring_amt, $product_data['subscription']['cycle'], $product_data['subscription']['frequency']); - if ($product_data['recurring']['duration'] > 0) { - $recurring_description .= sprintf($this->language->get('text_length'), $product_data['recurring']['duration']); + if ($product_data['subscription']['duration'] > 0) { + $recurring_description .= sprintf($this->language->get('text_length'), $product_data['subscription']['duration']); } - $order_recurring_id = $this->addOrderRecurring($order_data['order_id'], $recurring_description, $product_data, $paypal_order_data['transaction_id']); + $subscription_id = $this->addOrderRecurring($order_data['order_id'], $recurring_description, $product_data, $paypal_order_data['transaction_id']); - $this->editOrderRecurringStatus($order_recurring_id, 1); - if (!empty($paypal_order_data['vault_id'])) { $next_payment = new DateTime('now'); $trial_end = new DateTime('now'); $subscription_end = new DateTime('now'); - if (($product_data['recurring']['trial'] == 1) && ($product_data['recurring']['trial_duration'] != 0)) { - $next_payment = $this->calculateSchedule($product_data['recurring']['trial_frequency'], $next_payment, $product_data['recurring']['trial_cycle']); - $trial_end = $this->calculateSchedule($product_data['recurring']['trial_frequency'], $trial_end, $product_data['recurring']['trial_cycle'] * $product_data['recurring']['trial_duration']); - } elseif ($product_data['recurring']['trial'] == 1) { - $next_payment = $this->calculateSchedule($product_data['recurring']['trial_frequency'], $next_payment, $product_data['recurring']['trial_cycle']); + if (($product_data['subscription']['trial'] == 1) && ($product_data['subscription']['trial_duration'] != 0)) { + $next_payment = $this->calculateSchedule($product_data['subscription']['trial_frequency'], $next_payment, $product_data['subscription']['trial_cycle']); + $trial_end = $this->calculateSchedule($product_data['subscription']['trial_frequency'], $trial_end, $product_data['subscription']['trial_cycle'] * $product_data['subscription']['trial_duration']); + } elseif ($product_data['subscription']['trial'] == 1) { + $next_payment = $this->calculateSchedule($product_data['subscription']['trial_frequency'], $next_payment, $product_data['subscription']['trial_cycle']); $trial_end = new DateTime('0000-00-00'); } - if (date_format($trial_end, 'Y-m-d H:i:s') > date_format($subscription_end, 'Y-m-d H:i:s') && $product_data['recurring']['duration'] != 0) { + if (date_format($trial_end, 'Y-m-d H:i:s') > date_format($subscription_end, 'Y-m-d H:i:s') && $product_data['subscription']['duration'] != 0) { $subscription_end = new DateTime(date_format($trial_end, 'Y-m-d H:i:s')); - $subscription_end = $this->calculateSchedule($product_data['recurring']['frequency'], $subscription_end, $product_data['recurring']['cycle'] * $product_data['recurring']['duration']); - } elseif (date_format($trial_end, 'Y-m-d H:i:s') == date_format($subscription_end, 'Y-m-d H:i:s') && $product_data['recurring']['duration'] != 0) { - $next_payment = $this->calculateSchedule($product_data['recurring']['frequency'], $next_payment, $product_data['recurring']['cycle']); - $subscription_end = $this->calculateSchedule($product_data['recurring']['frequency'], $subscription_end, $product_data['recurring']['cycle'] * $product_data['recurring']['duration']); - } elseif (date_format($trial_end, 'Y-m-d H:i:s') > date_format($subscription_end, 'Y-m-d H:i:s') && $product_data['recurring']['duration'] == 0) { + $subscription_end = $this->calculateSchedule($product_data['subscription']['frequency'], $subscription_end, $product_data['subscription']['cycle'] * $product_data['subscription']['duration']); + } elseif (date_format($trial_end, 'Y-m-d H:i:s') == date_format($subscription_end, 'Y-m-d H:i:s') && $product_data['subscription']['duration'] != 0) { + $next_payment = $this->calculateSchedule($product_data['subscription']['frequency'], $next_payment, $product_data['subscription']['cycle']); + $subscription_end = $this->calculateSchedule($product_data['subscription']['frequency'], $subscription_end, $product_data['subscription']['cycle'] * $product_data['subscription']['duration']); + } elseif (date_format($trial_end, 'Y-m-d H:i:s') > date_format($subscription_end, 'Y-m-d H:i:s') && $product_data['subscription']['duration'] == 0) { $subscription_end = new DateTime('0000-00-00'); - } elseif (date_format($trial_end, 'Y-m-d H:i:s') == date_format($subscription_end, 'Y-m-d H:i:s') && $product_data['recurring']['duration'] == 0) { - $next_payment = $this->calculateSchedule($product_data['recurring']['frequency'], $next_payment, $product_data['recurring']['cycle']); + } elseif (date_format($trial_end, 'Y-m-d H:i:s') == date_format($subscription_end, 'Y-m-d H:i:s') && $product_data['subscription']['duration'] == 0) { + $next_payment = $this->calculateSchedule($product_data['subscription']['frequency'], $next_payment, $product_data['subscription']['cycle']); $subscription_end = new DateTime('0000-00-00'); } - $result = $this->createPayment($order_data, $paypal_order_data, $price, $order_recurring_id, $recurring_name); + $result = $this->createPayment($order_data, $paypal_order_data, $price, $subscription_id, $recurring_name); $transaction_status = ''; $transaction_id = ''; @@ -460,7 +454,7 @@ public function recurringPayment($product_data, $order_data, $paypal_order_data) if ($transaction_id && $transaction_status && $currency_code && $amount) { $paypal_order_recurring_data = array( - 'order_recurring_id' => $order_recurring_id, + 'subscription_id' => $subscription_id, 'order_id' => $order_data['order_id'], 'trial_end' => date_format($trial_end, 'Y-m-d H:i:s'), 'subscription_end' => date_format($subscription_end, 'Y-m-d H:i:s'), @@ -472,7 +466,7 @@ public function recurringPayment($product_data, $order_data, $paypal_order_data) if (($transaction_status == 'CREATED') || ($transaction_status == 'COMPLETED') || ($transaction_status == 'PENDING')) { $order_recurring_transaction_data = array( - 'order_recurring_id' => $order_recurring_id, + 'subscription_id' => $subscription_id, 'reference' => $transaction_id, 'type' => '1', 'amount' => $amount @@ -480,10 +474,10 @@ public function recurringPayment($product_data, $order_data, $paypal_order_data) $this->addOrderRecurringTransaction($order_recurring_transaction_data); - $this->editPayPalOrderRecurringNextPayment($order_recurring_id, date_format($next_payment, 'Y-m-d H:i:s')); + $this->editPayPalOrderRecurringNextPayment($subscription_id, date_format($next_payment, 'Y-m-d H:i:s')); } else { $order_recurring_transaction_data = array( - 'order_recurring_id' => $order_recurring_id, + 'subscription_id' => $subscription_id, 'reference' => $transaction_id, 'type' => '4', 'amount' => $amount @@ -511,7 +505,7 @@ public function cronPayment() { foreach ($order_recurrings as $order_recurring) { if ($order_recurring['status'] == 1) { - $paypal_order_recurring = $this->getPayPalOrderRecurring($order_recurring['order_recurring_id']); + $paypal_order_recurring = $this->getPayPalOrderRecurring($order_recurring['subscription_id']); if ($paypal_order_recurring) { $today = new DateTime('now'); @@ -539,7 +533,7 @@ public function cronPayment() { continue; } - $result = $this->createPayment($order_info, $paypal_order_info, $price, $order_recurring['order_recurring_id'], $order_recurring['recurring_name']); + $result = $this->createPayment($order_info, $paypal_order_info, $price, $order_recurring['subscription_id'], $order_recurring['recurring_name']); $transaction_status = ''; $transaction_id = ''; @@ -565,7 +559,7 @@ public function cronPayment() { if ($transaction_id && $transaction_status && $currency_code && $amount) { if (($transaction_status == 'CREATED') || ($transaction_status == 'COMPLETED') || ($transaction_status == 'PENDING')) { $order_recurring_transaction_data = array( - 'order_recurring_id' => $order_recurring['order_recurring_id'], + 'subscription_id' => $order_recurring['subscription_id'], 'reference' => $transaction_id, 'type' => '1', 'amount' => $amount @@ -573,10 +567,10 @@ public function cronPayment() { $this->addOrderRecurringTransaction($order_recurring_transaction_data); - $this->editPayPalOrderRecurringNextPayment($order_recurring['order_recurring_id'], date_format($next_payment, 'Y-m-d H:i:s')); + $this->editPayPalOrderRecurringNextPayment($order_recurring['subscription_id'], date_format($next_payment, 'Y-m-d H:i:s')); } else { $order_recurring_transaction_data = array( - 'order_recurring_id' => $order_recurring['order_recurring_id'], + 'subscription_id' => $order_recurring['subscription_id'], 'reference' => $transaction_id, 'type' => '4', 'amount' => $amount @@ -591,7 +585,7 @@ public function cronPayment() { } } - public function createPayment($order_data, $paypal_order_data, $price, $order_recurring_id, $recurring_name) { + public function createPayment($order_data, $paypal_order_data, $price, $subscription_id, $recurring_name) { $this->load->language('extension/payment/paypal'); $_config = new Config(); @@ -708,7 +702,9 @@ public function createPayment($order_data, $paypal_order_data, $price, $order_re return false; } - public function calculateSchedule($frequency, $next_payment, $cycle) { + public function calculateSchedule($frequency, \DateTime $next_payment, $cycle) { + $next_payment = clone $next_payment; + if ($frequency == 'semi_month') { $day = date_format($next_payment, 'd'); $value = 15 - $day; @@ -785,11 +781,11 @@ public function update() { if ($this->config->get('paypal_version') < '3.0.0') { $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_customer_token`"); $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order`"); - $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order_recurring`"); + $this->db->query("DROP TABLE IF EXISTS `" . DB_PREFIX . "paypal_checkout_integration_subscription`"); $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_customer_token` (`customer_id` INT(11) NOT NULL, `payment_method` VARCHAR(20) NOT NULL, `vault_id` VARCHAR(50) NOT NULL, `vault_customer_id` VARCHAR(50) NOT NULL, `card_type` VARCHAR(40) NOT NULL, `card_nice_type` VARCHAR(40) NOT NULL, `card_last_digits` VARCHAR(4) NOT NULL, `card_expiry` VARCHAR(20) NOT NULL, `main_token_status` TINYINT(1) NOT NULL, PRIMARY KEY (`customer_id`, `payment_method`, `vault_id`), KEY `vault_customer_id` (`vault_customer_id`), KEY `main_token_status` (`main_token_status`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order` (`order_id` INT(11) NOT NULL, `paypal_order_id` VARCHAR(20) NOT NULL, `transaction_id` VARCHAR(20) NOT NULL, `transaction_status` VARCHAR(20) NOT NULL, `payment_method` VARCHAR(20) NOT NULL, `vault_id` VARCHAR(50) NOT NULL, `vault_customer_id` VARCHAR(50) NOT NULL, `card_type` VARCHAR(40) NOT NULL, `card_nice_type` VARCHAR(40) NOT NULL, `card_last_digits` VARCHAR(4) NOT NULL, `card_expiry` VARCHAR(20) NOT NULL, `total` DECIMAL(15,2) NOT NULL, `currency_code` VARCHAR(3) NOT NULL, `environment` VARCHAR(20) NOT NULL, `tracking_number` VARCHAR(64) NOT NULL, `carrier_name` VARCHAR(64) NOT NULL, PRIMARY KEY (`order_id`), KEY `paypal_order_id` (`paypal_order_id`), KEY `transaction_id` (`transaction_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); - $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order_recurring` (`paypal_order_recurring_id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL, `order_recurring_id` INT(11) NOT NULL, `date_added` DATETIME NOT NULL, `date_modified` DATETIME NOT NULL, `next_payment` DATETIME NOT NULL, `trial_end` DATETIME DEFAULT NULL, `subscription_end` DATETIME DEFAULT NULL, `currency_code` CHAR(3) NOT NULL, `total` DECIMAL(10, 2) NOT NULL, PRIMARY KEY (`paypal_order_recurring_id`), KEY (`order_id`), KEY (`order_recurring_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); + $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_subscription` (`paypal_subscription_id` INT(11) NOT NULL AUTO_INCREMENT, `order_id` INT(11) NOT NULL, `subscription_id` INT(11) NOT NULL, `date_added` DATETIME NOT NULL, `date_modified` DATETIME NOT NULL, `next_payment` DATETIME NOT NULL, `trial_end` DATETIME DEFAULT NULL, `subscription_end` DATETIME DEFAULT NULL, `currency_code` CHAR(3) NOT NULL, `total` DECIMAL(10, 2) NOT NULL, PRIMARY KEY (`paypal_subscription_id`), KEY (`order_id`), KEY (`subscription_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci"); } elseif ($this->config->get('paypal_version') < '3.1.0') { $this->db->query("ALTER TABLE `" . DB_PREFIX . "paypal_checkout_integration_order` ADD COLUMN `total` DECIMAL(15,2) NOT NULL AFTER `card_expiry`"); $this->db->query("ALTER TABLE `" . DB_PREFIX . "paypal_checkout_integration_order` ADD COLUMN `currency_code` VARCHAR(3) NOT NULL AFTER `total`"); @@ -834,10 +830,10 @@ public function update() { $this->db->query("INSERT INTO " . DB_PREFIX . "setting SET store_id = '0', `code` = 'paypal_version', `key` = 'paypal_version', `value` = '" . $this->db->escape($config_setting['version']) . "'"); } - public function recurringPayments() { + public function subscriptionPayments() { /* * Used by the checkout to state the module - * supports recurring recurrings. + * supports subscriptions. */ return true; } diff --git a/upload/catalog/view/theme/default/template/extension/recurring/paypal.twig b/upload/catalog/view/theme/default/template/extension/recurring/paypal.twig index 187c853e2..caf591d83 100644 --- a/upload/catalog/view/theme/default/template/extension/recurring/paypal.twig +++ b/upload/catalog/view/theme/default/template/extension/recurring/paypal.twig @@ -12,7 +12,7 @@ $('#paypal_recurring').on('click', '.button-enable-recurring', function() { $.ajax({ type: 'post', url: '{{ enable_url }}', - data: {'order_recurring_id' : '{{ order_recurring_id }}'}, + data: {'subscription_id' : '{{ subscription_id }}'}, dataType: 'json', beforeSend: function() { $('#paypal_recurring .btn').prop('disabled', true); @@ -47,7 +47,7 @@ $('#paypal_recurring').on('click', '.button-disable-recurring', function() { $.ajax({ type: 'post', url: '{{ disable_url }}', - data: {'order_recurring_id' : '{{ order_recurring_id }}'}, + data: {'subscription_id' : '{{ subscription_id }}'}, dataType: 'json', beforeSend: function() { $('#paypal_recurring .btn').prop('disabled', true);