Здравствуйте, мне нужно при создании заказа через API добавить купон и пересчитать цену на заказ.
Посоветуйте как правильно это сделать
Код ниже:
Loader::includeModule('sale');
Loader::includeModule('catalog');
$currencyCode = CurrencyManager::getBaseCurrency();
$siteId = Context::getCurrent()->getSite();
$properties = $this->getProperties(['PROPERTY_BINDING_USER', 'PROPERTY_TIME_DELIVERY', 'PROPERTY_DATE_DELIVERY', 'PROPERTY_ADDRESS_DELIVERY', 'PROPERTY_BINDING_SUB', 'PROPERTY_DELIVERY_SERVICE']);
$userId = $properties['PROPERTY_BINDING_USER_VALUE'];
$products = $this->getFullInfoProductsPreOrder();
$order = \Bitrix\Sale\Order::create($siteId, $userId);
$cardsOperations = new CardOperations($userId);
$order->setPersonTypeId(1);
$order->setField('CURRENCY', $currencyCode);
\Bitrix\Sale\DiscountCouponsManager::add(COUPON_SUBSCRIBE);
$basket = Basket::create($siteId);
foreach ($products['PRODUCTS'] as $product) {
$basketItem = \Bitrix\Sale\BasketItem::create($basket, 'catalog', (int)$product['ID']);;
$basketItem->setFields([
'PRODUCT_ID' => $product['ID'],
'NAME' => $product['NAME'],
'QUANTITY' => $product['COUNT'],
'PRICE' => $product['PRICE'],
'CUSTOM_PRICE' => 'Y',
'LID' => $siteId,
'CURRENCY' => $currencyCode
]);
$basket->addItem($basketItem);
}
$order->setBasket($basket);
\Bitrix\Sale\DiscountCouponsManager::add(COUPON_SUBSCRIBE);
$propertiesOrder = $order->getPropertyCollection();
$propertyDateDelivery = $propertiesOrder->getItemByOrderPropertyId('5');
$propertyTimeDelivery = $propertiesOrder->getItemByOrderPropertyId('6');
$dateTime = new \DateTime($properties['PROPERTY_DATE_DELIVERY_VALUE']);
$propertyDateDelivery->setValue(date('d.m.Y', strtotime('next ' . $dateTime->format('l'))));
$result = OrderPropsVariantTable::getList([
'filter' => ['ORDER_PROPS_ID' => 6],
'order' => ['SORT' => 'ASC']
])->fetchAll();
foreach ($result as $item) {
if($item['NAME'] == $properties['PROPERTY_TIME_DELIVERY_VALUE']) {
$propertyTimeDelivery->setValue($item['ID']);
}
}
$addressExplode = explode(';', $properties['PROPERTY_ADDRESS_DELIVERY_VALUE']);
$addressInfo = [];
foreach ($addressExplode as $index => $str) {
$str = trim($str);
$strExplode = explode(':', $str);
switch ($index) {
case 0:
$addressInfo['CITY'] = trim($strExplode[1]);
break;
case 1:
$addressInfo['STREET'] = trim($strExplode[1]);
break;
case 2:
$addressInfo['STREET_NUMBER'] = trim($strExplode[1]);
break;
case 3:
$addressInfo['APPARTAMENTS'] = trim($strExplode[1]);
break;
case 4:
$addressInfo['ENTRANCE'] = trim($strExplode[1]);
break;
case 5:
$addressInfo['FLOOR'] = trim($strExplode[1]);
break;
}
}
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();
$service = Manager::getById($properties['PROPERTY_DELIVERY_SERVICE_VALUE']);
$shipment->setFields(array(
'DELIVERY_ID' => $service['ID'],
'DELIVERY_NAME' => $service['NAME'],
));
$order->save();
Посоветуйте как правильно это сделать
Код ниже:
Loader::includeModule('sale');
Loader::includeModule('catalog');
$currencyCode = CurrencyManager::getBaseCurrency();
$siteId = Context::getCurrent()->getSite();
$properties = $this->getProperties(['PROPERTY_BINDING_USER', 'PROPERTY_TIME_DELIVERY', 'PROPERTY_DATE_DELIVERY', 'PROPERTY_ADDRESS_DELIVERY', 'PROPERTY_BINDING_SUB', 'PROPERTY_DELIVERY_SERVICE']);
$userId = $properties['PROPERTY_BINDING_USER_VALUE'];
$products = $this->getFullInfoProductsPreOrder();
$order = \Bitrix\Sale\Order::create($siteId, $userId);
$cardsOperations = new CardOperations($userId);
$order->setPersonTypeId(1);
$order->setField('CURRENCY', $currencyCode);
\Bitrix\Sale\DiscountCouponsManager::add(COUPON_SUBSCRIBE);
$basket = Basket::create($siteId);
foreach ($products['PRODUCTS'] as $product) {
$basketItem = \Bitrix\Sale\BasketItem::create($basket, 'catalog', (int)$product['ID']);;
$basketItem->setFields([
'PRODUCT_ID' => $product['ID'],
'NAME' => $product['NAME'],
'QUANTITY' => $product['COUNT'],
'PRICE' => $product['PRICE'],
'CUSTOM_PRICE' => 'Y',
'LID' => $siteId,
'CURRENCY' => $currencyCode
]);
$basket->addItem($basketItem);
}
$order->setBasket($basket);
\Bitrix\Sale\DiscountCouponsManager::add(COUPON_SUBSCRIBE);
$propertiesOrder = $order->getPropertyCollection();
$propertyDateDelivery = $propertiesOrder->getItemByOrderPropertyId('5');
$propertyTimeDelivery = $propertiesOrder->getItemByOrderPropertyId('6');
$dateTime = new \DateTime($properties['PROPERTY_DATE_DELIVERY_VALUE']);
$propertyDateDelivery->setValue(date('d.m.Y', strtotime('next ' . $dateTime->format('l'))));
$result = OrderPropsVariantTable::getList([
'filter' => ['ORDER_PROPS_ID' => 6],
'order' => ['SORT' => 'ASC']
])->fetchAll();
foreach ($result as $item) {
if($item['NAME'] == $properties['PROPERTY_TIME_DELIVERY_VALUE']) {
$propertyTimeDelivery->setValue($item['ID']);
}
}
$addressExplode = explode(';', $properties['PROPERTY_ADDRESS_DELIVERY_VALUE']);
$addressInfo = [];
foreach ($addressExplode as $index => $str) {
$str = trim($str);
$strExplode = explode(':', $str);
switch ($index) {
case 0:
$addressInfo['CITY'] = trim($strExplode[1]);
break;
case 1:
$addressInfo['STREET'] = trim($strExplode[1]);
break;
case 2:
$addressInfo['STREET_NUMBER'] = trim($strExplode[1]);
break;
case 3:
$addressInfo['APPARTAMENTS'] = trim($strExplode[1]);
break;
case 4:
$addressInfo['ENTRANCE'] = trim($strExplode[1]);
break;
case 5:
$addressInfo['FLOOR'] = trim($strExplode[1]);
break;
}
}
$shipmentCollection = $order->getShipmentCollection();
$shipment = $shipmentCollection->createItem();
$service = Manager::getById($properties['PROPERTY_DELIVERY_SERVICE_VALUE']);
$shipment->setFields(array(
'DELIVERY_ID' => $service['ID'],
'DELIVERY_NAME' => $service['NAME'],
));
$order->save();