Created
November 29, 2019 11:31
Revisions
-
dzantiev created this gist
Nov 29, 2015 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,217 @@ <?php require_once($_SERVER['DOCUMENT_ROOT']. "/bitrix/modules/main/include/prolog_before.php"); // добавление заказа в один клик, только по имени и телефону CModule::IncludeModule("sale"); CModule::IncludeModule("catalog"); if(!empty($_REQUEST['name']) && !empty($_REQUEST['phone'])) { $name = $_REQUEST['name']; $phone = $_REQUEST['phone']; if(!empty($_REQUEST['oneProduct']) && $_REQUEST['oneProduct'] == 'Y' && !empty($_REQUEST['productId'])) { // заказ в один клик только одного товара // --- очистка корзины CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID()); // --- создание пустого заказа $orderId = makeOrder($name,$phone); // --- добавление товара к заказу addProdToOrder($item['PRODUCT_ID'],$orderId, $item['QUANTITY']); // --- оформление заказа всей корзины (с одним товаром) $orderId = makeOrder(); if($orderId) echo json_encode(array('success'=>'ok', 'order_id'=>$orderId)); else echo json_encode(array('error'=>'Y')); } elseif(!empty($_REQUEST['bascetOrder'])) { // заказ в один клик всей корзины // --- оформление заказа всей корзины (с одним товаром) $orderId = makeOrder($name,$phone); // --- достать товары текущей корзины $basecetItems = getBasketProducts(); // --- добавить их в заказ foreach ($basecetItems as $key => $item) { addProdToOrder($item['PRODUCT_ID'],$orderId, $item['QUANTITY']); } // --- обновляем параметры заказа цена/скидка $strOrderList = ''; updateOrderParams($orderId,$strOrderList); sendNotification($name,$phone, $strOrderList, $orderId); if($orderId) { echo json_encode(array('success'=>'ok', 'order_id'=>$orderId)); // --- очистка корзины CSaleBasket::DeleteAll(CSaleBasket::GetBasketUserID()); } else echo json_encode(array('error'=>'Y')); } else { echo json_encode(array('error'=>'Y')); } } else echo json_encode(array('error'=>'Не все поля заполнены')); // FUNCTIONS /** * Создает пустой заказ */ function makeOrder($name,$phone) { global $USER; $arFields = array( "LID" => "s1", "PERSON_TYPE_ID" => 1, "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE" => 0, "CURRENCY" => "RUB", "USER_ID" => 1, "PAY_SYSTEM_ID" => 1, "PRICE_DELIVERY" => 0, "DELIVERY_ID" => 2, "DISCOUNT_VALUE" => 0, "TAX_VALUE" => 0, "USER_DESCRIPTION" => "Заказ в Один клик" ); // add Guest ID if (CModule::IncludeModule("statistic")) $arFields["STAT_GID"] = CStatistic::GetEventParam(); $ord = new CSaleOrder(); $ORDER_ID = $ord->Add($arFields); if($ORDER_ID) { $arFields = array("ORDER_ID" => $ORDER_ID, "ORDER_PROPS_ID" => 1, "NAME" => "ФИО", "CODE" => "NAME", "VALUE" => $name ); CSaleOrderPropsValue::Add($arFields); $arFields = array("ORDER_ID" => $ORDER_ID, "ORDER_PROPS_ID" => 3, "NAME" => "ФИО", "CODE" => "NAME", "VALUE" => $phone ); CSaleOrderPropsValue::Add($arFields); return $ORDER_ID; } else echo json_encode(array('error'=>$ord->LAST_ERROR)); } function getBasketProducts() { $arID = array(); $arBasketItems = array(); $dbBasketItems = CSaleBasket::GetList( array("NAME" => "ASC", "ID" => "ASC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "PRODUCT_PROVIDER_CLASS") ); while ($arItems = $dbBasketItems->Fetch()) { if ('' != $arItems['PRODUCT_PROVIDER_CLASS'] || '' != $arItems["CALLBACK_FUNC"]) { CSaleBasket::UpdatePrice( $arItems["ID"], $arItems["CALLBACK_FUNC"], $arItems["MODULE"], $arItems["PRODUCT_ID"], $arItems["QUANTITY"], "N", $arItems["PRODUCT_PROVIDER_CLASS"] ); $arID[] = $arItems["ID"]; } } if(!empty($arID)) { $dbBasketItems = CSaleBasket::GetList( array("NAME" => "ASC", "ID" => "ASC"), array("ID" => $arID, "ORDER_ID" => "NULL"), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "PRODUCT_PROVIDER_CLASS", "NAME") ); while ($arItems = $dbBasketItems->Fetch()) { $arBasketItems[] = $arItems; } } return $arBasketItems; } function addProdToOrder($productID,$orderID, $quantity=1,$weight='не задан') { $basket_props = array( array("NAME" => "Вес", "CODE" => "MASSA", "VALUE" => $weight)); if (!Add2BasketByProductID($productID, $quantity, array('ORDER_ID' => $orderID, ), $basket_props)) { $return['msg'] = 'Ошибка добавления товара в заказ'; $fail = true; } } function updateOrderParams($orderId, &$strOrderList) { $dbBasketItems = CSaleBasket::GetList( array("NAME" => "ASC", "ID" => "ASC"), array("LID" => SITE_ID, "ORDER_ID" => $orderId), false, false, array("ID", "NAME", "QUANTITY", "CURRENCY", "CAN_BUY", "PRICE", "WEIGHT", "DISCOUNT_PRICE") ); $summ = $weight = 0; $strOrderList = ""; $arBasket = array(); while ($arBasketItems = $dbBasketItems->GetNext()) { $strOrderList .= $arBasketItems["NAME"] . " - " . $arBasketItems["QUANTITY"] . " шт на " . SaleFormatCurrency($arBasketItems["PRICE"] * $arBasketItems["QUANTITY"], $arBasketItems["CURRENCY"]); $strOrderList .= "\n"; $summ += roundEx($arBasketItems["PRICE"], SALE_VALUE_PRECISION) * DoubleVal($arBasketItems["QUANTITY"]); $weight += doubleval($arBasketItems['WEIGHT']); $arBasket[] = $arBasketItems; } $arOrderForDiscount = array( 'SITE_ID' => SITE_ID, 'USER_ID' => $user_id, 'ORDER_PRICE' => $summ, 'ORDER_WEIGHT' => $weight, 'BASKET_ITEMS' => $arBasket, ); $arDiscountOptions = array(); $arDiscountErrors = array(); CSaleDiscount::DoProcessOrder($arOrderForDiscount, $arDiscountOptions, $arDiscountErrors); $arOrderForDiscount['PRICE_BEFORE'] = $summ; $arOrderForDiscount['PRICE'] = $arOrderForDiscount['ORDER_PRICE']; $arOrderForDiscount['WEIGHT'] = $arOrderForDiscount['ORDER_WEIGHT']; if (!CSaleOrder::Update($ORDER_ID, $arOrderForDiscount)) { $return['msg'] = 'Ошибка расчета цены заказа.'; $fail = true; } } function sendNotification($name,$phone, $orderList, $ordrId) { $arEventFields = Array( "AUTHOR_NAME" => $name, "AUTHOR_PHONE" => $phone, "ELEMENTS" => $orderList, "ORDERID" => $ordrId, "SUMM" => '' ); CEvent::SendImmediate("NEW_ONE_CLICK_ORDER", "s1", $arEventFields); }