Я делаю обновление в проекте opencart. Мы создаем купоны, которые будут применять скидку. он включен на странице оформления заказа. мы добавляем детали этого купона, такие как код купона, скидка, дата истечения срока действия и т. д., со стороны администратора. но на стороне пользователя ничего не происходит. при вводе кода купона ничего не происходит. никакого снижения цены, а также мы не получили никаких сообщений об ошибках.
Купоны не работают в opencart
Ответы (4)
Обычный способ работы купонов делает их недействительными. Причина в том, что даты немного неудобны. Вам нужно установить дату начала за один день до того, как вы хотите ее использовать, и дату окончания за один день после. Это странно, я знаю, но так это работает, поэтому убедитесь, что даты действительны для купона.
Просто была аналогичная проблема, когда купон был успешно применен, но без скидки.
Обнаружено, что проблема была связана с тем, как при заказе общей суммы заказа «промежуточная сумма» должна предшествовать «купону».
Неправильно публиковать ответ без какого-либо кода, поэтому я провел отладку здесь: catalog/model/total/coupon.php
Общая сумма была равна 0, поэтому скидка сбрасывалась.
public function getTotal(&$total_data, &$total, &$taxes) {
if (isset($this->session->data['coupon'])) {
$this->load->language('total/coupon');
$this->load->model('checkout/coupon');
$coupon_info = $this->model_checkout_coupon->getCoupon($this->session->data['coupon']);
if ($coupon_info) {
$discount_total = 0;
if (!$coupon_info['product']) {
$sub_total = $this->cart->getSubTotal();
} else {
$sub_total = 0;
foreach ($this->cart->getProducts() as $product) {
if (in_array($product['product_id'], $coupon_info['product'])) {
$sub_total += $product['total'];
}
}
}
if ($coupon_info['type'] == 'F') {
$coupon_info['discount'] = min($coupon_info['discount'], $sub_total);
}
foreach ($this->cart->getProducts() as $product) {
$discount = 0;
if (!$coupon_info['product']) {
$status = true;
} else {
if (in_array($product['product_id'], $coupon_info['product'])) {
$status = true;
} else {
$status = false;
}
}
if ($status) {
if ($coupon_info['type'] == 'F') {
$discount = $coupon_info['discount'] * ($product['total'] / $sub_total);
} elseif ($coupon_info['type'] == 'P') {
$discount = $product['total'] / 100 * $coupon_info['discount'];
}
if ($product['tax_class_id']) {
$tax_rates = $this->tax->getRates($product['total'] - ($product['total'] - $discount), $product['tax_class_id']);
foreach ($tax_rates as $tax_rate) {
if ($tax_rate['type'] == 'P') {
$taxes[$tax_rate['tax_rate_id']] -= $tax_rate['amount'];
}
}
}
}
$discount_total += $discount;
}
if ($coupon_info['shipping'] && isset($this->session->data['shipping_method'])) {
if (!empty($this->session->data['shipping_method']['tax_class_id'])) {
$tax_rates = $this->tax->getRates($this->session->data['shipping_method']['cost'], $this->session->data['shipping_method']['tax_class_id']);
foreach ($tax_rates as $tax_rate) {
if ($tax_rate['type'] == 'P') {
$taxes[$tax_rate['tax_rate_id']] -= $tax_rate['amount'];
}
}
}
$discount_total += $this->session->data['shipping_method']['cost'];
}
// If discount greater than total
if ($discount_total > $total) {
$discount_total = $total;
}
$total_data[] = array(
'code' => 'coupon',
'title' => sprintf($this->language->get('text_coupon'), $this->session->data['coupon']),
'value' => -$discount_total,
'sort_order' => $this->config->get('coupon_sort_order')
);
$total -= $discount_total;
}
}
}
В продолжение ответа Джона... В catalog/model/total/coupon.php
я поменял
// If discount greater than total
if ($discount_total > $total) {
$discount_total = $total;
}
За:
// If discount greater than total
if ($coupon_info['type'] == 'F' && $discount_total > $subtotal) {
$discount_total = $subtotal;
}
Надеюсь, что никому больше не придется отлаживать это!!!
Расширение ответа Джея...
Если это проблема с датой, это потому, что OpenCart хочет, чтобы купон был больше/меньше (не равен) дате.
Откройте /catalog/model/checkout/coupon.php
Первая функция должна быть getCoupon
Найдите эту строку:
$coupon_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "coupon WHERE code = '" . $this->db->escape($code) . "' AND ((date_start = '0000-00-00' OR date_start < NOW()) AND (date_end = '0000-00-00' OR date_end > NOW())) AND status = '1'");
Замените date_start ‹ NOW() на date_start ‹= NOW().
И date_end ‹ NOW() на date_end ‹= NOW()
в результате чего:
$coupon_query = $this->db->query("SELECT * FROM " . DB_PREFIX . "coupon WHERE code = '" . $this->db->escape($code) . "' AND ((date_start = '0000-00-00' OR date_start <= NOW()) AND (date_end = '0000-00-00' OR date_end >= NOW())) AND status = '1'");