protected function addResultData($dataKey, $data) { if (strlen($dataKey) <= 0) { $this->result->addData($data); } else { $this->result->addData(array($dataKey => $data)); } }
/** * @param $id * @return Sale\BasketItem|Sale\Result|null * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ArgumentNullException */ protected static function loadEntityFromBasket($id) { $result = new Sale\Result(); $order = null; $basket = null; $item = null; $res = BasketTable::getList(array('filter' => array('ID' => $id), 'select' => array('ID', 'ORDER_ID', 'SET_PARENT_ID', 'TYPE', 'FUSER_ID', 'LID'))); if (!($itemDat = $res->fetch())) { $result->addError(new Sale\ResultError(Main\Localization\Loc::getMessage('SALE_BASKET_COMPATIBLE_BASKET_ITEM_NOT_FOUND'), 'BASKET_ITEM_NOT_FOUND')); return $result; } if (intval($itemDat['ORDER_ID']) > 0) { /** @var Sale\Order $order */ if ($order = Sale\Order::load(intval($itemDat['ORDER_ID']))) { if ($basket = $order->getBasket()) { /** @var Sale\BasketItem $item */ $item = $basket->getItemById($id); } } } else { // if (!array_key_exists('FUSER_ID', $itemDat) || intval($itemDat['FUSER_ID']) <= 0) // { // $itemDat['FUSER_ID'] = Sale\Fuser::getId(); // } /** @var Sale\Basket $basket */ $basket = Sale\Basket::loadItemsForFUser($itemDat["FUSER_ID"], $itemDat['LID']); if ($basket) { /** @var Sale\BasketItem $item */ $item = $basket->getItemById($id); } } $data = array('BASKET_ITEM' => $item); if ($order !== null) { $data['ORDER'] = $order; } $result->addData($data); return $result; }
/** * Return order locked status. * * @param int $id Order id. * @return Result * @throws Main\ArgumentException */ public static function getLockedStatus($id) { $result = new Result(); $res = Internals\OrderTable::getList(array('filter' => array('=ID' => $id), 'select' => array('LOCKED_BY', 'LOCK_STATUS', 'DATE_LOCK'))); if ($data = $res->fetch()) { $result->addData(array('LOCKED_BY' => $data['LOCKED_BY'], 'LOCK_STATUS' => $data['LOCK_STATUS'], 'DATE_LOCK' => $data['DATE_LOCK'])); } return $result; }
/** * @param ShipmentItem $shipmentItem * @return float|int|null * @throws NotSupportedException * @throws SystemException */ public static function tryUnreserveShipmentItem(ShipmentItem $shipmentItem) { if (Configuration::isEnabledReservation() && $shipmentItem->getReservedQuantity() == 0) { return new Result(); } $result = new Result(); /** @var BasketItem $basketItem */ $basketItem = $shipmentItem->getBasketItem(); if ($basketItem->isBundleParent()) { return $result; } /** @var ShipmentItemCollection $shipmentItemCollection */ $shipmentItemCollection = $shipmentItem->getCollection(); $shipment = $shipmentItemCollection->getShipment(); /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $shipment->getCollection(); $order = $shipmentCollection->getOrder(); if (Configuration::isEnabledReservation()) { $quantity = $shipmentItem->getReservedQuantity(); } else { $quantity = $shipmentItem->getQuantity(); } $canReserve = false; /** @var Result $r */ $r = static::tryReserveBasketItem($shipmentItem->getBasketItem(), -1 * $quantity); if ($r->isSuccess()) { $availableQuantityData = $r->getData(); if (array_key_exists('AVAILABLE_QUANTITY', $availableQuantityData)) { $availableQuantity = $availableQuantityData['AVAILABLE_QUANTITY']; } else { $result->addError(new ResultError(Loc::getMessage('PROVIDER_UNRESERVE_SHIPMENT_ITEM_WRONG_AVAILABLE_QUANTITY'), 'PROVIDER_UNRESERVE_SHIPMENT_ITEM_WRONG_AVAILABLE_QUANTITY')); return $result; } if (array_key_exists('HAS_PROVIDER', $availableQuantityData)) { $canReserve = $availableQuantityData['HAS_PROVIDER']; } if ($canReserve && array_key_exists('QUANTITY_TRACE', $availableQuantityData)) { $canReserve = $availableQuantityData['QUANTITY_TRACE']; } } else { $result->addErrors($r->getErrors()); return $result; } if ($canReserve) { if ($availableQuantity > 0) { // throw new SystemException("availableQuantity"); $result->addError(new ResultError(Loc::getMessage("SALE_PROVIDER_RESERVE_SHIPMENT_ITEM_QUANTITY_NOT_ENOUGH"), "SALE_PROVIDER_RESERVE_SHIPMENT_ITEM_QUANTITY_NOT_ENOUGH")); return $result; } static::addReservationPoolItem($order->getInternalId(), $shipmentItem->getBasketItem(), $availableQuantity); if (Configuration::isEnabledReservation()) { $shipmentItem->setField('RESERVED_QUANTITY', $shipmentItem->getReservedQuantity() + $availableQuantity); } } $result->addData(array('CAN_RESERVE' => $canReserve)); return $result; }
/** * @return Result * @throws ArgumentNullException * @throws \Bitrix\Main\ArgumentException * todo: timelimit */ protected function updateStatuses() { $result = new Result(); $checkPeriod = self::getCheckPeriod(); if ($checkPeriod <= 0) { return $result; } $lastChage = \Bitrix\Main\Type\DateTime::createFromTimestamp(time() - self::$activeStatusLiveTime); $lastUpdate = \Bitrix\Main\Type\DateTime::createFromTimestamp(time() - $checkPeriod * 60 * 60); $res = ShipmentTable::getList(array('filter' => array('!=TRACKING_NUMBER' => false, '!=DELIVERY_ID' => false, '!=TRACKING_STATUS' => Statuses::HANDED, array('LOGIC' => 'OR', array('TRACKING_LAST_CHANGE' => false), array('>=TRACKING_LAST_CHANGE' => $lastChage)), array('LOGIC' => 'OR', array('TRACKING_LAST_CHECK' => false), array('>=TRACKING_LAST_CHECK' => $lastUpdate))), 'select' => array('ID', 'ORDER_ID', 'DELIVERY_ID', 'TRACKING_STATUS', 'TRACKING_NUMBER'), 'order' => array('DELIVERY_ID' => 'ASC'))); $deliveryId = 0; $shipmentsData = array(); while ($shipment = $res->fetch()) { if (!isset($shipmentsData[$shipment['DELIVERY_ID']])) { $shipmentsData[$shipment['DELIVERY_ID']] = array(); } $shipmentsData[$shipment['DELIVERY_ID']][$shipment['TRACKING_NUMBER']] = array('SHIPMENT_ID' => $shipment['ID'], 'ORDER_ID' => $shipment['ORDER_ID'], 'DELIVERY_ID' => $shipment['DELIVERY_ID'], 'TRACKING_STATUS' => $shipment['TRACKING_STATUS']); if ($shipment['DELIVERY_ID'] != $deliveryId && $deliveryId > 0) { $res = $this->processStatusesByDelivery($deliveryId, $shipmentsData[$deliveryId]); if ($res->isSuccess()) { $result->addData($res->getData()); } else { $result->addErrors($res->getErrors()); } $deliveryId = $shipment['DELIVERY_ID']; } if ($deliveryId <= 0) { $deliveryId = $shipment['DELIVERY_ID']; } } if ($deliveryId > 0) { $res = $this->processStatusesByDelivery($deliveryId, $shipmentsData[$deliveryId]); if ($res->isSuccess()) { $result->addData($res->getData()); } else { $result->addErrors($res->getErrors()); } } return $result; }
/** * Load applied discount list * * @param int $order Order id. * @param bool $extendedMode Get full information by discount. * @param array $basketList Correspondence between basket ids and basket codes. * @param array $basketData Basket data. * @return Result */ public static function loadResultFromDatabase($order, $extendedMode = false, $basketList = array(), $basketData = array()) { if (self::$init === false) { self::init(); } $result = new Result(); $translate = !empty($basketList) && is_array($basketList); $extendedMode = $extendedMode === true; $order = (int) $order; if ($order <= 0) { $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_BAD_ORDER_ID'), self::ERROR_ID)); return $result; } $resultData = array('BASKET' => array(), 'ORDER' => array(), 'DISCOUNT_LIST' => array(), 'DISCOUNT_MODULES' => array(), 'COUPON_LIST' => array(), 'DATA' => array()); $orderDiscountIndex = 0; $orderDiscountLink = array(); $discountList = array(); $discountSort = array(); $couponList = array(); $couponIterator = Internals\OrderCouponsTable::getList(array('select' => array('*'), 'filter' => array('=ORDER_ID' => $order), 'order' => array('ID' => 'ASC'))); while ($coupon = $couponIterator->fetch()) { $coupon['ID'] = (int) $coupon['ID']; $coupon['ORDER_ID'] = (int) $coupon['ORDER_ID']; $coupon['ORDER_DISCOUNT_ID'] = (int) $coupon['ORDER_DISCOUNT_ID']; $resultData['COUPON_LIST'][$coupon['COUPON']] = $coupon; $couponList[$coupon['ID']] = $coupon['COUPON']; } unset($coupon, $couponIterator); $ruleIterator = Internals\OrderRulesTable::getList(array('select' => array('*', 'RULE_DESCR' => 'DESCR.DESCR', 'RULE_DESCR_ID' => 'DESCR.ID'), 'filter' => array('=ORDER_ID' => $order), 'order' => array('ID' => 'ASC'))); while ($rule = $ruleIterator->fetch()) { $rule['ID'] = (int) $rule['ID']; $rule['ORDER_DISCOUNT_ID'] = (int) $rule['ORDER_DISCOUNT_ID']; $rule['ORDER_COUPON_ID'] = (int) $rule['COUPON_ID']; if ($rule['ORDER_COUPON_ID'] > 0) { if (!isset($couponList[$rule['COUPON_ID']])) { $result->addError(new Main\Entity\EntityError(Loc::getMessage('SALE_ORDER_DISCOUNT_ERR_RULE_COUPON_NOT_FOUND', array('#ID#' => $rule['ID'], '#COUPON_ID#' => $rule['COUPON_ID'])))); } else { $rule['COUPON_ID'] = $couponList[$rule['ORDER_COUPON_ID']]; } } $rule['RULE_DESCR_ID'] = (int) $rule['RULE_DESCR_ID']; if ($rule['MODULE_ID'] == 'sale') { $discountId = (int) $rule['ORDER_DISCOUNT_ID']; if (!isset($orderDiscountLink[$discountId])) { $resultData['ORDER'][$orderDiscountIndex] = array('ORDER_ID' => $rule['ORDER_ID'], 'DISCOUNT_ID' => $rule['ORDER_DISCOUNT_ID'], 'ORDER_COUPON_ID' => $rule['ORDER_COUPON_ID'], 'COUPON_ID' => '', 'RESULT' => array()); if ($rule['ORDER_COUPON_ID'] > 0) { $resultData['ORDER'][$orderDiscountIndex]['COUPON_ID'] = $rule['COUPON_ID']; } $orderDiscountLink[$discountId] =& $resultData['ORDER'][$orderDiscountIndex]; $orderDiscountIndex++; } $ruleItem = array('RULE_ID' => $rule['ID'], 'APPLY' => $rule['APPLY'], 'RULE_DESCR_ID' => $rule['RULE_DESCR_ID']); if (!empty($rule['RULE_DESCR']) && is_array($rule['RULE_DESCR'])) { $ruleItem['DESCR_DATA'] = $rule['RULE_DESCR']; $ruleItem['DESCR'] = self::formatArrayDescription($rule['RULE_DESCR']); $ruleItem['DESCR_ID'] = $rule['RULE_DESCR_ID']; } switch ($rule['ENTITY_TYPE']) { case Internals\OrderRulesTable::ENTITY_TYPE_BASKET: if (!isset($orderDiscountLink[$discountId]['RESULT']['BASKET'])) { $orderDiscountLink[$discountId]['RESULT']['BASKET'] = array(); } $rule['ENTITY_ID'] = (int) $rule['ENTITY_ID']; $ruleItem['BASKET_ID'] = $rule['ENTITY_ID']; $index = $translate ? $basketList[$rule['ENTITY_ID']] : $rule['ENTITY_ID']; if (!empty($basketData[$index])) { $ruleItem['MODULE'] = $basketData[$index]['MODULE']; $ruleItem['PRODUCT_ID'] = $basketData[$index]['PRODUCT_ID']; } $orderDiscountLink[$discountId]['RESULT']['BASKET'][$index] = $ruleItem; break; case Internals\OrderRulesTable::ENTITY_TYPE_DELIVERY: if (!isset($orderDiscountLink[$discountId]['RESULT']['DELIVERY'])) { $orderDiscountLink[$discountId]['RESULT']['DELIVERY'] = array(); } $rule['ENTITY_ID'] = (int) $rule['ENTITY_ID']; $ruleItem['DELIVERY_ID'] = $rule['ENTITY_ID'] > 0 ? $rule['ENTITY_ID'] : (string) $rule['ENTITY_VALUE']; $orderDiscountLink[$discountId]['RESULT']['DELIVERY'] = $ruleItem; break; } unset($ruleItem, $discountId); } else { if ($rule['ENTITY_TYPE'] != Internals\OrderRulesTable::ENTITY_TYPE_BASKET) { continue; } $rule['ENTITY_ID'] = (int) $rule['ENTITY_ID']; if ($rule['ENTITY_ID'] <= 0) { continue; } $index = $translate ? $basketList[$rule['ENTITY_ID']] : $rule['ENTITY_ID']; if (!isset($resultData['BASKET'][$index])) { $resultData['BASKET'][$index] = array(); } $ruleResult = array('BASKET_ID' => $rule['ENTITY_ID'], 'RULE_ID' => $rule['ID'], 'ORDER_ID' => $rule['ORDER_ID'], 'DISCOUNT_ID' => $rule['ORDER_DISCOUNT_ID'], 'ORDER_COUPON_ID' => $rule['ORDER_COUPON_ID'], 'COUPON_ID' => '', 'RESULT' => array('APPLY' => $rule['APPLY']), 'RULE_DESCR_ID' => $rule['RULE_DESCR_ID']); if ($rule['ORDER_COUPON_ID'] > 0) { $ruleResult['COUPON_ID'] = $rule['COUPON_ID']; } if (!empty($basketData[$index])) { $ruleResult['MODULE'] = $basketData[$index]['MODULE']; $ruleResult['PRODUCT_ID'] = $basketData[$index]['PRODUCT_ID']; } if (!empty($rule['RULE_DESCR']) && is_array($rule['RULE_DESCR'])) { $ruleResult['RESULT']['DESCR_DATA'] = $rule['RULE_DESCR']; $ruleResult['RESULT']['DESCR'] = self::formatArrayDescription($rule['RULE_DESCR']); $ruleResult['DESCR_ID'] = $rule['RULE_DESCR_ID']; } $resultData['BASKET'][$index][] = $ruleResult; unset($ruleResult); } $discountList[$rule['ORDER_DISCOUNT_ID']] = true; if (!isset($discountSort[$rule['ORDER_DISCOUNT_ID']])) { $discountSort[$rule['ORDER_DISCOUNT_ID']] = $rule['ID']; } } unset($rule, $ruleIterator); unset($couponList); if (!empty($discountList)) { $discountSelect = $extendedMode ? array('*') : array('ID', 'NAME', 'MODULE_ID', 'DISCOUNT_ID', 'USE_COUPONS'); $discountIterator = Internals\OrderDiscountTable::getList(array('select' => $discountSelect, 'filter' => array('@ID' => array_keys($discountList)))); while ($discount = $discountIterator->fetch()) { $discount['ID'] = (int) $discount['ID']; $discount['ORDER_DISCOUNT_ID'] = $discount['ID']; $discount['RULE_SORT'] = $discountSort[$discount['ID']]; if ($discount['MODULE_ID'] == 'sale') { $discount['EDIT_PAGE_URL'] = self::getEditUrl(array('ID' => $discount['DISCOUNT_ID'])); } else { $discount['EDIT_PAGE_URL'] = ''; if (!empty(self::$discountProviders[$discount['MODULE_ID']]['getEditUrl'])) { $discount['EDIT_PAGE_URL'] = call_user_func_array(self::$discountProviders[$discount['MODULE_ID']]['getEditUrl'], array(array('ID' => $discount['DISCOUNT_ID'], 'MODULE_ID' => $discount['MODULE_ID']))); } } $resultData['DISCOUNT_LIST'][$discount['ID']] = $discount; } unset($discount, $discountIterator, $discountSelect); if (!empty($resultData['DISCOUNT_LIST'])) { Main\Type\Collection::sortByColumn($resultData['DISCOUNT_LIST'], 'RULE_SORT', '', null, true); foreach ($resultData['DISCOUNT_LIST'] as &$discount) { unset($discount['RULE_SORT']); } unset($discount); } $modulesIterator = Internals\OrderModulesTable::getList(array('select' => array('MODULE_ID', 'ORDER_DISCOUNT_ID'), 'filter' => array('@ORDER_DISCOUNT_ID' => array_keys($discountList)))); while ($module = $modulesIterator->fetch()) { $orderDiscountId = (int) $module['ORDER_DISCOUNT_ID']; if (!isset($resultData['DISCOUNT_MODULES'][$orderDiscountId])) { $resultData['DISCOUNT_MODULES'][$orderDiscountId] = array(); } $resultData['DISCOUNT_MODULES'][$orderDiscountId][] = $module['MODULE_ID']; } unset($module, $modulesIterator); } unset($discountList); $dataIterator = Internals\OrderDiscountDataTable::getList(array('select' => array('*'), 'filter' => array('=ORDER_ID' => $order, '@ENTITY_TYPE' => array(Internals\OrderDiscountDataTable::ENTITY_TYPE_BASKET, Internals\OrderDiscountDataTable::ENTITY_TYPE_DELIVERY)))); while ($data = $dataIterator->fetch()) { if ($data['ENTITY_TYPE'] == Internals\OrderDiscountDataTable::ENTITY_TYPE_BASKET) { if (!isset($resultData['DATA']['BASKET'])) { $resultData['DATA']['BASKET'] = array(); } $data['ENTITY_ID'] = (int) $data['ENTITY_ID']; $index = $translate ? $basketList[$data['ENTITY_ID']] : $data['ENTITY_ID']; $resultData['DATA']['BASKET'][$index] = $data['ENTITY_DATA']; } else { } } unset($data, $dataIterator); $result->addData($resultData); unset($resultData); return $result; }