meraproject/themes/merakomis/download/controller.php

2821 lines
119 KiB
PHP
Raw Normal View History

<?
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');
//*/
}
}