Перейти к содержимому

Личный кабинет покупателя - список заказов, повтор и отмена

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

Решение

Ставим раздел личного кабинета:

$APPLICATION->IncludeComponent('bitrix:sale.personal.section', '', [
'SEF_MODE' => 'Y',
'SEF_FOLDER' => '/personal/',
'MAIN_CHAIN_NAME' => 'Личный кабинет',
// раздел собирает страницы кабинета сам, отдельных файлов не нужно
'PATH_TO_BASKET' => '/personal/cart/',
]);

Кабинет - комплексный компонент, как и каталог: он рисует список заказов, карточку заказа, профили и корзину. Отдельных страниц под них создавать не требуется, а адреса разбирает правило обработки.

Настраиваем список заказов:

'ORDERS_PER_PAGE' => 20,
'HISTORIC_STATUSES' => ['F'], // какие статусы считать архивными
'SAVED_ORDERS' => 'Y',
'NAV_TEMPLATE' => '',
'SET_TITLE' => 'Y',

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

Разрешаем повтор заказа:

$order = \Bitrix\Sale\Order::load($orderId);
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(
\Bitrix\Sale\Fuser::getId(), SITE_ID);
foreach ($order->getBasket() as $item) {
// повтор - это перенос позиций старого заказа в текущую корзину
$new = $basket->createItem('catalog', $item->getProductId());
$new->setFields(['QUANTITY' => $item->getQuantity(), 'CURRENCY' => 'RUB']);
}
$basket->save(); // корзина сохраняется один раз после переноса всех позиций

Повтор заказа - это наполнение корзины по образцу, а вовсе не копия документа. Цены при этом берутся текущие, и снятые с продажи позиции в корзину не попадают.

Разрешаем отмену заказа покупателем:

'ALLOW_CANCEL_ORDER' => 'Y', // отмена доступна только до отгрузки
'STATUS_COLOR_N' => 'gray',
'CANCEL_STATUSES' => ['N', 'P'], // из каких статусов отмена разрешена
// список статусов задают явно: по умолчанию отмена доступна не всегда

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

Доступ к каждому заказу проверяется по его владельцу. Покупатель, подставивший в адрес чужой номер, не должен увидеть ничего: штатный компонент это проверяет, а свой код - только если проверку в нём написали.

Кабинет удобно считать витриной для одного покупателя. Всё, что он там видит, проходит ту же проверку владельца, и любое своё дополнение - от истории обращений до накопительной скидки - эту проверку обязано повторять.

Гостевые заказы в кабинете не видны, пока покупатель не вошёл под той учётной записью, на которую заказ оформлен. Оформление без входа создаёт запись автоматически, и вход в неё открывает историю заказов.

Типичные проблемы

Покупатель видит чужой заказ.

Самописный код не проверяет владельца документа. Штатный компонент делает эту проверку сам, а свой - только если её написали.

Повтор заказа переносит старые цены.

Позиции копируются вместе со старой ценой вместо создания заново. Повтор заказа должен брать текущие цены каталога.

Кнопка отмены не появляется.

Заказ уже перешёл в статус, где отмена покупателем запрещена. Список разрешённых статусов задаётся настройками модуля продаж.

В кабинете пусто у существующего покупателя.

Заказы оформлены на другую учётную запись покупателя. Оформление без входа создаёт отдельную запись по адресу почты.

В списке заказов служебные поля.

В параметрах компонента перечислены все свойства заказа подряд. Покупателю показывают только понятные ему поля документа.

Частые вопросы

Можно ли обойтись без личного кабинета?

Магазину с разовыми покупками - да, история заказов там мало кому нужна. Кабинет окупается при повторных покупках и подписках.

Как показать в кабинете свои данные?

Отдельной страницей внутри раздела кабинета: комплексный компонент допускает свои пути. Данные собирают своим кодом с проверкой владельца.

Почему в кабинете нет части заказов?

Они оформлены на другую учётную запись или помечены архивными по статусу. Оба случая настраиваются параметрами компонента.

Что происходит при отмене заказа?

Заказ переходит в отменённое состояние, а резерв снимается. Деньги при онлайн-оплате возвращает менеджер отдельной операцией.

Смежное

Первоисточник