src/Domain/Entity/PromoCode.php line 87

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Domain\Entity;
  4. use ApiPlatform\Metadata\ApiResource;
  5. use ApiPlatform\Metadata\Delete;
  6. use ApiPlatform\Metadata\Get;
  7. use ApiPlatform\Metadata\GetCollection;
  8. use ApiPlatform\Metadata\Post;
  9. use ApiPlatform\Metadata\Put;
  10. use App\Application\ApiResources\State\Provider\ListPromoCodeProvider;
  11. use App\Application\ApiResources\State\Provider\PartnerPromoCodeStatsProvider;
  12. use App\Application\ApiResources\State\Provider\PromoCodeExportProvider;
  13. use App\Application\Controller\Api\PromoCode\ImportAction;
  14. use App\Application\Controller\Api\PromoCode\UseAction;
  15. use App\Application\Dto\PromoCode\PromoCodeOutput;
  16. use App\Domain\Entity\Behavior\Identifiable;
  17. use Doctrine\Common\Collections\ArrayCollection;
  18. use Doctrine\Common\Collections\Collection;
  19. use Gedmo\SoftDeleteable\Traits\SoftDeleteable;
  20. use Gedmo\Timestampable\Traits\Timestampable;
  21. /**
  22.  * Class PromoCode
  23.  *
  24.  * @package App\Domain\Entity
  25.  */
  26. #[ApiResource(
  27.     operations: [
  28.         new Delete(security"is_granted('ROLE_ADMIN')"),
  29.         new GetCollection(
  30.             uriTemplate'/promo_codes',
  31.             security"is_granted('ROLE_ADMIN')",
  32.             filters: [
  33.                 'promo_code.query_filter',
  34.                 'promo_code.search_filter',
  35.                 'soft_delete_filter',
  36.             ],
  37.             outputPromoCodeOutput::class,
  38.             providerListPromoCodeProvider::class
  39.         ),
  40.         new GetCollection(
  41.             uriTemplate'/promo_codes/by_partner',
  42.             security"is_granted('ROLE_ADMIN')",
  43.             filters: ['promo_code.query_filter'],
  44.             outputPromoCodeOutput::class,
  45.             providerPartnerPromoCodeStatsProvider::class,
  46.         ),
  47.         new GetCollection(
  48.             uriTemplate'/promo_codes/by_partner/export',
  49.             formats: ['csv' => ['text/csv']],
  50.             paginationEnabledfalse,
  51.             normalizationContext: ['groups' => ['promo_code_export'], 'csv_delimiter' => ';'],
  52.             security"is_granted('ROLE_ADMIN')",
  53.             filters: ['promo_code.query_filter'],
  54.             outputPromoCodeOutput::class,
  55.             name'promo_code_export_by_partner',
  56.             providerPartnerPromoCodeStatsProvider::class,
  57.         ),
  58.         new GetCollection(uriTemplate'/promo_codes/use'controllerUseAction::class, name"use_promo_code"),
  59.         new GetCollection(
  60.             uriTemplate'/promo_codes/export',
  61.             formats: ['csv' => ['text/csv']],
  62.             paginationEnabledfalse,
  63.             normalizationContext: ['groups' => ['promo_code_export'], 'csv_delimiter' => ';'],
  64.             security"is_granted('ROLE_ADMIN')",
  65.             filters: ['promo_code.query_filter''promo_code.exists_filter''soft_delete_filter'],
  66.             name'promo_code_export',
  67.             providerPromoCodeExportProvider::class
  68.         ),
  69.         new Get(security"is_granted('ROLE_ADMIN')"),
  70.         new Post(
  71.             uriTemplate'/promo_codes/import',
  72.             controllerImportAction::class,
  73.             security"is_granted('ROLE_ADMIN')",
  74.             deserializefalse,
  75.             serializefalse,
  76.         ),
  77.         new Post(security"is_granted('ROLE_ADMIN')"),
  78.         new Put(security"is_granted('ROLE_ADMIN')"),
  79.     ],
  80.     normalizationContext: ['groups' => ['promo_code_read']],
  81.     denormalizationContext: ['groups' => ['promo_code_write']],
  82. )]
  83. class PromoCode
  84. {
  85.     use Identifiable;
  86.     use Timestampable;
  87.     use SoftDeleteable;
  88.     private Collection $personPromoCodes;
  89.     /**
  90.      * @param string       $code
  91.      * @param int          $maxUsage
  92.      * @param string|null  $duration
  93.      * @param int|null     $percent
  94.      * @param Partner|null $partner
  95.      */
  96.     public function __construct(
  97.         public string $code,
  98.         public int $maxUsage,
  99.         public ?string $duration null,
  100.         public ?int $percent null,
  101.         public ?Partner $partner null,
  102.         public ?bool $singleUsePerUser false,
  103.         public ?\DateTime $startDate null,
  104.         public ?\DateTime $endDate null,
  105.     ) {
  106.         $this->personPromoCodes = new ArrayCollection();
  107.     }
  108.     public function getUsageCount(): int
  109.     {
  110.         return $this->personPromoCodes->count();
  111.     }
  112.     public function getUsageLeft(): int
  113.     {
  114.         return $this->maxUsage $this->personPromoCodes->count();
  115.     }
  116.     /**
  117.      * @return Collection
  118.      */
  119.     public function getPersonPromoCodes(): Collection
  120.     {
  121.         return $this->personPromoCodes;
  122.     }
  123.     /**
  124.      * @param Collection $personPromoCodes
  125.      */
  126.     public function setPersonPromoCodes(Collection $personPromoCodes): void
  127.     {
  128.         $this->personPromoCodes $personPromoCodes;
  129.     }
  130.     public function addPersonPromoCode(PersonPromoCode $personPromoCodes): void
  131.     {
  132.         if ($this->personPromoCodes->contains($personPromoCodes)) {
  133.             return;
  134.         }
  135.         $this->personPromoCodes->add($personPromoCodes);
  136.     }
  137.     public function removePersonPromoCode(PersonPromoCode $personPromoCodes): void
  138.     {
  139.         if (!$this->personPromoCodes->contains($personPromoCodes)) {
  140.             return;
  141.         }
  142.         $this->personPromoCodes->removeElement($personPromoCodes);
  143.     }
  144. }