- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/lib/userfield/resourcebooking.php
- Класс: BitrixCalendarUserFieldResourceBooking
- Вызов: ResourceBooking::onBeforeSaveAll
static function onBeforeSaveAll($userField, $values, $userId = false)
{
$valuesToSave = [];
$currentUserId = CCalendar::getCurUserId();
$dateFrom = false;
$dateTo = false;
$serviceName = '';
$entityTitle = '';
$fields = [];
$resourseList = InternalsResourceTable::getList([
"filter" => [
"PARENT_TYPE" => $userField['ENTITY_ID'],
"PARENT_ID" => $userField['VALUE_ID'],
"UF_ID" => $userField['ID']
]
]);
$currentEntriesIndex = [];
while ($resourse = $resourseList->fetch())
{
$currentEntriesIndex[$resourse['CAL_TYPE'].$resourse['RESOURCE_ID']] = $resourse;
}
if (self::isCrmEntity($userField['ENTITY_ID']) && Loader::includeModule('crm'))
{
if ($userField['ENTITY_ID'] === self::CRM_DEAL_ENTITY_ID)
{
$entity = CCrmDeal::GetByID($userField['VALUE_ID'], false);
if (!empty($entity) && $entity['TITLE'])
{
$entityTitle = Loc::getMessage("USER_TYPE_RESOURCE_EVENT_TITLE").': '.$entity['TITLE'];
}
}
elseif ($userField['ENTITY_ID'] === self::CRM_LEAD_ENTITY_ID)
{
$entity = CCrmLead::GetByID($userField['VALUE_ID'], false);
if (!empty($entity) && $entity['TITLE'])
{
$entityTitle = Loc::getMessage("USER_TYPE_RESOURCE_EVENT_TITLE").': '.$entity['TITLE'];
}
}
if (
$userField['ENTITY_ID'] === self::CRM_SUSPENDED_DEAL_ENTITY_ID
|| $userField['ENTITY_ID'] === self::CRM_SUSPENDED_LEAD_ENTITY_ID
)
{
$entityTitle = Loc::getMessage("USER_TYPE_RESOURCE_EVENT_TITLE")." (Deleted)";
}
}
if (!$entityTitle)
{
$entityTitle = Loc::getMessage("USER_TYPE_RESOURCE_EVENT_TITLE");
}
$valuesToMerge = [];
foreach ($values as $value)
{
if ((string)$value === (string)((int)$value))
{
$currentValue = static::fetchFieldValue($value);
$skipTime = is_array($userField['SETTINGS']) && $userField['SETTINGS']['FULL_DAY'] === 'Y';
$fromTs = CCalendar::timestamp($currentValue['DATE_FROM'], true, !$skipTime);
$toTs = CCalendar::timestamp($currentValue['DATE_TO'], true, !$skipTime);
foreach ($currentValue['ENTRIES'] as $entry)
{
$entryExist = false;
foreach ($values as $iValue)
{
$str = $entry['TYPE'].'|'.$entry['RESOURCE_ID'];
if (str_starts_with($iValue, $str))
{
$entryExist = true;
break;
}
}
if (!$entryExist)
{
$valuesToMerge[] = self::prepareValue(
$entry['TYPE'],
$entry['RESOURCE_ID'],
$currentValue['DATE_FROM'],
$toTs - $fromTs,
$currentValue['SERVICE_NAME']
);
}
}
}
}
$values = array_merge($values, $valuesToMerge);
foreach ($values as $value)
{
$value = self::parseValue($value);
if (!is_array($value))
{
continue;
}
if (!$dateFrom || !$dateTo)
{
$dateFromTimestamp = CCalendar::timestamp($value['from']);
$skipTime = isset($userField['SETTINGS']) && $userField['SETTINGS']['FULL_DAY'] === 'Y';
$dateFrom = CCalendar::date($dateFromTimestamp, !$skipTime);
$duration = (int)$value['duration'];
$dateTo = CCalendar::date($dateFromTimestamp + ($skipTime ? $duration - CCalendar::DAY_LENGTH : $duration), !$skipTime);
$serviceName = trim($value['serviceName']);
$fields = [
"DATE_FROM" => $dateFrom,
"DATE_TO" => $dateTo,
"SKIP_TIME" => $skipTime,
"NAME" => $entityTitle
];
if (
$userField['ENTITY_ID'] === self::CRM_SUSPENDED_DEAL_ENTITY_ID
|| $userField['ENTITY_ID'] === self::CRM_SUSPENDED_LEAD_ENTITY_ID
)
{
$fields["DELETED"] = 'Y';
}
if ($serviceName !== '')
{
$fields["DESCRIPTION"] = Loc::getMessage("USER_TYPE_RESOURCE_SERVICE_LABEL").': '.$serviceName;
}
if (!$skipTime)
{
if ($userField['SETTINGS']['USE_USER_TIMEZONE'] === 'Y')
{
$timezoneName = CCalendar::getUserTimezoneName($currentUserId, true);
}
else if($userField['SETTINGS']['TIMEZONE'])
{
$timezoneName = $userField['SETTINGS']['TIMEZONE'];
}
else
{
$timezoneName = CCalendar::GetGoodTimezoneForOffset((int)date("Z"));
}
if($timezoneName)
{
$fields['TZ_FROM'] = $timezoneName;
$fields['TZ_TO'] = $timezoneName;
}
}
}
$entryId = false;
if (isset($currentEntriesIndex[$value['type'] . $value['id']]))
{
$fields['ID'] = $currentEntriesIndex[$value['type'].$value['id']]['EVENT_ID'];
$entryId = $currentEntriesIndex[$value['type'].$value['id']]['ID'];
}
else
{
unset($fields['ID']);
}
$resourceBookingId = self::saveResource(
$entryId,
$value['type'],
$value['id'],
$fields,
[
'userField' => $userField,
'serviceName' => $serviceName
]
);
if ($resourceBookingId)
{
$valuesToSave[] = $resourceBookingId;
}
}
foreach ($currentEntriesIndex as $resourceEntry)
{
if (!in_array($resourceEntry['ID'], $valuesToSave))
{
self::releaseResource($resourceEntry);
}
}
return $valuesToSave;
}