Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.12 KB | None | 0 0
  1. <?php
  2.  
  3. namespace Gold\Core\EventListener;
  4.  
  5. use Bitrix\Main;
  6. use Bitrix\Sale\Internals\OrderTable;
  7. use Bitrix\Sale\Internals\PaySystemActionTable;
  8. use Citfact\LifePay\Container;
  9. use Citfact\LifePay\ContainerTrait;
  10. use Citfact\LifePay\Entity\LifePayQueueTable;
  11. use Citfact\LifePay\LifePayModuleConfig;
  12. use Citfact\LifePay\Service\LifePayService;
  13. use fmsm\Reserve;
  14. use Gold\Core\Entity\ElementPropertyTable;
  15. use Gold\Core\Entity\EventTable;
  16. use Gold\Core\Manager;
  17. use Bitrix\Sale;
  18. use Gold\Core\Repository\Property;
  19. use Gold\Core\Service;
  20.  
  21. /**
  22. * Class Order
  23. * @package Gold\Core\EventListener
  24. */
  25. class Order {
  26. use ContainerTrait;
  27. /**
  28. * @var null
  29. */
  30. public static $refresh;
  31.  
  32. // is use event once
  33. /**
  34. * @var bool
  35. */
  36. public static $isMyOnBeforeSaleOrderFinalAction = false;
  37.  
  38. public static $isOnSaleOrderBeforeSaved = false;
  39.  
  40. /**
  41. * @var bool
  42. */
  43. public static $isRoundOrder = false;
  44. /**
  45. * @var bool
  46. */
  47. public static $isSendMailRoundOrder = false;
  48. private static $orders;
  49.  
  50. private static $requestOrdersId = [];
  51.  
  52. private static $event = false;
  53.  
  54. private static $onSalePayOrderOnce = false;
  55.  
  56. /**
  57. * @var array статусы, которые могут быть переведены только из определенных статусов
  58. */
  59. private static $statusesRoute = [
  60. [
  61. 'from' => ['YB'],
  62. 'to' => ['EX'],
  63. ],
  64. ];
  65.  
  66. const COMPANY_TO_ORDER_TYPE = 1;
  67.  
  68. /**
  69. * @return bool|null
  70. */
  71. public static function isRefresh() {
  72. if (self::$refresh === null) {
  73. $request = \Bitrix\Main\Application::getInstance()
  74. ->getContext()
  75. ->getRequest();
  76. self::$refresh = ($request->getPost('refresh_data_and_save') == 'Y' // кнопка "Пересчитать заказ"
  77. || $request->getPost('action') == 'addCoupons' // при добавлении купона
  78. ) ? true : false;
  79. }
  80.  
  81. return self::$refresh;
  82. }
  83.  
  84. public static function getRequestOrdersId() {
  85. if (empty(self::$requestOrdersId)) {
  86. $request = Main\Application::getInstance()
  87. ->getContext()
  88. ->getRequest();
  89.  
  90. $id = $request->get('ID');
  91.  
  92. if (!is_array($id)) {
  93. $id = [$id];
  94. }
  95.  
  96. self::$requestOrdersId = $id;
  97. }
  98.  
  99. return self::$requestOrdersId;
  100. }
  101.  
  102. /**
  103. * @param Main\Event $event
  104. * Для того, чтобы работать со скидками и купонами из админки
  105. */
  106. function onBeforeSaleOrderFinalAction(Main\Event $event) {
  107. if (self::$isMyOnBeforeSaleOrderFinalAction == true || !self::isRefresh()) {
  108. return;
  109. }
  110.  
  111. self::$isMyOnBeforeSaleOrderFinalAction = true;
  112. $order = $event->getParameter("ENTITY");
  113.  
  114. if (Service\DivideOrder::getBaseOrderId($order->getId())) {
  115. return;
  116. }
  117.  
  118. $basket = $order->getBasket();
  119. if (!$basket) {
  120. return;
  121. }
  122.  
  123. $basketItems = $basket->getBasketItems();
  124.  
  125. foreach ($basketItems as $basketItem) {
  126. $basketItem->setField('CUSTOM_PRICE', 'N');
  127. $basketItem->save();
  128. }
  129. }
  130.  
  131. public static function OnSaleOrderBeforeSaved(Main\Event $event) {
  132. if (self::$isOnSaleOrderBeforeSaved) {
  133. return;
  134. }
  135.  
  136. self::$isOnSaleOrderBeforeSaved = true;
  137.  
  138. /**
  139. * @var $order Sale\Order
  140. */
  141. $order = $event->getParameter("ENTITY");
  142. $orderOld = $event->getParameter("VALUES");
  143.  
  144. if (isset($orderOld['STATUS_ID'])) {
  145. switch ($order->getField('STATUS_ID')) {
  146. case Reserve::BOOKING_STATUS_ORDER_OUT_OF_STOCK:
  147. case Reserve::BOOKING_STATUS_ORDER:
  148. $orderProperty = Manager\Order::getPropertyValue($order);
  149.  
  150. $orderProperty['PHONE'] = phoneReplace($orderProperty['PHONE']);
  151.  
  152. if ($orderProperty['PHONE']) {
  153. $smsData = [
  154. 'ORDER_NUMBER' => $order->getId(),
  155. 'PROP_STORAGE_END_DATE' => $orderProperty['STORAGE_END_DATE'],
  156. ];
  157.  
  158. $smsTpl = 54;
  159.  
  160. if ($order->getField('STATUS_ID') == Reserve::BOOKING_STATUS_ORDER) {
  161. $smsTpl = 53;
  162.  
  163. $smsData['PROP_ADDRESS'] = $orderProperty['ADDRESS'];
  164. }
  165.  
  166. $SmsResult = \Gold\Core\Api\Zolotoy\Sms::getInstance()
  167. ->set($orderProperty['PHONE'], $smsTpl, $smsData);
  168.  
  169. if (!$SmsResult->Code) {
  170. // AddMessage2Log('', 'reserve', 0);
  171. }
  172. }
  173. break;
  174. }
  175. }
  176.  
  177. $updateCompany = false;
  178.  
  179. switch ($order->getField('STATUS_ID')) {
  180. case 'N':
  181. $updateCompany = true;
  182. break;
  183. case 'YC':
  184. case 'YD':
  185. case 'YE':
  186. if ($order->getField('PAYED') != 'Y') {
  187. $updateCompany = true;
  188. }
  189. break;
  190. }
  191.  
  192. // Смена ЮЛ при оплате
  193. if (isset($orderOld['PAYED'])) {
  194. if ($order->getField('PAYED') == 'Y' && $orderOld['PAYED'] != $order->getField('PAYED')) {
  195. $updateCompany = true;
  196. }
  197. }
  198.  
  199. if (intval($order->getField('COMPANY_ID')) < 1 && !$updateCompany) {
  200. $updateCompany = true;
  201. }
  202.  
  203. if ($updateCompany) {
  204. if (self::COMPANY_TO_ORDER_TYPE == 2) {
  205. $basket = $order->getBasket();
  206.  
  207. $products = $shops = [];
  208.  
  209. foreach ($basket->getBasketItems() as $basketItem) {
  210. $products[] = $basketItem->getField('PRODUCT_ID');
  211. }
  212.  
  213. $propertyShopId = Property::getInstance()
  214. ->getIdByCode(IBLOCK_CATALOG_OFFERS, 'SHOP');
  215.  
  216. $propertySaleCompanyId = Property::getInstance()
  217. ->getIdByCode(IBLOCK_SHOPS, 'SALE_COMPANY');
  218.  
  219. $companyResult = ElementPropertyTable::getList([
  220. 'select' => [
  221. 'COMPANY' => 'PROPERTY_SALE_COMPANY.VALUE_NUM',
  222. ],
  223. 'filter' => [
  224. '=IBLOCK_ELEMENT_ID' => $products,
  225. '=IBLOCK_PROPERTY_ID' => $propertyShopId,
  226. ],
  227. 'runtime' => [
  228. 'PROPERTY_SALE_COMPANY' => [
  229. 'data_type' => 'Gold\Core\Entity\ElementProperty',
  230. 'reference' => [
  231. '=this.VALUE_NUM' => 'ref.IBLOCK_ELEMENT_ID',
  232. '=ref.IBLOCK_PROPERTY_ID' => new Main\DB\SqlExpression('?i', intval($propertySaleCompanyId)),
  233. ],
  234. ],
  235. ],
  236. ])
  237. ->fetchAll();
  238.  
  239. $companyId = [];
  240.  
  241. if ($companyResult) {
  242. foreach ($companyResult as $companyItem) {
  243. if ($companyItem['COMPANY']) {
  244. $companyId[] = $companyItem['COMPANY'];
  245. }
  246. }
  247. }
  248.  
  249. if ($companyId) {
  250. $companyId = array_unique($companyId);
  251.  
  252. $company = Sale\Internals\CompanyTable::getRow([
  253. 'select' => [
  254. 'ID',
  255. 'UF_DATE',
  256. ],
  257. 'filter' => [
  258. '=ID' => $companyId,
  259. ],
  260. 'order' => [
  261. 'SORT' => 'DESC',
  262. ],
  263. ]);
  264. } else {
  265. $company = null;
  266. }
  267. } else {
  268. // Назначаем компанию по дате
  269. $date = new Main\Type\DateTime();
  270.  
  271. $company = Sale\Internals\CompanyTable::getRow([
  272. 'select' => [
  273. 'ID',
  274. 'UF_DATE',
  275. ],
  276. 'filter' => [
  277. '<=UF_DATE' => $date,
  278. ],
  279. 'order' => [
  280. 'UF_DATE' => 'DESC',
  281. ],
  282. ]);
  283. }
  284.  
  285. if (is_array($company)) {
  286. $order->setField('COMPANY_ID', $company['ID']);
  287. $event->addResult(new Main\EventResult(Main\EventResult::SUCCESS, $order));
  288. }
  289. }
  290. }
  291.  
  292. /**
  293. * @param Main\Event $event
  294. * @throws \Exception
  295. */
  296. function onSaleOrderSaved(Main\Event $event) {
  297. static::$orders[] = $event->getParameter("ENTITY");
  298.  
  299. if (self::$isRoundOrder === true) {
  300. return;
  301. }
  302.  
  303. self::$isRoundOrder = true;
  304.  
  305. $parameters = $event->getParameters();
  306.  
  307. /**
  308. * @var $order Sale\Order
  309. */
  310. $order = $parameters['ENTITY'];
  311.  
  312. $fields = $order->getFields()
  313. ->getValues();
  314. $oldValues = $parameters['VALUES'];
  315.  
  316. \fmsm\Reserve::OnSaleStatusOrderHandler($order, $oldValues);
  317.  
  318. if (isset($oldValues["COMPANY_ID"]) && ($fields["COMPANY_ID"] != $oldValues["COMPANY_ID"])) {
  319. \CSaleOrderChange::AddRecord($order->getId(), "ORDER_COMMENTED", ["COMMENTS" => "офис изменен с " . $oldValues["COMPANY_ID"] . " на " . $fields["COMPANY_ID"] . ""]);
  320. }
  321.  
  322. // MindBox
  323. if ($fields['STATUS_ID'] != $oldValues['STATUS_ID'] && !Service\DivideOrder::getBaseOrderId($order->getId())) {
  324. $MindBox = new \MindBox\MindBox();
  325. $MindBox->setOrder($fields);
  326. }
  327.  
  328. if (!$parameters['IS_NEW']) {
  329. /**
  330. * Количество дней доставки
  331. *
  332. * start
  333. * YC Передано в ОС Стандартный
  334. * YE Передано в ОС Срочный
  335. * YD Передано в ОС Самовывоз
  336. * ZL Передано в ОС
  337. * ZZ Пешкарики передано в ОС
  338. *
  339. * end
  340. * YB Доставлен
  341. * T Отменен
  342. *
  343. * -1
  344. * ZX Утеря
  345. * ZW Утеря оплаченного заказа
  346. * ZY Утеря возмещена
  347. */
  348. $date = new \DateTime();
  349. $dateString = $date->format('d.m.Y');
  350.  
  351. $deliveryFrom = $deliveryWorkingDays = $deliveryAllDays = null;
  352.  
  353. $propertyCollection = $order->getPropertyCollection();
  354.  
  355. foreach ($propertyCollection as $property) {
  356. switch ($property->getField("CODE")) {
  357. case 'DELIVERY_FROM':
  358. $deliveryFrom = $property;
  359. break;
  360. case 'DELIVERY_DAYS':
  361. $deliveryWorkingDays = $property;
  362. break;
  363. case 'DELIVERY_ALL_DAYS':
  364. $deliveryAllDays = $property;
  365. break;
  366. }
  367. }
  368.  
  369. switch ($fields['STATUS_ID']) {
  370. case 'YC':
  371. case 'YE':
  372. case 'YD':
  373. case 'ZL':
  374. case 'ZZ':
  375. if (is_object($deliveryFrom)) {
  376. $deliveryFrom->setValue($dateString);
  377. $deliveryFrom->save();
  378. }
  379.  
  380. if (is_object($deliveryWorkingDays)) {
  381. $deliveryWorkingDays->setValue(0);
  382. $deliveryWorkingDays->save();
  383. }
  384.  
  385. if (is_object($deliveryAllDays)) {
  386. $deliveryAllDays->setValue(0);
  387. $deliveryAllDays->save();
  388. }
  389. break;
  390. case 'YB':
  391. case 'T':
  392. $deliveryFromValue = $deliveryFrom->getValue();
  393.  
  394. $workingDays = $allDays = 0;
  395.  
  396. if (!empty($deliveryFromValue)) {
  397. $dateFrom = new \DateTime($deliveryFromValue);
  398.  
  399. $interval = new \DateInterval("P1D");
  400.  
  401. $datePeriod = new \DatePeriod($dateFrom, $interval, $date);
  402.  
  403. foreach ($datePeriod as $dateValue) {
  404. $dayOfWeek = $dateValue->format('N');
  405.  
  406. $allDays++;
  407.  
  408. if ($dayOfWeek >= 6) {
  409. continue;
  410. }
  411.  
  412. $monthDay = $dateValue->format('md');
  413.  
  414. switch ($monthDay) {
  415. case '0101':
  416. case '0102':
  417. case '0103':
  418. case '0104':
  419. case '0105':
  420. case '0106':
  421. case '0107':
  422. case '0108':
  423. case '0223':
  424. case '0308':
  425. case '0309':
  426. case '0430':
  427. case '0501':
  428. case '0502':
  429. case '0611':
  430. case '0612':
  431. case '1105':
  432. case '1231':
  433. continue(2);
  434. }
  435.  
  436. $workingDays++;
  437. }
  438. }
  439.  
  440. $deliveryWorkingDays->setValue($workingDays);
  441. $deliveryWorkingDays->save();
  442.  
  443. if (is_object($deliveryAllDays)) {
  444. $deliveryAllDays->setValue($allDays);
  445. $deliveryAllDays->save();
  446. }
  447. break;
  448. case 'ZX':
  449. case 'ZW':
  450. case 'ZY':
  451. $deliveryWorkingDays->setValue(-1);
  452. $deliveryWorkingDays->save();
  453.  
  454. if (is_object($deliveryAllDays)) {
  455. $deliveryAllDays->setValue(-1);
  456. $deliveryAllDays->save();
  457. }
  458. break;
  459. }
  460.  
  461. if ($fields['STATUS_ID'] == 'YB') {
  462. \CModule::IncludeModule('citfact.lifepay');
  463.  
  464. /**
  465. * @var LifePayService $lifePayService
  466. */
  467. $lifePayService = self::container()['lifepay_service'];
  468.  
  469. $paymentCollection = $order->getPaymentCollection();
  470.  
  471. foreach ($paymentCollection as $payment) {
  472. if ($payment->isPaid() && Manager\Payment::checkCardById($payment->getPaymentSystemId())) {
  473. $lifePayService->saveQueueItem([
  474. 'UF_ORDER_ID' => $order->getId(),
  475. 'UF_PAYMENT_ID' => $payment->getId(),
  476. 'UF_SID' => $order->getSiteId(),
  477. 'UF_SUM' => $order->getPrice(),
  478. 'UF_ORDER_STATUS' => $order->getField('STATUS_ID'),
  479. 'UF_PAY_STATUS' => LifePayQueueTable::PAY_NOT_CONFIRM,
  480. 'UF_CHECK_STATUS' => LifePayQueueTable::SEND_NOT_SEND,
  481. 'UF_GUID' => '',
  482. 'UF_PAY_AT' => '',
  483. 'UF_PAY_SUM' => '',
  484. 'UF_RRN' => '',
  485. 'UF_TYPE' => LifePayQueueTable::PAY_TYPE_FULLPAYMENT,
  486. ]);
  487.  
  488. $lifePayService->sendItemByOrder($order, $payment, LifePayQueueTable::PAY_TYPE_FULLPAYMENT, LifePayModuleConfig::PROPERTY_TYPE_FULLPAYMENT);
  489. }
  490. }
  491. }
  492. } else {
  493. $paymentCollection = $order->getPaymentCollection();
  494.  
  495. foreach ($paymentCollection as $payment) {
  496. if (!$payment->getField('COMPANY_ID') && $fields["COMPANY_ID"]) {
  497. $payment->setField('COMPANY_ID', $fields["COMPANY_ID"]);
  498. $payment->save();
  499. }
  500. }
  501. }
  502. }
  503.  
  504. public static function OnSaleStatusOrderChange($entity) {
  505. if (!self::$event) {
  506.  
  507. $value = $entity->getParameter("VALUE");
  508. $oldValue = $entity->getParameter("OLD_VALUE");
  509.  
  510. if ($value != $oldValue && $value == "YD" && $oldValue != 'ZS') {
  511. $order = $entity->getParameter("ENTITY");
  512. $basket = $order->getBasket();
  513.  
  514. $basketMes = '';
  515. \CModule::IncludeModule('iblock');
  516.  
  517. $payer = $order->getPropertyCollection()
  518. ->getProfileName()
  519. ->getValue();
  520.  
  521. foreach ($basket->getBasketItems() as $item) {
  522.  
  523. $props = $item->getPropertyCollection()
  524. ->getPropertyValues();
  525.  
  526. if (null !== $item->getField('PRODUCT_ID') && intval($item->getField('PRODUCT_ID')) > 0) {
  527. $shop = \CIBlockElement::GetList([], [
  528. 'IBLOCK_ID' => IBLOCK_CATALOG_OFFERS,
  529. "ID" => intval($item->getField('PRODUCT_ID')),
  530. ], false, false, [
  531. 'PROPERTY_SHOP',
  532. 'PROPERTY_CML2_LINK',
  533. 'PROPERTY_BARCODE',
  534. 'ID',
  535. ])
  536. ->Fetch();
  537. }
  538. if ($shop === false) {
  539. $parentId = explode('#', $props['PRODUCT.XML_ID']['VALUE']);
  540. $shop = \CIBlockElement::GetList([], [
  541. 'IBLOCK_ID' => IBLOCK_CATALOG_OFFERS,
  542. "ID" => $parentId[1],
  543. ], false, false, [
  544. 'PROPERTY_SHOP',
  545. 'PROPERTY_CML2_LINK',
  546. 'PROPERTY_BARCODE',
  547. 'ID',
  548. ])
  549. ->Fetch();
  550. }
  551.  
  552.  
  553. $kbk = \CIBlockElement::GetList([], [
  554. "ID" => $shop['PROPERTY_SHOP_VALUE'],
  555. "IBLOCK_ID" => IBLOCK_SHOPS,
  556. ], false, ['nTopCount' => 1], ["PROPERTY_KBK_CODE"])
  557. ->Fetch();
  558. $res = \CIBlockElement::getList([], [
  559. "IBLOCK_ID" => "13",
  560. "ID" => $shop['PROPERTY_CML2_LINK_VALUE'],
  561. ], false, false, ['PREVIEW_PICTURE'])
  562. ->fetch();
  563. $img = \Bitrix\Main\FileTable::getById($res['PREVIEW_PICTURE'])
  564. ->fetch();
  565.  
  566.  
  567. $basketMes .= 'Наименование товара: ' . $item->getField('NAME') . '<br/>';
  568. $basketMes .= 'ШК: ' . (null !== $shop["PROPERTY_BARCODE_VALUE"]) ? $shop["PROPERTY_BARCODE_VALUE"] : $props["BARCODE"]["VALUE"] . '<br>';
  569.  
  570. if (isset($props['SIZE'])) {
  571. $basketMes .= 'Размер: ' . $props['SIZE']["VALUE"] . '<br/>';
  572. }
  573.  
  574. $basketMes .= 'Стоимость товара по ценнику: ' . $basket->getPrice() . '<hr/>';
  575. }
  576. $fields = [
  577. 'PAYER_NAME' => $payer,
  578. 'ORDER_ID' => $order->getId(),
  579. 'BASKET' => $basketMes,
  580. 'IMG' => 'https://cs1.gold585.online/upload/' . $img['SUBDIR'] . '/' . $img['FILE_NAME'],
  581. 'MAIL_TO' => $kbk["PROPERTY_KBK_CODE_VALUE"] . '@zolotoy585.ru',
  582.  
  583. ];
  584.  
  585. \CEvent::Send("ORDER_STATUS_YD_CHANGE", 's1', $fields);
  586. }
  587.  
  588. $requestOrdersId = self::getRequestOrdersId();
  589.  
  590. EventTable::add([
  591. 'type' => 'order',
  592. 'data' => json_encode($requestOrdersId),
  593. ]);
  594.  
  595. self::$event = true;
  596. }
  597. }
  598.  
  599.  
  600. /**
  601. * @param $id
  602. * @param $status
  603. * @return bool
  604. * @throws Main\ArgumentNullException
  605. * @throws Main\NotImplementedException
  606. */
  607. public static function onSaleBeforeStatusOrder($id, $status) {
  608. global $USER;
  609. if (!$USER->IsAuthorized()) {
  610. return true;
  611. }
  612.  
  613.  
  614. if (!empty($id)) {
  615. $order = Sale\Order::load($id);
  616. $currentStatus = $order->getField('STATUS_ID');
  617.  
  618. // Никому нельзя изменять заказы в этих статусах
  619. if (in_array($currentStatus, ['NZ'])) {
  620. global $APPLICATION;
  621. $APPLICATION->throwException("Нельзя изменять заказ в статусе " . $currentStatus);
  622.  
  623. return false;
  624. }
  625.  
  626. // Можно ли изменить из текущего статуса?
  627. foreach (self::$statusesRoute as $statusRoute) {
  628. if (!in_array($status, $statusRoute['to'])) {
  629. continue;
  630. }
  631.  
  632. if (!in_array($currentStatus, $statusRoute['from'])) {
  633. global $APPLICATION;
  634. $APPLICATION->throwException("Нельзя изменить статус");
  635.  
  636. return false;
  637. }
  638. }
  639. }
  640.  
  641. $groups = Manager\User::getGroups($USER->GetID());
  642. $groupCodes = [];
  643. foreach ($groups as $group) {
  644. $groupCodes[] = $group['GROUP_CODE'];
  645. }
  646. $statuses = Manager\UserGroup::getStatusAccess($groupCodes);
  647.  
  648. if (empty($statuses)) {
  649. return true;
  650. }
  651.  
  652. if (!in_array($status, $statuses)) {
  653. global $APPLICATION;
  654. $APPLICATION->throwException("У вас недостаточно прав для выставления этого статуса");
  655.  
  656. return false;
  657. }
  658.  
  659. return true;
  660. }
  661.  
  662. /**
  663. * Отправка email клиенту после оплаты заказа картой
  664. *
  665. * @param $orderId
  666. * @param $paymentValue
  667. */
  668. public static function onSalePayOrder($orderId, $paymentValue) {
  669.  
  670. // Акция прошла
  671. return;
  672. if ($paymentValue != 'Y' && self::$onSalePayOrderOnce !== true) {
  673. return;
  674. }
  675.  
  676. self::$onSalePayOrderOnce = true;
  677.  
  678. $order = OrderTable::getRow([
  679. 'select' => [
  680. 'PAY_SYSTEM_ID',
  681. 'PROPERTY_VALUE' => 'PROPERTY.VALUE',
  682. ],
  683. 'filter' => [
  684. '=ID' => $orderId,
  685. '=PROPERTY.CODE' => 'EMAIL',
  686. ],
  687. ]);
  688.  
  689. if ($order) {
  690. if (Manager\Payment::checkCardById($order['PAY_SYSTEM_ID']) && check_email($order['PROPERTY_VALUE'])) {
  691. $eventData = [
  692. 'SITE_NAME' => '',
  693. 'SALE_EMAIL' => \COption::GetOptionString('sale', 'order_email'),
  694. 'EMAIL' => $order['PROPERTY_VALUE'],
  695. ];
  696.  
  697. $dbSite = \CSite::GetByID(SITE_ID);
  698.  
  699. if ($arSite = $dbSite->Fetch()) {
  700. $eventData['SITE_NAME'] = $arSite["NAME"];
  701. }
  702.  
  703. \CEvent::Send("SALE_NEW_ORDER_CARD", SITE_ID, $eventData);
  704. }
  705. }
  706. }
  707.  
  708. public static function onSaleCancelOrder($orderId, $value) {
  709. if ($value != 'Y') {
  710. return false;
  711. }
  712.  
  713. global $USER;
  714.  
  715. $dateTime = new Main\Type\DateTime();
  716.  
  717. // Сохраняем данные в HL блоке
  718. $saleOrderEventEntity = Manager\HlBlock::getEntityByName(Manager\HlBlock::SALE_ORDER_AGENT);
  719. $saleOrderEventEntity::add([
  720. 'UF_ORDER_ID' => $orderId,
  721. 'UF_USER_ID' => $USER->GetID(),
  722. 'UF_ADD_DATE' => $dateTime,
  723. 'UF_METHOD' => 'conversionPriceAfterOrderCancel',
  724. ]);
  725. }
  726.  
  727. private static function addItemToDetailOrderMenu(array $item, $items) {
  728. foreach ($items as &$menuItem) {
  729. if ($menuItem['TEXT'] != 'Действия') {
  730. continue;
  731. }
  732.  
  733. $menuItem['MENU'][] = $item;
  734. }
  735. unset($menuItem);
  736.  
  737. return $items;
  738. }
  739.  
  740. public static function onAdminContextMenuShow(&$items) {
  741. if (!(defined('IS_PAGE_SALE_ORDER_VIEW') || IS_PAGE_SALE_ORDER_VIEW !== true)) {
  742. return;
  743. }
  744.  
  745. $request = Main\Application::getInstance()
  746. ->getContext()
  747. ->getRequest();
  748. $orderId = (int)$request->getQuery('ID');
  749. if ($orderId <= 0) {
  750. return;
  751. }
  752. $order = Sale\Order::load($orderId);
  753. if (is_null($order)) {
  754. return;
  755. }
  756.  
  757. //Подобрать оптимальный ШК
  758. $items = self::addItemToDetailOrderMenu([
  759. 'TEXT' => 'Подобрать оптимальный ШК',
  760. 'TITLE' => 'Подобрать оптимальный ШК',
  761. 'LINK' => "javascript:if(confirm('Вы уверены, что хотите подобрать оптимальные ШК для данного заказа?')) window.location='/bitrix/admin/optimal_shk.php?ID=$orderId'",
  762. 'WARNING' => 'Y',
  763. ], $items);
  764.  
  765. // Ссылка на подзаказы
  766. if ($subordersLink = Service\DivideOrder::getSubOrdersLink($orderId)) {
  767. $items = self::addItemToDetailOrderMenu([
  768. 'TEXT' => 'Посмотреть подзаказы',
  769. 'TITLE' => 'Посмотреть подзаказы',
  770. 'LINK' => $subordersLink,
  771. ], $items);
  772.  
  773. return;
  774. }
  775.  
  776. // Ссылка на основной заказ
  777. if ($baseOrderLink = Service\DivideOrder::getBaseOrderLinkBySuborderId($orderId)) {
  778. $items = self::addItemToDetailOrderMenu([
  779. 'TEXT' => 'Посмотреть основной заказ',
  780. 'TITLE' => 'Посмотреть основной заказ',
  781. 'LINK' => $baseOrderLink,
  782. ], $items);
  783.  
  784. return;
  785. }
  786.  
  787. // Ссылка на разбивку заказа
  788. if (Service\DivideOrder::checkStatus($order)) {
  789. $items = self::addItemToDetailOrderMenu([
  790. 'TEXT' => 'Разбить на подзаказы',
  791. 'TITLE' => 'Разбить на подзаказы',
  792. 'LINK' => "javascript:if(confirm('Вы уверены, что хотите разбить этот заказ на подзаказы?')) window.location='/bitrix/admin/sale_order_divide.php?ID=$orderId'",
  793. 'WARNING' => 'Y',
  794. ], $items);
  795. }
  796. }
  797. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement