Skip to content

Commit

Permalink
https://github.com/opencart/opencart/issues/11458
Browse files Browse the repository at this point in the history
  • Loading branch information
danielkerr committed May 4, 2023
1 parent 173cbbd commit 4cf46a2
Show file tree
Hide file tree
Showing 16 changed files with 401 additions and 122 deletions.
24 changes: 12 additions & 12 deletions upload/admin/model/sale/order.php
Expand Up @@ -236,6 +236,18 @@ public function getOrders(array $data = []): array {
return $query->rows;
}

public function getOrdersBySubscriptionId(int $subscription_id): array {
$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE `subscription_id` = '" . (int)$subscription_id . "'");

return $query->rows;
}

public function getTotalOrdersBySubscriptionId(int $subscription_id): int {
$query = $this->db->query("SELECT COUNT(*) AS `total` FROM `" . DB_PREFIX . "order` WHERE `subscription_id` = '" . (int)$subscription_id . "'");

return (int)$query->row['total'];
}

public function getProducts(int $order_id): array {
$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order_product` WHERE `order_id` = '" . (int)$order_id . "' ORDER BY order_product_id ASC");

Expand Down Expand Up @@ -278,12 +290,6 @@ public function getTotals(int $order_id): array {
return $query->rows;
}

public function getOrdersBySubscriptionId(int $subscription_id): array {
$query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE `subscription_id` = '" . (int)$subscription_id . "'");

return $query->rows;
}

public function getTotalOrders(array $data = []): int {
$sql = "SELECT COUNT(*) AS `total` FROM `" . DB_PREFIX . "order`";

Expand Down Expand Up @@ -354,12 +360,6 @@ public function getTotalOrdersByOrderStatusId(int $order_status_id): int {
return (int)$query->row['total'];
}

public function getTotalOrdersBySubscriptionId(int $subscription_id): int {
$query = $this->db->query("SELECT COUNT(*) AS `total` FROM `" . DB_PREFIX . "order` WHERE `subscription_id` = '" . (int)$subscription_id . "'");

return (int)$query->row['total'];
}

public function getTotalOrdersByProcessingStatus(): int {
$implode = [];

Expand Down
4 changes: 2 additions & 2 deletions upload/catalog/controller/account/order.php
Expand Up @@ -273,15 +273,15 @@ public function info(): object|null {

if ($subscription_info) {
if ($subscription_info['trial_status']) {
$trial_price = $this->currency->format($subscription_info['trial_price'], $this->config->get('config_currency'));
$trial_price = $this->currency->format($subscription_info['trial_price'] + ($this->config->get('config_tax') ? $subscription_info['trial_tax'] : 0), $this->config->get('config_currency'));
$trial_cycle = $subscription_info['trial_cycle'];
$trial_frequency = $this->language->get('text_' . $subscription_info['trial_frequency']);
$trial_duration = $subscription_info['trial_duration'];

$description .= sprintf($this->language->get('text_subscription_trial'), $trial_price, $trial_cycle, $trial_frequency, $trial_duration);
}

$price = $this->currency->format($subscription_info['price'], $this->config->get('config_currency'));
$price = $this->currency->format($subscription_info['price'] + ($this->config->get('config_tax') ? $subscription_info['tax'] : 0), $this->config->get('config_currency'));
$cycle = $subscription_info['cycle'];
$frequency = $this->language->get('text_' . $subscription_info['frequency']);
$duration = $subscription_info['duration'];
Expand Down
205 changes: 175 additions & 30 deletions upload/catalog/controller/account/subscription.php
Expand Up @@ -47,13 +47,63 @@ public function index(): void {

$this->load->model('account/subscription');
$this->load->model('account/order');
$this->load->model('catalog/product');
$this->load->model('localisation/currency');
$this->load->model('localisation/subscription_status');

$subscription_total = $this->model_account_subscription->getTotalSubscriptions();

$results = $this->model_account_subscription->getSubscriptions(($page - 1) * $limit, $limit);

foreach ($results as $result) {
$product_info = $this->model_catalog_product->getProduct($result['product_id']);

if ($product_info) {
$product = $product_info['name'];
} else {
$product = '';
}

$order_subscription_info = $this->model_account_order->getSubscription($result['order_id'], $result['order_product_id']);

if ($order_subscription_info) {
$trial_tax = $order_subscription_info['trial_tax'];
$tax = $order_subscription_info['tax'];
} else {
$trial_tax = 0;
$tax = 0;
}

$currency_info = $this->model_localisation_currency->getCurrency($result['currency_id']);

if ($currency_info) {
$currency = $currency_info['code'];
} else {
$currency = $this->config->get('config_currency');
}

$description = '';

if ($result['trial_status']) {
$trial_price = $this->currency->format($result['trial_price'] + ($this->config->get('config_tax') ? $trial_tax : 0), $currency);
$trial_cycle = $result['trial_cycle'];
$trial_frequency = $this->language->get('text_' . $result['trial_frequency']);
$trial_duration = $result['trial_duration'];

$description .= sprintf($this->language->get('text_subscription_trial'), $trial_price, $trial_cycle, $trial_frequency, $trial_duration);
}

$price = $this->currency->format($result['price'] + ($this->config->get('config_tax') ? $tax : 0), $currency);
$cycle = $result['cycle'];
$frequency = $this->language->get('text_' . $result['frequency']);
$duration = $result['duration'];

if ($duration) {
$description .= sprintf($this->language->get('text_subscription_duration'), $price, $cycle, $frequency, $duration);
} else {
$description .= sprintf($this->language->get('text_subscription_cancel'), $price, $cycle, $frequency);
}

$subscription_status_info = $this->model_localisation_subscription_status->getSubscriptionStatus($result['subscription_status_id']);

if ($subscription_status_info) {
Expand All @@ -65,7 +115,8 @@ public function index(): void {
$data['subscriptions'][] = [
'subscription_id' => $result['subscription_id'],
'product_id' => $result['product_id'],
'product_name' => $result['name'],
'product_name' => $product,
'description' => $description,
'product' => $this->url->link('product/product', 'language=' . $this->config->get('config_language') . '&product_id=' . $result['product_id']),
'status' => $subscription_status,
'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
Expand Down Expand Up @@ -173,45 +224,38 @@ public function info(): void {
$data['subscription_plan'] = '';
}

$data['description'] = '';

/*
// Orders
$this->load->model('account/order');
// $order_product = $this->model_account_order->getOrderProduct($subscription_info['order_id'], $subscription_info['order_product_id']);
$data['order_id'] = $subscription_info['order_id'];
// $data['reference'] = $subscription_info['reference'];
// $data['product_name'] = $order_product['name'];
if ($subscription_info['trial_status']) {
$trial_price = '';//$this->currency->format($this->tax->calculate($subscription_info['trial_price'], $product['tax_class_id'], $this->config->get('config_tax')), $subscription_info['currency']);
$trial_cycle = $subscription_info['trial_cycle'];
$trial_frequency = $this->language->get('text_' . $subscription_info['trial_frequency']);
$trial_duration = $subscription_info['trial_duration'];

$data['description'] .= sprintf($this->language->get('text_subscription_trial'), $trial_price, $trial_cycle, $trial_frequency, $trial_duration);
}

// Transactions
$data['transactions'] = [];
if ($this->customer->isLogged() || !$this->config->get('config_customer_price')) {
$price = '';//$this->currency->format($this->tax->calculate($subscription_info['price'], $product['tax_class_id'], $this->config->get('config_tax')), $subscription_info['currency']);
}

$results = $this->model_account_order->getOrdersBySubscriptionId($this->request->get['subscription_id']);
$cycle = $subscription_info['cycle'];
$frequency = $this->language->get('text_' . $subscription_info['frequency']);
$duration = $subscription_info['duration'];

foreach ($results as $result) {
$data['transactions'][] = [
'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
'type' => $result['type'],
'amount' => $this->currency->format($result['amount'], $subscription_info['currency_code'])
];
if ($duration) {
$data['description'] .= sprintf($this->language->get('text_subscription_duration'), $price, $cycle, $frequency, $duration);
} else {
$data['description'] .= sprintf($this->language->get('text_subscription_cancel'), $price, $cycle, $frequency);
}

// Orders
$data['history'] = $this->getHistory();
$data['orders'] = $this->getOrder();

$data['order'] = $this->url->link('account/order.info', 'language=' . $this->config->get('config_language') . '&customer_token=' . $this->session->data['customer_token'] . '&order_id=' . $subscription_info['order_id']);
$data['product'] = $this->url->link('product/product', 'language=' . $this->config->get('config_language') . '&customer_token=' . $this->session->data['customer_token'] . '&product_id=' . $subscription_info['product_id']);

$this->load->model('setting/extension');
$extension_info = $this->model_setting_extension->getExtensionByCode('payment', $subscription_info['payment']['code']);
if ($extension_info) {
$data['subscription'] = $this->load->controller('extension/' . $extension_info['extension'] . '/subscription/' . $subscription_info['payment']['code');
} else {
$data['subscription'] = '';
}
*/
$data['column_left'] = $this->load->controller('common/column_left');
$data['column_right'] = $this->load->controller('common/column_right');
$data['content_top'] = $this->load->controller('common/content_top');
Expand Down Expand Up @@ -257,4 +301,105 @@ public function info(): void {
$this->response->setOutput($this->load->view('error/not_found', $data));
}
}

public function order(): void {
$this->load->language('account/subscription');

$this->response->setOutput($this->getOrder());
}

public function getOrder(): string {
if (isset($this->request->get['subscription_id'])) {
$subscription_id = (int)$this->request->get['subscription_id'];
} else {
$subscription_id = 0;
}

if (isset($this->request->get['page']) && $this->request->get['route'] == 'account/subscription.order') {
$page = (int)$this->request->get['page'];
} else {
$page = 1;
}

$limit = 10;

$data['orders'] = [];

$this->load->model('account/order');

$results = $this->model_account_order->getOrdersBySubscriptionId($subscription_id, ($page - 1) * $limit, $limit);

foreach ($results as $result) {
$data['orders'][] = [
'order_id' => $result['order_id'],
'status' => $result['status'],
'total' => $this->currency->format($result['total'], $result['currency_code'], $result['currency_value']),
'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
'view' => $this->url->link('sale/subscription.order', 'user_token=' . $this->session->data['user_token'] . '&order_id=' . $result['order_id'] . '&page={page}')
];
}

$order_total = $this->model_account_order->getTotalOrdersBySubscriptionId($subscription_id);

$data['pagination'] = $this->load->controller('common/pagination', [
'total' => $order_total,
'page' => $page,
'limit' => $limit,
'url' => $this->url->link('sale/subscription.order', 'user_token=' . $this->session->data['user_token'] . '&subscription_id=' . $subscription_id . '&page={page}')
]);

$data['results'] = sprintf($this->language->get('text_pagination'), ($order_total) ? (($page - 1) * $limit) + 1 : 0, ((($page - 1) * $limit) > ($order_total - $limit)) ? $order_total : ((($page - 1) * $limit) + $limit), $order_total, ceil($order_total / $limit));

return $this->load->view('account/subscription_order', $data);
}

public function history(): void {
$this->load->language('account/subscription');

$this->response->setOutput($this->getHistory());
}

public function getHistory(): string {
if (isset($this->request->get['subscription_id'])) {
$subscription_id = (int)$this->request->get['subscription_id'];
} else {
$subscription_id = 0;
}

if (isset($this->request->get['page']) && $this->request->get['route'] == 'account/subscription.history') {
$page = (int)$this->request->get['page'];
} else {
$page = 1;
}

$limit = 10;

$data['histories'] = [];

$this->load->model('account/subscription');

$results = $this->model_account_subscription->getHistories($subscription_id, ($page - 1) * $limit, $limit);

foreach ($results as $result) {
$data['histories'][] = [
'status' => $result['status'],
'comment' => nl2br($result['comment']),
'notify' => $result['notify'] ? $this->language->get('text_yes') : $this->language->get('text_no'),
'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added']))
];
}

$subscription_total = $this->model_account_subscription->getTotalHistories($subscription_id);

$data['pagination'] = $this->load->controller('common/pagination', [
'total' => $subscription_total,
'page' => $page,
'limit' => $limit,
'url' => $this->url->link('account/subscription.history', 'user_token=' . $this->session->data['user_token'] . '&subscription_id=' . $subscription_id . '&page={page}')
]);

$data['results'] = sprintf($this->language->get('text_pagination'), ($subscription_total) ? (($page - 1) * $limit) + 1 : 0, ((($page - 1) * $limit) > ($subscription_total - $limit)) ? $subscription_total : ((($page - 1) * $limit) + $limit), $subscription_total, ceil($subscription_total / $limit));

return $this->load->view('account/subscription_history', $data);
}
}
4 changes: 2 additions & 2 deletions upload/catalog/controller/checkout/confirm.php
Expand Up @@ -199,8 +199,6 @@ public function index(): string {
}
}



$this->load->model('marketing/marketing');

$marketing_info = $this->model_marketing_marketing->getMarketingByCode($this->session->data['tracking']);
Expand Down Expand Up @@ -265,12 +263,14 @@ public function index(): string {
'subscription_plan_id' => $product['subscription']['subscription_plan_id'],
'name' => $product['subscription']['name'],
'trial_price' => $product['subscription']['trial_price'],
'trial_tax' => $this->tax->getTax($product['subscription']['trial_price'], $product['tax_class_id']),
'trial_frequency' => $product['subscription']['trial_frequency'],
'trial_cycle' => $product['subscription']['trial_cycle'],
'trial_duration' => $product['subscription']['trial_duration'],
'trial_remaining' => $product['subscription']['trial_remaining'],
'trial_status' => $product['subscription']['trial_status'],
'price' => $product['subscription']['price'],
'tax' => $this->tax->getTax($product['subscription']['price'], $product['tax_class_id']),
'frequency' => $product['subscription']['frequency'],
'cycle' => $product['subscription']['cycle'],
'duration' => $product['subscription']['duration']
Expand Down
6 changes: 3 additions & 3 deletions upload/catalog/controller/mail/order.php
Expand Up @@ -249,12 +249,12 @@ public function add(array $order_info, int $order_status_id, string $comment, bo
$description = '';

$this->load->model('checkout/order');
/*

$subscription_info = $this->model_checkout_order->getSubscription($order_info['order_id'], $order_product['order_product_id']);

if ($subscription_info) {
if ($subscription_info['trial_status']) {
$trial_price = $this->currency->format($this->tax->calculate($subscription_info['trial_price'], $order_product['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);
$trial_price = $this->currency->format($subscription_info['trial_price'] + ($this->config->get('config_tax') ? $subscription_info['trial_tax'] : 0), $this->config->get('config_tax')), $this->session->data['currency']);
$trial_cycle = $subscription_info['trial_cycle'];
$trial_frequency = $this->language->get('text_' . $subscription_info['trial_frequency']);
$trial_duration = $subscription_info['trial_duration'];
Expand All @@ -273,7 +273,7 @@ public function add(array $order_info, int $order_status_id, string $comment, bo
$description .= sprintf($this->language->get('text_subscription_cancel'), $price, $cycle, $frequency);
}
}
*/

$data['products'][] = [
'name' => $order_product['name'],
'model' => $order_product['model'],
Expand Down

0 comments on commit 4cf46a2

Please sign in to comment.