/** * @param $action * @param BasketItem $basketItem * @param null $name * @param null $oldValue * @param null $value */ public function onBasketModify($action, BasketItem $basketItem, $name = null, $oldValue = null, $value = null) { switch ($action) { case "UPDATE": if ($name == "QUANTITY") { /** @var ShipmentItemCollection $collection */ $collection = $this->getCollection(); $shipment = $collection->getShipment(); if ($shipment->isShipped() != "Y") { return true; } if ($basketItem->getBasketCode() != $this->getBasketCode()) { return true; } $quantity = $value - $oldValue; if ($quantity != 0) { $result = Provider::tryReserveShipmentItem($this); } if (!empty($result) && is_array($result)) { $this->setField('RESERVED_QUANTITY', $result['QUANTITY']); if ($quantity > 0) { if ($this->getQuantity() != $this->getReservedQuantity()) { /** @var ShipmentItemCollection $shipmentItemCollection */ $shipmentItemCollection = $this->getCollection(); /** @var Shipment $shipment */ $shipment = $shipmentItemCollection->getShipment(); $shipment->setMark(); } } } } //change quantity break; case "DELETE": // unreserve break; } }
/** * @param BasketItem $basketItem * @return float|int * @throws Main\ObjectNotFoundException */ public function getBasketItemQuantity(BasketItem $basketItem) { $allQuantity = 0; /** @var ShipmentItemCollection $shipmntItemCollection */ if (!($shipmentItemCollection = $this->getShipmentItemCollection())) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var ShipmentItem $shipmentItem */ foreach ($shipmentItemCollection as $shipmentItem) { if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) { $allQuantity += $shipmentItem->getQuantity(); } } return $allQuantity; }
/** * @param BasketItem $basketItem * @param $quantity * @return Result * @throws NotSupportedException * @throws ObjectNotFoundException */ private static function reserveBasketItem(BasketItem $basketItem, $quantity) { global $APPLICATION; $result = new Result(); $fields = array(); $provider = $basketItem->getProvider(); $hasProvider = false; if ($provider instanceof Provider) { throw new NotSupportedException('provider not supported'); } elseif ($provider && array_key_exists("IBXSaleProductProvider", class_implements($provider))) { $hasProvider = true; $data = array("PRODUCT_ID" => $basketItem->getProductId()); if ($quantity > 0) { $data["UNDO_RESERVATION"] = "N"; $data["QUANTITY_ADD"] = $quantity; } else { $data["UNDO_RESERVATION"] = "Y"; $data["QUANTITY_ADD"] = abs($quantity); } $APPLICATION->ResetException(); if ($resultReserveData = $provider::ReserveProduct($data)) { if ($resultReserveData['RESULT']) { $fields['QUANTITY'] = $resultReserveData['QUANTITY_RESERVED']; if ($quantity < 0) { $fields['QUANTITY'] = $quantity; } $fields['HAS_PROVIDER'] = $hasProvider; $result->setData($fields); if ($ex = $APPLICATION->GetException()) { /** @var Basket $basket */ if (!($basket = $basketItem->getCollection())) { throw new ObjectNotFoundException('Entity "Basket" not found'); } if ($order = $basket->getOrder()) { /** @var ShipmentCollection $shipmentCollection */ if (!($shipmentCollection = $order->getShipmentCollection())) { throw new ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Shipment $shipment */ foreach ($shipmentCollection as $shipment) { /** @var ShipmentItemCollection $shipmentItemCollection */ if (!($shipmentItemCollection = $shipment->getShipmentItemCollection())) { throw new ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } if ($shipmentItemCollection->getItemByBasketCode($basketItem->getBasketCode())) { $shipment->setField('MARKED', 'Y'); $oldErrorText = $shipment->getField('REASON_MARKED'); $shipment->setField('REASON_MARKED', $oldErrorText . (strval($oldErrorText) != '' ? "\n" : "") . $ex->GetString()); } } } } return $result; } else { if ($ex = $APPLICATION->GetException()) { $result->addError(new ResultError($ex->GetString())); } else { $result->addError(new ResultError(Loc::getMessage('SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR'), 'SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR')); } } } else { $result->addError(new ResultError(Loc::getMessage('SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR'), 'SALE_PROVIDER_RESERVE_BASKET_ITEM_ERROR')); } } else { $fields['QUANTITY'] = $quantity; $result->setData($fields); } return $result; }
/** * @param BasketItem $basketItem * * @return Result * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException * @throws \ErrorException */ public function deleteByBasketItem(BasketItem $basketItem) { $result = new Result(); $systemShipmentItem = null; /** @var Shipment $shipment */ if (!($shipment = $this->getShipment())) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentItem $shipmentItem */ foreach ($this->collection as $shipmentItem) { if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) { if ($shipment->isSystem()) { $systemShipmentItem = $shipmentItem; continue; } $r = $shipmentItem->delete(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } if ($systemShipmentItem !== null) { if ($systemShipmentItem->getReservedQuantity() > 0) { /** @var Result $r */ $r = $systemShipmentItem->tryUnreserve(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } if ($result->isSuccess()) { $shipmentItem->setFieldNoDemand('QUANTITY', 0); } } return $result; }
/** * @param Sale\BasketItem $basketItem * @param $quantity */ public function set(Sale\BasketItem $basketItem, $quantity) { $this->quantities[$basketItem->getBasketCode()] = $quantity; $this->items[$basketItem->getBasketCode()] = $basketItem; }
/** * @param BasketItem $item * @param array $productData * @return \Bitrix\Sale\Result * @throws SystemException */ public static function fillBasketItem(BasketItem &$item, array $productData, Order $order, Basket $basket, $needDataUpdate = false) { $basketCode = $item->getBasketCode(); if (isset($productData["PRODUCT_PROVIDER_CLASS"]) && strlen($productData["PRODUCT_PROVIDER_CLASS"]) > 0) { $item->setField("PRODUCT_PROVIDER_CLASS", trim($productData["PRODUCT_PROVIDER_CLASS"])); } $item->setField("QUANTITY", $productData["QUANTITY"]); $product = array(); $data = array(); /* Get actual info from provider * cases: * 1) add new product to basket; * 2) saving operation; */ if (!self::$isTrustProductFormData || $needDataUpdate) { $data = Provider::getProductData($basket, array("PRICE"), $item); if (isset($data[$basketCode])) { $product = $data[$basketCode]; if (isset($product['DISCOUNT_PRICE'])) { $product['DISCOUNT_PRICE'] = roundEx($product['DISCOUNT_PRICE'], SALE_VALUE_PRECISION); } if (isset($product['BASE_PRICE'])) { $product['PRICE'] = $product['BASE_PRICE'] - $product['DISCOUNT_PRICE']; } $discount = $order->getDiscount(); if ($discount !== null) { if (isset($data[$basketCode]['BASE_PRICE']) && isset($data[$basketCode]['CURRENCY'])) { $discount->setBasketItemBasePrice($basketCode, $data[$basketCode]['BASE_PRICE'], $data[$basketCode]['CURRENCY']); } if (!empty($data[$basketCode]['DISCOUNT_LIST'])) { $discount->setBasketItemDiscounts($basketCode, $data[$basketCode]['DISCOUNT_LIST']); } } } } /* * Let's extract cached provider product data from field * cases: * 1) all activity through ajax */ if (empty($data[$basketCode]) && !empty($productData["PROVIDER_DATA"])) { $data[$basketCode] = unserialize($productData["PROVIDER_DATA"]); } if (!empty($productData["SET_ITEMS_DATA"])) { $productData["SET_ITEMS"] = unserialize($productData["SET_ITEMS_DATA"]); } if (is_array($data[$basketCode]) && !empty($data[$basketCode])) { self::setProviderTrustData($item, $order, $data[$basketCode]); } if (!self::$isTrustProductFormData) { if (isset($productData["MODULE"]) && $productData["MODULE"] == "catalog") { $data = OrderBasket::getProductDetails($item->getProductId(), $productData["QUANTITY"], $order->getUserId(), $order->getSiteId()); $product = array_merge($product, $data); } unset($productData["CURRENCY"]); } $product = array_merge($product, $productData); if (isset($product["OFFER_ID"]) || intval($product["OFFER_ID"]) >= 0) { $product["PRODUCT_ID"] = $product["OFFER_ID"]; } $product = array_intersect_key($product, array_flip($item::getAvailableFields())); if (isset($product["MEASURE_CODE"]) && strlen($product["MEASURE_CODE"]) > 0) { $measures = OrderBasket::getCatalogMeasures(); if (isset($measures[$product["MEASURE_CODE"]]) && strlen($measures[$product["MEASURE_CODE"]]) > 0) { $product["MEASURE_NAME"] = $measures[$product["MEASURE_CODE"]]; } } if (!isset($product["CURRENCY"]) || strlen($product["CURRENCY"]) <= 0) { $product["CURRENCY"] = $order->getCurrency(); } if ($productData["IS_SET_PARENT"] == "Y") { $product["TYPE"] = BasketItem::TYPE_SET; } OrderEdit::setProductDetails($productData["OFFER_ID"], $order->getUserId(), $order->getSiteId(), array_merge($product, $productData)); $result = self::setBasketItemFields($item, $product); return $result; }
/** * @param BasketItem $basketItem * @return bool * @throws Main\ObjectNotFoundException */ protected function isExistsBasketItem(BasketItem $basketItem) { /** @var ShipmentItem $shipmentItem */ foreach ($this->collection as $shipmentItem) { if ($shipmentItem->getBasketCode() == $basketItem->getBasketCode()) { return true; } } return false; }