src/Domain/Entity/Person.php line 180

Open in your IDE?
  1. <?php
  2. namespace App\Domain\Entity;
  3. use ApiPlatform\Metadata\ApiProperty;
  4. use ApiPlatform\Metadata\ApiResource;
  5. use ApiPlatform\Metadata\Delete;
  6. use ApiPlatform\Metadata\Get;
  7. use ApiPlatform\Metadata\GetCollection;
  8. use ApiPlatform\Metadata\Patch;
  9. use ApiPlatform\Metadata\Post;
  10. use ApiPlatform\Metadata\Put;
  11. use App\Application\ApiResources\State\Processor\Person\FcmUpdateProcessor;
  12. use App\Application\ApiResources\State\Processor\Person\PersonLocaleUpdateProcessor;
  13. use App\Application\ApiResources\State\Processor\Person\PersonUpdateProcessor;
  14. use App\Application\ApiResources\State\Provider\MyCamperVanProvider;
  15. use App\Application\ApiResources\State\Provider\Person\PersonStatisticsCurrentMonthProvider;
  16. use App\Application\ApiResources\State\Provider\Person\PersonStatisticsProvider;
  17. use App\Application\ApiResources\State\Provider\Person\RandomPersonProvider;
  18. use App\Application\ApiResources\State\Provider\Person\RankProvider;
  19. use App\Application\ApiResources\State\Provider\Person\SubstitutePersonProvider;
  20. use App\Application\ApiResources\State\Provider\PersonStartedAtProvider;
  21. use App\Application\ApiResources\State\Provider\PremiumCheckProvider;
  22. use App\Application\Controller\Api\Person\AddGoToLogAction;
  23. use App\Application\Controller\Api\Person\AdminDeletePersonAction;
  24. use App\Application\Controller\Api\Person\DeletePersonAction;
  25. use App\Application\Controller\Api\Person\GetCurrentPersonAction;
  26. use App\Application\Controller\Api\Person\GetFavoriteBooleanAction;
  27. use App\Application\Controller\Api\Person\GetFavoriteController;
  28. use App\Application\Controller\Api\Person\GetFavoriteListController;
  29. use App\Application\Controller\Api\Person\GetFavoriteNewController;
  30. use App\Application\Controller\Api\Person\SubscriptionCheckAction;
  31. use App\Application\Controller\Api\Person\SubstituteAction;
  32. use App\Application\Dto\Person\DeletePersonInput;
  33. use App\Application\Dto\Person\FcmInput;
  34. use App\Application\Dto\Person\PersonLocaleInput;
  35. use App\Application\Dto\Person\PersonStatisticsOutput;
  36. use App\Application\Dto\Person\RankOutput;
  37. use App\Application\Service\Notification\Model\EmailableInterface;
  38. use App\Domain\Entity\Behavior\Actionable;
  39. use App\Domain\Entity\Enumeration\VehicleType;
  40. use Athome\UserBundle\Entity\User;
  41. use DateTime;
  42. use Doctrine\Common\Collections\ArrayCollection;
  43. use Doctrine\Common\Collections\Collection;
  44. use Gedmo\SoftDeleteable\Traits\SoftDeleteable;
  45. use Gedmo\Timestampable\Traits\Timestampable;
  46. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  47. /**
  48.  * Class Person
  49.  *
  50.  * @package App\Domain\Entity
  51.  */
  52. #[UniqueEntity(fields: ['email'], message'There is already an account with this email')]
  53. #[ApiResource(
  54.     operations: [
  55.         new Delete(
  56.             controllerAdminDeletePersonAction::class,
  57.             security"is_granted('ROLE_ADMIN') or object.id == user.id"
  58.         ),
  59.         new GetCollection(
  60.             uriTemplate'/people/export',
  61.             formats: ['csv' => ['text/csv']],
  62.             paginationEnabledfalse,
  63.             normalizationContext: ['groups' => ['person_export'], 'csv_delimiter' => ';'],
  64.             filters: [
  65.                 'member.query_filter',
  66.                 'person.order_filter',
  67.                 'id_search_filter',
  68.                 'soft_delete_filter',
  69.             ]
  70.         ),
  71.         new GetCollection(
  72.             uriTemplate'/people/random',
  73.             normalizationContext: ['groups' => ['trombinoscope']],
  74.             providerRandomPersonProvider::class,
  75.         ),
  76.         new GetCollection(
  77.             normalizationContext: ['groups' => ['person_list']],
  78.             filters: [
  79.                 'member.query_filter',
  80.                 'person.order_filter',
  81.                 'id_search_filter',
  82.                 'soft_delete_filter',
  83.                 'person.enabled.search_filter',
  84.                 'person_no_admin_filter',
  85.             ],
  86.         ),
  87.         new GetCollection(
  88.             uriTemplate'/people/substitute',
  89.             normalizationContext: ['groups' => ['person_list']],
  90.             security'is_granted("ROLE_ADMIN")',
  91.             filters: ['member.query_filter'],
  92.             providerSubstitutePersonProvider::class,
  93.         ),
  94.         new GetCollection(
  95.             uriTemplate'/me',
  96.             controllerGetCurrentPersonAction::class,
  97.             normalizationContext: ['groups' => ['person_read''self_person_read']],
  98.             name'current'
  99.         ),
  100.         new GetCollection(
  101.             uriTemplate'/people/favorites',
  102.             controllerGetFavoriteController::class
  103.         ),
  104.         new GetCollection(
  105.             uriTemplate'/people/favorites_list',
  106.             controllerGetFavoriteListController::class,
  107.         ),
  108.         new GetCollection(
  109.             uriTemplate'/people/favorites_new',
  110.             controllerGetFavoriteNewController::class
  111.         ),
  112.         new GetCollection(
  113.             uriTemplate'/people/favorites_boolean',
  114.             controllerGetFavoriteBooleanAction::class,
  115.         ),
  116.         new Get(),
  117.         new Get(
  118.             uriTemplate'/people/{uuid}/substitute',
  119.             controllerSubstituteAction::class,
  120.             security'is_granted("ROLE_ADMIN")'
  121.         ),
  122.         new Get(uriTemplate'/people/{uuid}/rank'outputRankOutput::class, providerRankProvider::class),
  123.         new Get(
  124.             uriTemplate'/people/{uuid}/statistics',
  125.             normalizationContext: ['groups' => ['person_statistics:read']],
  126.             outputPersonStatisticsOutput::class,
  127.             providerPersonStatisticsProvider::class
  128.         ),
  129.         new Get(
  130.             uriTemplate'/people/{uuid}/statistics/current_month',
  131.             normalizationContext: ['groups' => ['person_statistics:read']],
  132.             outputPersonStatisticsOutput::class,
  133.             providerPersonStatisticsCurrentMonthProvider::class
  134.         ),
  135.         new Get('/premium_check'providerPremiumCheckProvider::class),
  136.         new Get('/my_camper_van'security"is_granted('ROLE_USER')"providerMyCamperVanProvider::class),
  137.         new Get('/started_at'security"is_granted('ROLE_USER')"providerPersonStartedAtProvider::class),
  138.         new Post(
  139.             uriTemplate'/me/delete_account',
  140.             controllerDeletePersonAction::class,
  141.             denormalizationContext: ['groups' => ["delete_person_input_write"]],
  142.             inputDeletePersonInput::class,
  143.         ),
  144.         new Post(
  145.             uriTemplate'/subscription_check',
  146.             controllerSubscriptionCheckAction::class,
  147.         ),
  148.         new Post(
  149.             uriTemplate'/add_goto_log',
  150.             controllerAddGoToLogAction::class,
  151.         ),
  152.         new Patch(security"is_granted('ROLE_ADMIN') or object.id == user.id"),
  153.         new Put(
  154.             security"is_granted('ROLE_ADMIN') or object.id == user.id",
  155.             processorPersonUpdateProcessor::class,
  156.             validationContext: ['groups' => ['person_write']],
  157.         ),
  158.         new Put(
  159.             uriTemplate'/people/{uuid}/locale',
  160.             denormalizationContext: ['groups' => ["person_locale_input_write"]],
  161.             security"is_granted('ROLE_ADMIN') or object.id == user.id",
  162.             inputPersonLocaleInput::class,
  163.             processorPersonLocaleUpdateProcessor::class,
  164.         ),
  165.         new Put(
  166.             uriTemplate'/people/{uuid}/fcm',
  167.             denormalizationContext: ['groups' => ['person_fcm_input_write']],
  168.             security"is_granted('ROLE_ADMIN') or object.id == user.id",
  169.             inputFcmInput::class,
  170.             processorFcmUpdateProcessor::class
  171.         ),
  172.     ],
  173.     normalizationContext: ['groups' => ['person_read']],
  174.     denormalizationContext: ['groups' => ['person_write']],
  175.     order: ['id' => 'ASC']
  176. )]
  177. class Person extends User implements EmailableInterface
  178. {
  179.     use Actionable;
  180.     use SoftDeleteable;
  181.     use Timestampable;
  182.     public const AMOUNT_PREMIUM 17.99;
  183.     private Collection $favorites;
  184.     /** @var Collection<PointOfInterest> */
  185.     private Collection $references;
  186.     /** @var Collection<PointOfInterest> */
  187.     private Collection $activities;
  188.     /** @var Collection<Payment> */
  189.     private Collection $payments;
  190.     #[ApiProperty(identifiertrue)]
  191.     public string $uuid;
  192.     public mixed $newToken null;
  193.     /**
  194.      * @param Address|null     $address
  195.      * @param Media|null       $avatar
  196.      * @param DateTime|null    $birthDate
  197.      * @param int              $caras
  198.      * @param CamperVan|null   $camperVan
  199.      * @param string|null      $civility
  200.      * @param Media|null       $coverPicture
  201.      * @param int|null         $coverPosition
  202.      * @param DateTime|null    $startPremiumDate
  203.      * @param DateTime|null    $endPremiumDate
  204.      * @param string|null      $description
  205.      * @param string|null      $dtype
  206.      * @param string|null      $facebook
  207.      * @param string|null      $facebookId
  208.      * @param string|null      $familyName
  209.      * @param string|null      $givenName
  210.      * @param string|null      $googleId
  211.      * @param string|null      $instagram
  212.      * @param Newsletter|null  $newsletter
  213.      * @param bool             $privateFacebook
  214.      * @param bool             $privateInstagram
  215.      * @param string|null      $publicUrl
  216.      * @param string|null      $rate
  217.      * @param string|null      $referrer
  218.      * @param string|null      $registeredFrom
  219.      * @param DateTime|null    $startedAt
  220.      * @param string|null      $source
  221.      * @param bool             $translator
  222.      * @param string|null      $telephone
  223.      * @param array            $providers
  224.      * @param string|null      $terminal
  225.      * @param string|null      $trips
  226.      * @param VehicleType|null $vehicleType
  227.      * @param bool             $validator
  228.      * @param int|null         $contactId
  229.      * @param string           $locale
  230.      * @param string|null      $fcmId
  231.      * @param string|null      $remoteId
  232.      * @param DateTime|null    $zhistUpdate
  233.      * @param int|null         $aiOffTopicFlagCounter
  234.      * @param int|null         $aiInappropriateFlagCounter
  235.      * @param bool|null        $isPremiumSubscriptionActive
  236.      */
  237.     public function __construct(
  238.         public ?Address $address null,
  239.         public ?Media $avatar null,
  240.         public ?DateTime $birthDate null,
  241.         public int $caras 0,
  242.         public ?CamperVan $camperVan null,
  243.         public ?string $civility null,
  244.         public ?Media $coverPicture null,
  245.         public ?int $coverPosition null,
  246.         public ?DateTime $startPremiumDate null,
  247.         public ?DateTime $endPremiumDate null,
  248.         public ?string $description null,
  249.         public ?string $dtype null,
  250.         public ?string $facebook null,
  251.         public ?string $facebookId null,
  252.         public ?string $familyName null,
  253.         public ?string $givenName null,
  254.         public ?string $googleId null,
  255.         public ?string $instagram null,
  256.         public ?Newsletter $newsletter = new Newsletter(),
  257.         public bool $privateFacebook false,
  258.         public bool $privateInstagram false,
  259.         public ?string $publicUrl null,
  260.         public ?string $rate null,
  261.         public ?string $referrer null,
  262.         public ?string $registeredFrom null,
  263.         public ?DateTime $startedAt null,
  264.         public ?string $source 'web',
  265.         public bool $translator false,
  266.         public ?string $telephone null,
  267.         public array $providers = [],
  268.         public ?string $terminal null,
  269.         public ?string $trips null,
  270.         public ?VehicleType $vehicleType null,
  271.         public bool $validator false,
  272.         public ?int $contactId null,
  273.         public string $locale 'fr',
  274.         public ?string $fcmId null,
  275.         public ?string $remoteId null,
  276.         public ?DateTime $zhistUpdate null,
  277.         public ?string $oldPassword null,
  278.         public ?string $macifMemberCode null,
  279.         public ?int $aiOffTopicFlagCounter 0,
  280.         public ?int $aiInappropriateFlagCounter 0,
  281.         public ?bool $isPremiumSubscriptionActive false,
  282.         public ?bool $hasMonthlySubscription false,
  283.     ) {
  284.         parent::__construct();
  285.         $this->favorites = new ArrayCollection();
  286.         $this->references = new ArrayCollection();
  287.         $this->activities = new ArrayCollection();
  288.         $this->payments = new ArrayCollection();
  289.     }
  290.     public function getActive(): bool
  291.     {
  292.         return $this->endPremiumDate && $this->endPremiumDate >= new DateTime();
  293.     }
  294.     public function getFavorites(): Collection
  295.     {
  296.         return $this->favorites;
  297.     }
  298.     public function getFullname(): string
  299.     {
  300.         return ($this->givenName ?: '') . ' ' . ($this->familyName $this->familyName[0] . '.' '');
  301.     }
  302.     /**
  303.      * @return Collection<PointOfInterest>
  304.      */
  305.     public function getReferences(): Collection
  306.     {
  307.         return $this->references;
  308.     }
  309.     /**
  310.      * @return Collection<Payment>
  311.      */
  312.     public function getPayments(): Collection
  313.     {
  314.         return $this->payments;
  315.     }
  316.     /**
  317.      * @return Collection<Activity>
  318.      */
  319.     public function getActivities(): Collection
  320.     {
  321.         return $this->activities;
  322.     }
  323.     #[ApiProperty]
  324.     public function getFirstReference(): ?PointOfInterest
  325.     {
  326.         //return the first reference not deleted
  327.         foreach ($this->references as $reference) {
  328.             if (!$reference->isDeleted()) {
  329.                 return $reference;
  330.             }
  331.         }
  332.         return null;
  333.     }
  334.     public function getCamperVan(): ?CamperVan
  335.     {
  336.         return $this->camperVan;
  337.     }
  338.     public function getStartedAt(): ?DateTime
  339.     {
  340.         return $this->startedAt;
  341.     }
  342.     public function setOffTopicFlagCounter(int $aiOffTopicFlagCounter): void
  343.     {
  344.         $this->aiOffTopicFlagCounter $aiOffTopicFlagCounter;
  345.     }
  346.     public function getOffTopicFlagCounter(): ?int
  347.     {
  348.         return $this->aiOffTopicFlagCounter;
  349.     }
  350.     public function setInappropriateFlagCounter(int $aiInappropriateFlagCounter): void
  351.     {
  352.         $this->aiInappropriateFlagCounter $aiInappropriateFlagCounter;
  353.     }
  354.     public function getInappropriateFlagCounter(): ?int
  355.     {
  356.         return $this->aiInappropriateFlagCounter;
  357.     }
  358.     public function setPremiumSubscriptionActive(bool $isPremiumSubscriptionActive): void
  359.     {
  360.         $this->isPremiumSubscriptionActive $isPremiumSubscriptionActive;
  361.     }
  362.     public function getPremiumSubscriptionActive(): ?bool
  363.     {
  364.         return $this->isPremiumSubscriptionActive;
  365.     }
  366.     public function getNewToken(): mixed
  367.     {
  368.         return $this->newToken;
  369.     }
  370.     public function setNewToken($data): void
  371.     {
  372.         $this->newToken $data;
  373.     }
  374.     public function getHasMonthlySubscription(): ?bool
  375.     {
  376.         return $this->hasMonthlySubscription;
  377.     }
  378.     public function setHasMonthlySubscription(bool $hasMonthlySubscription): void
  379.     {
  380.         $this->hasMonthlySubscription $hasMonthlySubscription;
  381.     }
  382.     /**
  383.      * Retourne true si le user est premium aujourd'
  384.      * @return bool
  385.      */
  386.     public function isPremium(): bool
  387.     {
  388.         $today = new DateTime();
  389.         return $this->endPremiumDate && $this->endPremiumDate >= $today;
  390.     }
  391.     /**
  392.      * Retourne true si le user est inscrit plus de 24 heures et moins de 7 jours
  393.      * @return bool
  394.      */
  395.     public function isNewSubscriber(): bool
  396.     {
  397.         $yesterday = new DateTime('yesterday');
  398.         $aWeekAgo = new DateTime('7 days ago');
  399.         return $this->createdAt &&
  400.             $this->createdAt <= $yesterday &&
  401.             $this->createdAt >= $aWeekAgo;
  402.     }
  403.     /**
  404.      * Retourne true si le user est inscrit depuis plus de 90 jours et moins de 97 jours
  405.      * @return bool
  406.      */
  407.     public function isOldSubscriber(): bool
  408.     {
  409.         $minDate = new DateTime('-90 days');
  410.         $maxDate = new DateTime('-97 days');
  411.         return $this->endPremiumDate &&
  412.             $this->endPremiumDate <= $minDate &&
  413.             $this->endPremiumDate >= $maxDate;
  414.     }
  415. }