Your IP : 216.73.216.170


Current Path : /home/bitrix/ext_www/mr.demo.yacl.site/
Upload File :
Current File : /home/bitrix/ext_www/mr.demo.yacl.site/mr_index.php

<?
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");?>