• Модуль: sender
  • Путь к файлу: ~/bitrix/modules/sender/lib/entity/letter.php
  • Класс: BitrixSenderEntityLetter
  • Вызов: Letter::saveData
protected function saveData($id, array $data)
{
	if(!$this->getMessage()->isAvailable())
	{
		$this->addError(Loc::getMessage('SENDER_ENTITY_LETTER_ERROR_NOT_AVAILABLE'));
		return $id;
	}

	$segmentsInclude = $data['SEGMENTS_INCLUDE'];
	$segmentsExclude = $data['SEGMENTS_EXCLUDE'];

	foreach (static::getFilterFields() as $field)
	{
		if (!$field['CODE'])
		{
			continue;
		}

		if (is_array($field['VALUE']))
		{
			if (empty($data[$field['CODE']]) || !in_array($data[$field['CODE']], $field['VALUE']))
			{
				$data[$field['CODE']] = current($field['VALUE']);
			}
		}
		else
		{
			$data[$field['CODE']] = $field['VALUE'];
		}
	}
	$this->filterDataByEntityFields(LetterTable::getEntity(), $data);

	$initialId = $id;
	$previousData = $id ? LetterTable::getRowById($id) : null;
	$previousData = $previousData ?: array();

	// segment check
	if(!is_array($segmentsInclude) || count($segmentsInclude) == 0)
	{
		if (
			(
				isset($data['NOT_USE_SEGMENTS'])
				&& !$data['NOT_USE_SEGMENTS']
			)
			&& $data['IS_TRIGGER'] <> 'Y'
			&& $previousData['IS_TRIGGER'] <> 'Y'
		)
		{
			$this->addError(Loc::getMessage('SENDER_ENTITY_LETTER_ERROR_NO_SEGMENTS'));
			return $id;
		}
	}
	$segmentsExclude = is_array($segmentsExclude) ? $segmentsExclude : array();

	// campaign setting
	if (!isset($data['CAMPAIGN_ID']))
	{
		$data['CAMPAIGN_ID'] = Campaign::getDefaultId(SITE_ID);
		$this->set('CAMPAIGN_ID', $data['CAMPAIGN_ID']);
	}

	// parent letter setting for triggers
	if (!$id && $data['IS_TRIGGER'] === 'Y')
	{
		if (empty($data['PARENT_ID']))
		{
			$previousLetter = (new Chain)->load($data['CAMPAIGN_ID'])->getLast();
			if ($previousLetter && $previousLetter->getId() != $this->getId())
			{
				$data['PARENT_ID'] = $previousLetter->getId();
			}
		}

		if (!isset($data['TIME_SHIFT']))
		{
			$data['TIME_SHIFT'] = 1440;
		}

		$data['STATUS'] = DispatchState::WAITING;
		$data['REITERATE'] = 'Y';
	}


	if ($this->filterDataByChanging($data, $previousData))
	{
		$id = $this->saveByEntity(LetterTable::getEntity(), $id, $data);
	}

	if ($this->canChangeSegments())
	{
		$this->saveDataSegments($id, $segmentsInclude, $segmentsExclude);

		$data['DATE_UPDATE'] = new DateTime();
		$this->saveByEntity(LetterTable::getEntity(), $id, $data);
	}

	if ($this->hasErrors())
	{
		return $id;
	}

	// update template use count
	$this->updateTemplateUseCount($data, $previousData);

	// change status for init recipients
	if (!$initialId && !$this->isTrigger())
	{
		$this->setId($id)->getState()->init();
	}

	return $id;
}