function AddOrderProperty($prop_id, $value, $order) { if (!strlen($prop_id)) { return false; } if (CModule::IncludeModule('sale')) { if ($arOrderProps = CSaleOrderProps::GetByID($prop_id)) { $db_vals = CSaleOrderPropsValue::GetList(array(), array('ORDER_ID' => $order, 'ORDER_PROPS_ID' => $arOrderProps['ID'])); if ($arVals = $db_vals->Fetch()) { return CSaleOrderPropsValue::Update($arVals['ID'], array('NAME' => $arVals['NAME'], 'CODE' => $arVals['CODE'], 'ORDER_PROPS_ID' => $arVals['ORDER_PROPS_ID'], 'ORDER_ID' => $arVals['ORDER_ID'], 'VALUE' => $value)); } else { return CSaleOrderPropsValue::Add(array('NAME' => $arOrderProps['NAME'], 'CODE' => $arOrderProps['CODE'], 'ORDER_PROPS_ID' => $arOrderProps['ID'], 'ORDER_ID' => $order, 'VALUE' => $value)); } } } }
/** * событие вызывается перед отправкой письма о новом заказе * @param $orderID * @param $eventName * @param $arFields */ function bxModifySaleMails($order_id, &$eventName, &$arFieldsEmail) { //unset($_SESSION['OnBeforeOrderAddHandler']); //$_SESSION['OnBeforeOrderAddHandler']['bxModifySaleMails']='bxModifySaleMails'; //$_SESSION['OnBeforeOrderAddHandler']['id']=$order_id; //$_SESSION['OnBeforeOrderAddHandler']['arFields']=$arFieldsorder_old; $basket_props=""; $post['INFO']=""; $id_product=array(); if( (CModule::IncludeModule("main")) && (CModule::IncludeModule("iblock")) && (CModule::IncludeModule("catalog")) && (CModule::IncludeModule("sale")) ){ /** * получаем параметры сформировавшегося старого заказа */ $arFieldsorder_old = CSaleOrder::GetByID($order_id); /* echo "<pre>"; var_dump($arFieldsorder_old);die(); echo "</pre>";*/ /** * выборка свойства сформировавшегося заказа по id заказа */ $db_props = CSaleOrderPropsValue::GetOrderProps($order_id); $arFields_props = array(); while ($arProps = $db_props->Fetch()) { $arFields_props_old[$arProps['CODE']]=$arProps; } //_debug($arFields_props_old); /** * выборка из корзины по id заказа * получаем масси id продукта */ $rsUser = CUser::GetByID(CUser::GetID()); $arUser = $rsUser->Fetch(); /*if (!$ORDER_ID = CSaleOrder::Add(array( "LID" => SITE_ID, "PERSON_TYPE_ID" => 1, "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE" => 0, "CURRENCY" => CSaleLang::GetLangCurrency(SITE_ID), "USER_ID" => $arUser['ID'], "PAY_SYSTEM_ID" => $arFieldsorder_old['PAY_SYSTEM_ID'], "PRICE_DELIVERY" => 0, "DELIVERY_ID" => $arFieldsorder_old['DELIVERY_ID'], "DISCOUNT_VALUE" => $arFieldsorder_old['DISCOUNT_VALUE'], "TAX_VALUE" => $arFieldsorder_old['TAX_VALUE'], "USER_DESCRIPTION" => $post['INFO'] ))){ $rows['msg'] = 'Ошибка создания заказа'; $fail = true; }else{ $rows['msg']=$ORDER_ID; //continue; }*/ $dbBasketItems = CSaleBasket::GetList( array("ID" => "ASC"), array( "LID" => SITE_ID, "ORDER_ID" => $order_id ), false, false, array() ); while ($arItem = $dbBasketItems->Fetch()){ $id_product[] = $arItem['PRODUCT_ID']; $products_basket[$arItem['PRODUCT_ID']]=$arItem; } foreach($products_basket as $product){ $price_product+=$product['PRICE']*$product['QUANTITY']; $products_descriptions.=$product['NAME']." - ".$product['QUANTITY']." шт: ".intval($product['PRICE'])." руб <br/>"; } $price_product+=$arFieldsorder_old["PRICE_DELIVERY"]; //$_SESSION['OnBeforeOrderAddHandler']['products_basket']=$products_basket; /** * получаем массив id партнеров из продукта */ //var_dump($id_product);die(); if($id_product){ $id_partner=array(); $partner_product=array(); $arSelect = Array("ID", "NAME","IBLOCK_ID","PROPERTY_PARTNER"); $arFilter = Array("ID"=>$id_product, "ACTIVE"=>"Y"); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ob = $res->GetNextElement()) { $arFields = $ob->GetFields(); $partner_product[$arFields['PROPERTY_PARTNER_VALUE']][]=$products_basket[$arFields['ID']]; if($arFields['PROPERTY_PARTNER_VALUE']){ $id_partner[]=$arFields['PROPERTY_PARTNER_VALUE']; } } //$_SESSION['OnBeforeOrderAddHandler']['id_partner']=$id_partner; /** * получаем массив данных партнера */ if($id_partner){ $delivery_sum = null; $arSelect2 = Array("ID", "IBLOCK_ID", "NAME","PROPERTY_*"); $arFilter2 = Array("IBLOCK_ID"=>9, "ACTIVE"=>"Y","ID"=>$id_partner,); $res2 = CIBlockElement::GetList(Array(), $arFilter2, false, false, $arSelect2); /** * eсли в выборке корзине в продуктах больше чем один партнер * то разбиваем заказ по количеству партнеров */ if (intval($res2->SelectedRowsCount())>0){ while($ob2 = $res2->GetNextElement()){ $arFields_partners = $ob2->GetFields(); $arProperties_partners = $ob2->GetProperties(); //_debug($arProperties_partners); //$price_product=0; //$products_descriptions=""; $arEventFields=array(); //echo $arFields_partners['ID']; if($partner_product[$arFields_partners['ID']]){ $i=0; $size_of_productpartner=sizeof($partner_product[$arFields_partners['ID']]); foreach($partner_product[$arFields_partners['ID']] as $key_price=>$item_price){ //_debug($item_price); $quantity=1; /** * формируем новый пустой заказ */ if(!$i){ if (!$ORDER_ID = CSaleOrder::Add(array( "LID" => SITE_ID, "PERSON_TYPE_ID" => 1, "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE" => 0, "CURRENCY" => CSaleLang::GetLangCurrency(SITE_ID), "USER_ID" => $arUser['ID'], "PAY_SYSTEM_ID" => $arFieldsorder_old['PAY_SYSTEM_ID'], "PRICE_DELIVERY" => 0, "DELIVERY_ID" => $arFieldsorder_old['DELIVERY_ID'], "DISCOUNT_VALUE" => $arFieldsorder_old['DISCOUNT_VALUE'], "TAX_VALUE" => $arFieldsorder_old['TAX_VALUE'], "USER_DESCRIPTION" => $post['INFO'] ))){ $rows['msg'] = 'Ошибка создания заказа'; $fail = true; }else{ $rows['msg']=$ORDER_ID; //continue; } } /** * добавляем по id заказа в корзину товары партнера */ if (!Add2BasketByProductID($item_price['PRODUCT_ID'], $item_price['QUANTITY'], array( 'ORDER_ID' => $ORDER_ID, ), $basket_props)) { $rows['err'] = 'Ошибка добавления товара в заказ'; $fail = true; } /*$price_product+=$item_price['PRICE']*$item_price['QUANTITY']; $products_descriptions.=$item_price['NAME']." - ".$item_price['QUANTITY']." шт: ".intval($item_price['PRICE'])." руб <br/>"; */ $i++; /** * обновляем параметры нового заказа на актуальные */ if($size_of_productpartner==$i){ if (!$fail) { $dbBasketItems = CSaleBasket::GetList( array("NAME" => "ASC", "ID" => "ASC"), array( "LID" => SITE_ID, "ORDER_ID" => $ORDER_ID ), 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"; $rows['summ']=$summ += roundEx($arBasketItems["PRICE"], SALE_VALUE_PRECISION) * DoubleVal($arBasketItems["QUANTITY"]); $weight += doubleval($arBasketItems['WEIGHT']); $arBasket[] = $arBasketItems; } $arOrderForDiscount = array( 'SITE_ID' => SITE_ID, 'USER_ID' => $arUser['ID'], 'ORDER_PRICE' => $summ, 'ORDER_WEIGHT' => $weight, 'BASKET_ITEMS' => $arBasket, ); $arDiscountOptions = array(); $arDiscountErrors = array(); CSaleDiscount::DoProcessOrder($arOrderForDiscount, $arDiscountOptions, $arDiscountErrors); if($_REQUEST['comment']) $arOrderForDiscount['COMMENTS'] = $_REQUEST['comment']; if($arProperties_partners['DOSTAVKA']['VALUE']){ $arOrderForDiscount["PRICE_DELIVERY"] = $arProperties_partners['DOSTAVKA']['VALUE']; $arOrderForDiscount["DELIVERY_ID"] = 3; $summ += intval($arProperties_partners['DOSTAVKA']['VALUE']); $arOrderForDiscount['ORDER_PRICE']=$summ; } $arOrderForDiscount['PRICE_BEFORE'] = $summ; $arOrderForDiscount['PRICE'] = $summ; $arOrderForDiscount['WEIGHT'] = $arOrderForDiscount['ORDER_WEIGHT']; /** * обновляем заказ */ if (!CSaleOrder::Update($ORDER_ID, $arOrderForDiscount)) { $rows['err'] = 'Ошибка расчета цены заказа.'; $fail = true; }else{ /** * перезагружаем свойства заказ из старого */ $db_props_new = CSaleOrderPropsValue::GetOrderProps($ORDER_ID); $arFields_props_new = array(); while ($arProps_new = $db_props_new->Fetch()) { //_debug($arProps_new); foreach($arFields_props_old as $key_props_old=>$item_props_old){ if($arProps_new['CODE']==$key_props_old){ CSaleOrderPropsValue::Update($arProps_new['ID'], array("VALUE"=>$item_props_old['VALUE'])); unset($arFields_props_old[$key_props_old]); } } } if(sizeof($arFields_props_old)>0){ foreach($arFields_props_old as $key_props_old2=>$item_props_old2){ CSaleOrderPropsValue::Add(array( 'NAME' => $item_props_old2['NAME'], 'CODE' => $item_props_old2['CODE'], 'ORDER_PROPS_ID' => $item_props_old2['ORDER_PROPS_ID'], 'ORDER_ID' => $ORDER_ID, 'VALUE' => $item_props_old2['VALUE'] )); } } /** * добавляем в свойство заказа id партнера для дальнейшей фильтрации по партнерским заказам */ CSaleOrderPropsValue::Add(array( 'NAME' => "Привязка по партнеру", 'CODE' => "PATNERID", 'ORDER_PROPS_ID' => 21, 'ORDER_ID' => $ORDER_ID, 'VALUE' => $arFields_partners['ID'] )); //$price_product+=$arProperties_partners['DOSTAVKA']['VALUE']; //$price_product+=$arFieldsorder_old["PRICE_DELIVERY"]; /** * отправляем данные о товаре Партнерам */ if($arFields_partners['NAME']){ //если есть партнер у товара $arEventFields = Array( "ORDER_ID"=> $ORDER_ID, "ORDER_DATE"=> date("d.m.Y H:i:s"), "ORDER_USER"=> $arFields_partners['NAME'], "PRICE"=> $price_product, "EMAIL"=> $arProperties_partners['EMAIL']['VALUE'], "ORDER_LIST"=> $products_descriptions, //"DELIVERY_PRICE"=>$arProperties_partners['DOSTAVKA']['VALUE'] "DELIVERY_PRICE"=>$arFieldsorder_old["PRICE_DELIVERY"] ); $event = new CEvent; $event->SendImmediate("SALE_NEW_ORDERPARTNER", SITE_ID, $arEventFields); } } } // if(!$fail){ // $ar_res_product=CCatalogProduct::GetByID($PRODUCT['ID']); // $arFields_quant = array( // 'QUANTITY' => $ar_res_product['QUANTITY']-1 // ); // CCatalogProduct::Update($PRODUCT['ID'], $arFields_quant); // } } } } } /** * удаляем старый заказ после разбивки на новые */ if($ORDER_ID ){ CSaleOrder::Delete($order_id); } } } $arEventFields = Array( "ORDER_ID" =>$order_id, "ORDER_DATE" =>date("d.m.Y H:i:s"), "ORDER_USER" =>$arUser['NAME'], "PRICE" =>$price_product, "EMAIL" => $arUser['EMAIL'], "ORDER_LIST" =>$products_descriptions, "DELIVERY_PRICE"=>$arFieldsorder_old["PRICE_DELIVERY"] ); $event = new CEvent; $event->SendImmediate("SALE_NEW_BILET", SITE_ID, $arEventFields); } } //$_SESSION['OnBeforeOrderAddHandler']['rows']=$rows; return false; }
function __MakeOrder($prdCnt=1, $arData = Array()) { global $APPLICATION, $USER, $DB; CModule::IncludeModule("iblock"); CModule::IncludeModule("sale"); CModule::IncludeModule("catalog"); $arPrd = Array(); $dbItem = CIBlockElement::GetList(Array("PROPERTY_MORE_PHOTO" => "DESC", "ID" => "ASC"), Array("IBLOCK_TYPE" => "offers", "IBLOCK_SITE_ID" => WIZARD_SITE_ID, "PROPERTY_NEWPRODUCT" => false), false, Array("nTopCount" => 10), Array("ID", "IBLOCK_ID", "XML_ID", "NAME", "DETAIL_PAGE_URL", "IBLOCK_XML_ID")); while($arItem = $dbItem->GetNext()) $arPrd[] = $arItem; if(!empty($arPrd)) { for($i=0; $i<$prdCnt;$i++) { $prdID = $arPrd[mt_rand(0, 9)]; $arProduct = CCatalogProduct::GetByID($prdID["ID"]); $CALLBACK_FUNC = ""; $arCallbackPrice = CSaleBasket::ReReadPrice($CALLBACK_FUNC, "catalog", $prdID["ID"], 1); $arFields = array( "PRODUCT_ID" => $prdID["ID"], "PRODUCT_PRICE_ID" => $arCallbackPrice["PRODUCT_PRICE_ID"], "PRICE" => $arCallbackPrice["PRICE"], "CURRENCY" => $arCallbackPrice["CURRENCY"], "WEIGHT" => $arProduct["WEIGHT"], "QUANTITY" => 1, "LID" => WIZARD_SITE_ID, "DELAY" => "N", "CAN_BUY" => "Y", "NAME" => $prdID["NAME"], "CALLBACK_FUNC" => $CALLBACK_FUNC, "MODULE" => "catalog", "PRODUCT_PROVIDER_CLASS" => "CCatalogProductProvider", "ORDER_CALLBACK_FUNC" => "", "CANCEL_CALLBACK_FUNC" => "", "PAY_CALLBACK_FUNC" => "", "DETAIL_PAGE_URL" => $prdID["DETAIL_PAGE_URL"], "CATALOG_XML_ID" => $prdID["IBLOCK_XML_ID"], "PRODUCT_XML_ID" => $prdID["XML_ID"], "VAT_RATE" => $arCallbackPrice['VAT_RATE'], ); $addres = CSaleBasket::Add($arFields); } $arOrder = Array( "LID" => $arData["SITE_ID"], "PERSON_TYPE_ID" => $arData["PERSON_TYPE_ID"], "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE" => 1, "CURRENCY" => $arData["CURRENCY"], "USER_ID" => $arData["USER_ID"], "PAY_SYSTEM_ID" => $arData["PAY_SYSTEM_ID"], //"PRICE_DELIVERY" => $arData["PRICE_DELIVERY"], //"DELIVERY_ID" => $arData["DELIVERY_ID"], ); $dbFUserListTmp = CSaleUser::GetList(array("USER_ID" => $arData["USER_ID"])); if(empty($dbFUserListTmp)) { $arFields = array( "=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $arData["USER_ID"] ); $ID = CSaleUser::_Add($arFields); } $orderID = CSaleOrder::Add($arOrder); CSaleBasket::OrderBasket($orderID, CSaleBasket::GetBasketUserID(), WIZARD_SITE_ID); $dbBasketItems = CSaleBasket::GetList( array("NAME" => "ASC"), array( "FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => WIZARD_SITE_ID, "ORDER_ID" => $orderID ), false, false, array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "NAME") ); $ORDER_PRICE = 0; while ($arBasketItems = $dbBasketItems->GetNext()) { $ORDER_PRICE += roundEx($arBasketItems["PRICE"], SALE_VALUE_PRECISION) * DoubleVal($arBasketItems["QUANTITY"]); } $totalOrderPrice = $ORDER_PRICE + $arData["PRICE_DELIVERY"]; CSaleOrder::Update($orderID, Array("PRICE" => $totalOrderPrice)); foreach($arData["PROPS"] as $val) { $arFields = Array( "ORDER_ID" => $orderID, "ORDER_PROPS_ID" => $val["ID"], "NAME" => $val["NAME"], "CODE" => $val["CODE"], "VALUE" => $val["VALUE"], ); CSaleOrderPropsValue::Add($arFields); } return $orderID; } }
static function DoSaveOrderProps($orderId, $personTypeId, $arOrderProps, &$arErrors) { $arIDs = array(); $dbResult = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $orderId), false, false, array("ID", "ORDER_PROPS_ID")); while ($arResult = $dbResult->Fetch()) { $arIDs[$arResult["ORDER_PROPS_ID"]] = $arResult["ID"]; } $dbOrderProperties = CSaleOrderProps::GetList(array("SORT" => "ASC"), array("PERSON_TYPE_ID" => $personTypeId, "ACTIVE" => "Y"), false, false, array("ID", "TYPE", "NAME", "CODE", "USER_PROPS", "SORT")); while ($arOrderProperty = $dbOrderProperties->Fetch()) { $curVal = $arOrderProps[$arOrderProperty["ID"]]; if ($arOrderProperty["TYPE"] == "MULTISELECT" && is_array($curVal)) { $curVal = implode(",", $curVal); } if (strlen($curVal) > 0) { $arFields = array("ORDER_ID" => $orderId, "ORDER_PROPS_ID" => $arOrderProperty["ID"], "NAME" => $arOrderProperty["NAME"], "CODE" => $arOrderProperty["CODE"], "VALUE" => $curVal); if (array_key_exists($arOrderProperty["ID"], $arIDs)) { CSaleOrderPropsValue::Update($arIDs[$arOrderProperty["ID"]], $arFields); unset($arIDs[$arOrderProperty["ID"]]); } else { CSaleOrderPropsValue::Add($arFields); } } } foreach ($arIDs as $id) { CSaleOrderPropsValue::Delete($id); } }
static function DoSaveOrderProps($orderId, $personTypeId, $arOrderProps, &$arErrors, $paysystemId = 0, $deliveryId = "") { $arIDs = array(); $dbResult = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $orderId), false, false, array("ID", "ORDER_PROPS_ID")); while ($arResult = $dbResult->Fetch()) { $arIDs[$arResult["ORDER_PROPS_ID"]] = $arResult["ID"]; } $arFilter = array("PERSON_TYPE_ID" => $personTypeId, "ACTIVE" => "Y"); if ($paysystemId != 0) { $arFilter["RELATED"]["PAYSYSTEM_ID"] = $paysystemId; $arFilter["RELATED"]["TYPE"] = "WITH_NOT_RELATED"; } if (strlen($deliveryId) > 0) { $arFilter["RELATED"]["DELIVERY_ID"] = $deliveryId; $arFilter["RELATED"]["TYPE"] = "WITH_NOT_RELATED"; } $dbOrderProperties = CSaleOrderProps::GetList(array("SORT" => "ASC"), $arFilter, false, false, array("ID", "TYPE", "NAME", "CODE", "USER_PROPS", "SORT")); while ($arOrderProperty = $dbOrderProperties->Fetch()) { $curVal = $arOrderProps[$arOrderProperty["ID"]]; if ($arOrderProperty["TYPE"] == "MULTISELECT" && is_array($curVal)) { $curVal = implode(",", $curVal); } if ($arOrderProperty["TYPE"] == "FILE" && is_array($curVal)) { $tmpVal = ""; foreach ($curVal as $index => $fileData) { $bModify = true; if (isset($fileData["file_id"])) { if (isset($fileData["del"])) { $arFile = CFile::MakeFileArray($fileData["file_id"]); $arFile["del"] = $fileData["del"]; $arFile["old_file"] = $fileData["file_id"]; } else { $bModify = false; if (strlen($tmpVal) > 0) { $tmpVal .= ", " . $fileData["file_id"]; } else { $tmpVal = $fileData["file_id"]; } } } else { // new file array $arFile = $fileData; } if (isset($arFile["name"]) && strlen($arFile["name"]) > 0 && $bModify) { $arFile["MODULE_ID"] = "sale"; $fid = CFile::SaveFile($arFile, "sale"); if (intval($fid) > 0) { if (strlen($tmpVal) > 0) { $tmpVal .= ", " . $fid; } else { $tmpVal = $fid; } } } } $curVal = $tmpVal; } if (strlen($curVal) > 0) { $arFields = array("ORDER_ID" => $orderId, "ORDER_PROPS_ID" => $arOrderProperty["ID"], "NAME" => $arOrderProperty["NAME"], "CODE" => $arOrderProperty["CODE"], "VALUE" => $curVal); if (array_key_exists($arOrderProperty["ID"], $arIDs)) { CSaleOrderPropsValue::Update($arIDs[$arOrderProperty["ID"]], $arFields); unset($arIDs[$arOrderProperty["ID"]]); } else { CSaleOrderPropsValue::Add($arFields); } } } foreach ($arIDs as $id) { CSaleOrderPropsValue::Delete($id); } }
if ($arOrderProperties["TYPE"] == "CHECKBOX" && strlen($curVal) <= 0 && $arOrderProperties["REQUIED"] != "Y") { $curVal = "N"; } if (strlen($curVal) > 0) { $arFields = array( "ORDER_ID" => $arResult["ORDER_ID"], "ORDER_PROPS_ID" => $arOrderProperties["ID"], "NAME" => $arOrderProperties["NAME"], "CODE" => $arOrderProperties["CODE"], "VALUE" => $curVal ); CSaleOrderPropsValue::Add($arFields); if ( $arOrderProperties["USER_PROPS"] == "Y" && IntVal($arUserResult["PROFILE_ID"])<=0 && IntVal($arUserResult["PROFILE_ID_new"])<=0) { if (strlen($arUserResult["PROFILE_NAME"]) <= 0) $arUserResult["PROFILE_NAME"] = GetMessage("SOA_PROFILE")." ".Date("Y-m-d"); $arFields = array( "NAME" => $arUserResult["PROFILE_NAME"], "USER_ID" => IntVal($USER->GetID()), "PERSON_TYPE_ID" => $arUserResult["PERSON_TYPE_ID"] ); $arUserResult["PROFILE_ID_new"] = CSaleOrderUserProps::Add($arFields); $arUserResult["PROFILE_ID_new"] = IntVal($arUserResult["PROFILE_ID_new"]); }
} else { $errorMessage .= str_replace("#NAME#", $arTaxList[$j]["TAX_NAME"], GetMessage("SOE_ERROR_SAVE_TAX")) . ". "; } } } } foreach ($arOldTaxList as $key => $value) { CSaleOrderTax::Delete($key); } } if (strlen($errorMessage) <= 0) { for ($i = 0; $i < count($arIDs); $i++) { CSaleOrderPropsValue::DeleteByOrder($arIDs[$i]); for ($j = 0; $j < count($arPropsList); $j++) { $arFields = array("ORDER_ID" => $arIDs[$i], "ORDER_PROPS_ID" => $arPropsList[$j]["ORDER_PROPS_ID"], "NAME" => $arPropsList[$j]["NAME"], "CODE" => $arPropsList[$j]["CODE"], "VALUE" => $arPropsList[$j]["VALUE"]); $res = CSaleOrderPropsValue::Add($arFields) > 0; if (!$res) { if ($ex = $APPLICATION->GetException()) { $errorMessage .= $ex->GetString(); } else { $errorMessage .= str_replace("#NAME#", $arPropsList[$j]["NAME"], GetMessage("SOE_ERROR_SAVE_PROP")) . ". "; } } } } } if (strlen($errorMessage) <= 0) { if (!$customTabber->Action()) { if ($ex = $APPLICATION->GetException()) { $errorMessage .= $ex->GetString(); } else {
<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/include/prolog_before.php"; CModule::IncludeModule("sale"); if (isset($_GET['order_basket'])) { $dbBasketItems = CSaleBasket::GetList(false, array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID", "QUANTITY", "PRICE")); $price = 0; while ($item = $dbBasketItems->Fetch()) { $price += intval($item['QUANTITY']) * $item['PRICE']; } $arFields = array("LID" => 's1', "PERSON_TYPE_ID" => 1, "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE" => $price, "CURRENCY" => "RUB", "USER_ID" => intval($USER->GetId()), "PAY_SYSTEM_ID" => 1, "USER_DESCRIPTION" => ""); $orderId = CSaleOrder::Add($arFields); if (false === $orderId) { return false; } $user = CUser::GetByID($USER->GetId())->Fetch(); $ar = array('ORDER_ID' => $orderId, 'ORDER_PROPS_ID' => 2, "NAME" => "Адрес доставки", "CODE" => "delivery_address", 'VALUE' => $user['PERSONAL_STREET']); CSaleOrderPropsValue::Add($ar); CSaleBasket::OrderBasket($orderId, $_SESSION["SALE_USER_ID"], SITE_ID); $tmp = explode(',', $user['NAME']); $eventFields = array('NAME' => $tmp[0], 'EMAIL' => $user['EMAIL']); $eventName = $user['PERSONAL_CITY'] == 'Москва' ? 'NEW_ORDER_MOSCOW' : 'NEW_ORDER_RUSSIA'; CEvent::Send($eventName, 's1', $eventFields); CEvent::Send('NEW_ORDER_ADMIN', 's1', array()); return true; }
/** * <p>Метод осуществляет продление подписки с кодом ID.</p> <p><b>Примечание</b>. Метод использует внутреннюю транзакцию. Если у вас используется <b>MySQL</b> и <b>InnoDB</b>, и ранее была открыта транзакция, то ее необходимо закрыть до подключения метода.</p> * * * * * @param int $ID Код записи с информацией о продлении. * * * * @return bool <p>Метод возвращает <i>true</i> в случае успешного продления или <i>false</i> * в случае ошибки.</p><br><br> * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalerecurring/csalerecurring.nextpayment.php * @author Bitrix */ public static function NextPayment($ID) { global $DB; global $USER; $ID = IntVal($ID); if ($ID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_NO_RECID"), "NO_RECORD_ID"); return False; } $arRecur = CSaleRecurring::GetByID($ID); if (!$arRecur) { $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $ID, GetMessage("SKGR_NO_RECID1")), "NO_RECORD"); return False; } $arOrder = CSaleOrder::GetByID($arRecur["ORDER_ID"]); if (!$arOrder) { $GLOBALS["APPLICATION"]->ThrowException(str_replace("#ID#", $arRecur["ORDER_ID"], GetMessage("SKGR_NO_ORDER1")), "NO_ORDER"); return False; } $bSuccess = True; $newOrderID = IntVal($arRecur["ORDER_ID"]); /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arRecur)) { $arProduct = $productProvider::RecurringOrderProduct(array( "PRODUCT_ID" => $arRecur["PRODUCT_ID"], "USER_ID" => $arOrder["USER_ID"] )); } else { $arProduct = CSaleRecurring::ExecuteCallbackFunction( $arRecur["CALLBACK_FUNC"], $arRecur["MODULE"], $arRecur["PRODUCT_ID"], $arOrder["USER_ID"] ); } if (!$arProduct || !is_array($arProduct) || count($arProduct) <= 0) { CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Product is not found"); /* $arFields = array( "CANCELED" => "Y", "DATE_CANCELED" => Date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG))), "CANCELED_REASON" => "Product is not found" ); CSaleRecurring::Update($arRecur["ID"], $arFields); */ //CSaleRecurring::Delete($arRecur["ID"]); return True; } if ($arProduct["WITHOUT_ORDER"] == "Y" || $arRecur["SUCCESS_PAYMENT"] == "Y") { $baseSiteCurrency = CSaleLang::GetLangCurrency($arOrder["LID"]); $productPrice = roundEx(CCurrencyRates::ConvertCurrency($arProduct["PRICE"], $arProduct["CURRENCY"], $baseSiteCurrency), SALE_VALUE_PRECISION); // Delivery $deliveryPrice = 0; $deliveryID = 0; $arOrder["DELIVERY_ID"] = IntVal($arOrder["DELIVERY_ID"]); if ($arOrder["DELIVERY_ID"] > 0) { $deliveryLocation = 0; $dbOrderPropValues = CSaleOrderPropsValue::GetList( array(), array( "ORDER_ID" => $arRecur["ORDER_ID"], "PROP_IS_LOCATION" => "Y" ), false, false, array("VALUE") ); if ($arOrderPropValues = $dbOrderPropValues->Fetch()) $deliveryLocation = IntVal($arOrderPropValues["VALUE"]); $dbDelivery = CSaleDelivery::GetList( array("SORT" => "ASC", "NAME" => "ASC"), array( "LID" => $arOrder["LID"], "WEIGHT" => DoubleVal($arProduct["WEIGHT"]) * DoubleVal($arProduct["QUANTITY"]), // Changed by Sigurd, 2007-08-16 "ORDER_PRICE" => $productPrice * DoubleVal($arProduct["QUANTITY"]), "ACTIVE" => "Y", "LOCATION" => $deliveryLocation ) ); while ($arDelivery = $dbDelivery->Fetch()) { $deliveryPriceTmp = roundEx(CCurrencyRates::ConvertCurrency($arDelivery["PRICE"], $arDelivery["CURRENCY"], $baseSiteCurrency), SALE_VALUE_PRECISION); if (IntVal($arDelivery["ID"]) == $arOrder["DELIVERY_ID"]) { $deliveryID = IntVal($arDelivery["ID"]); $deliveryPrice = $deliveryPriceTmp; break; } if ($deliveryPriceTmp < $deliveryPrice || $deliveryID <= 0) { $deliveryID = IntVal($arDelivery["ID"]); $deliveryPrice = $deliveryPriceTmp; } } if ($deliveryID <= 0) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("SKGR_NO_DELIVERY"), "NO_DELIVERY"); return False; } } // Sale discounts $discount = 0; $discountPrice = $productPrice; $discountProduct = 0; $dbDiscount = CSaleDiscount::GetList( array("SORT" => "ASC"), array( "LID" => $arOrder["LID"], "ACTIVE" => "Y", "!>ACTIVE_FROM" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "<=PRICE_FROM" => $productPrice, ">=PRICE_TO" => $productPrice, "USER_GROUPS" => $USER->GetUserGroup($arOrder['USER_ID']), ) ); if ($arDiscount = $dbDiscount->Fetch()) { if ($arDiscount["DISCOUNT_TYPE"] == "P") { $discountProduct = roundEx($productPrice * $arDiscount["DISCOUNT_VALUE"] / 100, SALE_VALUE_PRECISION); $discount = roundEx($discountProduct * DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION); // Changed by Sigurd, 2007-08-16 $discountPrice = $productPrice - $discountProduct; } else { $discountValue = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $baseSiteCurrency); $discountValue = roundEx($discountValue, SALE_VALUE_PRECISION); $discountProduct = roundEx(1.0 * $discountValue / DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION);// Changed by Sigurd, 2007-08-16 $discount = roundEx($curDiscount * DoubleVal($arProduct["QUANTITY"]), SALE_VALUE_PRECISION); $discountPrice = $productPrice - $discountProduct; } } $bUseVat = false; $vatRate = 0; if(DoubleVal($arProduct["VAT_RATE"]) > 0) { $bUseVat = true; $vatRate = $arProduct["VAT_RATE"]; } // Tax $arTaxExempt = array(); $dbUserGroups = CUser::GetUserGroupEx($arOrder["USER_ID"]); while ($arUserGroups = $dbUserGroups->Fetch()) { $dbTaxExemptTmp = CSaleTax::GetExemptList(array("GROUP_ID" => $arUserGroups["GROUP_ID"])); while ($arTaxExemptTmp = $dbTaxExemptTmp->Fetch()) { $arTaxExemptTmp["TAX_ID"] = IntVal($arTaxExemptTmp["TAX_ID"]); if (!in_array($arTaxExemptTmp["TAX_ID"], $arTaxExempt)) $arTaxExempt[] = $arTaxExemptTmp["TAX_ID"]; } } $taxPrice = 0; $taxVatPrice = 0; if(!$bUseVat) { $taxLocation = 0; $dbOrderPropValues = CSaleOrderPropsValue::GetList( array(), array( "ORDER_ID" => $arRecur["ORDER_ID"], "PROP_IS_LOCATION4TAX" => "Y" ), false, false, array("VALUE") ); if ($arOrderPropValues = $dbOrderPropValues->Fetch()) $taxLocation = IntVal($arOrderPropValues["VALUE"]); $arTaxList = array(); $dbTaxRateTmp = CSaleTaxRate::GetList( array("APPLY_ORDER" => "ASC"), array( "LID" => $arOrder["LID"], "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"], "ACTIVE" => "Y", "LOCATION" => $taxLocation ) ); while ($arTaxRateTmp = $dbTaxRateTmp->Fetch()) { if (!in_array(IntVal($arTaxRateTmp["TAX_ID"]), $arTaxExempt)) { $arTaxList[] = $arTaxRateTmp; } } } else { $arTaxList[] = Array( "ID" => 0, "TAX_NAME" => GetMessage("SKGR_VAT"), "IS_PERCENT" => "Y", "VALUE" => $vatRate*100, "VALUE_MONEY" => 0, "APPLY_ORDER" => 100, "IS_IN_PRICE" => "Y", "CODE" => "VAT" ); } $arTaxSums = array(); if (!empty($arTaxList)) { if(!$bUseVat) { $taxPriceTmp = CSaleOrderTax::CountTaxes( $discountPrice * DoubleVal($arProduct["QUANTITY"]), $arTaxList, $baseSiteCurrency ); for ($di = 0, $intCount = count($arTaxList); $di < $intCount; $di++) { $arTaxList[$di]["VALUE_MONEY"] += $arTaxList[$di]["TAX_VAL"]; } for ($di = 0, $intCount = count($arTaxList); $di < $intCount; $di++) { $arTaxSums[$arTaxList[$di]["TAX_ID"]]["VALUE"] = $arTaxList[$di]["VALUE_MONEY"]; $arTaxSums[$arTaxList[$di]["TAX_ID"]]["NAME"] = $arTaxList[$di]["NAME"]; if ($arTaxList[$di]["IS_IN_PRICE"] != "Y") { $taxPrice += $arTaxList[$di]["VALUE_MONEY"]; } } } else { $arTaxList[0]["VALUE_MONEY"] = (($discountPrice / ($vatRate +1)) * $vatRate) * DoubleVal($arProduct["QUANTITY"]); $taxVatPrice = $arTaxList[0]["VALUE_MONEY"]; } } // Changed by Sigurd, 2007-08-16 $totalOrderPrice = $discountPrice * DoubleVal($arProduct["QUANTITY"]) + $deliveryPrice + $taxPrice; $arProduct["WITHOUT_ORDER"] = (($arProduct["WITHOUT_ORDER"]=="Y") ? "Y" : "N"); if ($arProduct["WITHOUT_ORDER"] == "N") { $DB->StartTransaction(); // Saving $arSaleUser = CSaleUser::GetList(Array(), Array("USER_ID" => $arOrder["USER_ID"])); if(!empty($arSaleUser)) { $currentFUser = $arSaleUser["ID"]; } else { $currentFUser = CSaleUser::_Add( array( "=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $arOrder["USER_ID"] ) ); } $arFields = array( "FUSER_ID" => $currentFUser, "PRODUCT_ID" => $arProduct["PRODUCT_ID"], "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRODUCT_PRICE_ID" => $arProduct["PRODUCT_PRICE_ID"], "PRICE" => $arProduct["PRICE"], "CURRENCY" => $arProduct["CURRENCY"], "WEIGHT" => $arProduct["WEIGHT"], "QUANTITY" => $arProduct["QUANTITY"], "LID" => $arOrder["LID"], "DELAY" => "N", "CAN_BUY" => "Y", "NAME" => $arProduct["NAME"], "CALLBACK_FUNC" => $arProduct["CALLBACK_FUNC"], "ORDER_CALLBACK_FUNC" => $arProduct["ORDER_CALLBACK_FUNC"], "CANCEL_CALLBACK_FUNC" => $arProduct["CANCEL_CALLBACK_FUNC"], "PAY_CALLBACK_FUNC" => $arProduct["PAY_CALLBACK_FUNC"], "PRODUCT_PROVIDER_CLASS" => $arProduct["PRODUCT_PROVIDER_CLASS"], "MODULE" => $arRecur["MODULE"], "NOTES" => $arProduct["CATALOG_GROUP_NAME"], "DETAIL_PAGE_URL" => $arProduct["DETAIL_PAGE_URL"], "VATE_RATE" => $arProduct["VATE_RATE"], "PRODUCT_XML_ID" => $arProduct["PRODUCT_XML_ID"], "RENEWAL" => "Y" ); $basketID = CSaleBasket::Add($arFields); $basketID = IntVal($basketID); if ($basketID <= 0) $bSuccess = False; if ($bSuccess) { if (CModule::IncludeModule("statistic")) CStatistic::Set_Event("eStore", "add2basket", $arFields["PRODUCT_ID"]); $arFields = array( "LID" => $arOrder["LID"], "PERSON_TYPE_ID" => $arOrder["PERSON_TYPE_ID"], "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE_DELIVERY" => $deliveryPrice, "ALLOW_DELIVERY" => "N", "PRICE" => $totalOrderPrice, "CURRENCY" => $baseSiteCurrency, "DISCOUNT_VALUE" => $discount, "USER_ID" => $arOrder["USER_ID"], "PAY_SYSTEM_ID" => $arOrder["PAY_SYSTEM_ID"], "DELIVERY_ID" => $deliveryID, "USER_DESCRIPTION" => $arOrder["USER_DESCRIPTION"], "TAX_VALUE" => (($bUseVat)? $taxVatPrice : $taxPrice), "STAT_GID" => $arOrder["STAT_GID"], "RECURRING_ID" => $arRecur["ID"] ); $newOrderID = CSaleOrder::Add($arFields); $newOrderID = IntVal($newOrderID); if ($newOrderID <= 0) $bSuccess = False; } if ($bSuccess) { $arDiscounts = array(); $arDiscounts[$basketID] = $discountProduct; CSaleBasket::OrderBasket($newOrderID, $currentFUser, $arOrder["LID"], $arDiscounts); } if ($bSuccess) { for ($it = 0, $intCount = count($arTaxList); $it < $intCount; $it++) { $arFields = array( "ORDER_ID" => $newOrderID, "TAX_NAME" => $arTaxList[$it]["TAX_NAME"], "IS_PERCENT" => $arTaxList[$it]["IS_PERCENT"], "VALUE" => ($arTaxList[$it]["IS_PERCENT"]=="Y") ? $arTaxList[$it]["VALUE"] : RoundEx(CCurrencyRates::ConvertCurrency($arTaxList[$it]["VALUE"], $arTaxList[$it]["CURRENCY"], $baseSiteCurrency), 2), "VALUE_MONEY" => $arTaxList[$it]["VALUE_MONEY"], "APPLY_ORDER" => $arTaxList[$it]["APPLY_ORDER"], "IS_IN_PRICE" => $arTaxList[$it]["IS_IN_PRICE"], "CODE" => $arTaxList[$it]["CODE"] ); CSaleOrderTax::Add($arFields); } $dbOrderPropValues = CSaleOrderPropsValue::GetList( array(), array("ORDER_ID" => $arRecur["ORDER_ID"]), false, false, array("ORDER_PROPS_ID", "NAME", "CODE", "VALUE", "PROP_IS_PAYER", "PROP_IS_EMAIL") ); while ($arOrderPropValues = $dbOrderPropValues->Fetch()) { $arFields = array( "ORDER_ID" => $newOrderID, "ORDER_PROPS_ID" => $arOrderPropValues["ORDER_PROPS_ID"], "NAME" => $arOrderPropValues["NAME"], "CODE" => $arOrderPropValues["CODE"], "VALUE" => $arOrderPropValues["VALUE"] ); CSaleOrderPropsValue::Add($arFields); if ($arOrderPropValues["PROP_IS_PAYER"] == "Y") $payerName = $arOrderPropValues["VALUE"]; if ($arOrderPropValues["PROP_IS_EMAIL"] == "Y") $payerEMail = $arOrderPropValues["VALUE"]; } } if ($bSuccess) { if (CModule::IncludeModule("statistic")) CStatistic::Set_Event("eStore", "order_create", $newOrderID); } if ($bSuccess) { $strOrderList = ""; $dbBasketTmp = CSaleBasket::GetList( array("NAME" => "ASC"), array("ORDER_ID" => $newOrderID) ); while ($arBasketTmp = $dbBasketTmp->Fetch()) { $strOrderList .= $arBasketTmp["NAME"]." - ".$arBasketTmp["QUANTITY"]." ".GetMessage("SALE_QUANTITY_UNIT"); $strOrderList .= "\n"; } if (strlen($payerName) <= 0 || strlen($payerEMail) <= 0) { $dbUser = CUser::GetByID($arOrder["USER_ID"]); if ($arUser = $dbUser->Fetch()) { if (strlen($payerName) <= 0) $payerName = $arUser["NAME"].((strlen($arUser["NAME"])<=0 || strlen($arUser["LAST_NAME"])<=0) ? "" : " ").$arUser["LAST_NAME"]; if (strlen($payerEMail) <= 0) $payerEMail = $arUser["EMAIL"]; } } $arFields = Array( "ORDER_ID" => $newOrderID, "ORDER_DATE" => Date($DB->DateFormatToPHP(CLang::GetDateFormat("SHORT", $arOrder["LID"]))), "ORDER_USER" => $payerName, "PRICE" => SaleFormatCurrency($totalOrderPrice, $baseSiteCurrency), "BCC" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME), "EMAIL" => $payerEMail, "ORDER_LIST" => $strOrderList, "SALE_EMAIL" => COption::GetOptionString("sale", "order_email", "order@".$SERVER_NAME) ); $eventName = "SALE_NEW_ORDER_RECURRING"; $bSend = true; foreach(GetModuleEvents("sale", "OnOrderRecurringSendEmail", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, Array($newOrderID, &$eventName, &$arFields))===false) $bSend = false; } if($bSend) { $event = new CEvent; $event->Send($eventName, $arOrder["LID"], $arFields, "N"); } } if ($bSuccess) $DB->Commit(); else $DB->Rollback(); } } else { $totalOrderPrice = $arOrder["PRICE"]; $baseSiteCurrency = $arOrder["CURRENCY"]; } $res = False; if ($bSuccess) { $res = CSaleUserAccount::Pay($arOrder["USER_ID"], $totalOrderPrice, $baseSiteCurrency, $newOrderID, True); if ($res) { if ($arProduct["WITHOUT_ORDER"] == "N") { CSaleOrder::PayOrder($newOrderID, "Y", False, False, $arRecur["ID"]); CSaleOrder::DeliverOrder($newOrderID, "Y", $arRecur["ID"]); CSaleOrder::DeductOrder($newOrderID, "Y", "", true, array(), $arRecur["ID"]); } else { /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arProduct)) { $r = $productProvider::DeliverProduct(array( "PRODUCT_ID" => $arProduct["PRODUCT_ID"], "USER_ID" => $arOrder["USER_ID"], "PAID" => true )); } else { $r = CSaleBasket::ExecuteCallbackFunction( $arProduct["PAY_CALLBACK_FUNC"], $arRecur["MODULE"], $arProduct["PRODUCT_ID"], $arOrder["USER_ID"], true ); } } $arFields = array( "ORDER_ID" => $newOrderID, "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRICE_TYPE" => $arProduct["PRICE_TYPE"], "RECUR_SCHEME_TYPE" => $arProduct["RECUR_SCHEME_TYPE"], "RECUR_SCHEME_LENGTH" => $arProduct["RECUR_SCHEME_LENGTH"], "WITHOUT_ORDER" => $arProduct["WITHOUT_ORDER"], "PRIOR_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID))), "NEXT_DATE" => $arProduct["NEXT_DATE"], "REMAINING_ATTEMPTS" => (Defined("SALE_PROC_REC_ATTEMPTS") ? SALE_PROC_REC_ATTEMPTS : 3), "SUCCESS_PAYMENT" => "Y" ); CSaleRecurring::Update($arRecur["ID"], $arFields); } else { $arFields = array( "ORDER_ID" => $newOrderID, "PRODUCT_NAME" => $arProduct["PRODUCT_NAME"], "PRODUCT_URL" => $arProduct["PRODUCT_URL"], "PRICE_TYPE" => $arProduct["PRICE_TYPE"], "RECUR_SCHEME_LENGTH" => $arProduct["RECUR_SCHEME_LENGTH"], "RECUR_SCHEME_TYPE" => $arProduct["RECUR_SCHEME_TYPE"], "WITHOUT_ORDER" => $arProduct["WITHOUT_ORDER"], "NEXT_DATE" => Date($GLOBALS["DB"]->DateFormatToPHP(CLang::GetDateFormat("FULL", SITE_ID)), time() + SALE_PROC_REC_TIME + CTimeZone::GetOffset()), "REMAINING_ATTEMPTS" => (IntVal($arRecur["REMAINING_ATTEMPTS"]) - 1), "SUCCESS_PAYMENT" => "N" ); CSaleRecurring::Update($arRecur["ID"], $arFields); if ((IntVal($arRecur["REMAINING_ATTEMPTS"]) - 1) <= 0) { CSaleRecurring::CancelRecurring($arRecur["ID"], "Y", "Can't pay order"); /* $arFields["CANCELED"] = "Y"; $arFields["DATE_CANCELED"] = Date(CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG))); $arFields["CANCELED_REASON"] = "Can't pay order"; */ } } } return $res; }
foreach ($order_props as $prop) { $props4[] = 'ORDER_PROP_'.$prop['ORDER_PROPS_ID'] . ' || ' . $code; if ('ORDER_PROP_'.$prop['ORDER_PROPS_ID'] == $code) { $is_code_found = true; $props2[] = $prop['VALUE'] . ' | ' . $json['order'][$v]; if ($prop['VALUE'] != $json['order'][$v]) { if (CSaleOrderPropsValue::Update($prop['ID'], array("ORDER_ID" => $order['ID'], "VALUE" => $json['order'][$v]))) { $message[] = 'order prop '.$v.' is updated'; } else { $error[] = 'could not update order property for '.$v; } } } } if (!$is_code_found && $json['order'][$v] && $new_prop_id = intVal(str_replace("ORDER_PROP_", "", $code))) { $new_prop_res = CSaleOrderProps::GetList(array(), array("ID" => $new_prop_id)); if ($new_prop_ar = $new_prop_res->Fetch()) { if ($new_prop_add_result = CSaleOrderPropsValue::Add(array("ORDER_ID" => $order['ID'], "ORDER_PROPS_ID" => $new_prop_id, "VALUE" => $json['order'][$v], "NAME" => $new_prop_ar['NAME'], "CODE" => $new_prop_ar['CODE']))) { $message[] = 'order prop '.$v.' is added'; } else { $error[] = 'could not add order property for '.$v; } } } } if ($order['USER_DESCRIPTION'] != $json['order']['comments']) { if (CSaleOrder::Update($order['ID'], array('USER_DESCRIPTION' => $json['order']['comments']), true)) { $message[] = 'order user_description is updated'; } else { $error[] = 'could not update order user_description'; } } /* foreach ($json['order']['goods'] as $good) { $goods[$good['shop_good_code']] = $good;
function __MakeOrder($prdCnt = 1, $arData = array()) { global $APPLICATION, $USER, $DB; CModule::IncludeModule("iblock"); CModule::IncludeModule("sale"); CModule::IncludeModule("catalog"); $arPrd = array(); $dbItem = CIBlockElement::GetList(array(), array("IBLOCK_TYPE" => "offers", "IBLOCK_SITE_ID" => WIZARD_SITE_ID, "PROPERTY_NEWPRODUCT" => false), false, array("nTopCount" => 100), array("ID", "IBLOCK_ID", "XML_ID", "NAME", "DETAIL_PAGE_URL", "IBLOCK_XML_ID")); while ($arItem = $dbItem->GetNext()) { $arPrd[] = $arItem; } if (!empty($arPrd)) { $arOrder = array("LID" => $arData["SITE_ID"], "PERSON_TYPE_ID" => $arData["PERSON_TYPE_ID"], "PAYED" => "N", "CANCELED" => "N", "STATUS_ID" => "N", "PRICE" => 1, "CURRENCY" => $arData["CURRENCY"], "USER_ID" => $arData["USER_ID"], "PAY_SYSTEM_ID" => $arData["PAY_SYSTEM_ID"]); $fuserID = 0; $dbFUserListTmp = CSaleUser::GetList(array("USER_ID" => $arData["USER_ID"])); if (empty($dbFUserListTmp)) { $arFields = array("=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $arData["USER_ID"]); $fuserID = CSaleUser::_Add($arFields); } else { $fuserID = $dbFUserListTmp['ID']; } $orderID = CSaleOrder::Add($arOrder); CCatalogProduct::setPriceVatIncludeMode(true); CCatalogProduct::setUsedCurrency(CSaleLang::GetLangCurrency(WIZARD_SITE_ID)); CCatalogProduct::setUseDiscount(true); for ($i = 0; $i < $prdCnt; $i++) { $prdID = $arPrd[mt_rand(20, 99)]; $arProduct = CCatalogProduct::GetByID($prdID["ID"]); $arPrice = CCatalogProduct::GetOptimalPrice($prdID["ID"], 1, array(2), 'N', array(), WIZARD_SITE_ID, array()); $arFields = array("IGNORE_CALLBACK_FUNC" => "Y", "PRODUCT_ID" => $prdID["ID"], "PRODUCT_PRICE_ID" => $arPrice['PRICE']['ID'], "BASE_PRICE" => $arPrice['RESULT_PRICE']['BASE_PRICE'], "PRICE" => $arPrice['RESULT_PRICE']['DISCOUNT_PRICE'], "VAT_RATE" => $arPrice['PRICE']['VAT_RATE'], "CURRENCY" => $arPrice['RESULT_PRICE']['CURRENCY'], "WEIGHT" => $arProduct["WEIGHT"], "DIMENSIONS" => serialize(array("WIDTH" => $arProduct["WIDTH"], "HEIGHT" => $arProduct["HEIGHT"], "LENGTH" => $arProduct["LENGTH"])), "QUANTITY" => 1, "LID" => WIZARD_SITE_ID, "DELAY" => "N", "CAN_BUY" => "Y", "NAME" => $prdID["NAME"], "CALLBACK_FUNC" => "", "MODULE" => "catalog", "PRODUCT_PROVIDER_CLASS" => "CCatalogProductProvider", "ORDER_CALLBACK_FUNC" => "", "CANCEL_CALLBACK_FUNC" => "", "PAY_CALLBACK_FUNC" => "", "DETAIL_PAGE_URL" => $prdID["DETAIL_PAGE_URL"], "CATALOG_XML_ID" => $prdID["IBLOCK_XML_ID"], "PRODUCT_XML_ID" => $prdID["XML_ID"], "NOTES" => $arPrice["PRICE"]["CATALOG_GROUP_NAME"], "FUSER_ID" => $fuserID, "ORDER_ID" => $orderID); $addres = CSaleBasket::Add($arFields); } $dbBasketItems = CSaleBasket::GetList(array(), array("ORDER_ID" => $orderID), false, false, array("ID", "QUANTITY", "PRICE")); $ORDER_PRICE = 0; while ($arBasketItems = $dbBasketItems->GetNext()) { $ORDER_PRICE += roundEx($arBasketItems["PRICE"], SALE_VALUE_PRECISION) * DoubleVal($arBasketItems["QUANTITY"]); } $totalOrderPrice = $ORDER_PRICE + $arData["PRICE_DELIVERY"]; CSaleOrder::Update($orderID, array("PRICE" => $totalOrderPrice)); foreach ($arData["PROPS"] as $val) { $arFields = array("ORDER_ID" => $orderID, "ORDER_PROPS_ID" => $val["ID"], "NAME" => $val["NAME"], "CODE" => $val["CODE"], "VALUE" => $val["VALUE"]); CSaleOrderPropsValue::Add($arFields); } return $orderID; } }
public function formAndSendDataToGP($type, $options = array(), $arFields) { $ID = intVal($options['ID']); if ($ID) { CModule::IncludeModule('sale'); $order = CSaleOrder::GetList(array(), array("ID" => $ID), false, false, array("MARKED", "PERSON_TYPE_ID"))->Fetch(); if ($order['MARKED'] == 'Y') { $order_is_marked = true; } else { $order_is_marked = false; } if ($arFields['PERSON_TYPE_ID'] > 0) { $person_type_id = $arFields['PERSON_TYPE_ID']; } elseif ($order['PERSON_TYPE_ID'] > 0) { $person_type_id = $order['PERSON_TYPE_ID']; } if ($person_type_id) { // get $_POST keys for needed parameters from module options /*$keys_list = array( 'customer_name', 'customer_phone', 'customer_email', 'delivery_address', 'location', 'city', 'GP_PHONE_ADDITIONAL', 'GP_FLOOR', 'GP_ENTRY', 'GP_INTERCOM_CODE', 'GP_ORDER_ID' );*/ $keys_list = array( 'customer_name', 'customer_email', 'customer_phone', 'delivery_city', 'delivery_alt_city', 'delivery_address', 'delivery_address_street', 'delivery_address_house', 'delivery_address_building', 'delivery_address_housing', 'delivery_address_apartment', 'customer_second_phone', 'floor', 'porch', 'intercom_code', 'comments', //'system_choosen', 'gp_order_id_0' ); foreach ($keys_list as $key) { $post_key[$key] = COption::GetOptionString(self::$MODULE_ID, 'match_id_'.$person_type_id.'_'.$key); } $filename = $_SERVER['DOCUMENT_ROOT'] . '/templog.log'; file_put_contents($filename, var_export($post_key, true), FILE_APPEND | LOCK_EX); file_put_contents($filename, var_export($_POST, true), FILE_APPEND | LOCK_EX); $arOrder = CSaleOrder::GetByID($ID); if($options["ACTION"] == "ORDER"){ //var_dump($arOrder["ACCOUNT_NUMBER"]);die(); $db_props = CSaleOrderPropsValue::GetOrderProps($ID); $arFields_props = array(); while ($arProps = $db_props->Fetch()) { $_POST["ORDER_PROP_".$arProps["ORDER_PROPS_ID"]]=$arProps["VALUE"]; } $_POST['PAY_SYSTEM_ID'] = $arOrder["PAY_SYSTEM_ID"]; $_POST[$post_key['comments']] = $arOrder["USER_DESCRIPTION"]; } // get city for delivery_address /*if ($_POST[$post_key['delivery_city']]) { $city_name = $_POST[$post_key['delivery_city']] . ' '; } else*/ if ($_POST[$post_key['delivery_city']] || $_POST['CITY_'.$post_key['delivery_city']]) { if ($_POST[$post_key['delivery_city']]) { $city_id = $_POST[$post_key['delivery_city']]; } else { $city_id = $_POST['CITY_'.$post_key['delivery_city']]; } $cityRes = CSaleLocation::GetList( array(), array("LID" => LANGUAGE_ID, "ID" => $city_id), false, array("nTopCount" => 1), array('CITY_NAME') ); if ($cityAr = $cityRes->Fetch()) { $city_name = $cityAr['CITY_NAME'] . ' '; } else { $city_name = ''; } } if($_POST[$post_key['delivery_alt_city']]){ $city_name = $_POST[$post_key['delivery_alt_city']]; } // set parameters if($_POST[$post_key['customer_name']]){ $post_data['order']['customer_name'] = $_POST[$post_key['customer_name']]; } if($_POST[$post_key['customer_email']]){ $post_data['order']['customer_email'] = $_POST[$post_key['customer_email']]; }elseif($_POST["NEW_BUYER_EMAIL"]){ $post_data['order']['customer_email'] = $_POST["NEW_BUYER_EMAIL"]; }else{ //get email from id if($_POST["user_id"]){ $user_id = $_POST["user_id"]; }else{ $user_id = $arOrder["USER_ID"]; } $rsUser = CUser::GetByID($user_id); $arUser = $rsUser->Fetch(); if($arUser["EMAIL"]){ $post_data['order']['customer_email'] = $arUser["EMAIL"]; } } //var_dump($_POST);die(); if($_POST[$post_key['customer_phone']]){ $post_data['order']['customer_phone'] = $_POST[$post_key['customer_phone']]; } if($city_name){ $post_data['order']['delivery_city'] = $city_name; } if($_POST[$post_key['delivery_address']] && $_POST[$post_key['delivery_address_street']]){ $post_data['order']['delivery_address'] = $_POST[$post_key['delivery_address']].", ".$_POST[$post_key['delivery_address_street']]; } if($_POST[$post_key['delivery_address']] && !$_POST[$post_key['delivery_address_street']]){ $post_data['order']['delivery_address'] = $_POST[$post_key['delivery_address']]; } if(!$_POST[$post_key['delivery_address']] && $_POST[$post_key['delivery_address_street']]){ $post_data['order']['delivery_address'] = $_POST[$post_key['delivery_address_street']]; } if($_POST[$post_key['delivery_address_house']]){ $post_data['order']['delivery_address_house'] = $_POST[$post_key['delivery_address_house']]; } if($_POST[$post_key['delivery_address_building']]){ $post_data['order']['delivery_address_building'] = $_POST[$post_key['delivery_address_building']]; } if($_POST[$post_key['delivery_address_housing']]){ $post_data['order']['delivery_address_housing'] = $_POST[$post_key['delivery_address_housing']]; } if($_POST[$post_key['delivery_address_apartment']]){ $post_data['order']['delivery_address_apartment'] = $_POST[$post_key['delivery_address_apartment']]; } if($_POST[$post_key['customer_second_phone']]){ $post_data['order']['customer_second_phone'] = $_POST[$post_key['customer_second_phone']]; } if($_POST[$post_key['floor']]){ $post_data['order']['floor'] = $_POST[$post_key['floor']]; } if($_POST[$post_key['porch']]){ $post_data['order']['porch'] = $_POST[$post_key['porch']]; } if($_POST[$post_key['intercom_code']]){ $post_data['order']['intercom_code'] = $_POST[$post_key['intercom_code']]; } if($_POST[$post_key['comments']]){ $post_data['order']['comments'] = $_POST[$post_key['comments']]; } //$post_data['order']['comments'] = $_POST['USER_DESCRIPTION']; $post_data['api_auth_token'] = COption::GetOptionString(self::$MODULE_ID, 'secret_key'); if (isset($options['widget_token']) && $options['widget_token']) { $post_data['order']['widget_token'] = $options['widget_token']; } $post_data['order']['widget_token'] = $_POST['widget_token']; //$post_data['order']['shop_order_code'] = $ID; $post_data['order']['shop_order_code'] = $arOrder["ACCOUNT_NUMBER"]; //$post_data['order']['customer_name'] = $_POST[$post_key['customer_name']] ? $_POST[$post_key['customer_name']] : ($arFields['ORDER_USER'] ? $arFields['ORDER_USER'] : ''); //$post_data['order']['customer_phone'] = $_POST[$post_key['customer_phone']]; //$post_data['order']['customer_email'] = $_POST[$post_key['customer_email']]; //$post_data['order']['delivery_address'] = $city_name . $_POST[$post_key['delivery_address']]; //if ($_POST[$post_key['GP_PHONE_ADDITIONAL']]) { $post_data['order']['customer_second_phone'] = $_POST[$post_key['GP_PHONE_ADDITIONAL']]; } //if (intVal($_POST[$post_key['GP_FLOOR']])) { $post_data['order']['floor'] = intVal($_POST[$post_key['GP_FLOOR']]); } //if ($_POST[$post_key['GP_ENTRY']]) { $post_data['order']['porch'] = $_POST[$post_key['GP_ENTRY']]; } //if ($_POST[$post_key['GP_INTERCOM_CODE']]) { $post_data['order']['intercom_code'] = $_POST[$post_key['GP_INTERCOM_CODE']]; } $post_data['order']['payment_type'] = COption::GetOptionString(self::$MODULE_ID, 'paysystem_match_'.intVal($_POST['PAY_SYSTEM_ID'])); // set products list for parameters if (!isset($_POST['PRODUCT']) || empty($_POST['PRODUCT'])) { $products = array(); $productRes = CSaleBasket::GetList( array(), array("ORDER_ID" => $ID), false, false, array('PRODUCT_ID', 'PRICE_DEFAULT', 'PRICE', 'QUANTITY', 'WEIGHT', 'NAME') ); while ($productAr = $productRes->Fetch()) { $products[] = $productAr; } } else { $products = $_POST['PRODUCT']; } // set products list parameters $cell = 0; foreach ($products as $arProduct) { // $post_data['order']['good_attributes'][$cell]['size'] = 'medium'; $post_data['order']['good_attributes'][$cell]['shop_good_code'] = $arProduct['PRODUCT_ID']; $post_data['order']['good_attributes'][$cell]['estimated_price'] = $arProduct['PRICE_DEFAULT']; $post_data['order']['good_attributes'][$cell]['price'] = $arProduct['PRICE']; $post_data['order']['good_attributes'][$cell]['count'] = $arProduct['QUANTITY']; $post_data['order']['good_attributes'][$cell]['weight'] = $arProduct['WEIGHT']; $post_data['order']['good_attributes'][$cell]['name'] = $arProduct['NAME']; $cell++; } } } // send data to GP server if ($options["URL"]) { $arConfig = self::$CONFIG; $stop_send = false; $ch = curl_init(); if (intVal($_POST[$post_key['gp_order_id']]) == 0) { $type = "POST"; //$options["URL"] = COption::GetOptionString(self::$MODULE_ID, 'POST_url'); $options["URL"] = COption::GetOptionString(self::$MODULE_ID, 'gp_script_url') . $arConfig["POST_URL"]; } if ($type == "POST" && !empty($post_data['widget_token'])) { $post_data['with_draft'] = true; }elseif($type == "POST" && empty($post_data['widget_token'])){ $post_data['with_draft'] = false; } // set data for sending to GP server $send_data = json_encode($post_data); if ($type == "POST") { curl_setopt($ch, CURLOPT_POST, true); } elseif ($type == "PATCH") { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PATCH'); } else { $stop_send = true; } curl_setopt($ch, CURLOPT_URL, $options["URL"]); curl_setopt($ch, CURLOPT_POSTFIELDS, $send_data); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json; charset=utf-8')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if (!$stop_send) { $result = json_decode(curl_exec($ch), true); } curl_close($ch); if (is_array($result['error_message']) && count($result['error_message']) == 1) { $comment = implode("\r\n", $result['error_message']); $comment = CGPWidget::Translate($comment); CSaleOrder::SetMark($ID, $comment); } elseif (is_array($result['error_message']) && count($result['error_message']) > 1) { $comment = $result['error_message']; $ar_comment = ""; foreach($comment as $com){ $ar_comment .= CGPWidget::Translate($com).". "; } CSaleOrder::SetMark($ID, $ar_comment); } elseif ($result) { if ($order_is_marked) { CSaleOrder::UnsetMark($ID); } if (intVal($_POST[$post_key['gp_order_id_0']]) == 0 && $result['id']/* && intVal($_POST[$post_key['gp_order_id']]) != $result['id']*/) { // $_POST[$post_key['gp_order_id']] = $result['id']; if ($gp_order_id_prop_id = intVal(str_replace("ORDER_PROP_", "", $post_key['gp_order_id_0']))) { $gp_order_id_res = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $ID, "ORDER_PROPS_ID" => $gp_order_id_prop_id)); if ($gp_order_id_ar = $gp_order_id_res->Fetch()) { $gp_order_id_prop_value_id = $gp_order_id_ar['ID']; if ($gp_order_id_prop_value_id) { $gp_order_id_add_result = CSaleOrderPropsValue::Update($gp_order_id_prop_value_id, array("ORDER_ID" => $ID, "VALUE" => $result['id'])); } } else { $gp_order_id_prop_res = CSaleOrderProps::GetList(array(), array("ID" => $gp_order_id_prop_id)); if ($gp_order_id_prop_ar = $gp_order_id_prop_res->Fetch()) { $gp_order_id_add_result = CSaleOrderPropsValue::Add(array("ORDER_ID" => $ID, "ORDER_PROPS_ID" => $gp_order_id_prop_id, "VALUE" => $result['id'], "NAME" => $gp_order_id_prop_ar['NAME'], "CODE" => $gp_order_id_prop_ar['CODE'])); } } } } } /* echo "<pre>"; var_dump($_POST); var_dump($post_data); var_dump($result); echo "</pre>"; die();*/ } // log everything $filename = $_SERVER['DOCUMENT_ROOT'] . '/templog.log'; $data = array($type, date('d.m.Y h:i:s'), "ORDER" => $ID, "URL" => $options["URL"], "SEND" => $send_data, "RESULT" => $result, "ARFIELDS" => $arFields); // $data = array($type, date('d.m.Y h:i:s'), "ORDER" => $ID, "URL" => $options["URL"], "SEND" => $send_data, "gpid" => array('add' => $m, 'res' => $gp_order_id_add_result, '1' => array($gp_order_id_prop_value_id, array("ORDER_ID" => $ID, "VALUE" => $result['id'])), 'ar' => $gp_order_id_ar, 'val' => $gp_order_id_prop_value_id, 'post_gpoid' => $result['id'], "ORDER_ID" => $ID, 'ORDER_PROPS_ID' => str_replace("ORDER_PROP_", "", $post_key['gp_order_id'])), array($_POST[$post_key['gp_order_id']], $post_key['gp_order_id']), "RESULT" => $result); // $data = array($type, date('d.m.Y h:i:s'), $ID, $send_data, $result, $city_name, $city_id, $post_key, $_POST); file_put_contents($filename, var_export($data, true), FILE_APPEND | LOCK_EX); }
protected static function updateProps($value, $code, $param) { if ($value == '' || !CModule::IncludeModule('sale')) { return false; } $add = false; if (isset($param['update'][$param['options'][$param['type']][$code]]) == false) { if ($arProp = CSaleOrderProps::GetList(array(), array('CODE' => $param['options'][$param['type']][$code]))->Fetch()) { $param['update'][$param['options'][$param['type']][$code]] = array('NAME' => $arProp['NAME'], 'CODE' => $arProp['CODE'], 'ORDER_PROPS_ID' => $arProp['ID'], 'TYPE' => $arProp['TYPE'], 'ORDER_ID' => $param['orderId'], 'VALUE' => ''); $add = true; } else { return false; } } if ($param['update'][$param['options'][$param['type']][$code]]['TYPE'] == 'LOCATION') { $value = self::getLocation($value); if ($value == false) { return false; } } if ($param['update'][$param['options'][$param['type']][$code]]['VALUE'] != $value) { if ($add === true) { $param['update'][$param['options'][$param['type']][$code]]['VALUE'] = $value; CSaleOrderPropsValue::Add($param['update'][$param['options'][$param['type']][$code]]); } else { CSaleOrderPropsValue::Update($param['update'][$param['options'][$param['type']][$code]]['ID'], array('VALUE' => $value)); } } }
function AddOrderProperty($code, $value, $order) { if (!strlen($code)) { return false; } if (CModule::IncludeModule('sale')) { if ($arProp = CSaleOrderProps::GetList(array(), array('CODE' => $code))->Fetch()) { return CSaleOrderPropsValue::Add(array('NAME' => $arProp['NAME'], 'CODE' => $arProp['CODE'], 'ORDER_PROPS_ID' => $arProp['ID'], 'ORDER_ID' => $order, 'VALUE' => $value)); } } }