/
forest-lynx
/
project
Обзор
Документация
Войти
/
forest-lynx
/
project
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/Controller/DeveloperController.php
193 строки
6 KB
forest-lynx
init
04 дек 2024, 10:44
04 дек 2024, 10:44
f4ceba2
Код
Авторство
О чём код?
<?php namespace App\Controller; use App\Entity\Developer; use App\Entity\Employment; use App\Entity\ParticipationProject; use App\Entity\Position; use App\Entity\Project; use App\Enum\EmployeeStatus; use App\Form\DeveloperType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; #[Route('/developer', name: 'developer')] class DeveloperController extends CrudController { protected function getTitle(): string { return 'developer.title'; } protected function getEntityClass(): string { return Developer::class; } protected function getFormTypeClass(): string { return DeveloperType::class; } protected function getTemplate(string $action): string { return \sprintf('developer/%s.html.twig', $action); } protected function getRoutePrefix(): string { return 'developer'; } #[Route('/{id}/dismiss', name: '.dismiss', methods: [Request::METHOD_GET])] public function dismiss(Request $request, Developer $developer): Response { $developer->setStatus(EmployeeStatus::DISMISSED); $employment = $this->entityManager->getRepository(Employment::class) ->findOneBy(['developer' => $developer], ['id' => 'DESC']); if ($employment && $employment->getDateTo() === null) { $employment->setDateTo(new \DateTime()); } $this->entityManager->flush(); return $this->redirectToRoute('developer.index'); } #[Route('/{id}/add-project', name: '.add.project', methods: [Request::METHOD_POST])] public function addProject(Request $request, Developer $developer): Response { $token = $request->getPayload()->get('token'); if ($this->isCsrfTokenValid('add-project', $token)) { $detachPrevious = $request->get('detach_previous') === 'on' ? true : false; if ($detachPrevious) { /** @var ParticipationProject $lastProject */ $lastProject = $developer->getProjects()->last(); if ($lastProject && $lastProject->getDateTo() === null) { $lastProject->setDateTo(new \DateTime()); } } $projectId = $request->get('project'); if ($projectId) { $this->assignToProject($developer, $projectId); } } return $this->redirectToRoute('developer.edit', ['id' => $developer->getId()]); } #[Route('/{id}/add-position', name: '.add.position', methods: [Request::METHOD_POST])] public function addPosition(Request $request, Developer $developer): Response { $token = $request->getPayload()->get('token'); if ($this->isCsrfTokenValid('add-position', $token)) { $positionId = $request->get('position'); if ($positionId) { /** @var Employment $lastPosition */ $lastPosition = $developer->getEmployments()->last(); if ($lastPosition && $lastPosition->getDateTo() === null) { $lastPosition->setDateTo(new \DateTime()); } $this->assignToPosition($developer, $positionId); } } return $this->redirectToRoute('developer.edit', ['id' => $developer->getId()]); } protected function whenCreating(Request $request, object $entity): void { /** @var Developer $entity */ $projectId = $this->getRelatedId($request, 'project'); if ($projectId) { $this->assignToProject($entity, $projectId); } $positionId = $this->getRelatedId($request, 'position'); if ($positionId) { $this->assignToPosition($entity, $positionId); } } protected function whenEditing(Request $request, object $entity): void { $array_projects = \array_column( $this->entityManager->getRepository(Project::class) ->createQueryBuilder('p') ->select('p.id, p.name') ->getQuery() ->getArrayResult(), 'name', 'id' ); $array_positions = \array_column( $this->entityManager->getRepository(Position::class) ->createQueryBuilder('p') ->select('p.id, p.name') ->getQuery() ->getArrayResult(), 'name', 'id' ); $this->setOtherData([ 'all_projects' => $array_projects, 'all_positions' => $array_positions, ]); } private function getRelatedId(Request $request, string $relation): mixed { return $request->get('developer')[$relation] ?? null; } private function assignToProject(Developer $developer, mixed $id): void { /** @var Project $project */ $project = $this->entityManager->getRepository(Project::class)->find($id); if ($project) { $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(); } } } private function assignToPosition(Developer $developer, mixed $id): void { /** @var Position $position */ $position = $this->entityManager->getRepository(Position::class)->find($id); if ($position) { $assignedToPosition = $this->entityManager->getRepository(Employment::class) ->findOneBy([ 'position' => $position, 'developer' => $developer, ]); if (!$assignedToPosition) { $employment = new Employment(); $employment->setPosition($position); $employment->setDeveloper($developer); $this->entityManager->persist($employment); $this->entityManager->flush(); } } } }