2821 lines
119 KiB
PHP
2821 lines
119 KiB
PHP
|
|
<?
|
|||
|
|
|
|||
|
|
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');
|
|||
|
|
//*/
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|