<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Media;
use App\Entity\Document;
use App\Entity\DocumentService;
use App\Entity\RefRole;
use App\Entity\RFederation;
use App\Entity\RefAffectation;
use App\Entity\RefFederation;
use App\Entity\UtilisateurInformation;
use Doctrine\Persistence\ManagerRegistry;
class DocServiceController extends AbstractController
{
private $doctrine;
public function __construct(ManagerRegistry $doctrine)
{
$this->doctrine = $doctrine;
}
#[Route(path: '/api/New_doc_serv', name: 'ctsweb_doc_serv')]
public function New(Request $request)
{
$type = null;
$data = json_decode($request->getContent(), true, 512, JSON_THROW_ON_ERROR);
$em = $this->doctrine->getManager();
$request->request->replace(is_array($data) ? $data : []);
try {
$doc = new DocumentService();
$em = $this->doctrine->getManager();
$idRole = $this->getUser()->getUtilisateur()->getIdRole();
$params = $request->request->all();
$user = $this->getUser();
$R_User = $user->getUtilisateur()->getIdRole();
//Admin, DS
if ($R_User == RefRole::ROLE_DS_ADMIN || $R_User == RefRole::ROLE_DS_SIGNATAIRE || $R_User == RefRole::ROLE_DS_INVITE) {
$type = 'DS';
$id_aff = $params['idAffectation'];
$id_f = $params['idFederation'];
$region = $em->getRepository(RefAffectation::class)->findOneBy(['idAffectation' => $id_aff]);
$Federation = $em->getRepository(RefFederation::class)->findOneBy(['idFederation' => $id_f]);
$doc->setIdAffectation($region);
$doc->setIdFederation($Federation);
} //DR
elseif ($R_User == RefRole::ROLE_DR || $R_User == RefRole::ROLE_DR_SIGNATAIRE) {
$type = 'DR';
$doc->setIdAffectation($user->getIdAffectation());
} //fédérateur(DTN)
elseif ($R_User == RefRole::ROLE_FEDE || $R_User == RefRole::ROLE_FEDE_INVITE) {
$type = 'FD';
$doc->setIdFederation($user->getIdFederation());
} //CTS
elseif ($R_User == RefRole::ROLE_CTS) {
return new RedirectResponse($this->generateUrl('ctsweb_doc_serv'));
}
$doc->setText($params['texte']);
$doc->setTypeText($type);
$em->persist($doc);
if (isset($params['formDataFiles']) && $params['formDataFiles'] != '') {
$this->saveMedias($doc, $params['formDataFiles']);
}
$em->flush();
$messageRetour = "DocumentService créé";
$data = ['success' => true, 'data' => $messageRetour];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
#[Route(path: '/api/Edit_doc_serv/{id}', name: 'ctsweb_doc_serv_edit')]
public function Edit(): \Symfony\Component\HttpFoundation\Response
{
return $this->render(
'DocServiceController/edit.html.twig',
[]
);
}
#[Route(path: '/api/getCorrespondants', name: 'ctsweb_doc_serv_load')]
public function getCorrespondants()
{
$em = $this->doctrine->getManager();
$user = $this->getUser();
$Correspondants = [];
$R_User = $user->getUtilisateur()->getIdRole();
try {
$repository = $em->getRepository(Document::class);
$repo = $repository->getCorrespondants($user->getUtilisateur(), $user);
foreach ($repo as $Correspondant) {
$utilisateurInformation = $em->getRepository(UtilisateurInformation::class)->findOneBy(['idUtilisateur' => $Correspondant['id_utilisateur']]);
$idPoste = $utilisateurInformation->getIdPoste();
$poste = !is_null($idPoste) ? ['id' => $idPoste->getIdPoste(), 'libelle' => $idPoste->getLibellePoste()] : null;
if ($utilisateurInformation->getIdFederation()) {
$r_f = $em->getRepository(RFederation::class)->findOneBy(['rAdmDiside' => $utilisateurInformation->getIdFederation()->getRAdmDiside()]);
}
if ($R_User == RefRole::ROLE_DS_ADMIN || $R_User == RefRole::ROLE_DS_SIGNATAIRE || $R_User == RefRole::ROLE_DS_INVITE) {
// Les profils administrateur et DS doivent voir tous les documents mis en ligne par toutes les DR et par toutes les fédérations(vue de tous les documents du site)
$tab_profil = [RefRole::ROLE_DS_ADMIN, RefRole::ROLE_CTS, RefRole::ROLE_DS_INVITE, RefRole::ROLE_DR, RefRole::ROLE_FEDE, RefRole::ROLE_FEDE_INVITE, RefRole::ROLE_DS_SIGNATAIRE, RefRole::ROLE_DR_SIGNATAIRE, RefRole::ROLE_LECTEUR];
} elseif ($R_User == RefRole::ROLE_DR || $R_User == RefRole::ROLE_DR_SIGNATAIRE || $R_User == RefRole::ROLE_FEDE || $R_User == RefRole::ROLE_FEDE_INVITE) {
// les Profils DR doivent voir tous les documents mis en ligne par la DS et par toutes les fédérations quelles que soit les sélections d'affichage faites par ceux-ci.
// les profils DR et DR signataire doivent voir les correspondant de leur service
// les profils fédération doivent voir tous les documents mis en ligne par les toutes les DR et les DS mais pas ceux des autres fédérations.
$tab_profil = [RefRole::ROLE_DS_INVITE, RefRole::ROLE_DS_SIGNATAIRE, RefRole::ROLE_DR, RefRole::ROLE_DR_SIGNATAIRE, RefRole::ROLE_FEDE, RefRole::ROLE_FEDE_INVITE];
} elseif ($R_User == RefRole::ROLE_CTS) {
//les CTS voient les documents qui leur sont autorisés par la DS (selon sélection) et les documents de leur fédération et de leur DR
$tab_profil = [RefRole::ROLE_DS_INVITE, RefRole::ROLE_FEDE_INVITE, RefRole::ROLE_FEDE, RefRole::ROLE_DR, RefRole::ROLE_DR_SIGNATAIRE,RefRole::ROLE_DS_ADMIN,RefRole::ROLE_DS_SIGNATAIRE];
}
if (in_array($utilisateurInformation->getUtilisateur()->getRole()->getIdRole(), $tab_profil)) {
$Correspondants[] = ['idUtilisateur' => $utilisateurInformation->getIdUtilisateur(), 'civilite' => $utilisateurInformation->getCivilite(), 'nom' => $utilisateurInformation->getNom(), 'prenom' => $utilisateurInformation->getPrenom(), 'birthday' => $utilisateurInformation->getDateDeNaissance()->format('d/m/Y'), 'adresse' => $utilisateurInformation->getAdresse(), 'couriel' => $utilisateurInformation->getUtilisateur()->getCourriel(), 'portable' => $utilisateurInformation->getUtilisateur()->getTelephonePortable(), 'telephone' => $utilisateurInformation->getUtilisateur()->getTelephoneBureau(), 'fonction' => $utilisateurInformation->getFonction(), 'poste' => $poste, 'profil' => ['id' => $utilisateurInformation->getUtilisateur()->getRole()->getIdRole(), 'libelle' => $utilisateurInformation->getUtilisateur()->getRole()->getLibelleRole()], 'affectation' => $utilisateurInformation->getIdAffectation() ? ['id' => $utilisateurInformation->getIdAffectation()->getIdAffectation(), 'libelle' => $utilisateurInformation->getIdAffectation()->getLibelleAffectation()] : '', 'supHierarchique' => $utilisateurInformation->getUtilisateur()->getflSuperieurHierarchique(), 'federation' => $utilisateurInformation->getIdFederation() ? ['id' => $utilisateurInformation->getIdFederation()->getIdFederation(), 'libelle' => $r_f->getRSerLibl()] : ''];
}
}
$data = ['success' => true, 'data' => $Correspondants];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
/**
* Deletes a Docservice entity.
*/
#[Route(path: '/api/delete_doc_serv/{id}', name: 'ctsweb_doc_serv_delete')]
public function delete($id)
{
$role = $this->getUser()->getUtilisateur()->getIdRole();
if (RefRole::ROLE_CTS == $role) {
return new JsonResponse(null, JsonResponse::HTTP_BAD_REQUEST);
}
$em = $this->doctrine->getManager();
$doc = $em->getRepository(DocumentService::class)->findOneBy(['id' => $id]);
try {
$em->remove($doc);
$em->flush();
$data = ['success' => true, 'data' => 'Document supprimé'];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
#[Route(path: '/api/getDocuments', name: 'ctsweb_text_serv_load')]
public function getDocuments()
{
$em = $this->doctrine->getManager();
$user = $this->getUser();
$textes = [];
try {
$repository = $this->doctrine->getRepository(DocumentService::class);
$repo = $repository->gettextes_DocServ($user->getUtilisateur(), $user);
foreach ($repo as $Documentservice) {
if (isset($Documentservice['id'])) {
$DS = $repository->findOneBy(['id' => $Documentservice['id']]);
if ($DS->getIdFederation()) {
$r_f = $em->getRepository(RFederation::class)->findOneBy(['rAdmDiside' => $DS->getIdFederation()->getRAdmDiside()]);
}
$formDataFiles = [];
$medias = $DS->getMedias();
// var_dump($DS->getMedias());
if ($medias instanceof \Doctrine\ORM\PersistentCollection) {
$formDataFiles = $medias->toArray();
}
if (isset($formDataFiles[0]) && $formDataFiles[0]->getPath()) {
$textes[] = [
'id' => $DS->getId(),
'type' => $DS->getTypeText(),
'texte' => $DS->getText(),
'affectation' => $DS->getIdAffectation() ? ['id' => $DS->getIdAffectation()->getIdAffectation(), 'libelle' => $DS->getIdAffectation()->getLibelleAffectation()] : '',
'federation' => $DS->getIdFederation() ? ['id' => $DS->getIdFederation()->getIdFederation(), 'libelle' => $r_f->getRSerLibl()] : '',
'formDataFiles' => $this->explodeMedias($formDataFiles),
'dateUpdate' => $DS->getUpdated(),
];
}
}
}
$data = ['success' => true, 'data' => $textes];
} catch (\Exception $e) {
$data = ['success' => false, 'data' => $e->getMessage()];
}
return new JsonResponse($data);
}
private function explodeMedias($medias)
{
$dir = $this->getParameter('dir_file_media');
$dataMedias = [];
if (!empty($medias)) {
foreach ($medias as $media) {
$validMedia = $this->isValidateMedia($media);
if ($validMedia) {
$dataMedias[] = ['urlFile' => $dir . $media->getPath(), 'idUpload' => $media->getId(), 'filename' => $media->getName()];
}
}
}
return $dataMedias;
}
private function isValidateMedia($media)
{
$validExtension = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'jpg', 'jpeg', 'png'];
$pathinfo = $media ? pathinfo((string) $media->getPath()) : null;
$extension = !is_null($pathinfo) ? $pathinfo['extension'] : '';
$validMedia = in_array($extension, $validExtension);
return $validMedia;
}
private function saveMedias($doc, $mediaIds)
{
$em = $this->doctrine->getManager();
$this->removesMedias(0);
$medias = json_decode((string) $mediaIds, null, 512, JSON_THROW_ON_ERROR);
if (!empty($medias)) {
foreach ($medias as $idMedia) {
$media = $em->getRepository(Media::class)->findOneById($idMedia);
if ($media instanceof Media) {
$media->setDocumentservice($doc);
$em->flush();
}
}
}
}
private function removesMedias($mediaIds)
{
$em = $this->doctrine->getManager();
$medias = is_numeric($mediaIds) ? [$mediaIds] : $mediaIds->toarray();
if (!empty($medias)) {
foreach ($medias as $media) {
if ($media instanceof Media) {
$em->remove($media);
$em->flush();
}
}
}
}
}