Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sale/lib/ |
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/sale/lib/shipmentitem.php |
<?php namespace Bitrix\Sale; use Bitrix\Main; use Bitrix\Main\Entity; use Bitrix\Sale\Internals; use Bitrix\Main\Localization\Loc; Loc::loadMessages(__FILE__); class ShipmentItem extends Internals\CollectableEntity implements \IEntityMarker { /** @var BasketItem */ protected $basketItem; /** @var ShipmentItemStoreCollection */ protected $shipmentItemStoreCollection; /** @var array */ protected static $errors = array(); /** @var array */ protected static $mapFields = array(); private static $eventClassName = null; /** * @return array */ public static function getAvailableFields() { return array("QUANTITY", "RESERVED_QUANTITY"); } /** * @return array */ public static function getMeaningfulFields() { return array('QUANTITY'); } /** * @return array */ public static function getAllFields() { if (empty(static::$mapFields)) { static::$mapFields = parent::getAllFieldsByMap(Internals\ShipmentItemTable::getMap()); } return static::$mapFields; } /** * Internal method, use ShipmentItemCollection::createShipmentItem() * * @internal * @see ShipmentItemCollection::createShipmentItem() * * @param ShipmentItemCollection $collection * @param BasketItem $basketItem * @return ShipmentItem */ public static function create(ShipmentItemCollection $collection, BasketItem $basketItem = null) { $fields = array(); if ($basketItem !== null && $basketItem->getId() > 0) { $fields["BASKET_ID"] = $basketItem->getId(); } $shipmentItem = static::createShipmentItemObject(); $shipmentItem->setFieldsNoDemand($fields); $shipmentItem->setCollection($collection); if ($basketItem !== null) { $shipmentItem->basketItem = $basketItem; } return $shipmentItem; } /** * Deletes shipment item * * @throws Main\ArgumentOutOfRangeException * @throws Main\NotSupportedException * @throws \Exception */ public function delete() { $result = new Result(); /** @var ShipmentItemCollection $shipmentItemCollection */ if (!$shipmentItemCollection = $this->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!$shipment = $shipmentItemCollection->getShipment()) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } if (self::$eventClassName === null) { self::$eventClassName = static::getEntityEventName(); } /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); /** @var Main\Event $event */ $event = new Main\Event('sale', "OnBefore".self::$eventClassName."EntityDeleted", array( 'ENTITY' => $this, 'VALUES' => $oldEntityValues, )); $event->send(); if ($event->getResults()) { /** @var Main\EventResult $eventResult */ foreach($event->getResults() as $eventResult) { if($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Loc::getMessage('SALE_EVENT_ON_BEFORE_'.ToUpper(self::$eventClassName).'_ENTITY_DELETED_ERROR'), 'SALE_EVENT_ON_BEFORE_'.ToUpper(self::$eventClassName).'_ENTITY_DELETED_ERROR'); if ($eventResultData = $eventResult->getParameters()) { if (isset($eventResultData) && $eventResultData instanceof ResultError) { /** @var ResultError $errorMsg */ $errorMsg = $eventResultData; } } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } if (!$shipment->isSystem()) { if ($shipment->isShipped()) { /** @var BasketItem $basketItem */ if (!$basketItem = $this->getBasketItem()) { throw new Main\ObjectNotFoundException('Entity "BasketItem" not found'); } $result->addError(new ResultError(Loc::getMessage( 'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_DELETE', array( '#PRODUCT_NAME#' => $basketItem->getField('NAME') )), 'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_DELETE')); return $result; } $r = $this->setField("QUANTITY", 0); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); return $result; } } elseif ($shipment->isSystem() && $this->getQuantity() > 0) { throw new \ErrorException('System shipment not empty'); } $r = parent::delete(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } /** @var array $oldEntityValues */ $oldEntityValues = $this->fields->getOriginalValues(); /** @var Main\Event $event */ $event = new Main\Event('sale', "On".self::$eventClassName."EntityDeleted", array( 'ENTITY' => $this, 'VALUES' => $oldEntityValues, )); $event->send(); if ($event->getResults()) { /** @var Main\EventResult $eventResult */ foreach($event->getResults() as $eventResult) { if($eventResult->getType() == Main\EventResult::ERROR) { $errorMsg = new ResultError(Loc::getMessage('SALE_EVENT_ON_'.ToUpper(self::$eventClassName).'_ENTITY_DELETED_ERROR'), 'SALE_EVENT_ON_'.ToUpper(self::$eventClassName).'_ENTITY_DELETED_ERROR'); $eventResultData = $eventResult->getParameters(); if (isset($eventResultData) && $eventResultData instanceof ResultError) { /** @var ResultError $errorMsg */ $errorMsg = $eventResultData; } $result->addError($errorMsg); } } if (!$result->isSuccess()) { return $result; } } return $result; } /** * Sets new value to specified field of shipment item * * @param string $name * @param mixed $value * @return Result * @throws Main\ArgumentOutOfRangeException * @throws Main\NotSupportedException * @throws \Exception */ public function setField($name, $value) { /** @var ShipmentItemCollection $collection */ $collection = $this->getCollection(); $shipment = $collection->getShipment(); if ($shipment->isSystem() && ($name != 'RESERVED_QUANTITY')) throw new Main\NotSupportedException(); return parent::setField($name, $value); } /** * @return float */ public function getQuantity() { return (float)$this->getField('QUANTITY'); } /** * @param string $name * @param mixed $oldValue * @param mixed $value * * @return Result * @throws Main\ArgumentOutOfRangeException * @throws Main\NotSupportedException * @throws Main\ObjectNotFoundException * @throws \Exception */ protected function onFieldModify($name, $oldValue, $value) { $result = new Result(); /** @var ShipmentItemCollection $shipmentItemCollection */ if (!$shipmentItemCollection = $this->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!$shipment = $shipmentItemCollection->getShipment()) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentCollection $shipmentCollection */ if (!$shipmentCollection = $shipment->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Order $order */ if (!$order = $shipmentCollection->getOrder()) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if ($shipment->isShipped()) { $result = new Result(); $result->addError(new ResultError(Loc::getMessage('SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT'), 'SALE_SHIPMENT_ITEM_SHIPMENT_ALREADY_SHIPPED_CANNOT_EDIT')); return $result; } if ($name == "QUANTITY") { /** @var BasketItem $basketItem */ if (!$basketItem = $this->getBasketItem()) { if ($value != 0) { throw new Main\ObjectNotFoundException('Entity "BasketItem" not found'); } } $deltaQuantity = $value - $oldValue; if ($basketItem && $deltaQuantity > 0) { /** @var ShipmentCollection $shipmentCollection */ if (!$shipmentCollection = $shipment->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Shipment $systemShipment */ if (!$systemShipment = $shipmentCollection->getSystemShipment()) { throw new Main\ObjectNotFoundException('Entity "System Shipment" not found'); } $systemBasketItemQuantity = $systemShipment->getBasketItemQuantity($basketItem); if ($systemBasketItemQuantity < abs($deltaQuantity)) { $errorBasketCode = $basketItem->getBasketCode(); if ($basketItem->isBundleChild()) { /** @var BasketItem $parentBasketItem */ if (!($parentBasketItem = $basketItem->getParentBasketItem())) { throw new Main\ObjectNotFoundException('Entity "Parent Basket Item" not found'); } $errorBasketCode = $parentBasketItem->getBasketCode(); } if (isset(static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'])) { static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] += $basketItem->getQuantity(); } else { $result->addError( new ResultError( Loc::getMessage( 'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY', array( '#PRODUCT_NAME#' => $basketItem->getField('NAME'), ) ), 'SALE_SHIPMENT_ITEM_LESS_AVAILABLE_QUANTITY' ) ); static::$errors[$errorBasketCode][$basketItem->getField('ORDER_DELIVERY_BASKET_ID')]['STORE_QUANTITY_LARGER_ALLOWED'] = $basketItem->getQuantity(); } return $result; } } if ($basketItem) { if (!$this->isMathActionOnly()) { $r = $this->calculateDelivery(); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); } } } /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */ if (!$shipmentItemStoreCollection = $this->getShipmentItemStoreCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemStoreCollection" not found'); } if ($value == 0) { $basketItemName = Loc::getMessage("SALE_SHIPMENT_ITEM_BASKET_WRONG_BASKET_ITEM"); $basketItemProductId = '1'; if ($basketItem) { $basketItemName = $basketItem->getField('NAME'); $basketItemProductId = $basketItem->getProductId(); } OrderHistory::addAction( 'SHIPMENT', $order->getId(), 'SHIPMENT_ITEM_BASKET_REMOVED', $shipment->getId(), null, array( 'NAME' => $basketItemName, 'PRODUCT_ID' => $basketItemProductId, ) ); /** @var ShipmentItemStore $shipmentItemStore */ foreach ($shipmentItemStoreCollection as $shipmentItemStore) { $shipmentItemStore->delete(); } } elseif (!$basketItem->isBundleParent()) { // check barcodes $r = $shipmentItemStoreCollection->onShipmentItemModify(EventActions::UPDATE, $this, $name, $oldValue, $value); if (!$r->isSuccess()) { $result->addErrors($r->getErrors()); return $result; } $barcodeQuantity = $shipmentItemStoreCollection->getQuantityByBasketCode($basketItem->getBasketCode()); if ($barcodeQuantity > $value) { $result->addError( new ResultError( Loc::getMessage('SALE_SHIPMENT_ITEM_BARCODE_MORE_ITEM_QUANTITY'), 'BARCODE_MORE_ITEM_QUANTITY' ) ); return $result; } } if (!$basketItem) { return $result; } } return parent::onFieldModify($name, $oldValue, $value); } /** * @param float $quantity * @return Result * @throws Main\ArgumentOutOfRangeException * @throws Main\ArgumentTypeException * @throws Main\NotSupportedException * @throws \Exception */ public function setQuantity($quantity) { if (!is_numeric($quantity)) throw new Main\ArgumentTypeException("quantity"); return $this->setField('QUANTITY', (float)$quantity); } /** * @return float */ public function getReservedQuantity() { return floatval($this->getField('RESERVED_QUANTITY')); } /** * @return int */ public function getBasketId() { return $this->getField('BASKET_ID'); } /** * @return int * @throws Main\SystemException */ public function getBasketCode() { if ($basketItem = $this->getBasketItem()) { return $basketItem->getBasketCode(); } return null; } /** * @return int * @throws Main\SystemException */ public function getProductId() { $basketItem = $this->getBasketItem(); if ($basketItem) { return $basketItem->getProductId(); } return null; } /** * @return Entity\AddResult|Entity\UpdateResult * @throws Main\ArgumentOutOfRangeException * @throws Main\ObjectNotFoundException * @throws \Exception */ public function save() { $result = new Result(); $id = $this->getId(); $fields = $this->fields->getValues(); if (self::$eventClassName === null) { self::$eventClassName = static::getEntityEventName(); } /** @var ShipmentItemCollection $shipmentItemCollection */ if (!$shipmentItemCollection = $this->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!$shipment = $shipmentItemCollection->getShipment()) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentCollection $shipmentCollection */ if (!$shipmentCollection = $shipment->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Order $order */ if (!$order = $shipmentCollection->getOrder()) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } if ($this->isChanged() && self::$eventClassName) { /** @var Main\Entity\Event $event */ $event = new Main\Event('sale', 'OnBefore'.self::$eventClassName.'EntitySaved', array( 'ENTITY' => $this, 'VALUES' => $this->fields->getOriginalValues() )); $event->send(); } if ($id > 0) { $fields = $this->fields->getChangedValues(); if (!empty($fields) && is_array($fields)) { /** @var ShipmentItemCollection $shipmentItemCollection */ if (!$shipmentItemCollection = $this->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!$shipment = $shipmentItemCollection->getShipment()) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } if (!$shipment->isSystem()) { if (isset($fields["QUANTITY"]) && (floatval($fields["QUANTITY"]) == 0)) return $result; } //$fields['DATE_UPDATE'] = new Main\Type\DateTime(); $r = Internals\ShipmentItemTable::update($id, $fields); if (!$r->isSuccess()) { OrderHistory::addAction( 'SHIPMENT', $order->getId(), 'SHIPMENT_ITEM_UPDATE_ERROR', $id, $this, array("ERROR" => $r->getErrorMessages()) ); $result->addErrors($r->getErrors()); return $result; } if ($resultData = $r->getData()) $result->setData($resultData); } if ($order && $order->getId() > 0) OrderHistory::collectEntityFields('SHIPMENT_ITEM_STORE', $order->getId(), $id); } else { $fields['ORDER_DELIVERY_ID'] = $this->getParentShipmentId(); $this->setFieldNoDemand('ORDER_DELIVERY_ID', $fields['ORDER_DELIVERY_ID']); $fields['DATE_INSERT'] = new Main\Type\DateTime(); $this->setFieldNoDemand('DATE_INSERT', $fields['DATE_INSERT']); $fields["BASKET_ID"] = $this->basketItem->getId(); $this->setFieldNoDemand('BASKET_ID', $fields['BASKET_ID']); if (intval($fields['BASKET_ID']) <= 0) { $error = Loc::getMessage( 'SALE_SHIPMENT_ITEM_BASKET_ITEM_ID_EMPTY', array( '#PRODUCT_NAME#' => $this->basketItem->getField('NAME') ) ); OrderHistory::addAction( 'SHIPMENT', $order->getId(), 'SHIPMENT_ITEM_BASKET_ITEM_EMPTY_ERROR', null, $this, array( "ERROR" => $error ) ); $result->addError(new ResultError($error, 'SALE_SHIPMENT_ITEM_BASKET_ITEM_ID_EMPTY')); return $result; } if (!isset($fields["QUANTITY"]) || (floatval($fields["QUANTITY"]) == 0)) return $result; if (!isset($fields['RESERVED_QUANTITY'])) { $fields['RESERVED_QUANTITY'] = $this->getReservedQuantity() === null ? 0 : $this->getReservedQuantity(); $this->setFieldNoDemand('RESERVED_QUANTITY', $fields['RESERVED_QUANTITY']); } $r = Internals\ShipmentItemTable::add($fields); if (!$r->isSuccess()) { OrderHistory::addAction( 'SHIPMENT', $order->getId(), 'SHIPMENT_ITEM_ADD_ERROR', null, $this, array("ERROR" => $r->getErrorMessages()) ); $result->addErrors($r->getErrors()); return $result; } if ($resultData = $r->getData()) $result->setData($resultData); $id = $r->getId(); $this->setFieldNoDemand('ID', $id); if (!$shipment->isSystem()) { OrderHistory::addAction( 'SHIPMENT', $order->getId(), 'SHIPMENT_ITEM_BASKET_ADDED', $shipment->getId(), $this->basketItem, array( 'QUANTITY' => $this->getQuantity(), ) ); } } if ($id > 0) { $result->setId($id); } if ($this->isChanged() && self::$eventClassName) { /** @var Main\Event $event */ $event = new Main\Event('sale', 'On'.self::$eventClassName.'EntitySaved', array( 'ENTITY' => $this, 'VALUES' => $this->fields->getOriginalValues(), )); $event->send(); } $shipmentItemStoreCollection = $this->getShipmentItemStoreCollection(); $r = $shipmentItemStoreCollection->save(); if (!$r->isSuccess()) $result->addErrors($r->getErrors()); if ($result->isSuccess()) { OrderHistory::collectEntityFields('SHIPMENT_ITEM', $order->getId(), $id); } return $result; } private function getParentShipmentId() { /** @var ShipmentItemCollection $collection */ $collection = $this->getCollection(); $shipment = $collection->getShipment(); return $shipment->getId(); } /** * @param $id * @return array * @throws Main\ArgumentException * @throws Main\ArgumentNullException */ public static function loadForShipment($id) { if (intval($id) <= 0) throw new Main\ArgumentNullException("id"); $items = array(); $itemDataList = Internals\ShipmentItemTable::getList( array( 'filter' => array('ORDER_DELIVERY_ID' => $id), 'order' => array('DATE_INSERT' => 'ASC', 'ID' => 'ASC') ) ); while ($itemData = $itemDataList->fetch()) $items[] = static::createShipmentItemObject($itemData); return $items; } /** * @param $itemData * @return ShipmentItem */ protected static function createShipmentItemObject(array $itemData = array()) { $registry = Registry::getInstance(Registry::REGISTRY_TYPE_ORDER); $shipmentItemClassName = $registry->getShipmentItemClassName(); return new $shipmentItemClassName($itemData); } /** * @return Internals\CollectableEntity|bool * @throws Main\ObjectNotFoundException */ protected function loadBasketItem() { /** @var ShipmentItemCollection $collection */ $collection = $this->getCollection(); /** @var Shipment $shipment */ if (!$shipment = $collection->getShipment()) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } /** @var ShipmentCollection $shipmentCollection */ if (!$shipmentCollection = $shipment->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } /** @var Order $order */ if (!$order = $shipmentCollection->getOrder()) { throw new Main\ObjectNotFoundException('Entity "Order" not found'); } /** @var Basket $basket */ if (!$basket = $order->getBasket()) { throw new Main\ObjectNotFoundException('Entity "Basket" not found'); } // [performance] // new ShipmentItem binds BasketItem on initialization // here we find BasketItem for already saved ShipmentItem (his ID is equal to CODE) return $basket->getItemByBasketCode($this->getBasketId()); } /** * @return BasketItem */ public function getBasketItem() { if ($this->basketItem == null) { $this->basketItem = $this->loadBasketItem(); } return $this->basketItem; } /** * @return ShipmentItemStoreCollection */ public function getShipmentItemStoreCollection() { if (empty($this->shipmentItemStoreCollection)) { $this->shipmentItemStoreCollection = ShipmentItemStoreCollection::load($this); } return $this->shipmentItemStoreCollection; } /** * @param $action * @param BasketItem $basketItem * @param null $name * @param null $oldValue * @param null $value * * @return bool * @throws Main\NotSupportedException * @throws Main\ObjectNotFoundException */ 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 = Internals\Catalog\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; } } /** * @return Result * @throws Main\NotSupportedException */ protected function calculateDelivery() { $result = new Result(); /** @var ShipmentItemCollection $collection */ $collection = $this->getCollection(); /** @var Shipment $shipment */ $shipment = $collection->getShipment(); /** @var ShipmentCollection $shipmentCollection */ $shipmentCollection = $shipment->getCollection(); /** @var Order $order */ $order = $shipmentCollection->getOrder(); if ($order->getId() > 0) { return $result; } $deliveryCalculate = $shipment->calculateDelivery(); if (!$deliveryCalculate->isSuccess()) { $result->addErrors($deliveryCalculate->getErrors()); } if ($deliveryCalculate->getPrice() > 0) { $shipment->setField('BASE_PRICE_DELIVERY', $deliveryCalculate->getPrice()); } return $result; } /** * @param string $name * @param null|string $oldValue * @param null|string $value * @throws Main\ObjectNotFoundException */ protected function addChangesToHistory($name, $oldValue = null, $value = null) { if ($this->getId() > 0) { /** @var ShipmentItemCollection $shipmentItemCollection */ if (!$shipmentItemCollection = $this->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!$shipment = $shipmentItemCollection->getShipment()) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } if ($shipment->isSystem()) return; /** @var ShipmentCollection $shipmentCollection */ if (!$shipmentCollection = $shipment->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentCollection" not found'); } $historyFields = array(); /** @var BasketItem $basketItem */ if ($basketItem = $this->getBasketItem()) { $historyFields = array( 'NAME' => $basketItem->getField('NAME'), 'PRODUCT_ID' => $basketItem->getField('PRODUCT_ID'), ); } /** @var Order $order */ if (($order = $shipmentCollection->getOrder()) && $order->getId() > 0) { OrderHistory::addField( 'SHIPMENT_ITEM', $order->getId(), $name, $oldValue, $value, $this->getId(), $this, $historyFields ); } } } /** * @return bool */ public function isChanged() { if (parent::isChanged()) { return true; } /** @var ShipmentItemStoreCollection $shipmentItemCollection */ if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection()) { if ($shipmentItemStoreCollection->isChanged()) { return true; } } return false; } /** * @throws Main\ArgumentOutOfRangeException * @throws Main\NotSupportedException * @throws \Exception */ public function tryReserve() { return Internals\Catalog\Provider::tryReserveShipmentItem($this); } /** * @throws Main\ArgumentOutOfRangeException * @throws Main\NotSupportedException * @throws \Exception */ public function tryUnreserve() { return Internals\Catalog\Provider::tryUnreserveShipmentItem($this); } /** * @return Result * @throws Main\ObjectNotFoundException */ public function verify() { $result = new Result(); /** @var ShipmentItemCollection $shipmentItemCollection */ if (!$shipmentItemCollection = $this->getCollection()) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ if (!$shipment = $shipmentItemCollection->getShipment()) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } if (!$basketItem = $this->getBasketItem()) { $result->addError( new ResultError( Loc::getMessage( 'SALE_SHIPMENT_ITEM_BASKET_ITEM_NOT_FOUND', array( '#BASKET_ITEM_ID#' => $this->getBasketId(), '#SHIPMENT_ID#' => $shipment->getId(), '#SHIPMENT_ITEM_ID#' => $this->getId(), ) ), 'SALE_SHIPMENT_ITEM_BASKET_ITEM_NOT_FOUND' ) ); } return $result; } /** * @param array $filter * * @return Main\DB\Result * @throws Main\ArgumentException */ public static function getList(array $filter) { return Internals\ShipmentItemTable::getList($filter); } /** * @internal * @param \SplObjectStorage $cloneEntity * * @return ShipmentItem */ public function createClone(\SplObjectStorage $cloneEntity) { if ($this->isClone() && $cloneEntity->contains($this)) { return $cloneEntity[$this]; } $shipmentItemClone = clone $this; $shipmentItemClone->isClone = true; /** @var Internals\Fields $fields */ if ($fields = $this->fields) { $shipmentItemClone->fields = $fields->createClone($cloneEntity); } if (!$cloneEntity->contains($this)) { $cloneEntity[$this] = $shipmentItemClone; } /** @var BasketItem $basketItem */ if ($basketItem = $this->getBasketItem()) { if (!$cloneEntity->contains($basketItem)) { $cloneEntity[$basketItem] = $basketItem->createClone($cloneEntity); } if ($cloneEntity->contains($basketItem)) { $shipmentItemClone->basketItem = $cloneEntity[$basketItem]; } } /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */ if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection()) { if (!$cloneEntity->contains($shipmentItemStoreCollection)) { $cloneEntity[$shipmentItemStoreCollection] = $shipmentItemStoreCollection->createClone($cloneEntity); } if ($cloneEntity->contains($shipmentItemStoreCollection)) { $shipmentItemClone->shipmentItemStoreCollection = $cloneEntity[$shipmentItemStoreCollection]; } } if ($collection = $this->getCollection()) { if (!$cloneEntity->contains($collection)) { $cloneEntity[$collection] = $collection->createClone($cloneEntity); } if ($cloneEntity->contains($collection)) { $shipmentItemClone->collection = $cloneEntity[$collection]; } } return $shipmentItemClone; } /** * @param $value * * @return string */ public function getErrorEntity($value) { static $className = null; $errorsList = static::getAutoFixErrorsList(); if (is_array($errorsList) && in_array($value, $errorsList)) { if ($className === null) $className = static::getClassName(); } else { /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */ if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection()) { $className = $shipmentItemStoreCollection->getErrorEntity($value); } } return $className; } /** * @param $value * * @return bool */ public function canAutoFixError($value) { $autoFix = false; $errorsList = static::getAutoFixErrorsList(); if (is_array($errorsList) && in_array($value, $errorsList)) { $autoFix = true; } else { /** @var ShipmentItemStoreCollection $shipmentItemStoreCollection */ if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection()) { $autoFix = $shipmentItemStoreCollection->canAutoFixError($value); } } return $autoFix; } /** * @return array */ public function getAutoFixErrorsList() { return array(); } /** * @param $code * * @return Result */ public function tryFixError($code) { return new Result(); } public function canMarked() { return false; } public function getMarkField() { return null; } /** * @internal */ public function clearChanged() { if ($shipmentItemStoreCollection = $this->getShipmentItemStoreCollection()) { foreach ($shipmentItemStoreCollection as $shipmentItemStore) { $shipmentItemStore->clearChanged(); } } } /** * @return bool * @throws Main\ObjectNotFoundException */ public function needReserve() { $changedFields = $this->fields->getChangedValues(); /** @var ShipmentItemCollection $shipmentItemCollection */ $shipmentItemCollection = $this->getCollection(); if (!$shipmentItemCollection) { throw new Main\ObjectNotFoundException('Entity "ShipmentItemCollection" not found'); } /** @var Shipment $shipment */ $shipment = $shipmentItemCollection->getShipment(); if (!$shipment) { throw new Main\ObjectNotFoundException('Entity "Shipment" not found'); } return array_key_exists('RESERVED_QUANTITY', $changedFields) || $shipment->getField('RESERVED') == 'Y'; } /** * @return float */ public function getNeedReserveQuantity() { if (!$this->needReserve()) return 0; $changedFields = $this->fields->getChangedValues(); $originalFields = $this->fields->getOriginalValues(); return $changedFields['RESERVED_QUANTITY'] - $originalFields['RESERVED_QUANTITY']; } }