Browse Source

add the AttendanceBookingReason entity

Olivier Massot 1 year ago
parent
commit
7cc7a6ce7e

+ 1 - 0
config/opentalent/products.yaml

@@ -132,6 +132,7 @@ parameters:
             - Categories
             - EventReport
             - AttendanceBooking
+            - AttendanceBookingReason
           roles:
             - ROLE_EVENTS
 

+ 40 - 0
src/Doctrine/Booking/AttendanceBookingReasonExtension.php

@@ -0,0 +1,40 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Doctrine\Booking;
+
+use ApiPlatform\Metadata\Operation;
+use App\Doctrine\AbstractExtension;
+use App\Entity\Access\Access;
+use App\Entity\Booking\AttendanceBookingReason;
+use App\Entity\Booking\Course;
+use Doctrine\ORM\QueryBuilder;
+use Symfony\Bundle\SecurityBundle\Security;
+
+/**
+ * Class AttendanceBookingReasonExtension : Filtre de sécurité par défaut pour une resource AttendanceBookingReason
+ * @package App\Doctrine\Core
+ */
+final class AttendanceBookingReasonExtension extends AbstractExtension
+{
+    public function __construct(private Security $security)
+    { }
+
+    public function supports(string $resourceClass, ?Operation $operation): bool {
+        return $resourceClass === AttendanceBookingReason::class;
+    }
+
+    /**
+     * @todo : A la suite de la migration, il faut supprimer le where avec le discr.
+     */
+    protected function addWhere(QueryBuilder $queryBuilder, string $resourceClass, ?Operation $operation): void
+    {
+        /** @var Access $currentUser */
+        $currentUser = $this->security->getUser();
+        $rootAlias = $queryBuilder->getRootAliases()[0];
+        $queryBuilder
+            ->andWhere(sprintf('%s.organization = :organization', $rootAlias))
+            ->setParameter('organization', $currentUser->getOrganization())
+        ;
+    }
+}

+ 15 - 0
src/Entity/Booking/AttendanceBooking.php

@@ -40,6 +40,10 @@ class AttendanceBooking
     #[ORM\ManyToOne(inversedBy: 'attendanceBooking')]
     private Examen $examen;
 
+    #[ORM\ManyToOne(inversedBy: 'attendanceBookings')]
+    #[ORM\JoinColumn(nullable: true)]
+    private ?AttendanceBookingReason $reason;
+
     public function getId(): ?int
     {
         return $this->id;
@@ -110,4 +114,15 @@ class AttendanceBooking
         $this->examen = $examen;
         return $this;
     }
+
+    public function getReason(): AttendanceBookingReason
+    {
+        return $this->reason;
+    }
+
+    public function setReason(?AttendanceBookingReason $reason): self
+    {
+        $this->reason = $reason;
+        return $this;
+    }
 }

+ 119 - 0
src/Entity/Booking/AttendanceBookingReason.php

@@ -0,0 +1,119 @@
+<?php
+namespace App\Entity\Booking;
+
+use ApiPlatform\Metadata\ApiResource;
+use ApiPlatform\Metadata\Delete;
+use ApiPlatform\Metadata\Get;
+use ApiPlatform\Metadata\GetCollection;
+use ApiPlatform\Metadata\Post;
+use ApiPlatform\Metadata\Put;
+use App\Entity\Organization\Organization;
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+use Doctrine\ORM\Mapping as ORM;
+
+/**
+ * Motif d'absence ou de retard
+ *
+ * Security :
+ *   - @see src/Doctrine/Booking/AttendanceBookingReasonExtension.php
+ */
+#[ApiResource(operations: [
+    new Get(
+        security: 'is_granted(\'ROLE_ORGANIZATION_VIEW\') and object.getOrganization().getId() == user.getOrganization().getId()'
+    ),
+    new Put(
+        security: 'object.getOrganization().getId() == user.getOrganization().getId()'
+    ),
+    new Delete(
+        security: 'object.getOrganization().getId() == user.getOrganization().getId()'
+    ),
+    new GetCollection(
+        security: 'is_granted(\'ROLE_ORGANIZATION_VIEW\')'
+    ),
+    new Post()
+
+])]
+//#[Auditable]
+#[ORM\Table(name: 'AttendanceBookingReason')]
+#[ORM\Entity]
+class AttendanceBookingReason
+{
+    #[ORM\Id]
+    #[ORM\Column]
+    #[ORM\GeneratedValue]
+    private ?int $id = null;
+
+    #[ORM\ManyToOne(inversedBy: 'attendanceBookingReasons')]
+    #[ORM\JoinColumn(nullable: false)]
+    protected Organization $organization;
+
+    #[ORM\Column(length: 255, nullable: false)]
+    private string $reason;
+
+    #[ORM\OneToMany(mappedBy: 'reason', targetEntity: AttendanceBooking::class, cascade: ['persist'], orphanRemoval: true)]
+    private Collection $attendanceBookings;
+
+    public function __construct()
+    {
+        $this->attendanceBookings = new ArrayCollection();
+    }
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function setId(?int $id): self
+    {
+        $this->id = $id;
+        return $this;
+    }
+
+    public function getOrganization(): Organization
+    {
+        return $this->organization;
+    }
+
+    public function setOrganization(Organization $organization): self
+    {
+        $this->organization = $organization;
+        return $this;
+    }
+
+    public function getReason(): string
+    {
+        return $this->reason;
+    }
+
+    public function setReason(string $reason): self
+    {
+        $this->reason = $reason;
+        return $this;
+    }
+
+    public function getAttendanceBookings(): Collection
+    {
+        return $this->attendanceBookings;
+    }
+
+    public function addAttendanceBookings(AttendanceBooking $attendanceBooking): self
+    {
+        if (!$this->attendanceBookings->contains($attendanceBooking)) {
+            $this->attendanceBookings[] = $attendanceBooking;
+            $attendanceBooking->setReason($this);
+        }
+        return $this;
+    }
+
+    public function removeAttendanceBooking(AttendanceBooking $attendanceBooking): self
+    {
+        if ($this->attendanceBookings->removeElement($attendanceBooking)) {
+            // set the owning side to null (unless already changed)
+            if ($attendanceBooking->getReason() === $this) {
+                $attendanceBooking->setReason(null);
+            }
+        }
+        return $this;
+    }
+}