diff --git a/src/Controller/AbsenceController.php b/src/Controller/AbsenceController.php new file mode 100644 index 0000000..da1b2fa --- /dev/null +++ b/src/Controller/AbsenceController.php @@ -0,0 +1,81 @@ +render('absence/index.html.twig', [ + 'absences' => $absenceRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_absence_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $absence = new Absence(); + $form = $this->createForm(AbsenceType::class, $absence); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($absence); + $entityManager->flush(); + + return $this->redirectToRoute('app_absence_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('absence/new.html.twig', [ + 'absence' => $absence, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_absence_show', methods: ['GET'])] + public function show(Absence $absence): Response + { + return $this->render('absence/show.html.twig', [ + 'absence' => $absence, + ]); + } + + #[Route('/{id}/edit', name: 'app_absence_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, Absence $absence, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(AbsenceType::class, $absence); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_absence_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('absence/edit.html.twig', [ + 'absence' => $absence, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_absence_delete', methods: ['POST'])] + public function delete(Request $request, Absence $absence, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$absence->getId(), $request->getPayload()->getString('_token'))) { + $entityManager->remove($absence); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_absence_index', [], Response::HTTP_SEE_OTHER); + } +} diff --git a/src/Controller/DemandeCongeController.php b/src/Controller/DemandeCongeController.php new file mode 100644 index 0000000..74b0cb4 --- /dev/null +++ b/src/Controller/DemandeCongeController.php @@ -0,0 +1,90 @@ +render('demande_conge/index.html.twig', [ + 'demande_conges' => $demandeCongeRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_demande_conge_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $demandeConge = new DemandeConge(); + $form = $this->createForm(DemandeCongeType::class, $demandeConge); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->persist($demandeConge); + $entityManager->flush(); + + // Automatically create a ValiderConge entry for the new DemandeConge + $validerConge = new ValiderConge(); + $validerConge->setDemandeConge($demandeConge); + $validerConge->setStatut('EN_ATTENTE'); // Default status + $validerConge->setDateValidation(new \DateTime()); // Set current date as validation date + $entityManager->persist($validerConge); + $entityManager->flush(); + + return $this->redirectToRoute('app_demande_conge_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('demande_conge/new.html.twig', [ + 'demande_conge' => $demandeConge, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_demande_conge_show', methods: ['GET'])] + public function show(DemandeConge $demandeConge): Response + { + return $this->render('demande_conge/show.html.twig', [ + 'demande_conge' => $demandeConge, + ]); + } + + #[Route('/{id}/edit', name: 'app_demande_conge_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, DemandeConge $demandeConge, EntityManagerInterface $entityManager): Response + { + $form = $this->createForm(DemandeCongeType::class, $demandeConge); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + $entityManager->flush(); + + return $this->redirectToRoute('app_demande_conge_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('demande_conge/edit.html.twig', [ + 'demande_conge' => $demandeConge, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_demande_conge_delete', methods: ['POST'])] + public function delete(Request $request, DemandeConge $demandeConge, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$demandeConge->getId(), $request->request->get('_token'))) { + $entityManager->remove($demandeConge); + $entityManager->flush(); + } + + return $this->redirectToRoute('app_demande_conge_index', [], Response::HTTP_SEE_OTHER); + } +} \ No newline at end of file diff --git a/src/Controller/ValiderCongeController.php b/src/Controller/ValiderCongeController.php new file mode 100644 index 0000000..9b9846d --- /dev/null +++ b/src/Controller/ValiderCongeController.php @@ -0,0 +1,108 @@ +render('valider_conge/index.html.twig', [ + 'valider_conges' => $validerCongeRepository->findAll(), + ]); + } + + #[Route('/new', name: 'app_valider_conge_new', methods: ['GET', 'POST'])] + public function new(Request $request, EntityManagerInterface $entityManager): Response + { + $validerConge = new ValiderConge(); + $validerConge->setDateValidation(new \DateTime()); // Automatically set today's date + + $form = $this->createForm(ValiderCongeType::class, $validerConge); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + // Synchronize the statut with the related DemandeConge + $demandeConge = $validerConge->getDemandeConge(); + if ($demandeConge) { + $demandeConge->setStatut($validerConge->getStatut()); + $entityManager->persist($demandeConge); + } + + $entityManager->persist($validerConge); + $entityManager->flush(); + + return $this->redirectToRoute('app_valider_conge_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('valider_conge/new.html.twig', [ + 'valider_conge' => $validerConge, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_valider_conge_show', methods: ['GET'])] + public function show(ValiderConge $validerConge): Response + { + return $this->render('valider_conge/show.html.twig', [ + 'valider_conge' => $validerConge, + ]); + } + + #[Route('/{id}/edit', name: 'app_valider_conge_edit', methods: ['GET', 'POST'])] + public function edit(Request $request, ValiderConge $validerConge, EntityManagerInterface $entityManager): Response + { + $validerConge->setDateValidation(new \DateTime()); // Automatically update the date to today's date + + $form = $this->createForm(ValiderCongeType::class, $validerConge); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + // Synchronize the statut with the related DemandeConge + $demandeConge = $validerConge->getDemandeConge(); + if ($demandeConge) { + $demandeConge->setStatut($validerConge->getStatut()); + $entityManager->persist($demandeConge); + } + + $entityManager->flush(); + + return $this->redirectToRoute('app_valider_conge_index', [], Response::HTTP_SEE_OTHER); + } + + return $this->render('valider_conge/edit.html.twig', [ + 'valider_conge' => $validerConge, + 'form' => $form, + ]); + } + + #[Route('/{id}', name: 'app_valider_conge_delete', methods: ['POST'])] + public function delete(Request $request, ValiderConge $validerConge, EntityManagerInterface $entityManager): Response + { + if ($this->isCsrfTokenValid('delete'.$validerConge->getId(), $request->request->get('_token'))) { + $demandeConge = $validerConge->getDemandeConge(); + + // Remove the ValiderConge + $entityManager->remove($validerConge); + $entityManager->flush(); + + // Check if DemandeConge has no more ValiderConge entries + if ($demandeConge && $demandeConge->getValiderConges()->isEmpty()) { + $entityManager->remove($demandeConge); + $entityManager->flush(); + } + } + + return $this->redirectToRoute('app_valider_conge_index', [], Response::HTTP_SEE_OTHER); + } +} \ No newline at end of file diff --git a/src/Entity/DemandeConge.php b/src/Entity/DemandeConge.php index abf91e9..3e3ae85 100644 --- a/src/Entity/DemandeConge.php +++ b/src/Entity/DemandeConge.php @@ -2,12 +2,11 @@ namespace App\Entity; -use Doctrine\DBAL\Types\Types; -use Doctrine\ORM\Mapping as ORM; +use App\Repository\DemandeCongeRepository; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; - -use App\Repository\DemandeCongeRepository; +use Doctrine\ORM\Mapping as ORM; +use Symfony\Component\Validator\Constraints as Assert; #[ORM\Entity(repositoryClass: DemandeCongeRepository::class)] #[ORM\Table(name: 'demande_conge')] @@ -31,6 +30,7 @@ public function setId(int $id): self #[ORM\ManyToOne(targetEntity: Employe::class, inversedBy: 'demandeConges')] #[ORM\JoinColumn(name: 'employe_id', referencedColumnName: 'id')] + #[Assert\NotNull(message: "Employee is required")] private ?Employe $employe = null; public function getEmploye(): ?Employe @@ -44,7 +44,12 @@ public function setEmploye(?Employe $employe): self return $this; } - #[ORM\Column(type: 'string', nullable: false)] + #[ORM\Column(name: 'typeConge', type: 'string', length: 50, nullable: false)] + #[Assert\NotBlank(message: "Leave type is required")] + #[Assert\Length( + max: 50, + maxMessage: "Leave type must not exceed {{ limit }} characters" + )] private ?string $typeConge = null; public function getTypeConge(): ?string @@ -58,7 +63,13 @@ public function setTypeConge(string $typeConge): self return $this; } - #[ORM\Column(type: 'date', nullable: false)] + #[ORM\Column(name: 'dateDebut', type: 'date', nullable: false)] + #[Assert\NotNull(message: "Start date is required")] + #[Assert\Type(\DateTimeInterface::class, message: "Start date must be a valid date")] + #[Assert\GreaterThanOrEqual( + "today", + message: "Start date must be today or in the future" + )] private ?\DateTimeInterface $dateDebut = null; public function getDateDebut(): ?\DateTimeInterface @@ -66,13 +77,19 @@ public function getDateDebut(): ?\DateTimeInterface return $this->dateDebut; } - public function setDateDebut(\DateTimeInterface $dateDebut): self + public function setDateDebut(?\DateTimeInterface $dateDebut): self { $this->dateDebut = $dateDebut; return $this; } - #[ORM\Column(type: 'date', nullable: false)] + #[ORM\Column(name: 'dateFin', type: 'date', nullable: false)] + #[Assert\NotNull(message: "End date is required")] + #[Assert\Type(\DateTimeInterface::class, message: "End date must be a valid date")] + #[Assert\Expression( + "this.getDateFin() >= this.getDateDebut()", + message: "End date must be after start date" + )] private ?\DateTimeInterface $dateFin = null; public function getDateFin(): ?\DateTimeInterface @@ -80,13 +97,13 @@ public function getDateFin(): ?\DateTimeInterface return $this->dateFin; } - public function setDateFin(\DateTimeInterface $dateFin): self + public function setDateFin(?\DateTimeInterface $dateFin): self { $this->dateFin = $dateFin; return $this; } - #[ORM\Column(type: 'string', nullable: true)] + #[ORM\Column(type: 'string', length: 20, nullable: false)] private ?string $statut = null; public function getStatut(): ?string @@ -94,7 +111,7 @@ public function getStatut(): ?string return $this->statut; } - public function setStatut(?string $statut): self + public function setStatut(string $statut): self { $this->statut = $statut; return $this; @@ -113,24 +130,28 @@ public function __construct() */ public function getValiderConges(): Collection { - if (!$this->validerConges instanceof Collection) { - $this->validerConges = new ArrayCollection(); - } return $this->validerConges; } public function addValiderConge(ValiderConge $validerConge): self { - if (!$this->getValiderConges()->contains($validerConge)) { - $this->getValiderConges()->add($validerConge); + if (!$this->validerConges->contains($validerConge)) { + $this->validerConges[] = $validerConge; + $validerConge->setDemandeConge($this); } + return $this; } public function removeValiderConge(ValiderConge $validerConge): self { - $this->getValiderConges()->removeElement($validerConge); + if ($this->validerConges->removeElement($validerConge)) { + // set the owning side to null (unless already changed) + if ($validerConge->getDemandeConge() === $this) { + $validerConge->setDemandeConge(null); + } + } + return $this; } - -} +} \ No newline at end of file diff --git a/src/Entity/Employe.php b/src/Entity/Employe.php index bc1baae..9dacf87 100644 --- a/src/Entity/Employe.php +++ b/src/Entity/Employe.php @@ -1,5 +1,4 @@ id; + $this->absences = new ArrayCollection(); + $this->demandeConges = new ArrayCollection(); + $this->formations = new ArrayCollection(); + $this->quizs = new ArrayCollection(); } - public function setId(int $id): self + public function getId(): ?int { - $this->id = $id; - return $this; + return $this->id; } - #[ORM\Column(type: 'integer', nullable: true)] - private ?int $cin = null; - public function getCin(): ?int { return $this->cin; @@ -43,9 +92,6 @@ public function setCin(?int $cin): self return $this; } - #[ORM\Column(type: 'string', nullable: false)] - private ?string $nom = null; - public function getNom(): ?string { return $this->nom; @@ -57,9 +103,6 @@ public function setNom(string $nom): self return $this; } - #[ORM\Column(type: 'string', nullable: false)] - private ?string $prenom = null; - public function getPrenom(): ?string { return $this->prenom; @@ -71,9 +114,6 @@ public function setPrenom(string $prenom): self return $this; } - #[ORM\Column(type: 'string', nullable: true)] - private ?string $email = null; - public function getEmail(): ?string { return $this->email; @@ -85,9 +125,6 @@ public function setEmail(?string $email): self return $this; } - #[ORM\Column(type: 'string', nullable: true)] - private ?string $password = null; - public function getPassword(): ?string { return $this->password; @@ -99,23 +136,17 @@ public function setPassword(?string $password): self return $this; } - #[ORM\Column(type: 'date', nullable: true)] - private ?\DateTimeInterface $hiring_date = null; - - public function getHiring_date(): ?\DateTimeInterface + public function getHiringDate(): ?\DateTimeInterface { return $this->hiring_date; } - public function setHiring_date(?\DateTimeInterface $hiring_date): self + public function setHiringDate(?\DateTimeInterface $hiring_date): self { $this->hiring_date = $hiring_date; return $this; } - #[ORM\Column(type: 'integer', nullable: true)] - private ?int $soldeConges = null; - public function getSoldeConges(): ?int { return $this->soldeConges; @@ -127,154 +158,79 @@ public function setSoldeConges(?int $soldeConges): self return $this; } - #[ORM\OneToMany(targetEntity: Absence::class, mappedBy: 'employe')] - private Collection $absences; - - /** - * @return Collection - */ public function getAbsences(): Collection { - if (!$this->absences instanceof Collection) { - $this->absences = new ArrayCollection(); - } return $this->absences; } public function addAbsence(Absence $absence): self { - if (!$this->getAbsences()->contains($absence)) { - $this->getAbsences()->add($absence); + if (!$this->absences->contains($absence)) { + $this->absences->add($absence); } return $this; } public function removeAbsence(Absence $absence): self { - $this->getAbsences()->removeElement($absence); + $this->absences->removeElement($absence); return $this; } - #[ORM\OneToMany(targetEntity: DemandeConge::class, mappedBy: 'employe')] - private Collection $demandeConges; - - /** - * @return Collection - */ public function getDemandeConges(): Collection { - if (!$this->demandeConges instanceof Collection) { - $this->demandeConges = new ArrayCollection(); - } return $this->demandeConges; } public function addDemandeConge(DemandeConge $demandeConge): self { - if (!$this->getDemandeConges()->contains($demandeConge)) { - $this->getDemandeConges()->add($demandeConge); + if (!$this->demandeConges->contains($demandeConge)) { + $this->demandeConges->add($demandeConge); } return $this; } public function removeDemandeConge(DemandeConge $demandeConge): self { - $this->getDemandeConges()->removeElement($demandeConge); + $this->demandeConges->removeElement($demandeConge); return $this; } - #[ORM\ManyToMany(targetEntity: Formation::class, inversedBy: 'employes')] - #[ORM\JoinTable( - name: 'formation_participation', - joinColumns: [ - new ORM\JoinColumn(name: 'employe_id', referencedColumnName: 'id') - ], - inverseJoinColumns: [ - new ORM\JoinColumn(name: 'formation_id', referencedColumnName: 'id') - ] - )] - private Collection $formations; - - /** - * @return Collection - */ public function getFormations(): Collection { - if (!$this->formations instanceof Collection) { - $this->formations = new ArrayCollection(); - } return $this->formations; } public function addFormation(Formation $formation): self { - if (!$this->getFormations()->contains($formation)) { - $this->getFormations()->add($formation); + if (!$this->formations->contains($formation)) { + $this->formations->add($formation); } return $this; } public function removeFormation(Formation $formation): self { - $this->getFormations()->removeElement($formation); + $this->formations->removeElement($formation); return $this; } - #[ORM\ManyToMany(targetEntity: Quiz::class, inversedBy: 'employes')] - #[ORM\JoinTable( - name: 'quiz_reponses', - joinColumns: [ - new ORM\JoinColumn(name: 'employe_id', referencedColumnName: 'id') - ], - inverseJoinColumns: [ - new ORM\JoinColumn(name: 'quiz_id', referencedColumnName: 'id') - ] - )] - private Collection $quizs; - - public function __construct() - { - $this->absences = new ArrayCollection(); - $this->demandeConges = new ArrayCollection(); - $this->formations = new ArrayCollection(); - $this->quizs = new ArrayCollection(); - } - - /** - * @return Collection - */ public function getQuizs(): Collection { - if (!$this->quizs instanceof Collection) { - $this->quizs = new ArrayCollection(); - } return $this->quizs; } public function addQuiz(Quiz $quiz): self { - if (!$this->getQuizs()->contains($quiz)) { - $this->getQuizs()->add($quiz); + if (!$this->quizs->contains($quiz)) { + $this->quizs->add($quiz); } return $this; } public function removeQuiz(Quiz $quiz): self { - $this->getQuizs()->removeElement($quiz); + $this->quizs->removeElement($quiz); return $this; } - - public function getHiringDate(): ?\DateTimeInterface - { - return $this->hiring_date; - } - - public function setHiringDate(?\DateTimeInterface $hiring_date): static - { - $this->hiring_date = $hiring_date; - - return $this; - } - -} +} \ No newline at end of file diff --git a/src/Entity/ValiderConge.php b/src/Entity/ValiderConge.php index 81c567e..a24ab73 100644 --- a/src/Entity/ValiderConge.php +++ b/src/Entity/ValiderConge.php @@ -6,8 +6,8 @@ use Doctrine\ORM\Mapping as ORM; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; - use App\Repository\ValiderCongeRepository; +use Symfony\Component\Validator\Constraints as Assert; #[ORM\Entity(repositoryClass: ValiderCongeRepository::class)] #[ORM\Table(name: 'valider_conge')] @@ -18,6 +18,23 @@ class ValiderConge #[ORM\Column(type: 'integer')] private ?int $id = null; + #[ORM\ManyToOne(targetEntity: DemandeConge::class, inversedBy: 'validerConges')] + #[ORM\JoinColumn(name: 'demande_id', referencedColumnName: 'id', nullable: false)] + #[Assert\NotNull(message: 'La demande de congé est obligatoire.')] + private ?DemandeConge $demandeConge = null; + + #[ORM\Column(type: 'string', nullable: false)] + #[Assert\NotBlank(message: 'Le statut est obligatoire.')] + #[Assert\Choice(choices: ['EN_ATTENTE', 'ACCEPTEE', 'REFUSEE'], message: 'Le statut doit être l’un des choix valides.')] + private ?string $statut = null; + + #[ORM\Column(type: 'text', nullable: true)] + private ?string $commentaire = null; + + #[ORM\Column(name: 'dateValidation', type: 'date', nullable: false)] + #[Assert\NotNull(message: 'La date de validation est obligatoire.')] + private ?\DateTimeInterface $dateValidation = null; + public function getId(): ?int { return $this->id; @@ -29,10 +46,6 @@ public function setId(int $id): self return $this; } - #[ORM\ManyToOne(targetEntity: DemandeConge::class, inversedBy: 'validerConges')] - #[ORM\JoinColumn(name: 'demande_id', referencedColumnName: 'id')] - private ?DemandeConge $demandeConge = null; - public function getDemandeConge(): ?DemandeConge { return $this->demandeConge; @@ -44,9 +57,6 @@ public function setDemandeConge(?DemandeConge $demandeConge): self return $this; } - #[ORM\Column(type: 'string', nullable: false)] - private ?string $statut = null; - public function getStatut(): ?string { return $this->statut; @@ -58,9 +68,6 @@ public function setStatut(string $statut): self return $this; } - #[ORM\Column(type: 'text', nullable: true)] - private ?string $commentaire = null; - public function getCommentaire(): ?string { return $this->commentaire; @@ -72,9 +79,6 @@ public function setCommentaire(?string $commentaire): self return $this; } - #[ORM\Column(type: 'date', nullable: false)] - private ?\DateTimeInterface $dateValidation = null; - public function getDateValidation(): ?\DateTimeInterface { return $this->dateValidation; @@ -85,5 +89,4 @@ public function setDateValidation(\DateTimeInterface $dateValidation): self $this->dateValidation = $dateValidation; return $this; } - -} +} \ No newline at end of file diff --git a/src/Form/AbsenceType.php b/src/Form/AbsenceType.php new file mode 100644 index 0000000..25d9c11 --- /dev/null +++ b/src/Form/AbsenceType.php @@ -0,0 +1,36 @@ +add('motif') + ->add('justificatif') + ->add('remarque') + ->add('date_enregistrement', null, [ + 'widget' => 'single_text', + ]) + ->add('employe', EntityType::class, [ + 'class' => Employe::class, + 'choice_label' => 'id', + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => Absence::class, + ]); + } +} diff --git a/src/Form/DemandeCongeType.php b/src/Form/DemandeCongeType.php new file mode 100644 index 0000000..c9b1b15 --- /dev/null +++ b/src/Form/DemandeCongeType.php @@ -0,0 +1,83 @@ +add('typeConge', ChoiceType::class, [ + 'choices' => [ + 'Maladie' => 'MALADIE', + 'Annuel' => 'ANNUEL', + 'Maternité' => 'MATERNITE', + 'Paternité' => 'PATERNITE', + 'Formation' => 'FORMATION', + ], + 'label' => 'Type de congé', + 'attr' => ['class' => 'form-select form-control-lg'], + 'constraints' => [ + new NotBlank(['message' => 'Veuillez sélectionner un type de congé']), + ], + ]) + ->add('dateDebut', DateType::class, [ + 'widget' => 'single_text', + 'label' => 'Date de début', + 'attr' => ['class' => 'form-control form-control-lg'], + 'constraints' => [ + new NotBlank(['message' => 'Veuillez saisir une date de début']), + new GreaterThanOrEqual([ + 'value' => 'today', + 'message' => 'La date de début doit être aujourd\'hui ou dans le futur' + ]), + ], + ]) + ->add('dateFin', DateType::class, [ + 'widget' => 'single_text', + 'label' => 'Date de fin', + 'attr' => ['class' => 'form-control form-control-lg'], + 'constraints' => [ + new NotBlank(['message' => 'Veuillez saisir une date de fin']), + new GreaterThanOrEqual([ + 'propertyPath' => 'parent.all[dateDebut].data', + 'message' => 'La date de fin doit être après la date de début' + ]), + ], + ]) + ->add('statut', HiddenType::class, [ + 'data' => 'EN_ATTENTE', + ]) + ->add('employe', EntityType::class, [ + 'class' => Employe::class, + 'choice_label' => function (Employe $employe) { + return $employe->getNom() . ' ' . $employe->getPrenom(); + }, + 'label' => 'Employé', + 'placeholder' => 'Sélectionner un employé', + 'attr' => ['class' => 'form-select form-control-lg'], + 'constraints' => [ + new NotBlank(['message' => 'Veuillez sélectionner un employé']), + ], + ]); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => DemandeConge::class, + ]); + } +} \ No newline at end of file diff --git a/src/Form/ValiderCongeType.php b/src/Form/ValiderCongeType.php new file mode 100644 index 0000000..3eb0c02 --- /dev/null +++ b/src/Form/ValiderCongeType.php @@ -0,0 +1,60 @@ +add('statut', ChoiceType::class, [ + 'choices' => [ + 'En attente' => 'EN_ATTENTE', + 'Acceptée' => 'ACCEPTEE', + 'Refusée' => 'REFUSEE', + ], + 'label' => 'Statut de validation', + 'attr' => ['class' => 'form-select form-control-lg'], + 'constraints' => [ + new NotBlank(['message' => 'Veuillez sélectionner un statut']), + ], + ]) + ->add('commentaire', TextareaType::class, [ + 'label' => 'Commentaire', + 'required' => false, + 'attr' => [ + 'class' => 'form-control form-control-lg', + 'placeholder' => 'Ajoutez un commentaire si nécessaire', + ], + ]) + ->add('demandeConge', EntityType::class, [ + 'class' => DemandeConge::class, + 'choice_label' => function (DemandeConge $demandeConge) { + return 'Demande #' . $demandeConge->getId() . ' - ' . $demandeConge->getTypeConge(); + }, + 'label' => 'Demande de congé associée', + 'placeholder' => 'Sélectionner une demande de congé', + 'attr' => ['class' => 'form-select form-control-lg'], + 'constraints' => [ + new NotBlank(['message' => 'Veuillez sélectionner une demande de congé']), + ], + ]); + } + + public function configureOptions(OptionsResolver $resolver): void + { + $resolver->setDefaults([ + 'data_class' => ValiderConge::class, + ]); + } +} \ No newline at end of file diff --git a/templates/absence/_delete_form.html.twig b/templates/absence/_delete_form.html.twig new file mode 100644 index 0000000..a2e3575 --- /dev/null +++ b/templates/absence/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/absence/_form.html.twig b/templates/absence/_form.html.twig new file mode 100644 index 0000000..bf20b98 --- /dev/null +++ b/templates/absence/_form.html.twig @@ -0,0 +1,4 @@ +{{ form_start(form) }} + {{ form_widget(form) }} + +{{ form_end(form) }} diff --git a/templates/absence/edit.html.twig b/templates/absence/edit.html.twig new file mode 100644 index 0000000..5bd1ee5 --- /dev/null +++ b/templates/absence/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit Absence{% endblock %} + +{% block body %} +

Edit Absence

+ + {{ include('absence/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('absence/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/absence/index.html.twig b/templates/absence/index.html.twig new file mode 100644 index 0000000..dd0d4d4 --- /dev/null +++ b/templates/absence/index.html.twig @@ -0,0 +1,41 @@ +{% extends 'base.html.twig' %} + +{% block title %}Absence index{% endblock %} + +{% block body %} +

Absence index

+ + + + + + + + + + + + + + {% for absence in absences %} + + + + + + + + + {% else %} + + + + {% endfor %} + +
IdMotifJustificatifRemarqueDate_enregistrementactions
{{ absence.id }}{{ absence.motif }}{{ absence.justificatif }}{{ absence.remarque }}{{ absence.dateEnregistrement ? absence.dateEnregistrement|date('Y-m-d H:i:s') : '' }} + show + edit +
no records found
+ + Create new +{% endblock %} diff --git a/templates/absence/new.html.twig b/templates/absence/new.html.twig new file mode 100644 index 0000000..7f0d750 --- /dev/null +++ b/templates/absence/new.html.twig @@ -0,0 +1,11 @@ +{% extends 'base.html.twig' %} + +{% block title %}New Absence{% endblock %} + +{% block body %} +

Create new Absence

+ + {{ include('absence/_form.html.twig') }} + + back to list +{% endblock %} diff --git a/templates/absence/show.html.twig b/templates/absence/show.html.twig new file mode 100644 index 0000000..70ccc22 --- /dev/null +++ b/templates/absence/show.html.twig @@ -0,0 +1,38 @@ +{% extends 'base.html.twig' %} + +{% block title %}Absence{% endblock %} + +{% block body %} +

Absence

+ + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ absence.id }}
Motif{{ absence.motif }}
Justificatif{{ absence.justificatif }}
Remarque{{ absence.remarque }}
Date_enregistrement{{ absence.dateEnregistrement ? absence.dateEnregistrement|date('Y-m-d H:i:s') : '' }}
+ + back to list + + edit + + {{ include('absence/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/demande_conge/_delete_form.html.twig b/templates/demande_conge/_delete_form.html.twig new file mode 100644 index 0000000..87b322c --- /dev/null +++ b/templates/demande_conge/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/demande_conge/_form.html.twig b/templates/demande_conge/_form.html.twig new file mode 100644 index 0000000..454f0c5 --- /dev/null +++ b/templates/demande_conge/_form.html.twig @@ -0,0 +1,37 @@ +
+ {{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }} + + {# Display a general error alert if there are any errors in the form #} + {% if not form.vars.valid %} +
+ There were errors in the form. Please correct them before submitting. +
+ {% endif %} + +
+ {{ form_label(form.typeConge, null, {'label_attr': {'class': 'form-label fs-4'}}) }} + {{ form_widget(form.typeConge, {'attr': {'class': 'form-select form-control-lg'}}) }} +
{{ form_errors(form.typeConge) }}
+
+ +
+
+ {{ form_label(form.dateDebut, null, {'label_attr': {'class': 'form-label fs-4'}}) }} + {{ form_widget(form.dateDebut, {'attr': {'class': 'form-control form-control-lg'}}) }} +
{{ form_errors(form.dateDebut) }}
+
+
+ {{ form_label(form.dateFin, null, {'label_attr': {'class': 'form-label fs-4'}}) }} + {{ form_widget(form.dateFin, {'attr': {'class': 'form-control form-control-lg'}}) }} +
{{ form_errors(form.dateFin) }}
+
+
+
+ {{ form_label(form.employe, null, {'label_attr': {'class': 'form-label fs-4'}}) }} + {{ form_widget(form.employe, {'attr': {'class': 'form-select form-control-lg'}}) }} +
{{ form_errors(form.employe) }}
+
+ + + {{ form_end(form) }} +
diff --git a/templates/demande_conge/edit.html.twig b/templates/demande_conge/edit.html.twig new file mode 100644 index 0000000..1bc042b --- /dev/null +++ b/templates/demande_conge/edit.html.twig @@ -0,0 +1,12 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit DemandeConge{% endblock %} + +{% block body %} +

Edit DemandeConge

+ + {{ include('demande_conge/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + +{% endblock %} diff --git a/templates/demande_conge/index.html.twig b/templates/demande_conge/index.html.twig new file mode 100644 index 0000000..f0b5fa0 --- /dev/null +++ b/templates/demande_conge/index.html.twig @@ -0,0 +1,57 @@ +{% extends 'back_office.html.twig' %} + +{% block title %}Liste des demandes de congé{% endblock %} + +{% block body %} +

Liste des demandes de congé

+ + + + + + + + + + + + + + + {% for demande_conge in demande_conges %} + + + + + + + + + + + {% else %} + + + + {% endfor %} + +
EmployéType de congéDate débutDate finStatutSolde de congésactions
+ {% if demande_conge.employe %} + {{ demande_conge.employe.nom }} {{ demande_conge.employe.prenom }}
+ Email : {{ demande_conge.employe.email }} + {% else %} + Non défini + {% endif %} +
{{ demande_conge.typeConge }}{{ demande_conge.dateDebut ? demande_conge.dateDebut|date('Y-m-d') : '' }}{{ demande_conge.dateFin ? demande_conge.dateFin|date('Y-m-d') : '' }}{{ demande_conge.statut }} + {% if demande_conge.employe %} + {{ demande_conge.employe.soldeConges }} jours + {% else %} + N/A + {% endif %} + + + Supprimer +
Aucune demande trouvée
+ + Créer nouvelle demande +{% endblock %} diff --git a/templates/demande_conge/new.html.twig b/templates/demande_conge/new.html.twig new file mode 100644 index 0000000..1162d26 --- /dev/null +++ b/templates/demande_conge/new.html.twig @@ -0,0 +1,15 @@ +{% extends 'back_office.html.twig' %} + +{% block title %}New DemandeConge{% endblock %} + +{% block body %} +
+

Create new DemandeConge

+ + {{ include('demande_conge/_form.html.twig') }} + + + Back to list + +
+{% endblock %} \ No newline at end of file diff --git a/templates/demande_conge/show.html.twig b/templates/demande_conge/show.html.twig new file mode 100644 index 0000000..166da1e --- /dev/null +++ b/templates/demande_conge/show.html.twig @@ -0,0 +1,38 @@ +{% extends 'base.html.twig' %} + +{% block title %}DemandeConge{% endblock %} + +{% block body %} +

DemandeConge

+ + + + + + + + + + + + + + + + + + + + + + + + +
Id{{ demande_conge.id }}
TypeConge{{ demande_conge.typeConge }}
DateDebut{{ demande_conge.dateDebut ? demande_conge.dateDebut|date('Y-m-d') : '' }}
DateFin{{ demande_conge.dateFin ? demande_conge.dateFin|date('Y-m-d') : '' }}
Statut{{ demande_conge.statut }}
+ + back to list + + edit + + {{ include('demande_conge/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/valider_conge/_delete_form.html.twig b/templates/valider_conge/_delete_form.html.twig new file mode 100644 index 0000000..f0a8581 --- /dev/null +++ b/templates/valider_conge/_delete_form.html.twig @@ -0,0 +1,4 @@ +
+ + +
diff --git a/templates/valider_conge/_form.html.twig b/templates/valider_conge/_form.html.twig new file mode 100644 index 0000000..d4bbd14 --- /dev/null +++ b/templates/valider_conge/_form.html.twig @@ -0,0 +1,31 @@ +
+ {{ form_start(form, {'attr': {'novalidate': 'novalidate'}}) }} + + {# Display a general error alert if there are any errors in the form #} + {% if not form.vars.valid %} +
+ There were errors in the form. Please correct them before submitting. +
+ {% endif %} + +
+ {{ form_label(form.statut, null, {'label_attr': {'class': 'form-label fs-4'}}) }} + {{ form_widget(form.statut, {'attr': {'class': 'form-select form-control-lg'}}) }} +
{{ form_errors(form.statut) }}
+
+ +
+ {{ form_label(form.commentaire, null, {'label_attr': {'class': 'form-label fs-4'}}) }} + {{ form_widget(form.commentaire, {'attr': {'class': 'form-control form-control-lg'}}) }} +
{{ form_errors(form.commentaire) }}
+
+ +
+ {{ form_label(form.demandeConge, null, {'label_attr': {'class': 'form-label fs-4'}}) }} + {{ form_widget(form.demandeConge, {'attr': {'class': 'form-select form-control-lg'}}) }} +
{{ form_errors(form.demandeConge) }}
+
+ + + {{ form_end(form) }} +
\ No newline at end of file diff --git a/templates/valider_conge/edit.html.twig b/templates/valider_conge/edit.html.twig new file mode 100644 index 0000000..3a55526 --- /dev/null +++ b/templates/valider_conge/edit.html.twig @@ -0,0 +1,13 @@ +{% extends 'base.html.twig' %} + +{% block title %}Edit ValiderConge{% endblock %} + +{% block body %} +

Edit ValiderConge

+ + {{ include('valider_conge/_form.html.twig', {'button_label': 'Update'}) }} + + back to list + + {{ include('valider_conge/_delete_form.html.twig') }} +{% endblock %} diff --git a/templates/valider_conge/index.html.twig b/templates/valider_conge/index.html.twig new file mode 100644 index 0000000..5687135 --- /dev/null +++ b/templates/valider_conge/index.html.twig @@ -0,0 +1,71 @@ +{% extends 'back_office.html.twig' %} + +{% block title %}Liste des validations de congé{% endblock %} + +{% block body %} +
+

Liste des validations de congé

+ + + + + + + + + + + + + + + + {% for valider_conge in valider_conges %} + + + + + + + + + + + {% else %} + + + + {% endfor %} + +
EmployéType de congéDate débutDate finStatutCommentaireDate de validationActions
+ {% if valider_conge.demandeConge and valider_conge.demandeConge.employe %} + {{ valider_conge.demandeConge.employe.nom }} {{ valider_conge.demandeConge.employe.prenom }}
+ Email: {{ valider_conge.demandeConge.employe.email }} + {% else %} + Non défini + {% endif %} +
+ {% if valider_conge.demandeConge %} + {{ valider_conge.demandeConge.typeConge }} + {% else %} + Non défini + {% endif %} + + {% if valider_conge.demandeConge %} + {{ valider_conge.demandeConge.dateDebut ? valider_conge.demandeConge.dateDebut|date('Y-m-d') : '' }} + {% else %} + Non défini + {% endif %} + + {% if valider_conge.demandeConge %} + {{ valider_conge.demandeConge.dateFin ? valider_conge.demandeConge.dateFin|date('Y-m-d') : '' }} + {% else %} + Non défini + {% endif %} + {{ valider_conge.statut }}{{ valider_conge.commentaire }}{{ valider_conge.dateValidation ? valider_conge.dateValidation|date('Y-m-d') : '' }} + + Supprimer +
Aucune validation trouvée
+ +
+{% endblock %} \ No newline at end of file diff --git a/templates/valider_conge/new.html.twig b/templates/valider_conge/new.html.twig new file mode 100644 index 0000000..07a95c5 --- /dev/null +++ b/templates/valider_conge/new.html.twig @@ -0,0 +1,15 @@ +{% extends 'back_office.html.twig' %} + +{% block title %}New ValiderConge{% endblock %} + +{% block body %} +
+

Create new ValiderConge

+ + {{ include('valider_conge/_form.html.twig') }} + + + Back to list + +
+{% endblock %} \ No newline at end of file diff --git a/templates/valider_conge/show.html.twig b/templates/valider_conge/show.html.twig new file mode 100644 index 0000000..b123644 --- /dev/null +++ b/templates/valider_conge/show.html.twig @@ -0,0 +1,34 @@ +{% extends 'base.html.twig' %} + +{% block title %}ValiderConge{% endblock %} + +{% block body %} +

ValiderConge

+ + + + + + + + + + + + + + + + + + + + +
Id{{ valider_conge.id }}
Statut{{ valider_conge.statut }}
Commentaire{{ valider_conge.commentaire }}
DateValidation{{ valider_conge.dateValidation ? valider_conge.dateValidation|date('Y-m-d') : '' }}
+ + back to list + + edit + + {{ include('valider_conge/_delete_form.html.twig') }} +{% endblock %}