Заказы
Операции с заказами
Создание
$products = [ [ 'PRODUCT_ID' => 135, 'PRODUCT_PROVIDER_CLASS' => '\Bitrix\Catalog\Product\CatalogProvider', 'NAME' => 'Товар 1', 'PRICE' => 500, 'CURRENCY' => 'RUB', 'QUANTITY' => 5, ] ]; $basket = Bitrix\Sale\Basket::create('s1'); foreach ($products as $product) { $item = $basket->createItem("catalog", $product["PRODUCT_ID"]); unset($product["PRODUCT_ID"]); $item->setFields($product); } $siteId = 's1'; // код сайта $userId = 1; // ID пользователя $order = \Bitrix\Sale\Order::create($siteId, $userId); $order->setPersonTypeId(1); // 1 – ID типа плательщика $order->setBasket($basket); $shipmentCollection = $order->getShipmentCollection(); $shipment = $shipmentCollection->createItem( Bitrix\Sale\Delivery\Services\Manager::getObjectById(1) // 1 – ID службы доставки ); $shipmentItemCollection = $shipment->getShipmentItemCollection(); foreach ($basket as $basketItem) { $item = $shipmentItemCollection->createItem($basketItem); $item->setQuantity($basketItem->getQuantity()); } $paymentCollection = $order->getPaymentCollection(); $payment = $paymentCollection->createItem( Bitrix\Sale\PaySystem\Manager::getObjectById(1) // 1 – ID платежной системы ); $payment->setField("SUM", $order->getPrice()); $payment->setField("CURRENCY", $order->getCurrency()); $r = $order->save(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Создание без отгрузок и оплат
$basket = \Bitrix\Sale\Basket::create('s1'); $item = $basket->createItem('catalog', 123); $item->setField('QUANTITY', 1); $item->setField('CURRENCY', 'RUB'); $item->setField('PRODUCT_PROVIDER_CLASS', '\Bitrix\Catalog\Product\CatalogProvider'); $item = $basket->createItem('catalog', 125); $item->setField('QUANTITY', 1); $item->setField('CURRENCY', 'RUB'); $item->setField('PRODUCT_PROVIDER_CLASS', '\Bitrix\Catalog\Product\CatalogProvider'); $basket->refresh(); $order = \Bitrix\Sale\Order::create('s1', 1, 'RUB'); $order->setPersonTypeId(1); $order->setBasket($basket); $r = $order->save(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Получение по ID
Заказ представляет собой объект, который можно получить несколькими способами:
- по ID:
$order = \Bitrix\Sale\Order::load($id);
- по номеру заказа (ACCOUNT_NUMBER):
$order = \Bitrix\Sale\Order::loadByAccountNumber($accountNumber);
Получение информации
Для получения информации используйте один из двух методов.
\Bitrix\Sale\Order::loadByFilter($parameters);
Метод всегда возвращает либо массив объектов, либо null.
Параметр Описание С версии $parameters Массив, структура: - filter – описание фильтра для WHERE и HAVING
- order – параметры сортировки
- limit – количество записей
- offset – смещение для limit
- runtime – динамически определенные поля
\Bitrix\Sale\Order::getList($parameters);
Метод всегда возвращает объект DB\Result, из которого можно получить данные с помощью метода fetch();
Параметр Описание С версии $parameters Массив, структура которого полностью соответствует структуре ORM'ного getList.
Метод всегда возвращает объектDB\Result
, из которого можно получить данные с помощью методаfetch()
.Примеры:
Выведем даты всех заказов текущего пользователя за текущий месяц, отсортированные по дате заказа
$myDate = new \Bitrix\Main\Type\Date(); $myDate->add('-1M'); $parameters = [ 'filter' => [ "USER_ID" => $USER->GetID(), "DATE_INSERT" => $myDate ], 'order' => ["DATE_INSERT" => "ASC"] ]; $dbRes = \Bitrix\Sale\Order::getList($parameters); while ($order = $dbRes->fetch()) { var_dump($order); }
Получить заказы с определенным товаром
$dbRes = \Bitrix\Sale\Order::getList([ 'filter' => [ 'BASKET.PRODUCT_ID' => 174474 ], 'order' => ['ID' => 'DESC'] ]); while ($order = $dbRes->fetch()) { var_dump($order); }
Фильтрация по нескольким вариантам статуса
$dbRes = \Bitrix\Sale\Order::getList([ 'filter' => [ "USER_ID" => $USER->GetID(), "@STATUS_ID" => ["N", "P"] ], 'order' => ['ID' => 'DESC'] ]); while ($order = $dbRes->fetch()) { var_dump($order); }
Получение списка заказов, у которых отсутствует какое-либо свойство
$dbRes = \Bitrix\Sale\Order::getList([ 'select' => ['ID'], 'filter' => [ 'PROPERTY_VAL.ID' => null ], 'runtime' => [ new \Bitrix\Main\Entity\ReferenceField( 'PROPERTY', '\Bitrix\sale\Internals\OrderPropsTable', array("=ref.PERSON_TYPE_ID" => "this.PERSON_TYPE_ID",), array("join_type"=>"inner") ), new \Bitrix\Main\Entity\ReferenceField( 'PROPERTY_VAL', '\Bitrix\sale\Internals\OrderPropsValueTable', array("=this.PROPERTY.ID" => "ref.ORDER_PROPS_ID", "=this.ID" => "ref.ORDER_ID",), array("join_type"=>"left") ), ], 'group' => ['ID'], 'order' => ['ID' => 'DESC'] ]); while ($order = $dbRes->fetch()) { var_dump($order); }
Получение списка заказов по нескольким свойствам заказа
CModule::IncludeModule('sale'); $dbRes = \Bitrix\Sale\Order::getList([ 'select' => [ "ID", "PROPERTY_VAL.VALUE", "PROPERTY_VAL_2.VALUE" ], 'filter' => [ '=PROPERTY_VAL.CODE' => 'EMAIL', '=PROPERTY_VAL.VALUE' => 'example@example.com', '=PROPERTY_VAL_2.CODE' => 'ZIP', '=PROPERTY_VAL_2.VALUE' => 101000 ], 'runtime' => [ new \Bitrix\Main\Entity\ReferenceField( 'PROPERTY_VAL', '\Bitrix\sale\Internals\OrderPropsValueTable', ["=this.ID" => "ref.ORDER_ID"], ["join_type"=>"left"] ), new \Bitrix\Main\Entity\ReferenceField( 'PROPERTY_VAL_2', '\Bitrix\sale\Internals\OrderPropsValueTable', ["=this.ID" => "ref.ORDER_ID"], ["join_type"=>"left"] ), ] ]); while ($order = $dbRes->fetch()) { var_dump($order); }
Редактирование
$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа $order->setField('USER_DESCRIPTION', 'Мой первый заказ'); $r = $order->save(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Оплата
Оплата заказа подразумевает оплату всех частичных оплат, которые в него входят. Только в этом случае заказ считается полностью оплаченным.
$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа $paymentCollection = $order->getPaymentCollection(); foreach ($paymentCollection as $payment) { $r = $payment->setPaid('Y'); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); } } if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Разрешение доставки
Разрешение доставки подразумевает разрешение всех частичных отгрузок, которые в него входят. Только в этом случае заказ считается полностью оплаченным.
$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа $shipmentmentCollection = $order->getShipmentCollection(); foreach ($shipmentmentCollection as $shipment) { $r = $shipment->allowDelivery(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); } } $r = $order->save(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Если необходимо отменить разрешение отгрузки, тогда достаточно вместо $shipment->allowDelivery()
вызвать $shipment->disallowDelivery()
:
$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа $shipmentCollection = $order->getShipmentCollection(); foreach ($shipmentCollection as $shipment) { $r = $shipment->disallowDelivery(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); } } $r = $order->save(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Добавление комментария
$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа $r = $order->setField('COMMENTS', 'Комментарий'); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); } $r = $order->save(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Смена статуса
$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа $r = $order->setField('STATUS_ID', 'P'); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); } $r = $order->save(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Отмена и удаление
Отмена
Для отмены заказа необходимо, чтобы все оплаты были не оплачены, отгрузки не отгружены. В противном случае возникнет ошибка, которая будет возвращена. Поэтому, если это необходимо, перед отменой выполнить отмену отгрузки и отмену оплаты заказа.
$order = \Bitrix\Sale\Order::load(123); // 123 – ID заказа $r = $order->setField('CANCELED', 'Y'); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); } $r = $order->save(); if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Удаление
Есть 2 подхода к удалению заказа: "умное" и "в лоб".
- При "умном" удалении заказ сначала отменяется, а затем удаляется. Это значит, что у удаляемого заказа не должно быть оплаченный оплат и отгруженных отгрузок.
$r = \Bitrix\Sale\Order::delete(123); // 123 – ID заказа if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
- При удалении "в лоб" не происходит отмены заказа. Идет прямое удаление информации о заказе из базы.
$r = \Bitrix\Sale\OrderBase::deleteNoDemand(123); // 123 – ID заказа if (!$r->isSuccess()) { var_dump($r->getErrorMessages()); }
Получение публичной ссылки
Необходимо, чтобы в настройках модуля Интернет-магазин (Настройки > Настройки продукта > Настройки модулей > Интернет-магазин) была отмечена опция "Разрешить просмотр заказа по ключу без авторизации".
if (\Bitrix\Sale\Helpers\Order::isAllowGuestView($order)) { $publicLink = \Bitrix\Sale\Helpers\Order::getPublicLink($order); }
Выборка заказов по значению свойства
$dbRes = \Bitrix\Sale\Order::getList([ 'select' => ['ID'], 'filter' => [ 'PROPERTY.ORDER_PROPS_ID' => 15,// 15 – ID свойства 'PROPERTY.VALUE' => 'значение', ], 'order' => ['ID' => 'DESC'] ]);
Добавление привязки
Пример добавления привязки существующего Контакта или Компании к Заказу:
$communication = $order->getContactCompanyCollection(); $contact = Contact::create($communication); $contact->setField('ENTITY_ID', $contactId); $contact->setField('IS_PRIMARY', 'Y'); // необязательно $communication->addItem($contact);