$reader = new XMLReader();
$xmlfile = GetXML("users");
if (!$reader->xml($xmlfile)){
$error_text = date("d.m.Y H:i:s")." - Импорт сотрудников: полученный ответ от веб-сервиса не удалось открыть на чтение, как xml файл";
hlb_import_log($error_text);
die($error_text);
}
$arPositions = array();
//справочник должнсотей. их меньеш чем юзеров так что сначала получим его
CModule::IncludeModule("highloadblock");
$hlblock = Bitrix\Highloadblock\HighloadBlockTable::getById(HLB_POSITIONS_ID)->fetch();
$entity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
$entity_data_class = $entity->getDataClass();
$resPosition = $entity_data_class::getList(array ('order' => array ("ID" => "ASC"), 'filter' => array(), 'select' => array('*')));
while($arPosition = $resPosition->Fetch()) $arPositions[$arPosition["UF_NAME"]] = $arPosition;
$oUser = new CUser;
while ($reader->read()):
if ($reader->nodeType == XMLReader::ELEMENT && $reader->name == 'm:items'){
$data = new XMLReader();
$data->xml($reader->readOuterXML());
$UserFields = [];
$AcceptedPosition = [];
while($data->read()){
switch ($data->name){
case "m:id": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["XML_ID"] = $v; break; //внешний код
case "m:loginAD": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["LOGIN"] = $data->readInnerXML(); break; //логин
case "m:surname_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["LAST_NAME"] = $data->readInnerXML(); break; //фамилия
case "m:name_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["NAME"] = $data->readInnerXML(); break; //имя
case "m:middlename_fio": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["SECOND_NAME"] = $data->readInnerXML(); break; //отчество
case "m:birthDay": $v = $data->readInnerXML(); if(strlen($v)>0)$UserFields["PERSONAL_BIRTHDAY"] = ConvertTimeStamp(strtotime($data->readInnerXML()), "SHORT", "ru"); break; //дата рождения
case "m:assistant":
$v = $data->readInnerXML(); if(strlen($v)>0){
$UserFields["UF_ASSISTANT"] = CUser::GetByLogin($v)->Fetch()["ID"];
}
break; //асистент
case "m:position":
$v = $data->readInnerXML(); if(strlen($v)>0 && isset($arPositions[trim($v)]["ID"])){
$UserFields["UF_CUSTOM_POSITION"] = $arPositions[trim($v)]["ID"];
$AcceptedPosition[$arPositions[trim($v)]["ID"]] = trim($v);
}
break; //должность
case "m:subdivisioncode":
$v = $data->readInnerXML(); if(strlen($v)>0){
$res = CIBlockSection::GetList(Array(), array("CODE"=>$v.""), false, array("ID"));
if($ar = $res->Fetch()) {
$UserFields["UF_DEPARTMENT"] = array($ar["ID"]);
}
}
break;//подразделение
}
}
//обновляем юзера, если он есть
if(strlen($UserFields["LOGIN"])>0){
$arUser = CUser::GetByLogin($UserFields["LOGIN"])->Fetch();
$UserFields['UF_EXEC_DO_IMPORT'] = 1;
$oUser->Update($arUser["ID"], $UserFields);
CUser::SetUserGroup($arUser['ID'], array_merge(CUser::GetUserGroup($arUser['ID']), [OSK_STAFF_GROUP_ID]));
//немного дополним массив для дальнейших функций
$UserFields["ID"]=$arUser["ID"];
if(isset($UserFields["UF_CUSTOM_POSITION"]))
$UserFields["UF_CUSTOM_POSITION_NAME"]=$AcceptedPosition[$UserFields["UF_CUSTOM_POSITION"]];
//надо проверить, если у юзверя не было привязки к подразделению,
if(empty($arUser["UF_DEPARTMENT"]) || !$arUser["UF_DEPARTMENT"]){
//а теперь есть?
if(!empty($UserFields["UF_DEPARTMENT"]) && isset($UserFields["UF_DEPARTMENT"])){
// значит надо добавить событие в кадровых изменения - принят на работу
SetStatusNew($UserFields);
}
} else {
if (is_array($arUser["UF_DEPARTMENT"])
&& is_array($UserFields["UF_DEPARTMENT"])
) {
// если подразделение было раньше другим,
if (!array_equal($arUser["UF_DEPARTMENT"], $UserFields["UF_DEPARTMENT"])) {
// то добавляем в историю перемещение
SetStatusMoved($UserFields, "Перемещение");
} else {
if ($UserFields["UF_CUSTOM_POSITION"] != $arUser["UF_CUSTOM_POSITION"] && $UserFields["UF_CUSTOM_POSITION"] > 0) {
//кроме того может быть и смена должности, пихаю в else т.к. если и то и то то первого будет достаточно
SetStatusMoved($UserFields, "Новая должность");
}
}
}
}
}
}
endwhile;
die("success");
Есть ли быстрый способ решить эту проблему?
Как посмотреть пользователей которые пришли во время обмена с AD?
Как записать в лог всех пользователей которые есть в xml с 1с?