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 Dec 4, 2024
1 parent 88b861d commit 7f220eb
Show file tree
Hide file tree
Showing 24 changed files with 419 additions and 206 deletions.
28 changes: 28 additions & 0 deletions upload/admin/controller/catalog/subscription_plan.php
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,30 @@ public function form(): void {
'value' => 'year'
];

if (!empty($subscription_info)) {
$data['trial_frequency'] = $subscription_info['trial_frequency'];
} else {
$data['trial_frequency'] = '';
}

if (!empty($subscription_info)) {
$data['trial_duration'] = $subscription_info['trial_duration'];
} else {
$data['trial_duration'] = '0';
}

if (!empty($subscription_info)) {
$data['trial_cycle'] = $subscription_info['trial_cycle'];
} else {
$data['trial_cycle'] = '1';
}

if (!empty($subscription_info)) {
$data['trial_status'] = $subscription_info['trial_status'];
} else {
$data['trial_status'] = 0;
}

if (!empty($subscription_info)) {
$data['frequency'] = $subscription_info['frequency'];
} else {
Expand Down Expand Up @@ -312,6 +336,10 @@ public function save(): void {
}
}

if ($this->request->post['trial_duration'] && (int)$this->request->post['trial_duration'] < 1) {
$json['error']['trial_duration'] = $this->language->get('error_trial_duration');
}

if (isset($json['error']) && !isset($json['error']['warning'])) {
$json['error']['warning'] = $this->language->get('error_warning');
}
Expand Down
20 changes: 18 additions & 2 deletions upload/admin/controller/sale/order.php
Original file line number Diff line number Diff line change
Expand Up @@ -732,15 +732,23 @@ public function info(): void {
$subscription_info = $this->model_sale_order->getSubscription($order_id, $product['order_product_id']);

if ($subscription_info) {
if ($subscription_info['trial_status']) {
$trial_price = $this->currency->format($subscription_info['trial_price'], $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'];

$subscription_plan .= 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'));
$cycle = $subscription_info['cycle'];
$frequency = $this->language->get('text_' . $subscription_info['frequency']);
$duration = $subscription_info['duration'];

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

$subscription_plan_id = $subscription_info['subscription_plan_id'];
Expand Down Expand Up @@ -1410,6 +1418,14 @@ public function invoice(): void {
$subscription_info = $this->model_sale_order->getSubscription($order_id, $product['order_product_id']);

if ($subscription_info) {
if ($subscription_info['trial_status']) {
$trial_price = $this->currency->format($subscription_info['trial_price'], $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'));
$cycle = $subscription_info['cycle'];
$frequency = $this->language->get('text_' . $subscription_info['frequency']);
Expand Down
4 changes: 4 additions & 0 deletions upload/admin/language/en-gb/catalog/product.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
$_['text_points'] = 'Reward Points';
$_['text_from'] = 'From';
$_['text_to'] = 'To';
$_['text_subscription_trial'] = '%s every %d %s(s) for %d payment(s) then ';
$_['text_subscription_duration'] = '%s every %d %s(s) for %d payment(s)';
$_['text_subscription_cancel'] = '%s every %d %s(s) until canceled';
$_['text_subscription_duration'] = '%s every %d %s(s) for %d payment(s)';
$_['text_subscription_cancel'] = '%s every %d %s(s) until canceled';
$_['text_day'] = 'day';
Expand Down Expand Up @@ -82,6 +85,7 @@
$_['entry_minimum'] = 'Minimum Quantity';
$_['entry_stock_status'] = 'Out Of Stock Status';
$_['entry_price'] = 'Price';
$_['entry_trial_price'] = 'Trial Price';
$_['entry_tax_class'] = 'Tax Class';
$_['entry_points'] = 'Points';
$_['entry_subtract'] = 'Subtract Stock';
Expand Down
62 changes: 36 additions & 26 deletions upload/admin/language/en-gb/catalog/subscription_plan.php
Original file line number Diff line number Diff line change
@@ -1,38 +1,48 @@
<?php
// Heading
$_['heading_title'] = 'Subscription Plans';
$_['heading_title'] = 'Subscription Plans';

// Text
$_['text_success'] = 'Success: You have modified subscription plans!';
$_['text_list'] = 'Subscription Plan List';
$_['text_add'] = 'Add Subscription Plan';
$_['text_edit'] = 'Edit Subscription Plan';
$_['text_day'] = 'Day';
$_['text_week'] = 'Week';
$_['text_semi_month'] = 'Semi Month';
$_['text_month'] = 'Month';
$_['text_year'] = 'Year';
$_['text_success'] = 'Success: You have modified subscription plans!';
$_['text_list'] = 'Subscription Plan List';
$_['text_add'] = 'Add Subscription Plan';
$_['text_edit'] = 'Edit Subscription Plan';
$_['text_subscription'] = 'Subscription';
$_['text_trial'] = 'Trial';
$_['text_day'] = 'Day';
$_['text_week'] = 'Week';
$_['text_semi_month'] = 'Semi Month';
$_['text_month'] = 'Month';
$_['text_year'] = 'Year';

// Entry
$_['entry_name'] = 'Subscription Plan Name';
$_['entry_duration'] = 'Duration';
$_['entry_cycle'] = 'Cycle';
$_['entry_frequency'] = 'Frequency';
$_['entry_status'] = 'Status';
$_['entry_sort_order'] = 'Sort Order';
$_['entry_name'] = 'Subscription Plan Name';
$_['entry_trial_duration'] = 'Trial Duration';
$_['entry_trial_cycle'] = 'Trial Cycle';
$_['entry_trial_frequency'] = 'Trial Frequency';
$_['entry_trial_status'] = 'Trial Status';
$_['entry_duration'] = 'Duration';
$_['entry_cycle'] = 'Cycle';
$_['entry_frequency'] = 'Frequency';
$_['entry_status'] = 'Status';
$_['entry_sort_order'] = 'Sort Order';

// Column
$_['column_name'] = 'Subscription Plan Name';
$_['column_sort_order'] = 'Sort Order';
$_['column_action'] = 'Action';
$_['column_name'] = 'Subscription Plan Name';
$_['column_sort_order'] = 'Sort Order';
$_['column_action'] = 'Action';

// Help
$_['help_duration'] = 'The duration is the number of times the user will make a payment, set this to 0 if you want payments until they are cancelled.';
$_['help_cycle'] = 'Subscription amounts are calculated by the frequency and cycles.';
$_['help_frequency'] = 'If you use a frequency of "week" and a cycle of "2", then the user will be billed every 2 weeks.';
$_['help_trial_duration'] = 'The duration is the number of times the user will make a payment.';
$_['help_trial_cycle'] = 'Subscription amounts are calculated by the frequency and cycles.';
$_['help_trial_frequency'] = 'If you use a frequency of "week" and a cycle of "2", then the user will be billed every 2 weeks.';
$_['help_duration'] = 'The duration is the number of times the user will make a payment, set this to 0 if you want payments until they are cancelled.';
$_['help_cycle'] = 'Subscription amounts are calculated by the frequency and cycles.';
$_['help_frequency'] = 'If you use a frequency of "week" and a cycle of "2", then the user will be billed every 2 weeks.';

// Error
$_['error_warning'] = 'Warning: Please check the form carefully for errors!';
$_['error_permission'] = 'Warning: You do not have permission to modify subscription plans!';
$_['error_name'] = 'Subscription Plan Name must be greater than 3 and less than 255 characters!';
$_['error_product'] = 'Warning: This subscription plans cannot be deleted as it is currently assigned to %s products!';
$_['error_warning'] = 'Warning: Please check the form carefully for errors!';
$_['error_permission'] = 'Warning: You do not have permission to modify subscription plans!';
$_['error_name'] = 'Subscription Plan Name must be greater than 3 and less than 255 characters!';
$_['error_trial_duration'] = 'Trial duration must be greater than 0!';
$_['error_product'] = 'Warning: This subscription plans cannot be deleted as it is currently assigned to %s products!';
1 change: 1 addition & 0 deletions upload/admin/language/en-gb/sale/subscription.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
$_['text_subscription'] = 'Subscription';
$_['text_date_next'] = 'Date Next';
$_['text_remaining'] = 'Remaining';
$_['text_subscription_trial'] = '%s every %d %s(s) for %d payment(s) then ';
$_['text_subscription_duration'] = '%s every %d %s(s) for %d payment(s)';
$_['text_subscription_cancel'] = '%s every %d %s(s) until canceled';
$_['text_cancel'] = 'Until Canceled';
Expand Down
2 changes: 1 addition & 1 deletion upload/admin/model/catalog/product.php
Original file line number Diff line number Diff line change
Expand Up @@ -1893,7 +1893,7 @@ public function addSubscription(int $product_id, array $data): void {
$query = $this->db->query("SELECT `product_id` FROM `" . DB_PREFIX . "product_subscription` WHERE `product_id` = '" . (int)$product_id . "' AND `customer_group_id` = '" . (int)$data['customer_group_id'] . "' AND `subscription_plan_id` = '" . (int)$data['subscription_plan_id'] . "'");

if (!$query->num_rows) {
$this->db->query("INSERT INTO `" . DB_PREFIX . "product_subscription` SET `product_id` = '" . (int)$product_id . "', `customer_group_id` = '" . (int)$data['customer_group_id'] . "', `subscription_plan_id` = '" . (int)$data['subscription_plan_id'] . "'");
$this->db->query("INSERT INTO `" . DB_PREFIX . "product_subscription` SET `product_id` = '" . (int)$product_id . "', `customer_group_id` = '" . (int)$data['customer_group_id'] . "', `subscription_plan_id` = '" . (int)$data['subscription_plan_id'] . "', `trial_price` = '" . (float)$data['trial_price'] . "', `price` = '" . (float)$data['price'] . "'");
}
}

Expand Down
4 changes: 2 additions & 2 deletions upload/admin/model/catalog/subscription_plan.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class SubscriptionPlan extends \Opencart\System\Engine\Model {
* @return int
*/
public function addSubscriptionPlan(array $data): int {
$this->db->query("INSERT INTO `" . DB_PREFIX . "subscription_plan` SET `frequency` = '" . $this->db->escape((string)$data['frequency']) . "', `duration` = '" . (int)$data['duration'] . "', `cycle` = '" . (int)$data['cycle'] . "', `status` = '" . (bool)($data['status'] ?? 0) . "', `sort_order` = '" . (int)$data['sort_order'] . "'");
$this->db->query("INSERT INTO `" . DB_PREFIX . "subscription_plan` SET `trial_frequency` = '" . $this->db->escape((string)$data['trial_frequency']) . "', `trial_duration` = '" . (int)$data['trial_duration'] . "', `trial_cycle` = '" . (int)$data['trial_cycle'] . "', `trial_status` = '" . (int)$data['trial_status'] . "', `frequency` = '" . $this->db->escape((string)$data['frequency']) . "', `duration` = '" . (int)$data['duration'] . "', `cycle` = '" . (int)$data['cycle'] . "', `status` = '" . (bool)$data['status'] . "', `sort_order` = '" . (int)$data['sort_order'] . "'");

$subscription_plan_id = $this->db->getLastId();

Expand All @@ -34,7 +34,7 @@ public function addSubscriptionPlan(array $data): int {
* @return void
*/
public function editSubscriptionPlan(int $subscription_plan_id, array $data): void {
$this->db->query("UPDATE `" . DB_PREFIX . "subscription_plan` SET `frequency` = '" . $this->db->escape((string)$data['frequency']) . "', `duration` = '" . (int)$data['duration'] . "', `cycle` = '" . (int)$data['cycle'] . "', `status` = '" . (bool)($data['status'] ?? 0) . "', `sort_order` = '" . (int)$data['sort_order'] . "' WHERE `subscription_plan_id` = '" . (int)$subscription_plan_id . "'");
$this->db->query("UPDATE `" . DB_PREFIX . "subscription_plan` SET `trial_frequency` = '" . $this->db->escape((string)$data['trial_frequency']) . "', `trial_duration` = '" . (int)$data['trial_duration'] . "', `trial_cycle` = '" . (int)$data['trial_cycle'] . "', `trial_status` = '" . (int)$data['trial_status'] . "', `frequency` = '" . $this->db->escape((string)$data['frequency']) . "', `duration` = '" . (int)$data['duration'] . "', `cycle` = '" . (int)$data['cycle'] . "', `status` = '" . (bool)$data['status'] . "', `sort_order` = '" . (int)$data['sort_order'] . "' WHERE `subscription_plan_id` = '" . (int)$subscription_plan_id . "'");

$this->model_catalog_subscription_plan->deleteDescriptions($subscription_plan_id);

Expand Down
2 changes: 1 addition & 1 deletion upload/admin/model/sale/subscription.php
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ public function getTotalSubscriptionsBySubscriptionStatusId(int $subscription_st
* @return void
*/
public function addProduct(int $subscription_id, array $data): void {
$this->db->query("INSERT INTO `" . DB_PREFIX . "subscription_product` SET `subscription_id` = '" . (int)$subscription_id . "', `order_product_id` = '" . (int)$data['order_product_id'] . "', `order_id` = '" . (int)$data['order_id'] . "', `product_id` = '" . (int)$data['product_id'] . "', `option` = '" . $this->db->escape($data['option'] ? json_encode($data['option']) : '') . "', `quantity` = '" . (int)$data['quantity'] . "', `price` = '" . (float)$data['price'] . "'");
$this->db->query("INSERT INTO `" . DB_PREFIX . "subscription_product` SET `subscription_id` = '" . (int)$subscription_id . "', `order_product_id` = '" . (int)$data['order_product_id'] . "', `order_id` = '" . (int)$data['order_id'] . "', `product_id` = '" . (int)$data['product_id'] . "', `option` = '" . $this->db->escape($data['option'] ? json_encode($data['option']) : '') . "', `quantity` = '" . (int)$data['quantity'] . "', `trial_price` = '" . (float)$data['trial_price'] . "', `price` = '" . (float)$data['price'] . "'");
}

/**
Expand Down
15 changes: 11 additions & 4 deletions upload/admin/view/template/catalog/product_form.twig
Original file line number Diff line number Diff line change
Expand Up @@ -383,7 +383,8 @@
{% if master_id %}
<div class="input-group-text">
<div class="form-check form-switch">
<input type="checkbox" name="override[date_available]" value="1" id="input-variant-date-available" data-oc-toggle="switch" data-oc-target="#input-date-available" class="form-check-input"{% if override.date_available %} checked{% endif %}/> <label for="input-variant-date-available" class="form-check-label"></label>
<input type="checkbox" name="override[date_available]" value="1" id="input-variant-date-available" data-oc-toggle="switch" data-oc-target="#input-date-available" class="form-check-input"{% if override.date_available %} checked{% endif %}/>
<label for="input-variant-date-available" class="form-check-label"></label>
</div>
</div>
{% endif %}
Expand Down Expand Up @@ -704,8 +705,8 @@
{% for product_attribute in product_attributes %}
<tr id="attribute-row-{{ attribute_row }}">
<td>

<input type="hidden" name="product_attribute[{{ attribute_row }}][attribute_id]" value="{{ product_attribute.attribute_id }}" id="input-attribute-id-{{ attribute_row }}"/> <input type="text" name="product_attribute[{{ attribute_row }}][name]" value="{{ product_attribute.name }}" placeholder="{{ entry_attribute }}" id="input-attribute-{{ attribute_row }}" data-oc-target="autocomplete-attribute-{{ attribute_row }}" class="form-control" autocomplete="new-password"/>
<input type="hidden" name="product_attribute[{{ attribute_row }}][attribute_id]" value="{{ product_attribute.attribute_id }}" id="input-attribute-id-{{ attribute_row }}"/>
<input type="text" name="product_attribute[{{ attribute_row }}][name]" value="{{ product_attribute.name }}" placeholder="{{ entry_attribute }}" id="input-attribute-{{ attribute_row }}" data-oc-target="autocomplete-attribute-{{ attribute_row }}" class="form-control" autocomplete="new-password"/>
<ul id="autocomplete-attribute-{{ attribute_row }}" class="dropdown-menu"></ul>
</td>

Expand Down Expand Up @@ -1064,6 +1065,8 @@
<tr>
<th>{{ entry_subscription }}</th>
<th>{{ entry_customer_group }}</th>
<th>{{ entry_trial_price }}</th>
<th>{{ entry_price }}</th>
<th>
{% if master_id %}
<div class="form-check form-switch float-end">
Expand All @@ -1086,14 +1089,16 @@
<option value="{{ customer_group.customer_group_id }}"{% if customer_group.customer_group_id == product_subscription.customer_group_id %} selected{% endif %}>{{ customer_group.name }}</option>
{% endfor %}
</select></td>
<td><input type="text" name="product_subscription[{{ subscription_row }}][trial_price]" value="{{ product_subscription.trial_price }}" placeholder="{{ entry_trial_price }}" class="form-control"/></td>
<td><input type="text" name="product_subscription[{{ subscription_row }}][price]" value="{{ product_subscription.price }}" placeholder="{{ entry_price }}" class="form-control"/></td>
<td class="text-end"><button type="button" onclick="$('#subscription-row-{{ subscription_row }}').remove()" data-bs-toggle="tooltip" title="{{ button_remove }}" class="btn btn-danger"><i class="fa-solid fa-minus-circle"></i></button></td>
</tr>
{% set subscription_row = subscription_row + 1 %}
{% endfor %}
</tbody>
<tfoot>
<tr>
<td colspan="2"></td>
<td colspan="4"></td>
<td class="text-end"><button type="button" id="button-subscription" data-bs-toggle="tooltip" title="{{ button_subscription_add }}" class="btn btn-primary"><i class="fa-solid fa-plus-circle"></i></button></td>
</tr>
</tfoot>
Expand Down Expand Up @@ -1911,6 +1916,8 @@ $('#button-subscription').on('click', function() {
html += ' <option value="{{ customer_group.customer_group_id }}">{{ customer_group.name|escape('js') }}</option>';
{% endfor %}
html += ' <select></td>';
html += ' <td class="text-end"><input type="text" name="product_subscription[' + subscription_row + '][trial_price]" value="" placeholder="{{ entry_trial_price|escape('js') }}" class="form-control"/></td>';
html += ' <td class="text-end"><input type="text" name="product_subscription[' + subscription_row + '][price]" value="" placeholder="{{ entry_price|escape('js') }}" class="form-control"/></td>';
html += ' <td class="text-end"><button type="button" onclick="$(\'#subscription-row-' + subscription_row + '\').remove()" data-bs-toggle="tooltip" title="{{ button_remove|escape('js') }}" class="btn btn-danger"><i class="fa-solid fa-minus-circle"></i></button></td>';
html += '</tr>';
Expand Down
Loading

0 comments on commit 7f220eb

Please sign in to comment.