<?php
namespace App\Controller\Community\Noyau;
use App\Controller\Gestiform\AbstractGestiformController;
use App\Entity\Common\Document;
use App\Entity\Gestiform\Admin\ModelsDocument\Template;
use App\Entity\Gestiform\Formations\Dossier\Dossier;
use App\Entity\Gestiform\MyCommunity\Section;
use App\Entity\Gestiform\Users\User;
use App\Enums\DirectoriesEnum;
use App\Service\Admin\MasterlistelgService;
use App\Service\Admin\TemplateService;
use App\Service\Admin\Users\UserService;
use App\Service\Formations\Dossier\DossierService;
use App\Service\Misc\ModelDocumentService;
use App\Service\Misc\PermissionCheckerService;
use App\Service\MyCommunity\MenuService;
use App\Service\MyCommunity\PageService;
use App\Service\MyCommunity\SectionService;
use App\Service\Uploads\FileUploader;
use Doctrine\ORM\NonUniqueResultException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
#[Route(path: '', name: 'community_', host: '%community_domain%')]
class DefaultController extends AbstractGestiformController
{
public function __construct(
private readonly PermissionCheckerService $permissionCheckerService,
private readonly PageService $pageService,
private readonly UserService $userService,
private readonly MenuService $menuService,
private readonly MasterlistelgService $masterlistelgService,
private readonly DossierService $dossierService,
private readonly ModelDocumentService $modelDocumentService,
private readonly SectionService $sectionService,
private readonly TemplateService $templateService,
private readonly FileUploader $fileUploader,
)
{
}
#[Route(path: '', name: 'homepage')]
#[Route(path: 'admincommunity/', name: '_homepage', host: '%gestiform_domain%')]
public function homepage(): Response
{
$user = $this->userService->getRepository()->find($this->getConnectedUser()?->getId());
$type = $this->userService->getTypeUser($user);
if ($type !== 'employe') {
return $this->redirectToRoute("community_view_page", ["pathPage" => "espace-" . $type]);
}
return $this->redirectToRoute("community_auth_login");
}
/**
*
* @param User $user
* @return Response
* @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
*/
#[Route(path: '/impersonate/{id}', name: 'impersonate')]
public function impersonate(User $user): Response
{
if (!$user) {
throw $this->createNotFoundException('User not found');
}
// Generate the impersonation link
$link = $this->generateUrl('gestiform_formations_default', ['_switch_user' => $user->getEmail()]);
return $this->redirect($link);
}
#[Route(path: '/{id}/signer-user', name: 'signer_user', methods: ['POST'])]
public function signerUser(User $user, Request $request): Response
{
$signatureFile = $request->files->get('signature');
if ($signatureFile) {
$user->setSignatureFile($this->fileUploader->upload($signatureFile, DirectoriesEnum::SIGNATURE));
$this->userService->flush();
return $this->json(['vueData' => ['signatureFile' => $user->getSignatureFile()?->getPath() ?? ""],
]);
}
return $this->json(["error" => true], 500);
}
#[Route(path: '/switch/{dossier}', name: 'switch')]
public function switchDossier(Dossier $dossier): Response
{
$user = $this->userService->getRepository()->find($this->getConnectedUser()->getId());
$user->setDossierActif($dossier);
$this->dossierService->flush();
return $this->redirectToRoute("community_view_page", ["pathPage" => "espace-" . $dossier->getTypeActif()->getCode()]);
}
#[Route(path: '/{pathPage}/{value}', name: 'view_page')]
public function viewPage(string $pathPage, $value = null): Response
{
$user = $this->userService->getRepository()->find($this->getConnectedUser()->getId());
$this->permissionCheckerService->checkmycommunityAccess();
$vars['pathPage'] = $pathPage;
$page = $this->pageService->getRepository()->findOneBy(array('path' => $pathPage));
$vars['pages'] = $page;
$vars['pageSections'] = $page ? $this->sectionService->getPageSectionsOrdre($page) : "test";//$page->getPageSections()->toArray() : "test";
$vars['pageTile'] = $page ? $page->getPageSections()->first() : "test";
$vars['value'] = $value;
$type = $this->userService->getTypeUser($user);
$vars = $this->pageService->getDocumentsAndDossierForPage($type, $user, $vars);
$modeles = $this->templateService->getModelsToSign($user, $type,false);
$vars['user'] = $user;
$vars['type'] = $type;
$vars['modeles'] = $modeles;
return $this->render('community/noyau/menu/page.html.twig', $vars);
}
/**
* @throws NonUniqueResultException
*/
#[Route(path: '/menu', name: 'menu_page')]
public function menuContent(): Response
{
$user = $this->userService->getRepository()->find($this->getConnectedUser()->getId());
$type = $this->userService->getTypeUser($user);
$diffusion = $this->masterlistelgService->
getRepository()->getOneByListeCode('CMS', 'DIFFUSIONS', $type);
$menu = $this->menuService->getRepository()->findOneBy(["diffusion" => $diffusion]);
$liste = $menu->getMenuPages()->toArray();
usort($liste, function ($a, $b) {
return $a->getOrdre() <=> $b->getOrdre();
});
$vars['menuPages'] = $liste;
$vars['user'] = $user;
$vars['type'] = $type;
return $this->render('community/noyau/menu/menu.html.twig', $vars);
}
public function staticSection(Section $section): Response
{
$user = $this->userService->getRepository()->find($this->getConnectedUser()->getId());
$type = $this->userService->getTypeUser($user);
$content = $section->getContent();
if ($type == "stagiaire" || $type == "candidat") {
$dossier = $user->getDossierActif();
$data = ['dossier' => $dossier, 'societe' => $dossier->getSociete()];
$content = $this->modelDocumentService->generateSection($section, $data);
}
return $this->render("community/community_pages/static/section.html.twig", [
"content" => $content,
"section" => $section,
]);
}
/**
* @throws SyntaxError
* @throws RuntimeError
* @throws LoaderError
*/
public function documentSignierSection(array $modeles): Response
{
$user = $this->userService->getRepository()->find($this->getConnectedUser()->getId());
$content = "";
$firstTemplate = reset($modeles);
if ($firstTemplate !== false) {
if (method_exists($user, 'getDossierActif') && $user->getDossierActif()) {
$dossier = $user->getDossierActif();
$data = ["dossier" => $dossier, "parcours" => $dossier->getParcours(), "personne" => $user
, 'societe' => $firstTemplate->getSociete()];
} else {
$data = ["formateur" => $user, "personne" => $user, 'societe' => $firstTemplate->getSociete()];
}
$generatecontent = $this->modelDocumentService->generate($firstTemplate, $data);
}
return $this->render("community/noyau/documents_a_signer/section.html.twig", [
'content' => $generatecontent['content'],
"vueData" => ["content" => $generatecontent['content']],
'template' => $firstTemplate,
'user' => $user
]);
}
#[Route(path: '/{id}/signer-document/{template}', name: 'signer_document', methods: ['POST'])]
public function signerDocument(User $user, Template $template, Request $request): Response
{
$signatureFile = $request->files->get('signature');
if (!$signatureFile) {
return $this->json(["error" => true, "message" => "No signature file provided"], 400);
}
$type = $this->userService->getTypeUser($user);
$typeSignature = $this->masterlistelgService->
getRepository()->getOneByListeCode('DOSSIER', 'DOCUMENT', "signature");
try {
$uploadedDocument = $this->fileUploader->upload($signatureFile, DirectoriesEnum::SIGNATURE);
$document = new Document();
$data=['dossier' =>$user->getDossierActif(), 'societe' => $template->getSociete(),'personne' => $user];
$document->setDocument($uploadedDocument)
->setTypeDocument($typeSignature)
->setTemplate($template);
if (method_exists($user, 'getDossierActif') && $user->getDossierActif()) {
$document->setDossier($user->getDossierActif());
$user->getDossierActif()->addDocument($document);
}
$user->addDocument($document);
$this->userService->persist($document);
$this->userService->flush();
$redirectUrl = $this->generateUrl("community_view_page", ["pathPage" => "espace-" . $type]);
return $this->json(["success" => true, "redirectUrl" => $redirectUrl]);
} catch (\Exception $e) {
return $this->json(["error" => true, "message" => $e->getMessage()], 500);
}
}
}