<?php
namespace App\Controller;
use App\Entity\Task;
use App\Entity\User;
use App\Form\TaskType;
use App\Notification\MaillingNotification;
use App\Repository\LeadRepository;
use App\Repository\NotificationRepository;
use App\Repository\TaskRepository;
use App\Repository\UserRepository;
use App\Service\IntervalDate;
use DateInterval;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/task")
*/
class TaskController extends AbstractController
{
public $maillingNotification;
public function __construct(MaillingNotification $maillingNotification)
{
$this->maillingNotification = $maillingNotification;
date_default_timezone_set('Europe/Paris');
}
/**
* @Route("/", name="task.index", methods={"GET", "POST"})
*/
public function index(Request $request, EntityManagerInterface $entityManager, TaskRepository $taskRepository, UserRepository $userRepository): Response
{
if ($request->getSession()->get('userPossess') == 'all') {
$request->getSession()->set('userPossess', $this->getUser());
}
$user = $userRepository->find($request->getSession()->get('userPossess')->getId());
$tasks = [];
foreach ($user->getTasksActor() as $tasksActor) {
$tasks[] = $tasksActor;
}
$task = new Task();
$task->setUser($this->getUser());
$form = $this->createForm(TaskType::class, $task, ['action' => $this->generateUrl('task.new')]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager->persist($task);
$entityManager->flush();
// return $this->redirectToRoute('task.index', [], Response::HTTP_SEE_OTHER);
}
return $this->render('task/index.html.twig', [
'tasks' => $tasks,
'form' => $form->createView(),
'current_page' => 'task'
]);
}
/**
* @Route("/new/{page}", name="task.new", methods={"GET", "POST"})
*/
public function new(string $page = '', Request $request, EntityManagerInterface $entityManager, TaskRepository $taskRepository, LeadRepository $leadRepository, IntervalDate $intervalDate): Response
{
$task = new Task();
$task->setUser($this->getUser());
if ($request->request->get('task') != null) {
$due_day_custom = '';
if ($request->request->get('task')['due_day_custom'] != '') {
$due_day_custom = str_replace('/', '-', $request->request->get('task')['due_day_custom']);
}
if ($request->request->get('task')['due_day_custom'] == '' && $request->request->get('task')['due_day'] === '0') {
$due_day_custom = new DateTime('today midnight');
$due_day_custom = $due_day_custom->getTimestamp();
}
if ($due_day_custom == '') {
$task->setDueDate($intervalDate->getTimeDay($request->request->get('task')['due_day']), $request->request->get('task')['due_hour']);
} else {
$task->setDueDate(strtotime($due_day_custom), $request->request->get('task')['due_hour']);
}
if (!empty($request->request->get('task')['lead_id'])) {
$task->setLead($leadRepository->find($request->request->get('task')['lead_id']));
}
}
if ($task->getLead() != null && $task->getLead()->getUser() != null) {
$task->setUserAction($task->getLead()->getUser());
}
$form = $this->createForm(TaskType::class, $task);
$form->handleRequest($request);
if ($request->request->get('task')['reminder_interval'] != '0') {
$reminder = new DateTime($task->getDueDate()->format('Y-m-d H:i:s'));
$reminder->sub(new DateInterval($request->request->get('task')['reminder_interval']));
$task->setReminderDate($reminder);
}
if ($form->isSubmitted() && $form->isValid()) {
if ($this->isCsrfTokenValid('edit-task' . $this->getUser()->getId(), $request->get('_token'))) {
$entityManager->persist($task);
$entityManager->flush();
if($this->getUser() != $task->getUserAction()){
$this->maillingNotification->notification($task->getId(), 0);
}
if ($request->isXmlHttpRequest()) {
if ($page == "lead") {
$tasks = $task->getLead()->getTasks();
} else {
$tasks = $this->getUser()->getTasksActor();
}
return new JsonResponse([
'tasks' => $this->renderView('task/list_task.html.twig', ['tasks' => $tasks]),
]);
}
} else {
if ($request->isXmlHttpRequest()) {
return new JsonResponse([
'error' => 'Token non valide'
]);
}
}
}
}
/**
* @Route("/{id}/edit/{page}", name="task.edit", methods={"GET", "POST"})
*/
public function edit(string $page = '', Request $request, Task $task, EntityManagerInterface $entityManager, NotificationRepository $notificationRepository, TaskRepository $taskRepository, IntervalDate $intervalDate): Response
{
if ($request->request->get('task') != null) {
$request->request->get('task')['user'] = $task->getuser();
$request->request->get('task')['reminder_date'] = $task->getuser();
$due_day = str_replace('/', '-', $request->request->get('task')['due_day']);
$task->setDueDate(strtotime($due_day), $request->request->get('task')['due_hour']);
if ($request->request->get('task')['reminder_interval'] != '0') {
$reminder = new DateTime($task->getDueDate()->format('Y-m-d H:i:s'));
$reminder->sub(new DateInterval($request->request->get('task')['reminder_interval']));
$task->setReminderDate($reminder);
}
}
$notification = $notificationRepository->findByItemIdAndType($task->getId(), 0);
if($notification){
$notification = $notification[0];
if ($notification->getUser() == $this->getUser()) {
$notification->setIsSeen(1);
$entityManager->flush($notification);
}
}
$form = $this->createForm(TaskType::class, $task, ['action' => $this->generateUrl('task.edit', ['id' => $task->getId()])]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($this->isCsrfTokenValid('edit-task' . $this->getUser()->getId(), $request->get('_token'))) {
$entityManager->flush();
if ($request->isXmlHttpRequest()) {
if ($page == 'lead') {
$tasks = $taskRepository->findAllTaskIP($task->getLead());
} else {
$tasks = $this->getUser()->getTasksActor();
}
return new JsonResponse([
'tasks' => $this->renderView('task/list_task.html.twig', ['tasks' => $tasks]),
]);
}
} else {
if ($request->isXmlHttpRequest()) {
return new JsonResponse([
'error' => 'Token non valide'
]);
}
}
}
if ($request->isXmlHttpRequest()) {
$param = '';
if ($page == 'task') $param = '_task_page';
return new JsonResponse([
'form' => $this->renderView('task/_form_modal'.$param.'.html.twig', ['form' => $form->createView(), 'id' => 'edit-task', 'lead' => $task->getLead(), 'taskId' => $task->getId()])
]);
}
}
public static function getFormErrorMessages($form)
{
$errors = [];
foreach ($form->getErrors(true, true) as $error) {
$errors[] = $error;
}
return $errors;
}
/**
* @Route("/delete/{id}/{page}", name="task.delete", methods={"POST"})
*/
public function delete(string $page = '', Request $request, Task $task, EntityManagerInterface $entityManager): Response
{
$remove_id = $task->getId();
if ($page == 'task') {
$tasks = $task->getUserAction();
} else {
$tasks = $task->getLead();
}
if ($this->isCsrfTokenValid('delete' . $remove_id, $request->request->get('_token'))) {
$entityManager->remove($task);
$entityManager->flush();
}
if ($request->isXmlHttpRequest()) {
return new JsonResponse([
'tasks' => $this->renderView('task/list_task.html.twig', ['tasks' => $tasks->getTasks()]),
]);
}
return $this->redirectToRoute('task.index', [], Response::HTTP_SEE_OTHER);
}
}