/** * Updates information about basket products after changes have been made in the order_new form * (saves newly added basket items, changes their quantity, saves barcodes etc) * * @param int $orderId - order ID * @param string $siteId - site ID * @param bool $userId - user ID * @param array $arShoppingCart - array of basket items * @param array $arErrors * @param array $arCoupons * @param array $arStoreBarcodeOrderFormData - array of stores and barcodes for deduction (from order_new form) * @param bool $bSaveBarcodes - flat to save given barcode data. Used if the order is already deducted or at least has saved other barcodes * @return bool */ public static function DoSaveOrderBasket($orderId, $siteId, $userId, &$arShoppingCart, &$arErrors, $arCoupons = array(), $arStoreBarcodeOrderFormData = array(), $bSaveBarcodes = false) { global $DB, $USER; $currentUserID = 0; if (isset($USER) && $USER instanceof CUser) { $currentUserID = (int) $USER->GetID(); } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DoSaveOrderBasket - Started", array("orderId" => $orderId, "siteId" => $siteId, "userId" => $userId, "arShoppingCart" => $arShoppingCart, "bSaveBarcodes" => $bSaveBarcodes, "arStoreBarcodeOrderFormData" => $arStoreBarcodeOrderFormData), "DSOB1"); } $orderId = (int) $orderId; if ($orderId <= 0) { return false; } if (empty($arShoppingCart) || !is_array($arShoppingCart)) { $arErrors[] = array("CODE" => "PARAM", "TEXT" => Loc::getMessage('SKGB_SHOPPING_CART_EMPTY')); return false; } $isOrderReserved = false; $isOrderDeducted = false; $dbOrderTmp = CSaleOrder::GetList(array(), array("ID" => $orderId), false, false, array("ID", "RESERVED", "DEDUCTED")); if ($arOrder = $dbOrderTmp->Fetch()) { if ($arOrder["RESERVED"] == "Y") { $isOrderReserved = true; } if ($arOrder["DEDUCTED"] == "Y") { $isOrderDeducted = true; } } $arOldItems = array(); $dbItems = CSaleBasket::GetList(array(), array("ORDER_ID" => $orderId), false, false, array("ID", "QUANTITY", "CANCEL_CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "PRODUCT_PROVIDER_CLASS", "RESERVED", "RESERVE_QUANTITY", "TYPE", "SET_PARENT_ID")); while ($arItem = $dbItems->Fetch()) { $arOldItems[$arItem["ID"]] = array("QUANTITY" => $arItem["QUANTITY"], "CANCEL_CALLBACK_FUNC" => $arItem["CANCEL_CALLBACK_FUNC"], "PRODUCT_PROVIDER_CLASS" => $arItem["PRODUCT_PROVIDER_CLASS"], "MODULE" => $arItem["MODULE"], "PRODUCT_ID" => $arItem["PRODUCT_ID"], "RESERVED" => $arItem["RESERVED"], "RESERVE_QUANTITY" => $arItem["RESERVE_QUANTITY"], "TYPE" => $arItem["TYPE"], "SET_PARENT_ID" => $arItem["SET_PARENT_ID"]); } if (!empty($arCoupons)) { if (!is_array($arCoupons)) { $arCoupons = array($arCoupons); } foreach (GetModuleEvents("sale", "OnSetCouponList", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($userId, $arCoupons, array())); } foreach ($arCoupons as &$coupon) { $couponResult = DiscountCouponsManager::add($coupon); } unset($coupon); } $arFUserListTmp = CSaleUser::GetList(array("USER_ID" => $userId)); if (empty($arFUserListTmp)) { $arFields = array("=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $userId, "CODE" => md5(time() . randString(10))); $FUSER_ID = CSaleUser::_Add($arFields); } else { $FUSER_ID = $arFUserListTmp["ID"]; } // re-sort basket data so newly added Set parents come before Set items (used to correctly add Set items to the table) usort($arShoppingCart, array("CSaleBasketHelper", "cmpSetData")); foreach ($arShoppingCart as &$arItem) { $arItemKeys = array_keys($arItem); foreach ($arItemKeys as $fieldName) { if (array_key_exists("~" . $fieldName, $arItem)) { if (is_array($arItem["~" . $fieldName]) && !empty($arItem["~" . $fieldName]) || !is_array($arItem["~" . $fieldName]) && strlen($arItem["~" . $fieldName]) > 0) { $arItem[$fieldName] = $arItem["~" . $fieldName]; } unset($arItem["~" . $fieldName]); } } $arItem = array_filter($arItem, array("CSaleBasketHelper", "filterFields")); } unset($arItem); $arTmpSetParentId = array(); foreach ($arShoppingCart as $arItem) { if (strpos($arItem["SET_PARENT_ID"], "tmp") !== false) { $arTmpSetParentId[$arItem["SET_PARENT_ID"]] = $arItem["SET_PARENT_ID"]; } } // iterate over basket data to save it to basket or change quantity (and reserve/deduct accordingly) foreach ($arShoppingCart as &$arItem) { foreach ($arItem as $tmpKey => $tmpVal) { if (is_array($tmpVal) && !in_array($tmpKey, array("STORES", "CATALOG", "PROPS"))) { $arItem[$tmpKey] = serialize($tmpVal); } } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DoSaveOrderBasket - Item", array("arItem" => $arItem), "DSOB2"); } if (array_key_exists("ID", $arItem) && (int) $arItem["ID"] > 0) { $arItem["ID"] = (int) $arItem["ID"]; if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DoSaveOrderBasket - Product #" . $arItem["ID"] . " already in the basket", array(), "DSOB3"); } // product already in the basket, change quantity if (array_key_exists($arItem["ID"], $arOldItems)) { if (!CSaleBasketHelper::isSetParent($arItem)) { $arAdditionalParams = array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId); $quantity = $arItem["QUANTITY"] - $arOldItems[$arItem["ID"]]["QUANTITY"]; $arAdditionalParams["CHECK_QUANTITY"] = $quantity > 0 ? "Y" : "N"; if ($quantity != 0) { self::DoChangeProductQuantity($arItem, $quantity, $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$arItem["ID"]], $arAdditionalParams); } else { $arAdditionalParams['CHECK_QUANTITY'] = 'N'; self::DoChangeProductQuantity($arItem, $quantity, $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$arItem["ID"]], $arAdditionalParams); } } unset($arOldItems[$arItem["ID"]]); } else { if ($arItem["QUANTITY"] != 0 && !CSaleBasketHelper::isSetParent($arItem)) { self::DoChangeProductQuantity($arItem, $arItem["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$arItem["ID"]], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); } } if (IntVal($arItem["FUSER_ID"]) <= 0) { $arFuserItems = CSaleUser::GetList(array("USER_ID" => intval($userId))); $arItem["FUSER_ID"] = $arFuserItems["ID"]; } if (CSaleBasketHelper::isSetItem($arItem)) { // quantity for set items will be changed when parent item is updated unset($arItem["QUANTITY"]); } CSaleBasket::Update($arItem["ID"], array("ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); } else { if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DoSaveOrderBasket - new product in the basket", array(), "DSOB4"); } unset($arItem["ID"]); /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arItem)) { $oldSetParentId = -1; if (CSaleBasketHelper::isSetParent($arItem) && array_key_exists($arItem["SET_PARENT_ID"], $arTmpSetParentId)) { $oldSetParentId = $arItem["SET_PARENT_ID"]; $arItem["MANUAL_SET_ITEMS_INSERTION"] = "Y"; } if (CSaleBasketHelper::isSetItem($arItem) && array_key_exists($arItem["SET_PARENT_ID"], $arTmpSetParentId)) { $arItem["SET_PARENT_ID"] = $arTmpSetParentId[$arItem["SET_PARENT_ID"]]; } $arItem["ID"] = CSaleBasket::Add(array("ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); if (isset($arItem["MANUAL_SET_ITEMS_INSERTION"])) { $arTmpSetParentId[$oldSetParentId] = $arItem["ID"]; } if ($bSaveBarcodes) { if ($arItem["BARCODE_MULTI"] == "N") { if (is_array($arItem["STORES"])) { foreach ($arItem["STORES"] as $arStore) { $arStoreBarcodeFields = array("BASKET_ID" => $arItem["ID"], "BARCODE" => "", "STORE_ID" => $arStore["STORE_ID"], "QUANTITY" => $arStore["QUANTITY"], "CREATED_BY" => $currentUserID > 0 ? $currentUserID : '', "MODIFIED_BY" => $currentUserID > 0 ? $currentUserID : ''); CSaleStoreBarcode::Add($arStoreBarcodeFields); } } } else { if (!empty($arItem["STORES"]) && is_array($arItem["STORES"])) { foreach ($arItem["STORES"] as $arStore) { if (isset($arStore["BARCODE"]) && isset($arStore["BARCODE_FOUND"])) { foreach ($arStore["BARCODE"] as $barcodeId => $barcodeValue) { // save only non-empty and valid barcodes TODO - if errors? if (strlen($barcodeValue) > 0 && $arStore["BARCODE_FOUND"][$barcodeId] == "Y") { $arStoreBarcodeFields = array("BASKET_ID" => $arItem["ID"], "BARCODE" => $barcodeValue, "STORE_ID" => $arStore["STORE_ID"], "QUANTITY" => 1, "CREATED_BY" => $currentUserID > 0 ? $currentUserID : '', "MODIFIED_BY" => $currentUserID > 0 ? $currentUserID : ''); CSaleStoreBarcode::Add($arStoreBarcodeFields); } } } } } } } if ($arItem["QUANTITY"] != 0 && !CSaleBasketHelper::isSetParent($arItem)) { self::DoChangeProductQuantity($arItem, $arItem["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arItem["STORES"], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); } if ($FUSER_ID > 0) { $arItem["FUSER_ID"] = $FUSER_ID; } } else { if ($arItem["QUANTITY"] != 0 && !CSaleBasketHelper::isSetParent($arItem)) { self::DoChangeProductQuantity($arItem, $arItem["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arItem["STORES"], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); } if ($FUSER_ID > 0) { $arItem["FUSER_ID"] = $FUSER_ID; } $arItem["ID"] = CSaleBasket::Add(array("ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); //$arItem["ID"] = CSaleBasket::Add(array("CALLBACK_FUNC" => false, "ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); } } } unset($arItem); if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Items left in the old basket:", array("arOldItems" => $arOldItems), "DSOB5"); } // if some items left in the table which are not present in the updated basket, delete them $arSetParentsIDs = array(); foreach ($arOldItems as $key => $arOldItem) { $arOldItem["ID"] = $key; if (CSaleBasketHelper::isSetParent($arOldItem)) { $arSetParentsIDs[] = $arOldItem["ID"]; continue; } else { // the quantity is negative, so the product is canceled self::DoChangeProductQuantity($arOldItem, -$arOldItem["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$arOldItem["ID"]], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); } CSaleBasket::Delete($key); } foreach ($arSetParentsIDs as $setParentID) { CSaleBasket::Delete($setParentID); } foreach (GetModuleEvents("sale", "OnDoBasketOrder", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($orderId)); } return true; }
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; } }
/** * <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; }
public static function Add() { global $DB, $USER; $arFields = array("=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => is_object($USER) && $USER->IsAuthorized() ? IntVal($USER->GetID()) : False, "CODE" => md5(time() . randString(10))); $ID = CSaleUser::_Add($arFields); $ID = IntVal($ID); $secure = false; if (COption::GetOptionString("sale", "use_secure_cookies", "N") == "Y" && CMain::IsHTTPS()) { $secure = 1; } if (COption::GetOptionString("sale", "encode_fuser_id", "N") == "Y") { $arRes = CSaleUser::GetList(array("ID" => $ID)); if (!empty($arRes)) { $GLOBALS["APPLICATION"]->set_cookie("SALE_UID", $arRes["CODE"], false, "/", false, $secure, "Y", false); } } else { $GLOBALS["APPLICATION"]->set_cookie("SALE_UID", $ID, false, "/", false, $secure, "Y", false); } return $ID; }
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; } }
function Add() { global $DB, $USER; $arFields = array("=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $USER->IsAuthorized() ? IntVal($USER->GetID()) : False); $ID = CSaleUser::_Add($arFields); $ID = IntVal($ID); $secure = false; if (COption::GetOptionString("sale", "use_secure_cookies", "N") == "Y" && CMain::IsHTTPS()) { $secure = 1; } $GLOBALS["APPLICATION"]->set_cookie("SALE_UID", $ID, false, "/", false, $secure, "Y", false); return $ID; }
static function DoSaveOrderBasket($orderId, $siteId, $userId, &$arShoppingCart, &$arErrors, $arCoupons = array(), $arStoreBarcodeOrderFormData = array(), $bSaveBarcodes = false) { global $DB; if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DoSaveOrderBasket - Started", array("orderId" => $orderId, "siteId" => $siteId, "userId" => $userId, "bSaveBarcodes" => $bSaveBarcodes, "arStoreBarcodeOrderFormData" => $arStoreBarcodeOrderFormData), "DSOB1"); } $orderId = IntVal($orderId); if ($orderId <= 0) { return false; } if (!is_array($arShoppingCart) || count($arShoppingCart) <= 0) { $arErrors[] = array("CODE" => "PARAM", "TEXT" => GetMessage('SKGB_SHOPPING_CART_EMPTY')); return false; } $isOrderReserved = false; $isOrderDeducted = false; $dbOrderTmp = CSaleOrder::GetList(array(), array("ID" => $orderId), false, false, array("ID", "RESERVED", "DEDUCTED")); if ($arOrder = $dbOrderTmp->Fetch()) { if ($arOrder["RESERVED"] == "Y") { $isOrderReserved = true; } if ($arOrder["DEDUCTED"] == "Y") { $isOrderDeducted = true; } } $arOldItems = array(); $dbResult = CSaleBasket::GetList(array(), array("ORDER_ID" => $orderId), false, false, array("ID", "QUANTITY", "CANCEL_CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "PRODUCT_PROVIDER_CLASS", "RESERVED", "RESERVE_QUANTITY")); while ($arResult = $dbResult->Fetch()) { $arOldItems[$arResult["ID"]] = array("QUANTITY" => $arResult["QUANTITY"], "CANCEL_CALLBACK_FUNC" => $arResult["CANCEL_CALLBACK_FUNC"], "PRODUCT_PROVIDER_CLASS" => $arResult["PRODUCT_PROVIDER_CLASS"], "MODULE" => $arResult["MODULE"], "PRODUCT_ID" => $arResult["PRODUCT_ID"], "RESERVED" => $arResult["RESERVED"], "RESERVE_QUANTITY" => $arResult["RESERVE_QUANTITY"]); } if (is_array($arCoupons) && count($arCoupons) > 0) { foreach (GetModuleEvents("sale", "OnSetCouponList", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($userId, $arCoupons, array())); } } $FUSER_ID = 0; $arFUserListTmp = CSaleUser::GetList(array("USER_ID" => $userId)); if (empty($arFUserListTmp)) { $arFields = array("=DATE_INSERT" => $DB->GetNowFunction(), "=DATE_UPDATE" => $DB->GetNowFunction(), "USER_ID" => $userId); $FUSER_ID = CSaleUser::_Add($arFields); } else { $FUSER_ID = $arFUserListTmp["ID"]; } foreach ($arShoppingCart as $id => &$arItem) { if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DoSaveOrderBasket - Item", array("arItem" => $arItem), "DSOB2"); } if (array_key_exists("ID", $arItem) && intval($arItem["ID"]) > 0) { $arItem["ID"] = intval($arItem["ID"]); if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DoSaveOrderBasket - Product #" . $arItem["ID"] . " already in the basket", array(), "DSOB3"); } //product already in the basket, change quantity if (array_key_exists($arItem["ID"], $arOldItems)) { if ($arOldItems[$arItem["ID"]]["QUANTITY"] - $arItem["QUANTITY"] != 0) { self::DoChangeProductQuantity($arItem, $arItem["QUANTITY"] - $arOldItems[$arItem["ID"]]["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$arItem["ID"]], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); } unset($arOldItems[$arItem["ID"]]); } else { if ($arItem["QUANTITY"] != 0) { self::DoChangeProductQuantity($arItem, $arItem["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$arItem["ID"]], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); } } $arFuserItems = CSaleUser::GetList(array("USER_ID" => intval($userId))); $arItem["FUSER_ID"] = $arFuserItems["ID"]; //CSaleBasket::Update($arItem["ID"], array("CALLBACK_FUNC" => false, "ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); CSaleBasket::Update($arItem["ID"], array("ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); } else { if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DoSaveOrderBasket - new product in the basket", array(), "DSOB3"); } unset($arItem["ID"]); /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arItem)) { $arItem["ID"] = CSaleBasket::Add(array("ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); if ($bSaveBarcodes) { if ($arItem["BARCODE_MULTI"] == "N") { foreach ($arItem["STORES"] as $key => $arStore) { $arStoreBarcodeFields = array("BASKET_ID" => $arItem["ID"], "BARCODE" => "", "STORE_ID" => $arStore["STORE_ID"], "QUANTITY" => $arStore["QUANTITY"], "CREATED_BY" => intval($GLOBALS["USER"]->GetID()) > 0 ? IntVal($GLOBALS["USER"]->GetID()) : "", "MODIFIED_BY" => intval($GLOBALS["USER"]->GetID()) > 0 ? IntVal($GLOBALS["USER"]->GetID()) : ""); CSaleStoreBarcode::Add($arStoreBarcodeFields); } } else { if (is_array($arItem["STORES"]) && count($arItem["STORES"]) > 0) { foreach ($arItem["STORES"] as $key => $arStore) { if (isset($arStore["BARCODE"]) && isset($arStore["BARCODE_FOUND"])) { foreach ($arStore["BARCODE"] as $barcodeId => $barcodeValue) { // save only non-empty and valid barcodes TODO - if errors? if (strlen($barcodeValue) > 0 && $arStore["BARCODE_FOUND"][$barcodeId] == "Y") { $arStoreBarcodeFields = array("BASKET_ID" => $arItem["ID"], "BARCODE" => $barcodeValue, "STORE_ID" => $arStore["STORE_ID"], "QUANTITY" => 1, "CREATED_BY" => intval($GLOBALS["USER"]->GetID()) > 0 ? IntVal($GLOBALS["USER"]->GetID()) : "", "MODIFIED_BY" => intval($GLOBALS["USER"]->GetID()) > 0 ? IntVal($GLOBALS["USER"]->GetID()) : ""); CSaleStoreBarcode::Add($arStoreBarcodeFields); } } } } } } } if ($arItem["QUANTITY"] != 0) { self::DoChangeProductQuantity($arItem, $arItem["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$id], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); } if ($FUSER_ID > 0) { $arItem["FUSER_ID"] = $FUSER_ID; } } else { if ($arItem["QUANTITY"] != 0) { self::DoChangeProductQuantity($arItem, $arItem["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$id], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); } if ($FUSER_ID > 0) { $arItem["FUSER_ID"] = $FUSER_ID; } $arItem["ID"] = CSaleBasket::Add(array("ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); //$arItem["ID"] = CSaleBasket::Add(array("CALLBACK_FUNC" => false, "ORDER_ID" => $orderId, "IGNORE_CALLBACK_FUNC" => "Y") + $arItem); } } } unset($arItem); if (is_array($arCoupons) && count($arCoupons) > 0) { foreach (GetModuleEvents("sale", "OnDoBasketOrder", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($userId, $arCoupons, array())); } } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Items left in the old basket:", array("arOldItems" => $arOldItems), "DSOB4"); } //if some items left which are not present in the updated basket foreach ($arOldItems as $key => $id) { $id["ID"] = $key; //the quantity is negative, so the product is canceled self::DoChangeProductQuantity($id, -$id["QUANTITY"], $isOrderReserved, $isOrderDeducted, $arStoreBarcodeOrderFormData[$id["ID"]], array("ORDER_ID" => $orderId, "USER_ID" => $userId, "SITE_ID" => $siteId)); CSaleBasket::Delete($key); } foreach (GetModuleEvents("sale", "OnDoBasketOrder", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($orderId)); } }