diff --git a/config/services.yaml b/config/services.yaml index c77d5e2..f77bd4b 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -5,6 +5,7 @@ # https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration parameters: app.jwtsecret : '%env(JWT_SECRET)%' + cv_directory: '%kernel.project_dir%/public/cv' services: # default configuration for services in *this* file _defaults: diff --git a/src/Controller/InternController.php b/src/Controller/InternController.php index 1d1db45..52d4de7 100644 --- a/src/Controller/InternController.php +++ b/src/Controller/InternController.php @@ -19,9 +19,12 @@ use App\Repository\InternSkillRepository; use App\Repository\SkillRepository; use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Component\DependencyInjection\Attribute\Autowire; +use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Validator\Constraints\File; #[Route('/intern')] final class InternController extends AbstractController @@ -70,6 +73,63 @@ final class InternController extends AbstractController ]); } + #[Route('/{id}/resume', name: 'app_intern_resume', methods: ['GET', 'POST'])] + public function addResume(Request $request, Intern $intern, EntityManagerInterface $entityManager, #[Autowire('%cv_directory%')] string $cvDirectory): Response + { + // Création d'un formulaire spécifique pour le CV plutôt que d'utiliser InternType entier + $form = $this->createFormBuilder($intern) + ->add('resume', FileType::class, [ + 'label' => 'CV : ', + 'mapped' => false, // Ne pas lier directement à l'entité + 'constraints' => [ + new File([ + 'maxSize' => '1024k', + 'mimeTypes' => [ + 'application/pdf', + 'application/x-pdf', + ], + 'mimeTypesMessage' => 'Merci de bien vouloir envoyer un fichier PDF valide.', + ]) + ], + ]) + ->getForm(); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $cvFile = $form->get('resume')->getData(); + + if ($cvFile) { + // Génération d'un nom de fichier unique + $newFilename = $intern->getId().'_'.date("d-m-Y").'_'.random_int(0,99999999).'.pdf'; + + // Déplacement vers le répertoire de stockage + $cvFile->move( + $cvDirectory, + $newFilename + ); + + if($intern->getResume() !== null){ + unlink($cvDirectory.'/'.$intern->getResume()); + } + + // Mise à jour de l'entité avec le nom du fichier + $intern->setResume($newFilename); + $intern->setResumeName($cvFile->getClientOriginalName()); // Conserver le nom original du fichier + } + + $entityManager->flush(); + + return $this->redirectToRoute('app_profile', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('intern/resume.html.twig', [ + 'intern' => $intern, + 'form' => $form->createView(), + ]); + } + + #[Route('/{id}', name: 'app_intern_delete', methods: ['POST'])] public function delete(Request $request, Intern $intern,): Response { diff --git a/src/Controller/ProfileController.php b/src/Controller/ProfileController.php index 3a14faa..b3211e1 100644 --- a/src/Controller/ProfileController.php +++ b/src/Controller/ProfileController.php @@ -24,8 +24,10 @@ class ProfileController extends AbstractController #[Route('/profile', name: 'app_profile')] public function profile(): Response { + // Charger l'utilisateur connecté $user = $this->getUser(); + // Vérifiez les rôles si nécessaire if (!$user) { throw $this->createAccessDeniedException('Vous devez être connecté pour accéder à cette page.'); } diff --git a/src/Entity/Intern.php b/src/Entity/Intern.php index 0aee08c..0482385 100644 --- a/src/Entity/Intern.php +++ b/src/Entity/Intern.php @@ -13,12 +13,15 @@ use App\Entity\Company; class Intern extends UserApp { - #[ORM\Column(type: Types::TEXT,nullable: true)] + #[ORM\Column(type: Types::TEXT, length: 255, nullable: true)] private ?string $coverLetter = null; - #[ORM\Column(length: 255,nullable: true)] + #[ORM\Column(type: Types::TEXT, length: 255, nullable: true)] private ?string $resume = null; + #[ORM\Column(type: Types::TEXT, length: 255, nullable: true)] + private ?string $resumeName = null; + /** * @var Collection */ @@ -75,6 +78,18 @@ class Intern extends UserApp return $this; } + public function getResumeName(): ?string + { + return $this->resumeName; + } + + public function setResumeName(string $resumeName): static + { + $this->resumeName = $resumeName; + + return $this; + } + /** * @return Collection */ diff --git a/src/Form/InternType.php b/src/Form/InternType.php index a2b7931..3e973c2 100644 --- a/src/Form/InternType.php +++ b/src/Form/InternType.php @@ -4,8 +4,11 @@ namespace App\Form; use App\Entity\Intern; use Symfony\Component\Form\AbstractType; +use Symfony\Component\Form\Extension\Core\Type\FileType; +use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Validator\Constraints\File; class InternType extends AbstractType { @@ -20,7 +23,9 @@ class InternType extends AbstractType ->add('tel') ->add('address') ->add('mail') - ->add('coverLetter') + ->add('coverLetter', TextareaType::class, [ + 'required' => false, + ]) ->add('resume') ; } diff --git a/templates/degree/index.html.twig b/templates/degree/index.html.twig index 0b309fd..b5b86e8 100644 --- a/templates/degree/index.html.twig +++ b/templates/degree/index.html.twig @@ -56,23 +56,11 @@ - {% if 'ROLE_INTERN' in app.user.roles %} -
- -
- - {% endif %} - - {% if 'ROLE_ADMIN' in app.user.roles %} - {% endif %} {% endblock %} diff --git a/templates/faq/index.html.twig b/templates/faq/index.html.twig index 50d60f1..3f3ee79 100644 --- a/templates/faq/index.html.twig +++ b/templates/faq/index.html.twig @@ -1,55 +1,25 @@ {% extends 'base.html.twig' %} -{% block title %}Liste des FAQs{% endblock %} +{% block title %}FAQ{% endblock %} {% block body %}
-

Liste des FAQs

+

FAQ

-
- - - - - - - - - - - {% for faq in faqs %} - - - - - - - {% endfor %} - -
QuestionRéponseDenrnière modifActions
{{ faq.question }}{{ faq.answer }}{{ faq.updateDate|date("d-m-y") }} - - Voir - - - - Modifier - - -
- - - -
-
+
+ {% for faq in faqs %} +
+

Question : {{ faq.question }}

+

Dernière modification : {{ faq.updateDate|date("d-m-y") }}

+

Réponse : {{ faq.answer }}

+
+
+ {% endfor %}
- -
{% endblock %} diff --git a/templates/intern/resume.html.twig b/templates/intern/resume.html.twig new file mode 100644 index 0000000..d8f2682 --- /dev/null +++ b/templates/intern/resume.html.twig @@ -0,0 +1,23 @@ +{% extends 'base.html.twig' %} + +{% block title %}Resume{% endblock %} + +{% block body %} +
+

Ajouter / Modifier le CV

+ +
+ {{ form_start(form, {'attr': {'enctype': 'multipart/form-data'}}) }} + +
+ {{ form_widget(form) }} +
+ + + + {{ form_end(form) }} +
+
+{% endblock %} diff --git a/templates/profile/intern.html.twig b/templates/profile/intern.html.twig index 2447be0..76f77e9 100644 --- a/templates/profile/intern.html.twig +++ b/templates/profile/intern.html.twig @@ -2,11 +2,30 @@

Bonjour {{ app.user.nickname }}

Vous êtes à la recherche d'un stage.


-

Nom : {{ app.user.firstName }}

-

Prénom : {{ app.user.lastName }}

-

Adresse : {{ app.user.address }}

-

Téléphone : {{ app.user.tel }}

-

Email : {{ app.user.mail }}

+ +
+
+

Nom : {{ app.user.firstName }}

+

Prénom : {{ app.user.lastName }}

+

Adresse : {{ app.user.address }}

+

Téléphone : {{ app.user.tel }}

+

Email : {{ app.user.mail }}

+
+ + {% if app.user.resume != "" %} +
+ + {% if app.user.resumeName != "" %} +

Nom du fichier : {{ app.user.resumeName }}

+ {% endif %} +
+ {% endif %} +
+ +
+ Ajouter / Modifier le CV +

Vos diplômes :