Your IP : 216.73.216.170
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("");
if (in_array(20, CUser::GetUserGroupArray())) {
LocalRedirect('/projects/');
}
$APPLICATION->SetTitle(false);
$APPLICATION->SetPageProperty('template_body_class', 'body_main_page');
$APPLICATION->SetPageProperty('title', 'Главная');
$APPLICATION->SetPageProperty('browser_title', 'Главная');
$entity = \Bitrix\Iblock\Model\Section::compileEntityByIblock(IBLOCK_DEPARTMENT);
$headedDepartment = $entity::getList([
'filter' => ['ACTIVE' => 'Y', 'IBLOCK_ID' => IBLOCK_DEPARTMENT, 'UF_HEAD' => $USER->GetID()],
'select' => ['NAME', 'ID']
])->fetch();
$isHead = false; $currentDepartment = 0;
if ($headedDepartment) {
$isHead = true;
$currentDepartment = $headedDepartment['ID'];
}
$commonUser = !$isHead && !$USER->IsAdmin() && !in_array(33, CUser::GetUserGroupArray());
$notifies = [];
if ($commonUser) {
\Bitrix\Main\Loader::includeModule('im');
$notify = new CIMNotify;
$notifies = array_chunk($notify->GetNotifyList(), 3)[0];
}
if ($commonUser) {
$reportLink = '/company/personal/report_time/';
} else {
$reportLink = '/company/personal/report_time_all/';
}
$selectedDepartments = $_GET['departments'];
if (!$selectedDepartments && $isHead && !in_array(33, CUser::GetUserGroupArray())) {
$selectedDepartments = [$currentDepartment];
}
$selectedDate = $_GET['date-range'];
if (strpos($selectedDate, '—') !== false) {
$dates = explode(' — ', $selectedDate);
$minDate = $dates[0];
$maxDate = $dates[1];
} elseif (!$selectedDate) {
$minDate = date('01.m.Y', time());
$maxDate = date('d.m.Y', time());
$selectedDate = "$minDate — $maxDate";
} else {
$minDate = $maxDate = htmlspecialchars($selectedDate);
}
$userIds = [];
if ($selectedDepartments) {
$userList = \Bitrix\Main\UserTable::getList([
'filter' => ['@UF_DEPARTMENT' => $selectedDepartments, 'ACTIVE' => 'Y'],
'select' => ['ID']
]);
while ($user = $userList->fetch()) {
$userIds[] = $user['ID'];
}
} elseif (!$USER->IsAdmin()) {
$userIds = [$USER->GetID()];
}
$tasks['expired'] = $taskList = CTasks::GetList([], [
'CREATED_BY' => $userIds,
'>=CREATED_DATE' => $minDate,
'<=CREATED_DATE' => $maxDate,
'ZOMBIE' => 'N',
'STATUS' => CTasks::METASTATE_EXPIRED
])->SelectedRowsCount();
$tasks['completed'] = $taskList = CTasks::GetList([], [
'CREATED_BY' => $userIds,
'>=CLOSED_DATE' => $minDate,
'<=CLOSED_DATE' => $maxDate,
'ZOMBIE' => 'N',
'STATUS' => CTasks::STATE_COMPLETED
])->SelectedRowsCount();
$tasks['progress'] = $taskList = CTasks::GetList([], [
'CREATED_BY' => $userIds,
'>=CREATED_DATE' => $minDate,
'<=CREATED_DATE' => $maxDate,
'ZOMBIE' => 'N',
'STATUS' => CTasks::STATE_IN_PROGRESS
])->SelectedRowsCount();
$tasks['total'] = $tasks['expired'] + $tasks['completed'] + $tasks['progress'];
$timeFilter = [
'>=DATE_START' => $minDate,
'<=DATE_START' => $maxDate,
];
if (!empty($userIds)) {
$timeFilter['@USER_ID'] = $userIds;
}
$timeList = \Bitrix\Tasks\Internals\Task\ElapsedTimeTable::getList([
'select' => ['SUM', 'DAY'],
'runtime' => [
new Bitrix\Main\Entity\ExpressionField('SUM', 'SUM(SECONDS)'),
new Bitrix\Main\Entity\ExpressionField('DAY', "DATE(DATE_START)")
],
'order' => ['DAY' => 'ASC'],
'filter' => $timeFilter,
'group' => ['DAY']
])->fetchAll();
$chartData = [];
foreach ($timeList as $time) {
if ($time['DAY'] instanceof Bitrix\Main\Type\Date)
$chartData[] = [
'date' => $time['DAY']->format('Y-m-d'),
'value' => round ($time['SUM'] / 3600),
];
};
$timeList = \Bitrix\Tasks\Internals\Task\ElapsedTimeTable::getList([
'select' => ['SUM', 'USER_ID'],
'runtime' => [
new Bitrix\Main\Entity\ExpressionField('SUM', 'SUM(SECONDS)'),
// new Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(TASK_ID)'),
],
'order' => ['SUM' => 'DESC'],
'filter' => $timeFilter,
'group' => ['USER_ID'],
'limit' => 10,
])->fetchAll();
$topUserList = [];
$topUserIds = [];
foreach ($timeList as $time) {
$topUserIds[] = $time['USER_ID'];
$topUserList[$time['USER_ID']] = [
'id' => $time['USER_ID'],
// 'tasks' => $time['CNT'],
'time' => $time['SUM'],
];
}
if (!empty($topUserIds)) {
$taskList = \Bitrix\Tasks\Internals\TaskTable::getList([
'filter' => [
'@RESPONSIBLE_ID' => $topUserIds,
'!ZOMBIE' => 'Y',
'!STATUS' => CTasks::STATE_COMPLETED
],
'select' => ['RESPONSIBLE_ID', 'CNT'],
'runtime' => [
new Bitrix\Main\Entity\ExpressionField('CNT', 'COUNT(*)'),
],
'group' => ['RESPONSIBLE_ID'],
'order' => ['RESPONSIBLE_ID' => 'ASC']
]);
foreach ($taskList as $task) {
$topUserList[$task['RESPONSIBLE_ID']]['tasks'] = $task['CNT'];
}
}
?>
<?$APPLICATION->IncludeComponent(
"dgtl:main.filters",
"main",
Array(
'SHOW_ALL' => 'N',
'SHOW_DEPARTMENTS_FILTER' => 'Y',
'CACHE_TYPE' => 'N',
'CACHE_TIME' => 0,
'SELECTED_DEPARTMENTS' => $selectedDepartments,
)
);?>
<div class="custom-main-page">
<div class="hero-grid">
<div class="hero-grid-item hero-grid-item--middle">
<div class="hero-grid-holder">
<a href="/about/news/"><h3 class="hero-grid-title" title="Новости компании">Новости компании</h3></a>
<?$APPLICATION->IncludeComponent(
"bitrix:news.list",
"main_news",
Array(
"ACTIVE_DATE_FORMAT" => "d.m.Y",
"ADD_SECTIONS_CHAIN" => "N",
"AJAX_MODE" => "N",
"AJAX_OPTION_ADDITIONAL" => "",
"AJAX_OPTION_HISTORY" => "N",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "N",
"CACHE_FILTER" => "N",
"CACHE_GROUPS" => "N",
"CACHE_TIME" => "36000000",
"CACHE_TYPE" => "A",
"CHECK_DATES" => "Y",
"DETAIL_URL" => "/about/news/official.php?ID=#ELEMENT_ID#",
"DISPLAY_BOTTOM_PAGER" => "N",
"DISPLAY_TOP_PAGER" => "N",
"FIELD_CODE" => array("NAME","PREVIEW_PICTURE","DETAIL_PICTURE",""),
"FILTER_NAME" => "",
"HIDE_LINK_WHEN_NO_DETAIL" => "N",
"IBLOCK_ID" => "2",
"IBLOCK_TYPE" => "news",
"INCLUDE_IBLOCK_INTO_CHAIN" => "N",
"INCLUDE_SUBSECTIONS" => "N",
"MESSAGE_404" => "",
"NEWS_COUNT" => "3",
"PAGER_BASE_LINK_ENABLE" => "N",
"PAGER_DESC_NUMBERING" => "N",
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
"PAGER_SHOW_ALL" => "N",
"PAGER_SHOW_ALWAYS" => "N",
"PAGER_TEMPLATE" => "",
"PAGER_TITLE" => GetMessage('VEB_SHOW_MORE'),
"PARENT_SECTION" => "",
"PARENT_SECTION_CODE" => "",
"PREVIEW_TRUNCATE_LEN" => 70,
"PROPERTY_CODE" => array("",""),
"SET_BROWSER_TITLE" => "N",
"SET_LAST_MODIFIED" => "N",
"SET_META_DESCRIPTION" => "N",
"SET_META_KEYWORDS" => "N",
"SET_STATUS_404" => "N",
"SET_TITLE" => "N",
"SHOW_404" => "N",
"SORT_BY1" => "ACTIVE_FROM",
"SORT_BY2" => $arParams["SORT_BY2"],
"SORT_ORDER1" => "DESC",
"SORT_ORDER2" => $arParams["SORT_ORDER2"],
"STRICT_SECTION_CHECK" => "N"
),
$component,
Array(
'HIDE_ICONS' => 'Y',
'ACTIVE_COMPONENT' => 'Y'
)
);?>
</div>
</div>
<div class="hero-grid-item hero-grid-item--middle">
<div class="hero-grid-holder">
<h3 class="hero-grid-title" title="Отчёт по задачам">Отчёт по задачам</h3>
<div class="report-tasks">
<div class="report-tasks-chart">
<div class="chart-holder">
<div id="chart-tasks">
</div>
<div class="chart-holder-total">
<div class="chart-holder-label">
Всего задач
</div>
<div class="chart-holder-value" data-number="<?=$tasks['total'];?>"></div>
</div>
</div>
</div>
<div class="report-tasks-legend">
<ul class="list">
<li class="list-item">
<div class="list-item-label -blue">
<a href="<?=$reportLink . '?' . http_build_query(['status' => CTasks::STATE_COMPLETED, 'departments' => $selectedDepartments, 'date-range' => $selectedDate])?>">
Выполненные
</a>
</div>
<span class="list-item-value"><?=$tasks['completed'];?></span> </li>
<li class="list-item">
<div class="list-item-label -red">
<a href="<?=$reportLink . '?' . http_build_query(['status' => CTasks::METASTATE_EXPIRED, 'departments' => $selectedDepartments, 'date-range' => $selectedDate]);?>">
Просроченные
</a>
</div>
<span class="list-item-value"><?=$tasks['expired'];?></span> </li>
<li class="list-item">
<div class="list-item-label -orange">
<a href="<?=$reportLink . '?' . http_build_query(['status' => CTasks::STATE_IN_PROGRESS, 'departments' => $selectedDepartments, 'date-range' => $selectedDate]);?>">
В работе
</a>
</div>
<span class="list-item-value"><?=$tasks['progress'];?></span> </li>
</ul>
</div>
</div>
</div>
</div>
<div class="hero-grid-item hero-grid-item--small">
<div class="hero-grid-holder">
<a href="/about/news/br.php"><h3 class="hero-grid-title" title="Бизнес-ритм. Информация с ОС ГД">Бизнес-ритм. Информация с ОС ГД</h3></a>
<?$APPLICATION->IncludeComponent(
"bitrix:news.list",
"main_br",
Array(
"ACTIVE_DATE_FORMAT" => "d.m.Y",
"ADD_SECTIONS_CHAIN" => "Y",
"AJAX_MODE" => "N",
"AJAX_OPTION_ADDITIONAL" => "",
"AJAX_OPTION_HISTORY" => "N",
"AJAX_OPTION_JUMP" => "N",
"AJAX_OPTION_STYLE" => "N",
"CACHE_FILTER" => "N",
"CACHE_GROUPS" => "N",
"CACHE_TIME" => "36000000",
"CACHE_TYPE" => "A",
"CHECK_DATES" => "Y",
"DETAIL_URL" => "/about/news/br.php?ELEMENT_ID=#ELEMENT_ID#",
"DISPLAY_BOTTOM_PAGER" => "N",
"DISPLAY_TOP_PAGER" => "N",
"FIELD_CODE" => array("NAME","PREVIEW_PICTURE","DETAIL_PICTURE","PREVIEW_TEXT"),
"FILTER_NAME" => "",
"HIDE_LINK_WHEN_NO_DETAIL" => "N",
"IBLOCK_ID" => "1",
"IBLOCK_TYPE" => "news",
"INCLUDE_IBLOCK_INTO_CHAIN" => "N",
"INCLUDE_SUBSECTIONS" => "Y",
"MESSAGE_404" => "",
"NEWS_COUNT" => "3",
"PAGER_BASE_LINK_ENABLE" => "N",
"PAGER_DESC_NUMBERING" => "N",
"PAGER_DESC_NUMBERING_CACHE_TIME" => "36000",
"PAGER_SHOW_ALL" => "N",
"PAGER_SHOW_ALWAYS" => "N",
"PAGER_TEMPLATE" => "",
"PAGER_TITLE" => GetMessage('VEB_SHOW_MORE'),
"PARENT_SECTION" => "",
"PARENT_SECTION_CODE" => "",
"PREVIEW_TRUNCATE_LEN" => '70',
"PROPERTY_CODE" => array("",""),
"SET_BROWSER_TITLE" => "N",
"SET_LAST_MODIFIED" => "N",
"SET_META_DESCRIPTION" => "N",
"SET_META_KEYWORDS" => "N",
"SET_STATUS_404" => "N",
"SET_TITLE" => "N",
"SHOW_404" => "N",
"SORT_BY1" => "ACTIVE_FROM",
"SORT_BY2" => $arParams["SORT_BY2"],
"SORT_ORDER1" => "DESC",
"SORT_ORDER2" => $arParams["SORT_ORDER2"],
"STRICT_SECTION_CHECK" => "N"
),
$component,
Array(
'HIDE_ICONS' => 'Y',
'ACTIVE_COMPONENT' => 'Y'
)
);?>
</div>
</div>
<div class="hero-grid-item hero-grid-item--small">
<div class="hero-grid-holder">
<h3 class="hero-grid-title" title="График затраченного времени">График затраченного времени</h3>
<div class="tasks-time">
<div class="tasks-time-label">
Часы
</div>
<div id="chart-time">
</div>
</div>
</div>
</div>
<div class="hero-grid-item hero-grid-item--large">
<?if (!$commonUser) {?>
<div class="hero-grid-holder">
<h3 class="hero-grid-title" title="Загрузка сотрудников">Загрузка сотрудников</h3>
<div class="main-staff">
<?foreach ($topUserList as $user) {?>
<a class="main-staff-item" href="/company/personal/user/<?=$user['id']?>/">
<?
// $photoId = getUserInfoById($user['id'], ['PERSONAL_PHOTO'])['PERSONAL_PHOTO'];
?>
<div class="main-staff-image">
<?=getUserPhoto($user['id'], true);?>
</div>
<div class="main-staff-title">
<div>
<?=getUserLinkById($user['id'], true)?>
</div>
Задач: <?=intval($user['tasks']);?>
</div>
<div class="main-staff-time">
<?=formatSecondsToHoursWithMinutes($user['time']);?>
</div>
</a>
<?}?>
</div>
</div>
<?} else {?>
<div class="hero-grid-holder">
<h3 class="hero-grid-title" title="Загрузка сотрудников">Последние уведомления</h3>
<div class="main-staff">
<?foreach ($notifies as $item) {?>
<div class="main-staff-item" href="/company/personal/user/<?=$item['userId']?>/">
<?
// $photoId = getUserInfoById($user['id'], ['PERSONAL_PHOTO'])['PERSONAL_PHOTO'];
?>
<div class="main-staff-image">
<img src="<?=getUserPhoto($item['userId']);?>" alt="">
</div>
<div class="main-staff-title">
<div>
<?=getUserLinkById($item['userId'], true)?>
</div>
<?=($item['text']);?>
</div>
<div class="main-staff-time">
<?=$item['date']->format("d.m.y");?><br>
<?=$item['date']->format("H:i:s");?>
</div>
</div>
<?}?>
</div>
</div>
<?}?>
</div>
</div>
</div>
<?
//CJSCore::Init(['amcharts']);
\Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/main/amcharts/4.8.5/core.js');
\Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/main/amcharts/4.8.5/charts.js');
\Bitrix\Main\Page\Asset::getInstance()->addJs('/bitrix/js/main/amcharts/4.8.5/themes/animated.js');
?>
<script>
am4core.ready(function () {
am4core.addLicense("CH49955073");
am4core.useTheme(am4themes_animated);
/* Chart 1 */
var chart = am4core.create("chart-tasks", am4charts.PieChart);
var pieSeries = chart.series.push(new am4charts.PieSeries());
pieSeries.dataFields.value = "value";
chart.innerRadius = am4core.percent(58);
pieSeries.slices.template.strokeWidth = 0;
pieSeries.labels.template.disabled = true;
pieSeries.tooltip.disabled = true;
pieSeries.ticks.template.disabled = true;
pieSeries.scale = 1.25;
pieSeries.colors.list = [
am4core.color("#3e4ea6"),
am4core.color("#ff559a"),
am4core.color("#ffa25d")
];
var slice = pieSeries.slices.template;
slice.states.getKey("hover").properties.scale = 1;
slice.states.getKey("active").properties.shiftRadius = 0;
chart.data = [{
"value": <?=intval($tasks['completed'])?>
},
{
"value": <?=intval($tasks['expired'])?>
},
{
"value": <?=intval($tasks['progress'])?>
}
];
/* Chart 2 */
var chart2 = am4core.create("chart-time", am4charts.XYChart);
chart2.colors.currentColor.rgb.r = 59;
chart2.colors.currentColor.rgb.g = 112;
chart2.colors.currentColor.rgb.b = 235;
var chartData = <?=CUtil::PhpToJSObject($chartData);?>;
chart2.data = chartData;
var categoryAxis = chart2.xAxes.push(new am4charts.DateAxis());
categoryAxis.dataFields.category = "date";
categoryAxis.renderer.minGridDistance = 37;
categoryAxis.fontSize = 15;
categoryAxis.paddingTop = 16;
categoryAxis.renderer.grid.template.strokeWidth = 1;
categoryAxis.renderer.grid.template.strokeOpacity = 1;
categoryAxis.renderer.grid.template.strokeDasharray = 2;
categoryAxis.renderer.grid.template.stroke = '#012345';
categoryAxis.dateFormats.setKey("day", "dd.MM");
categoryAxis.periodChangeDateFormats.setKey("day", "dd.MM");
categoryAxis.dateFormats.setKey("week", "dd.MM");
categoryAxis.periodChangeDateFormats.setKey("week", "dd.MM");
categoryAxis.dateFormats.setKey("month", "dd.MM");
categoryAxis.periodChangeDateFormats.setKey("month", "dd.MM");
var valueAxis = chart2.yAxes.push(new am4charts.ValueAxis());
valueAxis.baseValue = 0;
valueAxis.min = 0;
valueAxis.fontSize = 18;
valueAxis.paddingRight = 30;
valueAxis.renderer.baseGrid.disabled = true;
valueAxis.renderer.grid.template.strokeWidth = 1;
valueAxis.renderer.grid.template.strokeOpacity = 1;
valueAxis.renderer.grid.template.strokeDasharray = 2;
valueAxis.renderer.grid.template.stroke = '#012345';
var series = chart2.series.push(new am4charts.LineSeries());
series.dataFields.valueY = "value";
series.dataFields.dateX = "date";
series.stroke = '#3b70eb'
series.fillOpacity = 1;
series.strokeWidth = 7;
series.tensionX = 0.9;
series.tensionY = 0.9;
series.defaultState.transitionDuration = 2000;
var bullet = series.bullets.push(new am4charts.Bullet());
bullet.tooltipText = "{valueY}";
chart2.cursor = new am4charts.XYCursor();
var gradient = new am4core.LinearGradientModifier();
gradient.opacities = [0.5, 0.3, 0, 0];
gradient.offsets = [0, 0.1, 0.9, 1];
gradient.gradient.rotation = 90;
series.segments.template.fillModifier = gradient;
});
$(function () {
function numbersAnimate($elem)
{
var number = parseInt($elem.data('number'));
var start = 0;
var speed = 8;
var step = 10;
if ($(window).height() < 768) {
speed = 4;
step = 100;
}
if (number > 0 && $elem.html() === '') {
var interval = setInterval(function () {
if (start < number) {
var count = Math.max(Math.pow(step, String(start).length - 2), Math.round(step / 10));
start += count;
// console.log(start, count, String(start).length);
$elem.html(start);
} else {
$elem.html($elem.data('number'));
clearInterval(interval);
}
}, speed);
}
}
numbersAnimate($('.chart-holder-value'));
});
</script>
<style>
.pagetitle-wrap {
display: none !important;
}
</style>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>