Купоны не работают в opencart - PullRequest
1 голос
/ 16 февраля 2012

Я делаю обновление в проекте opencart. Мы создаем купоны, которые будут применять скидку. он включен в страницу оформления заказа. мы добавляем детали этого купона, такие как код купона, скидка, дата истечения и т. д. со стороны администратора. Но на стороне пользователя ничего не происходит. при вводе кода купона ничего не происходит. без снижения цены, а также мы не получили сообщение об ошибке.

Ответы [ 4 ]

6 голосов
/ 16 февраля 2012

Обычный способ работы купонов делает их недействительными.Причина в том, что даты немного неловко.Вам нужно установить дату начала как один день, прежде чем вы захотите его использовать, и дату окончания как один день после.Это странно, я знаю, но так оно и работает, поэтому убедитесь, что даты действительны для купона

3 голосов
/ 23 июля 2015

Просто была похожая проблема, когда купон был успешно применен, но без скидки.

Обнаружено, что проблема связана с тем, как итоговый заказ заказа должен указывать «итоговый» перед «купоном».

Неправильное размещение ответа без кода, поэтомугде я делал отладку: 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;
        }
    }
}
1 голос
/ 14 ноября 2017

Исходя из ответа Джона ... В 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;
}

Надеюсь, что больше никто не должен отлаживать это !!!

0 голосов
/ 18 февраля 2012

Расширяя ответ Джея ...

Если это проблема с датой, то это потому, что 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'");

Изменить дата_старт <СЕЙЧАС () </strong> на дата_старт <= СЕЙЧАС () </strong>

И date_end <СЕЙЧАС () </strong> до date_end <= СЕЙЧАС () </strong>

в результате:

$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'");
...