Заказы
Операции с заказами
Создание
$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);