Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- namespace Gold\Core\EventListener;
- use Bitrix\Main;
- use Bitrix\Sale\Internals\OrderTable;
- use Bitrix\Sale\Internals\PaySystemActionTable;
- use Citfact\LifePay\Container;
- use Citfact\LifePay\ContainerTrait;
- use Citfact\LifePay\Entity\LifePayQueueTable;
- use Citfact\LifePay\LifePayModuleConfig;
- use Citfact\LifePay\Service\LifePayService;
- use fmsm\Reserve;
- use Gold\Core\Entity\ElementPropertyTable;
- use Gold\Core\Entity\EventTable;
- use Gold\Core\Manager;
- use Bitrix\Sale;
- use Gold\Core\Repository\Property;
- use Gold\Core\Service;
- /**
- * Class Order
- * @package Gold\Core\EventListener
- */
- class Order {
- use ContainerTrait;
- /**
- * @var null
- */
- public static $refresh;
- // is use event once
- /**
- * @var bool
- */
- public static $isMyOnBeforeSaleOrderFinalAction = false;
- public static $isOnSaleOrderBeforeSaved = false;
- /**
- * @var bool
- */
- public static $isRoundOrder = false;
- /**
- * @var bool
- */
- public static $isSendMailRoundOrder = false;
- private static $orders;
- private static $requestOrdersId = [];
- private static $event = false;
- private static $onSalePayOrderOnce = false;
- /**
- * @var array статусы, которые могут быть переведены только из определенных статусов
- */
- private static $statusesRoute = [
- [
- 'from' => ['YB'],
- 'to' => ['EX'],
- ],
- ];
- const COMPANY_TO_ORDER_TYPE = 1;
- /**
- * @return bool|null
- */
- public static function isRefresh() {
- if (self::$refresh === null) {
- $request = \Bitrix\Main\Application::getInstance()
- ->getContext()
- ->getRequest();
- self::$refresh = ($request->getPost('refresh_data_and_save') == 'Y' // кнопка "Пересчитать заказ"
- || $request->getPost('action') == 'addCoupons' // при добавлении купона
- ) ? true : false;
- }
- return self::$refresh;
- }
- public static function getRequestOrdersId() {
- if (empty(self::$requestOrdersId)) {
- $request = Main\Application::getInstance()
- ->getContext()
- ->getRequest();
- $id = $request->get('ID');
- if (!is_array($id)) {
- $id = [$id];
- }
- self::$requestOrdersId = $id;
- }
- return self::$requestOrdersId;
- }
- /**
- * @param Main\Event $event
- * Для того, чтобы работать со скидками и купонами из админки
- */
- function onBeforeSaleOrderFinalAction(Main\Event $event) {
- if (self::$isMyOnBeforeSaleOrderFinalAction == true || !self::isRefresh()) {
- return;
- }
- self::$isMyOnBeforeSaleOrderFinalAction = true;
- $order = $event->getParameter("ENTITY");
- if (Service\DivideOrder::getBaseOrderId($order->getId())) {
- return;
- }
- $basket = $order->getBasket();
- if (!$basket) {
- return;
- }
- $basketItems = $basket->getBasketItems();
- foreach ($basketItems as $basketItem) {
- $basketItem->setField('CUSTOM_PRICE', 'N');
- $basketItem->save();
- }
- }
- public static function OnSaleOrderBeforeSaved(Main\Event $event) {
- if (self::$isOnSaleOrderBeforeSaved) {
- return;
- }
- self::$isOnSaleOrderBeforeSaved = true;
- /**
- * @var $order Sale\Order
- */
- $order = $event->getParameter("ENTITY");
- $orderOld = $event->getParameter("VALUES");
- if (isset($orderOld['STATUS_ID'])) {
- switch ($order->getField('STATUS_ID')) {
- case Reserve::BOOKING_STATUS_ORDER_OUT_OF_STOCK:
- case Reserve::BOOKING_STATUS_ORDER:
- $orderProperty = Manager\Order::getPropertyValue($order);
- $orderProperty['PHONE'] = phoneReplace($orderProperty['PHONE']);
- if ($orderProperty['PHONE']) {
- $smsData = [
- 'ORDER_NUMBER' => $order->getId(),
- 'PROP_STORAGE_END_DATE' => $orderProperty['STORAGE_END_DATE'],
- ];
- $smsTpl = 54;
- if ($order->getField('STATUS_ID') == Reserve::BOOKING_STATUS_ORDER) {
- $smsTpl = 53;
- $smsData['PROP_ADDRESS'] = $orderProperty['ADDRESS'];
- }
- $SmsResult = \Gold\Core\Api\Zolotoy\Sms::getInstance()
- ->set($orderProperty['PHONE'], $smsTpl, $smsData);
- if (!$SmsResult->Code) {
- // AddMessage2Log('', 'reserve', 0);
- }
- }
- break;
- }
- }
- $updateCompany = false;
- switch ($order->getField('STATUS_ID')) {
- case 'N':
- $updateCompany = true;
- break;
- case 'YC':
- case 'YD':
- case 'YE':
- if ($order->getField('PAYED') != 'Y') {
- $updateCompany = true;
- }
- break;
- }
- // Смена ЮЛ при оплате
- if (isset($orderOld['PAYED'])) {
- if ($order->getField('PAYED') == 'Y' && $orderOld['PAYED'] != $order->getField('PAYED')) {
- $updateCompany = true;
- }
- }
- if (intval($order->getField('COMPANY_ID')) < 1 && !$updateCompany) {
- $updateCompany = true;
- }
- if ($updateCompany) {
- if (self::COMPANY_TO_ORDER_TYPE == 2) {
- $basket = $order->getBasket();
- $products = $shops = [];
- foreach ($basket->getBasketItems() as $basketItem) {
- $products[] = $basketItem->getField('PRODUCT_ID');
- }
- $propertyShopId = Property::getInstance()
- ->getIdByCode(IBLOCK_CATALOG_OFFERS, 'SHOP');
- $propertySaleCompanyId = Property::getInstance()
- ->getIdByCode(IBLOCK_SHOPS, 'SALE_COMPANY');
- $companyResult = ElementPropertyTable::getList([
- 'select' => [
- 'COMPANY' => 'PROPERTY_SALE_COMPANY.VALUE_NUM',
- ],
- 'filter' => [
- '=IBLOCK_ELEMENT_ID' => $products,
- '=IBLOCK_PROPERTY_ID' => $propertyShopId,
- ],
- 'runtime' => [
- 'PROPERTY_SALE_COMPANY' => [
- 'data_type' => 'Gold\Core\Entity\ElementProperty',
- 'reference' => [
- '=this.VALUE_NUM' => 'ref.IBLOCK_ELEMENT_ID',
- '=ref.IBLOCK_PROPERTY_ID' => new Main\DB\SqlExpression('?i', intval($propertySaleCompanyId)),
- ],
- ],
- ],
- ])
- ->fetchAll();
- $companyId = [];
- if ($companyResult) {
- foreach ($companyResult as $companyItem) {
- if ($companyItem['COMPANY']) {
- $companyId[] = $companyItem['COMPANY'];
- }
- }
- }
- if ($companyId) {
- $companyId = array_unique($companyId);
- $company = Sale\Internals\CompanyTable::getRow([
- 'select' => [
- 'ID',
- 'UF_DATE',
- ],
- 'filter' => [
- '=ID' => $companyId,
- ],
- 'order' => [
- 'SORT' => 'DESC',
- ],
- ]);
- } else {
- $company = null;
- }
- } else {
- // Назначаем компанию по дате
- $date = new Main\Type\DateTime();
- $company = Sale\Internals\CompanyTable::getRow([
- 'select' => [
- 'ID',
- 'UF_DATE',
- ],
- 'filter' => [
- '<=UF_DATE' => $date,
- ],
- 'order' => [
- 'UF_DATE' => 'DESC',
- ],
- ]);
- }
- if (is_array($company)) {
- $order->setField('COMPANY_ID', $company['ID']);
- $event->addResult(new Main\EventResult(Main\EventResult::SUCCESS, $order));
- }
- }
- }
- /**
- * @param Main\Event $event
- * @throws \Exception
- */
- function onSaleOrderSaved(Main\Event $event) {
- static::$orders[] = $event->getParameter("ENTITY");
- if (self::$isRoundOrder === true) {
- return;
- }
- self::$isRoundOrder = true;
- $parameters = $event->getParameters();
- /**
- * @var $order Sale\Order
- */
- $order = $parameters['ENTITY'];
- $fields = $order->getFields()
- ->getValues();
- $oldValues = $parameters['VALUES'];
- \fmsm\Reserve::OnSaleStatusOrderHandler($order, $oldValues);
- if (isset($oldValues["COMPANY_ID"]) && ($fields["COMPANY_ID"] != $oldValues["COMPANY_ID"])) {
- \CSaleOrderChange::AddRecord($order->getId(), "ORDER_COMMENTED", ["COMMENTS" => "офис изменен с " . $oldValues["COMPANY_ID"] . " на " . $fields["COMPANY_ID"] . ""]);
- }
- // MindBox
- if ($fields['STATUS_ID'] != $oldValues['STATUS_ID'] && !Service\DivideOrder::getBaseOrderId($order->getId())) {
- $MindBox = new \MindBox\MindBox();
- $MindBox->setOrder($fields);
- }
- if (!$parameters['IS_NEW']) {
- /**
- * Количество дней доставки
- *
- * start
- * YC Передано в ОС Стандартный
- * YE Передано в ОС Срочный
- * YD Передано в ОС Самовывоз
- * ZL Передано в ОС
- * ZZ Пешкарики передано в ОС
- *
- * end
- * YB Доставлен
- * T Отменен
- *
- * -1
- * ZX Утеря
- * ZW Утеря оплаченного заказа
- * ZY Утеря возмещена
- */
- $date = new \DateTime();
- $dateString = $date->format('d.m.Y');
- $deliveryFrom = $deliveryWorkingDays = $deliveryAllDays = null;
- $propertyCollection = $order->getPropertyCollection();
- foreach ($propertyCollection as $property) {
- switch ($property->getField("CODE")) {
- case 'DELIVERY_FROM':
- $deliveryFrom = $property;
- break;
- case 'DELIVERY_DAYS':
- $deliveryWorkingDays = $property;
- break;
- case 'DELIVERY_ALL_DAYS':
- $deliveryAllDays = $property;
- break;
- }
- }
- switch ($fields['STATUS_ID']) {
- case 'YC':
- case 'YE':
- case 'YD':
- case 'ZL':
- case 'ZZ':
- if (is_object($deliveryFrom)) {
- $deliveryFrom->setValue($dateString);
- $deliveryFrom->save();
- }
- if (is_object($deliveryWorkingDays)) {
- $deliveryWorkingDays->setValue(0);
- $deliveryWorkingDays->save();
- }
- if (is_object($deliveryAllDays)) {
- $deliveryAllDays->setValue(0);
- $deliveryAllDays->save();
- }
- break;
- case 'YB':
- case 'T':
- $deliveryFromValue = $deliveryFrom->getValue();
- $workingDays = $allDays = 0;
- if (!empty($deliveryFromValue)) {
- $dateFrom = new \DateTime($deliveryFromValue);
- $interval = new \DateInterval("P1D");
- $datePeriod = new \DatePeriod($dateFrom, $interval, $date);
- foreach ($datePeriod as $dateValue) {
- $dayOfWeek = $dateValue->format('N');
- $allDays++;
- if ($dayOfWeek >= 6) {
- continue;
- }
- $monthDay = $dateValue->format('md');
- switch ($monthDay) {
- case '0101':
- case '0102':
- case '0103':
- case '0104':
- case '0105':
- case '0106':
- case '0107':
- case '0108':
- case '0223':
- case '0308':
- case '0309':
- case '0430':
- case '0501':
- case '0502':
- case '0611':
- case '0612':
- case '1105':
- case '1231':
- continue(2);
- }
- $workingDays++;
- }
- }
- $deliveryWorkingDays->setValue($workingDays);
- $deliveryWorkingDays->save();
- if (is_object($deliveryAllDays)) {
- $deliveryAllDays->setValue($allDays);
- $deliveryAllDays->save();
- }
- break;
- case 'ZX':
- case 'ZW':
- case 'ZY':
- $deliveryWorkingDays->setValue(-1);
- $deliveryWorkingDays->save();
- if (is_object($deliveryAllDays)) {
- $deliveryAllDays->setValue(-1);
- $deliveryAllDays->save();
- }
- break;
- }
- if ($fields['STATUS_ID'] == 'YB') {
- \CModule::IncludeModule('citfact.lifepay');
- /**
- * @var LifePayService $lifePayService
- */
- $lifePayService = self::container()['lifepay_service'];
- $paymentCollection = $order->getPaymentCollection();
- foreach ($paymentCollection as $payment) {
- if ($payment->isPaid() && Manager\Payment::checkCardById($payment->getPaymentSystemId())) {
- $lifePayService->saveQueueItem([
- 'UF_ORDER_ID' => $order->getId(),
- 'UF_PAYMENT_ID' => $payment->getId(),
- 'UF_SID' => $order->getSiteId(),
- 'UF_SUM' => $order->getPrice(),
- 'UF_ORDER_STATUS' => $order->getField('STATUS_ID'),
- 'UF_PAY_STATUS' => LifePayQueueTable::PAY_NOT_CONFIRM,
- 'UF_CHECK_STATUS' => LifePayQueueTable::SEND_NOT_SEND,
- 'UF_GUID' => '',
- 'UF_PAY_AT' => '',
- 'UF_PAY_SUM' => '',
- 'UF_RRN' => '',
- 'UF_TYPE' => LifePayQueueTable::PAY_TYPE_FULLPAYMENT,
- ]);
- $lifePayService->sendItemByOrder($order, $payment, LifePayQueueTable::PAY_TYPE_FULLPAYMENT, LifePayModuleConfig::PROPERTY_TYPE_FULLPAYMENT);
- }
- }
- }
- } else {
- $paymentCollection = $order->getPaymentCollection();
- foreach ($paymentCollection as $payment) {
- if (!$payment->getField('COMPANY_ID') && $fields["COMPANY_ID"]) {
- $payment->setField('COMPANY_ID', $fields["COMPANY_ID"]);
- $payment->save();
- }
- }
- }
- }
- public static function OnSaleStatusOrderChange($entity) {
- if (!self::$event) {
- $value = $entity->getParameter("VALUE");
- $oldValue = $entity->getParameter("OLD_VALUE");
- if ($value != $oldValue && $value == "YD" && $oldValue != 'ZS') {
- $order = $entity->getParameter("ENTITY");
- $basket = $order->getBasket();
- $basketMes = '';
- \CModule::IncludeModule('iblock');
- $payer = $order->getPropertyCollection()
- ->getProfileName()
- ->getValue();
- foreach ($basket->getBasketItems() as $item) {
- $props = $item->getPropertyCollection()
- ->getPropertyValues();
- if (null !== $item->getField('PRODUCT_ID') && intval($item->getField('PRODUCT_ID')) > 0) {
- $shop = \CIBlockElement::GetList([], [
- 'IBLOCK_ID' => IBLOCK_CATALOG_OFFERS,
- "ID" => intval($item->getField('PRODUCT_ID')),
- ], false, false, [
- 'PROPERTY_SHOP',
- 'PROPERTY_CML2_LINK',
- 'PROPERTY_BARCODE',
- 'ID',
- ])
- ->Fetch();
- }
- if ($shop === false) {
- $parentId = explode('#', $props['PRODUCT.XML_ID']['VALUE']);
- $shop = \CIBlockElement::GetList([], [
- 'IBLOCK_ID' => IBLOCK_CATALOG_OFFERS,
- "ID" => $parentId[1],
- ], false, false, [
- 'PROPERTY_SHOP',
- 'PROPERTY_CML2_LINK',
- 'PROPERTY_BARCODE',
- 'ID',
- ])
- ->Fetch();
- }
- $kbk = \CIBlockElement::GetList([], [
- "ID" => $shop['PROPERTY_SHOP_VALUE'],
- "IBLOCK_ID" => IBLOCK_SHOPS,
- ], false, ['nTopCount' => 1], ["PROPERTY_KBK_CODE"])
- ->Fetch();
- $res = \CIBlockElement::getList([], [
- "IBLOCK_ID" => "13",
- "ID" => $shop['PROPERTY_CML2_LINK_VALUE'],
- ], false, false, ['PREVIEW_PICTURE'])
- ->fetch();
- $img = \Bitrix\Main\FileTable::getById($res['PREVIEW_PICTURE'])
- ->fetch();
- $basketMes .= 'Наименование товара: ' . $item->getField('NAME') . '<br/>';
- $basketMes .= 'ШК: ' . (null !== $shop["PROPERTY_BARCODE_VALUE"]) ? $shop["PROPERTY_BARCODE_VALUE"] : $props["BARCODE"]["VALUE"] . '<br>';
- if (isset($props['SIZE'])) {
- $basketMes .= 'Размер: ' . $props['SIZE']["VALUE"] . '<br/>';
- }
- $basketMes .= 'Стоимость товара по ценнику: ' . $basket->getPrice() . '<hr/>';
- }
- $fields = [
- 'PAYER_NAME' => $payer,
- 'ORDER_ID' => $order->getId(),
- 'BASKET' => $basketMes,
- 'IMG' => 'https://cs1.gold585.online/upload/' . $img['SUBDIR'] . '/' . $img['FILE_NAME'],
- 'MAIL_TO' => $kbk["PROPERTY_KBK_CODE_VALUE"] . '@zolotoy585.ru',
- ];
- \CEvent::Send("ORDER_STATUS_YD_CHANGE", 's1', $fields);
- }
- $requestOrdersId = self::getRequestOrdersId();
- EventTable::add([
- 'type' => 'order',
- 'data' => json_encode($requestOrdersId),
- ]);
- self::$event = true;
- }
- }
- /**
- * @param $id
- * @param $status
- * @return bool
- * @throws Main\ArgumentNullException
- * @throws Main\NotImplementedException
- */
- public static function onSaleBeforeStatusOrder($id, $status) {
- global $USER;
- if (!$USER->IsAuthorized()) {
- return true;
- }
- if (!empty($id)) {
- $order = Sale\Order::load($id);
- $currentStatus = $order->getField('STATUS_ID');
- // Никому нельзя изменять заказы в этих статусах
- if (in_array($currentStatus, ['NZ'])) {
- global $APPLICATION;
- $APPLICATION->throwException("Нельзя изменять заказ в статусе " . $currentStatus);
- return false;
- }
- // Можно ли изменить из текущего статуса?
- foreach (self::$statusesRoute as $statusRoute) {
- if (!in_array($status, $statusRoute['to'])) {
- continue;
- }
- if (!in_array($currentStatus, $statusRoute['from'])) {
- global $APPLICATION;
- $APPLICATION->throwException("Нельзя изменить статус");
- return false;
- }
- }
- }
- $groups = Manager\User::getGroups($USER->GetID());
- $groupCodes = [];
- foreach ($groups as $group) {
- $groupCodes[] = $group['GROUP_CODE'];
- }
- $statuses = Manager\UserGroup::getStatusAccess($groupCodes);
- if (empty($statuses)) {
- return true;
- }
- if (!in_array($status, $statuses)) {
- global $APPLICATION;
- $APPLICATION->throwException("У вас недостаточно прав для выставления этого статуса");
- return false;
- }
- return true;
- }
- /**
- * Отправка email клиенту после оплаты заказа картой
- *
- * @param $orderId
- * @param $paymentValue
- */
- public static function onSalePayOrder($orderId, $paymentValue) {
- // Акция прошла
- return;
- if ($paymentValue != 'Y' && self::$onSalePayOrderOnce !== true) {
- return;
- }
- self::$onSalePayOrderOnce = true;
- $order = OrderTable::getRow([
- 'select' => [
- 'PAY_SYSTEM_ID',
- 'PROPERTY_VALUE' => 'PROPERTY.VALUE',
- ],
- 'filter' => [
- '=ID' => $orderId,
- '=PROPERTY.CODE' => 'EMAIL',
- ],
- ]);
- if ($order) {
- if (Manager\Payment::checkCardById($order['PAY_SYSTEM_ID']) && check_email($order['PROPERTY_VALUE'])) {
- $eventData = [
- 'SITE_NAME' => '',
- 'SALE_EMAIL' => \COption::GetOptionString('sale', 'order_email'),
- 'EMAIL' => $order['PROPERTY_VALUE'],
- ];
- $dbSite = \CSite::GetByID(SITE_ID);
- if ($arSite = $dbSite->Fetch()) {
- $eventData['SITE_NAME'] = $arSite["NAME"];
- }
- \CEvent::Send("SALE_NEW_ORDER_CARD", SITE_ID, $eventData);
- }
- }
- }
- public static function onSaleCancelOrder($orderId, $value) {
- if ($value != 'Y') {
- return false;
- }
- global $USER;
- $dateTime = new Main\Type\DateTime();
- // Сохраняем данные в HL блоке
- $saleOrderEventEntity = Manager\HlBlock::getEntityByName(Manager\HlBlock::SALE_ORDER_AGENT);
- $saleOrderEventEntity::add([
- 'UF_ORDER_ID' => $orderId,
- 'UF_USER_ID' => $USER->GetID(),
- 'UF_ADD_DATE' => $dateTime,
- 'UF_METHOD' => 'conversionPriceAfterOrderCancel',
- ]);
- }
- private static function addItemToDetailOrderMenu(array $item, $items) {
- foreach ($items as &$menuItem) {
- if ($menuItem['TEXT'] != 'Действия') {
- continue;
- }
- $menuItem['MENU'][] = $item;
- }
- unset($menuItem);
- return $items;
- }
- public static function onAdminContextMenuShow(&$items) {
- if (!(defined('IS_PAGE_SALE_ORDER_VIEW') || IS_PAGE_SALE_ORDER_VIEW !== true)) {
- return;
- }
- $request = Main\Application::getInstance()
- ->getContext()
- ->getRequest();
- $orderId = (int)$request->getQuery('ID');
- if ($orderId <= 0) {
- return;
- }
- $order = Sale\Order::load($orderId);
- if (is_null($order)) {
- return;
- }
- //Подобрать оптимальный ШК
- $items = self::addItemToDetailOrderMenu([
- 'TEXT' => 'Подобрать оптимальный ШК',
- 'TITLE' => 'Подобрать оптимальный ШК',
- 'LINK' => "javascript:if(confirm('Вы уверены, что хотите подобрать оптимальные ШК для данного заказа?')) window.location='/bitrix/admin/optimal_shk.php?ID=$orderId'",
- 'WARNING' => 'Y',
- ], $items);
- // Ссылка на подзаказы
- if ($subordersLink = Service\DivideOrder::getSubOrdersLink($orderId)) {
- $items = self::addItemToDetailOrderMenu([
- 'TEXT' => 'Посмотреть подзаказы',
- 'TITLE' => 'Посмотреть подзаказы',
- 'LINK' => $subordersLink,
- ], $items);
- return;
- }
- // Ссылка на основной заказ
- if ($baseOrderLink = Service\DivideOrder::getBaseOrderLinkBySuborderId($orderId)) {
- $items = self::addItemToDetailOrderMenu([
- 'TEXT' => 'Посмотреть основной заказ',
- 'TITLE' => 'Посмотреть основной заказ',
- 'LINK' => $baseOrderLink,
- ], $items);
- return;
- }
- // Ссылка на разбивку заказа
- if (Service\DivideOrder::checkStatus($order)) {
- $items = self::addItemToDetailOrderMenu([
- 'TEXT' => 'Разбить на подзаказы',
- 'TITLE' => 'Разбить на подзаказы',
- 'LINK' => "javascript:if(confirm('Вы уверены, что хотите разбить этот заказ на подзаказы?')) window.location='/bitrix/admin/sale_order_divide.php?ID=$orderId'",
- 'WARNING' => 'Y',
- ], $items);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement