/
forest-lynx
/
project
Обзор
Документация
Войти
/
forest-lynx
/
project
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/Controller/ProjectController.php
144 строки
4 KB
forest-lynx
init
04 дек 2024, 10:44
04 дек 2024, 10:44
f4ceba2
Код
Авторство
О чём код?
<?php namespace App\Controller; use App\Entity\Developer; use App\Entity\ParticipationProject; use App\Entity\Project; use App\Enum\EmployeeStatus; use App\Enum\Status; use App\Form\ProjectType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; #[Route('/project', name: 'project')] class ProjectController extends CrudController { protected function getTitle(): string { return 'project.title'; } protected function getEntityClass(): string { return Project::class; } protected function getFormTypeClass(): string { return ProjectType::class; } protected function getTemplate(string $action): string { return \sprintf('project/%s.html.twig', $action); } protected function getRoutePrefix(): string { return 'project'; } #[Route('/{id}/add-developer', name: '.add.developer', methods: [Request::METHOD_POST])] public function addDeveloper(Request $request, Project $project): Response { $token = $request->getPayload()->get('token'); if ($this->isCsrfTokenValid('add-developer', $token)) { $detachPrevious = $request->get('detach_previous') === 'on' ? true : false; if ($detachPrevious) { /** @var ParticipationProject $lastProject */ $lastProject = $project->getDevelopers()->last(); if ($lastProject && $lastProject->getDateTo() === null) { $lastProject->setDateTo(new \DateTime()); } } $developerId = $request->get('developer'); if ($developerId) { $this->assignToDeveloper($project, $developerId); } } else { $this->addFlash('danger', 'invalid_parameters'); } return $this->redirectToRoute('project.edit', ['id' => $project->getId()]); } #[Route('/{id}/complete', name: '.complete', methods: [Request::METHOD_GET])] public function complete(Request $request, Project $project): Response { $project->setStatus(Status::COMPLETED); $this->setDateToParticipation($project); $this->entityManager->flush(); return $this->redirectToRoute('project.index'); } #[Route('/{id}/cancel', name: '.cancel', methods: [Request::METHOD_GET])] public function cancel(Request $request, Project $project): Response { $project->setStatus(Status::CANCELLED); $this->setDateToParticipation($project); $this->entityManager->flush(); return $this->redirectToRoute('project.index'); } private function setDateToParticipation(Project $project): void { $developers = $project->getDevelopers()->filter(function (ParticipationProject $developer) { return $developer->getDateTo() === null; }); /** @var ParticipationProject $developer */ foreach ($developers as $developer) { $developer->setDateTo(new \DateTime()); } } protected function whenEditing(Request $request, object $entity): void { $developers = $this->entityManager->getRepository(Developer::class) ->createQueryBuilder('d') ->select('d.id, CONCAT(d.lastName, \' \', d.firstName, \' \', d.middleName) as name') ->where('d.status != :status') ->setParameter('status', EmployeeStatus::DISMISSED) ->getQuery() ->getArrayResult(); $array_developers = \array_column( $developers, 'name', 'id' ); $this->setOtherData([ 'all_developers' => $array_developers, ]); } private function assignToDeveloper(Project $project, mixed $id): void { /** @var Developer $developer */ $developer = $this->entityManager->getRepository(Developer::class)->find($id); $assignedToProject = $this->entityManager->getRepository(ParticipationProject::class) ->findOneBy([ 'project' => $project, 'developer' => $developer, ]); if (!$assignedToProject) { $participation = new ParticipationProject(); $participation->setProject($project); $participation->setDeveloper($developer); $this->entityManager->persist($participation); $this->entityManager->flush(); } } }