Vincent GUFFON 3 jaren geleden
bovenliggende
commit
f777ae2226

+ 3 - 2
config/opentalent/enum.yaml

@@ -126,8 +126,9 @@ opentalent:
     education_year: 'App\Enum\Education\YearEnum'
     education_period: 'App\Enum\Education\PeriodEnum'
     education_periodicity: 'App\Enum\Education\PeriodicityEnum'
-    
-  #billing
+    advanced_education_notation: 'App\Enum\Education\AdvancedEducationNotationTypeEnum'
+
+    #billing
     billing_periodicity: 'App\Enum\Billing\PeriodicityEnum'
     billing_type_periodicity: 'App\Enum\Billing\PeriodicityTypeEnum'
     billing_pricingline_adhesion: 'App\Enum\Billing\PricingLineAdhesionEnum'

+ 47 - 0
src/Doctrine/Education/CurrentCycleExtension.php

@@ -0,0 +1,47 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Doctrine\Education;
+
+use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
+use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
+use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
+use App\Entity\Access\Access;
+use App\Entity\Education\Cycle;
+use Doctrine\ORM\QueryBuilder;
+use Symfony\Component\Security\Core\Security;
+
+/**
+ * Class CurrentCycleExtension : Filtre de sécurité par défaut pour une resource Cycle
+ * @package App\Doctrine\Core
+ */
+final class CurrentCycleExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
+{
+    public function __construct(private Security $security)
+    { }
+
+    public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null): void
+    {
+        $this->addWhere($queryBuilder, $resourceClass, $operationName);
+    }
+
+    public function applyToItem(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, array $identifiers, string $operationName = null, array $context = []): void
+    {
+        $this->addWhere($queryBuilder, $resourceClass, $operationName);
+    }
+
+    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass, string $operationName): void
+    {
+        if (Cycle::class !== $resourceClass) {
+            return;
+        }
+
+        /** @var Access $currentUser */
+        $currentUser = $this->security->getUser();
+        $rootAlias = $queryBuilder->getRootAliases()[0];
+        $queryBuilder
+            ->andWhere(sprintf('%s.organization = :organization', $rootAlias))
+            ->setParameter('organization', $currentUser->getOrganization())
+        ;
+    }
+}

+ 112 - 0
src/Entity/Education/Cycle.php

@@ -0,0 +1,112 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Entity\Education;
+
+use ApiPlatform\Core\Annotation\ApiResource;
+use App\Repository\Education\CycleRepository;
+use App\Entity\Organization\Organization;
+use Doctrine\ORM\Mapping as ORM;
+use Symfony\Component\Validator\Constraints as Assert;
+
+/**
+ * Enum des cycles éducatifs, utilisés par les EducationCurriculum
+ * NB: le nombre de cycles est fixé à 6, mais chaque Organization peut en modifier le label
+ */
+#[ApiResource(
+    collectionOperations: [
+        "get" => ["security" => "is_granted('ROLE_ORGANIZATION_VIEW')"]
+    ],
+    itemOperations: [
+        "get" => ["security" => "is_granted('ROLE_ORGANIZATION_VIEW') and object.getOrganization().getId() == user.getOrganization().getId()"],
+        "put" => ["security" => "object.getOrganization().getId() == user.getOrganization().getId()"],
+    ],
+    attributes: ["security" => "is_granted('ROLE_ORGANIZATION')"]
+)]
+#[ORM\Entity(repositoryClass: CycleRepository::class)]
+class Cycle
+{
+    #[ORM\Id]
+    #[ORM\Column]
+    #[ORM\GeneratedValue]
+    private ?int $id = null;
+
+    #[ORM\ManyToOne(inversedBy: 'cycles')]
+    private Organization $organization;
+
+    #[ORM\Column(nullable: true)]
+    private ?int $order = null;
+
+    #[ORM\Column(length: 255)]
+    private string $label;
+
+    #[ORM\Column(length: 255)]
+    #[Assert\Choice(callback: ['\App\Enum\Education\CycleEnum', 'toArray'], message: 'invalid-cycle')]
+    private string $cycleEnum;
+
+    #[ORM\Column(options: ['default' => false])]
+    private bool $isSystem = false;
+
+    public function getId() :?int
+    {
+        return $this->id;
+    }
+
+    public function setOrganization(Organization $organization): self
+    {
+        $this->organization = $organization;
+        return $this;
+    }
+
+    public function getOrganization(): Organization
+    {
+        return $this->organization;
+    }
+
+    public function setOrder(?int $order): self
+    {
+        $this->order = $order;
+        return $this;
+    }
+
+    public function getOrder(): ?int
+    {
+        return $this->order;
+    }
+
+
+    public function setLabel(string $label): self
+    {
+        $this->label = $label;
+        return $this;
+    }
+
+    public function getLabel(): string
+    {
+        return $this->label;
+    }
+
+    public function setCycleEnum(string $cycleEnum): self
+    {
+        $this->cycleEnum = $cycleEnum;
+        return $this;
+    }
+
+    public function getCycleEnum(): string
+    {
+        return $this->cycleEnum;
+    }
+
+
+    public function setIsSystem(bool $isSystem): self
+    {
+        $this->isSystem = $isSystem;
+        return $this;
+    }
+
+
+    public function getIsSystem(): bool
+    {
+        return $this->isSystem;
+    }
+}

+ 15 - 0
src/Enum/Education/AdvancedEducationNotationTypeEnum.php

@@ -0,0 +1,15 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum\Education;
+
+use MyCLabs\Enum\Enum;
+
+/**
+ * Type possible sur lesquels les grilles péda doivent se baser
+ */
+class AdvancedEducationNotationTypeEnum extends Enum
+{
+    private const BY_TEACHER ='BY_TEACHER';
+    private const BY_EDUCATION ='BY_EDUCATION';
+}

+ 19 - 0
src/Enum/Education/CycleEnum.php

@@ -0,0 +1,19 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Enum\Education;
+
+use MyCLabs\Enum\Enum;
+
+/**
+ * Cycle Enum.
+ */
+class CycleEnum extends Enum
+{
+    private const INITIATION_CYCLE = 'INITIATION_CYCLE';
+    private const CYCLE_1 = 'CYCLE_1';
+    private const CYCLE_2 = 'CYCLE_2';
+    private const CYCLE_3 = 'CYCLE_3';
+    private const CYCLE_4 = 'CYCLE_4';
+    private const OUT_CYCLE = 'OUT_CYCLE';
+}

+ 16 - 0
src/Repository/Education/CycleRepository.php

@@ -0,0 +1,16 @@
+<?php
+declare(strict_types=1);
+
+namespace App\Repository\Education;
+
+use App\Entity\Education\Cycle;
+use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
+use Doctrine\Persistence\ManagerRegistry;
+
+class CycleRepository extends ServiceEntityRepository
+{
+    public function __construct(ManagerRegistry $registry)
+    {
+        parent::__construct($registry, Cycle ::class);
+    }
+}