public function Update($ID, $arFields) { global $DB; $ID = (int) $ID; if ($ID <= 0) { return false; } $boolNewVersion = true; $arFields['ID'] = $ID; if (!array_key_exists('CONDITIONS', $arFields) && !array_key_exists('ACTIONS', $arFields)) { $boolConvert = CSaleDiscount::__ConvertOldFormat('UPDATE', $arFields); if (!$boolConvert) { return false; } $boolNewVersion = false; } if (!CSaleDiscount::CheckFields("UPDATE", $arFields)) { return false; } if ($boolNewVersion) { $boolConvert = CSaleDiscount::__SetOldFields('UPDATE', $arFields); if (!$boolConvert) { return false; } } $strUpdate = $DB->PrepareUpdate("b_sale_discount", $arFields); if (!empty($strUpdate)) { $strSql = "update b_sale_discount set " . $strUpdate . " where ID = " . $ID; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } if (isset($arFields['USER_GROUPS'])) { Internals\DiscountGroupTable::updateByDiscount($ID, $arFields['USER_GROUPS'], isset($arFields['ACTIVE']) ? $arFields['ACTIVE'] : '', true); } elseif (isset($arFields['ACTIVE'])) { Internals\DiscountGroupTable::changeActiveByDiscount($ID, $arFields['ACTIVE']); } if (isset($arFields['HANDLERS'])) { self::updateDiscountHandlers($ID, $arFields['HANDLERS'], true); } if (isset($arFields['ENTITIES'])) { Internals\DiscountEntitiesTable::updateByDiscount($ID, $arFields['ENTITIES'], true); } if (isset($arFields['ACTIONS']) && is_string($arFields['ACTIONS'])) { \Bitrix\Sale\Discount\Gift\RelatedDataTable::deleteByDiscount($ID); $giftManager = \Bitrix\Sale\Discount\Gift\Manager::getInstance(); if ($giftManager->isContainGiftAction($arFields)) { if (!$giftManager->existsDiscountsWithGift()) { $giftManager->enableExistenceDiscountsWithGift(); } \Bitrix\Sale\Discount\Gift\RelatedDataTable::fillByDiscount($arFields + array('ID' => $ID)); } } return $ID; }
public function Update($ID, $arFields) { global $DB; $ID = (int)$ID; if ($ID <= 0) return false; $boolNewVersion = true; $arFields['ID'] = $ID; if (!array_key_exists('CONDITIONS', $arFields) && !array_key_exists('ACTIONS', $arFields)) { $boolConvert = CSaleDiscount::__ConvertOldFormat('UPDATE', $arFields); if (!$boolConvert) return false; $boolNewVersion = false; } if (!CSaleDiscount::CheckFields("UPDATE", $arFields)) return false; if ($boolNewVersion) { $boolConvert = CSaleDiscount::__SetOldFields('UPDATE', $arFields); if (!$boolConvert) return false; } $strUpdate = $DB->PrepareUpdate("b_sale_discount", $arFields); if (!empty($strUpdate)) { $strSql = "update b_sale_discount set ".$strUpdate." where ID = ".$ID; $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } if (isset($arFields['USER_GROUPS'])) self::updateUserGroups($ID, $arFields['USER_GROUPS'], (isset($arFields['ACTIVE']) ? $arFields['ACTIVE'] : ''), true); if (isset($arFields['HANDLERS'])) self::updateDiscountHandlers($ID, $arFields['HANDLERS'], true); return $ID; }
/** * @override * @throws Exception */ protected function prepareData() { $saleDiscountId = null; $wasAdded = false; $xmlId = $this->arParams['DISCOUNT_XML_ID']; $saleDiscountValue = (double) $this->arParams['DISCOUNT_VALUE']; $saleDiscountUnit = (string) $this->arParams['DISCOUNT_UNIT']; $fieldsAdd = array('LID' => $this->getSiteId(), 'NAME' => Loc::getMessage("CVP_DISCOUNT_NAME"), 'ACTIVE' => 'Y', 'ACTIVE_FROM' => '', 'ACTIVE_TO' => '', 'PRIORITY' => 1, 'SORT' => 100, 'LAST_DISCOUNT' => 'Y', 'XML_ID' => $xmlId, 'USER_GROUPS' => array(2), 'ACTIONS' => serialize(array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND'), 'CHILDREN' => array(array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => $saleDiscountValue, 'Unit' => $saleDiscountUnit, 'All' => 'AND'), 'CHILDREN' => array())))), 'CONDITIONS' => serialize(array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()))); if (strlen($xmlId) <= 0) { return; } $fields = array('XML_ID' => $xmlId, 'ACTIVE' => 'Y'); $saleDiscountDb = CSaleDiscount::GetList(array('DATE_CREATE' => 'DESC'), $fields, false, false, array('ID', 'ACTIONS', 'CONDITIONS')); if ($saleDiscount = $saleDiscountDb->Fetch()) { if ($saleDiscount['ACTIONS'] == $fieldsAdd['ACTIONS'] && $saleDiscount['CONDITIONS'] == $fieldsAdd['CONDITIONS']) { $saleDiscountId = $saleDiscount['ID']; } } if (!$saleDiscountId) { $fieldsAdd['ACTIVE'] = 'N'; $saleDiscountId = CSaleDiscount::Add($fieldsAdd); $wasAdded = true; } $this->arResult['COUPON'] = ''; if ($saleDiscountId) { $coupon = \Bitrix\Sale\Internals\DiscountCouponTable::generateCoupon(true); //$activeFrom = new \Bitrix\Main\Type\DateTime; //$activeTo = clone $activeFrom; $addDb = \Bitrix\Sale\Internals\DiscountCouponTable::add(array('DISCOUNT_ID' => $saleDiscountId, 'COUPON' => $coupon, 'TYPE' => \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_ONE_ORDER, 'MAX_USE' => 1, 'USER_ID' => 0, 'DESCRIPTION' => $this->arParams['COUPON_DESCRIPTION'])); if ($addDb->isSuccess()) { $this->arResult['COUPON'] = $coupon; if ($wasAdded) { CSaleDiscount::Update($saleDiscountId, array('ACTIVE' => 'Y')); } } } }
$arBasketList[$i][$j]["REAL_PRICE"] = DoubleVal($arBasketList[$i][$j]["PRICE"]) - $curDiscount; $arDiscountPrice[$i] += $curDiscount * $arBasketList[$i][$j]["QUANTITY"]; } } else { $discountPrice = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $BASE_LANG_CURRENCY); $discountPrice = roundEx($discountPrice, SALE_VALUE_PRECISION); for ($j = 0; $j < count($arBasketList[$i]); $j++) { $curDiscount = roundEx(DoubleVal($arBasketList[$i][$j]["PRICE"]) * $DISCOUNT_PRICE / $arOrderPrice[$i], SALE_VALUE_PRECISION); $arBasketList[$i][$j]["REAL_PRICE"] = DoubleVal($arBasketList[$i][$j]["PRICE"]) - $curDiscount; $arDiscountPrice[$i] += $curDiscount * $arBasketList[$i][$j]["QUANTITY"]; } } } } } else { $dbDiscount = CSaleDiscount::GetList(array("SORT" => "ASC"), array("LID" => $LID, "ACTIVE" => "Y", "!>ACTIVE_FROM" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "<=PRICE_FROM" => $basketTotalPrice, ">=PRICE_TO" => $basketTotalPrice), false, false, array("*")); if ($arDiscount = $dbDiscount->Fetch()) { if ($arDiscount["DISCOUNT_TYPE"] == "P") { for ($i = 0; $i < count($arBasketList); $i++) { for ($j = 0; $j < count($arBasketList[$i]); $j++) { $curDiscount = roundEx(DoubleVal($arBasketList[$i][$j]["PRICE"]) * $arDiscount["DISCOUNT_VALUE"] / 100, SALE_VALUE_PRECISION); $arBasketList[$i][$j]["REAL_PRICE"] = DoubleVal($arBasketList[$i][$j]["PRICE"]) - $curDiscount; $arDiscountPrice[$i] += $curDiscount * $arBasketList[$i][$j]["QUANTITY"]; } } } else { $discountPrice = CCurrencyRates::ConvertCurrency($arDiscount["DISCOUNT_VALUE"], $arDiscount["CURRENCY"], $BASE_LANG_CURRENCY); $discountPrice = roundEx($discountPrice, SALE_VALUE_PRECISION); for ($i = 0; $i < count($arBasketList); $i++) { for ($j = 0; $j < count($arBasketList[$i]); $j++) { $curDiscount = roundEx(DoubleVal($arBasketList[$i][$j]["PRICE"]) * $DISCOUNT_PRICE / $basketTotalPrice, SALE_VALUE_PRECISION);
public function getBasketItems() { global $APPLICATION; if (self::$catalogIncluded === null) { self::$catalogIncluded = Loader::includeModule('catalog'); } self::$iblockIncluded = self::$catalogIncluded; CSaleBasket::UpdateBasketPrices(CSaleBasket::GetBasketUserID(), SITE_ID); $bShowReady = false; $bShowDelay = false; $bShowSubscribe = false; $bShowNotAvail = false; $allSum = 0; $allWeight = 0; $allCurrency = CSaleLang::GetLangCurrency(SITE_ID); $allVATSum = 0; $arParents = array(); $arResult["ITEMS"]["AnDelCanBuy"] = array(); $arResult["ITEMS"]["DelDelCanBuy"] = array(); $arResult["ITEMS"]["nAnCanBuy"] = array(); $arResult["ITEMS"]["ProdSubscribe"] = array(); $DISCOUNT_PRICE_ALL = 0; // BASKET PRODUCTS (including measures, ratio, iblock properties data) $arImgFields = array("PREVIEW_PICTURE", "DETAIL_PICTURE"); $arBasketItems = array(); $basketKey = 0; $basketIds = array(); $arSku2Parent = array(); $arSetParentWeight = array(); $arElementId = array(); $dbItems = CSaleBasket::GetList(array("ID" => "ASC"), array("FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL"), false, false, array("ID", "NAME", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "DETAIL_PAGE_URL", "NOTES", "CURRENCY", "VAT_RATE", "CATALOG_XML_ID", "PRODUCT_XML_ID", "SUBSCRIBE", "DISCOUNT_PRICE", "PRODUCT_PROVIDER_CLASS", "TYPE", "SET_PARENT_ID")); while ($arItem = $dbItems->GetNext()) { $arItem['PROPS'] = array(); $arBasketItems[$basketKey] = $arItem; $basketIds[$arItem['ID']] =& $arBasketItems[$basketKey]; $basketKey++; if (CSaleBasketHelper::isSetItem($arItem)) { continue; } $arElementId[] = $arItem["PRODUCT_ID"]; } if (!empty($arElementId) && self::$catalogIncluded) { $productList = CCatalogSKU::getProductList($arElementId); if (!empty($productList)) { foreach ($productList as $offerId => $offerInfo) { $offerInfo['PRODUCT_ID'] = $offerInfo['ID']; $arElementId[] = $offerInfo['ID']; $arSku2Parent[$offerId] = $offerInfo['ID']; $arParents[$offerId] = $offerInfo; } unset($offerInfo, $offerId); } unset($productList); // get measures, ratio, sku props data and available quantity $arBasketItems = getMeasures($arBasketItems); $arBasketItems = getRatio($arBasketItems); $arBasketItems = $this->getAvailableQuantity($arBasketItems); $propsIterator = CSaleBasket::GetPropsList(array('BASKET_ID' => 'ASC', 'SORT' => 'ASC', 'ID' => 'ASC'), array('BASKET_ID' => array_keys($basketIds))); while ($property = $propsIterator->GetNext()) { $property['CODE'] = (string) $property['CODE']; if ($property['CODE'] == 'CATALOG.XML_ID' || $property['CODE'] == 'PRODUCT.XML_ID') { continue; } if (!isset($basketIds[$property['BASKET_ID']])) { continue; } $basketIds[$property['BASKET_ID']]['PROPS'][] = $property; } unset($property, $propsIterator, $basketIds); } // get product properties data $arProductData = getProductProps($arElementId, array_merge(array("ID"), $arImgFields, $this->arCustomSelectFields)); foreach ($arBasketItems as &$arItem) { $quantityIsFloat = false; if (number_format(doubleval($arItem['QUANTITY']), 2, '.', '') != intval($arItem['QUANTITY'])) { $quantityIsFloat = true; } $arItem["QUANTITY"] = $quantityIsFloat === false && $this->quantityFloat != "Y" ? intval($arItem['QUANTITY']) : number_format(doubleval($arItem['QUANTITY']), 2, '.', ''); $arItem["PRICE_VAT_VALUE"] = $arItem["PRICE"] / ($arItem["VAT_RATE"] + 1) * $arItem["VAT_RATE"]; $arItem["PRICE_FORMATED"] = CCurrencyLang::CurrencyFormat($arItem["PRICE"], $arItem["CURRENCY"], true); $arItem["WEIGHT"] = doubleval($arItem["WEIGHT"]); $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION) . " " . $this->weightUnit; if (CSaleBasketHelper::isSetItem($arItem)) { $arSetParentWeight[$arItem["SET_PARENT_ID"]] += $arItem["WEIGHT"] * $arItem["QUANTITY"]; } if (isset($arProductData[$arItem['PRODUCT_ID']]) && is_array($arProductData[$arItem['PRODUCT_ID']])) { foreach ($arProductData[$arItem["PRODUCT_ID"]] as $key => $value) { if (strpos($key, "PROPERTY_") !== false || in_array($key, $arImgFields)) { $arItem[$key] = $value; } } } if (array_key_exists($arItem["PRODUCT_ID"], $arSku2Parent)) { $arFieldsToFill = array_merge($this->arCustomSelectFields, $arImgFields); // fields to be filled with parents' values if empty foreach ($arFieldsToFill as $field) { $fieldVal = in_array($field, $arImgFields) ? $field : $field . "_VALUE"; $parentId = $arSku2Parent[$arItem["PRODUCT_ID"]]; if ((!isset($arItem[$fieldVal]) || isset($arItem[$fieldVal]) && strlen($arItem[$fieldVal]) == 0) && (isset($arProductData[$parentId][$fieldVal]) && !empty($arProductData[$parentId][$fieldVal]))) { $arItem[$fieldVal] = $arProductData[$parentId][$fieldVal]; } } } foreach ($arItem as $key => $value) { if (strpos($key, "PROPERTY_", 0) === 0 && strrpos($key, "_VALUE") == strlen($key) - 6) { $code = str_replace(array("PROPERTY_", "_VALUE"), "", $key); $propData = $this->arIblockProps[$code]; $arItem[$key] = CSaleHelper::getIblockPropInfo($value, $propData); } } $arItem["PREVIEW_PICTURE_SRC"] = ""; if (isset($arItem["PREVIEW_PICTURE"]) && intval($arItem["PREVIEW_PICTURE"]) > 0) { $arImage = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]); if ($arImage) { $arFileTmp = CFile::ResizeImageGet($arImage, array("width" => "110", "height" => "110"), BX_RESIZE_IMAGE_PROPORTIONAL, true); $arItem["PREVIEW_PICTURE_SRC"] = $arFileTmp["src"]; } } $arItem["DETAIL_PICTURE_SRC"] = ""; if (isset($arItem["DETAIL_PICTURE"]) && intval($arItem["DETAIL_PICTURE"]) > 0) { $arImage = CFile::GetFileArray($arItem["DETAIL_PICTURE"]); if ($arImage) { $arFileTmp = CFile::ResizeImageGet($arImage, array("width" => "110", "height" => "110"), BX_RESIZE_IMAGE_PROPORTIONAL, true); $arItem["DETAIL_PICTURE_SRC"] = $arFileTmp["src"]; } } } unset($arItem); // get sku props data if (!empty($arBasketItems) && self::$catalogIncluded && isset($this->offersProps) && !empty($this->offersProps)) { $arBasketItems = $this->getSkuPropsData($arBasketItems, $arParents, $this->offersProps); } // count weight for set parent products foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetParent($arItem)) { $arItem["WEIGHT"] = $arSetParentWeight[$arItem["ID"]] / $arItem["QUANTITY"]; $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION) . " " . $this->weightUnit; } } if (isset($arItem)) { unset($arItem); } // fill item arrays for old templates foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetItem($arItem)) { continue; } $arItem['DISCOUNT_PRICE'] = (double) $arItem['DISCOUNT_PRICE']; $arItem['PRICE'] = (double) $arItem['PRICE']; $arItem['DISCOUNT_PRICE_PERCENT'] = 0; $arItem['DISCOUNT_PRICE_PERCENT_FORMATED'] = ''; $arItem['FULL_PRICE'] = $arItem['PRICE']; if ($arItem['DISCOUNT_PRICE'] > 0) { if ($arItem['DISCOUNT_PRICE'] + $arItem['PRICE'] > 0) { $arItem['DISCOUNT_PRICE_PERCENT'] = $arItem['DISCOUNT_PRICE'] * 100 / ($arItem['DISCOUNT_PRICE'] + $arItem['PRICE']); $arItem['DISCOUNT_PRICE_PERCENT_FORMATED'] = roundEx($arItem['DISCOUNT_PRICE_PERCENT'], SALE_VALUE_PRECISION) . '%'; $arItem['FULL_PRICE'] = $arItem["PRICE"] + $arItem["DISCOUNT_PRICE"]; } } $arItem['FULL_PRICE_FORMATED'] = CCurrencyLang::CurrencyFormat($arItem['FULL_PRICE'], $arItem['CURRENCY'], true); if ($arItem["CAN_BUY"] == "Y" && $arItem["DELAY"] == "N") { $allSum += $arItem["PRICE"] * $arItem["QUANTITY"]; $allWeight += $arItem["WEIGHT"] * $arItem["QUANTITY"]; $allVATSum += roundEx($arItem["PRICE_VAT_VALUE"] * $arItem["QUANTITY"], SALE_VALUE_PRECISION); $bShowReady = true; if ($arItem["DISCOUNT_PRICE"] > 0) { $DISCOUNT_PRICE_ALL += $arItem["DISCOUNT_PRICE"] * $arItem["QUANTITY"]; } $arResult["ITEMS"]["AnDelCanBuy"][] = $arItem; } elseif ($arItem["CAN_BUY"] == "Y" && $arItem["DELAY"] == "Y") { $bShowDelay = true; $arResult["ITEMS"]["DelDelCanBuy"][] = $arItem; } elseif ($arItem["CAN_BUY"] == "N" && $arItem["SUBSCRIBE"] == "Y") { $bShowSubscribe = true; $arResult["ITEMS"]["ProdSubscribe"][] = $arItem; } else { $bShowNotAvail = true; $arItem["NOT_AVAILABLE"] = true; $arResult["ITEMS"]["nAnCanBuy"][] = $arItem; } } unset($arItem); $arResult["ShowReady"] = $bShowReady ? "Y" : "N"; $arResult["ShowDelay"] = $bShowDelay ? "Y" : "N"; $arResult["ShowNotAvail"] = $bShowNotAvail ? "Y" : "N"; $arResult["ShowSubscribe"] = $bShowSubscribe ? "Y" : "N"; $arOrder = array('SITE_ID' => SITE_ID, 'USER_ID' => $GLOBALS["USER"]->GetID(), 'ORDER_PRICE' => $allSum, 'ORDER_WEIGHT' => $allWeight, 'BASKET_ITEMS' => $arResult["ITEMS"]["AnDelCanBuy"]); $arOptions = array('COUNT_DISCOUNT_4_ALL_QUANTITY' => $this->countDiscount4AllQuantity); $arErrors = array(); CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); if (isset($arOrder['ORDER_PRICE'])) { $roundOrderFields = CSaleOrder::getRoundFields(); foreach ($arOrder as $fieldName => $fieldValue) { if (in_array($fieldName, $roundOrderFields)) { $arOrder[$fieldName] = roundEx($arOrder[$fieldName], SALE_VALUE_PRECISION); } } } if (!empty($arOrder['BASKET_ITEMS']) && is_array($arOrder['BASKET_ITEMS'])) { $arOrder['ORDER_PRICE'] = 0; $roundBasketFields = CSaleBasket::getRoundFields(); foreach ($arOrder['BASKET_ITEMS'] as &$basketItem) { foreach ($basketItem as $fieldName => $fieldValue) { if (in_array($fieldName, $roundBasketFields)) { if (isset($basketItem[$fieldName])) { $basketItem[$fieldName] = roundEx($basketItem[$fieldName], SALE_VALUE_PRECISION); } } } $arOrder['ORDER_PRICE'] += $basketItem['PRICE'] * $basketItem['QUANTITY']; } $arOrder['ORDER_PRICE'] = roundEx($arOrder['ORDER_PRICE'], SALE_VALUE_PRECISION); } $allSum = 0; $allWeight = 0; $allVATSum = 0; $DISCOUNT_PRICE_ALL = 0; $priceWithoutDiscount = 0; foreach ($arOrder["BASKET_ITEMS"] as &$arOneItem) { $allWeight += $arOneItem["WEIGHT"] * $arOneItem["QUANTITY"]; $allSum += $arOneItem["PRICE"] * $arOneItem["QUANTITY"]; if (array_key_exists('VAT_VALUE', $arOneItem)) { $arOneItem["PRICE_VAT_VALUE"] = $arOneItem["VAT_VALUE"]; } $allVATSum += roundEx($arOneItem["PRICE_VAT_VALUE"] * $arOneItem["QUANTITY"], SALE_VALUE_PRECISION); $arOneItem["PRICE_FORMATED"] = CCurrencyLang::CurrencyFormat($arOneItem["PRICE"], $arOneItem["CURRENCY"], true); $arOneItem["FULL_PRICE"] = $arOneItem["PRICE"] + $arOneItem["DISCOUNT_PRICE"]; $arOneItem["FULL_PRICE_FORMATED"] = CCurrencyLang::CurrencyFormat($arOneItem["FULL_PRICE"], $arOneItem["CURRENCY"], true); $arOneItem["SUM"] = CCurrencyLang::CurrencyFormat($arOneItem["PRICE"] * $arOneItem["QUANTITY"], $arOneItem["CURRENCY"], true); if (0 < doubleval($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"])) { $arOneItem["DISCOUNT_PRICE_PERCENT"] = $arOneItem["DISCOUNT_PRICE"] * 100 / ($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"]); } else { $arOneItem["DISCOUNT_PRICE_PERCENT"] = 0; } $arOneItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arOneItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION) . "%"; $DISCOUNT_PRICE_ALL += $arOneItem["DISCOUNT_PRICE"] * $arOneItem["QUANTITY"]; } unset($arOneItem); $arResult["ITEMS"]["AnDelCanBuy"] = $arOrder["BASKET_ITEMS"]; // fill grid data (for new templates with custom columns) foreach ($arResult["ITEMS"] as $type => $arItems) { foreach ($arItems as $k => $arItem) { $arResult["GRID"]["ROWS"][$arItem["ID"]] = $arItem; } } $arResult["allSum"] = roundEx($allSum, SALE_VALUE_PRECISION); $arResult["allWeight"] = $allWeight; $arResult["allWeight_FORMATED"] = roundEx(doubleval($allWeight / $this->weightKoef), SALE_WEIGHT_PRECISION) . " " . $this->weightUnit; $arResult["allSum_FORMATED"] = CCurrencyLang::CurrencyFormat($allSum, $allCurrency, true); $arResult["DISCOUNT_PRICE_FORMATED"] = CCurrencyLang::CurrencyFormat($arResult["DISCOUNT_PRICE"], $allCurrency, true); $arResult["PRICE_WITHOUT_DISCOUNT"] = CCurrencyLang::CurrencyFormat($allSum + $DISCOUNT_PRICE_ALL, $allCurrency, true); if ($this->priceVatShowValue == 'Y') { $arResult["allVATSum"] = roundEx($allVATSum, SALE_VALUE_PRECISION); $arResult["allVATSum_FORMATED"] = CCurrencyLang::CurrencyFormat($allVATSum, $allCurrency, true); $arResult["allSum_wVAT_FORMATED"] = CCurrencyLang::CurrencyFormat(doubleval($arResult["allSum"] - $allVATSum), $allCurrency, true); } $arResult['COUPON_LIST'] = array(); $arResult['COUPON'] = ''; if ($this->hideCoupon != "Y") { $arCoupons = DiscountCouponsManager::get(true, array(), true, true); if (!empty($arCoupons)) { foreach ($arCoupons as &$oneCoupon) { if ($arResult['COUPON'] == '') { $arResult['COUPON'] = $oneCoupon['COUPON']; } if ($oneCoupon['STATUS'] == DiscountCouponsManager::STATUS_NOT_FOUND || $oneCoupon['STATUS'] == DiscountCouponsManager::STATUS_FREEZE) { $oneCoupon['JS_STATUS'] = 'BAD'; } elseif ($oneCoupon['STATUS'] == DiscountCouponsManager::STATUS_NOT_APPLYED || $oneCoupon['STATUS'] == DiscountCouponsManager::STATUS_ENTERED) { $oneCoupon['JS_STATUS'] = 'ENTERED'; } else { $oneCoupon['JS_STATUS'] = 'APPLYED'; } $oneCoupon['JS_CHECK_CODE'] = ''; if (isset($oneCoupon['CHECK_CODE_TEXT'])) { $oneCoupon['JS_CHECK_CODE'] = is_array($oneCoupon['CHECK_CODE_TEXT']) ? implode('<br>', $oneCoupon['CHECK_CODE_TEXT']) : $oneCoupon['CHECK_CODE_TEXT']; } $arResult['COUPON_LIST'][] = $oneCoupon; } unset($oneCoupon); $arResult['COUPON_LIST'] = array_values($arCoupons); } unset($arCoupons); } if (empty($arBasketItems)) { $arResult["ERROR_MESSAGE"] = Loc::getMessage("SALE_EMPTY_BASKET"); } $arResult["DISCOUNT_PRICE_ALL"] = $DISCOUNT_PRICE_ALL; $arResult["DISCOUNT_PRICE_ALL_FORMATED"] = CCurrencyLang::CurrencyFormat($DISCOUNT_PRICE_ALL, $allCurrency, true); if ($this->usePrepayment == "Y") { if (doubleval($arResult["allSum"]) > 0) { $personType = array(); $dbPersonType = CSalePersonType::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array("LID" => SITE_ID, "ACTIVE" => "Y")); while ($arPersonType = $dbPersonType->Fetch()) { $personType[] = $arPersonType["ID"]; } if (!empty($personType)) { $dbPaySysAction = CSalePaySystemAction::GetList(array(), array("PS_ACTIVE" => "Y", "HAVE_PREPAY" => "Y", "PERSON_TYPE_ID" => $personType), false, false, array("ID", "PAY_SYSTEM_ID", "PERSON_TYPE_ID", "NAME", "ACTION_FILE", "RESULT_FILE", "NEW_WINDOW", "PARAMS", "ENCODING", "LOGOTIP")); if ($arPaySysAction = $dbPaySysAction->Fetch()) { CSalePaySystemAction::InitParamarrays(false, false, $arPaySysAction["PARAMS"]); $pathToAction = $_SERVER["DOCUMENT_ROOT"] . $arPaySysAction["ACTION_FILE"]; $pathToAction = str_replace("\\", "/", $pathToAction); while (substr($pathToAction, strlen($pathToAction) - 1, 1) == "/") { $pathToAction = substr($pathToAction, 0, strlen($pathToAction) - 1); } if (file_exists($pathToAction)) { if (is_dir($pathToAction) && file_exists($pathToAction . "/pre_payment.php")) { $pathToAction .= "/pre_payment.php"; } try { include_once $pathToAction; } catch (\Bitrix\Main\SystemException $e) { if ($e->getCode() == CSalePaySystemAction::GET_PARAM_VALUE) { $message = Loc::getMessage("SOA_TEMPL_ORDER_PS_ERROR"); } else { $message = $e->getMessage(); } $arResult["ERROR_MESSAGE"] = $message; } $psPreAction = new CSalePaySystemPrePayment(); if ($psPreAction->init()) { $orderData = array("PATH_TO_ORDER" => $this->pathToOrder, "AMOUNT" => $arResult["allSum"], "BASKET_ITEMS" => $arResult["ITEMS"]["AnDelCanBuy"]); if (!$psPreAction->BasketButtonAction($orderData)) { if ($e = $APPLICATION->GetException()) { $arResult["WARNING_MESSAGE"][] = $e->GetString(); } } $arResult["PREPAY_BUTTON"] = $psPreAction->BasketButtonShow(); } } } } } } return $arResult; }
} $bNotAvail = true; } elseif ($arItem["CAN_BUY"] == "N" && $arItem["SUBSCRIBE"] == "Y") { if ('N' == $arParams['SHOW_SUBSCRIBE']) { continue; } $bSubscribe = true; } if (!$boolOneReady) { $arItem["PRICE_FORMATED"] = SaleFormatCurrency($arItem["PRICE"], $arItem["CURRENCY"]); $arItems[] = $arItem; } else { $arReadyItems[] = $arItem; } } } if (!empty($arReadyItems)) { $arOrder = array('SITE_ID' => SITE_ID, 'USER_ID' => $USER->GetID(), 'ORDER_PRICE' => $allSum, 'ORDER_WEIGHT' => $allWeight, 'BASKET_ITEMS' => $arReadyItems); $arOptions = array(); $arErrors = array(); CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); foreach ($arOrder['BASKET_ITEMS'] as &$arOneItem) { $arOneItem["PRICE_FORMATED"] = SaleFormatCurrency($arOneItem["PRICE"], $arOneItem["CURRENCY"]); } if (isset($arOneItem)) { unset($arOneItem); } $arItems = array_merge($arOrder['BASKET_ITEMS'], $arItems); } $arResult = array('READY' => $bReady ? "Y" : "N", 'DELAY' => $bDelay ? "Y" : "N", 'NOTAVAIL' => $bNotAvail ? "Y" : "N", 'SUBSCRIBE' => $bSubscribe ? "Y" : "N", 'ITEMS' => $arItems); $this->IncludeComponentTemplate();
* show order props */ if (isset($display_props) and $display_props == "block") { $arParams['SHOW_BASKET_ORDER'] = "Y"; } if (isset($display_props) and $display_props == "none") { $arParams['SHOW_BASKET_ORDER'] = "N"; } $arResult["ORDER_DESCRIPTION"] = $ORDER_DESCRIPTION; if (strlen($COUPON) > 0) { $arResult["COUPON"] = htmlspecialcharsEx($COUPON); } $arOrderForDiscount = array('SITE_ID' => SITE_ID, 'USER_ID' => $currentUserId, 'ORDER_PRICE' => $arResult['ORDER_PRICE'], 'ORDER_WEIGHT' => $arResult["ORDER_WEIGHT"], 'PRICE_DELIVERY' => $arResult["DELIVERY_PRICE"], 'BASKET_ITEMS' => $arResult["ITEMS"]["AnDelCanBuy"], "PERSON_TYPE_ID" => $arUserResult['PERSON_TYPE_ID'], "PAY_SYSTEM_ID" => $arUserResult["PAY_SYSTEM_ID"], "DELIVERY_ID" => $arUserResult["DELIVERY_ID"]); $arDiscountOptions = array(); $arDiscountErrors = array(); CSaleDiscount::DoProcessOrder($arOrderForDiscount, $arDiscountOptions, $arDiscountErrors); $allSum = 0; $allVatSumm = 0; $allVatRate = 0; foreach ($arOrderForDiscount['BASKET_ITEMS'] as &$arOneItem) { $arOneItem["PRICE_FORMATED"] = SaleFormatCurrency($arOneItem["PRICE"], $arOneItem["CURRENCY"]); $arOneItem["DISCOUNT_PRICE_PERCENT"] = $arOneItem["DISCOUNT_PRICE"] * 100 / ($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"]); $arOneItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arOneItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION) . "%"; $allSum += $arOneItem["PRICE"] * $arOneItem["QUANTITY"]; $allVatSumm += 0; if (0 < $arOneItem["VAT_RATE"]) { $arResult["bUsingVat"] = "Y"; if ($arOneItem["VAT_RATE"] > $allVatRate) { $allVatRate = $arOneItem["VAT_RATE"]; } $arOneItem["VAT_VALUE"] = $arOneItem["PRICE"] / ($arOneItem["VAT_RATE"] + 1) * $arOneItem["VAT_RATE"];
/** * @param $siteId * @param $userId * @param $arShoppingCart * @param $personTypeId * @param $arOrderPropsValues * @param $deliveryId * @param $paySystemId * @param $arOptions * @param $arErrors * @param $arWarnings * @return array|null */ static function DoCalculateOrder($siteId, $userId, $arShoppingCart, $personTypeId, $arOrderPropsValues, $deliveryId, $paySystemId, $arOptions, &$arErrors, &$arWarnings) { if (!is_array($arOptions)) { $arOptions = array(); } $siteId = trim($siteId); if (empty($siteId)) { $arErrors[] = array("CODE" => "PARAM", "TEXT" => Loc::getMessage('SKGO_CALC_PARAM_ERROR')); return null; } $userId = intval($userId); if (!is_array($arShoppingCart) || count($arShoppingCart) <= 0) { $arErrors[] = array("CODE" => "PARAM", "TEXT" => Loc::getMessage('SKGO_SHOPPING_CART_EMPTY')); return null; } $arOrder = static::makeOrderArray($siteId, $userId, $arShoppingCart, $arOptions); foreach (GetModuleEvents("sale", "OnSaleCalculateOrderShoppingCart", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSalePersonType::DoProcessOrder($arOrder, $personTypeId, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderPersonType", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSaleOrderProps::DoProcessOrder($arOrder, $arOrderPropsValues, $arErrors, $arWarnings, $paySystemId, $deliveryId, $arOptions); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderProps", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSaleDelivery::DoProcessOrder($arOrder, $deliveryId, $arErrors); if (count($arErrors) > 0) { return null; } $arOrder["PRICE_DELIVERY"] = $arOrder["DELIVERY_PRICE"]; foreach (GetModuleEvents("sale", "OnSaleCalculateOrderDelivery", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSalePaySystem::DoProcessOrder($arOrder, $paySystemId, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderPaySystem", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } if (!array_key_exists('CART_FIX', $arOptions) || 'Y' != $arOptions['CART_FIX']) { CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderDiscount", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } if (isset($arOrder['ORDER_PRICE'])) { $roundOrderFields = static::getRoundFields(); foreach ($arOrder as $fieldName => $fieldValue) { if (in_array($fieldName, $roundOrderFields)) { $arOrder[$fieldName] = PriceMaths::roundPrecision($arOrder[$fieldName]); } } } if (!empty($arOrder['BASKET_ITEMS']) && is_array($arOrder['BASKET_ITEMS'])) { $arOrder['ORDER_PRICE'] = 0; $roundBasketFields = CSaleBasket::getRoundFields(); foreach ($arOrder['BASKET_ITEMS'] as &$basketItem) { foreach ($basketItem as $fieldName => $fieldValue) { if (in_array($fieldName, $roundBasketFields)) { if (isset($basketItem[$fieldName])) { $basketItem[$fieldName] = PriceMaths::roundPrecision($basketItem[$fieldName]); } } } if (CSaleBasketHelper::isSetItem($basketItem)) { continue; } $arOrder['ORDER_PRICE'] += CSaleBasketHelper::getFinalPrice($basketItem); } } } CSaleTax::DoProcessOrderBasket($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderShoppingCartTax", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSaleTax::DoProcessOrderDelivery($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderDeliveryTax", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } $arOrder["PRICE"] = $arOrder["ORDER_PRICE"] + $arOrder["DELIVERY_PRICE"] + $arOrder["TAX_PRICE"] - $arOrder["DISCOUNT_PRICE"]; $arOrder["TAX_VALUE"] = $arOrder["USE_VAT"] ? $arOrder["VAT_SUM"] : $arOrder["TAX_PRICE"]; foreach (GetModuleEvents("sale", "OnSaleCalculateOrder", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } $arOrder["PRICE"] = \Bitrix\Sale\PriceMaths::roundPrecision($arOrder["PRICE"]); $arOrder["TAX_VALUE"] = \Bitrix\Sale\PriceMaths::roundPrecision($arOrder["TAX_VALUE"]); return $arOrder; }
function __recalcSaleDiscount($user_id) { if(!$user_id) return; CModule::IncludeModule('sale'); CModule::IncludeModule('highloadblock'); $UserPrc = false; $hlblock = Bitrix\Highloadblock\HighloadBlockTable::getList(array('filter'=>array('NAME' => 'UserDiscounts')))->fetch(); $entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity( $hlblock ); $entity_data_class = $entity->getDataClass(); $rsData = $entity_data_class::getList(array( "select" => array("*"), "order" => array("ID" => "ASC"), "filter" => array('UF_USER_ID' => $user_id) )); if($arData = $rsData->Fetch()) { $UserPrc = $arData['UF_DISCOUNT']; } if($UserPrc) { $bCreated = false; $dbSaleDiscounts = CSaleDiscount::GetList( array(), array( "ACTIVE" => "Y", //"XML_ID" => 'HL_DISCOUNT_'.$UserPrc, ), false, false, array('ID','NAME',"XML_ID",'CONDITIONS') ); while ($arSaleDiscount = $dbSaleDiscounts->Fetch()) { $issetUsers = array(); $CONDITIONS = unserialize($arSaleDiscount['CONDITIONS']); foreach($CONDITIONS['CHILDREN'] as $arChildren) { if($arChildren['CLASS_ID'] == 'CondSaleOrderUserID') { $issetUsers[$arChildren['DATA']['value']] = $arChildren['DATA']['value']; } } if($arSaleDiscount['XML_ID'] == 'HL_DISCOUNT_'.$UserPrc) { $bCreated = true; if(!in_array($user_id, $issetUsers)) { $CONDITIONS['CHILDREN'][] = Array( 'CLASS_ID' => 'CondSaleOrderUserID', 'DATA' => Array( 'logic' => 'Equal', 'value' => $user_id ) ); $arDiscountFields = array( 'NAME' => $arSaleDiscount['NAME'], "ACTIVE" => 'Y', 'CONDITIONS' => $CONDITIONS ); CSaleDiscount::Update($arSaleDiscount['ID'], $arDiscountFields); } } else { if(in_array($user_id, $issetUsers)) { $tmpCond = array(); foreach($CONDITIONS['CHILDREN'] as $arChildren) { if(!($arChildren['CLASS_ID'] == 'CondSaleOrderUserID' && $arChildren['DATA']['value'] == $user_id)) { $tmpCond[] = $arChildren; } } if(empty($tmpCond)) { CSaleDiscount::Delete($arSaleDiscount['ID']); } else { $CONDITIONS['CHILDREN'] = $tmpCond; $arDiscountFields = array( 'NAME' => $arSaleDiscount['NAME'], "ACTIVE" => 'Y', 'CONDITIONS' => $CONDITIONS ); CSaleDiscount::Update($arSaleDiscount['ID'], $arDiscountFields); } } } } if(!$bCreated) { $arDiscountFields = array( "LID" => 's1', "NAME" => 'Скидка пользователям - '.$UserPrc.'%', "ACTIVE_FROM" => '', "ACTIVE_TO" => '', "ACTIVE" => 'Y', "SORT" => 100, "PRIORITY" => 1, "LAST_DISCOUNT" => 'Y', "XML_ID" => 'HL_DISCOUNT_'.$UserPrc, 'CONDITIONS' => Array( 'CLASS_ID' => 'CondGroup', 'DATA' => Array( 'All' => 'OR', 'True' => 'True' ), 'CHILDREN' => Array( Array( 'CLASS_ID' => 'CondSaleOrderUserID', 'DATA' => Array( 'logic' => 'Equal', 'value' => $user_id ) ), ) ), 'ACTIONS' => array( 'CLASS_ID' => 'CondGroup', 'DATA' => Array( 'All' => 'AND', ), 'CHILDREN' => Array( Array( 'CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => Array( 'Type' => 'Discount', 'Value' => $UserPrc, 'Unit' => 'Perc', 'All' => 'AND', ), 'CHILDREN' => Array() ), ) ), 'USER_GROUPS' => array(2), ); $DiscountID = CSaleDiscount::Add($arDiscountFields); } } }
/** * <p>Функция обновляет параметры скидки с кодом ID на параметры из массива arFields </p> * * * * * @param int $ID Код скидки. * * * * @param array $arFields Ассоциативный массив новых параметров скидки, ключами в котором * являются названия параметров, а значениями - новые значения. * Допустимо указание не всех ключей, а только тех, значения которых * необходимо изменить.<br> Допустимые ключи:<br><ul> <li> <b>LID</b> - код сайта, * к которому привязана эта скидка;</li> <li> <b>PRICE_FROM</b> - общая стоимость * заказа, начиная с которой предоставляется эта скидка;</li> <li> * <b>PRICE_TO</b> - общая стоимость заказа, до достижения которой * предоставляется эта скидка;</li> <li> <b>CURRENCY</b> - валюта денежных полей * в записи;</li> <li> <b>DISCOUNT_VALUE</b> - величина скидки;</li> <li> <b>DISCOUNT_TYPE</b> - * тип величины скидки (P - величина задана в процентах, V - величина * задана в абсолютной сумме);</li> <li> <b>ACTIVE</b> - флаг (Y/N) активности * скидки;</li> <li> <b>SORT</b> - индекс сортировки (если по сумме заказа * доступно несколько скидок, то берется первая по сортировке)</li> </ul> * * * * @return int <p>Возвращается код измененной скидки или <i>false</i> в случае * ошибки.</p><br><br> * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalediscount/csalediscount__update.700e1b34.php * @author Bitrix */ public static function Update($ID, $arFields) { global $DB; global $USER; $ID = intval($ID); if (0 >= $ID) return false; $arFields1 = array(); if (array_key_exists('CREATED_BY',$arFields)) unset($arFields['CREATED_BY']); if (array_key_exists('DATE_CREATE',$arFields)) unset($arFields['DATE_CREATE']); if (array_key_exists('TIMESTAMP_X', $arFields)) unset($arFields['TIMESTAMP_X']); if (isset($USER) && $USER instanceof CUser && 'CUser' == get_class($USER)) { if (!array_key_exists('MODIFIED_BY', $arFields) || intval($arFields["MODIFIED_BY"]) <= 0) $arFields["MODIFIED_BY"] = intval($USER->GetID()); } $arFields1['TIMESTAMP_X'] = $DB->GetNowFunction(); $boolNewVersion = true; if (!array_key_exists('CONDITIONS', $arFields) && !array_key_exists('ACTIONS', $arFields)) { $arFields['ID'] = $ID; $boolConvert = CSaleDiscount::__ConvertOldFormat('UPDATE', $arFields); if (!$boolConvert) return false; $boolNewVersion = false; } if (array_key_exists('ID', $arFields)) unset($arFields['ID']); if (!CSaleDiscount::CheckFields("UPDATE", $arFields)) return false; if ($boolNewVersion) { $boolConvert = CSaleDiscount::__SetOldFields('UPDATE', $arFields); if (!$boolConvert) return false; } $strUpdate = $DB->PrepareUpdate("b_sale_discount", $arFields); if (!empty($strUpdate)) { $arAdd = array(); if (!empty($arFields1)) { foreach ($arFields1 as $key => $value) { $arAdd[] = $key."=".$value; } $strUpdate .= ', '.implode(', ', $arAdd); } $strSql = "UPDATE b_sale_discount SET ".$strUpdate." WHERE ID = ".$ID; $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } if (array_key_exists('USER_GROUPS',$arFields) && is_array($arFields['USER_GROUPS']) && !empty($arFields['USER_GROUPS'])) { $DB->Query("DELETE FROM b_sale_discount_group WHERE DISCOUNT_ID = ".$ID, false, "File: ".__FILE__."<br>Line: ".__LINE__); $arValid = array(); foreach ($arFields['USER_GROUPS'] as &$value) { $value = intval($value); if (0 < $value) $arValid[] = $value; } if (isset($value)) unset($value); $arFields['USER_GROUPS'] = array_unique($arValid); if (!empty($arFields['USER_GROUPS'])) { foreach ($arFields['USER_GROUPS'] as &$value) { $strSql = "INSERT INTO b_sale_discount_group(DISCOUNT_ID, GROUP_ID) VALUES(".$ID.", ".$value.")"; $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); } if (isset($value)) unset($value); } } return $ID; }
function Update($ID, $arFields) { global $DB; $ID = intval($ID); if (!CSaleDiscount::CheckFields("UPDATE", $arFields)) { return false; } $strUpdate = $DB->PrepareUpdate("b_sale_discount", $arFields); $strSql = "UPDATE b_sale_discount SET " . $strUpdate . " WHERE ID = " . $ID . ""; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); if (array_key_exists('USER_GROUPS', $arFields) && is_array($arFields['USER_GROUPS'])) { $DB->Query("DELETE FROM b_sale_discount_group WHERE DISCOUNT_ID = " . $ID . " ", false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $arValid = array(); foreach ($arFields['USER_GROUPS'] as &$value) { $value = intval($value); if (0 < $value) { $arValid[] = $value; } } $arFields['USER_GROUPS'] = array_unique($arValid); if (!empty($arFields['USER_GROUPS'])) { foreach ($arFields['USER_GROUPS'] as &$value) { $strSql = "INSERT INTO b_sale_discount_group(DISCOUNT_ID, GROUP_ID) " . "VALUES(" . $ID . ", " . $value . ")"; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } } } return $ID; }
public function getBasketItems() { global $APPLICATION; $bUseCatalog = CModule::IncludeModule("catalog"); $bUseIblock = $bUseCatalog; $bShowReady = False; $bShowDelay = False; $bShowSubscribe = False; $bShowNotAvail = False; $allSum = 0; $allWeight = 0; $allCurrency = CSaleLang::GetLangCurrency($this->getSiteId()); $allVATSum = 0; $arParents = array(); $arResult["ITEMS"]["AnDelCanBuy"] = array(); $arResult["ITEMS"]["DelDelCanBuy"] = array(); $arResult["ITEMS"]["nAnCanBuy"] = array(); $arResult["ITEMS"]["ProdSubscribe"] = array(); $DISCOUNT_PRICE_ALL = 0; // BASKET PRODUCTS (including measures, ratio, iblock properties data) $arImgFields = array("PREVIEW_PICTURE", "DETAIL_PICTURE"); $arBasketItems = array(); $arSku2Parent = array(); $arSetParentWeight = array(); $basketItemsFilter = array("USER_ID" => $this->userId, "ORDER_ID" => "NULL"); if ($this->showDelay != 'Y') { $basketItemsFilter['DELAY'] = 'N'; } $dbItems = CSaleBasket::GetList(array("ID" => "ASC"), $basketItemsFilter, false, false, array("ID", "NAME", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "DETAIL_PAGE_URL", "NOTES", "CURRENCY", "VAT_RATE", "CATALOG_XML_ID", "PRODUCT_XML_ID", "SUBSCRIBE", "DISCOUNT_PRICE", "PRODUCT_PROVIDER_CLASS", "TYPE", "SET_PARENT_ID")); while ($arItem = $dbItems->GetNext()) { $arBasketItems[] = $arItem; if (CSaleBasketHelper::isSetItem($arItem)) { continue; } $arElementId[] = $arItem["PRODUCT_ID"]; if ($bUseCatalog) { $arParent = CCatalogSku::GetProductInfo($arItem["PRODUCT_ID"]); if ($arParent) { $arElementId[] = $arParent["ID"]; $arSku2Parent[$arItem["PRODUCT_ID"]] = $arParent["ID"]; $arParents[$arItem["PRODUCT_ID"]]["PRODUCT_ID"] = $arParent["ID"]; $arParents[$arItem["PRODUCT_ID"]]["IBLOCK_ID"] = $arParent["IBLOCK_ID"]; } } } // get measures, ratio, sku props data and available quantity if (!empty($arBasketItems) && $bUseCatalog) { $arBasketItems = getMeasures($arBasketItems); $arBasketItems = getRatio($arBasketItems); $arBasketItems = $this->getAvailableQuantity($arBasketItems); } // get product properties data $arProductData = getProductProps($arElementId, array_merge(array("ID"), $arImgFields, $this->arCustomSelectFields)); foreach ($arBasketItems as &$arItem) { $quantityIsFloat = false; if (number_format(doubleval($arItem['QUANTITY']), 2, '.', '') != intval($arItem['QUANTITY'])) { $quantityIsFloat = true; } $arItem["QUANTITY"] = $quantityIsFloat === false && $this->quantityFloat != "Y" ? intval($arItem['QUANTITY']) : number_format(doubleval($arItem['QUANTITY']), 2, '.', ''); $arItem["QUANTITY_FORMATED"] = $arItem["QUANTITY"] . " " . $arItem["MEASURE_TEXT"]; $arItem["PROPS"] = array(); $dbProp = CSaleBasket::GetPropsList(array("SORT" => "ASC", "ID" => "ASC"), array("BASKET_ID" => $arItem["ID"], "!CODE" => array("CATALOG.XML_ID", "PRODUCT.XML_ID"))); while ($arProp = $dbProp->GetNext()) { $arItem["PROPS"][] = $arProp; } $arItem["PRICE_VAT_VALUE"] = $arItem["PRICE"] / ($arItem["VAT_RATE"] + 1) * $arItem["VAT_RATE"]; $arItem["PRICE_FORMATED"] = $this->getSaleFormatCurrency($arItem["PRICE"], $arItem["CURRENCY"]); $arItem["WEIGHT"] = doubleval($arItem["WEIGHT"]); $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION) . " " . $this->weightUnit; $arItem["DISCOUNT_FORMATED"] = $this->getSaleFormatCurrency($arItem["DISCOUNT_PRICE"], $arItem["CURRENCY"]); if (CSaleBasketHelper::isSetItem($arItem)) { $arSetParentWeight[$arItem["SET_PARENT_ID"]] += $arItem["WEIGHT"] * $arItem["QUANTITY"]; } if (array_key_exists($arItem["PRODUCT_ID"], $arProductData) && is_array($arProductData[$arItem["PRODUCT_ID"]])) { foreach ($arProductData[$arItem["PRODUCT_ID"]] as $key => $value) { if (strpos($key, "PROPERTY_") !== false || in_array($key, $arImgFields)) { $arItem[$key] = $value; } } } if (array_key_exists($arItem["PRODUCT_ID"], $arSku2Parent)) { $arFieldsToFill = array_merge($this->arCustomSelectFields, $arImgFields); // fields to be filled with parents' values if empty foreach ($arFieldsToFill as $field) { $fieldVal = in_array($field, $arImgFields) ? $field : $field . "_VALUE"; $parentId = $arSku2Parent[$arItem["PRODUCT_ID"]]; if ((!isset($arItem[$fieldVal]) || isset($arItem[$fieldVal]) && strlen($arItem[$fieldVal]) == 0) && (isset($arProductData[$parentId][$fieldVal]) && !empty($arProductData[$parentId][$fieldVal]))) { $arItem[$fieldVal] = $arProductData[$parentId][$fieldVal]; } } } foreach ($arItem as $key => $value) { if (strpos($key, "PROPERTY_", 0) === 0 && strrpos($key, "_VALUE") == strlen($key) - 6) { $code = str_replace(array("PROPERTY_", "_VALUE"), "", $key); $propData = $this->arIblockProps[$code]; $arItem[$key] = CSaleHelper::getIblockPropInfo($value, $propData); } } $arItem["PREVIEW_PICTURE_SRC"] = ""; if (isset($arItem["PREVIEW_PICTURE"]) && intval($arItem["PREVIEW_PICTURE"]) > 0) { $arImage = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]); if ($arImage) { $arFileTmp = CFile::ResizeImageGet($arImage, array("width" => "110", "height" => "110"), BX_RESIZE_IMAGE_PROPORTIONAL, true); $arItem["PREVIEW_PICTURE_SRC"] = $arFileTmp["src"]; } } $arItem["DETAIL_PICTURE_SRC"] = ""; if (isset($arItem["DETAIL_PICTURE"]) && intval($arItem["DETAIL_PICTURE"]) > 0) { $arImage = CFile::GetFileArray($arItem["DETAIL_PICTURE"]); if ($arImage) { $arFileTmp = CFile::ResizeImageGet($arImage, array("width" => "110", "height" => "110"), BX_RESIZE_IMAGE_PROPORTIONAL, true); $arItem["DETAIL_PICTURE_SRC"] = $arFileTmp["src"]; } } } unset($arItem); // get sku props data if (!empty($arBasketItems) && $bUseCatalog && isset($this->offersProps) && !empty($this->offersProps)) { $arBasketItems = $this->getSkuPropsData($arBasketItems, $arParents, $this->offersProps); } // count weight for set parent products foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetParent($arItem)) { $arItem["WEIGHT"] = $arSetParentWeight[$arItem["ID"]] / $arItem["QUANTITY"]; $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION) . " " . $this->weightUnit; } } if (isset($arItem)) { unset($arItem); } // fill item arrays for old templates foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetItem($arItem)) { continue; } if ($arItem["CAN_BUY"] == "Y" && $arItem["DELAY"] == "N") { $allSum += $arItem["PRICE"] * $arItem["QUANTITY"]; $allWeight += $arItem["WEIGHT"] * $arItem["QUANTITY"]; $allVATSum += roundEx($arItem["PRICE_VAT_VALUE"] * $arItem["QUANTITY"], SALE_VALUE_PRECISION); $bShowReady = True; if (doubleval($arItem["DISCOUNT_PRICE"]) > 0) { if (0 < doubleval($arItem["DISCOUNT_PRICE"] + $arItem["PRICE"])) { $arItem["DISCOUNT_PRICE_PERCENT"] = $arItem["DISCOUNT_PRICE"] * 100 / ($arItem["DISCOUNT_PRICE"] + $arItem["PRICE"]); } else { $arItem["DISCOUNT_PRICE_PERCENT"] = 0; } $arItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION) . "%"; $DISCOUNT_PRICE_ALL += $arItem["DISCOUNT_PRICE"] * $arItem["QUANTITY"]; } $arResult["ITEMS"]["AnDelCanBuy"][] = $arItem; } elseif ($arItem["CAN_BUY"] == "Y" && $arItem["DELAY"] == "Y") { $bShowDelay = True; $arResult["ITEMS"]["DelDelCanBuy"][] = $arItem; } elseif ($arItem["CAN_BUY"] == "N" && $arItem["SUBSCRIBE"] == "Y") { $bShowSubscribe = True; $arResult["ITEMS"]["ProdSubscribe"][] = $arItem; } else { $bShowNotAvail = True; $arItem["NOT_AVAILABLE"] = true; $arResult["ITEMS"]["nAnCanBuy"][] = $arItem; } } unset($arItem); $arResult["ShowReady"] = $bShowReady ? "Y" : "N"; $arResult["ShowDelay"] = $bShowDelay ? "Y" : "N"; $arResult["ShowNotAvail"] = $bShowNotAvail ? "Y" : "N"; $arResult["ShowSubscribe"] = $bShowSubscribe ? "Y" : "N"; $arOrder = array('SITE_ID' => $this->getSiteId(), 'USER_ID' => $this->userId, 'ORDER_PRICE' => $allSum, 'ORDER_WEIGHT' => $allWeight, 'BASKET_ITEMS' => $arResult["ITEMS"]["AnDelCanBuy"]); $arOptions = array('COUNT_DISCOUNT_4_ALL_QUANTITY' => $this->countDiscount4AllQuantity); $arErrors = array(); CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); $allSum = 0; $allWeight = 0; $allVATSum = 0; $DISCOUNT_PRICE_ALL = 0; $priceWithoutDiscount = 0; foreach ($arOrder["BASKET_ITEMS"] as &$arOneItem) { $allWeight += $arOneItem["WEIGHT"] * $arOneItem["QUANTITY"]; $allSum += $arOneItem["PRICE"] * $arOneItem["QUANTITY"]; if (array_key_exists('VAT_VALUE', $arOneItem)) { $arOneItem["PRICE_VAT_VALUE"] = $arOneItem["VAT_VALUE"]; } $allVATSum += roundEx($arOneItem["PRICE_VAT_VALUE"] * $arOneItem["QUANTITY"], SALE_VALUE_PRECISION); $arOneItem["PRICE_FORMATED"] = $this->getSaleFormatCurrency($arOneItem["PRICE"], $arOneItem["CURRENCY"]); $arOneItem["FULL_PRICE"] = $arOneItem["PRICE"] + $arOneItem["DISCOUNT_PRICE"]; $arOneItem["FULL_PRICE_FORMATED"] = $this->getSaleFormatCurrency($arOneItem["FULL_PRICE"], $arOneItem["CURRENCY"]); $arOneItem["SUM"] = $this->getSaleFormatCurrency($arOneItem["PRICE"] * $arOneItem["QUANTITY"], $arOneItem["CURRENCY"]); if (0 < doubleval($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"])) { $arOneItem["DISCOUNT_PRICE_PERCENT"] = $arOneItem["DISCOUNT_PRICE"] * 100 / ($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"]); } else { $arOneItem["DISCOUNT_PRICE_PERCENT"] = 0; } $arOneItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arOneItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION) . "%"; $DISCOUNT_PRICE_ALL += $arOneItem["DISCOUNT_PRICE"] * $arOneItem["QUANTITY"]; } unset($arOneItem); $arResult["ITEMS"]["AnDelCanBuy"] = $arOrder["BASKET_ITEMS"]; // fill grid data (for new templates with custom columns) foreach ($arResult["ITEMS"] as $type => $arItems) { foreach ($arItems as $k => $arItem) { $arResult["GRID"]["ROWS"][$arItem["ID"]] = $arItem; } } $arResult["allSum"] = $allSum; $arResult["allWeight"] = $allWeight; $arResult["allWeight_FORMATED"] = roundEx(doubleval($allWeight / $this->weightKoef), SALE_WEIGHT_PRECISION) . " " . $this->weightUnit; $arResult["allSum_FORMATED"] = $this->getSaleFormatCurrency($allSum, $allCurrency); $arResult["DISCOUNT_PRICE_FORMATED"] = $this->getSaleFormatCurrency($arResult["DISCOUNT_PRICE"], $allCurrency); $arResult["PRICE_WITHOUT_DISCOUNT"] = $this->getSaleFormatCurrency($allSum + $DISCOUNT_PRICE_ALL, $allCurrency); if ($this->priceVatShowValue == 'Y') { $arResult["allVATSum"] = $allVATSum; $arResult["allVATSum_FORMATED"] = $this->getSaleFormatCurrency($allVATSum, $allCurrency); $arResult["allSum_wVAT_FORMATED"] = $this->getSaleFormatCurrency(doubleval($arResult["allSum"] - $allVATSum), $allCurrency); } if (!empty($arCoupons)) { $arResult["COUPON"] = htmlspecialcharsbx($arCoupons[0]); } if (count($arBasketItems) <= 0) { $arResult["ERROR_MESSAGE"] = GetMessage("SALE_EMPTY_BASKET"); } $arResult["DISCOUNT_PRICE_ALL"] = $DISCOUNT_PRICE_ALL; $arResult["DISCOUNT_PRICE_ALL_FORMATED"] = $this->getSaleFormatCurrency($DISCOUNT_PRICE_ALL, $allCurrency); return $arResult; }
public function getBasketItems() { global $APPLICATION; $bUseCatalog = CModule::IncludeModule("catalog"); $bUseIblock = $bUseCatalog; CSaleBasket::UpdateBasketPrices(CSaleBasket::GetBasketUserID(), SITE_ID); $bShowReady = False; $bShowDelay = False; $bShowSubscribe = False; $bShowNotAvail = False; $allSum = 0; $allWeight = 0; $allCurrency = CSaleLang::GetLangCurrency(SITE_ID); $allVATSum = 0; $arParents = array(); $arResult["ITEMS"]["AnDelCanBuy"] = array(); $arResult["ITEMS"]["DelDelCanBuy"] = array(); $arResult["ITEMS"]["nAnCanBuy"] = array(); $arResult["ITEMS"]["ProdSubscribe"] = array(); $DISCOUNT_PRICE_ALL = 0; // BASKET PRODUCTS (including measures, ratio, iblock properties data) $arImgFields = array("PREVIEW_PICTURE", "DETAIL_PICTURE"); $arBasketItems = array(); $arSku2Parent = array(); $arSetParentWeight = array(); $dbItems = CSaleBasket::GetList( array("ID" => "ASC"), array( "FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL" ), false, false, array( "ID", "NAME", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "DETAIL_PAGE_URL", "NOTES", "CURRENCY", "VAT_RATE", "CATALOG_XML_ID", "PRODUCT_XML_ID", "SUBSCRIBE", "DISCOUNT_PRICE", "PRODUCT_PROVIDER_CLASS", "TYPE", "SET_PARENT_ID" ) ); while ($arItem = $dbItems->GetNext()) { $arBasketItems[] = $arItem; if (CSaleBasketHelper::isSetItem($arItem)) continue; $arElementId[] = $arItem["PRODUCT_ID"]; if ($bUseCatalog) { $arParent = CCatalogSku::GetProductInfo($arItem["PRODUCT_ID"]); if ($arParent) { $arElementId[] = $arParent["ID"]; $arSku2Parent[$arItem["PRODUCT_ID"]] = $arParent["ID"]; $arParents[$arItem["PRODUCT_ID"]]["PRODUCT_ID"] = $arParent["ID"]; $arParents[$arItem["PRODUCT_ID"]]["IBLOCK_ID"] = $arParent["IBLOCK_ID"]; } } } // get measures, ratio, sku props data and available quantity if (!empty($arBasketItems) && $bUseCatalog) { $arBasketItems = getMeasures($arBasketItems); $arBasketItems = getRatio($arBasketItems); $arBasketItems = $this->getAvailableQuantity($arBasketItems); } // get product properties data $arProductData = getProductProps($arElementId, array_merge(array("ID"), $arImgFields, $this->arCustomSelectFields)); foreach ($arBasketItems as &$arItem) { $quantityIsFloat = false; if (number_format(doubleval($arItem['QUANTITY']), 2, '.', '') != intval($arItem['QUANTITY'])) { $quantityIsFloat = true; } $arItem["QUANTITY"] = ($quantityIsFloat === false && $this->quantityFloat != "Y") ? intval($arItem['QUANTITY']) : number_format(doubleval($arItem['QUANTITY']), 2, '.', ''); $arItem["PROPS"] = array(); $dbProp = CSaleBasket::GetPropsList( array("SORT" => "ASC", "ID" => "ASC"), array("BASKET_ID" => $arItem["ID"], "!CODE" => array("CATALOG.XML_ID", "PRODUCT.XML_ID")) ); while ($arProp = $dbProp->GetNext()) $arItem["PROPS"][] = $arProp; $arItem["PRICE_VAT_VALUE"] = (($arItem["PRICE"] / ($arItem["VAT_RATE"] +1)) * $arItem["VAT_RATE"]); $arItem["PRICE_FORMATED"] = SaleFormatCurrency($arItem["PRICE"], $arItem["CURRENCY"]); $arItem["WEIGHT"] = doubleval($arItem["WEIGHT"]); $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION)." ".$this->weightUnit; if (CSaleBasketHelper::isSetItem($arItem)) $arSetParentWeight[$arItem["SET_PARENT_ID"]] += $arItem["WEIGHT"] * $arItem["QUANTITY"]; if (array_key_exists($arItem["PRODUCT_ID"], $arProductData) && is_array($arProductData[$arItem["PRODUCT_ID"]])) { foreach ($arProductData[$arItem["PRODUCT_ID"]] as $key => $value) { if (strpos($key, "PROPERTY_") !== false || in_array($key, $arImgFields)) $arItem[$key] = $value; } } if (array_key_exists($arItem["PRODUCT_ID"], $arSku2Parent)) // if sku element doesn't have value of some property - we'll show parent element value instead { $arFieldsToFill = array_merge($this->arCustomSelectFields, $arImgFields); // fields to be filled with parents' values if empty foreach ($arFieldsToFill as $field) { $fieldVal = (in_array($field, $arImgFields)) ? $field : $field."_VALUE"; $parentId = $arSku2Parent[$arItem["PRODUCT_ID"]]; if ((!isset($arItem[$fieldVal]) || (isset($arItem[$fieldVal]) && strlen($arItem[$fieldVal]) == 0)) && (isset($arProductData[$parentId][$fieldVal]) && !empty($arProductData[$parentId][$fieldVal]))) // can be array or string { $arItem[$fieldVal] = $arProductData[$parentId][$fieldVal]; } } } foreach ($arItem as $key => $value) // format properties' values { if ((strpos($key, "PROPERTY_", 0) === 0) && (strrpos($key, "_VALUE") == strlen($key) - 6)) { $code = str_replace(array("PROPERTY_", "_VALUE"), "", $key); $propData = $this->arIblockProps[$code]; $arItem[$key] = CSaleHelper::getIblockPropInfo($value, $propData); } } $arItem["PREVIEW_PICTURE_SRC"] = ""; if (isset($arItem["PREVIEW_PICTURE"]) && intval($arItem["PREVIEW_PICTURE"]) > 0) { $arImage = CFile::GetFileArray($arItem["PREVIEW_PICTURE"]); if ($arImage) { $arFileTmp = CFile::ResizeImageGet( $arImage, array("width" => "110", "height" =>"110"), BX_RESIZE_IMAGE_PROPORTIONAL, true ); $arItem["PREVIEW_PICTURE_SRC"] = $arFileTmp["src"]; } } $arItem["DETAIL_PICTURE_SRC"] = ""; if (isset($arItem["DETAIL_PICTURE"]) && intval($arItem["DETAIL_PICTURE"]) > 0) { $arImage = CFile::GetFileArray($arItem["DETAIL_PICTURE"]); if ($arImage) { $arFileTmp = CFile::ResizeImageGet( $arImage, array("width" => "110", "height" =>"110"), BX_RESIZE_IMAGE_PROPORTIONAL, true ); $arItem["DETAIL_PICTURE_SRC"] = $arFileTmp["src"]; } } } unset($arItem); // get sku props data if (!empty($arBasketItems) && $bUseCatalog && isset($this->offersProps) && !empty($this->offersProps)) { $arBasketItems = $this->getSkuPropsData($arBasketItems, $arParents, $this->offersProps); } // count weight for set parent products foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetParent($arItem)) { $arItem["WEIGHT"] = $arSetParentWeight[$arItem["ID"]] / $arItem["QUANTITY"]; $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $this->weightKoef), SALE_WEIGHT_PRECISION)." ".$this->weightUnit; } } if (isset($arItem)) { unset($arItem); } // fill item arrays for old templates foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetItem($arItem)) continue; if ($arItem["CAN_BUY"] == "Y" && $arItem["DELAY"] == "N") { $allSum += ($arItem["PRICE"] * $arItem["QUANTITY"]); $allWeight += ($arItem["WEIGHT"] * $arItem["QUANTITY"]); $allVATSum += roundEx($arItem["PRICE_VAT_VALUE"] * $arItem["QUANTITY"], SALE_VALUE_PRECISION); $bShowReady = True; if(doubleval($arItem["DISCOUNT_PRICE"]) > 0) { if (0 < doubleval($arItem["DISCOUNT_PRICE"] + $arItem["PRICE"])) { $arItem["DISCOUNT_PRICE_PERCENT"] = $arItem["DISCOUNT_PRICE"]*100 / ($arItem["DISCOUNT_PRICE"] + $arItem["PRICE"]); } else { $arItem["DISCOUNT_PRICE_PERCENT"] = 0; } $arItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION)."%"; $DISCOUNT_PRICE_ALL += $arItem["DISCOUNT_PRICE"] * $arItem["QUANTITY"]; } $arResult["ITEMS"]["AnDelCanBuy"][] = $arItem; } elseif ($arItem["CAN_BUY"] == "Y" && $arItem["DELAY"] == "Y") { $bShowDelay = True; $arResult["ITEMS"]["DelDelCanBuy"][] = $arItem; } elseif ($arItem["CAN_BUY"] == "N" && $arItem["SUBSCRIBE"] == "Y") { $bShowSubscribe = True; $arResult["ITEMS"]["ProdSubscribe"][] = $arItem; } else { $bShowNotAvail = True; $arItem["NOT_AVAILABLE"] = true; $arResult["ITEMS"]["nAnCanBuy"][] = $arItem; } } unset($arItem); $arResult["ShowReady"] = (($bShowReady)?"Y":"N"); $arResult["ShowDelay"] = (($bShowDelay)?"Y":"N"); $arResult["ShowNotAvail"] = (($bShowNotAvail)?"Y":"N"); $arResult["ShowSubscribe"] = (($bShowSubscribe)?"Y":"N"); $arOrder = array( 'SITE_ID' => SITE_ID, 'USER_ID' => $GLOBALS["USER"]->GetID(), 'ORDER_PRICE' => $allSum, 'ORDER_WEIGHT' => $allWeight, 'BASKET_ITEMS' => $arResult["ITEMS"]["AnDelCanBuy"] ); $arOptions = array( 'COUNT_DISCOUNT_4_ALL_QUANTITY' => $this->countDiscount4AllQuantity, ); $arErrors = array(); CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); $allSum = 0; $allWeight = 0; $allVATSum = 0; $DISCOUNT_PRICE_ALL = 0; $priceWithoutDiscount = 0; foreach ($arOrder["BASKET_ITEMS"] as &$arOneItem) { $allWeight += ($arOneItem["WEIGHT"] * $arOneItem["QUANTITY"]); $allSum += ($arOneItem["PRICE"] * $arOneItem["QUANTITY"]); if (array_key_exists('VAT_VALUE', $arOneItem)) $arOneItem["PRICE_VAT_VALUE"] = $arOneItem["VAT_VALUE"]; $allVATSum += roundEx($arOneItem["PRICE_VAT_VALUE"] * $arOneItem["QUANTITY"], SALE_VALUE_PRECISION); $arOneItem["PRICE_FORMATED"] = SaleFormatCurrency($arOneItem["PRICE"], $arOneItem["CURRENCY"]); $arOneItem["FULL_PRICE"] = $arOneItem["PRICE"] + $arOneItem["DISCOUNT_PRICE"]; $arOneItem["FULL_PRICE_FORMATED"] = SaleFormatCurrency($arOneItem["FULL_PRICE"], $arOneItem["CURRENCY"]); $arOneItem["SUM"] = SaleFormatCurrency($arOneItem["PRICE"] * $arOneItem["QUANTITY"], $arOneItem["CURRENCY"]); if (0 < doubleval($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"])) { $arOneItem["DISCOUNT_PRICE_PERCENT"] = $arOneItem["DISCOUNT_PRICE"]*100 / ($arOneItem["DISCOUNT_PRICE"] + $arOneItem["PRICE"]); } else { $arOneItem["DISCOUNT_PRICE_PERCENT"] = 0; } $arOneItem["DISCOUNT_PRICE_PERCENT_FORMATED"] = roundEx($arOneItem["DISCOUNT_PRICE_PERCENT"], SALE_VALUE_PRECISION)."%"; $DISCOUNT_PRICE_ALL += $arOneItem["DISCOUNT_PRICE"] * $arOneItem["QUANTITY"]; } unset($arOneItem); $arResult["ITEMS"]["AnDelCanBuy"] = $arOrder["BASKET_ITEMS"]; // fill grid data (for new templates with custom columns) foreach ($arResult["ITEMS"] as $type => $arItems) { foreach ($arItems as $k => $arItem) { $arResult["GRID"]["ROWS"][$arItem["ID"]] = $arItem; } } $arResult["allSum"] = $allSum; $arResult["allWeight"] = $allWeight; $arResult["allWeight_FORMATED"] = roundEx(doubleval($allWeight/$this->weightKoef), SALE_WEIGHT_PRECISION)." ".$this->weightUnit; $arResult["allSum_FORMATED"] = SaleFormatCurrency($allSum, $allCurrency); $arResult["DISCOUNT_PRICE_FORMATED"] = SaleFormatCurrency($arResult["DISCOUNT_PRICE"], $allCurrency); $arResult["PRICE_WITHOUT_DISCOUNT"] = SaleFormatCurrency($allSum + $DISCOUNT_PRICE_ALL, $allCurrency); if ($this->priceVatShowValue == 'Y') { $arResult["allVATSum"] = $allVATSum; $arResult["allVATSum_FORMATED"] = SaleFormatCurrency($allVATSum, $allCurrency); $arResult["allSum_wVAT_FORMATED"] = SaleFormatCurrency(doubleval($arResult["allSum"]-$allVATSum), $allCurrency); } if ($this->hideCoupon != "Y") $arCoupons = CCatalogDiscountCoupon::GetCoupons(); if (!empty($arCoupons)) $arResult["COUPON"] = htmlspecialcharsbx($arCoupons[0]); if(count($arBasketItems)<=0) $arResult["ERROR_MESSAGE"] = GetMessage("SALE_EMPTY_BASKET"); $arResult["DISCOUNT_PRICE_ALL"] = $DISCOUNT_PRICE_ALL; $arResult["DISCOUNT_PRICE_ALL_FORMATED"] = SaleFormatCurrency($DISCOUNT_PRICE_ALL, $allCurrency); if($this->usePrepayment == "Y") { if(doubleval($arResult["allSum"]) > 0) { $personType = array(); $dbPersonType = CSalePersonType::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array("LID" => SITE_ID, "ACTIVE" => "Y")); while($arPersonType = $dbPersonType->Fetch()) { $personType[] = $arPersonType["ID"]; } if(!empty($personType)) { $dbPaySysAction = CSalePaySystemAction::GetList( array(), array( "PS_ACTIVE" => "Y", "HAVE_PREPAY" => "Y", "PERSON_TYPE_ID" => $personType, ), false, false, array("ID", "PAY_SYSTEM_ID", "PERSON_TYPE_ID", "NAME", "ACTION_FILE", "RESULT_FILE", "NEW_WINDOW", "PARAMS", "ENCODING", "LOGOTIP") ); if ($arPaySysAction = $dbPaySysAction->Fetch()) { CSalePaySystemAction::InitParamarrays(false, false, $arPaySysAction["PARAMS"]); $pathToAction = $_SERVER["DOCUMENT_ROOT"].$arPaySysAction["ACTION_FILE"]; $pathToAction = str_replace("\\", "/", $pathToAction); while (substr($pathToAction, strlen($pathToAction) - 1, 1) == "/") $pathToAction = substr($pathToAction, 0, strlen($pathToAction) - 1); if (file_exists($pathToAction)) { if (is_dir($pathToAction) && file_exists($pathToAction."/pre_payment.php")) $pathToAction .= "/pre_payment.php"; include_once($pathToAction); $psPreAction = new CSalePaySystemPrePayment; if($psPreAction->init()) { $orderData = array( "PATH_TO_ORDER" => $this->pathToOrder, "AMOUNT" => $arResult["allSum"], "BASKET_ITEMS" => $arResult["ITEMS"]["AnDelCanBuy"], ); if(!$psPreAction->BasketButtonAction($orderData)) { if($e = $APPLICATION->GetException()) $arResult["WARNING_MESSAGE"][] = $e->GetString(); } $arResult["PREPAY_BUTTON"] = $psPreAction->BasketButtonShow(); } } } } } } return $arResult; }
/** * <p>Метод обновляет параметры скидки с кодом ID на параметры из массива arFields. Метод динамичный. </p> * * * @param int $ID Код скидки. * * @param array $arFields Ассоциативный массив новых параметров скидки, ключами в котором * являются названия параметров, а значениями - новые значения. * Допустимо указание не всех ключей, а только тех, значения которых * необходимо изменить.<br> Допустимые ключи:<br><ul> <li> <b>LID</b> - код сайта, * к которому привязана эта скидка;</li> <li> <b>PRICE_FROM</b> - общая стоимость * заказа, начиная с которой предоставляется эта скидка;</li> <li> * <b>PRICE_TO</b> - общая стоимость заказа, до достижения которой * предоставляется эта скидка;</li> <li> <b>CURRENCY</b> - валюта денежных полей * в записи;</li> <li> <b>DISCOUNT_VALUE</b> - величина скидки;</li> <li> <b>DISCOUNT_TYPE</b> - * тип величины скидки (P - величина задана в процентах, V - величина * задана в абсолютной сумме);</li> <li> <b>ACTIVE</b> - флаг (Y/N) активности * скидки;</li> <li> <b>SORT</b> - индекс сортировки (если по сумме заказа * доступно несколько скидок, то берется первая по сортировке)</li> </ul> * * @return int <p>Возвращается код измененной скидки или <i>false</i> в случае * ошибки.</p> <br><br> * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalediscount/csalediscount__update.700e1b34.php * @author Bitrix */ public static function Update($ID, $arFields) { global $DB; $ID = (int) $ID; if ($ID <= 0) { return false; } $boolNewVersion = true; $arFields['ID'] = $ID; if (!array_key_exists('CONDITIONS', $arFields) && !array_key_exists('ACTIONS', $arFields)) { $boolConvert = CSaleDiscount::__ConvertOldFormat('UPDATE', $arFields); if (!$boolConvert) { return false; } $boolNewVersion = false; } if (!CSaleDiscount::CheckFields("UPDATE", $arFields)) { return false; } if ($boolNewVersion) { $boolConvert = CSaleDiscount::__SetOldFields('UPDATE', $arFields); if (!$boolConvert) { return false; } } $strUpdate = $DB->PrepareUpdate("b_sale_discount", $arFields); if (!empty($strUpdate)) { $strSql = "update b_sale_discount set " . $strUpdate . " where ID = " . $ID; $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } if (isset($arFields['USER_GROUPS'])) { Internals\DiscountGroupTable::updateByDiscount($ID, $arFields['USER_GROUPS'], isset($arFields['ACTIVE']) ? $arFields['ACTIVE'] : '', true); } elseif (isset($arFields['ACTIVE'])) { Internals\DiscountGroupTable::changeActiveByDiscount($ID, $arFields['ACTIVE']); } if (isset($arFields['HANDLERS'])) { self::updateDiscountHandlers($ID, $arFields['HANDLERS'], true); } if (isset($arFields['ENTITIES'])) { Internals\DiscountEntitiesTable::updateByDiscount($ID, $arFields['ENTITIES'], true); } return $ID; }
$arResultItem["DETAIL_PICTURE"] = CFile::GetFileArray($arProductPicture[$productId]["DETAIL_PICTURE"]); } $dblMinPrice = $allSum; $events = GetModuleEvents("sale", "OnSaleComponentOrderOneStepDiscountBefore"); while($arEvent = $events->Fetch()) ExecuteModuleEventEx($arEvent, Array(&$arResult, &$arUserResult, &$arParams)); $dbDiscount = CSaleDiscount::GetList( array("SORT" => "ASC"), array( "LID" => SITE_ID, "ACTIVE" => "Y", "!>ACTIVE_FROM" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "!<ACTIVE_TO" => Date($DB->DateFormatToPHP(CSite::GetDateFormat("FULL"))), "<=PRICE_FROM" => $arResult["ORDER_PRICE"], ">=PRICE_TO" => $arResult["ORDER_PRICE"], "USER_GROUPS" => $USER->GetUserGroupArray(), ), false, false, array("*") ); while ($arDiscount = $dbDiscount->Fetch()) { $dblDiscount = 0; $allSum_tmp = $allSum; if ($arDiscount["DISCOUNT_TYPE"] == "P") { if($arParams["COUNT_DISCOUNT_4_ALL_QUANTITY"] == "Y") {
if ($bRus) { $arPaySystems = array(array("NAME" => GetMessage("SALE_WIZARD_PS_CASH"), "SORT" => 50, "DESCRIPTION" => GetMessage("SALE_WIZARD_PS_CASH_DESCR"), "CODE_TEMP" => "cash", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => GetMessage("SALE_WIZARD_PS_CASH"), "ACTION_FILE" => "/bitrix/modules/sale/payment/cash", "RESULT_FILE" => "", "NEW_WINDOW" => "N", "PARAMS" => "", "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"), array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["ur"], "NAME" => GetMessage("SALE_WIZARD_PS_CASH"), "ACTION_FILE" => "/bitrix/modules/sale/payment/cash", "RESULT_FILE" => "", "NEW_WINDOW" => "N", "PARAMS" => "", "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"))), array("NAME" => GetMessage("SALE_WIZARD_PS_CC"), "SORT" => 60, "DESCRIPTION" => GetMessage("SALE_WIZARD_PS_CC"), "CODE_TEMP" => "card", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => GetMessage("SALE_WIZARD_PS_CC"), "ACTION_FILE" => "/bitrix/modules/sale/payment/assist", "RESULT_FILE" => "/bitrix/modules/sale/payment/assist_res.php", "NEW_WINDOW" => "N", "PARAMS" => serialize(array("FIRST_NAME" => array("TYPE" => "USER", "VALUE" => "NAME"), "LAST_NAME" => array("TYPE" => "USER", "VALUE" => "LAST_NAME"), "EMAIL" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["EMAIL"]), "ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["ADDRESS"]))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "Y", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"))), array("NAME" => GetMessage("SALE_WIZARD_PS_WM"), "SORT" => 70, "DESCRIPTION" => GetMessage("SALE_WIZARD_PS_WM_DESCR"), "CODE_TEMP" => "webmoney", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => GetMessage("SALE_WIZARD_PS_WM"), "ACTION_FILE" => "/bitrix/modules/sale/payment/webmoney_web", "RESULT_FILE" => "", "NEW_WINDOW" => "Y", "PARAMS" => "", "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "Y", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"))), array("NAME" => GetMessage("SALE_WIZARD_PS_PC"), "SORT" => 80, "DESCRIPTION" => "", "CODE_TEMP" => "paycash", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => GetMessage("SALE_WIZARD_PS_PC"), "ACTION_FILE" => "/bitrix/modules/sale/payment/yandex", "RESULT_FILE" => "/bitrix/modules/sale/payment/assist_res.php", "NEW_WINDOW" => "N", "PARAMS" => serialize(array("ORDER_ID" => array("TYPE" => "ORDER", "VALUE" => "ID"), "USER_ID" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "ORDER_DATE" => array("TYPE" => "ORDER", "VALUE" => "DATE_INSERT"), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "Y"))), array("NAME" => GetMessage("SALE_WIZARD_PS_SB"), "SORT" => 90, "DESCRIPTION" => GetMessage("SALE_WIZARD_PS_SB_DESCR"), "CODE_TEMP" => "sberbank", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => GetMessage("SALE_WIZARD_PS_SB"), "ACTION_FILE" => "/bitrix/modules/sale/payment/sberbank_new", "RESULT_FILE" => "", "NEW_WINDOW" => "Y", "PARAMS" => serialize(array("COMPANY_NAME" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_SB_CN")), "INN" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_SB_INN")), "KPP" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_SB_KPP")), "SETTLEMENT_ACCOUNT" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_SB_NC")), "BANK_NAME" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_SB_NB")), "BANK_BIC" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_SB_BR")), "BANK_COR_ACCOUNT" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_SB_NCB")), "ORDER_ID" => array("TYPE" => "ORDER", "VALUE" => "ID"), "DATE_INSERT" => array("TYPE" => "ORDER", "VALUE" => "DATE_INSERT_DATE"), "PAYER_CONTACT_PERSON" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "PAYER_ZIP_CODE" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["INDEX"]), "PAYER_COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["LOCATION"] . "_COUNTRY"), "PAYER_CITY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["LOCATION"] . "_CITY"), "PAYER_ADDRESS_FACT" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["ADDRESS"]), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"))), array("NAME" => GetMessage("SALE_WIZARD_PS_BILL"), "SORT" => 100, "DESCRIPTION" => "", "CODE_TEMP" => "bill", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["ur"], "NAME" => GetMessage("SALE_WIZARD_PS_BILL"), "ACTION_FILE" => "/bitrix/modules/sale/payment/bill", "RESULT_FILE" => "", "NEW_WINDOW" => "Y", "PARAMS" => serialize(array("DATE_INSERT" => array("TYPE" => "ORDER", "VALUE" => "DATE_INSERT_DATE"), "SELLER_NAME" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_BILL_BITRIX")), "SELLER_ADDRESS" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_BILL_ADDRESS")), "SELLER_PHONE" => array("TYPE" => "", "VALUE" => "+74012510564"), "SELLER_INN" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_BILL_INN")), "SELLER_KPP" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_BILL_KPP")), "SELLER_RS" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_BILL_RS")), "SELLER_KS" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_BILL_KS")), "SELLER_BIK" => array("TYPE" => "", "VALUE" => GetMessage("SALE_WIZARD_PS_BILL_BIK")), "BUYER_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_COMPANY_NAME"]), "BUYER_INN" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_INN"]), "BUYER_ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_ADDRESS_FULL"]), "BUYER_PHONE" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_PHONE"]), "BUYER_FAX" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_FAX"]), "BUYER_PAYER_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_NAME"]), "PATH_TO_STAMP" => array("TYPE" => "", "VALUE" => "/images/pechat.gif"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N")))); } else { $arPaySystems = array(array("NAME" => "Cash", "SORT" => 50, "DESCRIPTION" => "You can pay in cash to our courier.", "CODE_TEMP" => "cash", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => "Cash", "ACTION_FILE" => "/bitrix/modules/sale/payment/cash", "RESULT_FILE" => "", "NEW_WINDOW" => "N", "PARAMS" => "", "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"), array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["ur"], "NAME" => "Cash", "ACTION_FILE" => "/bitrix/modules/sale/payment/cash", "RESULT_FILE" => "", "NEW_WINDOW" => "N", "PARAMS" => "", "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"))), array("NAME" => "Authorize.Net", "SORT" => 60, "DESCRIPTION" => "", "CODE_TEMP" => "authorizenet", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => "Authorize.Net", "ACTION_FILE" => "/bitrix/modules/sale/payment/authorizenet", "NEW_WINDOW" => "N", "PARAMS" => serialize(array("PS_LOGIN" => array("TYPE" => "", "VALUE" => "Login ID"), "PS_TRANSACTION_KEY" => array("TYPE" => "", "VALUE" => "Transaction key"), "HASH_VALUE" => array("TYPE" => "", "VALUE" => "Hash value"), "TEST_TRANSACTION" => array("TYPE" => "", "VALUE" => "Test transaction"), "FIRST_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "LAST_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["ADDRESS"]), "CITY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_LOCATION"] . "_CITY"), "ZIP" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["INDEX"]), "COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_LOCATION"] . "_COUNTRY"), "EMAIL" => array("TYPE" => "USER", "VALUE" => "EMAIL"), "SHIP_FIRST_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "SHIP_LAST_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "SHIP_ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["ADDRESS"]), "SHIP_CITY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_LOCATION"] . "_CITY"), "SHIP_ZIP" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["INDEX"]), "SHIP_COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_LOCATION"] . "_COUNTRY"), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "Y", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "Y", "HAVE_RESULT_RECEIVE" => "N"))), array("NAME" => "Payflow Pro", "SORT" => 70, "DESCRIPTION" => "", "CODE_TEMP" => "payflow", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => "Payflow Pro", "ACTION_FILE" => "/bitrix/modules/sale/payment/payflow_pro", "NEW_WINDOW" => "N", "PARAMS" => serialize(array("PAYFLOW_URL" => array("TYPE" => "", "VALUE" => "test-payflow.verisign.com"), "PAYFLOW_PORT" => array("TYPE" => "", "VALUE" => 443), "PAYFLOW_USER" => array("TYPE" => "", "VALUE" => "User code"), "PAYFLOW_PASSWORD" => array("TYPE" => "", "VALUE" => "Password"), "PAYFLOW_PARTNER" => array("TYPE" => "", "VALUE" => "Partner"), "PAYFLOW_EXE_PATH" => array("TYPE" => "", "VALUE" => "/verisign/win32/bin/pfpro.exe"), "PAYFLOW_CERT_PATH" => array("TYPE" => "", "VALUE" => "/verisign/win32/certs/"), "NOC" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["ADDRESS"]), "ZIP" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["INDEX"]), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "Y", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "Y", "HAVE_RESULT_RECEIVE" => "N"), array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["ur"], "NAME" => "Payflow Pro", "ACTION_FILE" => "/bitrix/modules/sale/payment/payflow_pro", "NEW_WINDOW" => "N", "PARAMS" => serialize(array("PAYFLOW_URL" => array("TYPE" => "", "VALUE" => "test-payflow.verisign.com"), "PAYFLOW_PORT" => array("TYPE" => "", "VALUE" => 443), "PAYFLOW_USER" => array("TYPE" => "", "VALUE" => "User code"), "PAYFLOW_PASSWORD" => array("TYPE" => "", "VALUE" => "Password"), "PAYFLOW_PARTNER" => array("TYPE" => "", "VALUE" => "Partner"), "PAYFLOW_EXE_PATH" => array("TYPE" => "", "VALUE" => "/verisign/win32/bin/pfpro.exe"), "PAYFLOW_CERT_PATH" => array("TYPE" => "", "VALUE" => "/verisign/win32/certs/"), "NOC" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_COMPANY_NAME"]), "ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_ADDRESS_FULL"]), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "Y", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "Y", "HAVE_RESULT_RECEIVE" => "N"))), array("NAME" => "WorldPay", "SORT" => 80, "DESCRIPTION" => "", "CODE_TEMP" => "worldpay", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => "WorldPay", "ACTION_FILE" => "/bitrix/modules/sale/payment/worldpay", "NEW_WINDOW" => "N", "PARAMS" => serialize(array("TEST_TRANSACTION" => array("TYPE" => "", "VALUE" => 101), "SHOP_ID" => array("TYPE" => "", "VALUE" => "WorldPay ID"), "PAYER_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "PHONE" => array("TYPE" => "USER", "VALUE" => "PERSONAL_MOBILE"), "EMAIL" => array("TYPE" => "USER", "VALUE" => "EMAIL"), "ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["ADDRESS"]), "ZIP" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["INDEX"]), "COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_LOCATION"] . "_COUNTRY"), "CALLBACK_PASSWORD" => array("TYPE" => "", "VALUE" => ""), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "Y", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"), array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["ur"], "NAME" => "WorldPay", "ACTION_FILE" => "/bitrix/modules/sale/payment/worldpay", "NEW_WINDOW" => "N", "PARAMS" => serialize(array("TEST_TRANSACTION" => array("TYPE" => "", "VALUE" => 101), "SHOP_ID" => array("TYPE" => "", "VALUE" => "WorldPay ID"), "PAYER_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_NAME"]), "PHONE" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_PHONE"]), "EMAIL" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_EMAIL"]), "ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_ADDRESS_FULL"]), "COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_LOCATION"] . "_COUNTRY"), "CALLBACK_PASSWORD" => array("TYPE" => "", "VALUE" => ""), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "Y", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N"))), array("NAME" => "PayPal", "SORT" => 90, "DESCRIPTION" => "", "CODE_TEMP" => "paypal", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => "PayPal", "ACTION_FILE" => "/bitrix/modules/sale/payment/paypal", "NEW_WINDOW" => "Y", "PARAMS" => serialize(array("TEST_TRANSACTION" => array("TYPE" => "", "VALUE" => 101), "SHOP_ID" => array("TYPE" => "", "VALUE" => "WorldPay ID"), "PAYER_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["CONTACT_PERSON"]), "PHONE" => array("TYPE" => "USER", "VALUE" => "PERSONAL_MOBILE"), "EMAIL" => array("TYPE" => "USER", "VALUE" => "EMAIL"), "ADDRESS" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["ADDRESS"]), "ZIP" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["INDEX"]), "COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCode"]["F_LOCATION"] . "_COUNTRY"), "CALLBACK_PASSWORD" => array("TYPE" => "", "VALUE" => ""), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "Y"))), array("NAME" => "Betalink", "SORT" => 90, "DESCRIPTION" => "", "CODE_TEMP" => "betalink", "ACTION" => array(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "NAME" => "betalink", "ACTION_FILE" => "/bitrix/modules/sale/payment/betalink", "NEW_WINDOW" => "Y", "PARAMS" => serialize(array("TEST_TRANSACTION" => array("TYPE" => "", "VALUE" => "Test transaction"), "SHOP_CODE" => array("TYPE" => "", "VALUE" => "Shop code"), "SHOULD_PAY" => array("TYPE" => "ORDER", "VALUE" => "PRICE"))), "HAVE_PAYMENT" => "Y", "HAVE_ACTION" => "N", "HAVE_RESULT" => "N", "HAVE_PREPAY" => "N", "HAVE_RESULT_RECEIVE" => "N")))); } foreach ($arPaySystems as $val) { $id = CSalePaySystem::Add(array("LID" => $siteID, "CURRENCY" => $bRus ? "RUB" : "USD", "NAME" => $val["NAME"], "ACTIVE" => "Y", "SORT" => $val["SORT"], "DESCRIPTION" => $val["DESCRIPTION"])); foreach ($val["ACTION"] as $action) { $action["PAY_SYSTEM_ID"] = $id; CSalePaySystemAction::Add($action); } } //discounts CSaleDiscount::Add(array("LID" => $siteID, "PRICE_FROM" => 800, "PRICE_TO" => 1500, "CURRENCY" => $bRus ? "RUB" : "USD", "DISCOUNT_VALUE" => 20, "DISCOUNT_TYPE" => "P", "ACTIVE" => "Y", "SORT" => 200, "ACTIVE_FROM" => "", "ACTIVE_TO" => "")); CSaleDiscount::Add(array("LID" => $siteID, "PRICE_FROM" => 500, "PRICE_TO" => 800, "CURRENCY" => $bRus ? "RUB" : "USD", "DISCOUNT_VALUE" => 15, "DISCOUNT_TYPE" => "P", "ACTIVE" => "Y", "SORT" => 100, "ACTIVE_FROM" => "", "ACTIVE_TO" => "")); CSaleDiscount::Add(array("LID" => $siteID, "PRICE_FROM" => 1500, "PRICE_TO" => 0, "CURRENCY" => $bRus ? "RUB" : "USD", "DISCOUNT_VALUE" => 25, "DISCOUNT_TYPE" => "P", "ACTIVE" => "Y", "SORT" => 300, "ACTIVE_FROM" => "", "ACTIVE_TO" => "")); if ($bRus) { //1C export $val = serialize(array("AGENT_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["CONTACT_PERSON"]), "FULL_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["CONTACT_PERSON"]), "SURNAME" => array("TYPE" => "USER", "VALUE" => "LAST_NAME"), "NAME" => array("TYPE" => "USER", "VALUE" => "NAME"), "ADDRESS_FULL" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["ADDRESS"]), "INDEX" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["INDEX"]), "COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["LOCATION"] . "_COUNTRY"), "CITY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["LOCATION"] . "_CITY"), "STREET" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["STREET"]), "EMAIL" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["EMAIL"]), "CONTACT_PERSON" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["CONTACT_PERSON"]), "IS_FIZ" => "Y")); CSaleExport::Add(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["fiz"], "VARS" => $val)); $val = serialize(array("AGENT_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_COMPANY_NAME"]), "FULL_NAME" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_COMPANY_NAME"]), "ADDRESS_FULL" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_ADDRESS_FULL"]), "COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_LOCATION"] . "_COUNTRY"), "CITY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_LOCATION"] . "_CITY"), "STREET" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_ADDRESS_FULL"]), "INN" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_INN"]), "KPP" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_KPP"]), "PHONE" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_PHONE"]), "EMAIL" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_EMAIL"]), "CONTACT_PERSON" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_NAME"]), "F_ADDRESS_FULL" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_ADDRESS"]), "F_COUNTRY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_LOCATION"] . "_COUNTRY"), "F_CITY" => array("TYPE" => "PROPERTY", "VALUE" => $arGeneralInfo["propCodeID"]["F_LOCATION"] . "_CITY"), "IS_FIZ" => "N")); CSaleExport::Add(array("PERSON_TYPE_ID" => $arGeneralInfo["personType"]["ur"], "VARS" => $val)); } $affiliatePlan = CSaleAffiliatePlan::Add(array("SITE_ID" => $siteID, "NAME" => GetMessage("SALE_WIZARD_AFFILIATE_PLAN"), "ACTIVE" => "Y", "BASE_RATE" => 5, "BASE_RATE_TYPE" => "P", "MIN_PAY" => 0, "MIN_PAY_VALUE" => 1)); CSaleAffiliate::Add(array("SITE_ID" => $siteID, "USER_ID" => 1, "PLAN_ID" => $affiliatePlan, "ACTIVE" => "Y", "DATE_CREATE" => ConvertTimeStamp(), "AFF_SITE" => "www.bitrixsoft.com", "AFF_DESCRIPTION" => GetMessage("SALE_WIZARD_AFFILIATE"), "FIX_PLAN" => "N")); } DemoSiteUtil::AddMenuItem("/personal/.left.menu.php", array(GetMessage("SALE_WIZARD_MENU_ORDERS"), "/personal/order/", array(), array(), "")); DemoSiteUtil::AddMenuItem("/personal/.left.menu.php", array(GetMessage("SALE_WIZARD_MENU_CART"), "/personal/cart/", array(), array(), "")); DemoSiteUtil::AddMenuItem("/personal/.left.menu.php", array(GetMessage("SALE_WIZARD_MENU_REGULAR_PAYMENT"), "/personal/regular-payment/", array(), array(), "")); DemoSiteUtil::AddMenuItem("/personal/.left.menu.php", array(GetMessage("SALE_WIZARD_MENU_PROFILES"), "/personal/customer-profiles/", array(), array(), "")); DemoSiteUtil::AddMenuItem("/personal/.left.menu.php", array(GetMessage("SALE_WIZARD_MENU_ACCOUNTS"), "/personal/account/", array(), array(), ""));
if (!in_array('ID', $arSelectFields)) { $arSelectFields[] = 'ID'; } $arSelectFieldsMap = array_fill_keys($arSelectFields, true); $arLangs = array(); $dbLangsList = CLang::GetList($b = "sort", $o = "asc"); while ($arLang = $dbLangsList->Fetch()) { $arLangs[$arLang["LID"]] = $arLang["LID"]; } $arSelectFields = array_values($arSelectFields); if (array_key_exists("mode", $_REQUEST) && $_REQUEST["mode"] == "excel") { $arNavParams = false; } else { $arNavParams = array("nPageSize" => CAdminResult::GetNavSize($sTableID)); } $dbResultList = CSaleDiscount::GetList(array($by => $order), $arFilter, false, $arNavParams, $arSelectFields); $dbResultList = new CAdminResult($dbResultList, $sTableID); $dbResultList->NavStart(); $lAdmin->NavText($dbResultList->GetNavPrint(GetMessage("BT_SALE_DISCOUNT_LIST_MESS_NAV"))); $arUserList = array(); $arUserID = array(); $strNameFormat = CSite::GetNameFormat(true); $arRows = array(); while ($arDiscount = $dbResultList->Fetch()) { $arDiscount['ID'] = intval($arDiscount['ID']); if (array_key_exists('CREATED_BY', $arSelectFieldsMap)) { $arDiscount['CREATED_BY'] = intval($arDiscount['CREATED_BY']); if (0 < $arDiscount['CREATED_BY']) { $arUserID[$arDiscount['CREATED_BY']] = true; } }
private function calculateOrder($arBasketItems) { $totalPrice = 0; $totalWeight = 0; foreach ($arBasketItems as $arItem) { $totalPrice += $arItem["PRICE"] * $arItem["QUANTITY"]; $totalWeight += $arItem["WEIGHT"] * $arItem["QUANTITY"]; } $arOrder = array('SITE_ID' => SITE_ID, 'ORDER_PRICE' => $totalPrice, 'ORDER_WEIGHT' => $totalWeight, 'BASKET_ITEMS' => $arBasketItems); if (is_object($GLOBALS["USER"])) { $arOrder['USER_ID'] = $GLOBALS["USER"]->GetID(); $arErrors = array(); CSaleDiscount::DoProcessOrder($arOrder, array(), $arErrors); } return $arOrder; }
$arDefaultValues = array('LID' => '', 'NAME' => '', 'CURRENCY' => '', 'DISCOUNT_VALUE' => '', 'DISCOUNT_TYPE' => 'P', 'ACTIVE' => 'Y', 'SORT' => '100', 'ACTIVE_FROM' => '', 'ACTIVE_TO' => '', 'PRIORITY' => 1, 'LAST_DISCOUNT' => 'Y', 'CONDITIONS' => '', 'XML_ID' => '', 'ACTIONS' => ''); if (isset($_REQUEST['LID'])) { $arDefaultValues['LID'] = trim($_REQUEST['LID']); } if ('' == $arDefaultValues['LID']) { $arDefaultValues['LID'] = 's1'; } $arSelect = array_merge(array('ID'), array_keys($arDefaultValues)); $arDiscount = array(); $arDiscountGroupList = array(); $rsDiscounts = CSaleDiscount::GetList(array(), array("ID" => $ID), false, false, $arSelect); if (!($arDiscount = $rsDiscounts->Fetch())) { $ID = 0; $arDiscount = $arDefaultValues; } else { $rsDiscountGroups = CSaleDiscount::GetDiscountGroupList(array(), array('DISCOUNT_ID' => $ID), false, false, array('GROUP_ID')); while ($arDiscountGroup = $rsDiscountGroups->Fetch()) { $arDiscountGroupList[] = intval($arDiscountGroup['GROUP_ID']); } } if ($bVarsFromForm) { if ($boolCondParseError || $boolActParseError) { $mxTempo = $arDiscount['CONDITIONS']; $mxTempo2 = $arDiscount['ACTIONS']; $arDiscount = $arFields; if ($boolCondParseError) { $arDiscount['CONDITIONS'] = $mxTempo; } if ($boolActParseError) { $arDiscount['ACTIONS'] = $mxTempo2; }
public function runOperation() { global $APPLICATION; $this->getDeliveryCodes(); $found = false; $filter = array('>ID' => $this->lastID, '=VERSION' => Sale\Internals\DiscountTable::VERSION_NEW); $discountsIterator = Sale\Internals\DiscountTable::getList(array('select' => array('ID', 'MODIFIED_BY', 'TIMESTAMP_X', 'CONDITIONS_LIST', 'ACTIONS_LIST', 'NAME'), 'filter' => $filter, 'order' => array('ID' => 'ASC'), 'limit' => $this->maxOperationCounter)); while ($discount = $discountsIterator->fetch()) { $found = true; $error = array(); $this->convertDelivery($discount['CONDITIONS_LIST']); $rawFields = array('ID' => $discount['ID'], 'CONDITIONS' => $discount['CONDITIONS_LIST'], 'ACTIONS' => $discount['ACTIONS_LIST']); if (\CSaleDiscount::checkFields('UPDATE', $rawFields)) { $fields = array('MODIFIED_BY' => $discount['MODIFIED_BY'], 'TIMESTAMP_X' => $discount['TIMESTAMP_X'], 'UNPACK' => $rawFields['UNPACK'], 'CONDITIONS' => $discount['CONDITIONS_LIST'], 'VERSION' => Sale\Internals\DiscountTable::VERSION_15); if (isset($rawFields['EXECUTE_MODULE'])) { $fields['EXECUTE_MODULE'] = $rawFields['EXECUTE_MODULE']; } $updateResult = Sale\Internals\DiscountTable::update($discount['ID'], $fields); if ($updateResult->isSuccess()) { if (isset($rawFields['ENTITIES'])) { Sale\Internals\DiscountEntitiesTable::updateByDiscount($discount['ID'], $rawFields['ENTITIES'], true); } if (isset($rawFields['HANDLERS']['MODULES'])) { Sale\Internals\DiscountModuleTable::updateByDiscount($discount['ID'], $rawFields['HANDLERS']['MODULES'], true); } } else { $error = $updateResult->getErrorMessages(); } } else { if ($ex = $APPLICATION->GetException()) { $error[] = $ex->GetString(); } else { $error[] = Loc::getMessage('SALE_DISCOUNT_REINDEX_UPDATE_UNKNOWN_ERROR'); } } $this->lastID = $discount['ID']; $this->allOperationCounter++; if (!empty($error)) { $this->errorCounter++; $this->errors[] = Loc::getMessage('SALE_DISCOUNT_REINDEX_ORDER_ERROR_REPORT', array('#URL#' => str_replace('#ID#', $discount['ID'], $this->discountEditUrl), '#TITLE#' => trim((string) $discount['NAME']) != '' ? $discount['NAME'] : $discount['ID'], '#ERRORS#' => implode('; ', $error))); } if ($this->maxExecutionTime > 0 && time() - $this->startOperationTime > $this->maxExecutionTime) { break; } } unset($discount, $discountsIterator); if (!$found) { $this->finishOperation = true; } }
/** * событие вызывается перед отправкой письма о новом заказе * @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; }
/** * <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; }
static function DoCalculateOrder($siteId, $userId, $arShoppingCart, $personTypeId, $arOrderPropsValues, $deliveryId, $paySystemId, $arOptions, &$arErrors, &$arWarnings) { $siteId = trim($siteId); if (empty($siteId)) { $arErrors[] = array("CODE" => "PARAM", "TEXT" => GetMessage('SKGO_CALC_PARAM_ERROR')); return null; } $userId = intval($userId); if (!is_array($arShoppingCart) || count($arShoppingCart) <= 0) { $arErrors[] = array("CODE" => "PARAM", "TEXT" => GetMessage('SKGO_SHOPPING_CART_EMPTY')); return null; } $arOrder = array("ORDER_PRICE" => 0, "ORDER_WEIGHT" => 0, "CURRENCY" => CSaleLang::GetLangCurrency($siteId), "WEIGHT_UNIT" => htmlspecialcharsbx(COption::GetOptionString('sale', 'weight_unit', false, $siteId)), "WEIGHT_KOEF" => htmlspecialcharsbx(COption::GetOptionString('sale', 'weight_koef', 1, $siteId)), "BASKET_ITEMS" => $arShoppingCart, "SITE_ID" => $siteId, "LID" => $siteId, "USER_ID" => $userId, "USE_VAT" => false, "VAT_RATE" => 0, "VAT_SUM" => 0, "DELIVERY_ID" => false); foreach ($arShoppingCart as $arShoppingCartItem) { if (array_key_exists('CUSTOM_PRICE', $arShoppingCartItem) && 'Y' == $arShoppingCartItem['CUSTOM_PRICE']) { $arShoppingCartItem['DISCOUNT_PRICE'] = $arShoppingCartItem['DEFAULT_PRICE'] - $arShoppingCartItem['PRICE']; if (0 > $arShoppingCartItem['DISCOUNT_PRICE']) { $arShoppingCartItem['DISCOUNT_PRICE'] = 0; } $arShoppingCartItem['DISCOUNT_PRICE_PERCENT'] = $arShoppingCartItem['DISCOUNT_PRICE'] * 100 / $arShoppingCartItem['DEFAULT_PRICE']; if ($arShoppingCartItem["VAT_RATE"] > 0) { $arShoppingCartItem["VAT_VALUE"] = $arShoppingCartItem["PRICE"] / ($arShoppingCartItem["VAT_RATE"] + 1) * $arShoppingCartItem["VAT_RATE"]; } } $arOrder["ORDER_PRICE"] += $arShoppingCartItem["PRICE"] * $arShoppingCartItem["QUANTITY"]; $arOrder["ORDER_WEIGHT"] += $arShoppingCartItem["WEIGHT"] * $arShoppingCartItem["QUANTITY"]; if ($arShoppingCartItem["VAT_RATE"] > 0) { $arOrder["USE_VAT"] = true; if ($arShoppingCartItem["VAT_RATE"] > $arOrder["VAT_RATE"]) { $arOrder["VAT_RATE"] = $arShoppingCartItem["VAT_RATE"]; } $arOrder["VAT_SUM"] += $arShoppingCartItem["VAT_VALUE"] * $arShoppingCartItem["QUANTITY"]; } } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderShoppingCart", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSalePersonType::DoProcessOrder($arOrder, $personTypeId, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderPersonType", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSaleOrderProps::DoProcessOrder($arOrder, $arOrderPropsValues, $arErrors, $arWarnings); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderProps", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSaleDelivery::DoProcessOrder($arOrder, $deliveryId, $arErrors); if (count($arErrors) > 0) { return null; } $arOrder["PRICE_DELIVERY"] = $arOrder["DELIVERY_PRICE"]; foreach (GetModuleEvents("sale", "OnSaleCalculateOrderDelivery", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSalePaySystem::DoProcessOrder($arOrder, $paySystemId, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderPaySystem", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } if (!array_key_exists('CART_FIX', $arOptions) || 'Y' != $arOptions['CART_FIX']) { CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderDiscount", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } } CSaleTax::DoProcessOrderBasket($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderShoppingCartTax", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSaleTax::DoProcessOrderDelivery($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) { return null; } foreach (GetModuleEvents("sale", "OnSaleCalculateOrderDeliveryTax", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } $arOrder["PRICE"] = $arOrder["ORDER_PRICE"] + $arOrder["DELIVERY_PRICE"] + $arOrder["TAX_PRICE"] - $arOrder["DISCOUNT_PRICE"]; $arOrder["TAX_VALUE"] = $arOrder["USE_VAT"] ? $arOrder["VAT_SUM"] : $arOrder["TAX_PRICE"]; foreach (GetModuleEvents("sale", "OnSaleCalculateOrder", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arOrder)); } return $arOrder; }
/** * @param $siteId * @param $userId * @param $arShoppingCart * @param $personTypeId * @param $arOrderPropsValues * @param $deliveryId * @param $paySystemId * @param $arOptions * @param $arErrors * @param $arWarnings * @return array|null */ static function DoCalculateOrder($siteId, $userId, $arShoppingCart, $personTypeId, $arOrderPropsValues, $deliveryId, $paySystemId, $arOptions, &$arErrors, &$arWarnings) { if(!is_array($arOptions)) { $arOptions = array(); } $siteId = trim($siteId); if (empty($siteId)) { $arErrors[] = array("CODE" => "PARAM", "TEXT" => GetMessage('SKGO_CALC_PARAM_ERROR')); return null; } $userId = intval($userId); if (!is_array($arShoppingCart) || (count($arShoppingCart) <= 0)) { $arErrors[] = array("CODE" => "PARAM", "TEXT" => GetMessage('SKGO_SHOPPING_CART_EMPTY')); return null; } // calculate weight for set parent $arParentWeight = array(); foreach ($arShoppingCart as $arItem) { if (CSaleBasketHelper::isSetItem($arItem)) $arParentWeight[$arItem["SET_PARENT_ID"]]["WEIGHT"] += $arItem["WEIGHT"] * $arItem["QUANTITY"]; } foreach ($arShoppingCart as &$arItem) { if (CSaleBasketHelper::isSetParent($arItem) && isset($arParentWeight[$arItem["SET_PARENT_ID"]])) $arItem["WEIGHT"] = $arParentWeight[$arItem["SET_PARENT_ID"]]["WEIGHT"]; } unset($arItem); $currency = isset($arOptions['CURRENCY']) && is_string($arOptions['CURRENCY']) ? $arOptions['CURRENCY'] : ''; if($currency === '') { $currency = CSaleLang::GetLangCurrency($siteId); } $arOrder = array( "ORDER_PRICE" => 0, "ORDER_WEIGHT" => 0, "CURRENCY" => $currency, "WEIGHT_UNIT" => htmlspecialcharsbx(COption::GetOptionString('sale', 'weight_unit', false, $siteId)), "WEIGHT_KOEF" => htmlspecialcharsbx(COption::GetOptionString('sale', 'weight_koef', 1, $siteId)), "BASKET_ITEMS" => $arShoppingCart, "SITE_ID" => $siteId, "LID" => $siteId, "USER_ID" => $userId, "USE_VAT" => false, "VAT_RATE" => 0, "VAT_SUM" => 0, "DELIVERY_ID" => false, ); $arOrderPrices = CSaleOrder::CalculateOrderPrices($arShoppingCart); if (sizeof($arOrderPrices)>0 && isset($arOrderPrices['BASKET_ITEMS'])) $arShoppingCart = $arOrderPrices['BASKET_ITEMS']; $arOrder['ORDER_PRICE'] = $arOrderPrices['ORDER_PRICE']; $arOrder['ORDER_WEIGHT'] = $arOrderPrices['ORDER_WEIGHT']; $arOrder['VAT_RATE'] = $arOrderPrices['VAT_RATE']; $arOrder['VAT_SUM'] = $arOrderPrices['VAT_SUM']; $arOrder["USE_VAT"] = ($arOrderPrices['USE_VAT'] == "Y"?true:false); foreach(GetModuleEvents("sale", "OnSaleCalculateOrderShoppingCart", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); CSalePersonType::DoProcessOrder($arOrder, $personTypeId, $arErrors); if (count($arErrors) > 0) return null; foreach(GetModuleEvents("sale", "OnSaleCalculateOrderPersonType", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); CSaleOrderProps::DoProcessOrder($arOrder, $arOrderPropsValues, $arErrors, $arWarnings, $paySystemId, $deliveryId); if (count($arErrors) > 0) return null; foreach(GetModuleEvents("sale", "OnSaleCalculateOrderProps", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); CSaleDelivery::DoProcessOrder($arOrder, $deliveryId, $arErrors); if (count($arErrors) > 0) return null; $arOrder["PRICE_DELIVERY"] = $arOrder["DELIVERY_PRICE"]; foreach(GetModuleEvents("sale", "OnSaleCalculateOrderDelivery", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); CSalePaySystem::DoProcessOrder($arOrder, $paySystemId, $arErrors); if (count($arErrors) > 0) return null; foreach(GetModuleEvents("sale", "OnSaleCalculateOrderPaySystem", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); if (!array_key_exists('CART_FIX', $arOptions) || 'Y' != $arOptions['CART_FIX']) { CSaleDiscount::DoProcessOrder($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) return null; foreach(GetModuleEvents("sale", "OnSaleCalculateOrderDiscount", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); } CSaleTax::DoProcessOrderBasket($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) return null; foreach(GetModuleEvents("sale", "OnSaleCalculateOrderShoppingCartTax", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); CSaleTax::DoProcessOrderDelivery($arOrder, $arOptions, $arErrors); if (count($arErrors) > 0) return null; foreach(GetModuleEvents("sale", "OnSaleCalculateOrderDeliveryTax", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); $arOrder["PRICE"] = $arOrder["ORDER_PRICE"] + $arOrder["DELIVERY_PRICE"] + $arOrder["TAX_PRICE"] - $arOrder["DISCOUNT_PRICE"]; $arOrder["TAX_VALUE"] = ($arOrder["USE_VAT"] ? $arOrder["VAT_SUM"] : $arOrder["TAX_PRICE"]); foreach(GetModuleEvents("sale", "OnSaleCalculateOrder", true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arOrder)); return $arOrder; }
if ($arParams["AJAX_CALL"] == "Y") { $shipment = CSaleDelivery::convertOrderOldToNew(array("WEIGHT" => $arParams["ORDER_WEIGHT"], "PRICE" => $arParams["ORDER_PRICE"], "LOCATION_TO" => $arParams["LOCATION_TO"], "LOCATION_ZIP" => $arParams['LOCATION_ZIP'], "ITEMS" => $arParams["ITEMS"], "CURRENCY" => $arParams["CURRENCY"])); /** @var \Bitrix\Sale\Delivery\Services\Base $deliveryObj */ $deliveryObj = \Bitrix\Sale\Delivery\Services\Manager::getObjectById($arParams["DELIVERY_ID"]); if (!$deliveryObj) { ShowError(GetMessage("SALE_DELIVERY_HANDLER_NOT_INSTALL")); return; } $calcResult = $deliveryObj->calculate($shipment); $result = array("VALUE" => $calcResult->getPrice(), "TRANSIT" => $calcResult->getPeriodDescription(), "RESULT" => $calcResult->isSuccess() ? "OK" : "ERROR"); if (!empty($arParams["ORDER_DATA"]) && is_array($arParams["ORDER_DATA"])) { $orderDeliveryPriceData = $arParams["ORDER_DATA"]; $orderDeliveryPriceData['BASKET_ITEMS'] = !empty($arParams['ITEMS']) && is_array($arParams['ITEMS']) ? $arParams['ITEMS'] : array(); $orderDeliveryPriceData['PRICE_DELIVERY'] = $orderDeliveryPriceData['DELIVERY_PRICE'] = $calcResult->getPrice(); $orderDeliveryPriceData['DELIVERY_ID'] = $arParams["DELIVERY_ID"]; CSaleDiscount::DoProcessOrder($orderDeliveryPriceData, array(), $arErrors); if (floatval($orderDeliveryPriceData['DELIVERY_PRICE']) >= 0 && $orderDeliveryPriceData['PRICE_DELIVERY'] != $calcResult->getPrice()) { $result['DELIVERY_DISCOUNT_PRICE'] = $orderDeliveryPriceData['DELIVERY_PRICE']; $result["DELIVERY_DISCOUNT_PRICE_FORMATED"] = SaleFormatCurrency($orderDeliveryPriceData['DELIVERY_PRICE'], $arParams["CURRENCY"]); } } $result["TEXT"] = $calcResult->isSuccess() ? $calcResult->getDescription() : implode("<br>\n", $calcResult->getErrorMessages()); if ($calcResult->isNextStep()) { $result["RESULT"] = "NEXT_STEP"; } if ($calcResult->isSuccess() && strlen($calcResult->getDescription()) > 0) { $result["RESULT"] = "NOTE"; } if (intval($calcResult->getPacksCount()) > 0) { $result["PACKS_COUNT"] = $calcResult->getPacksCount(); }
public static function ConvertDiscount($intStep = 100, $intMaxExecutionTime = 15) { global $DBType; global $DB; global $APPLICATION; self::InitStep(); $intStep = intval($intStep); if (0 >= $intStep) { $intStep = 100; } $startConvertTime = getmicrotime(); $obDiscount = new CSaleDiscount(); $strTableName = ''; switch (ToUpper($DBType)) { case 'MYSQL': $strTableName = 'b_catalog_discount'; break; case 'MSSQL': $strTableName = 'B_CATALOG_DISCOUNT'; break; case 'ORACLE': $strTableName = 'B_CATALOG_DISCOUNT'; break; } $intCount = CSaleDiscountConvert::GetCount(); if (0 == $intCount) { } $strStatus = 1 < $intCount ? 'N' : 'Y'; $arBaseCurrencies = array(); $rsSites = CSite::GetList($b = "id", $o = "asc"); while ($arSite = $rsSites->Fetch()) { $arBaseCurrencies[$arSite['ID']] = CSaleLang::GetLangCurrency($arSite['ID']); } CTimeZone::Disable(); $rsDiscounts = CSaleDiscount::GetList(array('ID' => 'ASC'), array('VERSION' => CSaleDiscount::VERSION_OLD), false, array('nTopCount' => $intStep), array('ID', 'SITE_ID', 'MODIFIED_BY', 'TIMESTAMP_X', 'PRICE_FROM', 'PRICE_TO', 'CURRENCY', 'DISCOUNT_VALUE', 'DISCOUNT_TYPE')); while ($arDiscount = $rsDiscounts->Fetch()) { $arFields = array(); $arFields['MODIFIED_BY'] = $arDiscount['MODIFIED_BY']; $arConditions = array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()); $arActions = array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()); $boolCurrency = $arDiscount['CURRENCY'] == $arBaseCurrencies[$arDiscount['SITE_ID']]; $strFrom = ''; $strTo = ''; $strValue = ''; $arDiscount['PRICE_FROM'] = doubleval($arDiscount['PRICE_FROM']); $arDiscount['PRICE_TO'] = doubleval($arDiscount['PRICE_TO']); $arDiscount['DISCOUNT_VALUE'] = doubleval($arDiscount['DISCOUNT_VALUE']); if (0 < $arDiscount['PRICE_FROM']) { $dblValue = roundEx($boolCurrency ? $arDiscount['PRICE_FROM'] : CCurrencyRates::ConvertCurrency($arDiscount['PRICE_FROM'], $arDiscount['CURRENCY'], $arBaseCurrencies[$arDiscount['SITE_ID']]), SALE_VALUE_PRECISION); $arConditions['CHILDREN'][] = array('CLASS_ID' => 'CondBsktAmtGroup', 'DATA' => array('logic' => 'EqGr', 'Value' => (string) $dblValue, 'All' => 'AND'), 'CHILDREN' => array()); if (!$boolCurrency) { $arFields['PRICE_FROM'] = $dblValue; } $strFrom = str_replace('#VALUE#', $dblValue . ' ' . $arBaseCurrencies[$arDiscount['SITE_ID']], GetMessage('BT_MOD_SALE_DSC_FORMAT_NAME_FROM')); } if (0 < $arDiscount['PRICE_TO']) { $dblValue = roundEx($boolCurrency ? $arDiscount['PRICE_TO'] : CCurrencyRates::ConvertCurrency($arDiscount['PRICE_TO'], $arDiscount['CURRENCY'], $arBaseCurrencies[$arDiscount['SITE_ID']]), SALE_VALUE_PRECISION); $arConditions['CHILDREN'][] = array('CLASS_ID' => 'CondBsktAmtGroup', 'DATA' => array('logic' => 'EqLs', 'Value' => (string) $dblValue, 'All' => 'AND'), 'CHILDREN' => array()); if (!$boolCurrency) { $arFields['PRICE_TO'] = $dblValue; } $strTo = str_replace('#VALUE#', $dblValue . ' ' . $arBaseCurrencies[$arDiscount['SITE_ID']], GetMessage('BT_MOD_SALE_DSC_FORMAT_NAME_TO')); } if (CSaleDiscount::OLD_DSC_TYPE_PERCENT == $arDiscount['DISCOUNT_TYPE']) { $arActions['CHILDREN'][] = array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => (string) roundEx($arDiscount['DISCOUNT_VALUE'], SALE_VALUE_PRECISION), 'Unit' => 'Perc', 'All' => 'AND'), 'CHILDREN' => array()); $strValue = $arDiscount['DISCOUNT_VALUE'] . ' %'; } else { $dblValue = roundEx($boolCurrency ? $arDiscount['DISCOUNT_VALUE'] : CCurrencyRates::ConvertCurrency($arDiscount['DISCOUNT_VALUE'], $arDiscount['CURRENCY'], $arBaseCurrencies[$arDiscount['SITE_ID']]), SALE_VALUE_PRECISION); $arActions['CHILDREN'][] = array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => (string) $dblValue, 'Unit' => 'CurAll', 'All' => 'AND'), 'CHILDREN' => array()); if (!$boolCurrency) { $arFields['DISCOUNT_VALUE'] = $dblValue; } $strValue = $dblValue . ' ' . $arBaseCurrencies[$arDiscount['SITE_ID']]; } if ('' != $strFrom || '' != $strTo) { $strName = str_replace(array('#VALUE#', '#FROM#', '#TO#'), array($strValue, $strFrom, $strTo), GetMessage('BT_MOD_SALE_DSC_FORMAT_NAME')); } else { $strName = str_replace('#VALUE#', $strValue, GetMessage('BT_MOD_SALE_DSC_FORMAT_SHORT_NAME')); } $arFields['CONDITIONS'] = $arConditions; $arFields['ACTIONS'] = $arActions; $arFields['NAME'] = $strName; if (!$boolCurrency) { $arFields['CURRENCY'] = $arBaseCurrencies[$arDiscount['SITE_ID']]; } if ('N' == $strStatus) { $arFields['ACTIVE'] = 'N'; } $mxRes = $obDiscount->Update($arDiscount['ID'], $arFields); if (!$mxRes) { self::$intErrors++; $strError = ''; if ($ex = $APPLICATION->GetException()) { $strError = $ex->GetString(); } if (empty($strError)) { $strError = GetMessage(''); } self::$arErrors[] = array('ID' => $arDiscount['ID'], 'NAME' => $strName, 'ERROR' => $strError); } else { $arTimeFields = array('~TIMESTAMP_X' => $DB->CharToDateFunction($arDiscount['TIMESTAMP_X'], "FULL")); $strUpdate = $DB->PrepareUpdate($strTableName, $arTimeFields); if (!empty($strUpdate)) { $strQuery = "UPDATE " . $strTableName . " SET " . $strUpdate . " WHERE ID = " . $arDiscount['ID']; $DB->Query($strQuery, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); } self::$intConverted++; self::$intConvertPerStep++; } if ($intMaxExecutionTime > 0 && getmicrotime() - $startConvertTime > $intMaxExecutionTime) { break; } } CTimeZone::Enable(); if ($intMaxExecutionTime > 2 * (getmicrotime() - $startConvertTime)) { self::$intNextConvertPerStep = $intStep * 2; } else { self::$intNextConvertPerStep = $intStep; } self::SaveStep(); }
protected function __ConvertOldFormat($strAction, &$arFields) { global $APPLICATION; $arMsg = array(); $boolResult = true; $arNeedFields = array('LID', 'CURRENCY', 'DISCOUNT_TYPE', 'DISCOUNT_VALUE', 'PRICE_FROM', 'PRICE_TO'); $arUpdateFields = array('DISCOUNT_VALUE', 'PRICE_FROM', 'PRICE_TO'); $strAction = ToUpper($strAction); if (!array_key_exists('CONDITIONS', $arFields) && !array_key_exists('ACTIONS', $arFields)) { $strSiteCurrency = ''; $boolUpdate = false; if ('UPDATE' == $strAction) { $boolNeedQuery = false; foreach ($arUpdateFields as &$strFieldID) { if (array_key_exists($strFieldID, $arFields)) { $boolUpdate = true; break; } } if (isset($strFieldID)) { unset($strFieldID); } if ($boolUpdate) { foreach ($arNeedFields as &$strFieldID) { if (!array_key_exists($strFieldID, $arFields)) { $boolNeedQuery = true; break; } } if (isset($strFieldID)) { unset($strFieldID); } if ($boolNeedQuery) { $rsDiscounts = CSaleDiscount::GetList(array(), array('ID' => $arFields['ID']), false, false, $arNeedFields); if ($arDiscount = $rsDiscounts->Fetch()) { foreach ($arNeedFields as &$strFieldID) { if (!array_key_exists($strFieldID, $arFields)) { $arFields[$strFieldID] = $arDiscount[$strFieldID]; } } if (isset($strFieldID)) { unset($strFieldID); } } else { $boolUpdate = false; $boolResult = false; $arMsg[] = array('id' => 'ID', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_ABSENT')); } } } } if ('ADD' == $strAction || $boolUpdate) { if (!array_key_exists('LID', $arFields)) { $boolResult = false; $arMsg[] = array('id' => 'LID', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_SITE_ID_ABSENT')); } else { $arFields['LID'] = strval($arFields['LID']); if ('' == $arFields['LID']) { $boolResult = false; $arMsg[] = array('id' => 'LID', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_SITE_ID_ABSENT')); } else { $rsSites = CSite::GetByID($arFields["LID"]); if (!($arSite = $rsSites->Fetch())) { $boolResult = false; $arMsg[] = array('id' => 'LID', 'text' => Loc::getMessage('SKGD_NO_SITE', array('#ID#' => $arFields['LID']))); } else { $strSiteCurrency = CSaleLang::GetLangCurrency($arFields['LID']); } } } if (!array_key_exists('CURRENCY', $arFields)) { $boolResult = false; $arMsg[] = array('id' => 'CURRENCY', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_CURRENCY_ABSENT')); } else { $arFields['CURRENCY'] = strval($arFields['CURRENCY']); if ('' == $arFields['CURRENCY']) { $boolResult = false; $arMsg[] = array('id' => 'CURRENCY', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_CURRENCY_ABSENT')); } else { if (!($arCurrency = CCurrency::GetByID($arFields["CURRENCY"]))) { $boolResult = false; $arMsg[] = array('id' => 'CURRENCY', 'text' => Loc::getMessage('SKGD_NO_CURRENCY', array('#ID#' => $arFields['CURRENCY']))); } } } if (!array_key_exists("DISCOUNT_TYPE", $arFields)) { $boolResult = false; $arMsg[] = array('id' => 'DISCOUNT_TYPE', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_TYPE_ABSENT')); } else { $arFields["DISCOUNT_TYPE"] = strval($arFields["DISCOUNT_TYPE"]); if (CSaleDiscount::OLD_DSC_TYPE_PERCENT != $arFields["DISCOUNT_TYPE"] && CSaleDiscount::OLD_DSC_TYPE_FIX != $arFields["DISCOUNT_TYPE"]) { $boolResult = false; $arMsg[] = array('id' => 'DISCOUNT_TYPE', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_TYPE_BAD')); } } if (!array_key_exists('DISCOUNT_VALUE', $arFields)) { $boolResult = false; $arMsg[] = array('id' => 'DISCOUNT_VALUE', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_VALUE_ABSENT')); } else { $arFields['DISCOUNT_VALUE'] = (double) str_replace(',', '.', $arFields['DISCOUNT_VALUE']); if (0 >= $arFields['DISCOUNT_VALUE']) { $boolResult = false; $arMsg[] = array('id' => 'DISCOUNT_VALUE', 'text' => Loc::getMessage('BT_MOD_SALE_ERR_DSC_VALUE_BAD')); } } if ($boolResult) { $arConditions = array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()); $arActions = array('CLASS_ID' => 'CondGroup', 'DATA' => array('All' => 'AND', 'True' => 'True'), 'CHILDREN' => array()); $boolCurrency = $arFields['CURRENCY'] == $strSiteCurrency; if (array_key_exists('PRICE_FROM', $arFields)) { $arFields["PRICE_FROM"] = str_replace(",", ".", strval($arFields["PRICE_FROM"])); $arFields["PRICE_FROM"] = doubleval($arFields["PRICE_FROM"]); if (0 < $arFields["PRICE_FROM"]) { $dblValue = roundEx($boolCurrency ? $arFields['PRICE_FROM'] : CCurrencyRates::ConvertCurrency($arFields['PRICE_FROM'], $arFields['CURRENCY'], $strSiteCurrency), SALE_VALUE_PRECISION); $arConditions['CHILDREN'][] = array('CLASS_ID' => 'CondBsktAmtGroup', 'DATA' => array('logic' => 'EqGr', 'Value' => (string) $dblValue, 'All' => 'AND'), 'CHILDREN' => array()); $arFields["PRICE_FROM"] = $dblValue; } } if (array_key_exists('PRICE_TO', $arFields)) { $arFields["PRICE_TO"] = str_replace(",", ".", strval($arFields["PRICE_TO"])); $arFields["PRICE_TO"] = doubleval($arFields["PRICE_TO"]); if (0 < $arFields["PRICE_TO"]) { $dblValue = roundEx($boolCurrency ? $arFields['PRICE_TO'] : CCurrencyRates::ConvertCurrency($arFields['PRICE_TO'], $arFields['CURRENCY'], $strSiteCurrency), SALE_VALUE_PRECISION); $arConditions['CHILDREN'][] = array('CLASS_ID' => 'CondBsktAmtGroup', 'DATA' => array('logic' => 'EqLs', 'Value' => (string) $dblValue, 'All' => 'AND'), 'CHILDREN' => array()); $arFields["PRICE_TO"] = $dblValue; } } if (self::OLD_DSC_TYPE_PERCENT == $arFields['DISCOUNT_TYPE']) { $arActions['CHILDREN'][] = array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => (string) roundEx($arFields['DISCOUNT_VALUE'], SALE_VALUE_PRECISION), 'Unit' => 'Perc', 'All' => 'AND'), 'CHILDREN' => array()); } else { $dblValue = roundEx($boolCurrency ? $arFields['DISCOUNT_VALUE'] : CCurrencyRates::ConvertCurrency($arFields['DISCOUNT_VALUE'], $arFields['CURRENCY'], $strSiteCurrency), SALE_VALUE_PRECISION); $arActions['CHILDREN'][] = array('CLASS_ID' => 'ActSaleBsktGrp', 'DATA' => array('Type' => 'Discount', 'Value' => (string) $dblValue, 'Unit' => 'CurAll', 'All' => 'AND'), 'CHILDREN' => array()); $arFields['DISCOUNT_VALUE'] = $dblValue; } $arFields['CONDITIONS'] = $arConditions; $arFields['ACTIONS'] = $arActions; $arFields['CURRENCY'] = $strSiteCurrency; } else { $obError = new CAdminException($arMsg); $APPLICATION->ThrowException($obError); } } } return $boolResult; }
break; case "activate": case "deactivate": $arFields = array("ACTIVE" => $_REQUEST['action'] == "activate" ? "Y" : "N"); if (!CSaleDiscount::Update($ID, $arFields)) { if ($ex = $APPLICATION->GetException()) { $lAdmin->AddGroupError($ex->GetString(), $ID); } else { $lAdmin->AddGroupError(GetMessage("ERROR_UPDATE_REC"), $ID); } } break; } } } $dbResultList = CSaleDiscount::GetList($by, $order, $arFilter); $dbResultList = new CAdminResult($dbResultList, $sTableID); $dbResultList->NavStart(); $lAdmin->NavText($dbResultList->GetNavPrint(GetMessage("PERS_TYPE_NAV"))); $lAdmin->AddHeaders(array(array("id" => "ID", "content" => GetMessage("PERS_TYPE_ID"), "sort" => "ID", "default" => true), array("id" => "LID", "content" => GetMessage("PERS_TYPE_LID"), "sort" => "LID", "default" => true), array("id" => "ACTIVE", "content" => GetMessage('PERS_TYPE_ACTIVE'), "sort" => "ACTIVE", "default" => true), array("id" => "PRICE", "content" => GetMessage("PERS_TYPE_PRICE"), "sort" => "", "default" => true), array("id" => "DISCOUNT", "content" => GetMessage("PERS_TYPE_DISCOUNT"), "sort" => "", "default" => true), array("id" => "SORT", "content" => GetMessage("PERS_TYPE_SORT"), "sort" => "SORT", "default" => true), array("id" => "ACTIVE_FROM", "content" => GetMessage("SDSN_ACTIVE_FROM"), "sort" => "ACTIVE_FROM", "default" => true), array("id" => "ACTIVE_TO", "content" => GetMessage("SDSN_ACTIVE_TO"), "sort" => "ACTIVE_TO", "default" => true))); $arVisibleColumns = $lAdmin->GetVisibleHeaderColumns(); $arLangs = array(); $dbLangsList = CLang::GetList($b = "sort", $o = "asc"); while ($arLang = $dbLangsList->Fetch()) { $arLangs[$arLang["LID"]] = $arLang["LID"]; } while ($arDiscount = $dbResultList->NavNext(true, "f_")) { $row =& $lAdmin->AddRow($f_ID, $arDiscount, "sale_discount_edit.php?ID=" . $f_ID . "&lang=" . LANG . GetFilterParams("filter_"), GetMessage("SDSN_UPDATE_ALT")); $row->AddField("ID", $f_ID); $row->AddSelectField("LID", $arLangs, array()); $row->AddCheckField("ACTIVE");