PageRenderTime 22ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/modules/sale/lib/payableitemcollection.php

https://gitlab.com/alexprowars/bitrix
PHP | 347 lines | 198 code | 52 blank | 97 comment | 16 complexity | 881af6ec5cee5099cb7eccd2d656f530 MD5 | raw file
  1. <?php
  2. namespace Bitrix\Sale;
  3. use Bitrix\Main;
  4. Main\Localization\Loc::loadMessages(__FILE__);
  5. /**
  6. * Class PayableItemCollection
  7. * @package Bitrix\Sale
  8. */
  9. class PayableItemCollection extends Internals\EntityCollection
  10. {
  11. protected $payment;
  12. /**
  13. * @return Internals\Entity
  14. */
  15. protected function getEntityParent()
  16. {
  17. return $this->getPayment();
  18. }
  19. /**
  20. * @return Payment
  21. */
  22. public function getPayment() : Payment
  23. {
  24. return $this->payment;
  25. }
  26. /**
  27. * @return PayableItemCollection
  28. * @throws Main\ArgumentException
  29. * @throws Main\SystemException
  30. */
  31. protected static function createCollectionObject()
  32. {
  33. $registry = Registry::getInstance(static::getRegistryType());
  34. $className = $registry->get(Registry::ENTITY_PAYABLE_ITEM_COLLECTION);
  35. return new $className();
  36. }
  37. /**
  38. * @return string
  39. */
  40. public static function getRegistryType()
  41. {
  42. return Registry::REGISTRY_TYPE_ORDER;
  43. }
  44. /**
  45. * @param Payment $payment
  46. */
  47. public function setPayment(Payment $payment)
  48. {
  49. $this->payment = $payment;
  50. }
  51. /**
  52. * @param Payment $payment
  53. * @return PayableItemCollection
  54. * @throws Main\ArgumentException
  55. * @throws Main\ArgumentTypeException
  56. * @throws Main\SystemException
  57. */
  58. public static function load(Payment $payment)
  59. {
  60. $collection = static::createCollectionObject();
  61. $collection->setPayment($payment);
  62. if ($payment->getId() > 0)
  63. {
  64. $registry = Registry::getInstance(static::getRegistryType());
  65. /** @var PayableItem $entity */
  66. $entity = $registry->get(Registry::ENTITY_PAYABLE_SHIPMENT);
  67. $items = $entity::loadForPayment($payment->getId());
  68. foreach ($items as $item)
  69. {
  70. $item->setCollection($collection);
  71. $collection->addItem($item);
  72. }
  73. /** @var PayableItem $entity */
  74. $entity = $registry->get(Registry::ENTITY_PAYABLE_BASKET_ITEM);
  75. $items = $entity::loadForPayment($payment->getId());
  76. foreach ($items as $item)
  77. {
  78. $item->setCollection($collection);
  79. $collection->addItem($item);
  80. }
  81. }
  82. return $collection;
  83. }
  84. /**
  85. * @param array $parameters
  86. * @return Main\ORM\Query\Result
  87. * @throws Main\ArgumentException
  88. * @throws Main\ObjectPropertyException
  89. * @throws Main\SystemException
  90. */
  91. public static function getList(array $parameters = array())
  92. {
  93. return Internals\PayableItemTable::getList($parameters);
  94. }
  95. protected function addItem(Internals\CollectableEntity $item)
  96. {
  97. if (!$item instanceof PayableItem)
  98. {
  99. throw new Main\SystemException(
  100. Main\Localization\Loc::getMessage(
  101. 'SALE_PAYABLE_ITEM_COLLECTION_INCOMPATIBLE_ITEM_TYPE',
  102. ['#CLASS#' => PayableItem::class]
  103. )
  104. );
  105. }
  106. return parent::addItem($item);
  107. }
  108. /**
  109. * @param BasketItem $basketItem
  110. * @return PayableBasketItem
  111. * @throws Main\ArgumentException
  112. * @throws Main\ArgumentNullException
  113. * @throws Main\ArgumentOutOfRangeException
  114. * @throws Main\ArgumentTypeException
  115. * @throws Main\SystemException
  116. */
  117. public function createItemByBasketItem(BasketItem $basketItem) : PayableBasketItem
  118. {
  119. /** @var PayableBasketItem $item */
  120. foreach ($this->getBasketItems() as $item)
  121. {
  122. $payableBasketItem = $item->getEntityObject();
  123. if (
  124. $payableBasketItem
  125. && $basketItem->getBasketCode() === $payableBasketItem->getBasketCode())
  126. {
  127. return $item;
  128. }
  129. }
  130. $registry = Registry::getInstance(static::getRegistryType());
  131. /** @var PayableBasketItem $payableItemClass */
  132. $payableItemClass = $registry->get(Registry::ENTITY_PAYABLE_BASKET_ITEM);
  133. /** @var PayableBasketItem $payableItem */
  134. $payableItem = $payableItemClass::create($this, $basketItem);
  135. $this->addItem($payableItem);
  136. return $payableItem;
  137. }
  138. public function onBeforeBasketItemDelete(BasketItem $basketItem)
  139. {
  140. $result = new Result();
  141. /** @var PayableBasketItem $item */
  142. foreach ($this->getBasketItems() as $item)
  143. {
  144. /** @var BasketItem $entity */
  145. $entity = $item->getEntityObject();
  146. if ($entity->getBasketCode() === $basketItem->getBasketCode())
  147. {
  148. $r = $item->delete();
  149. if (!$r->isSuccess())
  150. {
  151. $result->addErrors($r->getErrors());
  152. }
  153. }
  154. }
  155. return $result;
  156. }
  157. /**
  158. * @param Shipment $shipment
  159. * @return PayableShipmentItem
  160. * @throws Main\ArgumentException
  161. * @throws Main\ArgumentOutOfRangeException
  162. * @throws Main\ArgumentTypeException
  163. * @throws Main\SystemException
  164. */
  165. public function createItemByShipment(Shipment $shipment) : PayableShipmentItem
  166. {
  167. /** @var PayableShipmentItem $item */
  168. foreach ($this->getShipments() as $item)
  169. {
  170. if ($shipment->getInternalIndex() === $item->getEntityObject()->getInternalIndex())
  171. {
  172. return $item;
  173. }
  174. }
  175. $registry = Registry::getInstance(static::getRegistryType());
  176. /** @var PayableShipmentItem $payableItemClass */
  177. $payableItemClass = $registry->get(Registry::ENTITY_PAYABLE_SHIPMENT);
  178. /** @var PayableShipmentItem $payableItem */
  179. $payableItem = $payableItemClass::create($this, $shipment);
  180. $this->addItem($payableItem);
  181. return $payableItem;
  182. }
  183. /**
  184. * @return Internals\CollectionFilterIterator
  185. */
  186. public function getBasketItems() : Internals\CollectionFilterIterator
  187. {
  188. $callback = function (PayableItem $entity)
  189. {
  190. return $entity instanceof PayableBasketItem;
  191. };
  192. return new Internals\CollectionFilterIterator($this->getIterator(), $callback);
  193. }
  194. /**
  195. * @return Internals\CollectionFilterIterator
  196. */
  197. public function getShipments() : Internals\CollectionFilterIterator
  198. {
  199. $callback = function (PayableItem $entity)
  200. {
  201. return $entity instanceof PayableShipmentItem;
  202. };
  203. return new Internals\CollectionFilterIterator($this->getIterator(), $callback);
  204. }
  205. /**
  206. * @return Result
  207. * @throws Main\ArgumentException
  208. * @throws Main\ObjectPropertyException
  209. * @throws Main\SystemException
  210. * @throws \Exception
  211. */
  212. public function save()
  213. {
  214. $result = new Result();
  215. $dbRes = static::getList([
  216. 'filter' => ['PAYMENT_ID' => $this->getPayment()->getId()]
  217. ]);
  218. while ($item = $dbRes->fetch())
  219. {
  220. if (!$this->getItemById($item['ID']))
  221. {
  222. static::deleteInternal($item['ID']);
  223. }
  224. }
  225. /** @var PayableItem $entity */
  226. foreach ($this->collection as $entity)
  227. {
  228. $r = $entity->save();
  229. if (!$r->isSuccess())
  230. {
  231. $result->addErrors($r->getErrors());
  232. }
  233. }
  234. $this->clearChanged();
  235. return $result;
  236. }
  237. /**
  238. * @param $paymentId
  239. * @return Result
  240. * @throws Main\ArgumentException
  241. * @throws Main\ObjectPropertyException
  242. * @throws Main\SystemException
  243. *@internal
  244. *
  245. */
  246. public static function deleteNoDemand($paymentId)
  247. {
  248. $result = new Result();
  249. $dbRes = static::getList([
  250. "filter" => ["=PAYMENT_ID" => $paymentId],
  251. "select" => ["ID"]
  252. ]);
  253. while ($entity = $dbRes->fetch())
  254. {
  255. $r = static::deleteInternal($entity['ID']);
  256. if (!$r->isSuccess())
  257. {
  258. $result->addErrors($r->getErrors());
  259. }
  260. }
  261. return $result;
  262. }
  263. /**
  264. * @param $primary
  265. * @return Main\ORM\Data\DeleteResult
  266. * @throws \Exception
  267. */
  268. protected static function deleteInternal($primary)
  269. {
  270. return Internals\PayableItemTable::delete($primary);
  271. }
  272. /**
  273. * @param \SplObjectStorage $cloneEntity
  274. *
  275. * @return PayableItemCollection
  276. * @internal
  277. */
  278. public function createClone(\SplObjectStorage $cloneEntity)
  279. {
  280. if ($this->isClone() && $cloneEntity->contains($this))
  281. {
  282. return $cloneEntity[$this];
  283. }
  284. /** @var PayableItemCollection $payableItemCollection */
  285. $payableItemCollection = parent::createClone($cloneEntity);
  286. if ($this->payment)
  287. {
  288. if ($cloneEntity->contains($this->payment))
  289. {
  290. $payableItemCollection->payment = $cloneEntity[$this->payment];
  291. }
  292. }
  293. return $payableItemCollection;
  294. }
  295. }