<?php
namespace App\Controller;
use App\Controller\Admin\DashboardController;
use App\Controller\Admin\UserSurveyCrudController;
use App\Entity\AdminStatus;
use App\Entity\Document;
use App\Entity\DocumentTypeTag;
use App\Entity\EntityTypeTag;
use App\Entity\Order;
use App\Entity\Survey;
use App\Entity\Tag;
use App\Entity\User;
use App\Entity\UserFile;
use App\Entity\UserFileDocument;
use App\Entity\UserFileMissingFiles;
use App\Entity\UserFileProperty;
use App\Entity\UserSurvey;
use App\Entity\UserSurveyComment;
use App\Entity\UserSurveyStatus;
use App\Form\updateUserSurveyResultType;
use App\Form\updateUserSurveyStatusType;
use App\Form\UserFile\UserFileDocumentAskType;
use App\Form\UserFile\UserFileDocumentTagsType;
use App\Form\UserFile\UserFileMissingFilesType;
use App\Form\UserFile\UserFileMissingFileType;
use App\Form\UserFile\UserFilePersonInvalidCredentialType;
use App\Form\UserSurvey\AFCType;
use App\Form\UserSurvey\CMUDateType;
use App\Form\UserSurvey\CMUResultType;
use App\Form\UserSurvey\IFResultType;
use App\Form\UserSurvey\RmbLppDateType;
use App\Form\UserSurvey\SimulationType;
use App\Form\UserSurvey\updateUserSurveyType;
use App\Form\UserSurvey\UserSurveyDateLimitType;
use App\Form\UserSurveyCommentType;
use App\Service\BexioService;
use App\Service\DiscountService;
use App\Service\EmailService;
use App\Service\LogService;
use App\Service\PaymentService;
use App\Service\PdfService;
use App\Service\RsPdfService;
use App\Service\UserSurveyQueryService;
use App\Service\UserSurveyService;
use App\Service\XmlService;
use App\Service\XmlServiceQuasiResident;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Tools\Pagination\Paginator;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
use Exception;
use PhpParser\Comment\Doc;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
/**
* Require ROLE_ADMIN for *every* controller method in this class.
*
* @Route("/admin", name="admin_")
* @IsGranted("ROLE_ADMIN")
*/
class AdminController extends DashboardController implements EventSubscriberInterface
{
public EntityManagerInterface $em;
public RequestStack $request;
private EmailService $emailService;
private XmlService $xmlService;
private XmlServiceQuasiResident $xmlServiceQuasiResident;
private DiscountService $discountService;
private UserSurveyService $userSurveyService;
private UserSurveyQueryService $userSurveyQueryService;
private PdfService $pdfService;
private AdminUrlGenerator $adminUrlGenerator;
private LogService $logService;
private array $autorizedStatusForComplete;
private array $autorizedStatusForIncomplete;
private BexioService $bexioService;
private PaymentService $paymentService;
private RsPdfService $rsPdfService;
public function __construct(EmailService $emailService, XmlService $xmlService, XmlServiceQuasiResident $xmlServiceQuasiResident, DiscountService $discountService, UserSurveyService $userSurveyService, UserSurveyQueryService $userSurveyQueryService, PdfService $pdfService, EntityManagerInterface $entityManager, RequestStack $request, AdminUrlGenerator $adminUrlGenerator, LogService $logService, BexioService $bexioService, PaymentService $paymentService, RsPdfService $rsPdfService)
{
$this->emailService = $emailService;
$this->xmlService = $xmlService;
$this->xmlServiceQuasiResident = $xmlServiceQuasiResident;
$this->discountService = $discountService;
$this->userSurveyService = $userSurveyService;
$this->userSurveyQueryService = $userSurveyQueryService;
$this->pdfService = $pdfService;
$this->em = $entityManager;
$this->request = $request;
$this->adminUrlGenerator = $adminUrlGenerator;
$this->logService = $logService;
$this->paymentService = $paymentService;
$this->rsPdfService = $rsPdfService;
$this->autorizedStatusForComplete = ['PROCESSING_FILES_RECEIVED', 'PROCESSING_FILES_MISSING', 'PROCESSING_MISSING_FILES_SENT'];
$this->autorizedStatusForIncomplete = ['PROCESSING_FILES_RECEIVED', 'PROCESSING_FILES_MISSING', 'PROCESSING_MISSING_FILES_SENT'];
$this->bexioService = $bexioService;
}
public static function getSubscribedEvents()
{
return [];
}
/**
* @Route("/impersonate/{id}",name = "impersonate")
*
* @return Response
*/
public function impersonate($id)
{
$user = $this->em->getRepository(User::class)->find($id);
if (!$user) {
throw new NotFoundHttpException();
}
// if (count($this->get('security.token_storage')->getToken()->getRoles()) > 2) {
if ($this->isGranted('IS_IMPERSONATOR')) {
return $this->redirectToRoute('admin_reimpersonate', [
'id' => $id,
'_switch_user' => '_exit',
]);
}
return $this->redirectToRoute('espace_client_index', [
'_switch_user' => $user->getUserIdentifier(),
]);
}
/**
* @Route("/admin/reimpersonate/{id}", name = "reimpersonate")
*
* @return RedirectResponse|Response
*/
public function reimpersonateAction($id)
{
$user = $this->em->getRepository(User::class)->find($id);
if (!$user) {
throw new NotFoundHttpException();
}
return $this->redirectToRoute('espace_client_index', [
'_switch_user' => $user->getUserIdentifier(),
]);
}
/**
* @return Response
*/
public function exportUserSurveyCSVAction(Request $request)
{
$id = $request->query->get('id');
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($id);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$fileName = 'export_csv_questionnaire_' . date('d_m_y') . '_' . $userSurvey->getId() . '.csv';
$file = $this->getParameter('webdir') . '/uploads/files/' . $fileName;
$fp = fopen($file, 'w');
// HEADER CONTENT
$fields = ['Prestation : ' . $userSurvey->conditionalSurveyName(), 'Client : ' . $userSurvey->getUser()->getFullName(), 'Statut : ' . $userSurvey->getSurveyStatusLabel()];
fputcsv($fp, $fields);
$fields = ['', '', ''];
fputcsv($fp, $fields);
// COLUMN
$fields = ['Groupes de questions', 'Questions', 'Réponses'];
fputcsv($fp, $fields);
foreach ($userSurvey->getUserSurveyQuestions() as $answer) {
$fields = [$answer->getQuestionGroup()->getName(), $answer->getQuestion()->getName()];
if ('FileType' == $answer->getQuestion()->getType()->getType() && '' != $answer->getValue() && !is_null($answer->getValue())) {
$fields[] = $_ENV['ONLINE_BASE_PATH'] . '/uploads/files/' . $answer->getValue();
} else {
$fields[] = $answer->getValue();
}
fputcsv($fp, $fields);
}
fclose($fp);
$content = utf8_decode(file_get_contents($file));
unlink($file);
$response = new Response($content);
$response->headers->set('Content-Type', 'text/csv');
$disposition = $response->headers->makeDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$fileName
);
$response->headers->set('Content-Disposition', $disposition);
return $response;
}
/**
* @Route("/admin/download/usersurvey/files/{id}", name = "download_usersurvey_files")
*
* @return Response
*/
public function downloadUserSurveyFilesAction($id)
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($id);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$userFile = $userSurvey->getUserFile();
$files = [];
foreach ($userFile->getUserFileDocuments() as $document) {
$files[] = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurvey->getId() . '/' . $document->getFileName();
}
if (!empty($files)) {
$zip = new \ZipArchive();
// The name of the Zip documents.
$zipName = $this->getParameter('webdir') . '/uploads/files/Documents_' . $userSurvey->getId() . '.zip';
$zip->open($zipName, \ZipArchive::CREATE);
foreach ($files as $file) {
// $zip->addFromString(basename($file), file_get_contents($file));
$zip->addFile($file, basename($file));
}
$zip->close();
$response = new Response(file_get_contents($zipName));
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment;filename="Documents_' . $userSurvey->getId() . '.zip"');
$response->headers->set('Content-length', filesize($zipName));
@unlink($zipName);
return $response;
} else {
$this->addFlash('danger', 'Aucun fichier à télécharger pour cette prestation.');
$url = $this->adminUrlGenerator
->setController(UserSurveyCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
return $this->redirect($url);
}
}
/**
* @Route("/admin/getax/generate/file/{userSurveyId}", name = "getax_generate_file", requirements={"userSurveyId"="\d+"})
*
* @return Response
*/
public function generateGetaxFileAction(Request $request, int $userSurveyId = 0)
{
if (0 == $userSurveyId) {
$userSurveyId = $request->get('id');
}
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$baseUserSurvey = $userSurvey;
if (!is_null($userSurvey->getParent())) {
$baseUserSurvey = $userSurvey->getParent();
}
if ('QUASI_RESID' == $userSurvey->getSurvey()->getCode()) {
$xml = $this->xmlServiceQuasiResident->generateGetaxXmlFile($userSurvey);
} else {
$xml = $this->xmlService->generateGetaxXmlFile($baseUserSurvey);
}
file_put_contents($this->getParameter('webdir') . '/uploads/files/getax/xml/' . $userSurvey->getId() . '_' . $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' . date('d_m_y_h_i') . '.xml', $xml);
$this->addFlash('success', 'Fichier Getax généré');
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
}
/**
* @Route("/admin/getax/download/file/{id}", name = "getax_download_file")
*
* @return Response
*/
public function getGetaxTaxFileAction($id)
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($id);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
if ($userSurvey->hasGetaxFile($this->getParameter('webdir'))) {
$file = $this->getParameter('webdir') . '/uploads/files/getax/tax/' . $userSurvey->getId() . '_' . $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' . date('d_m_y') . '.tax';
$response = new Response(file_get_contents($file));
$response->headers->set('Content-Type', 'application/xml');
$response->headers->set('Content-Disposition', 'attachment;filename="' . $userSurvey->getId() . '_' . $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' . date('d_m_y') . '.tax' . '"');
$response->headers->set('Content-length', filesize($file));
return $response;
} else {
$this->addFlash('danger', 'Aucun fichier à télécharger pour cette prestation.');
$url = $this->adminUrlGenerator
->setController(UserSurveyCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
return $this->redirect($url);
}
}
/**
* @Route("/admin/batchupdate/usersurvey/status/{ids}", name = "batch_usersurvey_status")
*
* @return RedirectResponse|Response
*/
public function updateStatusformAction(Request $request, string $ids)
{
$form = $this->createForm(updateUserSurveyStatusType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$ids = explode('-', $ids);
foreach ($ids as $id) {
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($id);
$this->emailService->sendUserSurveyStatusChange($userSurvey);
$userSurvey->setUserSurveyStatus($form->getData()['userSurveyStatus']);
$userSurvey->setDateAFC($form->getData()['dateAFC']);
$userSurvey->setResultAFC($form->getData()['resultAFC']);
$userSurvey->setResultAFCComment($form->getData()['resultAFCComment']);
$this->em->persist($userSurvey);
}
$this->em->flush();
$url = $this->adminUrlGenerator
->setController(UserSurveyCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
return $this->redirect($url);
}
return $this->render('admin/update_usersurvey_status.html.twig', [
'form' => $form->createView(),
'ids' => $ids,
'type' => 'STATUS',
]);
}
/**
* @Route("/admin/batchupdate/usersurvey/result/{ids}", name = "batch_usersurvey_result")
*
* @return RedirectResponse|Response
*/
public function updateResultformAction(Request $request, string $ids)
{
$form = $this->createForm(updateUserSurveyResultType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$ids = explode('-', $ids);
foreach ($ids as $id) {
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($id);
$userSurvey->setResultCode($form->getData()['result']);
if ('QR' == $userSurvey->getResultCode()) {
$resultSurvey = $this->em->getRepository(Survey::class)->findOneByCode('QUASI_RESID');
$userSurvey->setResultSurvey($resultSurvey);
} elseif ('RS' == $userSurvey->getResultCode()) {
$resultSurvey = $this->em->getRepository(Survey::class)->findOneByCode('RECT_STD');
$userSurvey->setResultSurvey($resultSurvey);
} else {
$userSurvey->setResultSurvey(null);
}
$status = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE');
$userSurvey->setUserSurveyStatus($status);
$this->em->persist($userSurvey);
$this->emailService->sendUserSurveyStatusChange($userSurvey);
}
$this->em->flush();
$url = $this->adminUrlGenerator
->setController(UserSurveyCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
return $this->redirect($url);
}
return $this->render('admin/update_usersurvey_status.html.twig', [
'form' => $form->createView(),
'ids' => $ids,
'type' => 'RESULT',
]);
}
/**
* @Route("/admin/getax/download/all", name = "getax_download_all")
*/
public function downloadAllGetaxFilesAction()
{
$files = scandir($_ENV['GOOGLE_DRIVE_TAX_FOLDER']);
if (count($files) > 2) {
$zip = new \ZipArchive();
// The name of the Zip documents.
$zipName = $this->getParameter('webdir') . '/uploads/files/getax_all.zip';
$zip->open($zipName, \ZipArchive::CREATE);
foreach ($files as $fileName) {
if (!in_array($fileName, ['.', '..'])) {
$file = $this->getParameter('webdir') . '/uploads/files/getax/tax/' . $fileName;
$zip->addFromString(basename($file), file_get_contents($file));
}
}
$zip->close();
$response = new Response(file_get_contents($zipName));
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment;filename="getax_all.zip"');
$response->headers->set('Content-length', filesize($zipName));
@unlink($zipName);
return $response;
} else {
$this->addFlash('danger', 'Aucuns fichiers trouvés');
$url = $this->adminUrlGenerator
->setController(UserSurveyCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
return $this->redirect($url);
}
}
/**
* @Route("/admin/getax/monitor", name = "getax_monitor_robot")
*/
public function monitorGetaxRobotAction(Request $request)
{
if ($request->isXmlHttpRequest()) {
$url = $_ENV['LOCAL_MONITOR_PATH'];
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$jsonData = curl_exec($ch);
} else {
$jsonData = ['result' => false];
}
return new JsonResponse($jsonData);
}
/**
* @Route("/count/survey", name = "count_survey")
*/
public function countSurveyAction(Request $request)
{
$jsonData = ['result' => false];
if ($request->isXmlHttpRequest()) {
$userSurveysQuery = $this->em->getRepository(UserSurvey::class)
->createQueryBuilder('us')
->join('us.userSurveyStatus', 'uss')
->where('us.survey = :survey')
->andWhere('uss.code = :status')
->andWhere('us.isArchived = :isArchived')
->setParameters(['survey' => $request->request->get('survey'), 'status' => $request->request->get('status'), 'isArchived' => 0])
->getQuery();
$userSurveys = count(new Paginator($userSurveysQuery));
$jsonData = ['result' => $userSurveys];
}
return new JsonResponse($jsonData);
}
/**
* @Route("/count/date/survey", name = "count_survey_date")
*
* @throws Exception
*/
public function countSurveyDateAction(Request $request)
{
$jsonData = ['result' => false];
if ($request->isXmlHttpRequest()) {
$dateLimits = $this->em->getRepository(UserSurvey::class)->findLast();
$dateLimits[0]->fillDateLimitArray();
$dateLimitArray = $dateLimits[0]->getDateLimitArray();
if (!empty($dateLimitArray)) {
$keys = array_keys($dateLimitArray);
$usRepoQueryBuilder = $this->em->getRepository(UserSurvey::class)->createQueryBuilder('entity');
$queryBuilder = $this->userSurveyQueryService->initQueryBuilder($usRepoQueryBuilder);
$queryBuilder = $this->userSurveyQueryService->getUserSurveyDateLimitFilterQueryBuilder($usRepoQueryBuilder, $request->get('dateLimit'));
if (!empty($request->get('status'))) {
$status_list = explode(',', $request->get('status'));
$queryBuilder = $this->userSurveyQueryService->getUserSurveyStatusFilterQueryBuilder($queryBuilder, $status_list);
}
$userSurveys = count(new Paginator($queryBuilder->getQuery()));
$jsonData = ['result' => $userSurveys];
}
}
return new JsonResponse($jsonData);
}
/**
* @Route(path = "/usersurvey/display/{id}", name = "usersurvey_display")
*
* @return RedirectResponse|Response
*/
public function displayUserSurveyAction(Request $request, $id)
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($id);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$userFile = $userSurvey->getUserFile();
$current_status = $userSurvey->getStatus();
$current_resultCode = $userSurvey->getResultCode();
$current_datelimit = $userSurvey->getDateLimit();
$wasPaid = $userSurvey->isPaid();
$oldPrice = $userSurvey->getPrice();
$sendMail = false;
// form pour le resultat de la simulation
$formSimulation = $this->createForm(SimulationType::class, $userSurvey);
$formSimulation->handleRequest($request);
if ($formSimulation->isSubmitted() && $formSimulation->isValid()) {
$userSurvey = $formSimulation->getData();
$statusChange = $formSimulation->get('statusChange')->getData();
$switchToPaid = $formSimulation->get('switchToPaid')->getData();
$sendMail = $formSimulation->get('sendMail')->getData();
// pour les resultats simulations
if ($current_resultCode != $userSurvey->getResultCode()) {
$this->userSurveyService->setSurveyResult($userSurvey);
}
if ($switchToPaid) {
$userSurvey->setPaymentStatus('payedout');
}
if ($statusChange) {
$status = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE_PAYMENT_PENDING');
if ($switchToPaid || $userSurvey->isPaid()) {
$status = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE');
}
$userSurvey->setUserSurveyStatus($status);
}
$this->em->persist($userSurvey);
$this->em->flush();
$this->addFlash('success', 'Resulat de la simulation sauvegardé');
}
// form pour le resultat AFC
$formAFC = $this->createForm(AFCType::class, $userSurvey);
$formAFC->handleRequest($request);
if ($formAFC->isSubmitted() && $formAFC->isValid()) {
$userSurvey = $formAFC->getData();
$statusChange = $formAFC->get('statusChange')->getData();
$switchToPaid = $formAFC->get('switchToPaid')->getData();
$sendMail = $formAFC->get('sendMail')->getData();
if ($switchToPaid) {
$userSurvey->setPaymentStatus('payedout');
}
if ($statusChange) {
$userSurveyStatus = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE_PAYMENT_PENDING');
if ($switchToPaid || $userSurvey->isPaid()) {
$userSurveyStatus = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_POSTED');
}
$userSurvey->setUserSurveyStatus($userSurveyStatus);
}
$this->em->persist($userSurvey);
$this->em->flush();
$this->addFlash('success', 'Resulat AFC sauvegardé');
}
// form pour le resultat CMU
$formCMU = $this->createForm(CMUResultType::class, $userSurvey);
$formCMU->handleRequest($request);
if ($formCMU->isSubmitted() && $formCMU->isValid()) {
$userSurvey = $formCMU->getData();
$statusChange = $formCMU->get('statusChange')->getData();
$sendMail = $formCMU->get('sendMail')->getData();
$order = $userSurvey->getOrder();
if ($order) {
// Mise à jour du prix de la prestation.
$selectedProducts = $userSurvey->calculatePriceNew($this->userSurveyService);
// facture
$this->userSurveyService->generateUserSurveyBexioArticle($userSurvey, $selectedProducts);
// Si changement de prix. On met à jour la facture (annule et replace)
if ($oldPrice != $userSurvey->getPrice() && !in_array($userSurvey->getStatus(), ['CANCELED', 'INIT', 'ONGOING']) && !is_null($order->getBexioInvoiceId())) {
$this->paymentService->updateInvoice($order);
}
}
if ($statusChange) {
if ('CORRECT' == $userSurvey->getCmuResultType()) {
$userSurveyStatus = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE');
} else {
$userSurveyStatus = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('OFFER_PENDING');
}
$userSurvey->setUserSurveyStatus($userSurveyStatus);
$this->userSurveyService->finishUserSurvey($userSurvey);
}
$this->em->persist($userSurvey);
$this->em->flush();
$this->addFlash('success', 'Resulat CMU sauvegardé');
}
// form pour le dépot CMU
$formCMUDate = $this->createForm(CMUDateType::class, $userSurvey);
$formCMUDate->handleRequest($request);
if ($formCMUDate->isSubmitted() && $formCMUDate->isValid()) {
$userSurvey = $formCMUDate->getData();
$statusChange = $formCMUDate->get('statusChange')->getData();
$switchToPaid = $formCMUDate->get('switchToPaid')->getData();
$sendMail = $formCMUDate->get('sendMail')->getData();
if ($switchToPaid) {
$userSurvey->setPaymentStatus('payedout');
}
if ($statusChange) {
$userSurveyStatus = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_POSTED_CMU');
$userSurvey->setUserSurveyStatus($userSurveyStatus);
}
$this->em->persist($userSurvey);
$this->em->flush();
$this->addFlash('success', 'Resulat CMU sauvegardé');
}
// form pour le dépot des rmb LPP
$formRmbLpp = $this->createForm(RmbLppDateType::class, $userSurvey);
$formRmbLpp->handleRequest($request);
if ($formRmbLpp->isSubmitted() && $formRmbLpp->isValid()) {
$userSurvey = $formRmbLpp->getData();
$statusChange = $formRmbLpp->get('statusChange')->getData();
$switchToPaid = $formRmbLpp->get('switchToPaid')->getData();
$sendMail = $formRmbLpp->get('sendMail')->getData();
if ($switchToPaid) {
$userSurvey->setPaymentStatus('payedout');
}
if ($statusChange) {
$userSurveyStatus = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_POSTED');
$userSurvey->setUserSurveyStatus($userSurveyStatus);
}
$this->em->persist($userSurvey);
$this->em->flush();
$this->addFlash('success', 'Date AFC sauvegardé');
}
// form pour le resultat Impot france
$formIF = $this->createForm(IFResultType::class, $userSurvey);
$formIF->handleRequest($request);
if ($formIF->isSubmitted() && $formIF->isValid()) {
$userSurvey = $formIF->getData();
$statusChange = $formIF->get('statusChange')->getData();
$switchToPaid = $formIF->get('switchToPaid')->getData();
$sendMail = $formIF->get('sendMail')->getData();
if ($switchToPaid) {
$userSurvey->setPaymentStatus('payedout');
}
if ($statusChange) {
$userSurveyStatus = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('DONE_PAYMENT_PENDING');
if ($switchToPaid || $userSurvey->isPaid()) {
$userSurveyStatus = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_POSTED_FR');
}
$userSurvey->setUserSurveyStatus($userSurveyStatus);
}
$this->em->persist($userSurvey);
$this->em->flush();
$this->addFlash('success', 'Resulat Impot France sauvegardé');
}
// form pour modifier les infos de base (status/prix/date etc..)
$formUserSurvey = $this->createForm(updateUserSurveyType::class, $userSurvey);
$formUserSurvey->handleRequest($request);
if ($formUserSurvey->isSubmitted() && $formUserSurvey->isValid()) {
$userSurvey = $formUserSurvey->getData();
$sendMail = $formUserSurvey->get('sendMail')->getData();
if (!is_null($userSurvey->getOrder())) {
$order = $userSurvey->getOrder();
// Le formulaire rajoute des réductions.
foreach ($order->getDiscounts() as $discount) {
if (is_null($discount->getType())) {
$discount
->setType('ADMIN')
->setNbTimesUsed(1)
->setNbCounted(1)
->setDateValid(new DateTime())
->setCode($this->discountService->generateCode($userSurvey->getUser(), 'ADMIN'));
}
}
// Annulation de la facture. Si annulé
if ('CANCELED' == $userSurvey->getStatus()) {
$order = $userSurvey->getOrder();
if (!is_null($order->getBexioInvoiceId())) {
$this->bexioService->cancelInvoice($order->getBexioInvoiceId());
}
} else {
if (!$userSurvey->isPaid()) {
// Mise à jour du prix de la prestation.
$selectedProducts = $userSurvey->calculatePriceNew($this->userSurveyService);
// facture
$this->userSurveyService->generateUserSurveyBexioArticle($userSurvey, $selectedProducts);
// Si changement de prix. On met à jour la facture (annule et replace)
if ($oldPrice != $userSurvey->getPrice() && !in_array($userSurvey->getStatus(), ['CANCELED', 'INIT', 'ONGOING'])) {
$this->paymentService->updateInvoice($order);
}
$this->em->persist($order);
$this->em->persist($userSurvey);
$this->em->flush();
}
}
}
// annulation de la facture bexio
if ('CANCELED' == $userSurvey->getStatus()) {
if (!is_null($userSurvey->getOrder())) {
$order = $userSurvey->getOrder();
if (!is_null($order->getBexioInvoiceId())) {
$this->bexioService->cancelInvoice($order->getBexioInvoiceId());
}
}
}
if ($current_datelimit != $userSurvey->getDateLimit()) {
if ($sendMail) {
$this->emailService->sendDateLimitUpdate($userSurvey);
}
}
$this->em->persist($userSurvey);
$this->em->flush();
$this->addFlash('success', 'Dossier mis à jour avec succès');
}
// Si paiement : génération de la facture si inexistante et on la met en payé.
if ($userSurvey->isPaid() && !$wasPaid) {
$this->paymentService->processPayment($userSurvey, $sendMail, true);
if ($sendMail) {
$this->emailService->sendUserSurveyPaymentStatusUpdate($userSurvey);
}
}
// changement de status
if ($current_status != $userSurvey->getStatus()) {
if ($sendMail) {
$this->emailService->sendUserSurveyStatusChange($userSurvey);
}
// si simu : on lance la generation du XML
if ('SIMULATION' == $userSurvey->getSurvey()->getCode() && 'PROCESSING' == $userSurvey->getStatus()) {
if (!is_null($userSurvey->getUserFile()->getOwner())) {
$xml = $this->xmlService->generateGetaxXmlFile($userSurvey);
file_put_contents($this->getParameter('webdir') . '/uploads/files/getax/xml/' . $userSurvey->getId() . '_' . $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' . date('d_m_y') . '.xml', $xml);
$this->addFlash('success', 'Fichier Getax généré');
}
}
if ($userSurvey->getUserSurveyStatus()->getCode() == 'DONE_PAYMENT_PENDING') {
if (!$userSurvey->getOrder()) {
$order = new Order($userSurvey->getPrice(), $userSurvey);
$userSurvey->setOrder($order);
}
$order = $userSurvey->getOrder();
$this->paymentService->adminPreparePayment($order);
}
}
$userSurveyComment = new UserSurveyComment();
$userSurveyComment->setUser($this->getUser());
$userSurveyComment->setUserSurvey($userSurvey);
$userSurveyCommentForm = $this->createForm(UserSurveyCommentType::class, $userSurveyComment);
$userSurveyCommentForm->handleRequest($request);
if ($userSurveyCommentForm->isSubmitted()) {
if ($userSurveyCommentForm->isValid()) {
$userSurveyComment = $userSurveyCommentForm->getData();
$this->em->persist($userSurveyComment);
$this->em->flush();
$this->addFlash('success', 'Commentaire ajouté');
} else {
$this->addFlash('danger', "le commentaire n'as pas été ajouté");
}
}
$logStatusHistory = $this->logService->getStatusChangeHistoryStrings($userSurvey);
$logPaymentHistory = $this->logService->getPaymentStatusChangeHistoryStrings($userSurvey);
$logDateLimitHistory = $this->logService->getDateLimitChangeHistoryStrings($userSurvey);
$logDocumentAskHistory = $this->logService->getDocumentAskHistoryStrings($userSurvey);
/**
* Refresh des formulaires avec les nouvelles data...
*/
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($id);
$formSimulation = $this->createForm(SimulationType::class, $userSurvey);
$formAFC = $this->createForm(AFCType::class, $userSurvey);
$formIF = $this->createForm(IFResultType::class, $userSurvey);
$formCMU = $this->createForm(CMUResultType::class, $userSurvey);
$formCMUDate = $this->createForm(CMUDateType::class, $userSurvey);
$formRmbLpp = $this->createForm(RmbLppDateType::class, $userSurvey);
$formUserSurvey = $this->createForm(updateUserSurveyType::class, $userSurvey);
$userSurveyComment = new UserSurveyComment();
$userSurveyComment->setUser($this->getUser());
$userSurveyComment->setUserSurvey($userSurvey);
$userSurveyCommentForm = $this->createForm(UserSurveyCommentType::class, $userSurveyComment);
return $this->render('admin/display_user_survey/display_usersurvey.html.twig', [
'userSurvey' => $userSurvey,
'logStatusHistory' => $logStatusHistory,
'logPaymentHistory' => $logPaymentHistory,
'logDateLimitHistory' => $logDateLimitHistory,
'logDocumentAskHistory' => $logDocumentAskHistory,
'userFile' => $userFile,
'survey' => $userSurvey->getSurvey(),
'surveyMode' => $userSurvey->getSurveyModeObject(),
'formUserSurvey' => $formUserSurvey->createView(),
'formSimulation' => $formSimulation->createView(),
'formCMU' => $formCMU->createView(),
'formCMUDate' => $formCMUDate->createView(),
'formRmbLpp' => $formRmbLpp->createView(),
'formAFC' => $formAFC->createView(),
'formIF' => $formIF->createView(),
'userSurveyCommentForm' => $userSurveyCommentForm->createView(),
'user' => $userSurvey->getUser(),
'emails' => $userSurvey->getEmails()
]);
}
/**
* @Route("/ajax/display/usersurvey/{userSurveyId}",name="ajax_display_usersurvey")
*/
public function ajaxDisplayUserSurvey($userSurveyId): JsonResponse
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$userFile = $userSurvey->getUserFile();
return new JsonResponse($this->renderView('admin/display_user_survey/resume/resume.html.twig', [
'userSurvey' => $userSurvey,
'userFile' => $userFile,
'survey' => $userSurvey->getSurvey(),
'surveyMode' => $userSurvey->getSurveyModeObject(),
'user' => $userSurvey->getUser(),
]));
}
/**
* @Route(path = "/usersurvey/access", name = "usersurvey_access")
*
* @return RedirectResponse|Response
*/
public function accessUserSurveyAction(Request $request)
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($request->query->get('id'));
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$user = $userSurvey->getUser();
// if (count($this->get('security.token_storage')->getToken()->getRoles()) > 2) {
if ($this->isGranted('IS_IMPERSONATOR')) {
return $this->redirectToRoute('admin_usersurvey_reaccess', [
'id' => $userSurvey->getId(),
'_switch_user' => '_exit',
]);
}
return $this->redirectToRoute('usersurvey_process', [
'userSurveyId' => $userSurvey->getId(),
'_switch_user' => $user->getUserIdentifier(),
]);
}
/**
* @Route("/usersurvey/reaccess/{id}", name = "usersurvey_reaccess")
*
* @return RedirectResponse|Response
*/
public function reAccessUserSurveyAction($id)
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($id);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$user = $userSurvey->getUser();
return $this->redirectToRoute('usersurvey_process', [
'userSurveyId' => $userSurvey->getId(),
'_switch_user' => $user->getUserIdentifier(),
]);
}
/**
* @Route("/usersurvey/updateStatus", name = "change_statut_color")
*/
public function changeStatutColors(Request $request)
{
$jsonData = ['result' => false];
if ($request->isXmlHttpRequest()) {
$statusColor = $this->em->getRepository(AdminStatus::class)->find($request->request->get('statut'));
$survey = $this->em->getRepository(UserSurvey::class)->find($request->request->get('survey'));
$survey->setAdminStatus($statusColor);
$this->em->flush();
$jsonData = ['result' => $statusColor->getColor()];
}
return new JsonResponse($jsonData);
}
/**
* @Route("/usersurvey/deleteDocument/{idDocument}", name = "delete_document")
* @Route("/usersurvey/deleteDocumentArchived/{idDocument}", name = "delete_document_archived")
* @Route("/usersurvey/restoreDocumentArchived/{idDocumentToRestore}", name = "restore_document_archived")
*/
public function deleteDocument($idDocument = null, $idDocumentToRestore = null): JsonResponse
{
if ($idDocument) {
$userFileDocument = $this->em->getRepository(UserFileDocument::class)->find((int)$idDocument);
if ($userFileDocument) {
$userFileDocument->setIsArchived(true);
$userFileDocument->setValidState(null);
$userFileDocument->setSavedDocumentUser(null);
$this->em->persist($userFileDocument);
$this->em->flush();
return new JsonResponse(true);
}
}
if ($idDocumentToRestore) {
$userFileDocument = $this->em->getRepository(UserFileDocument::class)->find((int)$idDocumentToRestore);
if ($userFileDocument) {
$userFileDocument->setIsArchived(false);
$userFileDocument->setValidState(null);
$userFileDocument->setSavedDocumentUser(null);
$this->em->persist($userFileDocument);
$this->em->flush();
return new JsonResponse(true);
}
}
return new JsonResponse(false);
}
/**
* @Route("/ajax/validDoc/getArchivedDocs", name = "ajax_get_archived_documents")
*/
public function getArchiveDocuments(Request $request): JsonResponse
{
$finalData = [];
$userFileId = $request->get('userFileId');
$userSurveyId = $request->get('userSurveyId');
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
/**
* @var UserFileDocument $ufda
*/
foreach ($userFile->getArchivedDocuments() as $ufda) {
$id = 0;
if ($ufda->getDocumentTag()) {
$id = $ufda->getDocumentTag()->getId();
}
$finalData[$id]['nameDocGroup'] = $ufda->getFullName();
$finalData[$id]['userFileDocument'][] = [
'id' => $ufda->getId(),
'name' => $ufda->getFileName(),
'validState' => $ufda->getValidState(),
'comment' => $ufda->getValidComment(),
'path' => $request->getUriForPath('/uploads/files/documents/' . $userSurveyId . '/' . $ufda->getFileName()),
'deletePathDoc' => $this->generateUrl('admin_delete_document_archived', ['idDocument' => $ufda->getId()]),
'restoreDoc' => $this->generateUrl('admin_restore_document_archived', ['idDocumentToRestore' => $ufda->getId()]),
'archivedPathDoc' => $this->generateUrl('admin_delete_document', ['idDocument' => $ufda->getId()]),
];
}
return new JsonResponse(['finalData' => $finalData, 'error' => null]);
}
/**
* @Route("/ajax/validDoc/valid", name = "ajax_valid_doc")
*/
public function validDocument(Request $request): JsonResponse
{
$userFileDocumentId = $request->get('userFileDocumentId');
$comment = $request->get('comment');
$validation = (bool)$request->get('validation');
$userFileDocument = $this->changeDocumentValidationStateId($userFileDocumentId, $validation, $comment);
$result = false;
if ($userFileDocument->getValidState() === $validation) {
$result = true;
}
return new JsonResponse(['result' => $result]);
}
private function changeDocumentValidationStateId($userFileDocumentId, $state, $comment = '')
{
$userFileDocument = $this->em->getRepository(UserFileDocument::class)->find((int)$userFileDocumentId);
$userFileDocument = $this->changeDocumentValidationState($userFileDocument, $state, $comment);
return $userFileDocument;
}
private function changeDocumentValidationState(UserFileDocument $userFileDocument, $state, $comment = '')
{
$userFileDocument->setValidState($state);
if ($state) {
$userFileDocument->setNotDeductible(false);
}
$userFileDocument->setValidComment($comment);
$this->em->persist($userFileDocument);
$this->em->flush();
return $userFileDocument;
}
/**
* @Route("/document/summary/{userFileId}/{userSurveyId}", name = "document_summary")
*/
public function documentSummary(Request $request, $userFileId, $userSurveyId)
{
// liste des docs, voir les validé, invalidé, archvé
$userFile = $this->em->getRepository(UserFile::class)->find((int)$userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
$documents = [
'validated' => $userFile->getValidatedDocuments(),
'unvalidated' => $userFile->getUnvalidatedDocuments(),
'not_deductible' => $userFile->getNotDeductibleDocuments(),
'not_reviewed' => $userFile->getNotReviewedDocuments(),
'missing' => $this->userSurveyService->getMissingFiles($userSurvey, $userFile, true),
'missing_send_to_client' => $userFile->getUserFileMissingFilesToDocument(),
'archived' => $userFile->getArchivedDocuments(),
];
return $this->render('admin/userFileDocument/document_summary.html.twig', [
'userSurvey' => $userSurvey,
'userFile' => $userFile,
'documents' => $documents,
]);
}
/**
* @Route("/userfile/validate/{userFileId}/{userSurveyId}", name = "validate_userfile")
*/
public function validateUserFile($userFileId, $userSurveyId)
{
// check for missing documents/ not reviewed document
// if no missing and all document validated
// valid the userfile/userSurvey
// send the mail if needed
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
$isValid = $userFile->isValid();
$original_status = $userSurvey->getStatus();
$sendMail = true;
if (!in_array($original_status, $this->autorizedStatusForComplete)) {
$this->addFlash('danger', "Le dossier n'est pas dans le bon status. ");
return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
if (true === $isValid['valid']) {
if ('SIMULATION' == $userSurvey->getSurvey()->getCode()) {
$status = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING');
$userSurvey->setUserSurveyStatus($status);
// si simu : on lance la generation du XML
if (!is_null($userSurvey->getUserFile()->getOwner())) {
$xml = $this->xmlService->generateGetaxXmlFile($userSurvey);
file_put_contents($this->getParameter('webdir') . '/uploads/files/getax/xml/' . $userSurvey->getId() . '_' . $userSurvey->getUser()->getLastname() . $userSurvey->getUser()->getName() . (date('Y') - 1) . '_' . date('d_m_y') . '.xml', $xml);
$this->addFlash('success', 'Fichier Getax généré');
}
} elseif ('REMBOURSEMENT_LPP' == $userSurvey->getSurvey()->getCode() && !$userFile->hasValidatedDocumentsByCode("DOC_IMP_FR")) {
$status = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FR_WAIT');
$userSurvey->setUserSurveyStatus($status);
$document = $this->em->getRepository(Document::class)->findOneBy(['code' => "DOC_IMP_FR"]);
$documentTag = new DocumentTypeTag();
$documentTag->setUserFile($userFile);
$documentTag->setDocument($document);
$this->em->persist($documentTag);
$userFileMissingFile = new UserFileMissingFiles();
$userFileMissingFile
->addTag($documentTag)
->setUserFile($userFile);
$this->em->persist($userFileMissingFile);
} else {
$status = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_COMPLETED');
$userSurvey->setUserSurveyStatus($status);
}
if ($original_status == $userSurvey->getStatus()) {
$sendMail = false;
}
$this->em->persist($userSurvey);
$this->em->flush();
// Mail to the customer only if the status has change
if ($sendMail) {
$this->emailService->sendUserSurveyStatusChange($userSurvey);
}
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
}
return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
/**
* @Route("/userfile/sendMissingFiles/{userFileId}/{userSurveyId}", name = "send_missing_files")
*/
public function sendMissingFile(Request $request, $userFileId, $userSurveyId)
{
// Create userMissingFiles based on empty document groups and invalid files
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
$sendMail = true;
if (!$userFile) {
throw new NotFoundHttpException();
}
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$original_status = $userSurvey->getStatus();
if (!in_array($original_status, $this->autorizedStatusForIncomplete)) {
$this->addFlash('danger', "Le dossier n'est pas dans le bon status.");
return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
// Documents obligatoires manquant
// 1/ créé des userFileDocument avec les Tags du document Manquant
$content = $request->getContent();
if (!empty($content)) {
$data = json_decode($content, true);
foreach ($data as $ids) {
if (!is_null($ids)) {
$idTable = explode(',', $ids);
if (!$userFile->hasAlreadyAMissingFiles($idTable)) {
$userFileMissingFile = new UserFileMissingFiles();
$userFileMissingFile->setUserFile($userFile);
foreach ($idTable as $id) {
$tag = $this->em->getRepository(Tag::class)->find($id);
if ($tag) {
$userFileMissingFile->addTag($tag);
}
}
$this->em->persist($userFileMissingFile);
}
}
}
}
// Documents invalides
$invalidFiles = $userFile->getUnvalidatedDocuments();
foreach ($invalidFiles as $userFileDocument) {
$tagIds = $userFileDocument->getTagIds();
if (!$userFile->hasAlreadyAMissingFiles($tagIds)) {
$userFileMissingFile = new UserFileMissingFiles($userFileDocument);
$this->em->persist($userFileMissingFile);
}
}
// pass the usersurvey into missing files
$status = $this->em->getRepository(UserSurveyStatus::class)->findOneByCode('PROCESSING_FILES_MISSING');
$userSurvey->setUserSurveyStatus($status);
$this->em->persist($userFile);
$this->em->persist($userSurvey);
$this->em->flush();
// send mail
if ($original_status == $userSurvey->getStatus()) {
$sendMail = false;
}
if ($sendMail) {
$this->emailService->sendUserSurveyStatusChange($userSurvey);
$this->addFlash('success', 'Fichiers mis à jour et client avertis par e-mail.');
}
// Redirect to document summary
return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
/**
* @Route("/delete/sent/missing/files/{userFileId}/{userSurveyId}", name="delete_sent_missing_files")
*/
public function deleteSentMissingFiles(Request $request, $userFileId, $userSurveyId)
{
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userFile) {
throw new NotFoundHttpException();
}
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$content = $request->getContent();
if (!empty($content)) {
$data = json_decode($content, true);
if (!empty($data)) {
foreach ($data as $userFileMissingFileId) {
$userFileMissingFile = $this->em->getRepository(UserFileMissingFiles::class)->find($userFileMissingFileId);
if ($userFileMissingFile) {
$this->em->remove($userFileMissingFile);
}
}
$this->em->flush();
}
}
return $this->redirectToRoute('admin_document_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
/**
* @Route("/ajax/createMissingFile/{userFileId}/{userSurveyId}", name = "ajax_create_missing_file")
*/
public function ajaxCreateMissingFile(Request $request, $userFileId, $userSurveyId)
{
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey || !$userFile) {
throw new NotFoundHttpException();
}
$form = $this->createForm(
UserFileDocumentAskType::class, null,
[
'userFile' => $userFile,
'action' => $this->generateUrl(
'admin_ajax_create_missing_file',
[
'userSurveyId' => $userSurveyId,
'userFileId' => $userFileId
]
),
]
);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$entityTypeTags = $form->get('entityTypeTags')->getData();
$documentId = $form->get('document')->getData();
$document = $this->em->getRepository(Document::class)->find($documentId);
if ($userFile->hasTag($document)) {
$documentTag = $userFile->getTag($document);
} else {
$documentTag = new DocumentTypeTag();
$documentTag->setUserFile($userFile)
->setDocument($document);
$this->em->persist($documentTag);
}
if (!empty($entityTypeTags)) {
foreach (explode(',', $entityTypeTags) as $entityTypeTagId) {
$entityTypeTag = $this->em->getRepository(EntityTypeTag::class)->find($entityTypeTagId);
if (!is_null($entityTypeTag)) {
$userFileMissingFile = new UserFileMissingFiles();
$userFileMissingFile
->addTag($documentTag)
->addTag($entityTypeTag)
->setUserFile($userFile);
$this->em->persist($userFileMissingFile);
} else {
throw new Exception('Erreur lors de la création de la demande de document. Entitée non trouvée');
}
}
} else {
$userFileMissingFile = new UserFileMissingFiles();
$userFileMissingFile
->addTag($documentTag)
->setUserFile($userFile);
$this->em->persist($userFileMissingFile);
}
$this->em->flush();
$this->addFlash('success', 'Demande sauvegardée');
} else {
$this->addFlash('danger', "Erreur lors de la création de la demande de document");
}
$source = $request->get('source_url');
return $this->redirect($source);
}
return new JsonResponse(
$this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
'userSurveyCommentForm' => $form->createView()
]));
}
/**
* @Route("/ajax/check/userFileStatus/{userFileId}/{userSurveyId}", name = "ajax_check_userfile_status")
*
* @return JsonResponse
*/
public function jsonCheckStatus(Request $request, $userFileId, $userSurveyId)
{
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
if (!$userFile) {
throw new NotFoundHttpException();
}
$isValid = $userFile->isValid();
if (!in_array($userSurvey->getStatus(), $this->autorizedStatusForComplete)) {
$isValid['valid'] = false;
$isValid['msg'] = 'Impossible de valider le dossier : le status doit être en "Dossier receptionné" ou "Documents manquants envoyé"';
}
return new JsonResponse($isValid);
}
/**
* @Route("/download/getax/files/old/{userFileId}/{userSurveyId}", name = "download_getax_files_old")
*
* @return Response
*/
public function downloadGetaxFilesOld(Request $request, $userFileId, $userSurveyId)
{
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
if (!$userFile) {
throw new NotFoundHttpException();
}
$userFileDocuments = $userFile->getUserFileDocumentsSorted();
if (!empty($userFileDocuments)) {
$path = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurvey->getId() . '/';
$valid_file_count = 0;
foreach ($userFileDocuments as $files_group) {
foreach ($files_group as $files) {
foreach ($files as $filename) {
if (!file_exists($path . $filename)) {
$this->addFlash('danger', 'Fichier Introuvable : ' . $filename);
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
$path_parts = pathinfo($filename);
if ('pdf' !== strtolower($path_parts['extension'])) {
$this->addFlash('danger', 'Fichier non PDF : ' . $filename);
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
++$valid_file_count;
}
}
}
if ($valid_file_count > 0) {
$outputName = $this->pdfService->clean((!$this->getUser() instanceof User ? 'undefined User' : strtoupper((string)$userSurvey->getUser()->getLastname()) . '-' . ucfirst((string)$userSurvey->getUser()->getName())) . '-Getax' . date('Y', strtotime('-1 year')));
$zip = new \ZipArchive();
// The name of the Zip documents.
$zipName = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurvey->getId() . '/' . $outputName . '.zip';
$zip->open($zipName, \ZipArchive::CREATE);
foreach ($userFileDocuments as $entity => $files_group) {
foreach ($files_group as $order => $files) {
foreach ($files as $key => $filename) {
$file = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurvey->getId() . '/' . $filename;
$output_name = $entity . '.' . $order . '.' . $key . '.' . $filename;
$zip->addFile($file, basename($output_name));
}
}
}
$zip->close();
$response = new Response(file_get_contents($zipName));
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment;filename="' . $outputName . '.zip"');
$response->headers->set('Content-length', filesize($zipName));
@unlink($zipName);
return $response;
} else {
$this->addFlash('danger', 'Aucun fichier trouvé pour cette prestation.');
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
} else {
$this->addFlash('danger', 'Aucun fichier à télécharger pour cette prestation.');
$url = $this->adminUrlGenerator
->setController(UserSurveyCrudController::class)
->setAction(Action::INDEX)
->generateUrl();
return $this->redirect($url);
}
}
/**
* @Route("/download/getax/files/{userFileId}/{userSurveyId}", name = "download_getax_files")
*
* @return Response
*/
public function downloadGetaxFiles(Request $request, $userFileId, $userSurveyId)
{
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
if (!$userFile) {
throw new NotFoundHttpException();
}
$userFileDocuments = $userFile->getValidatedDocuments();
if (!$userFileDocuments->isEmpty()) {
$files_to_merge = [];
$path = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurvey->getId() . '/';
foreach ($userFileDocuments as $userFileDocument) {
$filename = $userFileDocument->getFileName();
if (!file_exists($path . $filename)) {
$this->addFlash('danger', 'Fichier Introuvable : ' . $filename);
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
$path_parts = pathinfo($filename);
if ('pdf' !== strtolower($path_parts['extension'])) {
$this->addFlash('danger', 'Fichier non PDF : ' . $filename);
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
if ($userFileDocument->hasDocumentTagByCode('CODE_DECLA')) {
continue;
}
$files_to_merge[] = $filename;
}
if (!empty($files_to_merge)) {
$mergedFile = $this->pdfService->merge($path, $files_to_merge);
if (true === $mergedFile['result']) {
$outputName = $this->pdfService->clean((!$this->getUser() instanceof User ? 'undefined User' : strtoupper((string)$userSurvey->getUser()->getLastname()) . '-' . ucfirst((string)$userSurvey->getUser()->getName())) . '-Getax' . date('Y', strtotime('-1 year')));
$zip = new \ZipArchive();
$zipName = $this->getParameter('webdir') . '/uploads/files/' . $outputName . '.zip';
$zip->open($zipName, \ZipArchive::CREATE);
$zip->addFile($path . $mergedFile['outputFileName'], $outputName . '.pdf');
$zip->close();
$response = new Response(file_get_contents($zipName));
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment;filename="' . $outputName . '.zip"');
$response->headers->set('Content-length', filesize($zipName));
@unlink($zipName);
return $response;
} else {
$this->addFlash('danger', "Problème lors de l'appel a ILovePDF : " . $mergedFile['msg']);
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
} else {
$this->addFlash('danger', 'Aucun fichier trouvé pour cette prestation.');
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
} else {
$this->addFlash('danger', 'Aucun fichier à télécharger pour cette prestation.');
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
}
/**
* @Route("/download/getax/files/separated/{userFileId}/{userSurveyId}", name = "download_getax_files_separated")
*
* @return Response
*/
public function downloadGetaxFilesSeparated(Request $request, $userFileId, $userSurveyId)
{
$userFile = $this->em->getRepository(UserFile::class)->find($userFileId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
if (!$userFile) {
throw new NotFoundHttpException();
}
$userFileDocuments = $userFile->getValidatedDocuments();
if (!$userFileDocuments->isEmpty()) {
$files_to_merge = [];
$path = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurvey->getId() . '/';
foreach ($userFileDocuments as $userFileDocument) {
$filename = $userFileDocument->getFileName();
if (!file_exists($path . $filename)) {
$this->addFlash('danger', 'Fichier Introuvable : ' . $filename);
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
$path_parts = pathinfo($filename);
if ('pdf' !== strtolower($path_parts['extension'])) {
$this->addFlash('danger', 'Fichier non PDF : ' . $filename);
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
if ($userFileDocument->hasDocumentTagByCode('CODE_DECLA')) {
continue;
}
$files_to_merge[] = $filename;
}
if (!empty($files_to_merge)) {
$outputName = $this->pdfService->clean((!$this->getUser() instanceof User ? 'undefined User' : strtoupper((string)$userSurvey->getUser()->getLastname()) . '-' . ucfirst((string)$userSurvey->getUser()->getName())) . '-Getax' . date('Y', strtotime('-1 year')));
$zip = new \ZipArchive();
$zipName = $this->getParameter('webdir') . '/uploads/files/' . $outputName . '.zip';
$zip->open($zipName, \ZipArchive::CREATE);
foreach ($files_to_merge as $i => $mergedFile) {
$zip->addFile($path . $mergedFile, $i . '.' . $mergedFile);
}
$zip->close();
$response = new Response(file_get_contents($zipName));
$response->headers->set('Content-Type', 'application/zip');
$response->headers->set('Content-Disposition', 'attachment;filename="' . $outputName . '.zip"');
$response->headers->set('Content-length', filesize($zipName));
@unlink($zipName);
return $response;
} else {
$this->addFlash('danger', 'Aucun fichier trouvé pour cette prestation.');
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
} else {
$this->addFlash('danger', 'Aucun fichier à télécharger pour cette prestation.');
return $this->redirectToRoute('admin_getax_informations_summary', ['userSurveyId' => $userSurveyId, 'userFileId' => $userFileId]);
}
}
/**
* @Route("/ajax/keep/pdf/pages/{userFileDocumentId}/{userSurveyId}", name = "ajax_keep_pdf_pages")
*
* @return Response
*/
public function ajaxKeepPDFPages(Request $request, $userFileDocumentId, $userSurveyId)
{
$hasError = false;
// trying to get the userfiledocument
$userFileDocument = $this->em->getRepository(UserFileDocument::class)->find($userFileDocumentId);
if (!$userFileDocument) {
return new JsonResponse(['result' => false, 'msg' => 'Mauvais id']);
}
// fichier
$path = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurveyId . '/';
$filename = $userFileDocument->getFilename();
if (!file_exists($path . $filename)) {
return new JsonResponse(['result' => false, 'msg' => 'Fichier non trouvé']);
}
// getting the page count
try {
$count = $this->pdfService->countPDFPages($path . $filename);
} catch (\Exception $e) {
return new JsonResponse(['result' => false, 'msg' => $e->getMessage()]);
}
$pageForm = $this->createPdfPageForm(
$this->generateUrl('admin_ajax_keep_pdf_pages', ['userFileDocumentId' => $userFileDocumentId, 'userSurveyId' => $userSurveyId]),
$count
);
// handle form then redirect to base_url
$pageForm->handleRequest($request);
if ($pageForm->isSubmitted()) {
$formData = $pageForm->getData();
$source = $request->get('source_url');
if ($pageForm->isValid()) {
// getting form data
$formData = $pageForm->getData();
$pages = [];
foreach ($formData as $page => $data) {
if (true === $data) {
$pages[] = (int)str_replace('page', '', $page);
}
}
if (!empty($pages)) {
$result = $this->pdfService->keepPages($path, $filename, $pages);
if (true === $result['result']) {
$newUfd = clone $userFileDocument;
$newUfd->setFilename($result['outputFileName']);
$newUfd->setIsSlice(true);
$userFileDocument->setIsArchived(true);
foreach ($userFileDocument->getTags() as $tag) {
$newUfd->addTag($tag);
}
$this->em->persist($userFileDocument);
$this->em->persist($newUfd);
$this->em->flush();
if (str_contains($source, $userFileDocument->getId())) {
$source = str_replace($userFileDocument->getId(), $newUfd->getId(), $source);
}
} else {
$this->addFlash('danger', "Problème lors de l'appel a ILovePDF : " . $result['msg']);
}
}
} else {
$this->addFlash('danger', "Le formulaire n'est pas valide : " . $pageForm->getErrors());
}
return $this->redirect($source);
}
return new JsonResponse($this->renderView(
'admin/userFileDocument/modal_delete_pdf_pages.html.twig',
[
'form' => $pageForm->createView(),
'hasError' => $hasError,
'pageCount' => $count,
]
));
}
private function createPdfPageForm($action, $count)
{
// create form
$pageForm = $this->createFormBuilder(null, [
'action' => $action,
'attr' => [
'class' => 'form-inline',
],
]);
foreach (range(1, $count) as $i) {
$pageForm->add('page' . $i, CheckboxType::class, [
'required' => false,
'data' => true,
'attr' => [
'class' => 'form-inline check-this ms-0',
],
'label_attr' => [
'class' => 'checkbox-inline',
],
'row_attr' => [
'class' => 'col-4 ps-0',
],
]);
}
$pageForm->add('submit', SubmitType::class, [
'label' => 'Garder ces pages',
'attr' => [
'class' => 'form_submit btn btn-primary mt-4',
],
]);
$pageForm = $pageForm->getForm();
return $pageForm;
}
/**
* @Route("/convertImages/and/rename/files/{userSurveyId}", name = "convert_images_rename_files")
*
* @return Response
*/
public function convertImageAndRenameFiles(Request $request, $userSurveyId)
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$path = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurvey->getId() . '/';
$filesToConvert = [];
$renamed = [];
$error = false;
$uf = $userSurvey->getUserFile();
if (!is_null($uf) && is_dir($path)) {
foreach ($uf->getNotArchivedDocuments() as $ufd) {
// rename bad named files
if (is_null($ufd->getFilename())) {
continue;
}
$filename = $ufd->getFilename();
if (!file_exists($path . $filename)) {
$this->addFlash('danger', 'Fichier Introuvable : ' . $filename);
$error = true;
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
}
$basename = pathinfo($filename, PATHINFO_FILENAME);
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$newFilename = $this->pdfService->clean($basename) . '.' . $ext;
$ufd->setFilename($newFilename);
$this->em->persist($ufd);
copy($path . $filename, $path . $newFilename);
$renamed[] = $ufd;
if ($this->pdfService->isImage($path, $newFilename)) {
$filesToConvert[] = $ufd;
}
}
// saving new filenames
$this->em->flush();
// check if renamed files are ok.
foreach ($renamed as $re) {
if (!file_exists($path . $re->getFileName())) {
$error = true;
$this->addFlash('danger', 'problème lors du renomage : fichier non trouvé !(' . $re->getId() . ')');
}
}
if (!empty($filesToConvert)) {
foreach ($filesToConvert as $ufd) {
$result = $this->pdfService->imageToPdf($path, $ufd->getFileName());
if (true === $result['result']) {
// save new pdfs
$newUfd = clone $ufd;
$newUfd->setFilename($result['outputFileName']);
$ufd->setIsArchived(true);
foreach ($ufd->getTags() as $tag) {
$newUfd->addTag($tag);
}
$this->em->persist($ufd);
$this->em->persist($newUfd);
$this->em->flush();
} else {
$error = true;
$this->addFlash('danger', "Problème lors de l'appel a ILovePDF : " . $result['msg']);
}
}
}
}
if (!$error) {
$this->addFlash('success', 'Fichiers Réparés');
}
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
}
/**
* @Route("/ajax/createUserSurveyComment/{userSurveyId}", name = "ajax_create_usersurveycomment")
*/
public function ajaxCreateUserSurveyComment(Request $request, $userSurveyId)
{
$hasError = false;
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$userSurveyComment = new UserSurveyComment();
$userSurveyComment->setUser($this->getUser());
$userSurveyComment->setUserSurvey($userSurvey);
$userSurveyCommentForm = $this->createForm(
UserSurveyCommentType::class,
$userSurveyComment,
[
'action' => $this->generateUrl('admin_ajax_create_usersurveycomment', ['userSurveyId' => $userSurveyId]),
]
);
$userSurveyCommentForm->handleRequest($request);
if ($userSurveyCommentForm->isSubmitted()) {
if ($userSurveyCommentForm->isValid()) {
$userSurveyComment = $userSurveyCommentForm->getData();
$this->em->persist($userSurveyComment);
$this->em->flush();
$this->addFlash('success', 'Commentaire ajouté');
} else {
$hasError = true;
$this->addFlash('danger', "le commentaire n'as pas été ajouté");
}
$source = $request->get('source_url');
return $this->redirect($source);
}
return new JsonResponse($this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
'userSurveyCommentForm' => $userSurveyCommentForm->createView(),
'hasError' => $hasError,
]));
}
/**
* @Route("/ajax/editUserSurveyComment/{userSurveyCommentId}", name = "ajax_edit_usersurveycomment")
*/
public function ajaxEditUserSurveyComment(Request $request, $userSurveyCommentId)
{
$hasError = false;
$userSurveyComment = $this->em->getRepository(UserSurveyComment::class)->find($userSurveyCommentId);
if (!$userSurveyComment) {
throw new NotFoundHttpException();
}
$userSurveyCommentForm = $this->createForm(
UserSurveyCommentType::class,
$userSurveyComment,
[
'action' => $this->generateUrl('admin_ajax_edit_usersurveycomment', ['userSurveyCommentId' => $userSurveyCommentId]),
]
);
$userSurveyCommentForm->handleRequest($request);
if ($userSurveyCommentForm->isSubmitted()) {
if ($userSurveyCommentForm->isValid()) {
$userSurveyComment = $userSurveyCommentForm->getData();
$userSurveyComment->setDateUpdate(new DateTime());
$this->em->persist($userSurveyComment);
$this->em->flush();
$this->addFlash('success', 'Commentaire modifié');
} else {
$hasError = true;
$this->addFlash('danger', "le commentaire n'as pas été modifié");
}
$source = $request->get('source_url');
return $this->redirect($source);
}
return new JsonResponse($this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
'userSurveyCommentForm' => $userSurveyCommentForm->createView(),
'hasError' => $hasError,
]));
}
/**
* @Route("/ajax/deleteUserSurveyComment/{userSurveyCommentId}", name = "ajax_delete_usersurveycomment")
*
* @param Request $request
*
* @return JsonResponse
*/
public function ajaxDeleteUserSurveyComment($userSurveyCommentId)
{
$userSurveyComment = $this->em->getRepository(UserSurveyComment::class)->find($userSurveyCommentId);
$userSurveyComment->setIsArchived(true);
$this->em->persist($userSurveyComment);
$this->em->flush();
$this->addFlash('success', 'Commentaire supprimé');
return new JsonResponse(true);
}
/**
* @Route("/ajax/replyUserSurveyComment/{replyToId}", name = "ajax_reply_usersurveycomment")
*/
public function ajaxReplyUserSurveyComment(Request $request, $replyToId)
{
$hasError = false;
$originalComment = $this->em->getRepository(UserSurveyComment::class)->find($replyToId);
if (!$originalComment) {
throw new NotFoundHttpException();
}
$userSurveyComment = new UserSurveyComment();
$userSurveyComment->setUser($this->getUser());
$userSurveyComment->setUserSurvey($originalComment->getUserSurvey());
$userSurveyComment->setReplyTo($originalComment);
$userSurveyCommentForm = $this->createForm(
UserSurveyCommentType::class,
$userSurveyComment,
[
'action' => $this->generateUrl('admin_ajax_reply_usersurveycomment', ['replyToId' => $replyToId]),
]
);
$userSurveyCommentForm->handleRequest($request);
if ($userSurveyCommentForm->isSubmitted()) {
if ($userSurveyCommentForm->isValid()) {
$userSurveyComment = $userSurveyCommentForm->getData();
$this->em->persist($userSurveyComment);
$this->em->flush();
$this->addFlash('success', 'Commentaire ajouté');
} else {
$hasError = true;
$this->addFlash('danger', "le commentaire n'as pas été enregistré");
}
$source = $request->get('source_url');
return $this->redirect($source);
}
return new JsonResponse($this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
'userSurveyCommentForm' => $userSurveyCommentForm->createView(),
'hasError' => $hasError,
]));
}
/**
* @Route("/ajax/datelimit/{userSurveyId}",name = "ajax_date_limit")
*/
public function ajaxUserSurveyDateLimit(Request $request, $userSurveyId)
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$oldDateLimit = $userSurvey->getDateLimit();
$form = $this->createForm(UserSurveyDateLimitType::class, $userSurvey, [
'action' => $this->generateUrl('admin_ajax_date_limit', [
'userSurveyId' => $userSurveyId,
]),
]);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$userSurvey = $form->getData();
$sendMail = $form->get('sendMail')->getData();
$this->em->persist($userSurvey);
$this->em->flush();
$this->addFlash('success', 'informations sauvegardées');
if ($sendMail && $oldDateLimit != $userSurvey->getDateLimit()) {
$this->emailService->sendDateLimitUpdate($userSurvey);
}
}
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
}
return new JsonResponse($this->renderView('admin/modals/userSurveyDateLimitModal.html.twig', [
'form' => $form->createView(),
]));
}
/**
* @Route("/paid/on/bexio/{userSurveyId}",name = "paid_on_bexio")
*/
public function paidOnBexio($userSurveyId)
{
// Petit bouton pour patrice.
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$userSurvey->setPaymentStatus('payedout');
$this->em->persist($userSurvey);
$this->em->flush();
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
}
/**
* @Route("/save/pdf/renovation/{userFilePropertyId}/{userSurveyId}",name = "generate_pdf_renovation")
*/
public function generateRenovationPdf($userFilePropertyId, $userSurveyId)
{
$userFileProperty = $this->em->getRepository(UserFileProperty::class)->find($userFilePropertyId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userFileProperty || !$userSurvey) {
throw new NotFoundHttpException();
}
$userFile = $userFileProperty->getUserFile();
if (!$userFileProperty->getRenovations()->isEmpty()) {
$url = $this->generateUrl('print_renovation_table', ['userFilePropertyId' => $userFilePropertyId, 'surveyId' => $userSurvey->getSurvey()->getId()], UrlGeneratorInterface::ABSOLUTE_URL);
$path = $this->getParameter('webdir') . '/uploads/files/documents/' . $userSurvey->getId() . '/';
$outputFileName = $userFileProperty->getFullAddress() . ' Rénovations';
$result = $this->pdfService->generateRenovationTablePdf($path, $url, $outputFileName);
if ($result['result']) {
$pdf = $result['outputFileName'];
$doc = $this->em->getRepository(Document::class)->findOneBy(['code' => 'TABL_TRAV']);
$documentTag = $userFile->getTag($doc);
$propertyTag = $userFileProperty->getEntityTypeTag();
if (is_null($documentTag)) {
$documentTag = new DocumentTypeTag();
$documentTag->setUserFile($userFile);
$documentTag->setDocument($doc);
$this->em->persist($documentTag);
}
if (is_null($propertyTag)) {
$propertyTag = new EntityTypeTag();
$propertyTag->setUserFileProperty($userFileProperty);
$propertyTag->setUserFile($userFile);
$this->em->persist($propertyTag);
}
$userFileDocument = new UserFileDocument($pdf);
$userFileDocument->addTag($documentTag);
$userFileDocument->addTag($propertyTag);
$userFileDocument->setUserFile($userFile);
$this->em->persist($userFileDocument);
$this->em->flush();
} else {
$this->addFlash('danger', "Problème lors de l'appel a ILovePDF : " . $result['msg']);
}
} else {
$this->addFlash('danger', 'Pas de rénovations dans la propriété');
}
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurvey->getId()]);
}
/**
* @Route("/document/edit/tags/{userSurveyId}/{userFileDocumentId}",name="document_edit_tags")
*/
public function documentEditTags(Request $request, int $userSurveyId, int $userFileDocumentId): Response
{
$userFileDocument = $this->em->getRepository(UserFileDocument::class)->find($userFileDocumentId);
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey || !$userFileDocument) {
throw new NotFoundHttpException();
}
$userFile = $userSurvey->getUserFile();
$this->userSurveyService->updateDocumentTags($userFile, $userSurvey);
$this->userSurveyService->updateUserFileEntityTags($userFile);
$this->em->persist($userFile);
$this->em->flush();
$tagsForm = $this->createForm(UserFileDocumentTagsType::class, $userFileDocument, [
'action' => $this->generateUrl('admin_document_edit_tags', ['userFileDocumentId' => $userFileDocumentId, 'userSurveyId' => $userSurveyId]),
]);
$tagsForm->handleRequest($request);
if ($tagsForm->isSubmitted()) {
if ($tagsForm->isValid()) {
$userFileDocument = $tagsForm->getData();
// get data from the 'documentTags' field
$documentTypeTags = $tagsForm->get('documentTypeTags')->getData();
$entityTypeTags = $tagsForm->get('entityTypeTags')->getData();
$userFileDocument->removeTags();
// handle the $documentTags data manually
// for example, find the Tag entities and add them to the UserFileDocument entity
foreach (explode(',', $documentTypeTags) as $tagData) {
// assuming $tagData contains the ID of a Tag entity
$tag = $this->em->getRepository(Tag::class)->find($tagData);
if ($tag) {
$userFileDocument->addTag($tag);
}
}
foreach (explode(',', $entityTypeTags) as $tagData) {
// assuming $tagData contains the ID of a Tag entity
$tag = $this->em->getRepository(Tag::class)->find($tagData);
if ($tag) {
$userFileDocument->addTag($tag);
}
}
$this->em->persist($userFileDocument);
$this->em->flush();
} else {
$errorStr = '';
foreach ($tagsForm->getErrors(true) as $error) {
$errorStr .= $error->getMessage();
}
$this->addFlash('danger', $errorStr);
}
$source = $request->get('source_url');
if ($source) {
return $this->redirect($source);
} else {
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
}
}
return new JsonResponse($this->renderView('admin/modals/modalUserFileDocumentTags.html.twig', [
'form' => $tagsForm->createView(),
]));
}
/**
* @Route("/test/mail/{userSurveyId}",name = "test_mail")
*/
public function renderMailTest($userSurveyId)
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$userFile = $userSurvey->getUserFile();
return $this->render('email/userSurvey/statusChange/CMU/PROCESSING_FILES_POSTED_CMU.html.twig', [
'userSurvey' => $userSurvey,
]);
}
private function array_diff_recursive($array1, $array2)
{
$difference = [];
foreach ($array1 as $key => $value) {
if (is_array($value)) {
if (!isset($array2[$key]) || !is_array($array2[$key])) {
$difference[$key] = $value;
} else {
$new_diff = $this->array_diff_recursive($value, $array2[$key]);
if (!empty($new_diff)) {
$difference[$key] = $new_diff;
}
}
} elseif (!array_key_exists($key, $array2) || $array2[$key] !== $value) {
$difference[$key] = $value;
}
}
return $difference;
}
/**
* @Route("/ajax/cmu/invalidCredential/{userSurveyId}", name = "ajax_cmu_invalid_credential")
*
* @param $userSurveyId
*/
public function ajaxCmuInvalidCredential(Request $request, $userSurveyId): RedirectResponse|JsonResponse
{
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
if (!$userSurvey) {
throw new NotFoundHttpException();
}
$owner = null;
if ($userSurvey->getUserFile()) {
$owner = $userSurvey->getUserFile()->getOwner();
}
if (!$owner) {
throw new NotFoundHttpException();
}
$invalidCredentialForm = $this->createForm(
UserFilePersonInvalidCredentialType::class,
$owner,
[
'action' => $this->generateUrl('admin_ajax_cmu_invalid_credential', ['userSurveyId' => $userSurveyId]),
]
);
$invalidCredentialForm->handleRequest($request);
if ($invalidCredentialForm->isSubmitted()) {
if ($invalidCredentialForm->isValid()) {
$sendMail = $invalidCredentialForm->get('sendMail')->getData();
$owner = $invalidCredentialForm->getData();
$this->em->persist($owner);
$this->em->flush();
if (false === $owner->isHasValidFinanceCredentials()) {
$login = $owner->getAnswerObject('fisc_num');
$password = $owner->getAnswerObject('fisc_password');
if (!is_null($login)) {
$owner->removeUserFileAnswer($login);
$this->em->remove($login);
}
if (!is_null($password)) {
$owner->removeUserFileAnswer($password);
$this->em->remove($password);
}
$this->em->flush();
}
if (false === $owner->isHasValidUrssafCredentials()) {
$login = $owner->getAnswerObject('login_urssaf');
$password = $owner->getAnswerObject('pasword_urssaf');
if (!is_null($login)) {
$owner->removeUserFileAnswer($login);
$this->em->remove($login);
}
if (!is_null($password)) {
$owner->removeUserFileAnswer($password);
$this->em->remove($password);
}
$this->em->flush();
}
if (false === $owner->isHasValidPartnerUrssafCredentials()) {
$login = $owner->getAnswerObject('login_ursaf_conjoint');
$password = $owner->getAnswerObject('password_urssaf_conjoint');
if (!is_null($login)) {
$owner->removeUserFileAnswer($login);
$this->em->remove($login);
}
if (!is_null($password)) {
$owner->removeUserFileAnswer($password);
$this->em->remove($password);
}
$this->em->flush();
}
if (false === $owner->isHasValidFinanceCredentials() ||
false === $owner->isHasValidUrssafCredentials() ||
false === $owner->isHasValidPartnerUrssafCredentials()
) {
$status = $this->em->getRepository(UserSurveyStatus::class)->findOneBy(['code' => 'PROCESSING_FILES_MISSING']);
$userSurvey->setUserSurveyStatus($status);
$this->em->persist($userSurvey);
$this->em->flush();
}
if ($sendMail) {
$this->emailService->sendUserSurveyStatusChange($userSurvey);
}
$this->addFlash('success', 'Identifiants invalide sauvegardés');
} else {
$this->addFlash('danger', 'Identifiants invalide non sauvegardés');
}
$source = $request->get('source_url');
return $this->redirect($source);
}
return new JsonResponse($this->renderView('admin/modals/modal_create_edit_comment.html.twig', [
'userSurveyCommentForm' => $invalidCredentialForm->createView(),
]));
}
/**
* @Route("/badPayer/change/{userId}", name = "bad_payer_change")
*/
public function badPayerChange($userId)
{
$user = $this->em->getRepository(User::class)->find($userId);
if (!$user) {
throw new NotFoundHttpException();
}
if ($user->isBadPayer() === true) {
$user->setBadPayer(false);
} else {
$user->setBadPayer(true);
}
$this->em->persist($user);
$this->em->flush();
return $this->redirectToRoute('admin_customer_summary_index', ['userId' => $userId]);
}
/**
* @Route("/generate/rs/pdf/{userSurveyId}/{test}", name = "generate_rs_pdf")
*/
public function generateRsPDF($userSurveyId, $test)
{
if ($test == 1) {
$test = true;
} else {
$test = false;
}
$userSurvey = $this->em->getRepository(UserSurvey::class)->find($userSurveyId);
$pdfContent = $this->rsPdfService->generatePdf($userSurvey, $test);
if (!$pdfContent) {
return $this->redirectToRoute('admin_usersurvey_display', ['id' => $userSurveyId]);
}
return new Response($pdfContent, 200, [
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="impression_RS.pdf"'
]);
}
}