Календарь, собрания и старые переговорные

апдейт, на новом ядре не работает, таки перешли на новые переговорки
Клиент использует СТАРЫЕ переговорки (они ему по функционалу зашли лучше, чем новые), которые в сервисах "Бронирование переговорных".  
Их же использует в собраниях.
Битрикс уже что-то их совсем не тестирует и не поддерживает, в какой-то момент стали сыпаться и ошибки, и неправильно занятость смотреться стала, и создавал новую бронь переговорки при изменении старой при изменении собрания, а старая оставалась.

Задача: починить
  • копируем шаблон компонента meeting.edit .default или в дефолдный шаблон сайта /bitrix/templates/.default/components/bitrix/metting.edit/.default/ (или в папку /local/templates/.default/components/bitrix/metting.edit/.default/)
  • копируем файл /bitrix/modules/meeting/tools/ajax_meeting.php в нашу папку с шаблоном
  • в инфоблоке бронирований переговорных добавляем текстовое свойство MEETING_ID
меняем tpl_edit.php
  1. autocomplete="off" добавила в инпут <input type="text" name="PLACE" value="<?=$arResult['MEETING']['PLACE']?>" onchange="onMeetingRoomChange()" autocomplete="off"/>
  2. меняем путь до нашего файла и добавляем параметр  MEETING_ID_NIKA (просто MEETING_ID нельзя, он используется)
var queryData = {
   PLACE_ID: document.forms.meeting_edit.PLACE_ID.value,
   EVENT_ID: <?=intval($arResult['MEETING']['EVENT_ID'])?>,
   DATE_START_DATE: document.forms.meeting_edit.DATE_START_DATE.value,
   DATE_START_TIME: document.forms.meeting_edit.DATE_START_TIME.value,
   DURATION: parseInt(document.forms.meeting_edit.DURATION.value) * parseInt(document.forms.meeting_edit.DURATION_COEF.value),
         MEETING_ID_NIKA: <?=$arResult['MEETING']["ID"]??0?>,
};

BX.ajax.loadJSON(''<?=$this->GetFolder();?>/ajax_meeting.php'', queryData, function(res){
меняем ajax_meeting.php
if($eventId > 0){
   $arEvent = CMeeting::GetEvent($eventId);

   if(is_array($arEvent) && is_array($arEvent['LOCATION']) && $arEvent['LOCATION']['mrevid'] > 0)
   {
      $reservationId = $arEvent['LOCATION']['mrevid'];
      $arFilter["!=ID"] = $reservationId;
   }
   elseif(is_array($arEvent) && is_array($arEvent['LOCATION'])&& !empty($_REQUEST['MEETING_ID_NIKA'])){ //вот это условие добавляем
      $arFilter["!PROPERTY_MEETING_ID"] = $_REQUEST['MEETING_ID_NIKA'];
   }

}

добавляем обработчик в init.php
он будет удалять дубли, заполнять свойство MEETING_ID
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", "MyOnBeforeIBlockElementAdd");
function MyOnBeforeIBlockElementAdd(&$arFields){ 
    if($arFields["IBLOCK_ID"]==43){
        if(
           !empty($arFields["DETAIL_TEXT"]) && (strpos($arFields['DETAIL_TEXT']," Бронирование переговорной для события")!==false) &&  
           !empty($arFields["PROPERTY_VALUES"]) && is_array($arFields["PROPERTY_VALUES"])
        ){
            $meetingId = substr($arFields["DETAIL_TEXT"],0, strpos($arFields["DETAIL_TEXT"]," Бронирование переговорной для события"));
            $arFields["PROPERTY_VALUES"]["MEETING_ID"] = $meetingId;
            if($meetingId>0){
               $arFilter = Array(
              "IBLOCK_ID"=>43, 
               "ACTIVE"=>"Y",
               "PROPERTY_MEETING_ID" => $meetingId
            );
            $arSelect = Array("ID");
            $res = CIBlockElement::GetList(Array("sort"=>"asc"), $arFilter, false, Array("nPageSize"=>500,"iNumPage"=>1), $arSelect);
            while($arItem = $res->Fetch()){               
               CIBlockElement::Delete($arItem["ID"]);
            }
            }
        }           
    }
}

А теперь правим ядро (после обновления слетит, надо будет дописать)
1. /bitrix/modules/meeting/classes/general/meeting.php метод AddEvent (стр.412 примерно)
arEventFields = array(
   'ID' => $arFields['EVENT_ID'],
   'CAL_TYPE' => 'user',
   'OWNER_ID' => $arFields['OWNER_ID'],
   'DT_FROM' => $arFields['DATE_START'],
   'DT_TO' => ConvertTimeStamp(MakeTimeStamp($arFields['DATE_START']) + $arFields['DURATION'], 'FULL'),
   'NAME' => $arFields['TITLE'],
   'DESCRIPTION' => "<a href='https://b24.nikaverro.ru/timeman/meeting/meeting/".$MEETING_ID."/' target='_self'>[".$MEETING_ID."]</a> ".CCalendar::ParseHTMLToBB($arFields['DESCRIPTION']), //вот эту строчку меняем, добавляем ссылку на собрание
   'IS_MEETING' => true,
   'MEETING_HOST' => $arFields['OWNER_ID'],
   'MEETING' => array(
       'HOST_NAME' => CCalendar::GetUserName($arFields['OWNER_ID'])
   ),
   'ATTENDEES' => array_keys($arFields['USERS']),
);
2. /bitrix/modules/calendar/lib/rooms/manager.php метод reserveRoom (стр. 256 примерно)
if($params['room_id']!="E"){         
   $name = self::createInstance()->getRoomName($params['room_id']); //была только эта строка, меняем на условие
}
else{
   $name = "Переговорная";
}   

3. /bitrix/modules/calendar/lib/rooms/iblockmeetingroom.php метод checkMeetingRoom (стр. 303 примерно)
$filter = [
   'ACTIVE' => 'Y',
   'IBLOCK_ID' => $params['RMiblockId'],
   'SECTION_ID' => $params['mrid'],
   '<DATE_ACTIVE_FROM' => $params['dateTo'],
   '>DATE_ACTIVE_TO' => $params['dateFrom'],
    'PROPERTY_PERIOD_TYPE' => 'NONE',
];
//вот это добавляем      
if(isset($params["description"]) && (strpos($params["description"], " Бронирование переговорной для события")!==false)){         
    $filter["!PROPERTY_MEETING_ID"] = substr($params["description"],0, strpos($params["description"]," Бронирование переговорной для события"));
}
4. /bitrix/modules/calendar/lib/rooms/util.php метод setLocation (стр. 191 примерно)
$description = "";
if(
   isset($params["parentParams"]["arFields"]["DESCRIPTION"]) && 
   (strpos($params["parentParams"]["arFields"]["DESCRIPTION"], "https://b24.nikaverro.ru/timeman/meeting/meeting/")!==false)
)   
{
   $href = str_replace("<a href='https://b24.nikaverro.ru/timeman/meeting/meeting/";, "", $params["parentParams"]["arFields"]["DESCRIPTION"]);
   $href = substr($href, 0, strpos($href, "/"));
   $description = $href." ".Loc::getMessage('EC_RESERVE_FOR_EVENT').': '.$params['name'];   
}   
if(empty($description)){
   $description = Loc::getMessage('EC_RESERVE_FOR_EVENT').': '.$params['name'];   
}
            
$mrevid = IBlockMeetingRoom::reserveMeetingRoom([
   'RMiblockId' => $RMiblockId,
    'mrid' => $locNew['mrid'],
   'dateFrom' => $params['dateFrom'],
    'dateTo' => $params['dateTo'],
    'name' => $params['name'],
     'description' => $description,
     'persons' => $params['persons'],
     'members' => $params['attendees']
]);