<?php
declare(strict_types=1);
namespace App\Nolimit\Project\Controller;
use App\Entity\CompanyType;
use App\Entity\Currency;
use App\Nolimit\Project\Provider\ProjectDatatableProvider;
use App\Nolimit\Project\Manager\ProjectManager;
use App\Repository\CompanyRepository;
use App\Repository\ProjectRepository;
use App\Repository\ProjectStatusRepository;
use App\Repository\ProjectTypeRepository;
use App\Repository\UserRepository;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sonata\AdminBundle\Controller\CRUDController;
use Symfony\Component\HttpFoundation\Response;
use App\Entity\Company;
use App\Entity\Contract;
use App\Entity\ProjectType;
use App\Entity\Settings;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Snappy\Pdf;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class ProjectController extends CRUDController
{
private EntityManagerInterface $em;
private ProjectDatatableProvider $projectDatatableProvider;
private ProjectManager $projectManager;
private ProjectRepository $projectRepository;
private CompanyRepository $companyRepository;
private ProjectTypeRepository $projectTypeRepository;
private ProjectStatusRepository $projectStatusRepository;
private UserRepository $userRepository;
private TokenStorageInterface $tokenStorage;
public function __construct(EntityManagerInterface $em,
ProjectRepository $projectRepository,
ProjectDatatableProvider $projectDatatableProvider,
ProjectManager $projectManager,
CompanyRepository $companyRepository,
ProjectTypeRepository $projectTypeRepository,
ProjectStatusRepository $projectStatusRepository,
UserRepository $userRepository,
TokenStorageInterface $tokenStorage
)
{
$this->em = $em;
$this->projectDatatableProvider = $projectDatatableProvider;
$this->projectManager = $projectManager;
$this->projectRepository = $projectRepository;
$this->companyRepository = $companyRepository;
$this->projectTypeRepository = $projectTypeRepository;
$this->projectStatusRepository = $projectStatusRepository;
$this->userRepository = $userRepository;
$this->tokenStorage = $tokenStorage;
}
public function listAction(Request $request): Response
{
$companies = $this->companyRepository->findBy(array("deleted"=>false,"companyType"=>CompanyType::COMPANY_TYPE_K));
$projectType = $this->projectTypeRepository->findAll();
$projectStatus = $this->projectStatusRepository->findAll();
$user = $this->tokenStorage->getToken()->getUser();
$isSuperAdmin = in_array("ROLE_SUPER_ADMIN", $user->getRoles());
return $this->renderWithExtraParams('/project/project_view.html.twig', array (
'companies' => $companies,
'projectType' => $projectType,
'projectStatus' => $projectStatus,
'is_super_admin' => $isSuperAdmin
));
}
/**
* @Route("/admin/project/project/project_filter", name="project_filter", methods={"POST"} )
*/
public function projectFilterAction(): Response
{
// $status=$this->em->getRepository(ProjectStatus::class)->findAll();
// $data['selected_status']=array();
// foreach ($status as $item)
// {
// $data['status'][$item->getId()]=$item->getName();
// if($item->getId()!=ProjectStatus::APV_STATUS_INCHIS)
// {
// array_push($data['selected_status'],$item->getId());
// }
// }
// $treatment=$this->em->getRepository(ApvTreatment::class)->findAll();
// foreach ($treatment as $item2)
// {
// $data['treatment'][$item2->getId()]=$item2->getName();
// }
// $up=$this->em->getRepository(UnitateProductie::class)->findAll();
// foreach ($up as $item3)
// {
// $data['up'][$item3->getId()]=$item3->getCod().' - '.$item3->getName();
// }
// $contract=$this->em->getRepository(ProjectType::class)->findAll();
// foreach ($contract as $item4)
// {
// $data['contract'][$item4->getId()]=$item4->getName();
// }
//
$data="";
return new JsonResponse($data, 200);
}
/**
* @Route("/admin/app/project/project_filtered", name="project_filtered", methods={"POST"} )
*/
public function projectFilteredAction(Request $request): Response
{
$adata['adata'] = $this->projectManager->getFilteredData($request);
return $this->json($adata);
}
/**
* @Route("/admin/app/project/project_list", name="project_list", methods={"POST"} )
*/
public function projectListAction(TranslatorInterface $translator)
{
$adata['data'] = $this->projectDatatableProvider->datatableRows();
return $this->json($adata);
}
/**
* @Route("/admin/project/project_new", name="project_new", methods={"POST"} )
*/
public function projectNewAction(): Response
{
$companies = $this->companyRepository->findBy(array("deleted"=>false,"companyType"=>CompanyType::COMPANY_TYPE_K));
$projectTypes = $this->em->getRepository(ProjectType::class)->findBy(array ('deleted'=>0));
$currencies = $this->em->getRepository(Currency::class)->findAll();
$users = $this->userRepository->findBy(array ('enabled'=>1));
$projectStatuses = $this->projectStatusRepository->findAll();
return $this->renderWithExtraParams('/project/project_add_edit.html.twig', array (
'companies' => $companies,
'projectTypes' => $projectTypes,
'currencies' => $currencies,
'users' => $users,
'projectStatuses' => $projectStatuses
));
}
/**
* @Route("/admin/project/project_save", name="project_save", methods={"POST"} )
*/
public function projectSaveAction(Request $request): Response
{
$user = $this->tokenStorage->getToken()->getUser();
$isSuperAdmin = in_array("ROLE_SUPER_ADMIN", $user->getRoles());
$projectId = (int)$request->get('projectId');
// Meglévő projekt módosítása csak Super Admin számára engedélyezett
if ($projectId > 0 && !$isSuperAdmin) {
return new JsonResponse(['error' => 'Csak Super Admin módosíthat projektet.'], 403);
}
$project = $this->projectManager->saveUpdateProject($request);
//viewnak szukseges adatok. A datatable megjeleniteshez szukseges adatokat adja
$data[] = $this->projectDatatableProvider->datatableRow($project);
return new JsonResponse(array ('msg' => true, 'datatableRow' => $data[0]), 200);
}
/**
* @Route("/admin/project/project_edit", name="project_edit", methods={"GET","POST"} )
*/
public function projectEditAction(Request $request): ?Response
{
$user = $this->tokenStorage->getToken()->getUser();
$isSuperAdmin = in_array("ROLE_SUPER_ADMIN", $user->getRoles());
if (!$isSuperAdmin) {
return new JsonResponse(['error' => 'Csak Super Admin szerkeszthet projektet.'], 403);
}
$projectId = (int)$request->request->get("id");
$project = $this->projectRepository->find($projectId);
if (!$project) {
return null;
}
$companies = $this->companyRepository->findBy(array("deleted"=>false,"companyType"=>CompanyType::COMPANY_TYPE_K));
$projectTypes = $this->em->getRepository(ProjectType::class)->findBy(array ('deleted'=>0));
$currencies = $this->em->getRepository(Currency::class)->findAll();
$users = $this->userRepository->findBy(array ('enabled'=>1));
$projectStatuses = $this->projectStatusRepository->findAll();
return $this->renderWithExtraParams('/project/project_add_edit.html.twig', array (
'project' => $project,
'companies' => $companies,
'projectTypes' => $projectTypes,
'currencies' => $currencies,
'users' => $users,
'projectStatuses' => $projectStatuses
));
}
/**
* @Route("/admin/project/project_delete", name="project_delete", methods={"POST"} )
*/
public function projectDeleteAction(Request $request): Response
{
$user = $this->tokenStorage->getToken()->getUser();
$isSuperAdmin = in_array("ROLE_SUPER_ADMIN", $user->getRoles());
if (!$isSuperAdmin) {
return new JsonResponse(['msg' => false, 'error' => 'Csak Super Admin törölhet projektet.'], 403);
}
$projectId = (int)$request->get('id');
$project = $this->projectRepository->find($projectId);
if (!$project) {
return new JsonResponse(['msg' => false, 'error' => 'A projekt nem található.'], 404);
}
// Ha van szerződés csatolva, nem lehet törölni
if ($project->getContracts()->count() > 0) {
return new JsonResponse(['msg' => false, 'error' => 'A projekt nem törölhető, mert szerződés van hozzá csatolva.'], 400);
}
try {
$this->em->remove($project);
$this->em->flush();
return new JsonResponse(['msg' => true], 200);
} catch (\Exception $e) {
return new JsonResponse(['msg' => false, 'error' => 'Hiba történt a törlés során.'], 500);
}
}
/**
* @Route("/admin/project/project_get_selected_company_data", name="project_get_selected_company_data", methods={"POST"} )
*/
public function projectGetSelectedCompanyDataAction(Request $request): Response
{
$company = $this->companyRepository->find((int)$request->get('companyId'));
return new JsonResponse(array("contactPerson"=>$company->getContactPerson(),"tel"=>$company->getTel(), "email"=>$company->getEmail()), 200);
}
}