• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/cml2.php
  • Класс: CUserCMLImport
  • Вызов: CUserCMLImport::LoadUser
function LoadUser($arXMLElement, &$counter)
{
	$start_time = microtime(true);
	static $USER_COUNTER = null;

	static $property_state_final = 0;

	if (!is_array($property_state_final))
	{
		$property_state_final = array();
		$property_state = CIBlockPropertyEnum::GetList(
			Array(),
			Array(
				"IBLOCK_ID" => $this->STATE_HISTORY_IBLOCK_ID,
				"CODE"=>"STATE"
			)
		);
		while($property_state_enum = $property_state->GetNext())
		{
			$property_state_final[ToLower($property_state_enum["VALUE"])] = $property_state_enum["ID"];
		}
	}

	$obUser = &$this->__user;

	// this counter'll be used for generating users login name
	if (null == $USER_COUNTER)
	{
		$dbRes = $GLOBALS['DB']->Query('SELECT MAX(ID) M FROM b_user');
		$ar = $dbRes->Fetch();
		$USER_COUNTER = $ar['M'];
	}

	$CURRENT_USER = false;

	// check user existence
	if ($arCurrentUser = $this->GetUserByXML_ID($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_ID')]))
		$CURRENT_USER = $arCurrentUser['ID'];

	// common user data
	$arFields = array(
		'ACTIVE' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_STATUS')] == GetMessage('IBLOCK_XML2_USER_VALUE_DELETED') ? 'N' : 'Y',
		'UF_1C' => 'Y',
		'XML_ID' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_ID')],
		'LID' => $this->arParams['SITE_ID'],
		'LAST_NAME' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_LAST_NAME')],
		'NAME' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_FIRST_NAME')],
		'SECOND_NAME' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_SECOND_NAME')],
		'PERSONAL_BIRTHDAY' => !empty($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_BIRTH_DATE')]) ? ConvertTimeStamp(MakeTimeStamp($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_BIRTH_DATE')], 'YYYY-MM-DD')) : '',
		'PERSONAL_GENDER' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_GENDER')] == GetMessage('IBLOCK_XML2_USER_VALUE_FEMALE') ? 'F' : 'M',
		'UF_INN' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_INN')],
		'WORK_POSITION' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_POST')],
		'PERSONAL_PROFESSION' => $arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_POST')],
	);

	if (array_key_exists(GetMessage('IBLOCK_XML2_USER_TAG_PHOTO'), $arXMLElement))
	{
		if ($arCurrentUser['PERSONAL_PHOTO'] > 0)
		{
			CFile::Delete($arCurrentUser['PERSONAL_PHOTO']);
		}

		if ($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_PHOTO')] <> '')
		{
			$arFields['PERSONAL_PHOTO'] = $this->MakeFileArray($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_PHOTO')]);
		}
	}

	// address fields
	if (is_array($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_ADDRESS')]))
	{
		foreach ($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_ADDRESS')] as $key => $arAddressField)
		{
			if (GetMessage('IBLOCK_XML2_USER_TAG_FULLADDRESS') == $key)
			{
				$arFields['PERSONAL_STREET'] = $arAddressField;
			}
			elseif (isset($arAddressField[GetMessage('IBLOCK_XML2_USER_TAG_TYPE')], $arAddressField[GetMessage('IBLOCK_XML2_USER_TAG_VALUE')]))
			{
				$type = $arAddressField[GetMessage('IBLOCK_XML2_USER_TAG_TYPE')];
				$value = $arAddressField[GetMessage('IBLOCK_XML2_USER_TAG_VALUE')];
				switch($type)
				{
					case GetMessage('IBLOCK_XML2_USER_VALUE_ZIP'):
						$arFields['PERSONAL_ZIP'] = $value;
					break;
					case GetMessage('IBLOCK_XML2_USER_VALUE_STATE'):
						$arFields['PERSONAL_STATE'] = $value;
					break;
					case GetMessage('IBLOCK_XML2_USER_VALUE_DISTRICT'):
						$arFields['UF_DISTRICT'] = $value;
					break;
					case GetMessage('IBLOCK_XML2_USER_VALUE_CITY1'):
					case GetMessage('IBLOCK_XML2_USER_VALUE_CITY2'):
						if ($arFields['PERSONAL_CITY'])
							$arFields['PERSONAL_CITY'] .= ', ';
						$arFields['PERSONAL_CITY'] .= $value;
					break;
					default: break;
				}
			}
		}
	}

	// contact fields
	if (is_array($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_CONTACTS')]))
	{
		foreach ($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_CONTACTS')] as $arContactsField)
		{
			if (!isset($arContactsField[GetMessage('IBLOCK_XML2_USER_TAG_TYPE')], $arContactsField[GetMessage('IBLOCK_XML2_USER_TAG_VALUE')]))
			{
				continue;
			}

			$type = $arContactsField[GetMessage('IBLOCK_XML2_USER_TAG_TYPE')];
			$value = $arContactsField[GetMessage('IBLOCK_XML2_USER_TAG_VALUE')];
			switch ($type)
			{
				case GetMessage('IBLOCK_XML2_USER_VALUE_PHONE_INNER'):
					$arFields['UF_PHONE_INNER'] = $value;
				break;
				case GetMessage('IBLOCK_XML2_USER_VALUE_PHONE_WORK'):
					$arFields['WORK_PHONE'] = $value;
				break;
				case GetMessage('IBLOCK_XML2_USER_VALUE_PHONE_MOBILE'):
					$arFields['PERSONAL_MOBILE'] = $value;
				break;
				case GetMessage('IBLOCK_XML2_USER_VALUE_PHONE_PERSONAL'):
					$arFields['PERSONAL_PHONE'] = $value;
				break;
				case GetMessage('IBLOCK_XML2_USER_VALUE_PAGER'):
					$arFields['PERSONAL_PAGER'] = $value;
				break;
				case GetMessage('IBLOCK_XML2_USER_VALUE_FAX'):
					$arFields['PERSONAL_FAX'] = $value;
				break;
				case GetMessage('IBLOCK_XML2_USER_VALUE_EMAIL'):
					$arFields['EMAIL'] = $value; // b_user.EMAIL
				break;
				case GetMessage('IBLOCK_XML2_USER_VALUE_ICQ'):
					$arFields['PERSONAL_ICQ'] = $value;
				break;
				case GetMessage('IBLOCK_XML2_USER_VALUE_WWW'):
					$arFields['PERSONAL_WWW'] = $value;
				break;
				default: break;
			}
		}
	}

	//departments data
	$arFields['UF_DEPARTMENT'] = array();
	if (is_array($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_DEPARTMENTS')]))
	{
		foreach($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_DEPARTMENTS')] as $DEPT_XML_ID)
		{
			if ($DEPT_ID = $this->GetSectionByXML_ID($this->DEPARTMENTS_IBLOCK_ID, $DEPT_XML_ID))
			{
				$arFields['UF_DEPARTMENT'][] = $DEPT_ID;
			}
		}
	}

	// state history
	if (is_array($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_STATE_HISTORY')]))
	{
		$last_state_date = 0;
		$first_state_date = 1767132000; //strtotime('2025-12-31')
		$arStateHistory = array();

		foreach($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_STATE_HISTORY')] as $arState)
		{
			$state = $arState[GetMessage('IBLOCK_XML2_USER_TAG_VALUE')];

			$date = intval(MakeTimeStamp($arState[GetMessage('IBLOCK_XML2_USER_TAG_DATE')], 'YYYY-MM-DD'));
			while (is_array($arStateHistory[$date]))
				$date++;

			if (!$last_state_date || doubleval($last_state_date) < doubleval($date))
				$last_state_date = $date;
			if (doubleval($first_state_date) > doubleval($date))
				$first_state_date = $date;

			$DEPARTMENT_ID = $this->GetSectionByXML_ID($this->DEPARTMENTS_IBLOCK_ID, $arState[GetMessage('IBLOCK_XML2_USER_TAG_DEPARTMENT')]);

			$arStateHistory[$date] = array(
				'STATE' => $state,
				'POST' => $arState[GetMessage('IBLOCK_XML2_USER_TAG_POST')],
				'DEPARTMENT' => $DEPARTMENT_ID,
			);
		}

		ksort($arStateHistory);

		// if person's last state is "Fired" - deactivate him.
		if (GetMessage('IBLOCK_XML2_USER_VALUE_FIRED') == $arStateHistory[$last_state_date]['STATE'])
			$arFields['ACTIVE'] = 'N';
		// save data serialized
		//$arFields['UF_1C_STATE_HISTORY'] = serialize($arStateHistory);
	}
	else
	{
		$arStateHistory = array();
		$last_state_date = null;
		$first_state_date = null;
	}

	// properties data
	if (is_array($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_PROPERTY_VALUES')]))
	{
		foreach ($arXMLElement[GetMessage('IBLOCK_XML2_USER_TAG_PROPERTY_VALUES')] as $arPropertyData)
		{
			$PROP_XML_ID = $arPropertyData[GetMessage('IBLOCK_XML2_USER_TAG_ID')];
			$PROP_VALUE = $arPropertyData[GetMessage('IBLOCK_XML2_USER_TAG_VALUE')];
			$arFields[$this->CalcPropertyFieldName($PROP_XML_ID)] = $PROP_VALUE;
		}
	}

	if (!$arFields['EMAIL'] && $this->arParams['EMAIL_PROPERTY_XML_ID'])
	{
		$arFields['EMAIL'] = $arFields[$this->CalcPropertyFieldName($this->arParams['EMAIL_PROPERTY_XML_ID'])];
	}

	$bEmailExists = true;
	if (!$arFields['EMAIL'] && $this->arParams['DEFAULT_EMAIL'])
	{
		$bEmailExists = false;
		$arFields['EMAIL'] = $this->arParams['DEFAULT_EMAIL'];
	}

	if (!$arFields['EMAIL'])
	{
		$bEmailExists = false;
		$arFields['EMAIL'] = COption::GetOptionString('main', 'email_from', "admin@".$_SERVER['SERVER_NAME']);
	}

	// EMAIL, LOGIN and PASSWORD fields
	if (!$CURRENT_USER)
	{
		// for a new user
		$USER_COUNTER++;

		$arFields['LOGIN'] = '';
		if ($this->arParams['LDAP_ID_PROPERTY_XML_ID'] && $this->arParams['LDAP_SERVER'])
		{
			if ($arFields['LOGIN'] = $arFields[$this->CalcPropertyFieldName($this->arParams['LDAP_ID_PROPERTY_XML_ID'])])
			{
				$arFields['EXTERNAL_AUTH_ID'] = 'LDAP#'.$this->arParams['LDAP_SERVER'];
			}
		}

		if (!$arFields['LOGIN'] && $this->arParams['LOGIN_PROPERTY_XML_ID'])
			$arFields['LOGIN'] = $arFields[$this->CalcPropertyFieldName($this->arParams['LOGIN_PROPERTY_XML_ID'])];
		if (!$arFields['LOGIN'] && $this->arParams['LOGIN_TEMPLATE'])
			$arFields['LOGIN'] = str_replace('#', $USER_COUNTER, $this->arParams['LOGIN_TEMPLATE']);
		if (!$arFields['LOGIN']) $arFields['LOGIN'] = 'user_' . $USER_COUNTER;

		if (!$arFields['EXTERNAL_AUTH_ID'])
		{
			if ($this->arParams['PASSWORD_PROPERTY_XML_ID'])
				$arFields['PASSWORD'] = $arFields['CONFIRM_PASSWORD'] =
					$arFields[$this->CalcPropertyFieldName($this->arParams['PASSWORD_PROPERTY_XML_ID'])];

			if (!$arFields['PASSWORD'])
				$arFields['PASSWORD'] = $arFields['CONFIRM_PASSWORD'] =
					RandString($this->arParams['PASSWORD_LENGTH'] ? $this->arParams['PASSWORD_LENGTH'] : 7);
		}

		if (!$bEmailExists && $arFields['EMAIL'] && $this->arParams['UNIQUE_EMAIL'] != 'N')
			$arFields['EMAIL'] = preg_replace('/@/', '_'.$USER_COUNTER.'@', $arFields['EMAIL'], 1);

		// set user groups list to default from main module setting
		if (is_array($this->arUserGroups))
			$arFields['GROUP_ID'] = $this->arUserGroups;
	}
	else
	{
		// for an existing user
		if ($this->arParams['UPDATE_LOGIN'])
		{
			$arFields['LOGIN'] = $arFields[$this->CalcPropertyFieldName($this->arParams['LOGIN_PROPERTY_XML_ID'])];
			if ($arFields['LOGIN'] == '') unset($arFields['LOGIN']);
		}

		if ($this->arParams['UPDATE_PASSWORD'])
		{
			$arFields['PASSWORD'] = $arFields['CONFIRM_PASSWORD'] = $arFields[$this->CalcPropertyFieldName($this->arParams['PASSWORD_PROPERTY_XML_ID'])];
			if ($arFields['PASSWORD'] == '') { unset($arFields['PASSWORD']); unset($arFields['CONFIRM_PASSWORD']); }
		}

		if (!$this->arParams['UPDATE_EMAIL'] || $arFields['EMAIL'] == '') unset($arFields['EMAIL']);
	}

	$bNew = $CURRENT_USER <= 0;

	if (!$bNew)
	{
		foreach ($arFields as $key => $value)
		{
			if ($key !== 'ACTIVE' && !in_array($key, $this->arParams['UPDATE_PROPERTIES']))
				unset($arFields[$key]);
		}

		// update existing user
		if ($res = $obUser->Update($CURRENT_USER, $arFields))
			$counter[$arFields['ACTIVE'] == 'Y' ? 'UPD' : 'DEA']++;
	}
	else
	{
		$group_id = $arFields['GROUP_ID'];
		unset($arFields['GROUP_ID']);
		// create new user
		if ($CURRENT_USER = $obUser->Add($arFields))
		{
			$counter['ADD']++;

			CUser::SetUserGroup($CURRENT_USER, $group_id);

			if (isset($this->next_step['_TEMPORARY']['DEPARTMENT_HEADS'][$arFields['XML_ID']]))
			{
				$obSection = new CIBlockSection();
				foreach ($this->next_step['_TEMPORARY']['DEPARTMENT_HEADS'][$arFields['XML_ID']] as $dpt)
				{
					$obSection->Update($dpt, array('UF_HEAD' => $CURRENT_USER), false, false);
				}
			}

			if ($this->arParams['EMAIL_NOTIFY'] == 'Y' || ($this->arParams['EMAIL_NOTIFY'] == 'E') && $bEmailExists)
			{
				$arFields['ID'] = $CURRENT_USER;

				//$this->__event->Send("USER_INFO", SITE_ID, $arFields);
				//echo CEvent::Send("USER_INFO", 's1', $arFields);

				$this->__user->SendUserInfo(
					$CURRENT_USER,
					$this->arParams['SITE_ID'],
					'',
					$this->arParams['EMAIL_NOTIFY_IMMEDIATELY'] == 'Y'
				);
			}
		}

		if (!$res = ($CURRENT_USER > 0))
		{
			$USER_COUNTER--;
		}
	}

	if (!$res)
	{
		$counter['ERR']++;
		$fp = fopen($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/intranet/cml2-import-user.log', 'a');
		fwrite($fp, "==============================================================rn");
		fwrite($fp, $obUser->LAST_ERROR."rn");
		fwrite($fp, print_r($arFields, true));
		fwrite($fp, "==============================================================rn");
		fclose($fp);
	}
	elseif (is_array($arStateHistory) && count($arStateHistory) > 0)
	{
		if (null == $this->__ib)
			$this->__ib = new CIBlockElement();

		if (!$bNew)
		{
			$dbRes = $this->__ib->GetList(
				array(),
				array(
					'PROPERTY_USER' => $CURRENT_USER,
					'IBLOCK_ID' => $this->STATE_HISTORY_IBLOCK_ID
				),
				false,
				false,
				array('ID', 'IBLOCK_ID')
			);
			while ($arRes = $dbRes->Fetch())
			{
				$this->__ib->Delete($arRes['ID']);
			}
		}

		foreach ($arStateHistory as $date => $arState)
		{
			$arStateFields = array(
				'IBLOCK_SECTION' => false,
				'IBLOCK_ID' => $this->STATE_HISTORY_IBLOCK_ID,
				'DATE_ACTIVE_FROM' => ConvertTimeStamp($date, 'SHORT'),
				'ACTIVE' => 'Y',
				'NAME' => $arState['STATE'].' - '.$arFields['LAST_NAME'].' '.$arFields['NAME'],
				'PREVIEW_TEXT' => $arState['STATE'],
				'PROPERTY_VALUES' => array(
					'POST' => $arState['POST'],
					'USER' => $CURRENT_USER,
					'DEPARTMENT' => $arState['DEPARTMENT'],
					'STATE' => array("VALUE" => $property_state_final[ToLower($arState['STATE'])])
				),
			);

			if (!$this->__ib->Add($arStateFields, false, false))
			{
				$fp = fopen($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/intranet/cml2-import-state.log', 'a');
				fwrite($fp, "==============================================================rn");
				fwrite($fp, $this->__ib->LAST_ERROR."rn");
				fwrite($fp, print_r($arStateFields, true));
				fwrite($fp, "==============================================================rn");
				fclose($fp);
			}
		}
	}

	return $CURRENT_USER;
}