src/Bidcoz/Bundle/CoreBundle/Entity/Organization.php line 1064

Open in your IDE?
  1. <?php
  2. namespace Bidcoz\Bundle\CoreBundle\Entity;
  3. use Bidcoz\Bundle\CoreBundle\Constants;
  4. use Bidcoz\Bundle\CoreBundle\Entity\PaymentGateway\Account\Account;
  5. use Bidcoz\Bundle\CoreBundle\Entity\PaymentGateway\Account\OrganizationAccount;
  6. use Bidcoz\Bundle\CoreBundle\Entity\PaymentGateway\PaymentGateway;
  7. use Doctrine\Common\Collections\ArrayCollection;
  8. use Doctrine\ORM\Mapping as ORM;
  9. use JMS\Serializer\Annotation as Serialize;
  10. use Symfony\Component\Validator\Constraints as Assert;
  11. use Symfony\Component\Validator\Context\ExecutionContextInterface;
  12. /**
  13.  * @ORM\Entity(repositoryClass="OrganizationRepository")
  14.  * @ORM\Table(
  15.  *      name="organizations",
  16.  *      uniqueConstraints={
  17.  *          @ORM\UniqueConstraint(name="organization_slug_uk",columns={"slug"})
  18.  *      },
  19.  * )
  20.  * @Serialize\ExclusionPolicy("all")
  21.  */
  22. class Organization implements Themeable\JsonSerializable
  23. {
  24.     const BIDCOZ_ORG_ID 1;
  25.     const PAYMENT_MODEL_BIDCOZ       'bidcoz';
  26.     const PAYMENT_MODEL_ORGANIZATION 'organization';
  27.     const DEFAULT_MANDRILL_SUBACCOUNT 'default';
  28.     const CAUSEPILOT_TWILIO_ACCOUNT   'causepilot';
  29.     /**
  30.      * @ORM\Id
  31.      * @ORM\Column(name="id", type="integer")
  32.      * @ORM\GeneratedValue(strategy="AUTO")
  33.      */
  34.     protected $id;
  35.     /**
  36.      * @ORM\Column(name="name", type="text")
  37.      * @Assert\NotBlank
  38.      * @Assert\Length(min=3)
  39.      * @Serialize\Expose
  40.      * @Serialize\Groups({"Default", "API"})
  41.      */
  42.     protected $name;
  43.     /**
  44.      * @ORM\Column(name="slug", type="string", length=50);
  45.      * @Assert\NotBlank
  46.      * @Assert\Regex(pattern="/^[0-9a-z-]+$/i", message="Organization URL can only contain lower-case letters, numbers and dashes")
  47.      * @Assert\Length(min=3)
  48.      * @Serialize\Expose
  49.      * @Serialize\Groups({"Default", "API"})
  50.      */
  51.     protected $slug;
  52.     /**
  53.      * @ORM\OneToMany(targetEntity="Campaign", mappedBy="organization")
  54.      */
  55.     protected $campaigns;
  56.     /**
  57.      * @ORM\Column(name="active", type="boolean");
  58.      */
  59.     protected $active true;
  60.     /**
  61.      * @ORM\Column(name="approved", type="boolean");
  62.      */
  63.     protected $approved false;
  64.     /**
  65.      * @ORM\Column(name="enterprise", type="boolean");
  66.      */
  67.     protected $enterprise false;
  68.     /**
  69.      * @ORM\Column(name="directory_only", type="boolean");
  70.      */
  71.     protected $directoryOnly false;
  72.     /**
  73.      * @ORM\Column(name="tin", type="string", nullable=true);
  74.      * @Serialize\Expose
  75.      */
  76.     protected $tin;
  77.     /**
  78.      * @var \Bidcoz\Bundle\CoreBundle\Entity\PaymentPlan
  79.      * @ORM\ManyToOne(targetEntity="Bidcoz\Bundle\CoreBundle\Entity\PaymentPlan")
  80.      * @ORM\JoinColumn(name="payment_model", referencedColumnName="id", nullable=false)
  81.      * @Assert\NotNull
  82.      */
  83.     protected $paymentModel;
  84.     /**
  85.      * @var \DateTime
  86.      * @ORM\Column(name="payment_plan_expires_at", type="datetime", nullable=true)
  87.      */
  88.     protected $paymentPlanExpiresAt;
  89.     /**
  90.      * @ORM\OneToMany(targetEntity="Bidcoz\Bundle\CoreBundle\Entity\PaymentGateway\Account\OrganizationAccount", mappedBy="organization")
  91.      * @Assert\Valid
  92.      */
  93.     protected $paymentGatewayAccounts;
  94.     /**
  95.      * @ORM\OneToMany(targetEntity="OrganizationAdmin", mappedBy="organization")
  96.      */
  97.     protected $admins;
  98.     /**
  99.      * @ORM\Embedded(class="Theme", columnPrefix="org_")
  100.      * @Assert\Valid
  101.      */
  102.     protected ?Theme $theme null;
  103.     /**
  104.      * @ORM\ManyToOne(targetEntity="Image")
  105.      * @ORM\JoinColumn(name="banner_image_id", referencedColumnName="id", onDelete="SET NULL")
  106.      * @Serialize\Expose
  107.      */
  108.     protected ?Image $bannerImage null;
  109.     /**
  110.      * @ORM\ManyToOne(targetEntity="Image")
  111.      * @ORM\JoinColumn(name="logo_image_id", referencedColumnName="id", onDelete="SET NULL")
  112.      * @Serialize\Expose
  113.      */
  114.     protected ?Image $logo null;
  115.     /**
  116.      * @ORM\Column(name="trial_countdown_date", type="datetime")
  117.      * @Serialize\Expose
  118.      */
  119.     protected $trialCountdownDate;
  120.     /**
  121.      * @ORM\Column(name="url_editable_until", type="datetime")
  122.      */
  123.     protected $urlEditableUntil;
  124.     /**
  125.      * @ORM\Column(name="created_at", type="datetime")
  126.      * @Serialize\Expose
  127.      */
  128.     protected $createdAt;
  129.     /**
  130.      * @ORM\Column(name="admin_org", type="boolean");
  131.      */
  132.     protected $adminOrg false;
  133.     /**
  134.      * @ORM\Column(name="stripe_address_check", type="boolean");
  135.      */
  136.     protected $stripeAddressCheck false;
  137.     /**
  138.      * @ORM\Column(name="mandrill_subaccount", type="string", length=50, nullable=true);
  139.      */
  140.     protected $mandrillAccount self::DEFAULT_MANDRILL_SUBACCOUNT;
  141.     /**
  142.      * @ORM\Column(name="currency", type="string", length=3);
  143.      */
  144.     protected $currency 'USD';
  145.     /**
  146.      * @var Address
  147.      *
  148.      * @ORM\Embedded(class= "Bidcoz\Bundle\CoreBundle\Entity\Address", columnPrefix=false)
  149.      * @Assert\Valid
  150.      */
  151.     protected $address;
  152.     /**
  153.      * @ORM\Column(name="phone", type="string", nullable=true);
  154.      * @Serialize\Expose
  155.      */
  156.     protected $phone;
  157.     /**
  158.      * @ORM\Column(name="contact_name", type="string", nullable=true);
  159.      * @Assert\Length(max=255)
  160.      * @Serialize\Expose
  161.      */
  162.     protected $contactName;
  163.     /**
  164.      * @ORM\Column(name="contact_email", type="string", nullable=true);
  165.      * @Assert\Length(max=255)
  166.      * @Assert\Email()
  167.      * @Serialize\Expose
  168.      */
  169.     protected $contactEmail;
  170.     // Not mapped, a hack around the registration form
  171.     protected $acceptTerms;
  172.     /**
  173.      * @ORM\Column(type="string", length=128, nullable=true, name="directory_city")
  174.      * @Assert\NotBlank(groups={"Directory"})
  175.      * @Assert\Length(max=128, groups={"Directory"})
  176.      */
  177.     protected $directoryCity;
  178.     public static $directoryCities = [
  179.         'Nashville' => 'Nashville',
  180.         //'Knoxville'   => 'Knoxville',
  181.         //'Memphis'     => 'Memphis',
  182.         //'Chattanooga' => 'Chattanooga',
  183.     ];
  184.     /**
  185.      * @ORM\Column(type="string", length=2, nullable=true, name="directory_state")
  186.      * @Assert\NotBlank(groups={"Directory"})
  187.      */
  188.     protected $directoryState;
  189.     public static $directoryStates = [
  190.         'Tennessee' => 'TN',
  191.     ];
  192.     public static $directoryCityStates = [
  193.         'Nashville TN' => 'TN-Nashville',
  194.         'New York NY'  => 'NY-New York',
  195.     ];
  196.     /**
  197.      * @ORM\Column(type="string", length=50, nullable=true, name="directory_category")
  198.      * @Assert\NotBlank(groups={"Directory"})
  199.      */
  200.     protected $directoryCategory;
  201.     public static $directoryCategories = [
  202.         'Arts, Culture and Humanities' => 'arts',
  203.         'Education and Research'       => 'education',
  204.         'Environment and Animals'      => 'environment',
  205.         'Health'                       => 'health',
  206.         'Human Services'               => 'human-services',
  207.         'International'                => 'international',
  208.         'Public, Societal Benefit'     => 'society',
  209.         'Religion'                     => 'religion',
  210.         'Unknown'                      => 'unknown',
  211.     ];
  212.     /**
  213.      * @ORM\Column(type="string", length=300, nullable=true, name="directory_description")
  214.      * @Assert\NotBlank(groups={"Directory"})
  215.      */
  216.     protected $directoryDescription;
  217.     /**
  218.      * @ORM\Column(type="string", length=100, nullable=true, name="directory_url")
  219.      * @Assert\NotBlank(groups={"Directory"})
  220.      */
  221.     protected $directoryUrl;
  222.     /**
  223.      * @ORM\Column(type="boolean", nullable=false, name="directory_enabled", options={"default" = true})
  224.      * @Assert\NotBlank(groups={"Directory"})
  225.      */
  226.     protected $directoryEnabled false;
  227.     /**
  228.      * @ORM\Column(name="notes", type="text", nullable=true);
  229.      */
  230.     protected $notes;
  231.     /**
  232.      * @ORM\Column(name="allowed_contacts", type="integer")
  233.      */
  234.     protected $allowedContacts 5000;
  235.     /**
  236.      * @ORM\Column(name="no_payment_gateway_required", type="boolean", options={"default"= false});
  237.      */
  238.     protected $paymentGatewayNotRequired false;
  239.     /**
  240.      * @ORM\Column(name="kindful_token", length=64, type="string", nullable=true);
  241.      */
  242.     protected $kindfulToken;
  243.     /**
  244.      * @ORM\Column(name="stripe_subscription_id", type="string", nullable=true, length=50);
  245.      */
  246.     protected $stripeSubscriptionId;
  247.     /**
  248.      * @ORM\ManyToOne(targetEntity="Bidcoz\Bundle\CoreBundle\Entity\CreditCard")
  249.      * @ORM\JoinColumn(name="card_id", referencedColumnName="id", onDelete="SET NULL")
  250.      */
  251.     protected $creditCard;
  252.     /**
  253.      * @ORM\ManyToOne(targetEntity="Bidcoz\Bundle\CoreBundle\Entity\TwilioAccount")
  254.      * @ORM\JoinColumn(name="twilio_account", referencedColumnName="id", nullable=false)
  255.      * @Assert\NotNull
  256.      */
  257.     protected $twilioAccount;
  258.     /**
  259.      * @ORM\ManyToOne(targetEntity="Bidcoz\Bundle\CoreBundle\Entity\Pricing")
  260.      * @ORM\JoinColumn(name="pricing", referencedColumnName="id", nullable=false)
  261.      * @Assert\NotNull
  262.      */
  263.     protected $pricing;
  264.     /**
  265.      * @ORM\Column(type="string", length=100, nullable=true, name="web_address")
  266.      */
  267.     protected $webAddress;
  268.     /**
  269.      * @ORM\ManyToOne(targetEntity="Bidcoz\Bundle\CoreBundle\Entity\TaxCertificate", cascade={"remove"})
  270.      * @ORM\JoinColumn(name="tax_certificate_id", referencedColumnName="id")
  271.      * @Serialize\Expose
  272.      */
  273.     protected $taxCertificate;
  274.     public function __construct()
  275.     {
  276.         $this->campaigns              = new ArrayCollection();
  277.         $this->paymentGatewayAccounts = new ArrayCollection();
  278.         $this->admins                 = new ArrayCollection();
  279.         $this->theme                  = new Theme();
  280.         // Set trial countdown to now since we don't really want a trial.
  281.         // $this->trialCountdownDate     = new \DateTime('+7 days');
  282.         $this->trialCountdownDate     = new \DateTime();
  283.         $this->urlEditableUntil       = new \DateTime('+7 days');
  284.         $this->createdAt              = new \DateTime();
  285.         $this->paymentPlanExpiresAt   = new \DateTime('+1 year');
  286.     }
  287.     public function __clone()
  288.     {
  289.         $this->id              null;
  290.         $this->mandrillAccount self::DEFAULT_MANDRILL_SUBACCOUNT;
  291.     }
  292.     public function setId($id)
  293.     {
  294.         $this->id $id;
  295.     }
  296.     public function getId()
  297.     {
  298.         return $this->id;
  299.     }
  300.     public function setName($name)
  301.     {
  302.         $this->name $name;
  303.     }
  304.     public function getName()
  305.     {
  306.         return $this->name;
  307.     }
  308.     public function setSlug($slug)
  309.     {
  310.         $this->slug $slug;
  311.     }
  312.     public function ensureSlugLowercase()
  313.     {
  314.         $this->slug strtolower($this->slug);
  315.     }
  316.     public function getSlug()
  317.     {
  318.         return $this->slug;
  319.     }
  320.     public function getCampaigns($activeOnly false$returnLocked true)
  321.     {
  322.         if ($activeOnly) {
  323.             return $this->campaigns->filter(function (Campaign $campaign) use ($returnLocked) {
  324.                 if (!$returnLocked && $campaign->isLocked()) {
  325.                     return false;
  326.                 }
  327.                 return $campaign->isActive();
  328.             });
  329.         } else {
  330.             return $this->campaigns;
  331.         }
  332.     }
  333.     public function getAdminSortedCampaigns()
  334.     {
  335.         $campaigns $this->campaigns->toArray();
  336.         usort($campaigns, function (Campaign $aCampaign $b) {
  337.             if ($a->isHidden() != $b->isHidden()) {
  338.                 return $a->isHidden() ? : -1;
  339.             }
  340.             if ($a->isLocked() != $b->isLocked()) {
  341.                 return $a->isLocked() ? : -1;
  342.             }
  343.             return $a->getName() <=> $b->getName();
  344.         });
  345.         return $campaigns;
  346.     }
  347.     public function getCampaignBySlug($slug)
  348.     {
  349.         foreach ($this->getCampaigns() as $campaign) {
  350.             if ($campaign->getSlug() === $slug) {
  351.                 return $campaign;
  352.             }
  353.         }
  354.     }
  355.     public function setActive($active)
  356.     {
  357.         $this->active $active;
  358.     }
  359.     public function isActive()
  360.     {
  361.         return $this->active;
  362.     }
  363.     public function setStripeAddressCheck($stripeAddressCheck)
  364.     {
  365.         $this->stripeAddressCheck $stripeAddressCheck;
  366.     }
  367.     public function isStripeAddressCheck()
  368.     {
  369.         return $this->stripeAddressCheck;
  370.     }
  371.     public function setApproved($approved)
  372.     {
  373.         $this->approved $approved;
  374.     }
  375.     public function isApproved()
  376.     {
  377.         return $this->approved;
  378.     }
  379.     public function setDirectoryOnly($directoryOnly)
  380.     {
  381.         $this->directoryOnly $directoryOnly;
  382.     }
  383.     public function isDirectoryOnly()
  384.     {
  385.         return $this->directoryOnly;
  386.     }
  387.     public function setTin($tin)
  388.     {
  389.         $this->tin $tin;
  390.     }
  391.     public function getTin()
  392.     {
  393.         return $this->tin;
  394.     }
  395.     public function setPaymentModel($paymentModel)
  396.     {
  397.         $this->paymentModel $paymentModel;
  398.     }
  399.     public function getPaymentModel()
  400.     {
  401.         return $this->paymentModel;
  402.     }
  403.     public function setPaymentPlanExpiresAt($paymentPlanExpiresAt)
  404.     {
  405.         $this->paymentPlanExpiresAt $paymentPlanExpiresAt;
  406.     }
  407.     public function getPaymentPlanExpiresAt()
  408.     {
  409.         return $this->paymentPlanExpiresAt;
  410.     }
  411.     public function getDaysTillExpiration()
  412.     {
  413.         if (!$this->paymentPlanExpiresAt) {
  414.             return;
  415.         }
  416.         $now  = new \DateTime();
  417.         $diff $now->diff($this->paymentPlanExpiresAt);
  418.         if ($diff->invert) {
  419.             return 0;
  420.         }
  421.         return $diff->days;
  422.     }
  423.     public function getDaysTillTrialExpiration()
  424.     {
  425.         if (!$this->trialCountdownDate) {
  426.             return;
  427.         }
  428.         $now  = new \DateTime();
  429.         $diff $now->diff($this->trialCountdownDate);
  430.         if ($diff->invert) {
  431.             return 0;
  432.         }
  433.         return $diff->days;
  434.     }
  435.     public function isPaymentPlanExpiring(): bool
  436.     {
  437.         return null !== $this->paymentPlanExpiresAt;
  438.     }
  439.     public function isPaymentPlanExpired(): bool
  440.     {
  441.         $now = new \DateTime();
  442.         return null == $this->paymentPlanExpiresAt || ($this->isPaymentPlanExpiring() && $now $this->getPaymentPlanExpiresAt());
  443.     }
  444.     public function setStripeSubscriptionId(?string $subscriptionId)
  445.     {
  446.         $this->stripeSubscriptionId $subscriptionId;
  447.     }
  448.     public function getStripeSubscriptionId(): ?string
  449.     {
  450.         return $this->stripeSubscriptionId;
  451.     }
  452.     public function setCreditCard(CreditCard $cc)
  453.     {
  454.         $this->creditCard $cc;
  455.     }
  456.     public function getCreditCard(): ?CreditCard
  457.     {
  458.         return $this->creditCard;
  459.     }
  460.     public function isStripeAllowed(): bool
  461.     {
  462.         return true;
  463.     }
  464.     public function getPaymentModelName()
  465.     {
  466.         return $this->paymentModel->getName();
  467.     }
  468.     public function getPaymentGatewayChoices()
  469.     {
  470.         return [
  471. //            'PayPal' => PaymentGateway::PAYPAL,
  472.             'Stripe' => PaymentGateway::STRIPE,
  473.         ];
  474.     }
  475.     public function clearPaymentGatewayAccounts()
  476.     {
  477.         $this->paymentGatewayAccounts = new ArrayCollection();
  478.     }
  479.     public function addPaymentGatewayAccount(OrganizationAccount $account)
  480.     {
  481.         if (!$this->paymentGatewayAccounts->contains($account)) {
  482.             $this->paymentGatewayAccounts->add($account);
  483.         }
  484.     }
  485.     public function hasPaymentGatewayAccount(Account $account)
  486.     {
  487.         return $this->paymentGatewayAccounts->exists(function ($index$orgAccount) use ($account) {
  488.             return $account == $orgAccount->getAccount();
  489.         });
  490.     }
  491.     public function hasPaymentGatewayAccountType($type)
  492.     {
  493.         return $this->paymentGatewayAccounts->exists(function ($index$orgAccount) use ($type) {
  494.             return $orgAccount->getAccount()->getType() == $type;
  495.         });
  496.     }
  497.     public function getPaymentGatewayAccount($type)
  498.     {
  499.         $orgAccount $this->paymentGatewayAccounts->filter(function ($orgAccount) use ($type) {
  500.             return $orgAccount->getAccount()->getType() == $type;
  501.         })->first();
  502.         if ($orgAccount) {
  503.             return $orgAccount->getAccount();
  504.         }
  505.     }
  506.     public function getPaymentGatewayAccounts()
  507.     {
  508.         return $this->paymentGatewayAccounts;
  509.     }
  510.     /**
  511.      * @Assert\IsTrue(message="You must connect to Stripe to accept payments.", groups={"payment"})
  512.      */
  513.     public function hasPaymentGateway(): bool
  514.     {
  515.         if ($this->paymentGatewayNotRequired) {
  516.             return true;
  517.         }
  518.         if ($this->isStripeAllowed()) {
  519.             return (bool) $this->getPaymentGatewayAccount(Account::STRIPE);
  520.         } else {
  521.             return count($this->getPaymentGatewayAccounts()) > 0;
  522.         }
  523.     }
  524.     public function setTheme(?Theme $theme)
  525.     {
  526.         $this->theme $theme;
  527.     }
  528.     public function getTheme()
  529.     {
  530.         return $this->theme;
  531.     }
  532.     public function setBannerImage(?Image $image)
  533.     {
  534.         $this->bannerImage $image;
  535.     }
  536.     public function removeBannerImage()
  537.     {
  538.         $this->bannerImage null;
  539.     }
  540.     public function getBannerImage()
  541.     {
  542.         return $this->bannerImage;
  543.     }
  544.     public function setLogo(?Image $image null)
  545.     {
  546.         $this->logo $image;
  547.     }
  548.     public function getLogo()
  549.     {
  550.         return $this->logo;
  551.     }
  552.     public function removeLogo()
  553.     {
  554.         $this->logo null;
  555.     }
  556.     public function setTrialCountdownDate(\DateTime $trialCountdownDate)
  557.     {
  558.         $this->trialCountdownDate $trialCountdownDate;
  559.     }
  560.     public function getTrialCountdownDate()
  561.     {
  562.         return $this->trialCountdownDate;
  563.     }
  564.     public function getUrlEditableUntil()
  565.     {
  566.         return $this->urlEditableUntil;
  567.     }
  568.     public function setUrlEditableUntil($urlEditableUntil)
  569.     {
  570.         $this->urlEditableUntil $urlEditableUntil;
  571.     }
  572.     public function isUrlEditable()
  573.     {
  574.         $now = new \DateTime();
  575.         return $now $this->urlEditableUntil;
  576.     }
  577.     public function getCreatedAt()
  578.     {
  579.         return $this->createdAt;
  580.     }
  581.     public function setAcceptTerms($acceptTerms)
  582.     {
  583.         $this->acceptTerms $acceptTerms;
  584.     }
  585.     /**
  586.      * @Assert\IsTrue(message="You must accept the Organization (non-profit) Terms of Use")
  587.      */
  588.     public function getAcceptTerms()
  589.     {
  590.         return $this->acceptTerms;
  591.     }
  592.     public function setAdminOrg($adminOrg)
  593.     {
  594.         $this->adminOrg $adminOrg;
  595.     }
  596.     public function isAdminOrg()
  597.     {
  598.         return $this->adminOrg;
  599.     }
  600.     public function setMandrillAccount($account)
  601.     {
  602.         $this->mandrillAccount $account;
  603.     }
  604.     public function getMandrillAccount()
  605.     {
  606.         return $this->mandrillAccount;
  607.     }
  608.     public function isDefaultSubaccount()
  609.     {
  610.         return self::DEFAULT_MANDRILL_SUBACCOUNT == $this->mandrillAccount;
  611.     }
  612.     public function setCurrency($currency)
  613.     {
  614.         $this->currency $currency;
  615.     }
  616.     public function getCurrency()
  617.     {
  618.         return $this->currency;
  619.     }
  620.     public static function getCurrencyChoices()
  621.     {
  622.         return array_flip([
  623.             'USD' => 'US Dollar ($)',
  624.             'SGD' => 'Singapore Dollar ($)',
  625.             'AUD' => 'Australian Dollar ($)',
  626.             'NZD' => 'New Zealand Dollar ($)',
  627.         ]);
  628.     }
  629.     public function getCurrencyDisplay(): string
  630.     {
  631.         return array_flip(self::getCurrencyChoices())[$this->currency];
  632.     }
  633.     public function setAddress(Address $address)
  634.     {
  635.         $this->address $address;
  636.     }
  637.     public function getAddress()
  638.     {
  639.         return $this->address;
  640.     }
  641.     public function setPhone($phone)
  642.     {
  643.         $this->phone $phone;
  644.     }
  645.     public function getPhone()
  646.     {
  647.         return $this->phone;
  648.     }
  649.     public function setContactName($contactName)
  650.     {
  651.         $this->contactName $contactName;
  652.     }
  653.     public function getContactName()
  654.     {
  655.         return $this->contactName;
  656.     }
  657.     public function setContactEmail($contactEmail)
  658.     {
  659.         $this->contactEmail $contactEmail;
  660.     }
  661.     public function getContactEmail()
  662.     {
  663.         return $this->contactEmail;
  664.     }
  665.     /**
  666.      * @Assert\Callback
  667.      */
  668.     public function isReservedSlug(ExecutionContextInterface $context)
  669.     {
  670.         if (in_array($this->slug$this->getReservedSlugs()) || !preg_match('#'.Constants::RESERVED_SLUG_REGEX.'#'$this->slug)) {
  671.             $context->buildViolation('This is a reserved url.')
  672.                 ->atPath('slug')
  673.                 ->addViolation();
  674.             return true;
  675.         }
  676.         return false;
  677.     }
  678.     public static function getReservedSlugs()
  679.     {
  680.         $strLen   strlen(Constants::RESERVED_SLUG_REGEX);
  681.         $lastWord strpos(Constants::RESERVED_SLUG_REGEX'))');
  682.         $slugStr  substr(Constants::RESERVED_SLUG_REGEX6, ($strLen $lastWord) * -1);
  683.         return array_merge(explode('|'$slugStr), [
  684.             'organization',
  685.             'manage',
  686.             'home',
  687.             'login_check',
  688.             'dashboard',
  689.             'account',
  690.             'legal',
  691.             'payment',
  692.             'terms',
  693.             'email',
  694.             'admin',
  695.             'login',
  696.         ]);
  697.     }
  698.     public function setNotes(string $notes)
  699.     {
  700.         $this->notes $notes;
  701.     }
  702.     public function getNotes()
  703.     {
  704.         return $this->notes;
  705.     }
  706.     public function setAllowedContacts(int $allowedContacts)
  707.     {
  708.         $this->allowedContacts $allowedContacts;
  709.     }
  710.     public function getAllowedContacts(): int
  711.     {
  712.         return $this->allowedContacts ?: 1000;
  713.     }
  714.     public function getCustomDomain()
  715.     {
  716.         if ('nvidia' === $this->slug) {
  717.             return 'nvidia.causepilot.com';
  718.         } elseif ('chg' === $this->slug) {
  719.             return 'chg.causepilot.com';
  720.         }
  721.     }
  722.     public function isAuctionItemShareable(): bool
  723.     {
  724.         return !$this->isEnterprise();
  725.     }
  726.     public function getKindfulToken()
  727.     {
  728.         return $this->kindfulToken;
  729.     }
  730.     public function setKindfulToken($token)
  731.     {
  732.         $this->kindfulToken $token;
  733.     }
  734.     public function setPricing(Pricing $pricing)
  735.     {
  736.         $this->pricing $pricing;
  737.     }
  738.     public function getPricing(): Pricing
  739.     {
  740.         return $this->pricing;
  741.     }
  742.     public function getAdmins(): ArrayCollection
  743.     {
  744.         return $this->admins;
  745.     }
  746.     public function setAdmins(ArrayCollection $admins): Organization
  747.     {
  748.         $this->admins $admins;
  749.         return $this;
  750.     }
  751.     /**
  752.      * @return mixed
  753.      */
  754.     public function getDirectoryCity()
  755.     {
  756.         return $this->directoryCity;
  757.     }
  758.     /**
  759.      * @param mixed $directoryCity
  760.      *
  761.      * @return Organization
  762.      */
  763.     public function setDirectoryCity($directoryCity)
  764.     {
  765.         $this->directoryCity $directoryCity;
  766.         return $this;
  767.     }
  768.     /**
  769.      * @return mixed
  770.      */
  771.     public function getDirectoryState()
  772.     {
  773.         return $this->directoryState;
  774.     }
  775.     /**
  776.      * @param mixed $directoryState
  777.      *
  778.      * @return Organization
  779.      */
  780.     public function setDirectoryState($directoryState)
  781.     {
  782.         $this->directoryState $directoryState;
  783.         return $this;
  784.     }
  785.     /**
  786.      * @return mixed
  787.      */
  788.     public function getDirectoryCategory()
  789.     {
  790.         return $this->directoryCategory;
  791.     }
  792.     /**
  793.      * @param mixed $directoryCategory
  794.      *
  795.      * @return Organization
  796.      */
  797.     public function setDirectoryCategory($directoryCategory)
  798.     {
  799.         $this->directoryCategory $directoryCategory;
  800.         return $this;
  801.     }
  802.     /**
  803.      * @return mixed
  804.      */
  805.     public function getDirectoryDescription()
  806.     {
  807.         return $this->directoryDescription;
  808.     }
  809.     /**
  810.      * @param mixed $directoryDescription
  811.      *
  812.      * @return Organization
  813.      */
  814.     public function setDirectoryDescription($directoryDescription)
  815.     {
  816.         $this->directoryDescription $directoryDescription;
  817.         return $this;
  818.     }
  819.     /**
  820.      * @return mixed
  821.      */
  822.     public function getDirectoryUrl()
  823.     {
  824.         return $this->directoryUrl;
  825.     }
  826.     /**
  827.      * @param mixed $directoryUrl
  828.      *
  829.      * @return Organization
  830.      */
  831.     public function setDirectoryUrl($directoryUrl)
  832.     {
  833.         $this->directoryUrl $directoryUrl;
  834.         return $this;
  835.     }
  836.     public function isDirectoryEnabled(): bool
  837.     {
  838.         return $this->directoryEnabled;
  839.     }
  840.     public function setDirectoryEnabled(bool $directoryEnabled): Organization
  841.     {
  842.         $this->directoryEnabled $directoryEnabled;
  843.         return $this;
  844.     }
  845.     public function setTwilioAccount(TwilioAccount $twilioAccount)
  846.     {
  847.         $this->twilioAccount $twilioAccount;
  848.     }
  849.     public function getTwilioAccount(): TwilioAccount
  850.     {
  851.         return $this->twilioAccount;
  852.     }
  853.     public function isEnterprise(): bool
  854.     {
  855.         return $this->enterprise;
  856.     }
  857.     public function setEnterprise(bool $enterprise)
  858.     {
  859.         $this->enterprise $enterprise;
  860.     }
  861.     public function getWebAddress()
  862.     {
  863.         return $this->webAddress;
  864.     }
  865.     public function setWebAddress(string $webAddress)
  866.     {
  867.         $this->webAddress $webAddress;
  868.     }
  869.     public function getTaxCertificate()
  870.     {
  871.         return $this->taxCertificate;
  872.     }
  873.     public function setTaxCertificate($certificate)
  874.     {
  875.         $this->taxCertificate $certificate;
  876.     }
  877.     public function jsonSerialize()
  878.     {
  879.         return [
  880.             'name'                 => $this->getName(),
  881.             'logo'                 => $this->getLogo(),
  882.             'directoryCity'        => $this->getDirectoryCity(),
  883.             'directoryState'       => $this->getDirectoryState(),
  884.             'directoryCategory'    => $this->getDirectoryCategory(),
  885.             'directoryDescription' => $this->getDirectoryDescription(),
  886.             'directoryUrl'         => $this->getDirectoryUrl(),
  887.             'directoryEnabled'     => $this->isDirectoryEnabled(),
  888.         ];
  889.     }
  890. }