static function createOutgoingMessageActivity(&$messageFields, &$activityFields)
{
if(!CModule::IncludeModule('crm'))
{
return false;
}
$userId = isset($activityFields['RESPONSIBLE_ID']) ? (int)$activityFields['RESPONSIBLE_ID'] : \CCrmSecurityHelper::GetCurrentUserID();
$authorId = isset($activityFields['AUTHOR_ID']) ? (int)$activityFields['AUTHOR_ID'] : $userId;
$editorId = isset($activityFields['EDITOR_ID']) ? (int)$activityFields['EDITOR_ID'] : $userId;
$now = convertTimeStamp(time() + \CTimeZone::getOffset(), 'FULL', SITE_ID);
$from = isset($messageFields['FROM']) ? $messageFields['FROM'] : '';
$replyTo = isset($messageFields['REPLY_TO']) ? $messageFields['REPLY_TO'] : '';
$to = isset($messageFields['TO']) ? $messageFields['TO'] : array();
$cc = isset($messageFields['CC']) ? $messageFields['CC'] : array();
$bcc = isset($messageFields['BCC']) ? $messageFields['BCC'] : array();
$subject = trim($messageFields['SUBJECT']) ?: getMessage('CRM_EMAIL_DEFAULT_SUBJECT');
$body = isset($messageFields['BODY']) ? $messageFields['BODY'] : '';
// Bindings & Communications
$arCommunications = isset($activityFields['COMMUNICATIONS']) ? $activityFields['COMMUNICATIONS'] : array();
$arBindings = array();
$arComms = array();
$socNetLogDestTypes = array(
\CCrmOwnerType::LeadName => 'leads',
\CCrmOwnerType::DealName => 'deals',
\CCrmOwnerType::ContactName => 'contacts',
\CCrmOwnerType::CompanyName => 'companies',
);
foreach ($arCommunications as &$commDatum)
{
$commID = isset($commDatum['id']) ? intval($commDatum['id']) : 0;
$commEntityType = isset($commDatum['entityType'])? mb_strtolower(strval($commDatum['entityType'])) : '';
$commEntityType = array_search($commEntityType, $socNetLogDestTypes);
$commEntityID = isset($commDatum['entityId']) ? intval($commDatum['entityId']) : 0;
$commType = isset($commDatum['type'])? mb_strtoupper(strval($commDatum['type'])) : '';
if($commType === '')
{
$commType = 'EMAIL';
}
$commValue = isset($commDatum['value']) ? strval($commDatum['value']) : '';
if($commType === 'EMAIL' && $commValue !== '')
{
if(!check_email($commValue))
{
// ignoring
continue;
}
$rcptFieldName = 'to';
if (isset($commDatum['__field']))
{
$commDatum['__field'] = mb_strtolower($commDatum['__field']);
if (in_array($commDatum['__field'], array('to', 'cc', 'bcc')))
{
$rcptFieldName = $commDatum['__field'];
}
}
${$rcptFieldName}[] = mb_strtolower(trim($commValue));
}
$key = md5(sprintf(
'%s_%u_%s_%s',
$commEntityType,
$commEntityID,
$commType,
mb_strtolower(trim($commValue))
));
$arComms[$key] = array(
'ID' => $commID,
'TYPE' => $commType,
'VALUE' => $commValue,
'ENTITY_ID' => $commEntityID,
'ENTITY_TYPE_ID' => \CCrmOwnerType::ResolveID($commEntityType)
);
if($commEntityType !== '')
{
$bindingKey = $commEntityID > 0 ? "{$commEntityType}_{$commEntityID}" : uniqid("{$commEntityType}_");
if(!isset($arBindings[$bindingKey]))
{
$arBindings[$bindingKey] = array(
'OWNER_TYPE_ID' => \CCrmOwnerType::ResolveID($commEntityType),
'OWNER_ID' => $commEntityID
);
}
}
}
unset($commDatum);
$to = array_unique($to);
$cc = array_unique($cc);
$bcc = array_unique($bcc);
// owner entity
$ownerBounded = false;
$ownerTypeId = 0;
$ownerId = 0;
$typesPriority = array(
\CCrmOwnerType::Contact => 2,
\CCrmOwnerType::Company => 3,
\CCrmOwnerType::Lead => 4,
);
foreach ($arBindings as $item)
{
if ($ownerTypeId <= 0 || $typesPriority[$item['OWNER_TYPE_ID']] < $typesPriority[$ownerTypeId])
{
if (\CCrmActivity::checkUpdatePermission($item['OWNER_TYPE_ID'], $item['OWNER_ID']))
{
$ownerTypeId = $item['OWNER_TYPE_ID'];
$ownerId = $item['OWNER_ID'];
$ownerBounded = true;
}
}
}
if (!$ownerBounded)
{
if (empty($arComms))
{
$activityFields['ERROR_CODE'] = 'ACTIVITY_COMMUNICATIONS_EMPTY_ERROR';
}
else
{
$activityFields['ERROR_CODE'] = 'ACTIVITY_PERMISSION_DENIED_ERROR';
}
return false;
}
\CCrmActivity::addEmailSignature($body, \CCrmContentType::Html);
$activityFields = array(
'AUTHOR_ID' => $authorId,
'OWNER_ID' => $ownerId,
'OWNER_TYPE_ID' => $ownerTypeId,
'TYPE_ID' => \CCrmActivityType::Email,
'SUBJECT' => $subject,
'START_TIME' => $now,
'END_TIME' => $now,
'COMPLETED' => 'Y',
'RESPONSIBLE_ID' => $userId,
'EDITOR_ID' => $editorId,
'PRIORITY' => !empty($messageFields['IMPORTANT']) && $messageFields['IMPORTANT'] ? \CCrmActivityPriority::High : \CCrmActivityPriority::Medium,
'DESCRIPTION' => $body,
'DESCRIPTION_TYPE' => \CCrmContentType::Html,
'DIRECTION' => \CCrmActivityDirection::Outgoing,
'LOCATION' => '',
'NOTIFY_TYPE' => \CCrmActivityNotifyType::None,
'BINDINGS' => array_values($arBindings),
'COMMUNICATIONS' => $arComms,
);
$storageTypeID = isset($messageFields['STORAGE_TYPE_ID']) ? $messageFields['STORAGE_TYPE_ID'] : \CCrmActivity::GetDefaultStorageTypeID();
$activityFields['STORAGE_TYPE_ID'] = $storageTypeID;
if ($storageTypeID === \Bitrix\Crm\Integration\StorageType::Disk)
{
if (isset($messageFields['STORAGE_ELEMENT_IDS']) && is_array($messageFields['STORAGE_ELEMENT_IDS']))
{
$activityFields['STORAGE_ELEMENT_IDS'] =
\Bitrix\Crm\Integration\StorageManager::filterFiles($messageFields['STORAGE_ELEMENT_IDS'], $storageTypeID, $userId);
}
}
if (!($activityId = \CCrmActivity::Add($activityFields, false, false, array('REGISTER_SONET_EVENT' => true))))
{
$activityFields['ERROR_CODE'] = 'ACTIVITY_CREATE_ERROR';
$activityFields['ERROR_TEXT'] = \CCrmActivity::GetLastErrorMessage();
return false;
}
$activityFields['ID'] = $activityId;
$urn = \CCrmActivity::prepareUrn($activityFields);
$hostname = \COption::getOptionString('main', 'server_name', '') ?: 'localhost';
if (defined('BX24_HOST_NAME') && BX24_HOST_NAME != '')
{
$hostname = BX24_HOST_NAME;
}
elseif (defined('SITE_SERVER_NAME') && SITE_SERVER_NAME != '')
{
$hostname = SITE_SERVER_NAME;
}
$messageId = sprintf('', $urn, $hostname);
$messageFields['MSG_ID'] = $messageId;
$arRawFiles = array();
if (isset($activityFields['STORAGE_ELEMENT_IDS']) && !empty($activityFields['STORAGE_ELEMENT_IDS']))
{
foreach ((array)$activityFields['STORAGE_ELEMENT_IDS'] as $item)
{
$arRawFiles[$item] = \Bitrix\Crm\Integration\StorageManager::makeFileArray($item, $storageTypeID);
$fileInfo = \Bitrix\Crm\Integration\StorageManager::getFileInfo(
$item,
$storageTypeID,
false,
array('OWNER_TYPE_ID' => \CCrmOwnerType::Activity, 'OWNER_ID' => $activityId)
);
$body = preg_replace(
sprintf('/(https?:\/\/)?bxacid:n?%u/i', $item),
htmlspecialcharsbx($fileInfo['VIEW_URL']),
$body
);
}
}
\CCrmActivity::update($activityId, array(
'DESCRIPTION' => $body,
'URN' => $urn,
'SETTINGS' => array(
'MESSAGE_HEADERS' => array(
'Message-Id' => $messageId,
'Reply-To' => $replyTo,
),
'EMAIL_META' => array(
'__email' => $from,
'from' => $from,
'replyTo' => $replyTo,
'to' => implode(', ', $to),
'cc' => implode(', ', $cc),
'bcc' => implode(', ', $bcc),
),
),
), false, false, array('REGISTER_SONET_EVENT' => true));
//----------
// Try add event to entity
$crmEvent = new \CCrmEvent();
$eventText = '';
$eventText .= getMessage('CRM_EMAIL_SUBJECT').': '.$subject."\n\r";
$eventText .= getMessage('CRM_EMAIL_FROM').': '.$from."\n\r";
if (!empty($to))
{
$eventText .= getMessage('CRM_EMAIL_TO').': '.implode(',', $to)."\n\r";
}
if (!empty($cc))
{
$eventText .= 'Cc: '.implode(',', $cc)."\n\r";
}
if (!empty($bcc))
{
$eventText .= 'Bcc: '.implode(',', $bcc)."\n\r";
}
$eventText .= "\n\r";
$eventText .= $body;
$eventBindings = array();
foreach($arBindings as $item)
{
$bindingEntityID = $item['OWNER_ID'];
$bindingEntityTypeID = $item['OWNER_TYPE_ID'];
$bindingEntityTypeName = \CCrmOwnerType::resolveName($bindingEntityTypeID);
$eventBindings["{$bindingEntityTypeName}_{$bindingEntityID}"] = array(
'ENTITY_TYPE' => $bindingEntityTypeName,
'ENTITY_ID' => $bindingEntityID
);
}
$crmEvent->Add(
array(
'ENTITY' => $eventBindings,
'EVENT_ID' => 'MESSAGE',
'EVENT_NAME' => $subject,
'EVENT_TEXT_1' => $eventText,
'FILES' => array_values($arRawFiles),
)
);
return ($activityId > 0);
}