src/Database/Domain/Entity/User/UserMembership.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Database\Domain\Entity\User;
  3. use App\Database\Domain\Entity\AbstractEntity;
  4. use Doctrine\ORM\Mapping as ORM;
  5. use Symfony\Component\Validator\Constraints as Assert;
  6. /**
  7.  * @ORM\Entity()
  8.  */
  9. class UserMembership extends AbstractEntity
  10. {
  11.     public const SUBSCRIPTION_NONE 'none';
  12.     public const SUBSCRIPTION_STRIPE_YEARLY_PROMO 'stripe_yearly_promo';
  13.     public const SUBSCRIPTION_STRIPE_MONTHLY_STUDENTS 'stripe_monthly_students';
  14.     public const SUBSCRIPTION_STRIPE_DISCOUNT 'stripe_monthly_discount';
  15.     public const SUBSCRIPTION_STRIPE_TOAST_LIGHT_MONTHLY 'toast_light_monthly';
  16.     public const SUBSCRIPTION_STRIPE_TOAST_PRO_MONTHLY 'toast_pro_monthly';
  17.     public const SUBSCRIPTION_STRIPE_TOAST_PRO_PLUS_MONTHLY 'toast_pro_plus_monthly';
  18.     public const SUBSCRIPTION_STRIPE_TOAST_LIGHT_YEARLY 'toast_light_yearly';
  19.     public const SUBSCRIPTION_STRIPE_TOAST_PRO_YEARLY 'toast_pro_yearly';
  20.     public const SUBSCRIPTION_STRIPE_TOAST_PRO_PLUS_YEARLY 'toast_pro_plus_yearly';
  21.     public const SUBSCRIPTION_MIGRATION_TRIAL 'migration_trial'// Was given to old users before update
  22.     public const SUBSCRIPTION_APPLE 'apple'// Was given by ios subscription
  23.     public const SUBSCRIPTION_GIFT 'premium_gift'// Premium gift
  24.     public const SUBSCRIPTION_REFERRAL 'referral';
  25.     /**
  26.      * @ORM\Column(type="datetime_immutable", nullable=true)
  27.      */
  28.     private ?\DateTimeInterface $premiumExpires;
  29.     /**
  30.      * @ORM\Column(type="string", nullable=false)
  31.      *
  32.      * @Assert\Choice(choices={
  33.      *     UserMembership::SUBSCRIPTION_NONE,
  34.      *     UserMembership::SUBSCRIPTION_STRIPE_TOAST_LIGHT_MONTHLY,
  35.      *     UserMembership::SUBSCRIPTION_STRIPE_TOAST_PRO_MONTHLY,
  36.      *     UserMembership::SUBSCRIPTION_STRIPE_TOAST_PRO_PLUS_MONTHLY,
  37.      *     UserMembership::SUBSCRIPTION_STRIPE_TOAST_LIGHT_YEARLY,
  38.      *     UserMembership::SUBSCRIPTION_STRIPE_TOAST_PRO_YEARLY,
  39.      *     UserMembership::SUBSCRIPTION_STRIPE_TOAST_PRO_PLUS_YEARLY,
  40.      *     UserMembership::SUBSCRIPTION_MIGRATION_TRIAL,
  41.      *     UserMembership::SUBSCRIPTION_APPLE,
  42.      *     UserMembership::SUBSCRIPTION_GIFT,
  43.      *  }, message="Invalid subscription type")
  44.      */
  45.     private string $subscriptionType;
  46.     /**
  47.      * @ORM\Column(type="boolean")
  48.      */
  49.     private bool $allowedTrial;
  50.     /**
  51.      * @ORM\Column(type="boolean")
  52.      */
  53.     private bool $cancelledSubscription;
  54.     public function __construct(
  55.         string $id,
  56.         string $subscriptionType self::SUBSCRIPTION_NONE,
  57.         ?\DateTimeInterface $premiumExpires null,
  58.         bool $allowedTrial true,
  59.         bool $cancelledSubscription false
  60.     ) {
  61.         $this->id $id;
  62.         $this->premiumExpires $premiumExpires;
  63.         $this->allowedTrial $allowedTrial;
  64.         $this->cancelledSubscription $cancelledSubscription;
  65.         $this->subscriptionType $subscriptionType;
  66.     }
  67.     public function getPremiumExpires(): ?\DateTimeInterface
  68.     {
  69.         return $this->premiumExpires;
  70.     }
  71.     public function setPremiumExpires(?\DateTimeInterface $premiumExpires): self
  72.     {
  73.         $this->premiumExpires $premiumExpires;
  74.         return $this;
  75.     }
  76.     public function getSubscriptionType(): string
  77.     {
  78.         return $this->subscriptionType;
  79.     }
  80.     public function setSubscriptionType(string $subscriptionType): self
  81.     {
  82.         $this->subscriptionType $subscriptionType;
  83.         return $this;
  84.     }
  85.     public function isAllowedTrial(): bool
  86.     {
  87.         return $this->allowedTrial;
  88.     }
  89.     public function setAllowedTrial(bool $allowedTrial): self
  90.     {
  91.         $this->allowedTrial $allowedTrial;
  92.         return $this;
  93.     }
  94.     public function isCancelledSubscription(): bool
  95.     {
  96.         return $this->cancelledSubscription;
  97.     }
  98.     public function setCancelledSubscription(bool $cancelledSubscription): self
  99.     {
  100.         $this->cancelledSubscription $cancelledSubscription;
  101.         return $this;
  102.     }
  103.     public function isPremium(): bool
  104.     {
  105.         if (null === $this->getPremiumExpires()) {
  106.             return false;
  107.         }
  108.         return $this->getPremiumExpires()->getTimestamp() > (new \DateTimeImmutable('now'))->getTimestamp();
  109.     }
  110.     public function isMigrationTrial(): bool
  111.     {
  112.         return $this->subscriptionType === self::SUBSCRIPTION_MIGRATION_TRIAL;
  113.     }
  114.     public function isApple(): bool
  115.     {
  116.         return $this->subscriptionType === self::SUBSCRIPTION_APPLE;
  117.     }
  118.     public function isStripeYearly(): bool
  119.     {
  120.         return in_array($this->subscriptionType, [self::SUBSCRIPTION_STRIPE_TOAST_PRO_YEARLYself::SUBSCRIPTION_STRIPE_TOAST_PRO_PLUS_YEARLYself::SUBSCRIPTION_STRIPE_TOAST_LIGHT_YEARLY]);
  121.     }
  122.     public function isStripeMonthly(): bool
  123.     {
  124.         return in_array($this->subscriptionType, [self::SUBSCRIPTION_STRIPE_TOAST_PRO_MONTHLYself::SUBSCRIPTION_STRIPE_TOAST_PRO_PLUS_MONTHLYself::SUBSCRIPTION_STRIPE_TOAST_LIGHT_MONTHLY]);
  125.     }
  126.     public function isGift()
  127.     {
  128.         return $this->subscriptionType === self::SUBSCRIPTION_GIFT;
  129.     }
  130.     public static function getNonFreeMembershipTypes()
  131.     {
  132.         return [
  133.             self::SUBSCRIPTION_APPLE,
  134.             self::SUBSCRIPTION_STRIPE_MONTHLY_STUDENTS,
  135.             self::SUBSCRIPTION_STRIPE_TOAST_PRO_YEARLY,
  136.             self::SUBSCRIPTION_STRIPE_TOAST_PRO_PLUS_YEARLY,
  137.             self::SUBSCRIPTION_STRIPE_TOAST_LIGHT_YEARLY,
  138.             self::SUBSCRIPTION_STRIPE_TOAST_PRO_MONTHLY,
  139.             self::SUBSCRIPTION_STRIPE_TOAST_PRO_PLUS_MONTHLY,
  140.             self::SUBSCRIPTION_STRIPE_TOAST_LIGHT_MONTHLY,
  141.             self::SUBSCRIPTION_STRIPE_YEARLY_PROMO,
  142.         ];
  143.     }
  144.     public function isFreeSubscription(): bool
  145.     {
  146.         return !in_array($this->subscriptionType, static::getNonFreeMembershipTypes());
  147.     }
  148. }