<?php
namespace App\Controller;
use DateTime;
use App\Entity\Actions;
use App\Service\Securizer;
use App\Entity\Intervention;
use App\Repository\StatusRepository;
use App\Repository\ActionsRepository;
use App\Repository\ClientsRepository;
use App\Repository\TicketsRepository;
use App\Repository\ContactsRepository;
use App\Repository\ContratsRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\InterventionRepository;
use App\Repository\LigneDeContratRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
class ActionsController extends AbstractController
{
/**
* @IsGranted("ROLE_USER")
*/
public function index(AccessDecisionManagerInterface $accessDecisionManager, ActionsRepository $repoAction, ContactsRepository $repoContact, TicketsRepository $repoTicket, InterventionRepository $repoIntervention, ContratsRepository $repoContrat, LigneDeContratRepository $repoLigneContrat): Response
{
//retourne tous les tickets
$securizer = new Securizer($accessDecisionManager);
$actions = $repoAction->findActionId($this->getUser(), $securizer, $repoTicket, $repoContact, $repoIntervention, $repoContrat, $repoLigneContrat);
return $this->json($actions, 200, [], ['groups' => 'affichageAction']);
}
/**
* @IsGranted("ROLE_USER")
*/
public function voir($id, ActionsRepository $repoAction, ContactsRepository $repoContact, AccessDecisionManagerInterface $accessDecisionManager, TicketsRepository $repoTicket, InterventionRepository $repoIntervention, ContratsRepository $repoContrat, LigneDeContratRepository $repoLigneContrat): Response
{
//retourne une action
$securizer = new Securizer($accessDecisionManager);
$actions = $repoAction->findActionId($this->getUser(), $securizer, $repoTicket, $repoContact, $repoIntervention, $repoContrat, $repoLigneContrat);
//verifi que l'intervention que l'on cherche fait bien partie de la liste de ceux qu'il est possible d'afficher
if (in_array($repoAction->find($id), $actions)) {
$action = $repoAction->find($id);
} else {
return $this->json([
'status' => 400,
'message' => "Vous ne pouvez pas consulter cette action"
], 400);
}
return $this->json($action, 200, [], ['groups' => 'affichageAction']);
}
/**
* @IsGranted("ROLE_TECH")
*/
public function voirActionsIntervention($id, ActionsRepository $repoAction): Response
{
//retourne actions par rapport a une intervention
$actions = $repoAction->findBy(["intervention" => $id]);
return $this->json($actions, 200, [], ['groups' => 'affichageAction']);
}
/**
* @IsGranted("ROLE_CLIENT")
*/
public function voirActionsTicket($id, ActionsRepository $repoAction): Response
{
//retourne actions par rapport a une intervention
$actions = $repoAction->findBy(["ticket" => $id]);
return $this->json($actions, 200, [], ['groups' => 'affichageAction']);
}
/**
* @IsGranted("ROLE_TECH")
*/
public function creer(Request $request, ValidatorInterface $validator, SerializerInterface $serializer, EntityManagerInterface $manager, StatusRepository $repoStatus): Response
{
//creer une nouvelle action, seul les role Tech ou superieur peuvent acceder a cette page
$jsonRecu = $request->getContent();
try {
//transforme le json reçu en entity
$action = $serializer->deserialize($jsonRecu, Actions::class, 'json');
if ($action->getTicket() == null && $action->getIntervention() == null) {
return $this->json([
'status' => 400,
'message' => "Vous devez choisir un ticket ou une intervention"
], 400);
} else {
$jsonRecu = json_decode($jsonRecu, true);
$action->setIntervenant($this->getUser());
//validation des données reçus
$errors = $validator->validate($action);
if (count($errors) > 0) {
return $this->json($errors, 400);
}
$manager->persist($action);
$manager->flush();
$ticket = $action->getTicket();
/** @var Intervention $intervention */
$intervention = $action->getIntervention();
if ($ticket != null) {
if ($jsonRecu["idStatus"] !== $ticket->getIdStatus()->getId()) {
$status = $repoStatus->findOneBy(['id' => (int) $jsonRecu["idStatus"]]);
$ticket->setIdStatus($status);
$action->setStatusChanged(true);
if ($status->getStatus() == "Termine") {
$client = $ticket->getBeneficiaire()->getIdClient();
$client->setHotlineCompteur($client->getHotlineCompteur() + $ticket->getDureeTotale());
$manager->persist($client);
}
$manager->persist($ticket);
} else if ($ticket->getIdStatus()->getStatus() == "Nouveau") {
$ticket->setIdStatus($repoStatus->findOneBy(['status' => 'En Cours']));
$manager->persist($ticket);
}
}
if ($intervention != null && ($intervention->getIdStatus()->getStatus() == "Programmer" || $jsonRecu["cloturer"])) {
$status = ($jsonRecu["cloturer"] ? 'Cloture' : 'En Cours');
$intervention->setIdStatus($repoStatus->findOneBy(['status' => $status]));
$action->setStatusChanged(true);
$manager->persist($intervention);
if ($status == "Cloture") {
// Si l'intervention est cloturée, on cloture tous les tickets associés
foreach ($intervention->getActions() as $action) {
$ticket = $action->getTicket();
if ($ticket != null) {
$ticket->setIdStatus($repoStatus->findOneBy(['status' => 'Cloture']));
$manager->persist($ticket);
}
}
}
}
$manager->flush();
}
} catch (\throwable $e) {
return $this->json([
'status' => 400,
'message' => $e->getMessage()
], 400);
}
return $this->json($action, 201, [], ['groups' => 'affichageAction']);
}
/**
* @IsGranted("ROLE_COMMERCIAL")
*/
public function modif($id, Request $request, ActionsRepository $repoAction, ValidatorInterface $validator, SerializerInterface $serializer, EntityManagerInterface $manager): Response
{
//modifier une action, seul les role Commercial ou superieur peuvent acceder a cette page
$action = $repoAction->find($id);
$interventionDepart = $action->getIntervention();
$ticketDepart = $action->getTicket();
if ($action == null) {
return $this->json([
'status' => 400,
'message' => "l'action à modifier n'existe pas"
], 400);
}
$jsonRecu = $request->getContent();
try {
//transforme le json reçu en entity
$serializer->deserialize($jsonRecu, Actions::class, 'json', ['object_to_populate' => $action]);
if ($action->getTicket() == $ticketDepart && $action->getIntervention() == $interventionDepart) {
$errors = $validator->validate($action);
if (count($errors) > 0) {
return $this->json($errors, 400);
}
$manager->persist($action);
$manager->flush();
} else {
return $this->json([
'status' => 400,
'message' => "Vous ne pouvez pas modifier le ticket ou l'intervention d'une action"
], 400);
}
} catch (\throwable $e) {
return $this->json([
'status' => 400,
'message' => $e->getMessage()
], 400);
}
return $this->json($action, 201, [], ['groups' => 'affichageAction']);
}
/**
* @IsGranted("ROLE_TECH")
*/
public function delete($id, ActionsRepository $repoAction, StatusRepository $repoStatus, AccessDecisionManagerInterface $accessDecisionManager, TicketsRepository $repoTicket, InterventionRepository $repoIntervention, ContratsRepository $repoContrat, LigneDeContratRepository $repoLigneContrat): Response
{
//Permets de supprimer une intervention
$action = $repoAction->find($id);
if (!isset($action)) {
return $this->json([
'status' => 400,
'message' => "l'action à supprimer n'existe pas"
], 400);
}
$ticket = $action->getTicket();
$intervention = $action->getIntervention();
if (isset($ticket) || isset($intervention)) {
$status = $repoStatus->findBy(["status" => ["Termine", "Cloture"]]);
if (in_array((isset($ticket) ? $ticket : $intervention)->getIdStatus(), $status))
return $this->json([
'status' => 400,
'message' => "l'action ne peut pas être supprimé car l'intervention ou le ticket n'est pas 'En Cours'"
], 400);
}
$repoAction->remove($action);
return $this->json(true, 200, [], ['groups' => 'affichageAction']);
}
}