Exemplo n.º 1
0
 protected function addResultData($dataKey, $data)
 {
     if (strlen($dataKey) <= 0) {
         $this->result->addData($data);
     } else {
         $this->result->addData(array($dataKey => $data));
     }
 }
Exemplo n.º 2
0
 /**
  * @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;
 }
Exemplo n.º 3
0
 /**
  * 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;
 }
Exemplo n.º 4
0
 /**
  * @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;
 }
Exemplo n.º 5
0
 /**
  * @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;
 }
Exemplo n.º 6
0
 /**
  * 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;
 }