Изначально в заказе была одна позиция за 6000р (id позиции 69) и доставка за 275р итого 6275р. Прошёл платёж №1 на 6275р. Потом клиент сказал, что выбрал не ту доставку. Доставка в заказе была изменена мной на другую, за 400р. Соответственно Битрикс показал, что надо доплатить 125р. Прошёл платёж №2 на 125р. Конкретные суммы тут не важны, я привёл их просто, чтобы объяснить суть ситуации. Важен факт наличия второй оплаты в заказе.
Через время смотрю "отчет по товарам" (Магазин->Отчёты->Товары) за некоторый период. В отчете показано, что этой позиции было продано общее кол-во 9 в 5 заказах. Скрин https://monosnap.com/file/0zTdZrdvYEYPIF71wT859jLUXKoWsS
Начинаю смотреть, как работает отчёт. Выясняется, что sql запрос при построении этого отчёта считает описанный выше заказ (id=523) и его корзину (id=800) два раза, из-за второй оплаты! Скрин https://monosnap.com/file/rXLGCq5vQXdXtZx741sraJ7zAzJalR
Вопрос: Это баг, фича, надо было иначе поступать со второй оплатой или что-то ещё я делаю не так?
Возникла похожая проблема: пользователь выбирает местоположение такого типа, для которого нельзя определить доступные доставки. Например "Парфеньевский район, Костромская область" (не город, не село...). То есть регион выбран как бы верно, ошибок нет, но для такого региона нет доставок. Компонент sale.order.ajax в таком случае просто пропускает блок доставки при оформлении заказа и создает заказ без доставки.
Я не прям специалист, поэтому решение может быть далеко от идеала =)
Решил делать так: для таких регионов, где доставку определить нельзя - добавлять ошибку в блок региона. То есть пока пользователь не выберет регион, в котором есть доставки на выбор - сделать заказ он не сможет.
Для этого в компоненте sale.order.ajax в файле order_ajax.js добавил следующее:
В метод isValidRegionBlock перед "return regionErrors;" добавил
Сообщение будет появляться при уходе из блока. Хотелось, чтобы сообщение появлялось сразу после выбора неподходящего региона. Для этого в тот же order_ajax.js в метод "locationsCompletion" в самый конец добавил проверку, что если в блоке есть ошибки, то сразу их показать:
(это дублирует кусок кода из метода editFadeRegionContent, так что наверное можно и более оптимально сделать)
============================
Еще один момент, на всякий случай. Заметил, что если выбран подходящий регион, для которого есть доставки, например "Москва", а пользователь случайно меняет его например на "Москваввв", то появляется ошибка: "К сожалению, ничего не найдено", что само по себе верно, но может получиться такой случай: выбрана "Москва", пользователь пишет "Петербург", ничего не выбирает в выпадающем меню, а сразу нажимает далее. Доставки не пересчитываются и все ещё доступны доставки из региона, выбранного до этого, то есть из Москвы. Пользователь выбирает доставку и внезапно, регион в предыдущем блоке меняется на "Москва". Пользователь может этого даже не заметить и продолжить оформление заказа.
Решить такую проблему можно многими путями (наверное). Я решил привязаться к событию "bx-ui-sls-nothing-found" (нашёл в bitrix/js/sale/core_ui_autocomplete.js). Для этого всё в том же order_ajax.js в методе"bindEvents" в конце добавил скрытие блока доставки на это событие:
В моём случае проблема была в том, что использовалась слим версия jquery. С не слим версией ошибка пропала. Решение нашёл тут https://ru.stackoverflow.com/a/735498