Your IP : 216.73.216.170
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("");
// if (in_array(20, CUser::GetUserGroupArray())) {
// LocalRedirect('/projects/');
// }
$APPLICATION->SetAdditionalCSS("/local/assets/css/mr_index.css");
$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());
if (date('d') < 7) {
$minDate = date('d.m.Y', time() - 86400 * 7);
}
$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()];
}
$timeFilter = [
'>=CREATED_DATE' => new \Bitrix\Main\Type\DateTime($minDate),
'<=CREATED_DATE' => \Bitrix\Main\Type\DateTime::createFromTimestamp(strtotime($maxDate) + 86399),
];
if (!empty($userIds)) {
$timeFilter['@USER_ID'] = $userIds;
}
$times = \Bitrix\Tasks\Internals\Task\ElapsedTimeTable::getList([
'filter' => $timeFilter,
'select' => ['TASK_ID'],
'group' => ['TASK_ID']
])->fetchAll();
$timedTaskIds = [];
foreach ($times as $item) {
$timedTaskIds[] = $item['TASK_ID'];
}
if (!empty($timedTaskIds)) {
$tasks['expired'] = \Bitrix\Tasks\Internals\TaskTable::getList([
'filter' => [
'@ID' => $timedTaskIds,
'ZOMBIE' => 'N',
'!STATUS' => CTasks::STATE_COMPLETED,
'<=DEADLINE' => new \Bitrix\Main\Type\Datetime()
],
'select' => ['ID']
])->getSelectedRowsCount();
$tasks['completed'] = $taskList = \Bitrix\Tasks\Internals\TaskTable::getList([
'filter' => [
'@ID' => $timedTaskIds,
'ZOMBIE' => 'N',
'STATUS' => CTasks::STATE_COMPLETED,
],
'select' => ['ID', 'DEADLINE']
])->getSelectedRowsCount();
$tasks['progress'] = \Bitrix\Tasks\Internals\TaskTable::getList([
'filter' => [
'@ID' => $timedTaskIds,
'ZOMBIE' => 'N',
'STATUS' => CTasks::STATE_IN_PROGRESS,
[
'>DEADLINE' => new \Bitrix\Main\Type\Datetime(),
'LOGIC' => 'OR',
'DEADLINE' => false
]
],
'select' => ['ID']
])->getSelectedRowsCount();
$tasks['other'] = \Bitrix\Tasks\Internals\TaskTable::getList([
'filter' => [
'@ID' => $timedTaskIds,
'ZOMBIE' => 'N',
'!STATUS' => [CTasks::STATE_COMPLETED, CTasks::STATE_IN_PROGRESS],
[
'>DEADLINE' => new \Bitrix\Main\Type\Datetime(),
'LOGIC' => 'OR',
'DEADLINE' => false
]
],
'select' => ['ID']
])->getSelectedRowsCount();
} else {
$tasks['expired'] = $tasks['completed'] = $tasks['progress'] = $tasks['other'] = 0;
}
$tasks['total'] = $tasks['expired'] + $tasks['completed'] + $tasks['progress'] + $tasks['other'];
$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(CREATED_DATE)")
],
'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)) {
$newTimeFilter = $timeFilter;
$newTimeFilter['@USER_ID'] = $topUserIds;
$times = \Bitrix\Tasks\Internals\Task\ElapsedTimeTable::getList([
'filter' => $newTimeFilter,
'select' => ['TASK_ID', 'USER_ID'],
'group' => ['USER_ID']
])->fetchAll();
foreach ($times as $item) {
$topUserList[$item['USER_ID']]['tasks'][$item['TASK_ID']] = $item['TASK_ID'];
}
foreach ($topUserList as $userId => &$userInfo) {
$userInfo['tasks'] = count($userInfo['tasks']);
}
}
?>
<div class="custom-main-page">
<div class="diagram__blocks">
<div class="diagram__block">
<div class="diagram__block-header">
<div class="select">
<input class="select__input" type="hidden" name="">
<div class="select__head">Все</div>
<ul class="select__list" style="display: none;">
<li class="select__item">Заглушка</li>
<li class="select__item">Заглушка</li>
<li class="select__item">Заглушка</li>
</ul>
</div>
</div>
<div class="dialog__block-body">
<div style="width: 100%; min-height: 100%; display:flex; justify-content: center; align-items: center">
<h1 style="font-size: 50px">Заглушка</h1>
</div>
</div>
</div>
<div class="diagram__block">
<div class="diagram__block-header">
<div class="select">
<input class="select__input" type="hidden" name="">
<div class="select__head">Павелецкая сити</div>
<ul class="select__list" style="display: none;">
<li class="select__item">Заглушка</li>
<li class="select__item">Заглушка</li>
<li class="select__item">Заглушка</li>
</ul>
</div>
<div class="time">
<p class="time__item">Год</p>
<p class="time__item active">Квартал</p>
<p class="time__item">Месяц</p>
<p class="time__item">Неделя</p>
</div>
</div>
<div class="dialog__block-body">
<div class="dialog__block-timeline">
<div class="main__timeline">
<div class="upper__events">
<div class="timeline__event">
<h5>События "П"</h5>
<p>15 янв 2023</p>
<div class="red__mark green">
<div class="circle green">
</div>
</div>
</div>
<div class="timeline__event">
<h5>События "П"</h5>
<p>15 янв 2023</p>
<div class="red__mark">
<div class="circle">
</div>
</div>
</div>
<div class="timeline__event">
<h5>События "П"</h5>
<p>15 янв 2023</p>
<div class="red__mark violet">
<div class="circle violet">
</div>
</div>
</div>
<div class="timeline__event">
<h5>События "П"</h5>
<p>15 янв 2023</p>
<div class="red__mark">
<div class="circle">
</div>
</div>
</div>
</div>
<div class="quarters">
<!-- Длину шкалы можно указывать здесь, в процентах-->
<div class="quarter__color-block" style="width: 57%;">
<div class="quarter__color-block-date">
8 мар.
</div>
</div>
<div class="quarter">
<h5 class="quarter__title">1 Квартал</h5>
<div class="quarter__mouths">
<div class="quarter__mouth">Январь</div>
<div class="quarter__mouth">Февраль</div>
<div class="quarter__mouth">Март</div>
</div>
</div>
<div class="quarter">
<h5 class="quarter__title not-border">2 Квартал</h5>
<div class="quarter__mouths">
<div class="quarter__mouth">Апрель</div>
<div class="quarter__mouth">Май</div>
<div class="quarter__mouth not-border">Июнь</div>
</div>
</div>
</div>
<div class="upper__events under">
<div class="timeline__event">
<h5>События "П"</h5>
<p>15 янв 2023</p>
<div class="red__mark green under">
<div class="circle green under">
</div>
</div>
</div>
<div class="timeline__event">
<h5>События "П"</h5>
<p>15 янв 2023</p>
<div class="red__mark violet under">
<div class="circle violet under">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="vijets">
<div class="vijet__block">
<div class="vijet__header">
<img src="/local/assets/img/mr/1.png" alt="" class="vijet__header-photo">
</div>
<div class="vijet__info">
<div class="star">
<span class="ui-toolbar-star" id="uiToolbarStar" title="Добавить текущую страницу в левое меню"></span>
</div>
<h2 class="vijet__info-title">MOD</h2>
<h6 class="vijet__info-subtitle">Марьина роща 4-ая ул. Марьиной Рощи, вл. 12/1</h6>
<div class="vijet__info-item">
<span class="vijet__info-gray">Девелопер проекта</span>
<p class="vijet__info-name">Александровский Александр Александрович</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Текущая веха проекта</span>
<p class="vijet__info-name">Конструктив наземная часть</p>
</div>
<div class="vijet__info-footer">
<div class="vijet__info-item">
<span class="vijet__info-gray">Дирекция</span>
<p class="vijet__info-name">Дирекция проектов 1</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Очередь</span>
<p class="vijet__info-name">5</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Плановые затраты</span>
<p class="vijet__info-name">98 000 745 320 ₽</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Фактические затраты</span>
<p class="vijet__info-name">84 264 396 465 ₽</p>
</div>
</div>
<div class="vijet__info-lineprogress">
<div class="vijet__info-lineprogress-body">
<!-- Здесь можно проставлять проценты-->
<div class="vijet__info-lineprogress-procent" style="width: 90%;"></div>
</div>
<span class="text-procent">90%</span>
</div>
</div>
</div>
<div class="vijet__block">
<div class="vijet__header">
<img src="/local/assets/img/mr/2.png" alt="" class="vijet__header-photo">
</div>
<div class="vijet__info">
<div class="star">
<span class="ui-toolbar-star" id="uiToolbarStar" title="Добавить текущую страницу в левое меню"></span>
</div>
<h4 class="vijet__info-title">MOD</h4>
<h6 class="vijet__info-subtitle">Марьина роща 4-ая ул. Марьиной Рощи, вл. 12/1</h6>
<div class="vijet__info-item">
<span class="vijet__info-gray">Девелопер проекта</span>
<p class="vijet__info-name">Александровский Александр Александрович</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Текущая веха проекта</span>
<p class="vijet__info-name">Конструктив наземная часть</p>
</div>
<div class="vijet__info-footer">
<div class="vijet__info-item">
<span class="vijet__info-gray">Дирекция</span>
<p class="vijet__info-name">Дирекция проектов 1</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Очередь</span>
<p class="vijet__info-name">5</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Плановые затраты</span>
<p class="vijet__info-name">98 000 745 320 ₽</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Фактические затраты</span>
<p class="vijet__info-name">84 264 396 465 ₽</p>
</div>
</div>
<div class="vijet__info-lineprogress">
<div class="vijet__info-lineprogress-body">
<!-- Здесь можно проставлять проценты-->
<div class="vijet__info-lineprogress-procent" style="width: 90%;"></div>
</div>
<span class="text-procent">90%</span>
</div>
</div>
</div>
<div class="vijet__block">
<div class="vijet__header">
<img src="/local/assets/img/mr/3.png" alt="" class="vijet__header-photo">
</div>
<div class="vijet__info">
<div class="star">
<span class="ui-toolbar-star" id="uiToolbarStar" title="Добавить текущую страницу в левое меню"></span>
</div>
<h4 class="vijet__info-title">MOD</h4>
<h6 class="vijet__info-subtitle">Марьина роща 4-ая ул. Марьиной Рощи, вл. 12/1</h6>
<div class="vijet__info-item">
<span class="vijet__info-gray">Девелопер проекта</span>
<p class="vijet__info-name">Александровский Александр Александрович</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Текущая веха проекта</span>
<p class="vijet__info-name">Конструктив наземная часть</p>
</div>
<div class="vijet__info-footer">
<div class="vijet__info-item">
<span class="vijet__info-gray">Дирекция</span>
<p class="vijet__info-name">Дирекция проектов 1</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Очередь</span>
<p class="vijet__info-name">5</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Плановые затраты</span>
<p class="vijet__info-name">98 000 745 320 ₽</p>
</div>
<div class="vijet__info-item">
<span class="vijet__info-gray">Фактические затраты</span>
<p class="vijet__info-name">84 264 396 465 ₽</p>
</div>
</div>
<div class="vijet__info-lineprogress">
<div class="vijet__info-lineprogress-body">
<!-- Здесь можно проставлять проценты-->
<div class="vijet__info-lineprogress-procent" style="width: 90%;"></div>
</div>
<span class="text-procent">90%</span>
</div>
</div>
</div>
<div class="vijet__block add">
<div class="add__vijet">
<h2>+</h2>
<p>Добавить виджет</p>
</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>
jQuery(($) => {
$('.select').on('click', '.select__head', function () {
if ($(this).hasClass('open')) {
$(this).removeClass('open');
$(this).next().fadeOut();
} else {
$('.select__head').removeClass('open');
$('.select__list').fadeOut();
$(this).addClass('open');
$(this).next().fadeIn();
}
});
$('.select').on('click', '.select__item', function () {
$('.select__head').removeClass('open');
$(this).parent().fadeOut();
$(this).parent().prev().text($(this).text());
$(this).parent().prev().prev().val($(this).text());
});
$(document).click(function (e) {
if (!$(e.target).closest('.select').length) {
$('.select__head').removeClass('open');
$('.select__list').fadeOut();
}
});
});
</script>
<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"),
am4core.color("rgb(238, 242, 244)")
];
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'])?>
},
{
"value": <?=intval($tasks['other'])?>
}
];
/* 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");?>