Reputation: 33
Below code become active, when my set quantity is meet.
But if my set quantity is three for eligible discount, in that case if any customer buy four products, its still give discount for three products only.
It wait for another three to give discount. But I want if my set minimum quantity meet, then it will give discount on total orders according to my set percentage.
I don't know coding. Can anyone help to fix it with coding?
I am new to stackoverflow. If my ability of explaining is wrong, then I am asking your apologies.
Here is the code.
admin/controller/total/total_discount.php
<?php
class ControllerTotalTotalDiscount extends Controller {
private $error = array();
public function index() {
$this->load->language('total/total_discount');
$this->document->setTitle($this->language->get('heading_title'));
$this->load->model('setting/setting');
if (($this->request->server['REQUEST_METHOD'] == 'POST') && ($this->validate())) {
$this->model_setting_setting->editSetting('total_discount', $this->request->post);
$this->session->data['success'] = $this->language->get('text_success');
$this->response->redirect($this->url->link('extension/total', 'token=' . $this->session->data['token'], 'SSL'));
}
$data['heading_title'] = $this->language->get('heading_title');
$data['text_edit'] = $this->language->get('text_edit');
$data['text_enabled'] = $this->language->get('text_enabled');
$data['text_disabled'] = $this->language->get('text_disabled');
$data['text_each'] = $this->language->get('text_each');
$data['text_once'] = $this->language->get('text_once');
$data['entry_count'] = $this->language->get('entry_count');
$data['entry_percent'] = $this->language->get('entry_percent');
$data['entry_each'] = $this->language->get('entry_each');
$data['entry_status'] = $this->language->get('entry_status');
$data['entry_sort_order'] = $this->language->get('entry_sort_order');
$data['help_count'] = $this->language->get('help_count');
$data['help_percent'] = $this->language->get('help_percent');
$data['help_each'] = $this->language->get('help_each');
$data['button_save'] = $this->language->get('button_save');
$data['button_cancel'] = $this->language->get('button_cancel');
if (isset($this->error['warning'])) {
$data['error_warning'] = $this->error['warning'];
} else {
$data['error_warning'] = '';
}
$data['breadcrumbs'] = array();
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_home'),
'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('text_total'),
'href' => $this->url->link('extension/total', 'token=' . $this->session->data['token'], 'SSL')
);
$data['breadcrumbs'][] = array(
'text' => $this->language->get('heading_title'),
'href' => $this->url->link('total/total_discount', 'token=' . $this->session->data['token'], 'SSL')
);
$data['action'] = $this->url->link('total/total_discount', 'token=' . $this->session->data['token'], 'SSL');
$data['cancel'] = $this->url->link('extension/total', 'token=' . $this->session->data['token'], 'SSL');
if (isset($this->request->post['total_discount_count'])) {
$data['total_discount_count'] = $this->request->post['total_discount_count'];
} else {
$data['total_discount_count'] = $this->config->get('total_discount_count');
}
if (isset($this->request->post['total_discount_percent'])) {
$data['total_discount_percent'] = $this->request->post['total_discount_percent'];
} else {
$data['total_discount_percent'] = $this->config->get('total_discount_percent');
}
if (isset($this->request->post['total_discount_each_count'])) {
$data['total_discount_each_count'] = $this->request->post['total_discount_each_count'];
} else {
$data['total_discount_each_count'] = $this->config->get('total_discount_each_count');
}
if (isset($this->request->post['total_discount_status'])) {
$data['total_discount_status'] = $this->request->post['total_discount_status'];
} else {
$data['total_discount_status'] = $this->config->get('total_discount_status');
}
if (isset($this->request->post['total_discount_sort_order'])) {
$data['total_discount_sort_order'] = $this->request->post['total_discount_sort_order'];
} else {
$data['total_discount_sort_order'] = $this->config->get('total_discount_sort_order');
}
$data['header'] = $this->load->controller('common/header');
$data['column_left'] = $this->load->controller('common/column_left');
$data['footer'] = $this->load->controller('common/footer');
$this->response->setOutput($this->load->view('total/total_discount.tpl', $data));
}
private function validate() {
if (!$this->user->hasPermission('modify', 'total/total_discount')) {
$this->error['warning'] = $this->language->get('error_permission');
}
return !$this->error;
}
}
?>
admin>language/English/total/total_discount.php
<?php
// Heading
$_['heading_title'] = 'Percent Discount for Big Orders';
// Text
$_['text_edit'] = 'Edit';
$_['text_total'] = 'Order Totals';
$_['text_success'] = 'Success: You have modified Discount total!';
$_['text_each'] = 'Each';
$_['text_once'] = 'Once';
// Entry
$_['entry_count'] = 'Products Count:';
$_['entry_percent'] = 'Percent Discount:';
$_['entry_each'] = 'Discount:';
$_['entry_status'] = 'Status:';
$_['entry_sort_order'] = 'Sort Order:';
//help
$_['help_count'] = 'The products count the order must reach before the discount becomes active.';
$_['help_percent'] = 'of the cheapest product in the order.';
$_['help_each'] = 'for Each X products or just Once.';
// Error
$_['error_permission'] = 'Warning: You do not have permission to modify Discount total!';
?>
admin/view/template/total/total_discount.tpl
<?php echo $header; ?><?php echo $column_left; ?>
<div id="content">
<div class="page-header">
<div class="container-fluid">
<div class="pull-right">
<button type="submit" form="form-discount" data-toggle="tooltip" title="<?php echo $button_save; ?>" class="btn btn-primary"><i class="fa fa-save"></i></button>
<a href="<?php echo $cancel; ?>" data-toggle="tooltip" title="<?php echo $button_cancel; ?>" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
<h1><?php echo $heading_title; ?></h1>
<ul class="breadcrumb">
<?php foreach ($breadcrumbs as $breadcrumb) { ?>
<li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
<?php } ?>
</ul>
</div>
</div>
<div class="container-fluid">
<?php if ($error_warning) { ?>
<div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?php echo $error_warning; ?>
<button type="button" class="close" data-dismiss="alert">×</button>
</div>
<?php } ?>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title"><i class="fa fa-pencil"></i> <?php echo $text_edit; ?></h3>
</div>
<div class="panel-body">
<form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form-discount" class="form-horizontal">
<div class="form-group">
<label class="col-sm-2 control-label" for="input-count"><span data-toggle="tooltip" title="<?php echo $help_count; ?>"><?php echo $entry_count; ?></span></label>
<div class="col-sm-10">
<input type="text" name="total_discount_count" value="<?php echo $total_discount_count; ?>" placeholder="<?php echo $entry_count; ?>" id="input-count" class="form-control" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-percent"><span data-toggle="tooltip" title="<?php echo $help_percent; ?>"><?php echo $entry_percent; ?> <b>%</b></span></label>
<div class="col-sm-10">
<input type="text" name="total_discount_percent" value="<?php echo $total_discount_percent; ?>" placeholder="<?php echo $entry_percent; ?>" id="input-percent" class="form-control" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-each"><span data-toggle="tooltip" title="<?php echo $help_each; ?>"><?php echo $entry_each; ?></span></label>
<div class="col-sm-10">
<select name="total_discount_each_count" id="input-each" class="form-control">
<?php if ($total_discount_each_count) { ?>
<option value="1" selected="selected"><?php echo $text_each; ?></option>
<option value="0"><?php echo $text_once; ?>></option>
<?php } else { ?>
<option value="1"><?php echo $text_each; ?></option>
<option value="0" selected="selected"><?php echo $text_once; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-status"><?php echo $entry_status; ?></label>
<div class="col-sm-10">
<select name="total_discount_status" id="input-status" class="form-control">
<?php if ($total_discount_status) { ?>
<option value="1" selected="selected"><?php echo $text_enabled; ?></option>
<option value="0"><?php echo $text_disabled; ?></option>
<?php } else { ?>
<option value="1"><?php echo $text_enabled; ?></option>
<option value="0" selected="selected"><?php echo $text_disabled; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label" for="input-sort-order"><?php echo $entry_sort_order; ?></label>
<div class="col-sm-10">
<input type="text" name="total_discount_sort_order" value="<?php echo $total_discount_count; ?>" placeholder="<?php echo $entry_sort_order; ?>" id="input-sort-order" class="form-control" />
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<?php echo $footer; ?>
catalog/language/english/total/total_discount.php
<?php
$_['text_total_discount'] = 'Discount';
?>
catelog/model/total/total_discount.php
<?php
class ModelTotalTotalDiscount extends Model {
public function getTotal(&$total_data, &$total, &$taxes) {
$count = 0;
$price = 0;
$prices = array();
foreach ($this->cart->getProducts() as $product) {
$count += $product['quantity'];
for ($i = 0; $i < $product['quantity']; $i++) {
$prices[] = $product['price'];
}
}
sort($prices);
if ($count >= (int)$this->config->get('total_discount_count')) {
if ($this->config->get('total_discount_each_count')) {
$items_count = floor($count / (int)$this->config->get('total_discount_count'));
for ($i = 0; $i < $items_count; $i++) {
$price += $prices[$i];
}
} else {
$price += $prices[0];
}
$this->load->language('total/total_discount');
$price *= (float)$this->config->get('total_discount_percent') / 100;
$total_data[] = array(
'code' => 'total_discount',
'title' => $this->language->get('text_total_discount'),
'text' => $this->currency->format(-$price),
'value' => -$price,
'sort_order' => $this->config->get('total_discount_sort_order')
);
$total -= $price;
}
}
}
?>
Upvotes: 0
Views: 186
Reputation: 3618
This is the intended behaviour - if you buy 3 products you get a %age off the cheapest one, so of course if you want the discount off two products you're going to have to buy 6.
But you want it so if you buy 3 or more products, you get the discount off each additional product? (e.g. if you buy 4, you get the discount applied to 2 of them, if you buy 5, the discount is applied to 3, etc. ?)
If you're not familiar with coding, I wouldn't really recommend going messing with this (or definitely keep a backup before you do) but the modification I would make is in catalog/model/total/total_discount.php
the last file you posted:
Change the line
$items_count = floor($count / (int)$this->config->get('total_discount_count'));
to
if ($count > (int)$this->config->get('total_discount_count')) {
$items_count = $count - (int)$this->config->get('total_discount_count');
} else {
$items_count = 0;
}
The result of this is that if you say 3 products for the discount count, the number of products the discount is applied to will be the number of products in the cart minus 3. (i.e. 4th, 5th, 6th etc. will have discount applied)
EDIT
Just reread your question and I now understand you want the discount applied to the entire order if at least X products are ordered?
If so, then change the same line above to
if ($count >= (int)$this->config->get('total_discount_count')) {
$items_count = $count;
} else {
$items_count = 0;
}
Should achieve the desired effect. It won't affect postage, or any other additional charges though.
Upvotes: 1