diff --git a/upload/admin/controller/extension/payment/paypal.php b/upload/admin/controller/extension/payment/paypal.php index d207340ca..1e472bfeb 100644 --- a/upload/admin/controller/extension/payment/paypal.php +++ b/upload/admin/controller/extension/payment/paypal.php @@ -2305,20 +2305,20 @@ public function subscriptionButtons(): string { $this->load->model('extension/payment/paypal'); - if (!empty($this->request->get['order_id'])) { - $order_id = (int)$this->request->get['order_id']; + if (!empty($this->request->get['order_subscription_id'])) { + $order_subscription_id = (int)$this->request->get['order_subscription_id']; } else { - $order_id = 0; + $order_subscription_id = 0; } - $data['order_id'] = $order_id; + $data['order_subscription_id'] = $order_subscription_id; - $order_subscription_info = $this->model_extension_payment_paypal->getPayPalOrderSubscription($order_id); + $order_subscription_info = $this->model_extension_payment_paypal->getPayPalOrderSubscription($order_subscription_id); if ($order_subscription_info) { $data['subscription_status'] = $order_subscription_info['status']; - $data['info_url'] = str_replace('&', '&', $this->url->link('extension/payment/paypal/getRecurringInfo', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $order_id, true)); + $data['info_url'] = str_replace('&', '&', $this->url->link('extension/payment/paypal/getSubscriptionInfo', 'user_token=' . $this->session->data['user_token'] . '&order_subscription_id=' . $order_subscription_id, true)); $data['enable_url'] = str_replace('&', '&', $this->url->link('extension/payment/paypal/enableSubscription', 'user_token=' . $this->session->data['user_token'], true)); $data['disable_url'] = str_replace('&', '&', $this->url->link('extension/payment/paypal/disableSubscription', 'user_token=' . $this->session->data['user_token'], true)); @@ -2351,13 +2351,13 @@ public function enableSubscription(): void { $this->load->model('extension/payment/paypal'); - if (!empty($this->request->get['order_id'])) { - $order_id = (int)$this->request->get['order_id']; + if (!empty($this->request->get['order_subscription_id'])) { + $order_subscription_id = (int)$this->request->get['order_subscription_id']; } else { - $order_id = 0; + $order_subscription_id = 0; } - $this->model_extension_payment_paypal->editOrderSubscriptionStatus($order_id, 1); + $this->model_extension_payment_paypal->editOrderSubscriptionStatus($order_subscription_id, 1); $json['success'] = $this->language->get('success_enable_subscription'); } @@ -2381,13 +2381,13 @@ public function disableSubscription(): void { $this->load->model('extension/payment/paypal'); - if (!empty($this->request->get['order_id'])) { - $order_id = (int)$this->request->get['order_id']; + if (!empty($this->request->get['order_subscription_id'])) { + $order_subscription_id = (int)$this->request->get['order_subscription_id']; } else { - $order_id = 0; + $order_subscription_id = 0; } - $this->model_extension_payment_paypal->editOrderSubscriptionStatus($order_id, 2); + $this->model_extension_payment_paypal->editOrderSubscriptionStatus($order_subscription_id, 2); $json['success'] = $this->language->get('success_disable_subscription'); } diff --git a/upload/admin/model/extension/payment/paypal.php b/upload/admin/model/extension/payment/paypal.php index 123e114d3..3ad10aec3 100644 --- a/upload/admin/model/extension/payment/paypal.php +++ b/upload/admin/model/extension/payment/paypal.php @@ -299,11 +299,13 @@ public function install(): void { `vault_id` varchar(50) NULL, `vault_customer_id` varchar(50) NULL, `environment` varchar(20) NULL, + `status` tinyint(1) NOT NULL, PRIMARY KEY (`order_id`, `transaction_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci"); $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order_subscription` ( `paypal_subscription_id` int(11) NOT NULL AUTO_INCREMENT, + `order_subscription_id` int(11) NOT NULL, `order_id` int(11) NOT NULL, `date_added` datetime NOT NULL, `date_modified` datetime NOT NULL, @@ -311,8 +313,7 @@ public function install(): void { `trial_end` datetime DEFAULT NULL, `subscription_end` datetime DEFAULT NULL, `currency_code` varchar(3) NOT NULL, - `total` decimal(10, 2) NOT NULL, - `status` tinyin(1) NOT NULL, + `total` decimal(10, 2) NOT NULL, PRIMARY KEY (`paypal_subscription_id`), KEY (`order_id`), KEY (`subscription_id`) @@ -321,7 +322,7 @@ public function install(): void { $this->db->query(" CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "order_subscription_transaction` ( `order_subscription_transaction_id` int(11) NOT NULL AUTO_INCREMENT, - `order_id` int(11) NOT NULL, + `order_subscription_id` int(11) NOT NULL, `reference` varchar(255) NOT NULL, `type` tinyint(1) NOT NULL, `amount` decimal(15,4) NOT NULL, diff --git a/upload/catalog/controller/extension/payment/opayo.php b/upload/catalog/controller/extension/payment/opayo.php index b24e4b083..c62868ee5 100644 --- a/upload/catalog/controller/extension/payment/opayo.php +++ b/upload/catalog/controller/extension/payment/opayo.php @@ -341,19 +341,62 @@ public function confirm(): void { $this->model_checkout_order->addHistory($this->session->data['order_id'], $setting['general']['order_status_id'], $message, false); if ($setting['general']['transaction_method'] == 'PAYMENT') { - $subscriptions = $this->cart->getSubscriptions(); + $subscription_products = $this->cart->getSubscriptions(); $order_products = $this->model_checkout_order->getProducts($this->session->data['order_id']); - $opayo_order_info = $this->model_extension_payment_opayo->getOrder($this->session->data['order_id']); + if (isset($this->request->server['HTTP_X_REAL_IP'])) { + $ip = $this->request->server['HTTP_X_REAL_IP']; + } elseif (isset($this->request->server['REMOTE_ADDR'])) { + $ip = $this->request->server['REMOTE_ADDR']; + } else { + $ip = ''; + } + + if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) { + $forwarded_ip = $this->request->server['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) { + $forwarded_ip = $this->request->server['HTTP_CLIENT_IP']; + } else { + $forwarded_ip = ''; + } + + if (isset($this->request->server['HTTP_USER_AGENT'])) { + $user_agent = $this->request->server['HTTP_USER_AGENT']; + } else { + $user_agent = ''; + } + + if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) { + $accept_language = $this->request->server['HTTP_ACCEPT_LANGUAGE']; + } else { + $accept_language = ''; + } - // Loop through any products that are subscription items - foreach ($subscriptions as $item) { + foreach ($subscription_products as $item) { foreach ($order_products as $order_product) { $order_subscription = $this->model_checkout_order->getSubscription($this->session->data['order_id'], $order_product['order_product_id']); - if ($order_subscription && $item['product_id'] == $order_subscription['product_id'] && $order_subscription['product_id'] == $order_product['product_id']) { - $item['subscription']['name'] = $order_product['name']; + if ($order_subscription && $order_product['product_id'] == $item['product_id'] && $item['product_id'] == $order_subscription['product_id']) { + $item['subscription']['order_product_id'] = $order_product['order_product_id']; + $item['subscription']['product_id'] = $order_product['product_id']; + $item['subscription']['store_id'] = $this->config->get('config_store_id'); + $item['subscription']['customer_id'] = $this->customer->getId(); + $item['subscription']['payment_address_id'] = $order_info['payment_address_id']; + $item['subscription']['payment_method'] = $order_info['payment_method']; + $item['subscription']['shipping_address_id'] = $order_info['shipping_address_id']; + $item['subscription']['shipping_method'] = $order_info['shipping_method']; + $item['subscription']['quantity'] = $order_product['quantity']; + $item['subscription']['comment'] = $order_info['comment']; + $item['subscription']['affiliate_id'] = $order_info['affiliate_id']; + $item['subscription']['marketing_id'] = $order_info['marketing_id']; + $item['subscription']['tracking'] = $order_info['tracking']; + $item['subscription']['language_id'] = $order_info['language_id']; + $item['subscription']['currency_id'] = $order_info['currency_id']; + $item['subscription']['ip'] = $ip; + $item['subscription']['forwarded_ip'] = $forwarded_ip; + $item['subscription']['user_agent'] = $user_agent; + $item['subscription']['accept_language'] = $accept_language; $this->model_extension_payment_opayo->subscriptionPayment($item, $payment_data['VendorTxCode']); } @@ -461,20 +504,63 @@ public function threeDSnotify(): void { $payment_data['VendorTxCode'] = $this->session->data['order_id'] . 'SD' . date('YmdHis') . mt_rand(1, 999); - $subscriptions = $this->cart->getSubscriptions(); - + $subscription_products = $this->cart->getSubscriptions(); + $order_products = $this->model_checkout_order->getProducts($this->session->data['order_id']); - - $opayo_order_info = $this->model_extension_payment_opayo->getOrder($this->session->data['order_id']); - - // Loop through any products that are subscription items - foreach ($subscriptions as $item) { + + if (isset($this->request->server['HTTP_X_REAL_IP'])) { + $ip = $this->request->server['HTTP_X_REAL_IP']; + } elseif (isset($this->request->server['REMOTE_ADDR'])) { + $ip = $this->request->server['REMOTE_ADDR']; + } else { + $ip = ''; + } + + if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) { + $forwarded_ip = $this->request->server['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) { + $forwarded_ip = $this->request->server['HTTP_CLIENT_IP']; + } else { + $forwarded_ip = ''; + } + + if (isset($this->request->server['HTTP_USER_AGENT'])) { + $user_agent = $this->request->server['HTTP_USER_AGENT']; + } else { + $user_agent = ''; + } + + if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) { + $accept_language = $this->request->server['HTTP_ACCEPT_LANGUAGE']; + } else { + $accept_language = ''; + } + + foreach ($subscription_products as $item) { foreach ($order_products as $order_product) { $order_subscription = $this->model_checkout_order->getSubscription($this->session->data['order_id'], $order_product['order_product_id']); - - if ($order_subscription && $item['product_id'] == $order_subscription['product_id'] && $order_subscription['product_id'] == $order_product['product_id']) { - $item['subscription']['name'] = $order_product['name']; - + + if ($order_subscription && $order_product['product_id'] == $item['product_id'] && $item['product_id'] == $order_subscription['product_id']) { + $item['subscription']['order_product_id'] = $order_product['order_product_id']; + $item['subscription']['product_id'] = $order_product['product_id']; + $item['subscription']['store_id'] = $this->config->get('config_store_id'); + $item['subscription']['customer_id'] = $this->customer->getId(); + $item['subscription']['payment_address_id'] = $order_info['payment_address_id']; + $item['subscription']['payment_method'] = $order_info['payment_method']; + $item['subscription']['shipping_address_id'] = $order_info['shipping_address_id']; + $item['subscription']['shipping_method'] = $order_info['shipping_method']; + $item['subscription']['quantity'] = $order_product['quantity']; + $item['subscription']['comment'] = $order_info['comment']; + $item['subscription']['affiliate_id'] = $order_info['affiliate_id']; + $item['subscription']['marketing_id'] = $order_info['marketing_id']; + $item['subscription']['tracking'] = $order_info['tracking']; + $item['subscription']['language_id'] = $order_info['language_id']; + $item['subscription']['currency_id'] = $order_info['currency_id']; + $item['subscription']['ip'] = $ip; + $item['subscription']['forwarded_ip'] = $forwarded_ip; + $item['subscription']['user_agent'] = $user_agent; + $item['subscription']['accept_language'] = $accept_language; + $this->model_extension_payment_opayo->subscriptionPayment($item, $payment_data['VendorTxCode']); } } diff --git a/upload/catalog/controller/extension/payment/paypal.php b/upload/catalog/controller/extension/payment/paypal.php index bb255e732..2a52853c7 100644 --- a/upload/catalog/controller/extension/payment/paypal.php +++ b/upload/catalog/controller/extension/payment/paypal.php @@ -616,29 +616,35 @@ public function createOrder(): void { } } - if (isset($product['recurring_id'])) { - $recurring_id = $product['recurring_id']; + if (isset($product['subscription_plan_id'])) { + $subscription_plan_id = $product['subscription_plan_id']; } else { - $recurring_id = 0; + $subscription_plan_id = 0; } - $recurrings = $this->model_catalog_product->getProfiles($product_info['product_id']); + $this->load->model('catalog/subscription_plan'); - if ($recurrings) { - $recurring_ids = []; + $filter_data = [ + 'filter_name' => $product_info['name'] + ]; + + $subscription_plans = $this->model_catalog_subscription_plan->getSubscriptionPlans($filter_data); + + if ($subscription_plans) { + $subscription_plan_ids = []; - foreach ($recurrings as $recurring) { - $recurring_ids[] = $recurring['recurring_id']; + foreach ($subscription_plans as $subscription_plan) { + $subscription_plan_ids[] = $subscription_plan['subscription_plan_id']; } - if (!in_array($recurring_id, $recurring_ids)) { - $errors[] = $this->language->get('error_recurring_required'); + if (!in_array($subscription_plan_id, $subscription_plan_ids)) { + $errors[] = $this->language->get('error_subscription_required'); } } if (!$errors) { - if (!$this->model_extension_payment_paypal->hasProductInCart($product_id, $option, $recurring_id)) { - $this->cart->add($product_id, $quantity, $option, $recurring_id); + if (!$this->model_extension_payment_paypal->hasProductInCart($product_id, $option, $subscription_plan_id)) { + $this->cart->add($product_id, $quantity, $option, $subscription_plan_id); } // Unset all shipping and payment methods @@ -1346,17 +1352,62 @@ public function approveOrder(): void { } if (($authorization_status == 'CREATED') || ($authorization_status == 'PENDING')) { - $subscriptions = $this->cart->getSubscriptions(); + $subscription_products = $this->cart->getSubscriptions(); $order_products = $this->model_checkout_order->getProducts($this->session->data['order_id']); - // Loop through any products that are subscription items - foreach ($subscriptions as $item) { + if (isset($this->request->server['HTTP_X_REAL_IP'])) { + $ip = $this->request->server['HTTP_X_REAL_IP']; + } elseif (isset($this->request->server['REMOTE_ADDR'])) { + $ip = $this->request->server['REMOTE_ADDR']; + } else { + $ip = ''; + } + + if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) { + $forwarded_ip = $this->request->server['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) { + $forwarded_ip = $this->request->server['HTTP_CLIENT_IP']; + } else { + $forwarded_ip = ''; + } + + if (isset($this->request->server['HTTP_USER_AGENT'])) { + $user_agent = $this->request->server['HTTP_USER_AGENT']; + } else { + $user_agent = ''; + } + + if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) { + $accept_language = $this->request->server['HTTP_ACCEPT_LANGUAGE']; + } else { + $accept_language = ''; + } + + foreach ($subscription_products as $item) { foreach ($order_products as $order_product) { $order_subscription = $this->model_checkout_order->getSubscription($this->session->data['order_id'], $order_product['order_product_id']); - if ($order_subscription && $item['product_id'] == $order_subscription['product_id'] && $order_subscription['product_id'] == $order_product['product_id']) { - $item['subscription']['name'] = $order_product['name']; + if ($order_subscription && $order_product['product_id'] == $item['product_id'] && $item['product_id'] == $order_subscription['product_id']) { + $item['subscription']['order_product_id'] = $order_product['order_product_id']; + $item['subscription']['product_id'] = $order_product['product_id']; + $item['subscription']['store_id'] = $this->config->get('config_store_id'); + $item['subscription']['customer_id'] = $this->customer->getId(); + $item['subscription']['payment_address_id'] = $order_info['payment_address_id']; + $item['subscription']['payment_method'] = $order_info['payment_method']; + $item['subscription']['shipping_address_id'] = $order_info['shipping_address_id']; + $item['subscription']['shipping_method'] = $order_info['shipping_method']; + $item['subscription']['quantity'] = $order_product['quantity']; + $item['subscription']['comment'] = $order_info['comment']; + $item['subscription']['affiliate_id'] = $order_info['affiliate_id']; + $item['subscription']['marketing_id'] = $order_info['marketing_id']; + $item['subscription']['tracking'] = $order_info['tracking']; + $item['subscription']['language_id'] = $order_info['language_id']; + $item['subscription']['currency_id'] = $order_info['currency_id']; + $item['subscription']['ip'] = $ip; + $item['subscription']['forwarded_ip'] = $forwarded_ip; + $item['subscription']['user_agent'] = $user_agent; + $item['subscription']['accept_language'] = $accept_language; $this->model_extension_payment_paypal->subscriptionPayment($item, $order_info, $paypal_order_data); } @@ -1438,17 +1489,62 @@ public function approveOrder(): void { } if (($capture_status == 'COMPLETED') || ($capture_status == 'PENDING')) { - $subscriptions = $this->cart->getSubscriptions(); + $subscription_products = $this->cart->getSubscriptions(); $order_products = $this->model_checkout_order->getProducts($this->session->data['order_id']); - // Loop through any products that are subscription items - foreach ($subscriptions as $item) { + if (isset($this->request->server['HTTP_X_REAL_IP'])) { + $ip = $this->request->server['HTTP_X_REAL_IP']; + } elseif (isset($this->request->server['REMOTE_ADDR'])) { + $ip = $this->request->server['REMOTE_ADDR']; + } else { + $ip = ''; + } + + if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) { + $forwarded_ip = $this->request->server['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) { + $forwarded_ip = $this->request->server['HTTP_CLIENT_IP']; + } else { + $forwarded_ip = ''; + } + + if (isset($this->request->server['HTTP_USER_AGENT'])) { + $user_agent = $this->request->server['HTTP_USER_AGENT']; + } else { + $user_agent = ''; + } + + if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) { + $accept_language = $this->request->server['HTTP_ACCEPT_LANGUAGE']; + } else { + $accept_language = ''; + } + + foreach ($subscription_products as $item) { foreach ($order_products as $order_product) { $order_subscription = $this->model_checkout_order->getSubscription($this->session->data['order_id'], $order_product['order_product_id']); - if ($order_subscription && $item['product_id'] == $order_subscription['product_id'] && $order_subscription['product_id'] == $order_product['product_id']) { - $item['subscription']['name'] = $order_product['name']; + if ($order_subscription && $order_product['product_id'] == $item['product_id'] && $item['product_id'] == $order_subscription['product_id']) { + $item['subscription']['order_product_id'] = $order_product['order_product_id']; + $item['subscription']['product_id'] = $order_product['product_id']; + $item['subscription']['store_id'] = $this->config->get('config_store_id'); + $item['subscription']['customer_id'] = $this->customer->getId(); + $item['subscription']['payment_address_id'] = $order_info['payment_address_id']; + $item['subscription']['payment_method'] = $order_info['payment_method']; + $item['subscription']['shipping_address_id'] = $order_info['shipping_address_id']; + $item['subscription']['shipping_method'] = $order_info['shipping_method']; + $item['subscription']['quantity'] = $order_product['quantity']; + $item['subscription']['comment'] = $order_info['comment']; + $item['subscription']['affiliate_id'] = $order_info['affiliate_id']; + $item['subscription']['marketing_id'] = $order_info['marketing_id']; + $item['subscription']['tracking'] = $order_info['tracking']; + $item['subscription']['language_id'] = $order_info['language_id']; + $item['subscription']['currency_id'] = $order_info['currency_id']; + $item['subscription']['ip'] = $ip; + $item['subscription']['forwarded_ip'] = $forwarded_ip; + $item['subscription']['user_agent'] = $user_agent; + $item['subscription']['accept_language'] = $accept_language; $this->model_extension_payment_paypal->subscriptionPayment($item, $order_info, $paypal_order_data); } @@ -2517,17 +2613,62 @@ public function completeOrder(): void { } if (($authorization_status == 'CREATED') || ($authorization_status == 'PENDING')) { - $subscriptions = $this->cart->getSubscriptions(); + $subscription_products = $this->cart->getSubscriptions(); $order_products = $this->model_checkout_order->getProducts($this->session->data['order_id']); - // Loop through any products that are subscription items - foreach ($subscriptions as $item) { + if (isset($this->request->server['HTTP_X_REAL_IP'])) { + $ip = $this->request->server['HTTP_X_REAL_IP']; + } elseif (isset($this->request->server['REMOTE_ADDR'])) { + $ip = $this->request->server['REMOTE_ADDR']; + } else { + $ip = ''; + } + + if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) { + $forwarded_ip = $this->request->server['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) { + $forwarded_ip = $this->request->server['HTTP_CLIENT_IP']; + } else { + $forwarded_ip = ''; + } + + if (isset($this->request->server['HTTP_USER_AGENT'])) { + $user_agent = $this->request->server['HTTP_USER_AGENT']; + } else { + $user_agent = ''; + } + + if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) { + $accept_language = $this->request->server['HTTP_ACCEPT_LANGUAGE']; + } else { + $accept_language = ''; + } + + foreach ($subscription_products as $item) { foreach ($order_products as $order_product) { $order_subscription = $this->model_checkout_order->getSubscription($this->session->data['order_id'], $order_product['order_product_id']); - if ($order_subscription && $item['product_id'] == $order_subscription['product_id'] && $order_subscription['product_id'] == $order_product['product_id']) { - $item['subscription']['name'] = $order_product['name']; + if ($order_subscription && $order_product['product_id'] == $item['product_id'] && $item['product_id'] == $order_subscription['product_id']) { + $item['subscription']['order_product_id'] = $order_product['order_product_id']; + $item['subscription']['product_id'] = $order_product['product_id']; + $item['subscription']['store_id'] = $this->config->get('config_store_id'); + $item['subscription']['customer_id'] = $this->customer->getId(); + $item['subscription']['payment_address_id'] = $order_info['payment_address_id']; + $item['subscription']['payment_method'] = $order_info['payment_method']; + $item['subscription']['shipping_address_id'] = $order_info['shipping_address_id']; + $item['subscription']['shipping_method'] = $order_info['shipping_method']; + $item['subscription']['quantity'] = $order_product['quantity']; + $item['subscription']['comment'] = $order_info['comment']; + $item['subscription']['affiliate_id'] = $order_info['affiliate_id']; + $item['subscription']['marketing_id'] = $order_info['marketing_id']; + $item['subscription']['tracking'] = $order_info['tracking']; + $item['subscription']['language_id'] = $order_info['language_id']; + $item['subscription']['currency_id'] = $order_info['currency_id']; + $item['subscription']['ip'] = $ip; + $item['subscription']['forwarded_ip'] = $forwarded_ip; + $item['subscription']['user_agent'] = $user_agent; + $item['subscription']['accept_language'] = $accept_language; $this->model_extension_payment_paypal->subscriptionPayment($item, $order_info, $paypal_order_data); } @@ -2609,18 +2750,63 @@ public function completeOrder(): void { } if (($capture_status == 'COMPLETED') || ($capture_status == 'PENDING')) { - $subscriptions = $this->cart->getSubscriptions(); - + $subscription_products = $this->cart->getSubscriptions(); + $order_products = $this->model_checkout_order->getProducts($this->session->data['order_id']); - - // Loop through any products that are subscription items - foreach ($subscriptions as $item) { + + if (isset($this->request->server['HTTP_X_REAL_IP'])) { + $ip = $this->request->server['HTTP_X_REAL_IP']; + } elseif (isset($this->request->server['REMOTE_ADDR'])) { + $ip = $this->request->server['REMOTE_ADDR']; + } else { + $ip = ''; + } + + if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) { + $forwarded_ip = $this->request->server['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) { + $forwarded_ip = $this->request->server['HTTP_CLIENT_IP']; + } else { + $forwarded_ip = ''; + } + + if (isset($this->request->server['HTTP_USER_AGENT'])) { + $user_agent = $this->request->server['HTTP_USER_AGENT']; + } else { + $user_agent = ''; + } + + if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) { + $accept_language = $this->request->server['HTTP_ACCEPT_LANGUAGE']; + } else { + $accept_language = ''; + } + + foreach ($subscription_products as $item) { foreach ($order_products as $order_product) { $order_subscription = $this->model_checkout_order->getSubscription($this->session->data['order_id'], $order_product['order_product_id']); - - if ($order_subscription && $item['product_id'] == $order_subscription['product_id'] && $order_subscription['product_id'] == $order_product['product_id']) { - $item['subscription']['name'] = $order_product['name']; - + + if ($order_subscription && $order_product['product_id'] == $item['product_id'] && $item['product_id'] == $order_subscription['product_id']) { + $item['subscription']['order_product_id'] = $order_product['order_product_id']; + $item['subscription']['product_id'] = $order_product['product_id']; + $item['subscription']['store_id'] = $this->config->get('config_store_id'); + $item['subscription']['customer_id'] = $this->customer->getId(); + $item['subscription']['payment_address_id'] = $order_info['payment_address_id']; + $item['subscription']['payment_method'] = $order_info['payment_method']; + $item['subscription']['shipping_address_id'] = $order_info['shipping_address_id']; + $item['subscription']['shipping_method'] = $order_info['shipping_method']; + $item['subscription']['quantity'] = $order_product['quantity']; + $item['subscription']['comment'] = $order_info['comment']; + $item['subscription']['affiliate_id'] = $order_info['affiliate_id']; + $item['subscription']['marketing_id'] = $order_info['marketing_id']; + $item['subscription']['tracking'] = $order_info['tracking']; + $item['subscription']['language_id'] = $order_info['language_id']; + $item['subscription']['currency_id'] = $order_info['currency_id']; + $item['subscription']['ip'] = $ip; + $item['subscription']['forwarded_ip'] = $forwarded_ip; + $item['subscription']['user_agent'] = $user_agent; + $item['subscription']['accept_language'] = $accept_language; + $this->model_extension_payment_paypal->subscriptionPayment($item, $order_info, $paypal_order_data); } } diff --git a/upload/catalog/controller/extension/payment/sagepay_server.php b/upload/catalog/controller/extension/payment/sagepay_server.php index b58470a1f..dc160d892 100644 --- a/upload/catalog/controller/extension/payment/sagepay_server.php +++ b/upload/catalog/controller/extension/payment/sagepay_server.php @@ -178,8 +178,64 @@ public function send(): void { // Loop through any products that are subscription items $subscription_products = $this->cart->getSubscriptions(); + $order_products = $this->model_checkout_order->getProducts($this->session->data['order_id']); + + if (isset($this->request->server['HTTP_X_REAL_IP'])) { + $ip = $this->request->server['HTTP_X_REAL_IP']; + } elseif (isset($this->request->server['REMOTE_ADDR'])) { + $ip = $this->request->server['REMOTE_ADDR']; + } else { + $ip = ''; + } + + if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) { + $forwarded_ip = $this->request->server['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) { + $forwarded_ip = $this->request->server['HTTP_CLIENT_IP']; + } else { + $forwarded_ip = ''; + } + + if (isset($this->request->server['HTTP_USER_AGENT'])) { + $user_agent = $this->request->server['HTTP_USER_AGENT']; + } else { + $user_agent = ''; + } + + if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) { + $accept_language = $this->request->server['HTTP_ACCEPT_LANGUAGE']; + } else { + $accept_language = ''; + } + foreach ($subscription_products as $item) { - $this->model_extension_payment_sagepay_server->addRecurringPayment($item, $payment_data['VendorTxCode']); + foreach ($order_products as $order_product) { + $order_subscription = $this->model_checkout_order->getSubscription($this->session->data['order_id'], $order_product['order_product_id']); + + if ($order_subscription && $order_product['product_id'] == $item['product_id'] && $item['product_id'] == $order_subscription['product_id']) { + $item['subscription']['order_product_id'] = $order_product['order_product_id']; + $item['subscription']['product_id'] = $order_product['product_id']; + $item['subscription']['store_id'] = $this->config->get('config_store_id'); + $item['subscription']['customer_id'] = $this->customer->getId(); + $item['subscription']['payment_address_id'] = $order_info['payment_address_id']; + $item['subscription']['payment_method'] = $order_info['payment_method']; + $item['subscription']['shipping_address_id'] = $order_info['shipping_address_id']; + $item['subscription']['shipping_method'] = $order_info['shipping_method']; + $item['subscription']['quantity'] = $order_product['quantity']; + $item['subscription']['comment'] = $order_info['comment']; + $item['subscription']['affiliate_id'] = $order_info['affiliate_id']; + $item['subscription']['marketing_id'] = $order_info['marketing_id']; + $item['subscription']['tracking'] = $order_info['tracking']; + $item['subscription']['language_id'] = $order_info['language_id']; + $item['subscription']['currency_id'] = $order_info['currency_id']; + $item['subscription']['ip'] = $ip; + $item['subscription']['forwarded_ip'] = $forwarded_ip; + $item['subscription']['user_agent'] = $user_agent; + $item['subscription']['accept_language'] = $accept_language; + + $this->model_extension_payment_sagepay_server->subscriptionPayment($item, $payment_data['VendorTxCode']); + } + } } } } else { @@ -442,11 +498,70 @@ public function success(): void { if ($order_details && $order_details['vendor_tx_code']) { if ($this->config->get('payment_sagepay_server_transaction') == 'PAYMENT') { - $subscription_products = $this->model_extension_payment_sagepay_server->getRecurringOrders($this->session->data['order_id']); + $subscription_products = $this->cart->getSubscriptions(); + + $order_products = $this->model_checkout_order->getProducts($this->session->data['order_id']); + + if (isset($this->request->server['HTTP_X_REAL_IP'])) { + $ip = $this->request->server['HTTP_X_REAL_IP']; + } elseif (isset($this->request->server['REMOTE_ADDR'])) { + $ip = $this->request->server['REMOTE_ADDR']; + } else { + $ip = ''; + } + + if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) { + $forwarded_ip = $this->request->server['HTTP_X_FORWARDED_FOR']; + } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) { + $forwarded_ip = $this->request->server['HTTP_CLIENT_IP']; + } else { + $forwarded_ip = ''; + } + + if (isset($this->request->server['HTTP_USER_AGENT'])) { + $user_agent = $this->request->server['HTTP_USER_AGENT']; + } else { + $user_agent = ''; + } + + if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) { + $accept_language = $this->request->server['HTTP_ACCEPT_LANGUAGE']; + } else { + $accept_language = ''; + } + + $payment_data = []; + + $payment_data['VendorTxCode'] = $this->session->data['order_id'] . 'T' . date('YmdHis') . mt_rand(1, 999); - // Loop through any products that are subscription items foreach ($subscription_products as $item) { - $this->model_extension_payment_sagepay_server->updateRecurringPayment($item, $order_details); + foreach ($order_products as $order_product) { + $order_subscription = $this->model_checkout_order->getSubscription($this->session->data['order_id'], $order_product['order_product_id']); + + if ($order_subscription && $order_product['product_id'] == $item['product_id'] && $item['product_id'] == $order_subscription['product_id']) { + $item['subscription']['order_product_id'] = $order_product['order_product_id']; + $item['subscription']['product_id'] = $order_product['product_id']; + $item['subscription']['store_id'] = $this->config->get('config_store_id'); + $item['subscription']['customer_id'] = $this->customer->getId(); + $item['subscription']['payment_address_id'] = $order_info['payment_address_id']; + $item['subscription']['payment_method'] = $order_info['payment_method']; + $item['subscription']['shipping_address_id'] = $order_info['shipping_address_id']; + $item['subscription']['shipping_method'] = $order_info['shipping_method']; + $item['subscription']['quantity'] = $order_product['quantity']; + $item['subscription']['comment'] = $order_info['comment']; + $item['subscription']['affiliate_id'] = $order_info['affiliate_id']; + $item['subscription']['marketing_id'] = $order_info['marketing_id']; + $item['subscription']['tracking'] = $order_info['tracking']; + $item['subscription']['language_id'] = $order_info['language_id']; + $item['subscription']['currency_id'] = $order_info['currency_id']; + $item['subscription']['ip'] = $ip; + $item['subscription']['forwarded_ip'] = $forwarded_ip; + $item['subscription']['user_agent'] = $user_agent; + $item['subscription']['accept_language'] = $accept_language; + + $this->model_extension_payment_sagepay_server->subscriptionPayment($item, $payment_data['VendorTxCode']); + } + } } } } diff --git a/upload/catalog/language/en-gb/extension/payment/paypal.php b/upload/catalog/language/en-gb/extension/payment/paypal.php index 968fc6d84..9ce93b1fc 100644 --- a/upload/catalog/language/en-gb/extension/payment/paypal.php +++ b/upload/catalog/language/en-gb/extension/payment/paypal.php @@ -1,102 +1,102 @@ contact us.'; -$_['error_order_completed'] = 'We could not process your payment. The payment was authorized or the authorized payment was captured for the order. Please contact us.'; -$_['error_authorization_captured'] = 'We could not process your payment. The authorized payment has one or more captures against it. The sum of these captured payments is greater than the amount of the original authorized payment. Please contact us.'; -$_['error_authorization_denied'] = 'We could not process the transaction with this card. The funds could not be captured. Please try a different funding source.'; -$_['error_authorization_expired'] = 'We could not process your payment. The authorized payment has expired. Please contact us.'; -$_['error_capture_declined'] = 'We could not process the transaction with this card. The funds could not be captured. Please try a different funding source.'; -$_['error_capture_failed'] = 'We could not process your payment. There was an error while capturing payment. Please contact us.'; -$_['error_3ds_failed_authentication'] = 'We could not process the transaction with this card. You may have failed the challenge or the device was not verified.'; -$_['error_3ds_rejected_authentication'] = 'We could not process the transaction with this card. 3D Secure authentication was skipped by you.'; -$_['error_3ds_attempted_authentication'] = 'We could not process the transaction with this card. Card is not enrolled in 3D Secure as card issuing bank is not participating in 3D Secure.'; -$_['error_3ds_unable_authentication'] = 'We could not process the transaction with this card. Issuing bank is not able to complete authentication.'; -$_['error_3ds_challenge_authentication'] = 'We could not process the transaction with this card. Challenge required for authentication.'; -$_['error_3ds_card_ineligible'] = 'We could not process the transaction with this card. Card type and issuing bank are not ready to complete a 3D Secure authentication.'; -$_['error_3ds_system_unavailable'] = 'We could not process the transaction with this card. An error occurred with the 3D Secure authentication system.'; -$_['error_3ds_system_bypassed'] = 'We could not process the transaction with this card. 3D Secure was skipped as authentication system did not require a challenge.'; -$_['error_payment'] = 'Please choose another payment method or contact us.'; -$_['error_timeout'] = 'Sorry, PayPal is currently busy. Please try again later!'; +$_['error_warning'] = 'Please check the form carefully for errors.'; +$_['error_stock'] = 'Products marked with *** are not available in the desired quantity or not in stock!'; +$_['error_minimum'] = 'Minimum order amount for %s is %s!'; +$_['error_required'] = '%s required!'; +$_['error_product'] = 'Warning: There are no products in your cart!'; +$_['error_subscription_required'] = 'Please select a subscription payment!'; +$_['error_unavailable'] = 'Please use the full checkout with this order!'; +$_['error_shipping'] = 'Warning: Shipping method required!'; +$_['error_no_shipping'] = 'Warning: No Shipping options are available.'; +$_['error_firstname'] = 'First Name must be between 1 and 32 characters!'; +$_['error_lastname'] = 'Last Name must be between 1 and 32 characters!'; +$_['error_email'] = 'E-Mail address does not appear to be valid!'; +$_['error_telephone'] = 'Telephone must be between 3 and 32 characters!'; +$_['error_password'] = 'Password must be between 4 and 20 characters!'; +$_['error_confirm'] = 'Password confirmation does not match password!'; +$_['error_address_1'] = 'Address 1 must be between 3 and 128 characters!'; +$_['error_city'] = 'City must be between 2 and 128 characters!'; +$_['error_postcode'] = 'Postcode must be between 2 and 10 characters!'; +$_['error_country'] = 'Please select a country!'; +$_['error_zone'] = 'Please select a region / state!'; +$_['error_agree'] = 'Warning: You must agree to the %s!'; +$_['error_address'] = 'Warning: You must select address!'; +$_['error_custom_field'] = '%s required!'; +$_['error_order_voided'] = 'We could not process your payment. All purchase units in the order are voided. Please contact us.'; +$_['error_order_completed'] = 'We could not process your payment. The payment was authorized or the authorized payment was captured for the order. Please contact us.'; +$_['error_authorization_captured'] = 'We could not process your payment. The authorized payment has one or more captures against it. The sum of these captured payments is greater than the amount of the original authorized payment. Please contact us.'; +$_['error_authorization_denied'] = 'We could not process the transaction with this card. The funds could not be captured. Please try a different funding source.'; +$_['error_authorization_expired'] = 'We could not process your payment. The authorized payment has expired. Please contact us.'; +$_['error_capture_declined'] = 'We could not process the transaction with this card. The funds could not be captured. Please try a different funding source.'; +$_['error_capture_failed'] = 'We could not process your payment. There was an error while capturing payment. Please contact us.'; +$_['error_3ds_failed_authentication'] = 'We could not process the transaction with this card. You may have failed the challenge or the device was not verified.'; +$_['error_3ds_rejected_authentication'] = 'We could not process the transaction with this card. 3D Secure authentication was skipped by you.'; +$_['error_3ds_attempted_authentication'] = 'We could not process the transaction with this card. Card is not enrolled in 3D Secure as card issuing bank is not participating in 3D Secure.'; +$_['error_3ds_unable_authentication'] = 'We could not process the transaction with this card. Issuing bank is not able to complete authentication.'; +$_['error_3ds_challenge_authentication'] = 'We could not process the transaction with this card. Challenge required for authentication.'; +$_['error_3ds_card_ineligible'] = 'We could not process the transaction with this card. Card type and issuing bank are not ready to complete a 3D Secure authentication.'; +$_['error_3ds_system_unavailable'] = 'We could not process the transaction with this card. An error occurred with the 3D Secure authentication system.'; +$_['error_3ds_system_bypassed'] = 'We could not process the transaction with this card. 3D Secure was skipped as authentication system did not require a challenge.'; +$_['error_payment'] = 'Please choose another payment method or contact us.'; +$_['error_timeout'] = 'Sorry, PayPal is currently busy. Please try again later!'; \ No newline at end of file diff --git a/upload/catalog/model/catalog/subscription_plan.php b/upload/catalog/model/catalog/subscription_plan.php new file mode 100644 index 000000000..14035280f --- /dev/null +++ b/upload/catalog/model/catalog/subscription_plan.php @@ -0,0 +1,79 @@ + + */ + public function getSubscriptionPlan(int $subscription_plan_id): array { + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "subscription_plan` `sp` LEFT JOIN `" . DB_PREFIX . "subscription_plan_description` `spd` ON (`sp`.`subscription_plan_id` = `spd`.`subscription_plan_id`) WHERE `sp`.`subscription_plan_id` = '" . (int)$subscription_plan_id . "' AND `spd`.`language_id` = '" . (int)$this->config->get('config_language_id') . "'"); + + return $query->row; + } + + /** + * Get Subscription Plans + * + * @param array $data + * + * @return array> + */ + public function getSubscriptionPlans(array $data = []): array { + $sql = "SELECT * FROM `" . DB_PREFIX . "subscription_plan` `sp` LEFT JOIN `" . DB_PREFIX . "subscription_plan_description` `spd` ON (`sp`.`subscription_plan_id` = `spd`.`subscription_plan_id`) WHERE `spd`.`language_id` = '" . (int)$this->config->get('config_language_id') . "'"; + + if (!empty($data['filter_name'])) { + $sql .= " AND spd.`name` LIKE '" . $this->db->escape((string)$data['filter_name'] . '%') . "'"; + } + + $sort_data = [ + 'spd.name', + 'sp.sort_order' + ]; + + if (isset($data['sort']) && in_array($data['sort'], $sort_data)) { + $sql .= " ORDER BY " . $data['sort']; + } else { + $sql .= " ORDER BY `spd`.`name`"; + } + + if (isset($data['order']) && ($data['order'] == 'DESC')) { + $sql .= " DESC"; + } else { + $sql .= " ASC"; + } + + if (isset($data['start']) || isset($data['limit'])) { + if ($data['start'] < 0) { + $data['start'] = 0; + } + + if ($data['limit'] < 1) { + $data['limit'] = 20; + } + + $sql .= " LIMIT " . (int)$data['start'] . "," . (int)$data['limit']; + } + + $query = $this->db->query($sql); + + return $query->rows; + } + + /** + * Get Total Subscription Plans + * + * @return int + */ + public function getTotalSubscriptionPlans(): int { + $query = $this->db->query("SELECT COUNT(*) AS `total` FROM `" . DB_PREFIX . "subscription_plan`"); + + return (int)$query->row['total']; + } +} diff --git a/upload/catalog/model/extension/payment/paypal.php b/upload/catalog/model/extension/payment/paypal.php index 0c6e4d081..81deb25c0 100644 --- a/upload/catalog/model/extension/payment/paypal.php +++ b/upload/catalog/model/extension/payment/paypal.php @@ -162,13 +162,13 @@ public function getPayPalOrderSubscription(int $order_id): array { } public function addOrderSubscription(int $order_id, string $description, array $data, string $reference): int { - $this->db->query("INSERT INTO `" . DB_PREFIX . "order_subscription` SET `order_id` = '" . (int)$order_id . "', `product_id` = '" . (int)$data['product_id'] . "', `order_product_id` = '" . (int)$data['order_product_id'] . "', `subscription_plan_id` = '" . (int)$data['subscription']['subscription_plan_id'] . "', `frequency` = '" . $this->db->escape($data['subscription']['frequency']) . "', `cycle` = '" . (int)$data['subscription']['cycle'] . "', `duration` = '" . (int)$data['subscription']['duration'] . "', `price` = '" . (float)$data['subscription']['price'] . "', `tax` = '" . (float)$data['subscription']['tax'] . "', `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'] . "'"); + $this->db->query("INSERT INTO `" . DB_PREFIX . "order_subscription` SET `order_id` = '" . (int)$order_id . "', `product_id` = '" . (int)$data['subscription']['product_id'] . "', `order_product_id` = '" . (int)$data['subscription']['order_product_id'] . "', `subscription_plan_id` = '" . (int)$data['subscription']['subscription_plan_id'] . "', `frequency` = '" . $this->db->escape($data['subscription']['frequency']) . "', `cycle` = '" . (int)$data['subscription']['cycle'] . "', `duration` = '" . (int)$data['subscription']['duration'] . "', `price` = '" . (float)$data['subscription']['price'] . "', `tax` = '" . (float)$data['subscription']['tax'] . "', `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'] . "'"); return $this->db->getLastId(); } public function editOrderSubscriptionStatus(int $order_id, int $status): void { - $this->db->query("UPDATE `" . DB_PREFIX . "paypal_checkout_integration_order` SET `status` = '" . (int)$status . "' WHERE `order_id` = '" . (int)$order_id . "'"); + $this->db->query("UPDATE `" . DB_PREFIX . "paypal_checkout_integration_order_subscription` SET `status` = '" . (int)$status . "' WHERE `order_id` = '" . (int)$order_id . "'"); } public function deleteOrderSubscription(int $order_id): void { @@ -205,12 +205,14 @@ public function deleteOrderSubscriptionTransaction(int $order_id): void { * subscriptionPayment * * @param array $item - * @param array $order_data + * @param array $order_info * @param array $paypal_order_data * * @return void */ - public function subscriptionPayment(array $item, array $order_data, array $paypal_order_data): void { + public function subscriptionPayment(array $item, array $order_info, array $paypal_order_data): void { + $this->load->model('checkout/subscription'); + $_config = new Config(); $_config->load('paypal'); @@ -220,8 +222,6 @@ public function subscriptionPayment(array $item, array $order_data, array $paypa $transaction_method = $setting['general']['transaction_method']; - $recurring_name = $item['subscription']['name']; - if ($item['subscription']['trial_status'] == 1) { $price = $item['subscription']['trial_price']; $trial_amt = $this->currency->format($this->tax->calculate($item['subscription']['trial_price'], $item['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'], false, false) * $item['quantity'] . ' ' . $this->session->data['currency']; @@ -257,8 +257,6 @@ public function subscriptionPayment(array $item, array $order_data, array $paypa } } - $order_subscription_id = $this->addOrderSubscription($order_data['order_id'], $description, $item, $paypal_order_data['transaction_id']); - $next_payment = new \DateTime('now'); $trial_end = new \DateTime('now'); $subscription_end = new \DateTime('now'); @@ -284,7 +282,9 @@ public function subscriptionPayment(array $item, array $order_data, array $paypa $subscription_end = new \DateTime('0000-00-00'); } - $result = $this->createPayment($order_data, $paypal_order_data, $price, $order_subscription_id, $recurring_name); + $order_subscription_id = $this->addOrderSubscription($order_info['order_id'], $description, $item, $paypal_order_data['transaction_id']); + + $result = $this->createPayment($order_info, $paypal_order_data, $price, $order_subscription_id, $item['subscription']['name']); $transaction_status = ''; $transaction_id = ''; @@ -308,11 +308,11 @@ public function subscriptionPayment(array $item, array $order_data, array $paypa } if ($transaction_id && $transaction_status && $currency_code && $amount) { - $this->editOrderRecurringStatus($order_subscription_id, 1); + $this->editOrderSubscriptionStatus($order_info['order_id'], 1); $paypal_order_subscription_data = [ 'order_subscription_id' => $order_subscription_id, - 'order_id' => $order_data['order_id'], + 'order_id' => $order_info['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'), 'currency_code' => $currency_code, @@ -329,9 +329,11 @@ public function subscriptionPayment(array $item, array $order_data, array $paypa 'amount' => $amount ]; - $this->addOrderRecurringTransaction($order_subscription_transaction_data); + $this->addOrderSubscriptionTransaction($order_subscription_transaction_data); $this->editPayPalOrderSubscriptionNextPayment($order_subscription_id, date_format($next_payment, 'Y-m-d H:i:s')); + + $this->model_checkout_subscription->addSubscription($item['subscription']); } else { $order_subscription_transaction_data = [ 'order_subscription_id' => $order_subscription_id, @@ -340,7 +342,7 @@ public function subscriptionPayment(array $item, array $order_data, array $paypa 'amount' => $amount ]; - $this->addOrderRecurringTransaction($order_subscription_transaction_data); + $this->addOrderSubscriptionTransaction($order_subscription_transaction_data); } } } @@ -428,7 +430,7 @@ public function cronPayment(): void { 'amount' => $amount ]; - $this->addOrderRecurringTransaction($order_subscription_transaction_data); + $this->addOrderSubscriptionTransaction($order_subscription_transaction_data); $this->editPayPalOrderSubscriptionNextPayment($order_subscription['order_id'], date_format($next_payment, 'Y-m-d H:i:s')); } else { @@ -439,7 +441,7 @@ public function cronPayment(): void { 'amount' => $amount ]; - $this->addOrderRecurringTransaction($order_subscription_transaction_data); + $this->addOrderSubscriptionTransaction($order_subscription_transaction_data); } } } @@ -611,13 +613,13 @@ private function calculateSchedule(string $frequency, \DateTime $next_payment, i public function getAgreeStatus(): bool { $agree_status = true; - $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "country WHERE status = '1' AND (iso_code_2 = 'CU' OR iso_code_2 = 'IR' OR iso_code_2 = 'SY' OR iso_code_2 = 'KP')"); + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "country` WHERE `status` = '1' AND (`iso_code_2` = 'CU' OR `iso_code_2` = 'IR' OR `iso_code_2` = 'SY' OR `iso_code_2` = 'KP')"); if ($query->rows) { $agree_status = false; } - $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "zone WHERE country_id = '220' AND status = '1' AND (`code` = '43' OR `code` = '14' OR `code` = '09')"); + $query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "zone` WHERE `country_id` = '220' AND `status` = '1' AND (`code` = '43' OR `code` = '14' OR `code` = '09')"); if ($query->rows) { $agree_status = false; @@ -660,18 +662,16 @@ public function update(): void { $this->db->query("CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "paypal_checkout_integration_order_subscription` ( `paypal_subscription_id` int(11) NOT NULL AUTO_INCREMENT, `order_id` int(11) NOT NULL, - `order_id` int(11) NOT NULL, `next_payment` datetime NOT NULL, `trial_end` datetime DEFAULT NULL, `subscription_end` datetime DEFAULT NULL, `currency_code` varchar(3) NOT NULL, - `total` decimal(10, 2) NOT NULL, + `total` decimal(10, 2) NOT NULL, `date_added` datetime NOT NULL, `date_modified` datetime NOT NULL, PRIMARY KEY (`paypal_subscription_id`), - KEY (`order_id`), - KEY (`subscription_id`)) - ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci"); + KEY (`order_id`) + ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci"); $this->db->query(" CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "order_subscription_transaction` ( @@ -700,9 +700,9 @@ public function update(): void { $config_setting = $_config->get('paypal_setting'); - $this->db->query("DELETE FROM `" . DB_PREFIX . "setting` WHERE store_id = '0' AND `code` = 'paypal_version'"); + $this->db->query("DELETE FROM `" . DB_PREFIX . "setting` WHERE `store_id` = '0' AND `code` = 'paypal_version'"); - $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']) . "'"); + $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']) . "'"); } /** diff --git a/upload/catalog/model/extension/payment/sagepay_server.php b/upload/catalog/model/extension/payment/sagepay_server.php index 0c1a0da4b..6fae62806 100644 --- a/upload/catalog/model/extension/payment/sagepay_server.php +++ b/upload/catalog/model/extension/payment/sagepay_server.php @@ -118,7 +118,7 @@ public function deleteCard(int $card_id): void { public function addOrder(array $order_info): void { $this->db->query("DELETE FROM `" . DB_PREFIX . "sagepay_server_order` WHERE `order_id` = '" . (int)$order_info['order_id'] . "'"); - $this->db->query("INSERT INTO `" . DB_PREFIX . "sagepay_server_order` SET `order_id` = '" . (int)$order_info['order_id'] . "', `customer_id` = '" . (int)$this->customer->getId() . "', `vps_tx_id` = '" . $this->db->escape($order_info['VPSTxId']) . "', `vendor_tx_code` = '" . $this->db->escape($order_info['VendorTxCode']) . "', `security_key` = '" . $this->db->escape($order_info['SecurityKey']) . "', `date_added` = NOW(), `date_modified` = NOW(), `currency_code` = '" . $this->db->escape($order_info['currency_code']) . "', `total` = '" . $this->currency->format($order_info['total'], $order_info['currency_code'], false, false) . "'"); + $this->db->query("INSERT INTO `" . DB_PREFIX . "sagepay_server_order` SET `order_id` = '" . (int)$order_info['order_id'] . "', `customer_id` = '" . (int)$this->customer->getId() . "', `vps_tx_id` = '" . $this->db->escape($order_info['VPSTxId']) . "', `vendor_tx_code` = '" . $this->db->escape($order_info['VendorTxCode']) . "', `security_key` = '" . $this->db->escape($order_info['SecurityKey']) . "', `currency_code` = '" . $this->db->escape($order_info['currency_code']) . "', `total` = '" . $this->currency->format($order_info['total'], $order_info['currency_code'], false, false) . "', `date_added` = NOW(), `date_modified` = NOW()"); } /** @@ -224,33 +224,14 @@ public function getReference(string $vendor_tx_code): array { * * @return void */ - public function addRecurringPayment(array $item, string $vendor_tx_code): void { + public function subscriptionPayment(array $item, string $vendor_tx_code): void { $this->load->language('extension/payment/sagepay_server'); // Subscriptions $this->load->model('checkout/subscription'); - // Trial information - if ($item['subscription']['trial_status'] == 1) { - $trial_amt = $this->currency->format($this->tax->calculate($item['subscription']['trial_price'], $item['subscription']['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'], false, false) * $item['subscription']['quantity'] . ' ' . $this->session->data['currency']; - $trial_text = sprintf($this->language->get('text_trial'), $trial_amt, $item['subscription']['trial_cycle'], $item['subscription']['trial_frequency'], $item['subscription']['trial_duration']); - } else { - $trial_text = ''; - } - - $subscription_amt = $this->currency->format($this->tax->calculate($item['subscription']['price'], $item['subscription']['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'], false, false) * $item['subscription']['quantity'] . ' ' . $this->session->data['currency']; - $subscription_description = $trial_text . sprintf($this->language->get('text_subscription'), $subscription_amt, $item['subscription']['cycle'], $item['subscription']['frequency']); - - $item['subscription']['description'] = []; - - if ($item['subscription']['duration'] > 0) { - $subscription_description .= sprintf($this->language->get('text_length'), $item['subscription']['duration']); - } - - $item['subscription']['description'] = $subscription_description; - // Create new subscription and set to pending status as no payment has been made yet. - $subscription_id = $this->model_checkout_subscription->addSubscription($item['subscription']['subscription']); + $subscription_id = $this->model_checkout_subscription->addSubscription($item['subscription']); //$this->model_checkout_subscription->editReference($subscription_id, $vendor_tx_code); } diff --git a/upload/catalog/view/theme/default/template/extension/payment/paypal/confirm.twig b/upload/catalog/view/theme/default/template/extension/payment/paypal/confirm.twig index 364dff52f..6d000e8ef 100644 --- a/upload/catalog/view/theme/default/template/extension/payment/paypal/confirm.twig +++ b/upload/catalog/view/theme/default/template/extension/payment/paypal/confirm.twig @@ -336,27 +336,27 @@ {{ footer }} \ No newline at end of file diff --git a/upload/catalog/view/theme/default/template/extension/payment/paypal/paypal.twig b/upload/catalog/view/theme/default/template/extension/payment/paypal/paypal.twig index ea47c9779..e68e4fbb8 100644 --- a/upload/catalog/view/theme/default/template/extension/payment/paypal/paypal.twig +++ b/upload/catalog/view/theme/default/template/extension/payment/paypal/paypal.twig @@ -42,33 +42,33 @@ {% endif %} {% else %} -
-
- +
+
+ +
-
- + {% endif %} \ No newline at end of file diff --git a/upload/catalog/view/theme/default/template/extension/subscription/paypal.twig b/upload/catalog/view/theme/default/template/extension/subscription/paypal.twig index 79935aa75..753190867 100644 --- a/upload/catalog/view/theme/default/template/extension/subscription/paypal.twig +++ b/upload/catalog/view/theme/default/template/extension/subscription/paypal.twig @@ -12,7 +12,7 @@ $('#paypal-subscription').on('click', '.button-enable-subscription', function() $.ajax({ type: 'post', url: '{{ enable_url }}', - data: { 'subscription_id' : '{{ subscription_id }}' }, + data: { 'order_subscription_id' : '{{ order_subscription_id }}' }, dataType: 'json', beforeSend: function() { $('#paypal-subscription .btn').prop('disabled', true);