<?php
namespace App\Controller;
use App\Entity\File;
use App\Entity\Procedure;
use App\Entity\ProcedureContactValidation;
use App\Form\ProcedureType;
use App\Repository\FileRepository;
use App\Repository\ProcedureContactValidationRepository;
use App\Repository\ProcedureRepository;
use App\Repository\ProcedureStatusRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/procedure", name="procedure_")
*/
class ProcedureController extends AbstractController
{
private YouSignController $yousign;
public function __construct(YouSignController $yousign)
{
$this->yousign = $yousign;
}
/**
* @Route("/", name="list")
*/
public function list(ProcedureRepository $procedureRepository): Response
{
$user = $this->getUser();
if(!$user) {
return $this->redirectToRoute('app_login');
}
if (in_array('ROLE_ADMIN', $user->getRoles(), true)) {
$procedures = $procedureRepository->findBy([], ['id' => 'DESC']);
} else {
$procedures = $procedureRepository->findBy(['user' => $user], ['id' => 'DESC']);
}
return $this->render('procedure/list.html.twig', [
'procedures' => $procedures,
]);
}
/**
* @Route("/create", name="create")
*/
public function create(Request $request, ProcedureStatusRepository $procedureStatusRepository, ProcedureRepository $procedureRepository,
ProcedureContactValidationRepository $procedureContactValidationRepository, FileRepository $fileRepository): Response
{
$procedure = new Procedure();
$form = $this->createForm(ProcedureType::class, $procedure);
if($request->isMethod('POST')) {
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
foreach($_FILES['procedure']['tmp_name']['files'] as $file_uploaded) {
$mimetype = mime_content_type($file_uploaded);
if($mimetype !== 'application/pdf') {
$this->addFlash('warning', 'Only PDF files are allowed.');
return $this->redirectToRoute('procedure_create');
}
}
$user = $this->getUser();
$procedure->setUser($user);
$contacts = $form->getData()->getContacts();
$subscribers = $form->getData()->getSubscribers();
$status = $procedureStatusRepository->find(1);
$procedure->setProcedureStatus($status);
$procedureRepository->add($procedure, true);
foreach ($subscribers as $subscriber) {
$procedure->addSubscriber($subscriber);
}
foreach($contacts as $contact) {
$procedureContactValidation = new ProcedureContactValidation();
$procedureContactValidation->setContact($contact);
$procedureContactValidation->setProcedure($procedure);
$procedureContactValidationRepository->add($procedureContactValidation, true);
$procedure->addContact($contact);
}
foreach($_FILES['procedure']['tmp_name']['files'] as $key => $file_uploaded) {
$size = filesize($file_uploaded);
if ($size > 500000000) {
$this->addFlash('warning', 'The file you try to upload exceed the maximum upload file size.');
return $this->render('procedure/create.html.twig', [
'controller_name' => 'ProcedureController',
'form' => $form->createView(),
]);
}
$file = new File();
$file_token = $this->yousign->files($file_uploaded, $_FILES['procedure']['name']['files'][$key])['id'];
$file->setFileToken($file_token);
$fileRepository->add($file, true);
$procedure->addFile($file);
}
$procedureRepository->add($procedure, true);
$this->addFlash('success', 'Success, procedure is created.');
if ((int)$form->get('launch')->getData() === 1) {
return $this->redirectToRoute('procedure_placeit', array('procedure' => $procedure->getId()));
}
return $this->redirectToRoute('procedure_list');
}
}
return $this->render('procedure/create.html.twig', [
'controller_name' => 'ProcedureController',
'form' => $form->createView(),
]);
}
/**
* @Route("/edit/{procedure}", name="edit")
*/
public function edit(Request $request, Procedure $procedure, FileRepository $fileRepository, ProcedureRepository $procedureRepository,
ProcedureContactValidationRepository $procedureContactValidationRepository): Response
{
$form = $this->createForm(ProcedureType::class, $procedure);
if($request->isMethod('POST')) {
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid()) {
$contacts_select = [];
foreach($form->getData()->getContacts() as $contact) {
$contacts_select[] = $contact->getId();
$if_link_exist = $procedureContactValidationRepository->findBy(['contact' => $contact]);
if(!$if_link_exist) {
$procedure->addContact($contact);
}
}
foreach($procedure->getContacts() as $contact) {
if(!in_array($contact->getId(), $contacts_select, true)) {
$procedure->removeContact($contact);
}
}
foreach($procedure->getFiles() as $file) {
$this->yousign->delete_file($file->getFileToken());
$procedure->removeFile($file);
}
foreach($_FILES['procedure']['tmp_name']['files'] as $key => $file_uploaded) {
$file = new File();
$file_token = $this->yousign->files($file_uploaded, $_FILES['procedure']['tmp_name']['files'][$key])['id'];
$file->setFileToken($file_token);
$fileRepository->add($file, true);
$procedure->addFile($file);
}
$procedureRepository->add($procedure, true);
return $this->redirectToRoute('procedure_list');
}
}
return $this->render('procedure/edit.html.twig', [
'controller_name' => 'ProcedureController',
'form' => $form->createView(),
]);
}
/**
* @Route("/{procedure}", name="delete", methods={"DELETE"})
*/
public function delete(Request $request, Procedure $procedure, FileRepository $fileRepository, ProcedureRepository $procedureRepository): Response
{
if ($this->isCsrfTokenValid('delete'.$procedure->getId(), $request->request->get('_token'))) {
foreach ($procedure->getFiles() as $file) {
$fileYousign = $this->yousign->get_file($file->getFileToken());
if ($fileYousign) {
$this->yousign->delete_file($file->getFileToken());
}
$procedure->removeFile($file);
$fileRepository->remove($file, true);
}
foreach ($procedure->getProcedureContactValidations() as $procedureContactValidation) {
$procedure->removeProcedureContactValidation($procedureContactValidation);
}
foreach ($procedure->getContacts() as $contact) {
$procedure->removeContact($contact);
}
$procedureRepository->remove($procedure, true);
}
return $this->redirectToRoute('procedure_list');
}
/**
* @Route("/launch/{procedure}", name="launch")
*/
public function launch(Request $request, Procedure $procedure, ProcedureStatusRepository $procedureStatusRepository, ProcedureRepository $procedureRepository): Response
{
if($request->isMethod('POST')) {
$json_tab = json_decode($request->request->all()['form']['position']);
$json_tab_subscriber = json_decode($request->request->all()['form']['subscribers']);
$token_ps = base64_encode('webhook_procedure_success.'.$procedure->getId());
$token_ms = base64_encode('webhook_member_success.'.$procedure->getId());
$response = $this->yousign->procedure($procedure, $json_tab, $token_ps, $token_ms, $json_tab_subscriber);
$status = $procedureStatusRepository->find(2);
$procedure->setProcedureStatus($status);
$procedure->setProcedureToken($response['id']);
$procedureRepository->add($procedure, true);
$this->addFlash('success', 'Your procedure is launched');
return $this->redirectToRoute('procedure_list');
}
return new Response(null, 404);
}
/**
* @Route("/visualize/{procedure}", name="visualize")
*/
public function visualize(Procedure $procedure): Response
{
$files = $procedure->getFiles();
foreach($files as $file) {
$aFiles[] = stripslashes ($this->yousign->get_file($file->getFileToken()));
}
return $this->render('procedure/visualize.html.twig', [
'files' => $aFiles,
]);
}
/**
* @Route("/placeit/{procedure}", name="placeit")
*/
public function placeit(Procedure $procedure): Response
{
$contacts = $procedure->getContacts();
$subscribers = $procedure->getSubscribers();
foreach($procedure->getFiles() as $key_file => $file) {
$imagick = new \Imagick();
$imagick->setResolution(300, 300);
$imagick->setBackgroundColor('#ffffff');
$imagick->readImageBlob(base64_decode($this->yousign->get_file($file->getFileToken())));
$imagick->setFormat('png32');
$num_pages = $imagick->getNumberImages();
for($i = 0;$i < $num_pages; $i++) {
$imagick->setIteratorIndex($i);
$files[$key_file][$i]['image'] = base64_encode($imagick);
$d = $imagick->getImageGeometry();
$w = $d['width'];
$h = $d['height'];
$files[$key_file][$i]['w'] = $w;
$files[$key_file][$i]['h'] = $h;
}
$imagick->destroy();
$files_ids[] = $file->getFileToken();
}
return $this->render('procedure/placeit.html.twig', [
'files' => $files,
'files_ids' => $files_ids,
'contacts' => $contacts,
'subscribers' => $subscribers
]);
}
}