meraproject/themes/merakomis/download/controller.php
keboss-m 5c21d25d45 Initial commit: Merakomis portal, Docker stack and user-reader API.
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-24 11:04:05 +03:00

2821 lines
119 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?
namespace controller\themes\merakomis\download;
use PhpOffice\PhpSpreadsheet\Cell\CellAddress;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Fill;;
use themes\Merakomis;
use themes\merakomis\dictionary\Contractor;
use themes\merakomis\dictionary\Section;
use themes\merakomis\Emp;
use themes\merakomis\emp\Rules;
use themes\merakomis\Project;
use themes\merakomis\team\Member;
include_once __DIR__.'/../../../vendor/autoload.php';
class API {
/**
* @param Spreadsheet $spreadsheet
* @param $data
* @param $options
* @return void
*/
private static function writeMyProjects(Spreadsheet $spreadsheet, $data, $options){
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Работа над проектами');
$emp_id = intval($options['emp_id']) ? : Emp::$AUTH_ID;
$emp = Emp::getByID($emp_id);
$sheet->setCellValue('A1',Emp::getName($emp));
$sheet->setCellValue('A2','Работа над проектами');
$sheet->setCellValue('A3','В таблице представлена сводка часов, затраченных вами на реализацию проектов, в которых вы принимаете участие как член команды проекта.');
$INIT_ROW = $row = 5;
$sheet->setCellValue('A'.$row,'Шифр');
$sheet->setCellValue('B'.$row,'Название');
$sheet->setCellValue('C'.$row,'Статус');
$sheet->setCellValue('D'.$row,'Роль в проекте');
$sheet->setCellValue('E'.$row,'Раб., час');
$sheet->setCellValue('F'.$row,'Сверх., час');
$sheet->setCellValue('G'.$row,'Всего, час');
$sheet->setCellValue('H'.$row,'Архивный');
$row++;
foreach ($data['data'] as $v){
$sheet->setCellValue('A'.$row,$v['code']);
$sheet->setCellValue('B'.$row,$v['name']);
$sheet->setCellValue('C'.$row,$v['status']);
$sheet->setCellValue('D'.$row,$v['role']);
$sheet->setCellValue('E'.$row,$v['hours']);
$sheet->setCellValue('F'.$row,$v['over']);
$sheet->setCellValue('G'.$row,$v['total']);
$sheet->setCellValue('H'.$row,$v['archive']?'Архивный':'');
$row++;
}
$row++;
$sheet2 = new Worksheet($spreadsheet,"Отсутствие на рабочем месте");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex(1);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
$sheet->setCellValue('A'.($row++),'Отсутствие на рабочем месте');
$sheet->setCellValue('A'.($row++),'Сводная таблица отсутствия на рабочем месте. Данные представляются за выбранный в шапке страницы период или за все время работы, если период явно не задан. Значения указаны в днях.');
$row++;
$sheet->setCellValue('A'.$row,'Шифр');
$sheet->setCellValue('B'.$row,'Определение');
$sheet->setCellValue('C'.$row,'Всего, дн');
foreach ($data['absence'] as $v){
$sheet->setCellValue('A'.$row,$v['code']);
$sheet->setCellValue('B'.$row,$v['title']);
$sheet->setCellValue('C'.$row,$v['count']);
$row++;
}
//------------
$sheet2 = new Worksheet($spreadsheet,"Статистика");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex(2);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
self::summary($sheet,
$row,
"Распределение времени между проектами",
$data['project_name'],
$data['period'],
"%",
$data['project_graph']
);
self::summary($sheet,
$row,
"Распределение рабочего времени",
$data['project_name'],
$data['period'],
"ч.",
$data['time_graph'],
true
);
self::summary($sheet,
$row,
"Распределение причин отсутствия",
$data['project_name'],
$data['period'],
"дн.",
$data['absence_graph'],
true
);
/*
$sheet = $spreadsheet->getSheet(1);
$col = 'A';
$col2 = 'B';
$row = 1;
$sheet->setCellValue($col.$row,'Статистика');
$row++;
$row++;
$sheet->setCellValue($col.$row++,$data['emp']);
$sheet->setCellValue($col.$row++,$data['project_name']);
$sheet->setCellValue($col.$row++,$data['period']);
$row++;
$sheet->setCellValue($col.$row,'Рабочие часы');
$sheet->setCellValue($col2.$row++,$data['hours']);
$sheet->setCellValue($col.$row,'Внеурочные часы');
$sheet->setCellValue($col2.$row++,$data['over']);
$sheet->setCellValue($col.$row,'Сумма часов');
$sheet->setCellValue($col2.$row++,$data['total']);
$row++;
$sheet->setCellValue($col.$row++,'Отсутствие на рабочем месте');
$row++;
$sheet->setCellValue($col.$row,'Сумма нерабочих дней');
$sheet->setCellValue($col2.$row,$data['absence_total']);
*/
}
static function writeMyTeam2(Spreadsheet $spreadsheet, $data, $options){
$isMoney = Rules::isAnalysisProjectsFinance();
$sheetIndex = 0;
$PROJECT_ID = $pid = $options['subtype'];
$isShowMoney = Rules::isAnalysisProjectsShowMoney($PROJECT_ID);
$project = Project::getByID($pid);
$code_title = Project::getCodeName($project);
$isAdmin = Rules::isAdmin();
$myMoneyProjectIds = [];
if(!$isAdmin){
$myMoneyProjectIds = Project::getListForMoney();
}
$showMoney = function ($v) use ($isAdmin, $myMoneyProjectIds,$PROJECT_ID,$isShowMoney){
if($isAdmin) return $v;
else return (in_array($PROJECT_ID,$myMoneyProjectIds)&&$isShowMoney)?$v:'-';
};
//*
if(Rules::isAnalysisProjectsProject($PROJECT_ID)) {
if($sheetIndex) {
$sheet2 = new Worksheet($spreadsheet);
$spreadsheet->addSheet($sheet2);
}
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Проект');
$row = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow(7, $row), 'Время проектирования, ч');
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow(11, $row), 'Стоимость проекта, млн. ' . Merakomis::CURRENCY);
}
$row++;
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Шифр');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Стадия');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Название');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'РП');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Команда');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'РЧ | ОЧ');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раб.');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх1');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх2');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Всего');
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раб.');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх1');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх2');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Всего');
}
$row++;
$col = 1;
foreach ($data['projects2'] as $pid=>$v) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['code']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['step']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['director']['title']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), ($v['emps_total']) . ' | ' . ($v['emps']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['r'] . ' | ' . $v['o']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['hours']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['over1']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['over2']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['total']));
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_hours'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_over1'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_over2'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_total'])));
}
$row++;
}
$row++;
$col = 2;
foreach ($data['periods'] as $year => $months) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $year);
$col += count($months);
}
$row++;
$col = 2;
foreach ($data['periods'] as $year => $months) {
foreach ($months as $month) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), Merakomis::getMonth($month));
}
}
$row++;
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col, $row), "Время пр-я, ч");
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col, $row + 1), "Стоимость пр-я, млн ₽");
}
$col++;
foreach ($data['periods'] as $year => $months) {
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col, $row), cfloatval($data['period_data'][$year][$m]['time']));
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col, $row + 1), $showMoney(cfloatval($data['period_data'][$year][$m]['money'])));
}
$col++;
}
}
}
//*/
//*
if(Rules::isAnalysisProjectsSection($PROJECT_ID)) {
if ($sheetIndex) {
$sheet2 = new Worksheet($spreadsheet);
$spreadsheet->addSheet($sheet2);
}
//$sheet2 = new Worksheet($spreadsheet,"Разделы");
//$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Разделы');
$row = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow(4, $row), 'Время проектирования, ч');
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow(8, $row), 'Стоимость проекта, млн. ' . Merakomis::CURRENCY);
}
$row++;
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раздел');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Команда');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'РЧ | ОЧ');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раб.');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх1');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх2');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Всего');
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раб.');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх1');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх2');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Всего');
}
$row++;
foreach ($data['parents'][$pid] as $v) {
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), count($v['total_emps']) . ' | ' . count($v['emps']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['r'] . ' | ' . $v['o']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['hours']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['over1']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['over2']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['total']));
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_hours'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_over1'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_over2'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_total'])));
}
$row++;
}
$col = 1;
$v = $data['totals']['sections'];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), "Всего");
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), count($v['total_emps']) . ' | ' . count($v['emps']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['r'] . ' | ' . $v['o']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['hours']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['over1']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['over2']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v['total']));
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_hours'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_over1'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_over2'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($v['money_total'])));
}
$row++;
self::summary($sheet,
$row,
"Распределение времени проектирования разделов",
$code_title,
$data['period'],
"ч.",
$data['graph3'],
true,
);
if ($isMoney && $isShowMoney) {
self::summary($sheet,
$row,
"Распределение стоимости проектирования разделов",
$code_title,
$data['period'],
"ч.",
$data['graph4'],
true,
);
}
$row++;
$row++;
$row++;
$col = 2;
foreach ($data['periods'] as $year => $months) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $year);
$col += count($months);
}
$row++;
$col = 2;
foreach ($data['periods'] as $year => $months) {
foreach ($months as $month) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), Merakomis::getMonth($month));
}
}
$row++;
$arr = ['АР', 'КР', 'ИОС', 'СПЕЦ', 'BIM-IT', 'УПР'];
foreach ($arr as $name) {
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $name);
foreach ($data['periods'] as $year => $months) {
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($data['section_data'][$name][$year][$m]['time']));
}
}
$row++;
}
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), "Всего");
foreach ($data['periods'] as $year => $months) {
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($data['section_info']['time'][$year][$m]));
}
}
}
//*/
//*
if(Rules::isAnalysisProjectsSubsection($PROJECT_ID)) {
if ($sheetIndex) {
$sheet2 = new Worksheet($spreadsheet);
$spreadsheet->addSheet($sheet2);
}
//$sheet2 = new Worksheet($spreadsheet,"Подразделы");
//$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Подразделы');
$row = 1;
foreach ($data['sub'] as $sid => $v) {
$subKeys = array_keys($v);
$total = $data['totals']['subsections'][$sid];
$array = [];
foreach ($data['section'][$pid] as $vv) {
if (in_array($vv['name'], $subKeys)) {
$array[] = $vv;
}
}
$sheet->setCellValue(CellAddress::fromColumnAndRow(4, $row), 'Время проектирования, ч');
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow(8, $row), 'Стоимость проекта, млн. ' . Merakomis::CURRENCY);
}
$row++;
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Подраздел');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Команда');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'РЧ | ОЧ');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раб.');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх1');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх2');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Всего');
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раб.');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх1');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх2');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Всего');
}
$row++;
foreach ($array as $vv) {
$col = 1;
$emps = [];
foreach ($vv['emps'] as $emp) {
if ($vv['emp_hours'][$emp['emp_id']]) {
$emps[] = $emp['emp'];
}
}
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $vv['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), implode(", ", $emps));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $vv['r'] . ' | ' . $vv['o']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($vv['hours']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($vv['over1']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($vv['over2']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($vv['total']));
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($vv['money_hours'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($vv['money_over1'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($vv['money_over2'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($vv['money_total'])));
}
$row++;
}
$col = 1;
$total = $data['totals']['subsections'][mb_strtoupper($sid)];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), "Всего");
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), "");
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), "");
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($total['hours']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($total['over1']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($total['over2']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($total['total']));
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($total['money_hours'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($total['money_over1'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($total['money_over2'])));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney(cfloatval($total['money_total'])));
}
$row++;
self::summary($sheet,
$row,
$sid . ". Распределение времени проектирования подразделов",
$code_title,
$data['period'],
"ч.",
$data['sub_graph'][$sid]['time'],
true,
);
if ($isMoney) {
self::summary($sheet,
$row,
$sid . ". Распределение стоимости проектирования подразделов",
$code_title,
$data['period'],
"ч.",
$data['sub_graph'][$sid]['money'],
true,
);
}
$row++;
$row++;
}
$row++;
$col = 2;
foreach ($data['periods'] as $year => $months) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $year);
$col += count($months);
}
$row++;
$col = 2;
foreach ($data['periods'] as $year => $months) {
foreach ($months as $month) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), Merakomis::getMonth($month));
}
}
$row++;
foreach ($data['subsection_data'] as $name => $v) {
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $name);
foreach ($data['periods'] as $year => $months) {
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($v[$year][$m]['time']));
}
}
$row++;
}
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), "Всего");
foreach ($data['periods'] as $year => $months) {
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($data['subsection_info']['time'][$year][$m]));
}
}
}
//*/
//*
if(Rules::isAnalysisProjectsTeam($PROJECT_ID)) {
if ($sheetIndex) {
$sheet2 = new Worksheet($spreadsheet);
$spreadsheet->addSheet($sheet2);
}
//$sheet2 = new Worksheet($spreadsheet,"Команда");
//$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Команда');
$row = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow(6, $row), 'Время проектирования, ч');
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow(10, $row), 'Стоимость проекта, млн. ' . Merakomis::CURRENCY);
}
$row++;
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Архивный');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'ФИО');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Подраздел');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Вовлеченность');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Выработка');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Нагрузка');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раб.');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх1');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх2');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Всего');
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Раб.');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх1');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Сверх2');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Всего');
}
$row++;
uksort($data['data'][$pid], function ($k1, $k2) use ($data, $pid) {
return $data['data'][$pid][$k1]['emp_name'] <=> $data['data'][$pid][$k2]['emp_name'];
});
foreach ($data['data'][$pid] as $v) {
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['archive'] ? 'Архивный' : '');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['emp_name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['section']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['x']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['y']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['z']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['hours']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['over1']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['over2']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['total']);
if ($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney($v['money_hours']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney($v['money_over1']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney($v['money_over2']));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $showMoney($v['money_total']));
}
$row++;
}
//*/
//*
}
$sheet2 = new Worksheet($spreadsheet, "Статистика");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
self::summary($sheet,
$row,
"Информация",
$data['project_name'],
$data['period'],
"",
[
$isMoney ? [
'title' => 'Ср ставка команды',
'value' => $data['per_hour'] . ' ' . Merakomis::CURRENCY . '/ч',
] : null,
[
'title' => 'Проектов в работе',
'value' => $data['project_count'] . ' шт.',
],
[
'title' => 'Рабочих дней по ПК',
'value' => $data['work_days'] . ' д.',
],
[
'title' => 'Рабочих часов по ПК',
'value' => $data['work_hours'] . ' ч.',
],
],
);
//*/
}
static function writeMyTeam(Spreadsheet $spreadsheet, $data, $options){
$isMoney = Rules::isAnalysisProjectsFinance();
$isShowMoney = $isMoney && Rules::isAnalysisProjectsShowMoney();
$isSummary = !$options['subtype'];
$sheet = $spreadsheet->getActiveSheet();
$sheetIndex = 1;
$sheet->setTitle('Анализ затрат на проекты — 1');
$sheet->setCellValue('A1','Мои проекты');
//$sections = ['АР', 'КР', 'ИОС', 'СПЕЦ', 'BIM-IT', 'УПР'];
$sections = $data['report_sections'];
$sectionsCount = count($sections);
$isAdmin = Rules::isAdmin();
$myMoneyProjectIds = [];
if(!$isAdmin){
$myMoneyProjectIds = Project::getListForMoney();
}
$showMoney = function ($pid,$v) use ($isAdmin, $myMoneyProjectIds,$isShowMoney){
if($isAdmin) return $v;
else return (in_array($pid,$myMoneyProjectIds)&&$isShowMoney)?$v:'-';
};
uksort($data['projects2'],function ($k1,$k2) use ($data){
$p1 = $data['projects2'][$k1];
$p2 = $data['projects2'][$k2];
return $p1['code']<=>$p2['code'];
});
$row = 2;
$sheet->setCellValue('A'.$row,'Анализ затрат на проекты - 1');
$row++;
$sheet->setCellValue('A'.$row,'Анализ затрат ресурсов (сотрудники, их часы и бюджет) на проекты в заданный промежуток времени.');
$row++;$row++;
$INIT_COL = $col = 6;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col,$row),'Команда, чел');
$col += $sectionsCount+2;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col,$row),'Вермя, ч');
if($isMoney) $sheet->setCellValue(CellAddress::fromColumnAndRow($col+$sectionsCount + 2,$row),'млн. р.');
$row++;
$sheet->setCellValue('A'.$row,'Шифр');
$sheet->setCellValue('B'.$row,'Стадия');
$sheet->setCellValue('C'.$row,'Название');
$sheet->setCellValue('D'.$row,'РП');
$col = $INIT_COL;
foreach ($sections as $k=>$v){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$v);
}
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),'Всего');
$col++;
foreach ($sections as $k=>$v){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$v);
}
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row), 'Всего');
$col++;
if($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row), 'Бюджет');
}
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),'Архивный');
$row++;
foreach ($data['projects2'] as $pid=>$v){
$sheet->setCellValue('A'.$row,$v['code']);
$sheet->setCellValue('B'.$row,$v['step']);
$sheet->setCellValue('C'.$row,$v['name']);
$sheet->setCellValue('D'.$row,$v['director']['title']);
$col = $INIT_COL;
foreach ($sections as $k=>$name){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),count($v['sections'][$name]['emps'])?:0);
}
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),count($v['emps_total_count'])?:0);
$col++;
foreach ($sections as $k=>$name){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$v['sections'][$name]['total']?:0);
}
/*
$sheet->setCellValue('n' . $row, $v['sections'][$sections[0]]['total'] ?: 0);
$sheet->setCellValue('o' . $row, $v['sections'][$sections[1]]['total'] ?: 0);
$sheet->setCellValue('p' . $row, $v['sections'][$sections[2]]['total'] ?: 0);
$sheet->setCellValue('q' . $row, $v['sections'][$sections[3]]['total'] ?: 0);
$sheet->setCellValue('r' . $row, $v['sections'][$sections[4]]['total'] ?: 0);
$sheet->setCellValue('s' . $row, $v['sections'][$sections[5]]['total'] ?: 0);
*/
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row), $v['sections']['total'] ?: 0);
$col++;
if($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row), $showMoney($pid,$v['money'] ?: 0));
}
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$v['archive']?'Архивный':'');
$row++;
}
$col = $INIT_COL;
foreach ($sections as $name){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$data['section_emp_total'][$name]?:0);
}
/*
$sheet->setCellValue('f'.$row,$data['section_emp_total'][$sections[0]]?:0);
$sheet->setCellValue('g'.$row,$data['section_emp_total'][$sections[1]]?:0);
$sheet->setCellValue('h'.$row,$data['section_emp_total'][$sections[2]]?:0);
$sheet->setCellValue('i'.$row,$data['section_emp_total'][$sections[3]]?:0);
$sheet->setCellValue('j'.$row,$data['section_emp_total'][$sections[4]]?:0);
$sheet->setCellValue('k'.$row,$data['section_emp_total'][$sections[5]]?:0);
*/
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$data['section_emp_total']['total']?:0);
$col++;
foreach ($sections as $name){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$data['sections_total'][$name]?:0);
}
/*
$sheet->setCellValue('n'.$row,$data['sections_total'][$sections[0]]?:0);
$sheet->setCellValue('o'.$row,$data['sections_total'][$sections[1]]?:0);
$sheet->setCellValue('p'.$row,$data['sections_total'][$sections[2]]?:0);
$sheet->setCellValue('q'.$row,$data['sections_total'][$sections[3]]?:0);
$sheet->setCellValue('r'.$row,$data['sections_total'][$sections[4]]?:0);
$sheet->setCellValue('s'.$row,$data['sections_total'][$sections[5]]?:0);
*/
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$data['sections_total']['total']?:0);
$col++;
if($isMoney) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row), $data['total_money'] ?: 0);
}
$row++;$row++;
$sheet2 = new Worksheet($spreadsheet,"Анализ затрат на проекты — 2");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
$sheet->setCellValue('A'.$row,'Анализ затрат на проекты - 2');
$row++;
$sheet->setCellValue('A'.$row,'В таблице представлена сводка часов, затраченных на реализацию выбранных проектов.');
$row++;$row++;
$sheet->setCellValue('G'.$row,'Время проектирования, ч');
if($isMoney) {
$sheet->setCellValue('K' . $row, 'Стоимость проектирования, млн. ' . Merakomis::CURRENCY);
}
$row++;
$sheet->setCellValue('A'.$row,'Шифр');
$sheet->setCellValue('B'.$row,'Стадия');
$sheet->setCellValue('C'.$row,'Название');
$sheet->setCellValue('D'.$row,'РП');
$sheet->setCellValue('E'.$row,'Команда');
$sheet->setCellValue('F'.$row,'РЧ | ОЧ');
$sheet->setCellValue('G'.$row,'Раб., ч.');
$sheet->setCellValue('H'.$row,'Сверх1., ч.');
$sheet->setCellValue('I'.$row,'Сверх2., ч.');
$sheet->setCellValue('J'.$row,'Всего, ч.');
if($isMoney) {
$sheet->setCellValue('K' . $row, 'Раб., ч.');
$sheet->setCellValue('L' . $row, 'Сверх1., ч.');
$sheet->setCellValue('M' . $row, 'Сверх2., ч.');
$sheet->setCellValue('N' . $row, 'Всего, ч.');
}
$sheet->setCellValue(($isMoney?'O':'K').$row,'Архивный');
$row++;
foreach ($data['projects2'] as $pid=>$v){
$sheet->setCellValue('A'.$row,$v['code']);
$sheet->setCellValue('B'.$row,$v['step']);
$sheet->setCellValue('C'.$row,$v['name']);
$sheet->setCellValue('D'.$row,$v['director']['title']);
$sheet->setCellValue('E'.$row,$v['emps_total'].' | '.$v['emps']);
$sheet->setCellValue('F'.$row,$v['r'].' | '.$v['o']);
$sheet->setCellValue('G'.$row,$v['hours']);
$sheet->setCellValue('H'.$row,$v['over1']);
$sheet->setCellValue('I'.$row,$v['over2']);
$sheet->setCellValue('J'.$row,$v['total']);
if($isMoney) {
$sheet->setCellValue('K' . $row, $showMoney($pid,$v['money_hours']));
$sheet->setCellValue('L' . $row, $showMoney($pid,$v['money_over1']));
$sheet->setCellValue('M' . $row, $showMoney($pid,$v['money_over2']));
$sheet->setCellValue('N' . $row, $showMoney($pid,$v['money_total']));
}
$sheet->setCellValue(($isMoney?'O':'K').$row,$v['archive']?'Архивный':'');
$row++;
}
$row++;
$row++;
$getTwoGraphs = function($sheet,&$row) use ($data,$isMoney,$showMoney){
$col = 2;
foreach ($data['periods'] as $year=>$m){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col,$row),$year);
$col+=count($m);
}
$row++;
$col = 2;
foreach ($data['periods'] as $year=>$months){
foreach ($months as $m){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),Merakomis::getMonth($m));
}
}
$row++;
$sheet->setCellValue(CellAddress::fromColumnAndRow(1,$row),'Время пр-я, ч');
$col = 2;
foreach ($data['periods'] as $year=>$months){
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($data['period_data'][$year][$m]['time']));
}
}
if($isMoney) {
$row++;
$sheet->setCellValue(CellAddress::fromColumnAndRow(1, $row), 'Стоимость пр-я, млн. ' . Merakomis::CURRENCY);
$col = 2;
foreach ($data['periods'] as $year => $months) {
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($data['period_data'][$year][$m]['money']));
}
}
}
//$sheet->setCellValue('A'.($row),'Подразделение');
//$sheet->setCellValue('A'.($row),'Время пр-я, ч');
};
if($isSummary){
$sheet2 = new Worksheet($spreadsheet,"Распределение вр. и ст. ");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$subtitle = $isSummary ? 'Все проекты' : ($project ? $project['code_title'] : $data['project_name']);
self::summary($sheet,
$row,
"Распределение времени проектирования разделов",
$subtitle,
$data['period'],
"ч.",
$data['graph3'],
);
if($isMoney && $isShowMoney) {
self::summary($sheet,
$row,
"Распределение стоимости проектирования разделов",
$subtitle,
$data['period'],
"млн. ₽",
$data['graph4'],
);
}
// Распределение затрат
$sheet2 = new Worksheet($spreadsheet,"Распределение затрат");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$getTwoGraphs($sheet,$row);
} else {
$sheet2 = new Worksheet($spreadsheet,"Проекты");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
foreach ($data['data'] as $pid=>$emps){
$p = $data['project'][$pid];
$sheet->setCellValue('A'.($row++),$p['code_step'].' '.$p['name']);
$sheet->setCellValue('A'.($row++),'Подразделы');
$sheet->setCellValue('A'.($row++),'В таблице представлена сводка часов, затраченных членами команды проекта на реализацию подразделов.');
$row++;
$sheet->setCellValue('A'.($row),'Подраздел');
$sheet->setCellValue('B'.($row),'Команда');
//$sheet->setCellValue('C'.($row),'Неактивны');
$sheet->setCellValue('C'.($row),'РЧ | ОЧ');
$sheet->setCellValue('D'.($row),'Раб., ч.');
$sheet->setCellValue('E'.($row),'Сверх., ч.');
$sheet->setCellValue('F'.($row),'Всего., ч.');
$row++;
uksort($data['section'][$pid],function ($k1,$k2) use ($data,$pid){
$p1 = $data['section'][$pid][$k1];
$p2 = $data['section'][$pid][$k2];
return $p1['name']<=>$p2['name'];
});
foreach ($data['section'][$pid] as $v){
$x = [];
$y = [];
foreach ($v['emps'] as $vv){
//$x[] = $vv['emp'];
if(!$v['emp_hours'][$vv['emp_id']]) {
$y[] = $vv['emp'];
} else {
$x[] = $vv['emp'];
}
}
$sheet->setCellValue('A'.($row),$v['name']);
$sheet->setCellValue('B'.($row),implode(", ",$x));
//$sheet->setCellValue('C'.($row),implode(", ",$y));
$sheet->setCellValue('C'.($row),$v['r'].' | '.$v['o']);
$sheet->setCellValue('D'.($row),$v['hours']);
$sheet->setCellValue('E'.($row),$v['over']);
$sheet->setCellValue('F'.($row),$v['total']);
$row++;
}
$row++;
$sheet->setCellValue('A'.($row++),'Разделы');
$sheet->setCellValue('A'.($row++),'В таблице представлена сводка часов, затраченных членами команды проекта на реализацию разделов.');
$row++;
$sheet->setCellValue('A'.($row),'Раздел');
$sheet->setCellValue('B'.($row),'Команда');
$sheet->setCellValue('C'.($row),'РЧ | ОЧ');
$sheet->setCellValue('D'.($row),'Рабочие, час');
$sheet->setCellValue('E'.($row),'Сверхурочные, час');
$sheet->setCellValue('F'.($row),'Всего, час');
$row++;
uksort($data['parents'][$pid],function ($k1,$k2) use ($data,$pid){
$p1 = $data['parents'][$pid][$k1];
$p2 = $data['parents'][$pid][$k2];
return $p1['name']<=>$p2['name'];
});
foreach ($data['parents'][$pid] as $v){
$sheet->setCellValue('A'.($row),$v['name']);
//$sheet->setCellValue('B'.($row),$data['projects2'][$pid]['emps_total'].' | '.count($v['emps']));
$sheet->setCellValue('B'.($row),count($v['total_emps']).' | '.count($v['emps']));
$sheet->setCellValue('C'.($row),$v['r'].' | '.$v['o']);
$sheet->setCellValue('D'.($row),$v['hours']);
$sheet->setCellValue('E'.($row),$v['over']);
$sheet->setCellValue('F'.($row),$v['total']);
$row++;
}
$row++;
$sheet->setCellValue('A'.($row++),'Команда проекта');
$sheet->setCellValue('A'.($row++),'В таблице представлена сводка часов, затраченных членами команды проекта, в котором вы являетесь руководителем.');
$row++;
$sheet->setCellValue('A'.($row),'ФИО');
$sheet->setCellValue('B'.($row),'Раздел: подраздел');
$sheet->setCellValue('C'.($row),'Вовлеченность');
$sheet->setCellValue('D'.($row),'Выработка');
$sheet->setCellValue('E'.($row),'Нагрузка');
$sheet->setCellValue('F'.($row),'Рабочие, час');
$sheet->setCellValue('G'.($row),'Сверхурочные, час');
$sheet->setCellValue('H'.($row),'Всего, час');
$row++;
uksort($emps,function ($k1,$k2) use ($emps){
$p1 = $emps[$k1];
$p2 = $emps[$k2];
return $p1['emp']<=>$p2['emp'];
});
foreach ($emps as $emp){
$sheet->setCellValue('A'.($row),$emp['emp']);
$sheet->setCellValue('B'.($row),$emp['section']);
$sheet->setCellValue('C'.($row),$emp['x']);
$sheet->setCellValue('D'.($row),$emp['y']);
$sheet->setCellValue('E'.($row),$emp['z']);
$sheet->setCellValue('F'.($row),$emp['hours']);
$sheet->setCellValue('G'.($row),$emp['over']);
$sheet->setCellValue('H'.($row),$emp['total']);
$row++;
}
$row++;
}
}
//----------------
$sheet2 = new Worksheet($spreadsheet,"Статистика");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
self::summary($sheet,
$row,
"Информация",
$data['project_name'],
$data['period'],
"",
[
[
'title'=>'Проектов',
'value'=>(count($data['project'])??0).' шт.',
],
[
'title'=>'Сумма РЧ',
'value'=>$data['total_r'].' чел.',
],
[
'title'=>'Сумма ОЧ',
'value'=>$data['total_o'].' чел.',
],
[
'title'=>'Рабочих дней',
'value'=>$data['work_days'].' д.',
],
[
'title'=>'Рабочих часов',
'value'=>$data['work_hours'].' ч.',
],
$isMoney?[
'title'=>'Ставка ч/ч',
'value'=>$data['per_hour'].' р./ч.',
]:null,
$isMoney?[
'title'=>'Всего затрат',
'value'=>$data['total_money'].' млн.р.',
]:null,
],
);
self::summary($sheet,
$row,
"Распределение времени проектирования",
$data['project_name'],
$data['period'],
"%",
$data['graph1']
);
self::summary($sheet,
$row,
"Распределение рабочего времени",
$data['project_name'],
$data['period'],
"ч.",
$data['graph2'],
true,
);
/*
$sheet = $spreadsheet->getSheet(1);
$col = 'A';
$col2 = 'B';
$row = 1;
$sheet->setCellValue($col.$row,'Статистика');
$row++;
$row++;
$sheet->setCellValue($col.$row++,'Все разделы');
$sheet->setCellValue($col.$row++,$data['project_name']);
$sheet->setCellValue($col.$row++,$data['period']);
$row++;
$sheet->setCellValue($col.$row,'Рабочие часы');
$sheet->setCellValue($col2.$row++,$data['hours']);
$sheet->setCellValue($col.$row,'Внеурочные часы');
$sheet->setCellValue($col2.$row++,$data['over']);
$sheet->setCellValue($col.$row,'Сумма часов');
$sheet->setCellValue($col2.$row++,$data['total']);
$row++;
foreach ($data['sections'] as $v){
$sheet->setCellValue($col.$row++,$v['name']);
$sheet->setCellValue($col.$row++,$data['project_name']);
$sheet->setCellValue($col.$row,'Рабочие часы');
$sheet->setCellValue($col2.$row++,$v['hours']);
$sheet->setCellValue($col.$row,'Внеурочные часы');
$sheet->setCellValue($col2.$row++,$v['over']);
$sheet->setCellValue($col.$row,'Сумма часов');
$sheet->setCellValue($col2.$row++,$v['total']);
$row++;
}
*/
}
static function writeMyDepartments(Spreadsheet $spreadsheet, $data, $options){
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1','Моё подразделение');
$sheet->setCellValue('A2','Нагрузка на подразделения');
$sheet->setCellValue('A3','В таблице представлена нагрузка на подразделения компании, в которых вы являетесь руководителем');
$row = 4;
$sheet->setCellValue('A'.($row),'Подразделение');
$sheet->setCellValue('B'.($row),'Команда');
$sheet->setCellValue('C'.($row),'Выработка');
$sheet->setCellValue('D'.($row),'Нагрузка');
$sheet->setCellValue('E'.($row),'Раб., ч.');
$sheet->setCellValue('F'.($row),'Сверх., ч.');
$sheet->setCellValue('G'.($row),'Всего, ч.');
$row++;
foreach ($data['dids'] as $dep_id=>$v){
$sheet->setCellValue('A'.($row),$v['title']);
$sheet->setCellValue('B'.($row),$v['emp_count'].' | '.$v['emp_work']);
$sheet->setCellValue('C'.($row),$v['y']);
$sheet->setCellValue('D'.($row),$v['z']);
$sheet->setCellValue('E'.($row),$v['hours']);
$sheet->setCellValue('F'.($row),$v['over']);
$sheet->setCellValue('G'.($row),$v['total']);
$row++;
}
foreach ($data['data'] as $dep_id=>$a){
$dep = $data['departments'][$dep_id];
$sheet->setCellValue('A'.($row++),$dep['name']);
$sheet->setCellValue('A'.($row++),'Сотрудники');
$sheet->setCellValue('A'.($row++),'В таблице представлена сводка часов, затраченных сотрудниками вашего подразделения, в котором вы являетесь руководителем.');
$row++;
$sheet->setCellValue('A'.($row),'ФИО');
$sheet->setCellValue('B'.($row),'Выработка');
$sheet->setCellValue('C'.($row),'Нагрузка ');
$sheet->setCellValue('D'.($row),'Проект ');
$sheet->setCellValue('E'.($row),'Раб., час ');
$sheet->setCellValue('F'.($row),'Сверх., час ');
$sheet->setCellValue('G'.($row),'Всего, час ');
$sheet->setCellValue('H'.($row),'Итого, час ');
$row++;
foreach ($a as $emp_id=>$aa){
$i = 0;
foreach ($aa as $v){
//$emp_id = $v['id'];
$emp_info = $data['emp'][$dep_id][$emp_id];
if(!$i) $sheet->setCellValue('A'.($row),$v['emp']);
if(!$i) $sheet->setCellValue('B'.($row),$emp_info['y']);
if(!$i) $sheet->setCellValue('C'.($row),$emp_info['z']);
//$sheet->setCellValue('B'.($row),$v['staffing']);
$sheet->setCellValue('D'.($row),$v['code']);
//$sheet->setCellValue('D'.($row),implode(", ",$data['emp_roles'][$dep_id][$emp_id]));
$sheet->setCellValue('E'.($row),$v['hours']);
$sheet->setCellValue('F'.($row),$v['over']);
$sheet->setCellValue('G'.($row),$v['total']);
if(!$i) $sheet->setCellValue('H'.($row),$data['emp'][$dep_id][$emp_id]['total']);
$row++;
$i++;
}
}
$row++;
$sheet->setCellValue('A'.($row++),'Анализ нерабочих дней сотрудников вашего подразделения');
$sheet->setCellValue('A'.($row++),'Сводная таблица отсутствия на рабочем месте. Данные представляются за выбранный в шапке страницы период или за все время работы, если период явно не задан.');
$sheet->setCellValue('A'.($row),'ФИО');
$sheet->setCellValue('B'.($row),'Должность');
$sheet->setCellValue('C'.($row),'Шифр');
$sheet->setCellValue('D'.($row),'Определения');
$sheet->setCellValue('E'.($row),'Всего, дн');
$sheet->setCellValue('F'.($row),'Итого, дн');
$row++;
foreach ($data['absence'][$dep_id] as $aa){
$i = 0;
foreach ($aa as $v) {
$emp_id = $v['id'];
if(!$i) $sheet->setCellValue('A' . ($row), $v['name']);
$sheet->setCellValue('B' . ($row), implode(", ", $v['roles']));
$sheet->setCellValue('C' . ($row), $v['code']);
$sheet->setCellValue('D' . ($row), $v['title']);
$sheet->setCellValue('E' . ($row), $v['count']);
if(!$i) $sheet->setCellValue('F' . ($row), $data['emp'][$dep_id][$emp_id]['absence']);
$row++;
$i++;
}
}
$row++;
}
//------------------
foreach ($data['total'] as $dep_id=>$total) {
$dep = $data['departments'][$dep_id]['name'];
self::summary($sheet,
$row,
"Распределение времени между проектами",
$dep.', '.$data['project_name'],
$data['period'],
"%",
$total['graph1']
);
self::summary($sheet,
$row,
"Распределение рабочего времени",
$dep.', '.$data['project_name'],
$data['period'],
"ч.",
$total['graph2'],
true
);
self::summary($sheet,
$row,
"Распределение причин отсутствия",
$dep.', '.$data['project_name'],
$data['period'],
"д",
$total['graph3'],
true
);
}
/*
$sheet = $spreadsheet->getSheet(1);
$col = 'A';
$col2 = 'B';
$row = 1;
$sheet->setCellValue($col.$row,'Статистика');
$row++;
$row++;
foreach ($data['total'] as $dep_id=>$a) {
$dep = $data['departments'][$dep_id];
$total = $data['total'][$dep_id];
$sheet->setCellValue($col . $row++, $dep['name']);
$sheet->setCellValue($col . $row++, $data['project_name']);
$sheet->setCellValue($col . $row++, $data['period']);
$row++;
$sheet->setCellValue($col . $row, 'Рабочие часы');
$sheet->setCellValue($col2 . $row++, $total['hours']);
$sheet->setCellValue($col . $row, 'Внеурочные часы');
$sheet->setCellValue($col2 . $row++, $total['over']);
$sheet->setCellValue($col . $row, 'Сумма часов');
$sheet->setCellValue($col2 . $row++, $total['total']);
$row++;
$row++;
}
*/
}
static function writeMyCompany(Spreadsheet $spreadsheet, $data, $options){
$isAll = ($options['type']==7);
$sheetIndex = 1;
$isAll = true;
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Нагрузка на подразделения');
$sheet->setCellValue('A1',$data['subtitle']);
$sheet->setCellValue('A1',"Нагрузка на подразделения");
$row = 2;
uksort($data['dids'],function ($k1,$k2) use ($data){
$p1 = $data['dids'][$k1];
$p2 = $data['dids'][$k2];
return $p1['title']<=>$p2['title'];
});
if($isAll){
$row++;
$sheet->setCellValue('A'.($row++),'Нагрузка на подразделения');
$sheet->setCellValue('A'.($row++),'В таблице представлена нагрузка на подразделения компании.');
$row++;
$sheet->setCellValue('A'.($row),'Подразделение');
$sheet->setCellValue('B'.($row),'Команда');
$sheet->setCellValue('C'.($row),'Выработка');
$sheet->setCellValue('D'.($row),'Нагрузка');
$sheet->setCellValue('E'.($row),'Раб., ч.');
$sheet->setCellValue('F'.($row),'Сверх., ч.');
$sheet->setCellValue('G'.($row),'Всего, ч.');
$row++;
foreach ($data['dids'] as $v){
$sheet->setCellValue('A'.($row),$v['title']);
$sheet->setCellValue('B'.($row),$v['emp_count'].' | '.$v['emp_work']);
$sheet->setCellValue('C'.($row),$v['y']);
$sheet->setCellValue('D'.($row),$v['z']);
$sheet->setCellValue('E'.($row),$v['hours']);
$sheet->setCellValue('F'.($row),$v['over']);
$sheet->setCellValue('G'.($row),$v['total']);
$row++;
}
}
// Распределение сотрудников
$dep_ids = [];
$sheet2 = new Worksheet($spreadsheet,"Распределение сотрудников ");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$col = 6;
foreach ($data['depReport'] as $v){
$d = $v['data'];
if(count($v['a'])) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col, $row), $d['short']);
}
$col+=count($v['a']);
}
$col = 1;
$row++;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),'Архивный');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),'Шифр');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),'Стадия');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),'Название');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),'РП');
foreach ($data['depReport'] as $v){
$d = $v['data'];
if(count($v['a'])){
foreach ($v['a'] as $a){
$dep_ids[] = $a['id'];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $a['short']);
}
} else {
$dep_ids[] = $v['id'];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $d['short']);
}
//$col++;
}
$row++;
uksort($data['pro_nom'],function ($k1,$k2) use ($data){
$p1 = $data['workload'][$k1];
$p2 = $data['workload'][$k2];
return $p1['code']<=>$p2['code'];
});
foreach ($data['pro_nom'] as $pid=>$v){
$col = 1;
$w = $data['workload'][$pid];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$w['archive']?'Архивный':'');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$w['code']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$w['step']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$w['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$w['director_name']);
foreach($dep_ids as $did){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),cfloatval($data['depReportData'][$did]['projects'][$pid]['per_emp']));
}
$row++;
}
$col = 6;
foreach($dep_ids as $did){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),cfloatval($data['depReportData'][$did]['total']));
}
// Нагрузка на сотрудников - 1
$sheet2 = new Worksheet($spreadsheet,"Нагрузка на сотрудников - 1");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
$sheet->setCellValue('A'.($row++),'Нагрузка на сотрудников - 1');
$sheet->setCellValue('A'.($row++),'В таблице представлена сводка по сотрудникам компании за выбранный период времени.');
$row++;
$sheet->setCellValue('A'.($row),'Архивный');
$sheet->setCellValue('B'.($row),'Шифр');
$sheet->setCellValue('C'.($row),'Стадия');
$sheet->setCellValue('D'.($row),'Название');
$sheet->setCellValue('E'.($row),'РП');
$col = 6;
foreach ($data['data'] as $emp_id=>$emp){
$cell = CellAddress::fromColumnAndRow($col,$row);
$sheet->setCellValue($cell,$emp['name']);
$col++;
}
$row++;
uksort($data['workload'],function ($k1,$k2) use ($data){
$p1 = $data['workload'][$k1];
$p2 = $data['workload'][$k2];
return $p2['code']<=>$p1['code'];
});
foreach ($data['workload'] as $k=>$v){
$sheet->setCellValue('A'.($row),$v['archive']?'Архивный':'');
$sheet->setCellValue('B'.($row),$v['code']);
$sheet->setCellValue('C'.($row),$v['step']);
$sheet->setCellValue('D'.($row),$v['name']);
$sheet->setCellValue('E'.($row),$v['director_name']);
$col = 6;
foreach ($data['data'] as $emp){
$emp_id = $emp['id'];
$emp = $v['emp'][$emp_id];
$value = $emp['value']?:0;
$cell = CellAddress::fromColumnAndRow($col,$row);
$sheet->setCellValue($cell,$value);
self::fill($sheet,$cell,self::percentBlue($emp['percent']));
$col++;
}
$row++;
}
$row++;
// Нагрузка на сотрудников - 2
$sheet2 = new Worksheet($spreadsheet,"Нагрузка на сотрудников - 2");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
$sheet->setCellValue('A'.($row++),'Нагрузка на сотрудников - 2');
$sheet->setCellValue('A'.($row++),'В таблице представлена сводка по сотрудникам компании за выбранный период времени.');
$row++;
$sheet->setCellValue('A'.($row),'ФИО');
$sheet->setCellValue('B'.($row),'Должность');
$sheet->setCellValue('C'.($row),'Подразделение');
$sheet->setCellValue('D'.($row),'Проект');
$sheet->setCellValue('E'.($row),'Выработка');
$sheet->setCellValue('F'.($row),'Нагрузка');
$sheet->setCellValue('G'.($row),'Раб., час ');
$sheet->setCellValue('H'.($row),'Сверх1., час ');
$sheet->setCellValue('I'.($row),'Сверх2., час ');
$sheet->setCellValue('J'.($row),'Всего, час ');
$sheet->setCellValue('K'.($row),'Архивный');
$row++;
foreach ($data['data'] as $e){
$i = 0;
$projects = [];
foreach ($e['projects'] as $v){
if($v['archive']) continue;
$projects[]= $v['name'];
//$sheet->setCellValue('D'.($row),$v['name']);
//$sheet->setCellValue('D'.($row),$v['role']);
//$sheet->setCellValue('E'.($row),$v['info']['hours']);
//$sheet->setCellValue('F'.($row),$v['info']['over']);
//if(!$i) $sheet->setCellValue('G'.($row),$v['info']['total']);
//$i++;
//$row++;
}
$sheet->setCellValue('A'.($row),$e['name']);
$sheet->setCellValue('B'.($row),is_array($e['staffing'])?implode(", ",$e['staffing']):$e['staffing']);
$sheet->setCellValue('C'.($row),$e['department']);
$sheet->setCellValue('D'.($row),implode(", ",$projects));
$sheet->setCellValue('E'.($row),$e['y']);
$sheet->setCellValue('F'.($row),$e['z']);
$sheet->setCellValue('G'.($row),$e['hours']);
$sheet->setCellValue('H'.($row),$e['over1']);
$sheet->setCellValue('I'.($row),$e['over2']);
$sheet->setCellValue('J'.($row),$e['info']['total']);
$sheet->setCellValue('K'.($row),$e['archive']?'Архивный':'');
$row++;
}
$row++;
$row++;
// Нагрузка на сотрудников - 3
if(Rules::isAnalysisCompanyEmp3()) {
$sheet2 = new Worksheet($spreadsheet, "Нагрузка на сотрудников - 3");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Архивный');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'ФИО');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Должность');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Подразделение');
foreach ($data['contract']['names'] as $v) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v);
}
$row++;
uksort($data['contract']['data'], function ($k1, $k2) use ($data) {
return $data['contract']['data'][$k1]['name'] <=> $data['contract']['data'][$k2]['name'];
});
foreach ($data['contract']['data'] as $v) {
$col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['archive'] ? 'Архивный' : '');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['staffing']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $v['department']);
foreach ($data['contract']['names'] as $name) {
$emp = $v['contracts'][$name];
$sheet->setCellValue($cell = CellAddress::fromColumnAndRow($col++, $row), cfloatval($emp['value']));
self::fill($sheet, $cell, self::percentBlue($emp['percent']));
}
$sheet->setCellValue($cell = CellAddress::fromColumnAndRow($col++, $row), $v['total']);
self::fill($sheet, $cell, self::percentBlue($v['percent']));
$row++;
}
$col = 5;
foreach ($data['contract']['names'] as $name) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['contract']['total'][$name]);
}
}
/*
$sheet2 = new Worksheet($spreadsheet,"Анализ нераб. дней сотрудников");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
$sheet->setCellValue('A'.($row++),'Анализ нерабочих дней сотрудников');
$sheet->setCellValue('A'.($row++),'Сводная таблица отсутствия на рабочем месте. Данные представляются за выбранный в шапке страницы период или за все время работы, если период явно не задан.');
$row++;
$sheet->setCellValue('A'.($row),'ФИО');
$sheet->setCellValue('B'.($row),'Шифр');
$sheet->setCellValue('C'.($row),'Определения ');
$sheet->setCellValue('D'.($row),'Всего, дн ');
$sheet->setCellValue('E'.($row),'Итого, дн ');
$row++;
foreach ($data['absence'] as $e){
$emp_id = $e['id'];
$sheet->setCellValue('A'.($row),$e['name']);
$sheet->setCellValue('E'.($row),$e['total']);
foreach ($e['a'] as $v){
$sheet->setCellValue('B'.($row),$v['code']);
$sheet->setCellValue('C'.($row),$v['name']);
$sheet->setCellValue('D'.($row),$v['count']);
$row++;
}
}
*/
$sheet2 = new Worksheet($spreadsheet,"Статистика");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
self::summary($sheet,
$row,
"Информация",
$data['project_name'].($data['department_names']?:''),
$data['period'],
"",
[
[
'title'=>'Проектов',
'value'=>count($data['graph1']).' шт.',
],
[
'title'=>'Штат',
'value'=>count(array_keys($data['data'])).' чел.',
],
[
'title'=>'Рабочих дней',
'value'=>$data['work_days'].' д.',
], [
'title'=>'Рабочих часов',
'value'=>$data['work_hours'].' ч.',
],
]
);
self::summary($sheet,
$row,
"Распределение времени между проектами",
$data['project_name'].($data['department_names']?', '.$data['department_names']:''),
$data['period'],
"%",
$data['graph1']
);
self::summary($sheet,
$row,
"Распределение рабочего времени",
$data['project_name'].($data['department_names']?', '.$data['department_names']:''),
$data['period'],
"ч.",
$data['graph2'],
true
);
/*
self::summary($sheet,
$row,
"Распределение причин отсутствия",
$data['project_name'].($data['department_names']?', '.$data['department_names']:''),
$data['period'],
"д",
$data['graph3'],
true
);
*/
//-----------
/*
$sheet = $spreadsheet->getSheet(1);
$col = 'A';
$col2 = 'B';
$row = 1;
$sheet->setCellValue($col.$row,'Статистика');
$row++;
$row++;
$sheet->setCellValue($col . $row++, $data['stat_subtitle']);
$sheet->setCellValue($col . $row++, $data['project_name']);
$sheet->setCellValue($col . $row++, $data['period']);
$row++;
$sheet->setCellValue($col . $row, 'Рабочие часы');
$sheet->setCellValue($col2 . $row++, $data['hours']);
$sheet->setCellValue($col . $row, 'Внеурочные часы');
$sheet->setCellValue($col2 . $row++, $data['over']);
$sheet->setCellValue($col . $row, 'Сумма часов');
$sheet->setCellValue($col2 . $row++, $data['total']);
$row++;
$row++;
*/
}
static function brightenColor($hex, $percent) {
// Удалить символ #, если он есть
$hex = ltrim($hex, '#');
// Разделить цвет на компоненты RGB
$r = hexdec(substr($hex, 0, 2));
$g = hexdec(substr($hex, 2, 2));
$b = hexdec(substr($hex, 4, 2));
// Увеличить яркость
$r = min(255, $r + (1-$percent / 100) * (255 - $r));
$g = min(255, $g + (1-$percent / 100) * (255 - $g));
$b = min(255, $b + (1-$percent / 100) * (255 - $b));
// Вернуть цвет в формате HEX
return str_pad(dechex($r), 2, '0', STR_PAD_LEFT) .
str_pad(dechex($g), 2, '0', STR_PAD_LEFT) .
str_pad(dechex($b), 2, '0', STR_PAD_LEFT);
}
static function percentBlue($percent){
return self::brightenColor('8aa0b2',$percent);
}
static function percentBrown($percent){
return self::brightenColor('bd9768',$percent);
}
static function fill($sheet,$cell,$color){
$sheet->getStyle($cell)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($color);
}
static function writeMyYear(Spreadsheet $spreadsheet, $data, $options){
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Сводка часов за год');
$sheetIndex = 1;
$isMoney = $data['is_money'];
$isAdmin = Rules::isAdmin();
$myMoneyProjectIds = [];
if(!$isAdmin){
$myMoneyProjectIds = Project::getListForMoney();
}
$showMoney = function ($pid,$v) use ($isAdmin, $myMoneyProjectIds){
if($isAdmin) return $v;
else return in_array($pid,$myMoneyProjectIds)?$v:'-';
};
$keys = [
'time'=>[
't'=>'Сводка часов за календарный год',
't2'=>'Анализ затрат времени на проекты за заданный календарный год',
],
'money'=>[
't'=>'Сводка затрат за календарный год',
't2'=>'Анализ затрат бюджета на проекты за заданный календарный год',
],
];
if(!$isMoney){
unset($keys['money']);
}
$isKeyMoney = false;
foreach ($keys as $key=>$info) {
if($key=='money'){
$isKeyMoney = true;
$sheet2 = new Worksheet($spreadsheet,"Сводка затрат за год");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
}
$sheet->setCellValue('A1','Мои проекты: годовой отчёт');
$row = 3;
uksort($data[$key]['project'],function ($k1,$k2) use ($data,$key){
$p1 = $data[$key]['project'][$k1]['data'];
$p2 = $data[$key]['project'][$k2]['data'];
return $p1['code']<=>$p2['code'];
});
$sheet->setCellValue('A'.$row,$info['t']);
$row++;
$sheet->setCellValue('A'.$row,$info['t2']);
$row++;
$row++;
$sheet->setCellValue('E' . $row, $data['year'] . ' г. Время, ч');
$row++;
$sheet->setCellValue('A' . $row, 'Шифр');
$sheet->setCellValue('B' . $row, 'Стадия');
$sheet->setCellValue('C' . $row, 'Название');
$sheet->setCellValue('D' . $row, 'РП');
$sheet->setCellValue('E' . $row, 'Янв');
$sheet->setCellValue('F' . $row, 'Фев');
$sheet->setCellValue('G' . $row, 'Мар');
$sheet->setCellValue('H' . $row, 'Апр');
$sheet->setCellValue('I' . $row, 'Май');
$sheet->setCellValue('J' . $row, 'Июн');
$sheet->setCellValue('K' . $row, 'Июл');
$sheet->setCellValue('L' . $row, 'Авг');
$sheet->setCellValue('M' . $row, 'Сен');
$sheet->setCellValue('n' . $row, 'Окт');
$sheet->setCellValue('o' . $row, 'Ноя');
$sheet->setCellValue('p' . $row, 'Дек');
$sheet->setCellValue('q' . $row, 'Всего');
$sheet->setCellValue('r' . $row, 'Архивный');
$row++;
foreach ($data[$key]['project'] as $pid => $v) {
$p = $v['data'];
$sheet->setCellValue('a' . $row, $p['code']);
$sheet->setCellValue('b' . $row, $p['step']);
$sheet->setCellValue('c' . $row, $p['name']);
$sheet->setCellValue('d' . $row, $p['director_name']);
$col = 5;
for ($i = 1; $i <= 12; $i++) {
$cell = CellAddress::fromColumnAndRow($col, $row);
$value = $v['time'][$i]['value'] ?: '0';
$color = self::percentBlue($v['time'][$i]['percent']);
if($isKeyMoney) {
$value = $showMoney($pid, $value);
if($value=='-') $color = self::percentBlue(0);
}
$sheet->setCellValue($cell, $value);
$sheet->getStyle($cell)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($color);
$col++;
}
$cell = CellAddress::fromColumnAndRow($col++, $row);
$color = self::percentBrown($v['percent']);
$value = $v['total'] ?: '0';
if($isKeyMoney) {
$value = $showMoney($pid, $value);
if($value=='-') $color = self::percentBlue(0);
}
$sheet->setCellValue($cell, $value);
$sheet->getStyle($cell)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($color);
$cell = CellAddress::fromColumnAndRow($col, $row);
$sheet->setCellValue($cell, $p['archive']?'Архивный':'');
$row++;
}
$col = 5;
for ($i = 1; $i <= 12; $i++) {
$cell = CellAddress::fromColumnAndRow($col, $row);
$sheet->setCellValue($cell, $data[$key]['month'][$i]['value'] ?: '0');
$color = self::percentBlue($data[$key]['month'][$i]['percent']);
$sheet->getStyle($cell)->getFill()->setFillType(Fill::FILL_SOLID)->getStartColor()->setRGB($color);
$col++;
}
$cell = CellAddress::fromColumnAndRow($col, $row);
$sheet->setCellValue($cell, $data[$key]['total'] ?: '0');
$row++;
$row++;
}
$sheet2 = new Worksheet($spreadsheet,"Статистика");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 0;
$period = $data['year'].' г.';
self::summary($sheet,
$row,
"Информация",
'',
$period,
"",
[
['value'=>$data['total']['projects'],'title'=>'Проектов'],
$isMoney ? ['value'=>$data['total']['per_hour'],'title'=>'Ставка ч/ч'] : null,
['value'=>$data['total']['work_hours'],'title'=>'Рабочих часов по ПК'],
//['value'=>$data['total']['hours'],'title'=>'Всего часов'],
//['value'=>$data['total']['total'],'title'=>'Всего затрат'],
]
);
self::summary($sheet,
$row,
"Распределение времени между проектами",
'',
$period,
"%",
$data['graph1']
);
self::summary($sheet,
$row,
"Распределение времени по месяцам",
'',
$period,
"%",
$data['graph2']
);
}
static function summary(&$sheet,&$row,$title,$subtitle,$period,$dim,$data,$isTotal = false){
$row++;
$sheet->setCellValue('A' . $row++, $title);
$sheet->setCellValue('A' . $row++, $subtitle);
$total = 0;
foreach ($data as $k=>$v){
$sheet->setCellValue('A' . $row, $v['title']);
$sheet->setCellValue('B' . $row, $v['value'].($dim?' '.$dim:''));
$total+=$v['value'];
$row++;
}
if($isTotal){
$sheet->setCellValue('A' . $row, "Итого");
$sheet->setCellValue('B' . $row, $total.($dim?' '.$dim:''));
$row++;
}
$row++;
$sheet->setCellValue('A' . $row++, $period);
}
static function writeStaff(Spreadsheet $spreadsheet, $data, $options){
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Сводные данные');
$sheetIndex = 1;
//*
$sortStaff = function($k1,$k2)use($data){
$v1 = trim($data['emp'][$k1]['name']);
$v2 = trim($data['emp'][$k2]['name']);
return $v1<=>$v2;
};
uksort($data['stat1'],$sortStaff);
uksort($data['stat2'],$sortStaff);
uksort($data['stat3'],$sortStaff);
uksort($data['stat4'],$sortStaff);
//*/
//*
$row = 1;
$heads = [
'ФИО',
'Должность',
'Подразделение',
'Локация',
'Юр. лицо',
'Удалёнка',
'Вид',
'Начало',
'Пол',
'Стаж',
'Возраст',
'Архивный',
];
foreach ($heads as $k=>$v){
$cell = CellAddress::fromColumnAndRow($k+1,$row);
$sheet->setCellValue($cell,$v);
}
$row++;
foreach ($data['stat1'] as $emp_id){
$col = 1;
$emp = $data['emp'][$emp_id];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['staffing']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['department']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['city']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['org']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['freelance']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['org_type']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['hire']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['sex']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['work_period']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['age']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),$emp['archive']?'Архивный':'');
$row++;
}
//*/
/*
$sheet2 = new Worksheet($spreadsheet,"Заработная плата и ставка");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$heads = [
'ФИО',
'Должность',
'Подразделение',
'Локация',
'Юр. лицо',
'ЗП, ₽/мес.',
'Ставка, ₽/ч',
];
foreach ($heads as $k=>$v){
$cell = CellAddress::fromColumnAndRow($k+1,$row);
$sheet->setCellValue($cell,$v);
}
$row++;
foreach ($data['stat2'] as $emp_id) {
$col = 1;
$emp = $data['emp'][$emp_id];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['staffing']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['department']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['city']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['org']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['salary']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['per_hour']);
$row++;
}
//*/
//*
$sheet2 = new Worksheet($spreadsheet,"Информация о детях");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$heads = [
'ФИО',
'Должность',
'Подразделение',
'Локация',
'Дети',
'Архивный',
];
foreach ($heads as $k=>$v){
$cell = CellAddress::fromColumnAndRow($k+1,$row);
$sheet->setCellValue($cell,$v);
}
$row++;
foreach ($data['stat3'] as $emp_id) {
$col = 1;
$emp = $data['emp'][$emp_id];
$children = [];
foreach ($emp['children'] as $vv){
$children[] = $vv['name'].($vv['age'] ? ' ('.$vv['age'].')':'');
}
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['staffing']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['department']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['city']);
//$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['org']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), implode(", ",$children));
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['archive']?'Архивный':'');
$row++;
}
//*/
//*
$sheet2 = new Worksheet($spreadsheet,"Аттестация сотрудников");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$heads = [
'ФИО',
'Должность',
'Подразделение',
'Локация',
'Юр. лицо',
'НОПРИЗ',
'НОСТРОЙ',
'Ростехнадзор',
'Архивный',
];
foreach ($heads as $k=>$v){
$cell = CellAddress::fromColumnAndRow($k+1,$row);
$sheet->setCellValue($cell,$v);
}
$row++;
foreach ($data['stat4'] as $emp_id) {
$col = 1;
$emp = $data['emp'][$emp_id];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['staffing']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['department']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['city']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['org']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['nopriz']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['nostroi']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['technadzor']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['archive']?'Архивный':'');
$row++;
}
//*/
//*
$sheet2 = new Worksheet($spreadsheet,"Анализ нерабочих дней");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$heads = [
'ФИО',
'Должность',
'Подразделение',
'Шифр',
'Определение',
'Всего, дн',
'Итого, дн',
'Архивный',
];
foreach ($heads as $k=>$v){
$cell = CellAddress::fromColumnAndRow($k+1,$row);
$sheet->setCellValue($cell,$v);
}
$row++;
foreach ($data['absence'] as $i) {
$col = 1;
$emp = $data['emp'][$i['id']];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $i['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['staffing']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $emp['department']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col+3, $row), $i['total']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col+4, $row), $emp['archive']?'Архивный':'');
$initCol = $col;
foreach ($i['a'] as $vv){
$col = $initCol;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $vv['code']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $vv['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $vv['count']);
$row++;
}
$row++;
}
//*/
//*
$sheet2 = new Worksheet($spreadsheet,"Статистика");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
//*/
self::summary($sheet,
$row,
"Информация",
$data['filter_text'],
$data['period'],
"",
[
['value'=>$data['stat']['emps'].' чел.', 'title'=>'Штат'],
//['value'=>$data['stat']['salary'].' ₽.', 'title'=>'Фонд ЗП (gross)'],
// ['value'=>$data['stat']['per_hour'].' ₽/ч.', 'title'=>'Средняя ставка'],
['value'=>$data['stat']['age'].' г.', 'title'=>'Средний возраст'],
['value'=>$data['stat']['work'].' г.', 'title'=>'Средний стаж'],
['value'=>$data['stat']['hire'].' чел.', 'title'=>'Принято'],
['value'=>$data['stat']['archive'].' чел.', 'title'=>'Уволено'],
['value'=>$data['stat']['ssch'].' чел.', 'title'=>'ССЧ'],
['value'=>$data['stat']['flow'].'%', 'title'=>'Текучесть'],
]
);
}
static function writeFot(Spreadsheet $spreadsheet, $data, $options){
$sheetIndex = 1;
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('ФОТ');
$row = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow(7, $row), 'Средние');
$sheet->setCellValue(CellAddress::fromColumnAndRow(9, $row), 'Абсолютные');
$row++;
$sheet->setCellValue(CellAddress::fromColumnAndRow(1, $row), 'ФИО');
$sheet->setCellValue(CellAddress::fromColumnAndRow(2, $row), 'Должность');
$sheet->setCellValue(CellAddress::fromColumnAndRow(3, $row), 'Подразделение');
$sheet->setCellValue(CellAddress::fromColumnAndRow(4, $row), 'Локация');
$sheet->setCellValue(CellAddress::fromColumnAndRow(5, $row), 'Юр. лицо');
$sheet->setCellValue(CellAddress::fromColumnAndRow(6, $row), 'Вид');
$sheet->setCellValue(CellAddress::fromColumnAndRow(7, $row), 'ФОТ, ₽');
$sheet->setCellValue(CellAddress::fromColumnAndRow(8, $row), 'Ставка, ₽/ч');
$sheet->setCellValue(CellAddress::fromColumnAndRow(9, $row), 'ФОТ, ₽');
$sheet->setCellValue(CellAddress::fromColumnAndRow(10, $row), 'Ст-ть пр-я, ₽');
$sheet->setCellValue(CellAddress::fromColumnAndRow(11, $row), 'Архивный');
$row++;
uksort($data['data'],function ($k1,$k2) use ($data){
$v1 = trim($data['data'][$k1]['name']);
$v2 = trim($data['data'][$k2]['name']);
return $v1<=>$v2;
});
foreach ($data['data'] as $emp_id=>$v) {
$sheet->setCellValue(CellAddress::fromColumnAndRow(1, $row), $v['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow(2, $row), $v['staffing']);
$sheet->setCellValue(CellAddress::fromColumnAndRow(3, $row), $v['department']);
$sheet->setCellValue(CellAddress::fromColumnAndRow(4, $row), $v['city']);
$sheet->setCellValue(CellAddress::fromColumnAndRow(5, $row), $v['org']);
$sheet->setCellValue(CellAddress::fromColumnAndRow(6, $row), $v['org_type']);
$sheet->setCellValue(CellAddress::fromColumnAndRow(7, $row), cfloatval( $v['avg']['fot']));
$sheet->setCellValue(CellAddress::fromColumnAndRow(8, $row), cfloatval( $v['avg']['per_hour']));
$sheet->setCellValue(CellAddress::fromColumnAndRow(9, $row), cfloatval( $v['total']));
$sheet->setCellValue(CellAddress::fromColumnAndRow(10, $row), cfloatval( $v['money']));
$sheet->setCellValue(CellAddress::fromColumnAndRow(11, $row), $v['archive']?'Архивный':'');
$row++;
}
$sheet2 = new Worksheet($spreadsheet,"Динамика ФОТ");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$col = 2;
foreach ($data['periods'] as $year=>$m){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col,$row),$year);
$col+=count($m);
}
$row++;
$col = 2;
foreach ($data['periods'] as $year=>$months){
foreach ($months as $month=>$m){
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++,$row),Merakomis::getMonth($month));
}
}
$row++;
$sheet->setCellValue(CellAddress::fromColumnAndRow(1,$row),'ФОТ, млн. '.Merakomis::CURRENCY);
$col = 2;
foreach ($data['periods'] as $year=>$months){
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($m['fot']));
}
}
$row++;
$sheet->setCellValue(CellAddress::fromColumnAndRow(1,$row),'Стоимость пр-я, млн. '.Merakomis::CURRENCY);
$col = 2;
foreach ($data['periods'] as $year=>$months){
foreach ($months as $m) {
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), cfloatval($m['money']));
}
}
$sheet2 = new Worksheet($spreadsheet,"Статистика");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
self::summary($sheet,
$row,
"Информация",
$data['filter_text'],
$data['period'],
"",
[
[
'title'=>'Штат',
'value'=>count($data['data']).' чел.',
],
[
'title'=>'Средний ФОТ',
'value'=>$data['totals']['avg']['fot'].' '.Merakomis::CURRENCY,
],
[
'title'=>'Средняя ставка',
'value'=>$data['totals']['avg']['per_hour'].' '.Merakomis::CURRENCY.'/ч',
],
[
'title'=>'Абсолютный ФОТ',
'value'=>$data['totals']['total'].' '.Merakomis::CURRENCY,
],
[
'title'=>'Стоимость пр-я',
'value'=>$data['totals']['money'].' '.Merakomis::CURRENCY,
],
]
);
}
static function writeMoneyFot(Spreadsheet $spreadsheet, $data,$options)
{
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('ФОТ');
$row = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow(2, $row), 'Бюджет, млн. Р');
$row++; $col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Бюджет');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['prevYear'].' '.$data['prevMonth']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['year'].' '.$data['month']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Флаг');
$row++; $col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Бюджет');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['budget']['other']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['budget']['edit']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['budget']['mark']?"Изм":"Ок");
$row++;
$row++;
$sheet->setCellValue(CellAddress::fromColumnAndRow(4, $row), 'ЗП, Р');
$sheet->setCellValue(CellAddress::fromColumnAndRow(9, $row), 'ФОТ, Р');
$sheet->setCellValue(CellAddress::fromColumnAndRow(11, $row), 'Ставка, Р/ч');
$row++; $col = 1;
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'ФИО');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Должность');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Подразделение');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['prevYear'].' '.$data['prevMonth']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['year'].' '.$data['month']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Локация');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Удалёнка');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Юр. лицо');
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['prevYear'].' '.$data['prevMonth']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['year'].' '.$data['month']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['prevYear'].' '.$data['prevMonth']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $data['year'].' '.$data['month']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), 'Флаг');
uksort($data['data'],function ($k1,$k2) use ($data){
$key_y1 = $data['year'] . $data['month'];
$emp1 = $data['data'][$k1][$key_y1]['name'];
$emp2 = $data['data'][$k2][$key_y1]['name'];
return $emp1<=>$emp2;
});
$format = function($v){
return $v?number_format($v,2,',',' '):'0.00';
};
foreach ($data['data'] as $v) {
$row++; $col = 1;
$key_y1 = $data['year'] . $data['month'];
$key_y2 = $data['prevYear'] . $data['prevMonth'];
$y1 = $v[$key_y1];
$y2 = $v[$key_y2];
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y2['name']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y2['staffing']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y2['department']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y2['fzp']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y1['fzp']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y1['location']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y1['freelance']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y1['org_type']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y2['fot']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y1['fot']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y2['per_hour']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y1['per_hour']);
$sheet->setCellValue(CellAddress::fromColumnAndRow($col++, $row), $y1['mark']);
}
}
static function project(){
if(!Emp::$IS_AUTH) exit;
$pid = intval($_GET['id']);
$project = Project::getByID($pid);
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle('Информация о проекте');
$sheetIndex = 1;
$name = Project::getCode($project)."_".$project[Project::$NAME];
$sheet->setCellValue('A1',$name);
$sheet->setCellValue('A2','Информация о проекте');
$sheet->setCellValue('A3','Карточка проекта, в разработке которого вы принимаете участие');
$row = 5;
$p = Project::format($project);
$data = [
'Руководитель проекта' => $p['director'],
'ГИП' => $p['gip'],
'Заказчик' => $p['client'],
'Юр. лицо' => $p['org'],
'Адрес' => $p['address'],
'Папка проекта' => $p['link'],
'Папка договора' => $p['doc_folder'],
'Начало работ по договору' => $p['date'],
'Окончание работ по договору' => $p['date_end'],
'Шифр' => $p['code'],
'Статус' => $p['status'],
'Стадия (тип) проекта' => $p['step'],
'Разделы: подраздел' => implode(", ",$p['sections']),
'Типология' => $p['obj_types'],
'Общая площадь, м2' => $p['area'],
'Строительный объем, м3' => $p['volume'],
'Максимальная высота, м' => $p['height'],
'Архивный' => $p['archive']?'Да':'Нет',
// 'Дата архивации' => $p['archive_date'],
// 'Описание' => $p['text'],
];
if($p['archive']){
$data['Дата архивации'] = $p['archive_date'];
}
$data['Описание'] = $p['text'];
foreach ($data as $k=>$v){
$sheet->setCellValue('A'.$row, $k);
$sheet->setCellValue('B'.$row, $v);
$row++;
}
$row++;
$row++;
$sheet2 = new Worksheet($spreadsheet,"Команда проекта");
$spreadsheet->addSheet($sheet2);
$spreadsheet->setActiveSheetIndex($sheetIndex++);
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
/*
$sheet->setCellValue('A'.($row++),'Команда проекта');
$sheet->setCellValue('A'.($row++),'Контакт-лист команды проекта');
$row++;
$sheet->setCellValue('A'.($row),'Сотрудник');
$sheet->setCellValue('B'.($row),'Раздел: подраздел');
$sheet->setCellValue('C'.($row),'Skype');
$sheet->setCellValue('D'.($row),'Email');
$sheet->setCellValue('E'.($row),'Телефон');
$row++;
$r = Member::select([
\Query::LEFT_JOINS => [
[Emp::$table_name,Emp::$ID,Member::$EMP]
],
\Query::WHERE => new \Where(\Where::_and([
\Where::_operator(Member::$TEAM,'=',$project[Project::$ID]),
]))
]);
while($l = \DB::fetch($r)){
$section = Section::getFullName( Section::getByID(intval($l[Member::$SECTION])) );
$sheet->setCellValue('A'.($row),$l[Emp::$NAME]);
$sheet->setCellValue('B'.($row),$section);
$sheet->setCellValue('C'.($row),$l[Emp::$SKYPE]);
$sheet->setCellValue('D'.($row),$l[Emp::$EMAIL]);
$sheet->setCellValue('E'.($row),$l[Emp::$PHONE]);
$row++;
}
*/
$team = json_decode($_POST['team'],true);
$columns = $team['columns'];
$rows = $team['rows'];
foreach ($columns as $k=>$col){
$sheet->setCellValue(CellAddress::fromColumnAndRow($k+1,$row),$col['name']);
}
$row++;
foreach ($rows as $member){
forEach($member['data'] as $k=>$v){
$value = $v['value'];
if(is_array($value)) $value = $value['name'];
$sheet->setCellValue(CellAddress::fromColumnAndRow($k+1,$row),$value);
}
$row++;
}
//*
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$name.'.xlsx"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
//*/
}
static function contractor(){
if(!Emp::$IS_AUTH) exit;
$id = intval($_GET['id']);
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
//$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(1);
$contractor = Contractor::getByID($id);
$contractor = Contractor::format($contractor);
$row = 1;
$sheet->setCellValue('A1',$contractor['name']);
$row++;
$data = [
'Имя'=>$contractor['name'],
'Описание'=>$contractor['text'],
'ИНН'=>$contractor['inn'],
'Группа компаний'=>$contractor['group'],
'Тип'=>$contractor['status'],
];
foreach ($data as $k=>$v){
$sheet->setCellValue('A'.$row, $k);
$sheet->setCellValue('B'.$row, $v);
$row++;
}
$spreadsheet->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
//*
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$contractor['name'].'.xlsx"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
//*/
}
static function emp(){
if(!Emp::$IS_AUTH) exit;
$emp_id = intval($_GET['id']);
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
//$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(1);
$data = Emp::getPublicData($emp_id);
$row = 1;
$sheet->setCellValue('A1',$data['data']['name']);
$row++;
foreach ($data['tr'] as $k=>$v){
$sheet->setCellValue('A'.$row, $k);
$sheet->setCellValue('B'.$row, $v);
$row++;
}
$spreadsheet->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$data['tr']['Имя'].'.xlsx"');
header('Cache-Control: max-age=0');
/**/
//$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
}
static function writeAllProjects($spreadsheet,$data,$options)
{
if(!Emp::$IS_AUTH) exit;
$sheet = $spreadsheet->getActiveSheet();
$row = 1;
$sheet->setCellValue('F'.$row,'Время проектирования, ч.');
$row++;
$thead = [
'Шифр',
'Стадия',
'Название',
'Площадь, м²',
'РП',
'АР',
'КР',
'ИОС',
'СПЕЦ',
'BIM-IT',
'УПР',
'Всего',
'чч/м²',
'Архивный',
];
foreach ($thead as $k=>$v){
$sheet->setCellValueByColumnAndRow($k+1,$row,$v);
}
uasort($data['data'],function($a,$b){
return $a['code']<=>$b['code'];
});
foreach ($data['data'] as $v){
$row++;
$col = 1;
$sheet->setCellValueByColumnAndRow($col++,$row,$v['code']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['step']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['title']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['area']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['director']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['times']['АР']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['times']['КР']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['times']['ИОС']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['times']['СПЕЦ']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['times']['BIM-IT']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['times']['УПР']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['total']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['ch']);
$sheet->setCellValueByColumnAndRow($col++,$row,$v['archive']?'Да':'');
}
}
static function report(){
if(!Emp::$IS_AUTH) exit;
$data = json_decode($_POST['data'],true);
$options = json_decode($_POST['options'],true);
$type = $options['type'];
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setTitle("Таблицы");
$report_title = $_POST['report_title'];
//$sheet2 = new Worksheet($spreadsheet,"Аналитика");
//$spreadsheet->addSheet($sheet2);
//$sheet2->setTitle("Аналитика");
if(is_numeric($type)){
switch ($type){
case 0 : static::writeMyProjects($spreadsheet,$data,$options); break;
case 1 :
if($options['subtype']){
$project = Project::getByID($options['subtype']);
$report_title = Project::getCodeName($project);
static::writeMyTeam2($spreadsheet, $data, $options);
} else {
static::writeMyTeam($spreadsheet, $data, $options);
}
break;
//case 2 : static::writeMyDepartments($spreadsheet,$data,$options); break;
case 2 : // Моё подразделение
case 3 :case 4 :case 5 :case 6 : // Офисы
case 7 : // Моя компания
static::writeMyCompany($spreadsheet,$data,$options); break;
case 8: static::writeMyYear($spreadsheet,$data,$options); break;
case 9: static::writeStaff($spreadsheet,$data,$options); break;
case 11: static::writeFot($spreadsheet,$data,$options); break;
case 12: static::writeAllProjects($spreadsheet,$data,$options); break;
}
} else {
switch ($type){
case "money_fot":
$report_title = "ФОТ";
static::writeMoneyFot($spreadsheet,$data,$options); break;
}
}
$spreadsheet->setActiveSheetIndex(0);
//$spreadsheet->getActiveSheet()->getColumnDimension('A')->setWidth(1);
/*
$row = 1;
$sheet->setCellValue('A1',$data['data']['name']);
$row++;
foreach ($data['tr'] as $k=>$v){
$sheet->setCellValue('A'.$row, $k);
$sheet->setCellValue('B'.$row, $v);
$row++;
}
$spreadsheet->getActiveSheet()->getColumnDimension('A')->setAutoSize(true);
$spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true);
*/
//*
$writer = new Xlsx($spreadsheet);
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$report_title.'.xlsx"');
header('Cache-Control: max-age=0');
$writer->save('php://output');
//*/
}
}