/bitrix/modules/sale/lib/exchange/onec/importcriterion.php

https://gitlab.com/neuser/bitrix-core · PHP · 359 lines · 236 code · 46 blank · 77 comment · 47 complexity · b05490e64aeab5a42b592b954d5fb4ce MD5 · raw file

  1. <?php
  2. namespace Bitrix\Sale\Exchange\OneC;
  3. use Bitrix\Main;
  4. use Bitrix\Sale;
  5. use Bitrix\Sale\Exchange;
  6. class ImportCriterionBase
  7. implements Exchange\ICriterion
  8. {
  9. use Exchange\BaseTrait;
  10. protected $entity = null;
  11. /**
  12. * @return null|Sale\Internals\CollectableEntity $entity
  13. */
  14. public function getEntity()
  15. {
  16. return $this->entity;
  17. }
  18. /**
  19. * @param $entity
  20. */
  21. public function setEntity($entity = null)
  22. {
  23. $this->entity = $entity;
  24. }
  25. /**
  26. * @param $entityTypeId
  27. * @param $entity
  28. * @return static
  29. * @throws Main\ArgumentException
  30. * @throws Main\NotImplementedException
  31. */
  32. public static function getCurrent($entityTypeId, $entity)
  33. {
  34. if(!Exchange\EntityType::IsDefined($entityTypeId))
  35. {
  36. throw new Main\ArgumentOutOfRangeException('Is not defined', Exchange\EntityType::FIRST, Exchange\EntityType::LAST);
  37. }
  38. /** @var ImportCriterionBase $criterion */
  39. $criterion = new static();
  40. $criterion->setEntity($entity);
  41. return $criterion;
  42. }
  43. /**
  44. * @param array $fields
  45. * @return bool
  46. */
  47. public function equals(array $fields)
  48. {
  49. return true;
  50. }
  51. protected function getParentTypeId()
  52. {
  53. return Exchange\EntityType::ORDER;
  54. }
  55. protected function getShipmentTypeId()
  56. {
  57. return Exchange\EntityType::SHIPMENT;
  58. }
  59. }
  60. class ImportCriterionOneCCml2 extends ImportCriterionBase
  61. {
  62. /**
  63. * @param array $fields
  64. * @return bool
  65. */
  66. public function equals(array $fields)
  67. {
  68. /** @var Sale\Internals\CollectableEntity $entity */
  69. $entity = $this->getEntity();
  70. if(empty($entity))
  71. {
  72. return true;
  73. }
  74. if(($entity->getField('VERSION_1C') != $fields['VERSION_1C']) ||
  75. ($entity->getField('VERSION_1C') == '' || $fields['VERSION_1C'] == '')
  76. )
  77. {
  78. return true;
  79. }
  80. return false;
  81. }
  82. }
  83. class CriterionOrder extends ImportCriterionOneCCml2
  84. implements Exchange\ICriterionOrder
  85. {
  86. /**
  87. * @param Sale\BasketItem $basketItem
  88. * @param array $fields
  89. * @return bool
  90. */
  91. public function equalsBasketItemTax(Sale\BasketItem $basketItem, array $fields)
  92. {
  93. if($fields['TAX']['VAT_RATE'] != $basketItem->getVatRate()
  94. || $fields['TAX']['VAT_INCLUDED']<>$basketItem->getField('VAT_INCLUDED'))
  95. {
  96. return true;
  97. }
  98. return false;
  99. }
  100. /**
  101. * @param Sale\BasketItem $basketItem
  102. * @param array $fields
  103. * @return bool
  104. */
  105. public function equalsBasketItem(Sale\BasketItem $basketItem, array $fields)
  106. {
  107. if($fields['QUANTITY'] != $basketItem->getQuantity() ||
  108. $fields['PRICE'] != $basketItem->getPrice() ||
  109. $fields['VAT_RATE'] != $basketItem->getVatRate() ||
  110. $fields['DISCOUNT_PRICE'] != $basketItem->getDiscountPrice())
  111. {
  112. return true;
  113. }
  114. return false;
  115. }
  116. /**
  117. * @param Sale\BasketItem $basketItem
  118. * @param array $fields
  119. * @return bool
  120. */
  121. public function equalsBasketItemDiscount(Sale\BasketItem $basketItem, array $fields)
  122. {
  123. if($fields['DISCOUNT']['PRICE'] != $basketItem->getDiscountPrice() && intval($fields['DISCOUNT']['PRICE'])>0)
  124. {
  125. return true;
  126. }
  127. return false;
  128. }
  129. /**
  130. * @param Sale\Order|null $entity
  131. * @throws Main\ArgumentException
  132. */
  133. public function setEntity($entity = null)
  134. {
  135. if(!empty($entity) && !($entity instanceof Sale\Order))
  136. throw new Main\ArgumentException("Entity must be instanceof Order");
  137. parent::setEntity($entity);
  138. }
  139. }
  140. class CriterionShipment extends ImportCriterionOneCCml2
  141. {
  142. /**
  143. * @param Sale\Shipment $entity
  144. * @throws Main\ArgumentException
  145. */
  146. public function setEntity($entity = null)
  147. {
  148. if(!empty($entity) && !($entity instanceof Sale\Shipment))
  149. throw new Main\ArgumentException("Entity must be instanceof Shipment");
  150. parent::setEntity($entity);
  151. }
  152. /**
  153. * @param array $fields
  154. * @return bool
  155. */
  156. public function equals(array $fields)
  157. {
  158. /** @var Sale\Shipment $entity */
  159. $entity = $this->getEntity();
  160. if(empty($entity))
  161. {
  162. return true;
  163. }
  164. $bBasketItemsMatch = true;
  165. $basketItemsIndexList = array();
  166. $fieldsItemsIndexList = array();
  167. /** @var Exchange\Entity\OrderImport $parentImport */
  168. $parentImport = $this->entityFactoryCreate($this->getParentTypeId());
  169. /** @var Exchange\Entity\ShipmentImport $shipmentImport */
  170. $shipmentImport = $this->entityFactoryCreate($this->getShipmentTypeId());
  171. $basketItems = $parentImport::getGroupItemsBasketFields($fields['ITEMS']);
  172. if(count($basketItems)<=0)
  173. {
  174. return true;
  175. }
  176. /** @var Sale\ShipmentCollection $shipmentCollection */
  177. $shipmentCollection = $entity->getCollection();
  178. $order = $shipmentCollection->getOrder();
  179. $basket = $order->getBasket();
  180. /** @var Sale\BasketItem $basketItem */
  181. foreach ($basket as $basketItem)
  182. {
  183. if($entity->isExistBasketItem($basketItem))
  184. {
  185. $quantity = $entity->getBasketItemQuantity($basketItem);
  186. if($quantity>0)
  187. {
  188. $basketItemsIndexList[$basketItem->getId()] = $quantity;
  189. }
  190. }
  191. }
  192. foreach($basketItems as $items)
  193. {
  194. foreach($items as $productXML_ID => $item)
  195. {
  196. if($basketItem = $parentImport::getBasketItemByItem($basket, $item))
  197. {
  198. $fieldsItemsIndexList[$basketItem->getId()] = $item['QUANTITY'];
  199. }
  200. }
  201. }
  202. if(count($basketItemsIndexList)<>count($fieldsItemsIndexList))
  203. {
  204. $bBasketItemsMatch = false;
  205. }
  206. else
  207. {
  208. foreach ($basketItemsIndexList as $basketId=>$quantity)
  209. {
  210. if(isset($fieldsItemsIndexList[$basketId]) && $fieldsItemsIndexList[$basketId] == $quantity)
  211. unset($fieldsItemsIndexList[$basketId]);
  212. }
  213. if(count($fieldsItemsIndexList)>0)
  214. $bBasketItemsMatch = false;
  215. }
  216. $itemDeliveryService = $shipmentImport::getFieldsDeliveryService($fields);
  217. if($bBasketItemsMatch &&
  218. ($entity->isShipped()? $fields['DEDUCTED']=='Y':true) &&
  219. $entity->getPrice() == $itemDeliveryService['PRICE']
  220. )
  221. {
  222. return false;
  223. }
  224. else
  225. {
  226. return true;
  227. }
  228. }
  229. }
  230. class CriterionShipmentInvoice extends CriterionShipment
  231. {
  232. protected function getParentTypeId()
  233. {
  234. return Exchange\EntityType::INVOICE;
  235. }
  236. protected function getShipmentTypeId()
  237. {
  238. return Exchange\EntityType::INVOICE_SHIPMENT;
  239. }
  240. }
  241. class CriterionPayment extends ImportCriterionOneCCml2
  242. {
  243. /**
  244. * @param Sale\Payment|null $entity
  245. * @throws Main\ArgumentException
  246. */
  247. public function setEntity($entity = null)
  248. {
  249. if(!empty($entity) && !($entity instanceof Sale\Payment))
  250. throw new Main\ArgumentException("Entity must be instanceof Payment");
  251. parent::setEntity($entity);
  252. }
  253. /**
  254. * @param array $fields
  255. * @return bool
  256. */
  257. public function equals(array $fields)
  258. {
  259. /** @var Sale\Payment $entity */
  260. $entity = $this->getEntity();
  261. if(empty($entity))
  262. {
  263. return true;
  264. }
  265. if(($entity->isPaid()? $fields['PAID']=='Y':true) &&
  266. $entity->getSum() == $fields['SUM']
  267. )
  268. {
  269. return false;
  270. }
  271. else
  272. {
  273. return true;
  274. }
  275. }
  276. }
  277. /**
  278. * Class CriterionProfile
  279. * @package Bitrix\Sale\Exchange\OneC
  280. * @deprecated
  281. */
  282. class CriterionProfile extends ImportCriterionOneCCml2
  283. {
  284. /**
  285. * @param array $fields
  286. * @return bool
  287. */
  288. public function equals(array $fields)
  289. {
  290. $entity = $this->getEntity();
  291. if(empty($entity))
  292. {
  293. return true;
  294. }
  295. if(($entity->getField('USER_PROFILE_VERSION') != $fields['VERSION_1C']) ||
  296. ($entity->getField('USER_PROFILE_VERSION') == '' || $fields['VERSION_1C'] == '')
  297. )
  298. {
  299. return true;
  300. }
  301. return false;
  302. }
  303. /**
  304. * @param Exchange\ProfileImport|null $entity
  305. * @throws Main\ArgumentException
  306. */
  307. public function setEntity($entity = null)
  308. {
  309. if(!empty($entity) && !($entity instanceof Exchange\ProfileImport))
  310. throw new Main\ArgumentException("Entity must be instanceof ProfileImport");
  311. parent::setEntity($entity);
  312. }
  313. }