public static function checkQuantity($arProducts) { $result = true; $sumQuantityOnStores = array(); foreach ($arProducts as $id => $arProduct) { if (CSaleBasketHelper::isSetParent($arProduct)) { continue; } if (!empty($arProduct["STORES"]) && is_array($arProduct["STORES"])) { $sumQuantityOnStores[$id] = 0; foreach ($arProduct["STORES"] as $arStore) { $sumQuantityOnStores[$id] += $arStore["QUANTITY"]; } if ($sumQuantityOnStores[$id] != $arProduct["QUANTITY"]) { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("NEWO_ERR_STORE_QUANTITY_NOT_EQUAL_TOTAL_QUANTITY", array("#PRODUCT_NAME#" => $arProduct["NAME"])) . "<br>"); $result = false; break; } } else { $GLOBALS["APPLICATION"]->ThrowException(GetMessage("NEWO_ERR_STORE_WRONG_INFO", array("#PRODUCT_NAME#" => $arProduct["NAME"])) . "<br>"); $result = false; break; } } return $result; }
$arBasketItems = array(); $arSetParentWeight = array(); $fuserId = (int) CSaleBasket::GetBasketUserID(true); if ($fuserId > 0) { $rsBaskets = CSaleBasket::GetList(array("ID" => "ASC"), array("FUSER_ID" => $fuserId, "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 = $rsBaskets->GetNext()) { $arBasketItems[] = $arItem; if (CSaleBasketHelper::isSetItem($arItem)) { $arSetParentWeight[$arItem["SET_PARENT_ID"]] += $arItem["WEIGHT"] * $arItem['QUANTITY']; } } } if (!empty($arBasketItems)) { // count weight for set parent products foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetParent($arItem)) { $arItem["WEIGHT"] = $arSetParentWeight[$arItem["ID"]] / $arItem["QUANTITY"]; } } unset($arItem); foreach ($arBasketItems as &$arItem) { if (CSaleBasketHelper::isSetItem($arItem)) { continue; } $boolOneReady = false; if ($arItem["DELAY"] == "N" && $arItem["CAN_BUY"] == "Y") { $boolOneReady = true; $bReady = true; $allSum += $arItem["PRICE"] * $arItem["QUANTITY"]; $allWeight += $arItem["WEIGHT"] * $arItem["QUANTITY"]; } elseif ($arItem["DELAY"] == "Y" && $arItem["CAN_BUY"] == "Y") {
} } ?> </div> </td> <!-- barcode data (form popup button if BARCODE_MULTI = Y or input field) --> <td class="store_barcode" id="store_barcode_block_<?php echo $val["ID"]; ?> " <?php echo $useStores && ($str_DEDUCTED == "Y" || $hasSavedBarcodes) ? "" : 'style="display:none;"'; ?> > <div style="display:<?php echo !CSaleBasketHelper::isSetParent($val) ? '' : 'none'; ?> ;"> <? if ($hasValidStores) { if ($arBasketItem[$val["ID"]]["HAS_SAVED_QUANTITY"] == "Y") { $ind = 0; foreach ($arBasketItem[$val["ID"]]["STORES"] as $storeId => $arStore) { if (isset($arStore["QUANTITY"]) && $val["BARCODE_MULTI"] == "Y") { ?> <div id="store_barcode_wrapper_<?php echo $val["ID"];
/** * @param Sale\Basket $basket * @param array $requestBasketItems * * @return Sale\Result * @throws Main\ArgumentNullException * @throws Main\ArgumentTypeException * @throws Main\ObjectException * @throws Main\ObjectNotFoundException */ protected function parseBasketItems(Sale\Basket $basket, array $requestBasketItems) { $result = new Sale\Result(); $basketCodeList = array(); $basketItemList = array(); $basketParentList = array(); $basketChildList = array(); $basketChanged = false; $publicMode = DiscountCompatibility::usedByClient(); foreach ($requestBasketItems as $basketIndex => $basketItemData) { if (isset($basketItemData['SET_PARENT_ID']) && strval($basketItemData['SET_PARENT_ID']) != '') { $parentId = intval($basketItemData['SET_PARENT_ID']); if ($basketItemData['TYPE'] != Sale\Basket::TYPE_SET && !array_key_exists($parentId, $basketParentList)) { $basketChildList[intval($basketItemData['SET_PARENT_ID'])] = $basketItemData['SET_PARENT_ID']; } } } $orderCompatibility = $this->getOrderCompatibility(); /** @var Sale\Order $order */ $order = $orderCompatibility->getOrder(); $basketItemsIndexList = array(); foreach ($basket as $basketItem) { $basketItemsIndexList[$basketItem->getId()] = true; } foreach ($requestBasketItems as $basketIndex => $basketItemData) { $basketItem = null; if (isset($basketItemData['ID']) && intval($basketItemData['ID']) > 0) { /** @var Sale\BasketItem $basketItem */ if ($basketItem = $basket->getItemById($basketItemData['ID'])) { if (isset($basketItemsIndexList[$basketItem->getId()])) { unset($basketItemsIndexList[$basketItem->getId()]); } } } if (!$basketItem) { /** @var Sale\BasketItem $basketItem */ $basketItem = Sale\BasketItem::create($basket, $basketItemData['MODULE'], $basketItemData['PRODUCT_ID']); $basketChanged = true; } $itemDuplicate = isset($basketItemData['DUPLICATE']) && $basketItemData['DUPLICATE'] == "Y"; $basketFields = static::clearFields($basketItemData); // $basketFields['BASKET_CODE'] = $basketItem->getBasketCode(); if ($order->getId() > 0) { /** @var Sale\ShipmentCollection $shipmentCollection */ if ($shipmentCollection = $order->getShipmentCollection()) { if (count($shipmentCollection) == 2 && (isset($basketItemData['QUANTITY']) && floatval($basketItemData['QUANTITY']) <= $basketItem->getQuantity())) { /** @var Sale\Shipment $shipment */ foreach ($shipmentCollection as $shipment) { if ($shipment->isSystem()) { continue; } $basketQuantity = $shipment->getBasketItemQuantity($basketItem); if ($basketQuantity <= floatval($basketItemData['QUANTITY'])) { continue; } /** @var Sale\ShipmentItemCollection $shipmentItemCollection */ if ($shipmentItemCollection = $shipment->getShipmentItemCollection()) { /** @var Sale\ShipmentItem $shipmentItem */ if (!($shipmentItem = $shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode()))) { continue; } $shipmentItem->setQuantity(floatval($basketItemData['QUANTITY'])); } } } } } $isBasketItemCanBeAdded = true; if ($publicMode) { if (\CSaleBasketHelper::isSetParent($basketItemData)) { $parentId = (int) $basketItemData['ID']; $parentCode = $basketItemData['ID']; } else { $parentId = (int) $basketItemData['SET_PARENT_ID']; $parentCode = $basketItemData['SET_PARENT_ID']; } } else { $parentId = (int) $basketItemData['SET_PARENT_ID']; $parentCode = $basketItemData['SET_PARENT_ID']; } if ($parentId > 0) { if ($basketItem->isBundleParent()) { $basketParentList[$parentCode] = $basketItem->getBasketCode(); } else { $isBasketItemCanBeAdded = false; $basketItemList[$parentCode][$basketIndex] = $basketItem; } } if ($isBasketItemCanBeAdded) { $propList = array(); /** @var Sale\BasketPropertiesCollection $propertyCollection */ if ($propertyCollection = $basketItem->getPropertyCollection()) { $propList = $propertyCollection->getPropertyValues(); } /** @var null|Sale\BasketItem $foundedBasketItem */ $foundedBasketItem = null; if ($basketItem->getId() > 0 && ($foundedBasketItem = $basket->getItemById($basketItem->getId()))) { $basketCodeList[$publicMode ? $foundedBasketItem->getId() : $basketIndex] = $foundedBasketItem->getBasketCode(); } else { if (!$itemDuplicate && ($foundedBasketItem = $basket->getExistsItem($basketItem->getField('MODULE'), $basketItem->getProductId(), $propList))) { $basketCodeList[$publicMode ? $foundedBasketItem->getId() : $basketIndex] = $foundedBasketItem->getBasketCode(); } } if ($foundedBasketItem === null) { $basket->addItem($basketItem); $basketCodeList[$publicMode ? $basketItem->getId() : $basketIndex] = $basketItem->getBasketCode(); $basketChanged = true; } } /** @var Sale\Result $r */ $r = $basketItem->setFields($basketFields); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if (!empty($basketChildList)) { foreach ($basketItemList as $parentBasketCode => $childBasketItemList) { $parentCode = null; if (!empty($basketParentList[$parentBasketCode])) { $parentCode = $basketParentList[$parentBasketCode]; } if (strval($parentCode) == '') { continue; } /** @var Sale\BasketItem $parentBasketItem */ if (!($parentBasketItem = $basket->getItemByBasketCode($parentCode))) { throw new Main\ObjectNotFoundException('Entity parent "BasketItem" not found'); } if (!empty($childBasketItemList) && is_array($childBasketItemList)) { /** @var Sale\BasketItem $childBasketItem */ foreach ($childBasketItemList as $indexChildBasketItem => $childBasketItem) { $basketCodeIndex = $publicMode ? $childBasketItem->getId() : $indexChildBasketItem; $childBasketCode = $childBasketItem->getBasketCode(); $propList = array(); /** @var Sale\BasketPropertiesCollection $propertyCollection */ if ($propertyCollection = $childBasketItem->getPropertyCollection()) { $propList = $propertyCollection->getPropertyValues(); } /** @var Sale\BasketItem $foundedBasketItem */ if ($foundedBasketItem = Sale\Basket::getExistsItemInBundle($parentBasketItem, $childBasketItem->getField('MODULE'), $childBasketItem->getProductId(), $propList)) { $childBasketCode = $foundedBasketItem->getBasketCode(); unset($childBasketItemList[$indexChildBasketItem]); $basketCodeIndex = $publicMode ? $foundedBasketItem->getId() : $indexChildBasketItem; } if (strval($childBasketCode) != '') { $basketCodeList[$basketCodeIndex] = $childBasketCode; } } if (!empty($childBasketItemList)) { $basket->setChildBundleCollection($childBasketItemList, $parentBasketItem); } } } } if (!empty($basketItemsIndexList) && is_array($basketItemsIndexList)) { foreach ($basketItemsIndexList as $basketIndexId => $basketIndexValue) { if ($foundedBasketItem = $basket->getItemById($basketIndexId)) { $foundedBasketItem->delete(); $basketChanged = true; } } } $result->setData(array('BASKET' => $basket, 'BASKET_CODE_LIST' => $basketCodeList, 'BASKET_CHANGED' => $basketChanged)); return $result; }
/** * @param $siteId * @param null $userId * @param $shoppingCart * @param array $options * * @return array */ static function makeOrderArray($siteId, $userId = null, array $shoppingCart, array $options = array()) { // calculate weight for set parent $parentWeight = array(); foreach ($shoppingCart as $item) { if (CSaleBasketHelper::isSetItem($item)) { $parentWeight[$item["SET_PARENT_ID"]]["WEIGHT"] += $item["WEIGHT"] * $item["QUANTITY"]; } } foreach ($shoppingCart as &$item) { if (CSaleBasketHelper::isSetParent($item) && isset($parentWeight[$item["SET_PARENT_ID"]])) { $item["WEIGHT"] = $parentWeight[$item["SET_PARENT_ID"]]["WEIGHT"]; } } unset($item); $currency = isset($options['CURRENCY']) && is_string($options['CURRENCY']) ? $options['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" => $shoppingCart, "SITE_ID" => $siteId, "LID" => $siteId, "USER_ID" => $userId, "USE_VAT" => false, "VAT_RATE" => 0, "VAT_SUM" => 0, "DELIVERY_ID" => false); if (isset($options["DELIVERY_EXTRA_SERVICES"])) { $arOrder["DELIVERY_EXTRA_SERVICES"] = $options["DELIVERY_EXTRA_SERVICES"]; } $orderPrices = CSaleOrder::CalculateOrderPrices($shoppingCart); $arOrder['ORDER_PRICE'] = $orderPrices['ORDER_PRICE']; $arOrder['ORDER_WEIGHT'] = $orderPrices['ORDER_WEIGHT']; $arOrder['VAT_RATE'] = $orderPrices['VAT_RATE']; $arOrder['VAT_SUM'] = $orderPrices['VAT_SUM']; $arOrder["USE_VAT"] = $orderPrices['USE_VAT'] == "Y"; return $arOrder; }
/** * resorting of elements in the parent * @param $basketItems * @param bool $setIndexAsId * @return array */ public static function reSortItems($basketItems, $setIndexAsId = false) { $basketItemsTmp = $basketItems; $parentItems = array(); $parentItemFound = false; foreach ($basketItemsTmp as $basketItemKey => $basketItem) { if (CSaleBasketHelper::isSetParent($basketItem) || CSaleBasketHelper::isSetItem($basketItem)) { $parentItemFound = true; if (!array_key_exists($basketItem['SET_PARENT_ID'], $parentItems)) { $parentItems[$basketItem['SET_PARENT_ID']] = array(); } if (CSaleBasketHelper::isSetItem($basketItem)) { $parentItems[$basketItem['SET_PARENT_ID']][] = $basketItem; unset($basketItemsTmp[$basketItemKey]); } } } if ($parentItemFound === true && !empty($basketItemsTmp) && is_array($basketItemsTmp) && !empty($parentItems) && is_array($parentItems)) { $basketItems = array(); foreach ($basketItemsTmp as $basketItem) { if ($setIndexAsId === true) { $basketItems[$basketItem['ID']] = $basketItem; } else { $basketItems[] = $basketItem; } if (array_key_exists($basketItem['ID'], $parentItems)) { foreach ($parentItems[$basketItem['ID']] as $childItem) { if ($setIndexAsId === true) { $basketItems[$childItem['ID']] = $childItem; } else { $basketItems[] = $childItem; } } } } } return $basketItems; }
/** * Method is called to deduct all products of the order or undo deduction * * @param int $orderID * @param bool $bUndoDeduction * @param int $recurringID * @param bool $bAutoDeduction * @param array $arStoreBarcodeOrderFormData * @return mixed array */ function OrderDeduction($orderID, $bUndoDeduction = false, $recurringID = 0, $bAutoDeduction = true, $arStoreBarcodeOrderFormData = array()) { global $APPLICATION; static $storesCount = NULL; static $bAutoDeductionAllowed = NULL; $bRealDeductionAllowed = true; $defaultDeductionStore = 0; $arSavedStoreBarcodeData = array(); $arItems = array(); $arResult = array(); if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("OrderDeduction: started", array("orderID" => $orderID, "bUndoDeduction" => intval($bUndoDeduction), "bAutoDeduction" => intval($bAutoDeduction), "arStoreBarcodeOrderFormData" => $arStoreBarcodeOrderFormData), "OD1"); } //TODO - recurringID - ? $orderID = IntVal($orderID); if ($orderID <= 0) { $arResult["RESULT"] = false; return $arResult; } $dbBasketList = CSaleBasket::GetList(array(), array("ORDER_ID" => $orderID), false, false, array('ID', 'LID', 'PRODUCT_ID', 'PRODUCT_PROVIDER_CLASS', 'MODULE', 'BARCODE_MULTI', 'QUANTITY', 'RESERVED', 'TYPE', 'SET_PARENT_ID')); //check basket items and emulate deduction while ($arBasket = $dbBasketList->Fetch()) { if (CSaleBasketHelper::isSetParent($arBasket)) { continue; } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Deducting product #" . $arBasket["PRODUCT_ID"], array(), "OD2"); } /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arBasket)) { if (is_null($storesCount)) { $storesCount = intval($productProvider::GetStoresCount(array("SITE_ID" => $arBasket["LID"]))); } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("stores count: " . $storesCount, array(), "OD3"); } if (is_null($bAutoDeductionAllowed)) { $defaultDeductionStore = COption::GetOptionString("sale", "deduct_store_id", "", $arBasket["LID"]); if ($storesCount == 1 || $storesCount == -1 || intval($defaultDeductionStore) > 0) { // if stores' count = 1 or stores aren't used or default deduction store is defined $bAutoDeductionAllowed = true; } else { $bAutoDeductionAllowed = false; } } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("auto deduction allowed: " . intval($bAutoDeductionAllowed), array(), "OD4"); } if ($bAutoDeduction && !$bAutoDeductionAllowed && !$bUndoDeduction) { if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DDCT_AUTO_DEDUCT_WRONG_STORES_QUANTITY", array(), "OD5"); } $APPLICATION->ThrowException(Loc::getMessage("DDCT_AUTO_DEDUCT_WRONG_STORES_QUANTITY"), "DDCT_WRONG_STORES_QUANTITY"); $bRealDeductionAllowed = false; } else { if ($bAutoDeduction && $arBasket["BARCODE_MULTI"] == "Y" && !$bUndoDeduction) { if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("DDCT_AUTO_DEDUCT_BARCODE_MULTI", array(), "OD6"); } $APPLICATION->ThrowException(Loc::getMessage("DDCT_AUTO_DEDUCT_BARCODE_MULTI", array("#PRODUCT_ID#" => $arBasket["PRODUCT_ID"])), "DDCT_CANT_DEDUCT_BARCODE_MULTI"); $bRealDeductionAllowed = false; } else { //get saved store & barcode data if stores are used to know where to return products if ($bUndoDeduction && $storesCount > 0) { $dbStoreBarcode = CSaleStoreBarcode::GetList(array(), array("BASKET_ID" => $arBasket["ID"]), false, false, array("ID", "BASKET_ID", "BARCODE", "QUANTITY", "STORE_ID")); while ($arStoreBarcode = $dbStoreBarcode->Fetch()) { $arSavedStoreBarcodeData[$arBasket["ID"]][] = $arStoreBarcode; } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("OrderDeduction: CSaleStoreBarcode data (stores) to return products to", array("arSavedStoreBarcodeData" => $arSavedStoreBarcodeData), "OD7"); } } $arFields = array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "EMULATE" => "Y", "PRODUCT_RESERVED" => $arBasket["RESERVED"], "UNDO_DEDUCTION" => $bUndoDeduction ? "Y" : "N"); if ($bUndoDeduction) { if ($storesCount > 0) { $arFields["QUANTITY"] = 0; //won't be used during deduction $arFields["STORE_DATA"] = $arSavedStoreBarcodeData[$arBasket["ID"]]; } else { $arFields["QUANTITY"] = $arBasket["QUANTITY"]; $arFields["STORE_DATA"] = array(); } } else { if ($storesCount == 1) { $arFields["QUANTITY"] = 0; if ($bAutoDeduction) { if ($arProductStore = $productProvider::GetProductStores(array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "SITE_ID" => $arBasket["LID"], 'BASKET_ID' => $arBasket['ID']))) { $arFields["STORE_DATA"] = array("0" => array("STORE_ID" => $arProductStore[0]["STORE_ID"], "QUANTITY" => $arBasket["QUANTITY"], "AMOUNT" => $arProductStore[0]["AMOUNT"])); } else { $arFields["STORE_DATA"] = array(); } } else { $arFields["STORE_DATA"] = $arStoreBarcodeOrderFormData[$arBasket["ID"]]; } } else { if (intval($defaultDeductionStore) > 0) { $arFields["QUANTITY"] = 0; if ($bAutoDeduction) { if ($arProductStore = $productProvider::GetProductStores(array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "SITE_ID" => $arBasket["LID"], 'BASKET_ID' => $arBasket['ID']))) { foreach ($arProductStore as $storeData) { if ($storeData["STORE_ID"] == intval($defaultDeductionStore)) { $arFields["STORE_DATA"] = array("0" => array("STORE_ID" => $storeData["STORE_ID"], "QUANTITY" => $arBasket["QUANTITY"], "AMOUNT" => $storeData["AMOUNT"])); break; } } } else { $arFields["STORE_DATA"] = array(); } } else { $arFields["STORE_DATA"] = $arStoreBarcodeOrderFormData[$arBasket["ID"]]; } } else { if ($storesCount > 1) { $arFields["QUANTITY"] = 0; //won't be used during deduction $arFields["STORE_DATA"] = $arStoreBarcodeOrderFormData[$arBasket["ID"]]; } else { $arFields["QUANTITY"] = $arBasket["QUANTITY"]; $arFields["STORE_DATA"] = array(); } } } } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Emulating ::DeductProduct call", array("arFields" => $arFields), "OD7"); } $eventParams = array('ORDER_ID' => $orderID, 'RECURRING_ID' => $recurringID, 'AUTO_DEDUCTION' => $bAutoDeduction, 'STORE_DATA' => $arStoreBarcodeOrderFormData); foreach (GetModuleEvents('sale', 'OnBeforeBasketDeductProduct', true) as $event) { if (ExecuteModuleEventEx($event, array($eventParams, $arBasket, &$arFields)) === false) { if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Emulating ::DeductProduct call - error", array(), "OD7-1"); } $arResult["RESULT"] = false; return $arResult; } } unset($eventParams); //emulate deduction $res = $productProvider::DeductProduct($arFields); if ($res["RESULT"]) { $arBasket["FIELDS"] = $arFields; $arItems[] = $arBasket; if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Emulating ::DeductProduct call - success", array(), "OD8"); } } else { $bRealDeductionAllowed = false; if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Emulating ::DeductProduct call - error", array(), "OD9"); } } } } if ($ex = $APPLICATION->GetException()) { $arResult["ERROR"]["MESSAGE"] = $ex->GetString(); $arResult["ERROR"]["CODE"] = $ex->GetID(); } if (!$bRealDeductionAllowed) { break; } } } // real deduction if ($bRealDeductionAllowed) { $bProductsDeductedSuccessfully = true; $arDeductedItems = array(); foreach ($arItems as $arItem) { /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arItem)) { $arItem["FIELDS"]["EMULATE"] = "N"; if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Call ::DeductProduct", array("fields" => $arItem["FIELDS"]), "OD10"); } // finally real deduction $res = $productProvider::DeductProduct($arItem["FIELDS"]); if ($res["RESULT"]) { $arDeductedItems[] = $arItem; if (!$bUndoDeduction && $storesCount > 0) { if ($bAutoDeduction) { $arStoreBarcodeFields = array("BASKET_ID" => $arItem["ID"], "BARCODE" => "", "STORE_ID" => array_pop(array_keys($res["STORES"])), "QUANTITY" => $arItem["QUANTITY"], "CREATED_BY" => intval($GLOBALS["USER"]->GetID()) > 0 ? IntVal($GLOBALS["USER"]->GetID()) : "", "MODIFIED_BY" => intval($GLOBALS["USER"]->GetID()) > 0 ? IntVal($GLOBALS["USER"]->GetID()) : ""); if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Call CSaleStoreBarcode::Add (auto deduction = true)", array("arStoreBarcodeFields" => $arStoreBarcodeFields), "OD11"); } CSaleStoreBarcode::Add($arStoreBarcodeFields); } } if ($bUndoDeduction) { $dbStoreBarcode = CSaleStoreBarcode::GetList(array(), array("BASKET_ID" => $arItem["ID"]), false, false, array("ID", "BASKET_ID")); while ($arStoreBarcode = $dbStoreBarcode->GetNext()) { CSaleStoreBarcode::Delete($arStoreBarcode["ID"]); } } $tmpRes = $bUndoDeduction ? "N" : "Y"; CSaleBasket::Update($arItem["ID"], array("DEDUCTED" => $tmpRes)); // set parent deducted status if ($bUndoDeduction) { if (CSaleBasketHelper::isSetItem($arItem)) { CSaleBasket::Update($arItem["SET_PARENT_ID"], array("DEDUCTED" => "N")); } } else { if (CSaleBasketHelper::isSetItem($arItem) && CSaleBasketHelper::isSetDeducted($arItem["SET_PARENT_ID"])) { CSaleBasket::Update($arItem["SET_PARENT_ID"], array("DEDUCTED" => "Y")); } } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Call ::DeductProduct - Success (DEDUCTED = " . $tmpRes . ")", array(), "OD11"); } } else { CSaleBasket::Update($arItem["ID"], array("DEDUCTED" => "N")); $bProductsDeductedSuccessfully = false; if ($ex = $APPLICATION->GetException()) { $arResult["ERROR"]["MESSAGE"] = $ex->GetString(); $arResult["ERROR"]["CODE"] = $ex->GetID(); } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Call ::DeductProduct - Error (DEDUCTED = N)", array(), "OD12"); } break; } } } if ($bProductsDeductedSuccessfully) { $arResult["RESULT"] = true; } else { $arFields = array(); foreach ($arDeductedItems as $arItem) { /** @var $productProvider IBXSaleProductProvider */ if ($productProvider = CSaleBasket::GetProductProvider($arItem)) { if ($storesCount > 0) { $arFields = array("PRODUCT_ID" => $arItem["PRODUCT_ID"], "QUANTITY" => $arItem["QUANTITY"], "UNDO_DEDUCTION" => "Y", "EMULATE" => "N", "PRODUCT_RESERVED" => $arItem["FIELDS"]["PRODUCT_RESERVED"], "STORE_DATA" => $arItem["FIELDS"]["STORE_DATA"]); } else { $arFields = array("PRODUCT_ID" => $arItem["PRODUCT_ID"], "QUANTITY" => $arItem["QUANTITY"], "UNDO_DEDUCTION" => "Y", "PRODUCT_RESERVED" => $arItem["FIELDS"]["PRODUCT_RESERVED"], "EMULATE" => "N"); } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("Call ::DeductProduct - Revert deduction", array("storesCount" => $storesCount, "arFields" => $arFields), "OD13"); } $res = $productProvider::DeductProduct($arFields); if ($res["RESULT"]) { CSaleBasket::Update($arItem["ID"], array("DEDUCTED" => "N")); if (CSaleBasketHelper::isSetItem($arItem)) { // todo - possibly not all the time, but once CSaleBasket::Update($arItem["SET_PARENT_ID"], array("DEDUCTED" => "N")); } } } } $arResult["RESULT"] = false; } } else { $arResult["RESULT"] = false; } if (defined("SALE_DEBUG") && SALE_DEBUG) { CSaleHelper::WriteToLog("OrderDeduction - result", array("arResult" => $arResult), "OD14"); } return $arResult; }
private function basket_items() { CModule::IncludeModule("iblock"); CModule::IncludeModule("sale"); CSaleBasket::UpdateBasketPrices(CSaleBasket::GetBasketUserID(), SITE_ID); /* Check Values Begin */ $arSelFields = array("ID", "CALLBACK_FUNC", "MODULE", "PRODUCT_ID", "QUANTITY", "DELAY", "CAN_BUY", "PRICE", "WEIGHT", "NAME", "CURRENCY", "CATALOG_XML_ID", "VAT_RATE", "NOTES", "DISCOUNT_PRICE", "PRODUCT_PROVIDER_CLASS", "DIMENSIONS", "TYPE", "SET_PARENT_ID", "DETAIL_PAGE_URL" ); $dbBasketItems = CSaleBasket::GetList( array("ID" => "ASC"), array( "FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL" ), false, false, $arSelFields ); while ($arItem = $dbBasketItems->GetNext()) { if ($arItem["DELAY"] == "N" && $arItem["CAN_BUY"] == "Y") { $arItem["PRICE"] = roundEx($arItem["PRICE"], SALE_VALUE_PRECISION); $arItem["QUANTITY"] = DoubleVal($arItem["QUANTITY"]); $arItem["WEIGHT"] = DoubleVal($arItem["WEIGHT"]); $arItem["VAT_RATE"] = DoubleVal($arItem["VAT_RATE"]); $arDim = unserialize($arItem["~DIMENSIONS"]); if(is_array($arDim)) { $arItem["DIMENSIONS"] = $arDim; unset($arItem["~DIMENSIONS"]); $arResult["MAX_DIMENSIONS"] = CSaleDeliveryHelper::getMaxDimensions( array( $arDim["WIDTH"], $arDim["HEIGHT"], $arDim["LENGTH"] ), $arResult["MAX_DIMENSIONS"]); $arResult["ITEMS_DIMENSIONS"][] = $arDim; } if($arItem["VAT_RATE"] > 0 && !CSaleBasketHelper::isSetItem($arItem)) { $arResult["bUsingVat"] = "Y"; if($arItem["VAT_RATE"] > $arResult["VAT_RATE"]) $arResult["VAT_RATE"] = $arItem["VAT_RATE"]; //$arItem["VAT_VALUE"] = roundEx((($arItem["PRICE"] / ($arItem["VAT_RATE"] +1)) * $arItem["VAT_RATE"]), SALE_VALUE_PRECISION); $arItem["VAT_VALUE"] = (($arItem["PRICE"] / ($arItem["VAT_RATE"] +1)) * $arItem["VAT_RATE"]); $arResult["VAT_SUM"] += roundEx($arItem["VAT_VALUE"] * $arItem["QUANTITY"], SALE_VALUE_PRECISION); } $arItem["PRICE_FORMATED"] = SaleFormatCurrency($arItem["PRICE"], $arItem["CURRENCY"]); $arItem["WEIGHT_FORMATED"] = roundEx(DoubleVal($arItem["WEIGHT"]/$arResult["WEIGHT_KOEF"]), SALE_WEIGHT_PRECISION)." ".$arResult["WEIGHT_UNIT"]; if($arItem["DISCOUNT_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"], 0)."%"; } $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()) { if (array_key_exists('BASKET_ID', $arProp)) { unset($arProp['BASKET_ID']); } if (array_key_exists('~BASKET_ID', $arProp)) { unset($arProp['~BASKET_ID']); } $arProp = array_filter($arProp, array("CSaleBasketHelper", "filterFields")); $arItem["PROPS"][] = $arProp; } if (!CSaleBasketHelper::isSetItem($arItem)) { $DISCOUNT_PRICE_ALL += $arItem["DISCOUNT_PRICE"] * $arItem["QUANTITY"]; $arItem["DISCOUNT_PRICE"] = roundEx($arItem["DISCOUNT_PRICE"], SALE_VALUE_PRECISION); $arResult["ORDER_PRICE"] += $arItem["PRICE"] * $arItem["QUANTITY"]; } $arResult["ORDER_WEIGHT"] += $arItem["WEIGHT"] * $arItem["QUANTITY"]; if (CSaleBasketHelper::isSetItem($arItem)) $arSetParentWeight[$arItem["SET_PARENT_ID"]] += $arItem["WEIGHT"] * $arItem['QUANTITY']; //get product section $db_groups = CIBlockElement::GetElementGroups($arItem["PRODUCT_ID"], true); while($ar_group = $db_groups->Fetch()) $arItem["IBLOCK_SECTION_ID"][] = $ar_group["ID"]; if(!$arItem["IBLOCK_SECTION_ID"]){ $arItem["PARENT"] = CCatalogSku::GetProductInfo( $arItem["PRODUCT_ID"] ); $db_groups = CIBlockElement::GetElementGroups($arItem["PARENT"]["ID"], true); while($ar_group = $db_groups->Fetch()) $arItem["IBLOCK_SECTION_ID"][] = $ar_group["ID"]; } if($arItem["IBLOCK_SECTION_ID"]){ foreach($arItem["IBLOCK_SECTION_ID"] as $section){ $res_1 = CIBlockSection::GetByID($section); if($ar_res_1 = $res_1->GetNext()){ $arItem["SECTION_NAME"][] = $ar_res_1["NAME"]; } } } $arResult["BASKET_ITEMS"][] = $arItem; } $arResult["PRICE_WITHOUT_DISCOUNT"] = SaleFormatCurrency($arResult["ORDER_PRICE"] + $DISCOUNT_PRICE_ALL, $allCurrency); // count weight for set parent products foreach ($arResult["BASKET_ITEMS"] as &$arItem) { if (CSaleBasketHelper::isSetParent($arItem)) { $arItem["WEIGHT"] = $arSetParentWeight[$arItem["ID"]] / $arItem["QUANTITY"]; $arItem["WEIGHT_FORMATED"] = roundEx(doubleval($arItem["WEIGHT"] / $arResult["WEIGHT_KOEF"]), SALE_WEIGHT_PRECISION)." ".$arResult["WEIGHT_UNIT"]; } } $arResult["ORDER_WEIGHT_FORMATED"] = roundEx(DoubleVal($arResult["ORDER_WEIGHT"]/$arResult["WEIGHT_KOEF"]), SALE_WEIGHT_PRECISION)." ".$arResult["WEIGHT_UNIT"]; $arResult["ORDER_PRICE_FORMATED"] = SaleFormatCurrency($arResult["ORDER_PRICE"], $arResult["BASE_LANG_CURRENCY"]); $arResult["VAT_SUM_FORMATED"] = SaleFormatCurrency($arResult["VAT_SUM"], $arResult["BASE_LANG_CURRENCY"]); $arElementId[] = $arItem["PRODUCT_ID"]; if ($bUseCatalog) { $arParent = CCatalogSku::GetProductInfo($arItem["PRODUCT_ID"]); if ($arParent) { $arElementId[] = $arParent["ID"]; $arSku2Parent[$arItem["PRODUCT_ID"]] = $arParent["ID"]; } } unset($arItem); } return $arResult["BASKET_ITEMS"]; }
/** * <p>Метод удаляет запись корзины с кодом ID. Метод динамичный.</p> <a name="examples"></a> * * * @param int $ID * * @return bool * * <h4>Example</h4> * <pre> * <? * if (CSaleBasket::Delete(22)) * echo "Запись успешно удалена"; * ?> * </htmМетод может использоваться и для удаления записей корзин, которые уже превращены в заказы. То есть, мы можем удалить запись из состава заказа. Но следует помнить, что после использования метода необходимо обновлять итоговую сумму заказа, например, так: * * * $contents = array(); * $dbBasketItems = CSaleBasket::GetList( * array( * "NAME" => "ASC", * "ID" => "ASC" * ), * array( * "LID" => SITE_ID, * "ORDER_ID" => $order_id, * ) * ); * while ($arItems = $dbBasketItems->Fetch()){ * $contents[] = $arItems; * } * $sum = 0; * foreach($contents as $basket_item){ * if($basket_item['DISCOUNT_PRICE']>0){ * $sum += $basket_item['DISCOUNT_PRICE']*$basket_item['QUANTITY']; * }else{ * $sum += $basket_item['PRICE']*$basket_item['QUANTITY']; * } * } * $arFields = array( * "PRICE" => $sum, * ); * CSaleOrder::Update($order_id, $arFields); * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalebasket/csalebasket__delete.e0d06223.php * @author Bitrix */ public static function Delete($ID) { global $DB, $APPLICATION; $isOrderConverted = \Bitrix\Main\Config\Option::get("main", "~sale_converted_15", 'N'); $ID = intval($ID); if (0 >= $ID) { return false; } if ($isOrderConverted == "Y") { /** @var \Bitrix\Sale\Result $r */ $r = \Bitrix\Sale\Compatible\BasketCompatibility::delete($ID); if (!$r->isSuccess(true)) { foreach ($r->getErrorMessages() as $error) { $APPLICATION->ThrowException($error); } return false; } return true; } $rsBaskets = CSaleBasket::GetList(array(), array('ID' => $ID), false, false, array('ID', 'ORDER_ID', 'PRODUCT_ID', 'NAME', 'SUBSCRIBE', 'FUSER_ID', 'TYPE', 'SET_PARENT_ID')); if (!($arBasket = $rsBaskets->Fetch())) { return false; } foreach (GetModuleEvents("sale", "OnBeforeBasketDelete", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($ID)) === false) { return false; } } if (CSaleBasketHelper::isSetParent($arBasket)) { $rsSetItems = CSaleBasket::GetList(array(), array("SET_PARENT_ID" => $ID, "TYPE" => ""), false, false, array('ID', 'ORDER_ID', 'PRODUCT_ID', 'NAME', 'SUBSCRIBE', 'FUSER_ID', 'TYPE', 'SET_PARENT_ID')); while ($arSetItem = $rsSetItems->GetNext()) { CSaleBasket::Delete($arSetItem["ID"]); } } if (0 < intval($arBasket["ORDER_ID"])) { CSaleOrderChange::AddRecord($arBasket["ORDER_ID"], "BASKET_REMOVED", array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "NAME" => $arBasket["NAME"])); } $DB->Query("DELETE FROM b_sale_basket_props WHERE BASKET_ID = " . $ID, true); if (intval($_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]) > 0 && !CSaleBasketHelper::isSetItem($arBasket)) { $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]--; } $DB->Query("DELETE FROM b_sale_store_barcode WHERE BASKET_ID = " . $ID, true); $DB->Query("DELETE FROM b_sale_basket WHERE ID = " . $ID, true); if ('Y' == $arBasket['SUBSCRIBE'] && array_key_exists('NOTIFY_PRODUCT', $_SESSION)) { $intUserID = CSaleUser::GetUserID($arBasket['FUSER_ID']); if ($intUserID && array_key_exists($intUserID, $_SESSION['NOTIFY_PRODUCT'])) { if (array_key_exists($arBasket['PRODUCT_ID'], $_SESSION['NOTIFY_PRODUCT'][$intUserID])) { unset($_SESSION['NOTIFY_PRODUCT'][$intUserID][$arBasket['PRODUCT_ID']]); } } } foreach (GetModuleEvents("sale", "OnBasketDelete", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($ID)); } return true; }
$status = GetMessage("BUYER_B_STATUS_DELAY"); } if ($arBasket["CAN_BUY"] == "N" && $arBasket["SUBSCRIBE"] == "N") { $status = GetMessage("BUYER_B_STATUS_NO"); } if ($arBasket["CAN_BUY"] == "N" && $arBasket["SUBSCRIBE"] == "Y") { $status = GetMessage("BUYER_B_STATUS_NOTIFY"); } $row->AddField("DELAY", $status); $name = "<a href=\"" . $arBasket["DETAIL_PAGE_URL"] . "\">" . $arBasket["NAME"] . "</a>\n\t\t\t<input type=\"hidden\" value=\"" . $arBasket["PRODUCT_ID"] . "\" name=\"PRODUCT_ID[" . $arBasket["LID"] . "][]\" />"; $name .= "<input type=\"hidden\" name=\"table_id\" value=\"" . $sTableID_tab4 . "\">"; $dbProp = CSaleBasket::GetPropsList(array("SORT" => "ASC", "ID" => "ASC"), array("BASKET_ID" => $arBasket["ID"], "!CODE" => array("CATALOG.XML_ID", "PRODUCT.XML_ID"))); while ($arProp = $dbProp->GetNext()) { $name .= "<div><small>" . $arProp["NAME"] . ": " . $arProp["VALUE"] . "</small></div>"; } if (CSaleBasketHelper::isSetParent($arBasket)) { $name .= "<br/><a href=\"javascript:void(0);\" class=\"dashed-link show-set-link\" id=\"set_toggle_link_b2" . $arBasket["ID"] . "\" onclick=\"fToggleSetItems('b2" . $arBasket["ID"] . "', 'set_toggle_link_');\">" . GetMessage("BUYER_F_SHOW_SET") . "</a><br/>"; if (!empty($arSetData) && array_key_exists($arBasket["ID"], $arSetData)) { $name .= "<div class=\"set_item_b2" . $arBasket["ID"] . "\" style=\"display:none\">"; foreach ($arSetData[$arBasket["ID"]] as $set) { $name .= "<p style=\"display:inline; font-style:italic\">" . $set["NAME"] . "</p><br/>"; } $name .= "</div>"; } } $row->AddField("NAME", $name); $row->AddField("PRICE", SaleFormatCurrency($arBasket["PRICE"], $arBasket["CURRENCY"])); if (count($arSites) > 1) { $row->AddField("LID", "[" . $arBasket["LID"] . "] " . htmlspecialcharsbx($arSites[$arBasket["LID"]]["NAME"]) . ""); } }
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; }
function Delete($ID) { global $DB; $ID = intval($ID); if (0 >= $ID) { return false; } $rsBaskets = CSaleBasket::GetList(array(), array('ID' => $ID), false, false, array('ID', 'ORDER_ID', 'PRODUCT_ID', 'NAME', 'SUBSCRIBE', 'FUSER_ID', 'TYPE', 'SET_PARENT_ID')); if (!($arBasket = $rsBaskets->Fetch())) { return false; } foreach (GetModuleEvents("sale", "OnBeforeBasketDelete", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($ID)) === false) { return false; } } if (CSaleBasketHelper::isSetParent($arBasket)) { $rsSetItems = CSaleBasket::GetList(array(), array("SET_PARENT_ID" => $ID, "TYPE" => ""), false, false, array('ID', 'ORDER_ID', 'PRODUCT_ID', 'NAME', 'SUBSCRIBE', 'FUSER_ID', 'TYPE', 'SET_PARENT_ID')); while ($arSetItem = $rsSetItems->GetNext()) { CSaleBasket::Delete($arSetItem["ID"]); } } if (0 < intval($arBasket["ORDER_ID"])) { CSaleOrderChange::AddRecord($arBasket["ORDER_ID"], "BASKET_REMOVED", array("PRODUCT_ID" => $arBasket["PRODUCT_ID"], "NAME" => $arBasket["NAME"])); } $DB->Query("DELETE FROM b_sale_basket_props WHERE BASKET_ID = " . $ID, true); if (intval($_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]) > 0 && !CSaleBasketHelper::isSetItem($arBasket)) { $_SESSION["SALE_BASKET_NUM_PRODUCTS"][SITE_ID]--; } $DB->Query("DELETE FROM b_sale_store_barcode WHERE BASKET_ID = " . $ID, true); $DB->Query("DELETE FROM b_sale_basket WHERE ID = " . $ID, true); if ('Y' == $arBasket['SUBSCRIBE'] && array_key_exists('NOTIFY_PRODUCT', $_SESSION)) { $intUserID = CSaleUser::GetUserID($arBasket['FUSER_ID']); if ($intUserID && array_key_exists($intUserID, $_SESSION['NOTIFY_PRODUCT'])) { if (array_key_exists($arBasket['PRODUCT_ID'], $_SESSION['NOTIFY_PRODUCT'][$intUserID])) { unset($_SESSION['NOTIFY_PRODUCT'][$intUserID][$arBasket['PRODUCT_ID']]); } } } foreach (GetModuleEvents("sale", "OnBasketDelete", true) as $arEvent) { ExecuteModuleEventEx($arEvent, array($ID)); } return true; }
/** * Function gets order basket info from the database * @param mixed[] Cached data taken from obtainDataCachedStructure() * @return void */ protected function obtainBasket(&$cached) { if (empty($this->dbResult["ID"])) { return; } $basket = array(); $arSetParentWeight = array(); $dbBasket = CSaleBasket::GetList(array("NAME" => "ASC"), array("ORDER_ID" => $this->dbResult["ID"]), false, false, array("ID", "DETAIL_PAGE_URL", "NAME", "NOTES", "QUANTITY", "PRICE", "CURRENCY", "PRODUCT_ID", "DISCOUNT_PRICE", "WEIGHT", "CATALOG_XML_ID", "VAT_RATE", "PRODUCT_XML_ID", "TYPE", "SET_PARENT_ID", "MEASURE_CODE", "MEASURE_NAME", "MODULE")); while ($arItem = $dbBasket->Fetch()) { if (CSaleBasketHelper::isSetItem($arItem)) { continue; } if ($this->useCatalog && $this->cameFromCatalog($arItem)) { $arParent = CCatalogSku::GetProductInfo($arItem["PRODUCT_ID"]); if (!empty($arParent)) { $arItem['PARENT'] = $arParent; } } // adjust some sale params $arItem["PRICE_VAT_VALUE"] = $arItem["PRICE"] / ($arItem["VAT_RATE"] + 1) * $arItem["VAT_RATE"]; $arItem["WEIGHT"] = doubleval($arItem["WEIGHT"]); // weight manipulation for product that has type "SET" (nabor) if (CSaleBasketHelper::isSetItem($arItem)) { $arSetParentWeight[$arItem["SET_PARENT_ID"]] += $arItem["WEIGHT"] * $arItem["QUANTITY"]; } if (CSaleBasketHelper::isSetParent($arItem)) { $arItem["WEIGHT"] = $arSetParentWeight[$arItem["ID"]] / $arItem["QUANTITY"]; } $basket[] = $arItem; } // fetching all properties $this->obtainBasketProps($basket); $cached["BASKET"] = $basket; }
/** * @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; }
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; }
echo $arItem["ID"]; ?> " maxlength="18" value="<?php echo $arItem["QUANTITY"]; ?> " onchange="updateQuantity(<?php echo $arItem["ID"]; ?> , <? echo isset($arItem["MEASURE_RATIO"]) ? $arItem["MEASURE_RATIO"] : 0 ?>)" > </td> <? if (isset($arItem["MEASURE_RATIO"]) && floatval($arItem["MEASURE_RATIO"]) != 0 && !CSaleBasketHelper::isSetParent($arItem)): ?> <td id="quantity_control"> <div class="quantity_control"> <a href="javascript:void(0)" class="plus" onclick="setQuantity(<?php echo $arItem["ID"]; ?> , <?php echo $arItem["MEASURE_RATIO"]; ?> , 'up');"></a> <a href="javascript:void(0)" class="minus" onclick="setQuantity(<?php echo $arItem["ID"]; ?> , <?php echo $arItem["MEASURE_RATIO"];