diff --git a/local/php_interface/include/classes/Otus/Event/DealHandler.php b/local/php_interface/include/classes/Otus/Event/DealHandler.php new file mode 100644 index 0000000..684a950 --- /dev/null +++ b/local/php_interface/include/classes/Otus/Event/DealHandler.php @@ -0,0 +1,76 @@ +setSelect(['ID', 'DEAL' => 'DEAL', 'RESPONSIBLE' => 'RESPONSIBLE', 'SUM' => 'SUM']) + ->where('DEAL.VALUE', $arFields['ID']) + ->fetch(); + + + if($item){ + + $sum = 0; + $currency = ''; + + if (str_contains($item['SUMVALUE'], '|')) { + list($sum, $currency) = explode('|', $item['SUMVALUE']); + } + + // $arFields['OPPORTUNITY'] + // $arFields['CURRENCY_ID'] + // $arFields['ASSIGNED_BY_ID'] + + + $dealFactory = Container::getInstance()->getFactory(\CCrmOwnerType::Deal); + $dealItem = $dealFactory->getItem($arFields['ID']); + $currentCurrency = $dealItem->get('CURRENCY_ID'); + $currentSum = (float)$dealItem->get('OPPORTUNITY'); + $currentResponsible = $dealItem->get('ASSIGNED_BY_ID'); + + $properties = []; + + if((float)$sum != $currentSum || $currency != $currentCurrency){ + $properties['SUM'] = $currentSum.'|'.$currency; + } + + if($currentResponsible != $item['RESPONSIBLEIBLOCK_GENERIC_VALUE']){ + $properties['ASSIGNED_BY_ID'] = $currentResponsible; + } + + if($properties){ + + \CIBlockElement::SetPropertyValuesEx( + $item['ID'], + false, + $properties + ); + + } + + } + + } + +} \ No newline at end of file diff --git a/local/php_interface/include/classes/Otus/Event/IblockElementHandler.php b/local/php_interface/include/classes/Otus/Event/IblockElementHandler.php new file mode 100644 index 0000000..c3b5571 --- /dev/null +++ b/local/php_interface/include/classes/Otus/Event/IblockElementHandler.php @@ -0,0 +1,119 @@ +addSelect('ID') + ->where('CODE', self::IBLOCK_APPLICATIONS_CODE) + ->setLimit(1) + ->setCacheTtl(3600) + ->fetch(); + + return $iblockApp['ID'] ?? 0; + } + + /** + * Обработчик после обновления элемента инфоблока + * + * @param $arFields + * @return void + * @throws ArgumentException + * @throws LoaderException + * @throws ObjectPropertyException + * @throws SystemException + */ + public static function onElementAfterUpdate(&$arFields) + { + + + $iblockApp = self::getApplicationsBlockId(); + + if($iblockApp > 0 && $iblockApp == $arFields['IBLOCK_ID']){ + + if (!Loader::includeModule('crm')) { + return; + } + + $dealFactory = + Container::getInstance()->getFactory(\CCrmOwnerType::Deal); + + $item = Elements\ElementApplicationsTable::query() + ->setSelect(['DEAL' => 'DEAL', 'RESPONSIBLE' => 'RESPONSIBLE', 'SUM' => 'SUM']) + ->where('ID', $arFields['ID']) + ->fetch(); + + $sum = 0; + $currency = ''; + + if (str_contains($item['SUMVALUE'], '|')) { + list($sum, $currency) = explode('|', $item['SUMVALUE']); + } + + $existedDealId = $item['DEALVALUE']; + $dealItem = $dealFactory->getItem($existedDealId); + + if($dealItem){ + + $update = false; + + $currentSum = (float)$dealItem->get('OPPORTUNITY'); + $newSum = (float)$sum; + + if($currentSum !== $newSum){ + $dealItem->set('OPPORTUNITY', $sum); + $update = true; + } + + $currentCurrency = $dealItem->get('CURRENCY_ID'); + if($currentCurrency !== $currency){ + $dealItem->set('CURRENCY_ID', $currency); + $update = true; + } + + $currentResponsible = (int)$dealItem->get('ASSIGNED_BY_ID'); + $newResponsible = (int)$item['RESPONSIBLEIBLOCK_GENERIC_VALUE']; + + if ($currentResponsible !== $newResponsible) { + $dealItem->set('ASSIGNED_BY_ID', $item['RESPONSIBLEIBLOCK_GENERIC_VALUE']); + $update = true; + } + + if($update){ + $dealUpdateOperation = $dealFactory->getUpdateOperation($dealItem); + $updateResult = $dealUpdateOperation->launch(); + } + + } + + + } + } + +} \ No newline at end of file diff --git a/local/php_interface/include/events.php b/local/php_interface/include/events.php index 23674e7..9cf015b 100644 --- a/local/php_interface/include/events.php +++ b/local/php_interface/include/events.php @@ -1,7 +1,12 @@ addEventHandlerCompatible('main', 'OnPageStart', '\Otus\Event\Main::handlerPageStart'); +//$eventManager->addEventHandlerCompatible('main', 'OnPageStart', '\Otus\Event\Main::handlerPageStart'); $eventManager->AddEventHandler( 'iblock', @@ -10,4 +15,23 @@ 'Otus\UserType\OnlineRecord', 'GetUserTypeDescription' ] -); \ No newline at end of file +); + + +$eventManager->addEventHandler( + "iblock", + "OnAfterIBlockElementUpdate", + [ + IblockElementHandler::class, + 'onElementAfterUpdate' + ] +); + +$eventManager->addEventHandlerCompatible( + "crm", + "OnAfterCrmDealUpdate", + [ + DealHandler::class, + 'onAfterDealUpdate' + ] +); diff --git a/local/php_interface/migrations/hw10_20260210081927.php b/local/php_interface/migrations/hw10_20260210081927.php new file mode 100644 index 0000000..e95abc8 --- /dev/null +++ b/local/php_interface/migrations/hw10_20260210081927.php @@ -0,0 +1,525 @@ +getHelperManager(); + $iblockId = $helper->Iblock()->saveIblock(array ( + 'IBLOCK_TYPE_ID' => 'lists', + 'LID' => + array ( + 0 => 'co', + 1 => 's1', + ), + 'CODE' => 'applications', + 'API_CODE' => 'applications', + 'REST_ON' => 'N', + 'NAME' => 'Заявки', + 'ACTIVE' => 'Y', + 'SORT' => '500', + 'LIST_PAGE_URL' => '', + 'DETAIL_PAGE_URL' => '', + 'SECTION_PAGE_URL' => '', + 'CANONICAL_PAGE_URL' => '', + 'PICTURE' => NULL, + 'DESCRIPTION' => '', + 'DESCRIPTION_TYPE' => 'text', + 'RSS_TTL' => '24', + 'RSS_ACTIVE' => 'Y', + 'RSS_FILE_ACTIVE' => 'N', + 'RSS_FILE_LIMIT' => NULL, + 'RSS_FILE_DAYS' => NULL, + 'RSS_YANDEX_ACTIVE' => 'N', + 'XML_ID' => NULL, + 'INDEX_ELEMENT' => 'N', + 'INDEX_SECTION' => 'N', + 'WORKFLOW' => 'N', + 'BIZPROC' => 'N', + 'SECTION_CHOOSER' => 'L', + 'LIST_MODE' => '', + 'RIGHTS_MODE' => 'S', + 'SECTION_PROPERTY' => 'N', + 'PROPERTY_INDEX' => 'N', + 'VERSION' => '1', + 'LAST_CONV_ELEMENT' => '0', + 'SOCNET_GROUP_ID' => NULL, + 'EDIT_FILE_BEFORE' => '', + 'EDIT_FILE_AFTER' => '', + 'SECTIONS_NAME' => 'Разделы', + 'SECTION_NAME' => 'Раздел', + 'ELEMENTS_NAME' => 'Элементы', + 'ELEMENT_NAME' => 'Элемент', + 'FULLTEXT_INDEX' => 'N', + 'EXTERNAL_ID' => NULL, + 'LANG_DIR' => '/extranet/', + 'IPROPERTY_TEMPLATES' => + array ( + ), + 'ELEMENT_ADD' => 'Добавить элемент', + 'ELEMENT_EDIT' => 'Изменить элемент', + 'ELEMENT_DELETE' => 'Удалить элемент', + 'SECTION_ADD' => 'Добавить раздел', + 'SECTION_EDIT' => 'Изменить раздел', + 'SECTION_DELETE' => 'Удалить раздел', +)); + $helper->Iblock()->saveIblockFields($iblockId, array ( + 'IBLOCK_SECTION' => + array ( + 'NAME' => 'Привязка к разделам', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => + array ( + 'KEEP_IBLOCK_SECTION_ID' => 'N', + ), + 'VISIBLE' => 'Y', + ), + 'ACTIVE' => + array ( + 'NAME' => 'Активность', + 'IS_REQUIRED' => 'Y', + 'DEFAULT_VALUE' => 'Y', + 'VISIBLE' => 'Y', + ), + 'ACTIVE_FROM' => + array ( + 'NAME' => 'Начало активности', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'ACTIVE_TO' => + array ( + 'NAME' => 'Окончание активности', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'SORT' => + array ( + 'NAME' => 'Сортировка', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => '500', + 'VISIBLE' => 'Y', + ), + 'NAME' => + array ( + 'NAME' => 'Название', + 'IS_REQUIRED' => 'Y', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'PREVIEW_PICTURE' => + array ( + 'NAME' => 'Картинка для анонса', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => + array ( + 'FROM_DETAIL' => 'N', + 'UPDATE_WITH_DETAIL' => 'N', + 'DELETE_WITH_DETAIL' => 'N', + 'SCALE' => 'N', + 'WIDTH' => '', + 'HEIGHT' => '', + 'IGNORE_ERRORS' => 'N', + 'METHOD' => 'resample', + 'COMPRESSION' => 95, + 'USE_WATERMARK_TEXT' => 'N', + 'WATERMARK_TEXT' => '', + 'WATERMARK_TEXT_FONT' => '', + 'WATERMARK_TEXT_COLOR' => '', + 'WATERMARK_TEXT_SIZE' => '', + 'WATERMARK_TEXT_POSITION' => 'tl', + 'USE_WATERMARK_FILE' => 'N', + 'WATERMARK_FILE' => '', + 'WATERMARK_FILE_ALPHA' => '', + 'WATERMARK_FILE_POSITION' => 'tl', + 'WATERMARK_FILE_ORDER' => '', + ), + 'VISIBLE' => 'Y', + ), + 'PREVIEW_TEXT_TYPE' => + array ( + 'NAME' => 'Тип описания для анонса', + 'IS_REQUIRED' => 'Y', + 'DEFAULT_VALUE' => 'text', + 'VISIBLE' => 'Y', + ), + 'PREVIEW_TEXT' => + array ( + 'NAME' => 'Описание для анонса', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'DETAIL_PICTURE' => + array ( + 'NAME' => 'Детальная картинка', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => + array ( + 'SCALE' => 'N', + 'WIDTH' => '', + 'HEIGHT' => '', + 'IGNORE_ERRORS' => 'N', + 'METHOD' => 'resample', + 'COMPRESSION' => 95, + 'USE_WATERMARK_TEXT' => 'N', + 'WATERMARK_TEXT' => '', + 'WATERMARK_TEXT_FONT' => '', + 'WATERMARK_TEXT_COLOR' => '', + 'WATERMARK_TEXT_SIZE' => '', + 'WATERMARK_TEXT_POSITION' => 'tl', + 'USE_WATERMARK_FILE' => 'N', + 'WATERMARK_FILE' => '', + 'WATERMARK_FILE_ALPHA' => '', + 'WATERMARK_FILE_POSITION' => 'tl', + 'WATERMARK_FILE_ORDER' => '', + ), + 'VISIBLE' => 'Y', + ), + 'DETAIL_TEXT_TYPE' => + array ( + 'NAME' => 'Тип детального описания', + 'IS_REQUIRED' => 'Y', + 'DEFAULT_VALUE' => 'text', + 'VISIBLE' => 'Y', + ), + 'DETAIL_TEXT' => + array ( + 'NAME' => 'Детальное описание', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'XML_ID' => + array ( + 'NAME' => 'Внешний код', + 'IS_REQUIRED' => 'Y', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'CODE' => + array ( + 'NAME' => 'Символьный код', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => + array ( + 'UNIQUE' => 'N', + 'TRANSLITERATION' => 'N', + 'TRANS_LEN' => 100, + 'TRANS_CASE' => 'L', + 'TRANS_SPACE' => '-', + 'TRANS_OTHER' => '-', + 'TRANS_EAT' => 'Y', + 'USE_GOOGLE' => 'N', + ), + 'VISIBLE' => 'Y', + ), + 'TAGS' => + array ( + 'NAME' => 'Теги', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'SECTION_NAME' => + array ( + 'NAME' => 'Название', + 'IS_REQUIRED' => 'Y', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'SECTION_PICTURE' => + array ( + 'NAME' => 'Картинка для анонса', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => + array ( + 'FROM_DETAIL' => 'N', + 'UPDATE_WITH_DETAIL' => 'N', + 'DELETE_WITH_DETAIL' => 'N', + 'SCALE' => 'N', + 'WIDTH' => '', + 'HEIGHT' => '', + 'IGNORE_ERRORS' => 'N', + 'METHOD' => 'resample', + 'COMPRESSION' => 95, + 'USE_WATERMARK_TEXT' => 'N', + 'WATERMARK_TEXT' => '', + 'WATERMARK_TEXT_FONT' => '', + 'WATERMARK_TEXT_COLOR' => '', + 'WATERMARK_TEXT_SIZE' => '', + 'WATERMARK_TEXT_POSITION' => 'tl', + 'USE_WATERMARK_FILE' => 'N', + 'WATERMARK_FILE' => '', + 'WATERMARK_FILE_ALPHA' => '', + 'WATERMARK_FILE_POSITION' => 'tl', + 'WATERMARK_FILE_ORDER' => '', + ), + 'VISIBLE' => 'Y', + ), + 'SECTION_DESCRIPTION_TYPE' => + array ( + 'NAME' => 'Тип описания', + 'IS_REQUIRED' => 'Y', + 'DEFAULT_VALUE' => 'text', + 'VISIBLE' => 'Y', + ), + 'SECTION_DESCRIPTION' => + array ( + 'NAME' => 'Описание', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'SECTION_DETAIL_PICTURE' => + array ( + 'NAME' => 'Детальная картинка', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => + array ( + 'SCALE' => 'N', + 'WIDTH' => '', + 'HEIGHT' => '', + 'IGNORE_ERRORS' => 'N', + 'METHOD' => 'resample', + 'COMPRESSION' => 95, + 'USE_WATERMARK_TEXT' => 'N', + 'WATERMARK_TEXT' => '', + 'WATERMARK_TEXT_FONT' => '', + 'WATERMARK_TEXT_COLOR' => '', + 'WATERMARK_TEXT_SIZE' => '', + 'WATERMARK_TEXT_POSITION' => 'tl', + 'USE_WATERMARK_FILE' => 'N', + 'WATERMARK_FILE' => '', + 'WATERMARK_FILE_ALPHA' => '', + 'WATERMARK_FILE_POSITION' => 'tl', + 'WATERMARK_FILE_ORDER' => '', + ), + 'VISIBLE' => 'Y', + ), + 'SECTION_XML_ID' => + array ( + 'NAME' => 'Внешний код', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => '', + 'VISIBLE' => 'Y', + ), + 'SECTION_CODE' => + array ( + 'NAME' => 'Символьный код', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => + array ( + 'UNIQUE' => 'N', + 'TRANSLITERATION' => 'N', + 'TRANS_LEN' => 100, + 'TRANS_CASE' => 'L', + 'TRANS_SPACE' => '-', + 'TRANS_OTHER' => '-', + 'TRANS_EAT' => 'Y', + 'USE_GOOGLE' => 'N', + ), + 'VISIBLE' => 'Y', + ), + 'LOG_SECTION_ADD' => + array ( + 'NAME' => 'LOG_SECTION_ADD', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => NULL, + 'VISIBLE' => 'Y', + ), + 'LOG_SECTION_EDIT' => + array ( + 'NAME' => 'LOG_SECTION_EDIT', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => NULL, + 'VISIBLE' => 'Y', + ), + 'LOG_SECTION_DELETE' => + array ( + 'NAME' => 'LOG_SECTION_DELETE', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => NULL, + 'VISIBLE' => 'Y', + ), + 'LOG_ELEMENT_ADD' => + array ( + 'NAME' => 'LOG_ELEMENT_ADD', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => NULL, + 'VISIBLE' => 'Y', + ), + 'LOG_ELEMENT_EDIT' => + array ( + 'NAME' => 'LOG_ELEMENT_EDIT', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => NULL, + 'VISIBLE' => 'Y', + ), + 'LOG_ELEMENT_DELETE' => + array ( + 'NAME' => 'LOG_ELEMENT_DELETE', + 'IS_REQUIRED' => 'N', + 'DEFAULT_VALUE' => NULL, + 'VISIBLE' => 'Y', + ), +)); + $helper->Iblock()->saveGroupPermissions($iblockId, array ( + 'administrators' => 'X', + 'everyone' => 'R', +)); + $helper->Iblock()->saveProperty($iblockId, array ( + 'NAME' => 'Сделка', + 'ACTIVE' => 'Y', + 'SORT' => '500', + 'CODE' => 'DEAL', + 'DEFAULT_VALUE' => NULL, + 'PROPERTY_TYPE' => 'S', + 'ROW_COUNT' => '1', + 'COL_COUNT' => '30', + 'LIST_TYPE' => 'L', + 'MULTIPLE' => 'N', + 'XML_ID' => NULL, + 'FILE_TYPE' => '', + 'MULTIPLE_CNT' => '5', + 'LINK_IBLOCK_ID' => '0', + 'WITH_DESCRIPTION' => 'N', + 'SEARCHABLE' => 'N', + 'FILTRABLE' => 'N', + 'IS_REQUIRED' => 'N', + 'VERSION' => '1', + 'USER_TYPE' => 'ECrm', + 'USER_TYPE_SETTINGS' => + array ( + 'DEAL' => 'Y', + 'VISIBLE' => 'Y', + 'LEAD' => 'N', + 'CONTACT' => 'N', + 'COMPANY' => 'N', + ), + 'HINT' => '', + 'FEATURES' => + array ( + 0 => + array ( + 'MODULE_ID' => 'iblock', + 'FEATURE_ID' => 'DETAIL_PAGE_SHOW', + 'IS_ENABLED' => 'N', + ), + 1 => + array ( + 'MODULE_ID' => 'iblock', + 'FEATURE_ID' => 'LIST_PAGE_SHOW', + 'IS_ENABLED' => 'N', + ), + ), +)); + $helper->Iblock()->saveProperty($iblockId, array ( + 'NAME' => 'Сумма', + 'ACTIVE' => 'Y', + 'SORT' => '500', + 'CODE' => 'SUM', + 'DEFAULT_VALUE' => NULL, + 'PROPERTY_TYPE' => 'S', + 'ROW_COUNT' => '1', + 'COL_COUNT' => '30', + 'LIST_TYPE' => 'L', + 'MULTIPLE' => 'N', + 'XML_ID' => NULL, + 'FILE_TYPE' => '', + 'MULTIPLE_CNT' => '5', + 'LINK_IBLOCK_ID' => '0', + 'WITH_DESCRIPTION' => 'N', + 'SEARCHABLE' => 'N', + 'FILTRABLE' => 'N', + 'IS_REQUIRED' => 'N', + 'VERSION' => '1', + 'USER_TYPE' => 'Money', + 'USER_TYPE_SETTINGS' => NULL, + 'HINT' => '', +)); + $helper->Iblock()->saveProperty($iblockId, array ( + 'NAME' => 'Ответственный', + 'ACTIVE' => 'Y', + 'SORT' => '500', + 'CODE' => 'RESPONSIBLE', + 'DEFAULT_VALUE' => '', + 'PROPERTY_TYPE' => 'N', + 'ROW_COUNT' => '1', + 'COL_COUNT' => '30', + 'LIST_TYPE' => 'L', + 'MULTIPLE' => 'N', + 'XML_ID' => NULL, + 'FILE_TYPE' => '', + 'MULTIPLE_CNT' => '5', + 'LINK_IBLOCK_ID' => '0', + 'WITH_DESCRIPTION' => 'N', + 'SEARCHABLE' => 'N', + 'FILTRABLE' => 'N', + 'IS_REQUIRED' => 'N', + 'VERSION' => '1', + 'USER_TYPE' => 'UserID', + 'USER_TYPE_SETTINGS' => NULL, + 'HINT' => '', +)); + $helper->UserOptions()->saveElementForm($iblockId, array ( + 'Параметры|edit1' => + array ( + 'ID' => 'ID', + 'DATE_CREATE' => 'Создан', + 'TIMESTAMP_X' => 'Изменен', + 'ACTIVE' => 'Активность', + 'NAME' => 'Название', + 'SORT' => 'Сортировка', + 'PROPERTY_RESPONSIBLE' => 'Ответственный', + 'PROPERTY_DEAL' => 'Сделка', + 'PROPERTY_SUM' => 'Сумма', + ), +)); + $helper->UserOptions()->saveElementGrid($iblockId, array ( + 'views' => + array ( + 'default' => + array ( + 'columns' => + array ( + 0 => '', + ), + 'columns_sizes' => + array ( + 'expand' => 1, + 'columns' => + array ( + ), + ), + 'sticked_columns' => + array ( + ), + 'custom_names' => + array ( + ), + ), + ), + 'filters' => + array ( + ), + 'current_view' => 'default', +)); + + } +}