<?php
namespace App\Controller;
use App\DTO\ProjectReportDTO;
use App\Entity\ProjectReport;
use App\Entity\ProjectTaskLog;
use App\Entity\TaskUserLog;
use App\Form\ProjectReportDTOType;
use App\Helper\EnumStatus\ProjectReportStatus;
use App\Repository\EmployeeRepository;
use App\Service\ProjectReportService;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Routing\Annotation\Route;
use Yectep\PhpSpreadsheetBundle\Factory;
use ZipStream\File;
#[Route('/')]
#[IsGranted('ROLE_USER')]
class DefaultController extends AbstractController
{
#[Route('/', name: 'default', methods: ['GET', "POST"])]
public function baseIndex(
Request $request,
Factory $factory,
EmployeeRepository $employeeRepository,
EntityManagerInterface $em,
ProjectReportService $projectReportService,
)
{
$projectReportDTO = new ProjectReportDTO();
$projectReportDTO->setPM($this->getUser()->getEmployee());
$form = $this->createForm(ProjectReportDTOType::class, $projectReportDTO);
$form->handleRequest($request);
if ($form->isSubmitted()) {
$projectReport = new ProjectReport();
$projectReport->setProject($projectReportDTO->getProject());
$projectReport->setProjectManager($projectReportDTO->getPM());
$projectReport->setMonth($projectReportDTO->getMonth());
$projectReport->setDateAt(new \DateTimeImmutable());
$projectReport->setPeriodName($projectReportDTO->getProject()->getName() . '-' . $projectReportDTO->getMonth()->getName() . '-' . $projectReportDTO->getMonth()->getYear());
$projectReport->setStatus(ProjectReportStatus::FORMED->value);
$projectReport->setProjectCost($projectReportDTO->getProject()->getCost());
$projectReport->setCostCustomer($projectReportDTO->getProject()->getCostCustomer());
$projectReport->setSurchargePM($projectReportDTO->getProject()->getSurchargePM());
$projectReport->setSurchargeTL($projectReportDTO->getProject()->getSurchargeTL());
$em->persist($projectReport);
$users = $employeeRepository->getUserByNames();
$readerXlsx = $factory->createReader('Xlsx');
if ($projectReportDTO->getFileJira()) {
$projectReport = $this->parceJiraPlan($readerXlsx, $projectReportDTO->getFileJira()->getPathname(), $users, $em, $projectReport);
}
if ($projectReportDTO->getFileKaiten()) {
$projectReportService->loadKaitenLogs($projectReport, $projectReportDTO->getFileKaiten(), true);
}
$plan = 0;
foreach ($projectReport->getProjectTaskPlans() as $projectTaskPlan) {
foreach ($projectTaskPlan->getTaskUserLogs() as $taskUserLog) {
$plan += $taskUserLog->getHours();
}
}
$projectReport->setPlan($plan);
$projectReportService->updateCostReport($projectReport);
$em->flush();
}
return $this->render('base.html.twig', [
'form' => $form->createView(),
'array' => $array ?? [],
'projectReport' => $projectReport ?? null,
]);
}
/**
* @param mixed $readerXlsx
* @param ProjectReportDTO $projectReportDTO
* @param mixed $users
* @param EntityManagerInterface $em
* @param ProjectReport $projectReport
* @return array
*/
protected function parceJiraPlan(mixed $readerXlsx, $pathFileJira, mixed $users, EntityManagerInterface $em, ProjectReport $projectReport)
{
$spreadsheet = $readerXlsx->load($pathFileJira);
$sheets = $spreadsheet->getAllSheets();
foreach ($sheets as $sheet) {
$array = $sheet->toArray();
}
$taskName = '';
$i = 0;
foreach ($array as $item) {
$i++;
//$item[1] - эпик
//$item[2] - название задачи
//$item[3] - исполнитель
//$item[4] - ключ задачи
//$item[5] - часы работы
if ($item[3]) {
if (!key_exists($item[3], $users)) {
throw new HttpException(404, 'Коэффициент на сотрудника ' . $item[3] . ' не найден');
}
$employee = $users[$item[3]];
$employeeValue = $employee->getValue();
$taskUserLog = new TaskUserLog();
$em->persist($taskUserLog);
$taskUserLog->setIsPaid(true);
$taskUserLog->setHours(floatval(str_replace('ч', '', $item[5])));
$taskUserLog->setEmployee($employee);
$taskUserLog->setValue($employeeValue);
$taskUserLogs[] = $taskUserLog;
$taskName = 'Без задачи';
$epicName = 'Без эпика';
$epicKey = 'Без эпика';
$taskKey = 'Без задачи';
if (!empty($taskUserLogs)) {
$projectTaskLog = new ProjectTaskLog();
$projectTaskLog->setName($taskName);
$projectTaskLog->setEpicName($epicName);
$projectTaskLog->setEpicKey($epicKey);
$projectTaskLog->setKey($taskKey);
$em->persist($projectTaskLog);
foreach ($taskUserLogs as $taskUserLog) {
$projectTaskLog->addTaskUserLog($taskUserLog);
}
$projectReport->addProjectTaskPlan($projectTaskLog);
$taskUserLogs = [];
}
}
}
return $projectReport;
}
}