Услуги профессионального Битрикс-программиста

Отчет по сотрудникам компании в Битрикс24 (количество, возраст, пол и тд)


данный отчет выводит данные
  • Всего сотрудников
  • Средний грейд
  • Средний возраст
  • Сколько в процентном соотношении женщин и мужчин
  • Города
по компании и по подразделениям

ниже выводится список всех сотрудников с данными полями


собираем данные
//подразделения
$arSubdivisions = CIBlockSection::GetList(Array("SORT"=>"ASC"), Array("IBLOCK_ID" => 1), false, Array(), false);
$arResult['SUBDIVISION'] = [];
while($row = $arSubdivisions->Fetch()){           
   $arResult['SUBDIVISION'][$row['ID']] = [        
      "NAME" => $row['NAME']        
   ];
}



$data = CUser::GetList(($by="ID"), ($order="ASC"),
    array(
        'GROUPS_ID' => ['11'], //группа сотрудники
        'ACTIVE' => 'Y',       

    ),
    array(
       'SELECT' => array("UF_GRADE","UF_DEPARTMENT"),
       'NAV_PARAMS' => array(
           'nTopCount' => 100
       ),
       'FIELDS' => array(
           'ID',
           'NAME',
           'LAST_NAME',
           'PERSONAL_GENDER',
           'PERSONAL_BIRTHDAY',
           'PERSONAL_CITY'

       ),
       
   )
);

$arResult["USERS"] = [];
$date = time();

$grade = 0;
$cnt = 0;
$age = 0;
$male = 0;
$female = 0; 
$nomale = 0; 
$findGender = 0;
$findDate = 0;
$arCities = [];
$arCitiesCnt = [];

while($arUser = $data->Fetch()) {
   if($arUser["ID"]==812) continue; //сотрудник для тестов, не нужен в отчете
   
   $cnt++;
   $grade += intval($arUser["UF_GRADE"]);
   if(!empty($arUser["PERSONAL_BIRTHDAY"])){      
      $age += date('Y',($date - strtotime($arUser["PERSONAL_BIRTHDAY"]))) - 1970;
      $findDate++;
   }
   if(!empty($arUser['PERSONAL_GENDER'])){
      if($arUser['PERSONAL_GENDER']=="M"){
         $male++;
      }
      else{
         $female++;
      }
      $findGender++;
   }
   else{
      $nomale;
   }
   if(!empty($arUser['PERSONAL_CITY'])){
      if(!in_array($arUser['PERSONAL_CITY'], $arCities)){
         $arCities[] = $arUser['PERSONAL_CITY'];
         $arCitiesCnt[] = 1;
      }
      else{
         $arCitiesCnt[array_search($arUser['PERSONAL_CITY'],$arCities)] += 1;
      }
   }
   $arUser["UF_DEPARTMENT"] = $arUser["UF_DEPARTMENT"][0];
   $arResult["USERS"][$arUser["UF_DEPARTMENT"]][] = $arUser;

   $arUser["UF_DEPARTMENT"] = $arResult["SUBDIVISION"][$arUser["UF_DEPARTMENT"]]["NAME"];
   $arUser["PERSONAL_GENDER"] = str_replace(['M','F'], ['муж','жен'], $arUser["PERSONAL_GENDER"]);
   $arResult["ROWS"][] = ['data'=>$arUser,'action'=>[]];

}

$arResult["TOTAL_USERS"] = $cnt;
$arResult["GRADE_MIDDLE"] = round($grade / $cnt, 2);
$arResult["MIDDLE_AGE"] = round($age/$findDate, 2);
$arResult["MALE"] = round($male*100/$findGender,2);
$arResult["FEMALE"] = round($female*100/$findGender,2);
//$arResult["NOMALE"] = $nomale;
$arResult["CITIES"] = $arCities;
$arResult["CITIES_CNT"] = $arCitiesCnt;


if(!CModule::IncludeModule("iblock")) {      
  ShowError("CIBlockSection_NOT_INSTALLED");
  return false;
}
//подразделения
foreach ($arResult['SUBDIVISION'] as $id => &$arDivision) {
     $grade = 0;
   $cnt = 0;
   $age = 0;
   $male = 0;
   $female = 0; 
   $findGender = 0;
   $findDate = 0;
   $arCities = [];
   $arCitiesCnt = [];
   foreach ($arResult["USERS"][$id] as $arUser) {
      $cnt++;
      $grade += intval($arUser["UF_GRADE"]);
      if(!empty($arUser["PERSONAL_BIRTHDAY"])){      
         $age += date('Y',($date - strtotime($arUser["PERSONAL_BIRTHDAY"]))) - 1970;
         $findDate++;
      }
      if(!empty($arUser['PERSONAL_GENDER'])){
         if($arUser['PERSONAL_GENDER']=="M"){
            $male++;
         }
         else{
            $female++;
         }
         $findGender++;
      }
      if(!empty($arUser['PERSONAL_CITY'])){
         if(!in_array($arUser['PERSONAL_CITY'], $arCities)){
            $arCities[] = $arUser['PERSONAL_CITY'];
            $arCitiesCnt[] = 1;
         }
         else{
            $arCitiesCnt[array_search($arUser['PERSONAL_CITY'],$arCities)] += 1;
         }
      }
   }         
   $arDivision = [
        "NAME" => $arDivision['NAME'],
        "TOTAL_USERS" => $cnt++,
        "GRADE_MIDDLE" => round($grade / $cnt, 2),
        "MIDDLE_AGE" =>$findDate ?round($age/$findDate, 2) : 0,
        "MALE" => $findGender ? round($male*100/$findGender,2) : 0,
        "FEMALE" => $findGender ? round($female*100/$findGender,2) : 0,
        "CITIES" => $arCities,
      "CITIES_CNT" => $arCitiesCnt
   ];

}
//для вывода списка сотрудников
$arResult['columns'] = [
   ['id' => 'ID', 'name' => 'ID', 'sort' => '1', 'default' => true],
   ['id' => 'LAST_NAME', 'name' => 'Фамилия', 'sort' => '2', 'default' => true],
   ['id' => 'NAME', 'name' => 'Имя', 'sort' => '3', 'default' => true],
   ['id' => 'PERSONAL_GENDER', 'name' => 'Пол', 'sort' => '1', 'default' => true],
   ['id' => 'PERSONAL_BIRTHDAY', 'name' => 'День рождения', 'sort' => '1', 'default' => true],
   ['id' => 'PERSONAL_CITY', 'name' => 'Город', 'sort' => '1', 'default' => true],
   ['id' => "UF_GRADE", 'name' => "Уровень(грейд)", 'sort' => '1', 'default' => true],
   ['id' => "UF_DEPARTMENT", 'name' => "Подразделение", 'sort' => '1', 'default' => true],


];

  

выводим
<h2>Компания</h2>
<table class="report" cellspacing="0">
    <tr><td >Всего сотрудников</td><td><?=$arResult["TOTAL_USERS"]?></td></tr>
    <tr><td>Средний грейд</td><td><?=$arResult["GRADE_MIDDLE"]?></td></tr>
    <tr><td>Средний возраст</td><td><?=$arResult["MIDDLE_AGE"]?></td></tr>
    <tr><td>Женщин</td><td><?=$arResult["FEMALE"]?>%</td></tr>
    <tr><td>Мужчин</td><td><?=$arResult["MALE"]?>%</td></tr>
    <tr><td>Города</td><td>
        <?foreach ($arResult["CITIES"] as $keyCity => $city):?>
            <?=$city?>(<?=$arResult["CITIES_CNT"][$keyCity]?>)  
        <?endforeach;?>
    </td></tr>
    <!-- <tr><td></td><td></td></tr>  -->
</table>
<h2>По подразделениям</h2>
  <table class="report" cellspacing="0">
<?foreach ($arResult['SUBDIVISION'] as $arDivision):?>  
        <tr><th colspan="2"><?=$arDivision["NAME"]?></th></tr>
        <tr><td >Cотрудников</td><td><?=$arDivision["TOTAL_USERS"]?></td></tr>
        <tr><td>Средний грейд</td><td><?=$arDivision["GRADE_MIDDLE"]?></td></tr>
        <tr><td>Средний возраст</td><td><?=$arDivision["MIDDLE_AGE"]?></td></tr>
        <tr><td>Женщин</td><td><?=$arDivision["FEMALE"]?>%</td></tr>
        <tr><td>Мужчин</td><td><?=$arDivision["MALE"]?>%</td></tr>
        <tr><td>Города</td><td>
        <?foreach ($arDivision["CITIES"] as $keyCity => $city):?>
            <?=$city?>(<?=$arDivision["CITIES_CNT"][$keyCity]?>)  
        <?endforeach;?>
    </td></tr>        
    
<?endforeach;?>
    </table>
    <h2>Список сотрудников</h2>

 <?
        $APPLICATION->IncludeComponent('bitrix:main.ui.grid', '', [
            'GRID_ID' => "hr_report",
            'COLUMNS' => $arResult['columns'],
            'ROWS' => $arResult['ROWS'],
            'SHOW_ROW_CHECKBOXES' => false,
            'NAV_OBJECT' => $arResult['nav'],
            'AJAX_MODE' => 'Y',
            'AJAX_ID' => \CAjax::getComponentID('bitrix:main.ui.grid', '.default', ''),
            'PAGE_SIZES' =>  [
               
                ['NAME' => '100', 'VALUE' => '100']
            ],
            'AJAX_OPTION_JUMP'          => 'N',
            'SHOW_CHECK_ALL_CHECKBOXES' => false,
            'SHOW_ROW_ACTIONS_MENU'     => true,
            'SHOW_GRID_SETTINGS_MENU'   => true,
            'SHOW_NAVIGATION_PANEL'     => true,
            'SHOW_PAGINATION'           => false,
            'SHOW_SELECTED_COUNTER'     => true,
            'SHOW_TOTAL_COUNTER'        => true,
            'SHOW_PAGESIZE'             => true,
            'SHOW_ACTION_PANEL'         => true,
            'ALLOW_COLUMNS_SORT'        => true,
            'ALLOW_COLUMNS_RESIZE'      => true,
            'ALLOW_HORIZONTAL_SCROLL'   => true,
            'ALLOW_SORT'                => true,
            'ALLOW_PIN_HEADER'          => true,
            'AJAX_OPTION_HISTORY'       => 'N'
        ]);