Скидка умножается на Два при редактировании заказа

Пишу это здесь, чтобы коллеги не наторговали в минус, т.к. и сам не сразу заметил такую беду.
Поддержка вроде бы баг подтвердила [TID:101644954]
Но он конечно же не критичный… это же мелочи… обещают исправление до 45 дней.
Хочу обратиться к команде карта - дайте фикс быстрее, пожалуйста

4.15.1
При редактировании заказа скидка умножается на 2, если стоит галочка.


image

Поддерживаю, нужен срочный фикс. Это критичный баг.

Неправильно сохраняется информация о заказе. До конца не разобрался в коде как правильно исправить(не понятно что значит stored_price и что должно считываться если оно установлено в Y), но как исправить временно(до фикса от разработчиков) подскажу.

Summary

Открываем app/functions/fn.cart.php, находим функцию fn_create_order_details и в ней

    $order_details = array (
        'item_id' => $k,
        'order_id' => $order_id,
        'product_id' => $v['product_id'],
        'product_code' => $product_code,
        'price' => (!empty($v['stored_price']) && $v['stored_price'] == 'Y') ? $v['price'] - $v['discount'] : $v['price'],
        'amount' => $v['amount'],
        'extra' => serialize($extra),
    );

Вот тут от $v[‘price’](уже цена со скидкой) снова отнимается $v[‘discount’] (скидка).
Как исправить много вариантов, пока исправил вот так и все вроде бы работает как надо

    $order_details = array (
        'item_id' => $k,
        'order_id' => $order_id,
        'product_id' => $v['product_id'],
        'product_code' => $product_code,
        'price' => (!empty($v['stored_price']) && $v['stored_price'] == 'Y') ? $v['base_price'] - $v['discount'] : $v['price'],
        'amount' => $v['amount'],
        'extra' => serialize($extra),
    );

Возможно тут должно быть наоборот
‘price’ => (!empty($v[‘stored_price’]) && $v[‘stored_price’] == ‘Y’) ? $v[‘price’] : $v[‘base_price’] - $v[‘discount’],

Ждем фикса от разработчиков

1 лайк

Я в шоке. Разработчики советую откатить магазин на 4.14.
Великолепная поддержка Карта!!!
@ikoshkin, @cs-cart_team приглашаю вас в тему.
Имхо баг критичный!!!

1 лайк

логично, так как stored_price = Y означает, что цена уже была изменена (цена была отредактирована через редактрирование заказа или включает скидку например)

Сравнил файл в этой версии и в прошлой. И это место одинаковое.
Теперь трогать страшно, чтоб другой косяк не вылез…

но реально работает
Спасибо!

только дальшн полезло
если менять способ оплаты то скидка отнимается каждый раз

например было 10 000 и скидка 500
поставили безнал - 9500
наличка -9000
снова безнал 8500…

1 лайк

@imac, @ikoshkin, @cs-cart_team

невозможно же работать!
посмотрите видео.

TID:101644954

1 лайк

Спасибо, изучаем.

2 лайка

Это уже какой то другой прикол(Хотя ноги возможно растут из одного места), при смене способа доставки в поле цены записывается цена со скидкой и каждый раз при смене от нее отнимается скидка, соответственно получается 9500,9000,8500.

1 лайк

Зачем Julia Customer care team снова мне пишет про 45 дней и кидает ссылку на определения багов ?

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

Баги связаны, как итог мой фикс по первому багу неправильный(нужно откатить). В 4.15.1 в fn_calculate_cart_content добавили

    $cart['products'][$product_code]['base_price'] = $cart_products[$product_code]['base_price'];
    $cart['products'][$product_code]['price'] = $cart_products[$product_code]['price'];

В итоге правильная цена(цена уже со скидкой) тут начала перезаписываться ценой к которой повторно применена скидка.

Summary

Но изначально причина в fn_get_cart_product_data где есть такой вот код

            $_pdata['price'] -= (float) $product['discount'];

            if ($_pdata['price'] < 0) {
                $_pdata['discount'] += $_pdata['price'];
                $_pdata['price'] = 0;
            }

Его нужно заменить на

            if ($_pdata['stored_price'] != 'Y') {
                $_pdata['price'] -= (float)$product['discount'];
                if ($_pdata['price'] < 0) {
                    $_pdata['discount'] += $_pdata['price'];
                    $_pdata['price'] = 0;
                }
            }

Чтобы скидка не применялась если уже применена

1 лайк

Работает!!!
Скидка отнимается 1 раз.
При переключении способа оплата также срабатывает корректно.

Теперь правда Итого неправильно формируется.

image
image

1 лайк

Пока не получается до конца разобраться(в одном месте исправляешь чтобы сумма считалась правильно, в итоге в другом месте получается не та сумма на которую расчитывает код. В некоторых местах приходит оригинальная цена товара и при этом рядом указано что применена скидка). В итоге пока проще закомментировать
$cart['products'][$product_code]['price'] = $cart_products[$product_code]['price'];
чтобы все работало пока как в прошлых версиях и ждать фикса от разработчиков, чем разбираться во всей этой каше

1 лайк

Так пока лучше всего получается
Сумм верна, единственно нет строки Скидка в счете.

В ближайшие дни (на этой неделе или в начале следующей) будет Service Pack, который в том числе исправит эту проблему. Сейчас тестируем исправление. Если это исправление будет готово и проверено намного раньше выхода SP, то не будем ждать и отдадим его сразу в виде diff.


Поддержка так отвечает потому, что ориентируется не только на предметную область, но и на количество обращений (отсюда упоминание о числе пользователей). А когда обращений много, то проблема зачастую уже в работе; и те, кто обратился с проблемой позже, сразу получают решение.

В этот раз ваше обращение было первым (и насколько я знаю, единственным) по этой проблеме, и Юлия в прошлую пятницу подтвердила баг, назвав при этом стандартный срок испрвления. Но она также дополнительно написала об этом баге команде разработки (т.к. с этим багом потенциально могут столкнуться многие) и попросила заняться им побыстрее. Мы и занялись; но перед тем, как отдавать всем пользователям решение, мы ещё должны его протестировать.

1 лайк

Спасибо за развернутый ответ.
По поводу ответов поддержки предлагаю так и указывать в письме, что если баг критический, то будет исправлен в течении 3 дней.
Тем более по ссылке есть четкое описание, что если баг касается оформления заказа, то он критический.

Мне же дважды прислали письмо про 45 дней.
Менеджеры с ума сходят, а тут 45 дней…

Да и честно говоря даже для некритических багов срок 45 дней имхо неадекватный в наше время.

Тем более если это мой косяк, то вы списывание баллы поддержки. А если ваш, то мне приходится бесплатно мучаться до 45 дней.

Как то это несправедливо…

В любом случае спасибо вам за реакцию на форуме. Это важно! Спасибо!

2 лайка

diff.zip (468 Байт)
Поддержка прислала дифф
@furniel вы были на правильном пути! Спасибо вам еще раз.

2 лайка