Skip to content

Instantly share code, notes, and snippets.

@sukhikh18
Created November 29, 2019 11:31

Revisions

  1. @dzantiev dzantiev created this gist Nov 29, 2015.
    217 changes: 217 additions & 0 deletions bitrixOneClickOrder.php
    Original 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);
    }