Купоны не работают в opencart

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


person Natasha    schedule 16.02.2012    source источник
comment
вам нужно отлаживать свой код. Вы уверены, что можете видеть сообщения об ошибках?   -  person Roman Newaza    schedule 16.02.2012
comment
не получал никаких сообщений об ошибках   -  person Natasha    schedule 16.02.2012
comment
Как насчет уровня сообщения об ошибках, ini-флага display_errors и ошибок базы данных?   -  person Roman Newaza    schedule 16.02.2012
comment
это широко. попробуйте сузить проблему до конкретного файла.   -  person Ryan    schedule 16.02.2012
comment
Если мы используем неправильный код купона, то обычно мы получаем сообщение об ошибке, например, что купон либо недействителен, либо истек, либо достигнут лимит использования!... Но здесь ничего не происходит.   -  person Natasha    schedule 16.02.2012


Ответы (4)


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

person Jay Gilford    schedule 16.02.2012

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

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

Неправильно публиковать ответ без какого-либо кода, поэтому я провел отладку здесь: 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;
        }
    }
}
person John Magnolia    schedule 23.07.2015

В продолжение ответа Джона... В 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;
}

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

person Derek Nolan    schedule 14.11.2017

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

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