<?php
namespace Sq\Entity\Schema\ORM;
// This is for the @ORM\ annotation namespacing.
use Carbon\Carbon;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping AS ORM;
use Sq\Entity\Schema\Column\MemberRole;
use Sq\Entity\Schema\Column\MemberSuspended;
/**
* Member.
*/
#[ORM\Entity(repositoryClass: \Sq\Service\Repository\ORM\MemberRepository::class)]
#[ORM\Table(name: 'member')]
#[ORM\Index(name: 'm_date_joined', columns: ['m_date_joined'])]
#[ORM\Index(name: 'm_last_updated', columns: ['m_last_updated'])]
#[ORM\Index(name: 'm_dob', columns: ['m_dob'])]
#[ORM\Index(name: 'm_sex', columns: ['m_sex'])]
#[ORM\Index(name: 'm_confirmed_suspended', columns: ['m_confirmed', 'm_suspended'])]
#[ORM\UniqueConstraint(name: 'm_username_UNIQUE', columns: ['m_username'])]
#[ORM\UniqueConstraint(name: 'm_email', columns: ['m_email'])]
#[ORM\UniqueConstraint(name: 'm_display_name', columns: ['m_display_name'])]
class Member
{
// a member can have 2 spam strikes - on their 3rd strike, they're locked.
public const MAX_SPAM_STRIKES_ALLOWED = 2;
/**
* @var int
*/
#[ORM\Column(name: 'm_id', type: 'integer', nullable: false, options: ['unsigned' => true])]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
* @var string
*/
#[ORM\Column(name: 'm_username', type: 'string', length: 45, nullable: false)]
private $username;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_display_name', type: 'string', length: 45, nullable: true)]
private $displayName;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_demographic', type: 'string', length: 32, nullable: true)]
private $demographic;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_first_name', type: 'string', length: 45, nullable: true)]
private $firstName;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_bill_first_name', type: 'string', length: 64, nullable: true)]
private $billFirstName;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_bill_last_name', type: 'string', length: 64, nullable: true)]
private $billLastName;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_bill_email', type: 'binary_aes_encrypted', nullable: true)]
private $billEmail;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_company', type: 'string', length: 64, nullable: true)]
private $company;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_website', type: 'string', length: 255, nullable: true)]
private $website;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_bill_country_code', type: 'string', length: 2, nullable: true)]
private $billCountryCode;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_dob', type: 'date', nullable: true)]
private $dob;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_sex', type: 'string', length: 1, nullable: true)]
private $sex;
/**
* @var bool
*/
#[ORM\Column(name: 'm_legacy_signup', type: 'boolean', nullable: false)]
private $legacySignup = false;
/**
* @var bool
*/
#[ORM\Column(name: 'm_in_overhaul', type: 'boolean', nullable: false)]
private $inOverhaul = false;
/**
* @var bool
*/
#[ORM\Column(name: 'm_allow_rollback', type: 'boolean', nullable: false, options: ['default' => '0'])]
private $allowRollbackToLegacy = false;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_date_last_migrated', type: 'datetime', nullable: true)]
private $dateLastMigrated;
/**
* @var int|null
*/
#[ORM\Column(name: 'm_role', type: 'integer', nullable: true)]
private $role = MemberRole::MEMBER;
/**
* @var bool|null
*/
#[ORM\Column(name: 'm_confirmed', type: 'boolean', nullable: true)]
private $confirmed = false;
/**
* @var string
*
* @deprecated
*/
#[ORM\Column(name: 'm_plan', type: 'string', length: 0, nullable: false, options: ['default' => 'free'])]
private $deprecatedPlan = 'free';
/**
* @var Plan
*/
#[ORM\ManyToOne(targetEntity: Plan::class)]
#[ORM\JoinColumn(name: 'm_plan_id', referencedColumnName: 'plan_id', nullable: false)]
private $plan;
/**
* @var int|null
*/
#[ORM\Column(name: 'm_plan_group', type: 'smallint', nullable: true, options: ['default' => '3', 'unsigned' => true])]
private $planGroup = 4;
/**
* @var int|null
*/
#[ORM\Column(name: 'm_addon_group', type: 'smallint', nullable: true, options: ['default' => '1', 'unsigned' => true])]
private $addonGroup = 2;
/**
* @var bool|null
*/
#[ORM\Column(name: 'm_custom_plans', type: 'boolean', nullable: true, options: ['default' => '1'])]
private $customPlans = true;
/**
* @var bool|null
*/
#[ORM\Column(name: 'm_ab_lite_plan', type: 'boolean', nullable: true, options: ['default' => '0'])]
private $litePlanAvailable = false;
/**
* @var int|null
*/
#[ORM\Column(name: 'm_home_design', type: 'integer', nullable: true, options: ['unsigned' => true])]
private $homeDesign = 11;
/**
* @var int|null
*/
#[ORM\Column(name: 'm_onboarding', type: 'smallint', nullable: true, options: ['default' => 1])]
private $onboarding = 1;
/**
* @var bool|null
*/
#[ORM\Column(name: 'm_early_upgrade_offer', type: 'boolean', nullable: true, options: ['default' => '0'])]
private $earlyUpgradeOffer = false;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_trial_plan', type: 'string', length: 255, nullable: true)]
private $trialPlan;
/**
* @var int|null
*/
#[ORM\Column(name: 'm_pricing_design', type: 'integer', nullable: true, options: ['default' => 1])]
private $pricingDesign = 2;
/**
* @var string
*/
#[ORM\Column(name: 'm_billing_cycle', type: 'string', length: 0, nullable: false, options: ['default' => 'monthly'])]
private $billingCycle = 'monthly';
/**
* @var string|null
*/
#[ORM\Column(name: 'm_currency', type: 'string', length: 3, nullable: true)]
private $currency;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_balance', type: 'decimal', precision: 15, scale: 2, nullable: true, options: ['default' => '0.00'])]
private $balance = '0.00';
/**
* @var string|null
*/
#[ORM\Column(name: 'm_subscription_id', type: 'string', length: 36, nullable: true)]
private $subscriptionId;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_sub_status', type: 'string', length: 0, nullable: true, options: ['default' => 'trial'])]
private $subStatus = 'trial';
/**
* @var \DateTimeInterface|null
*/
#[ORM\Column(name: 'm_trial_expiry_local_date', type: 'localdate', nullable: true)]
private $trialExpiryLocalDate;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_next_billing_date', type: 'date', nullable: true)]
private $nextBillingDate;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_next_bill_amount', type: 'decimal', precision: 8, scale: 2, nullable: true, options: ['default' => '0.00'])]
private $nextBillAmount = '0.00';
/**
* @deprecated
*
* @var int|null
*/
#[ORM\Column(name: 'm_active', type: 'smallint', nullable: true)]
private $active = 1;
/**
* @deprecated
*
* @var int|null
*/
#[ORM\Column(name: 'm_verified', type: 'smallint', nullable: true)]
private $verified = 0;
/**
* @var int
*/
#[ORM\Column(name: 'm_spam_strikes', type: 'integer', nullable: false)]
private $spamStrikes = 0;
/**
* @var int|null
*
* @Sq\Entity\Schema\ORM\Annotation\PostUpdate(eventName="sq.suspended_post_update")
*/
#[ORM\Column(name: 'm_suspended', type: 'integer', nullable: true)]
private $suspended = MemberSuspended::ACTIVE;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_admin_rating', type: 'string', length: 20, nullable: true)]
private $adminRating;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_password', type: 'string', length: 255, nullable: true)]
private $password;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_ref', type: 'string', length: 45, nullable: true)]
private $ref;
/**
* @var bool|null
*/
#[ORM\Column(name: 'm_ref_gift', type: 'boolean', nullable: true)]
private $refGift = '0';
/**
* @var int|null
*/
#[ORM\Column(name: 'm_views', type: 'integer', nullable: true)]
private $views = '0';
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_first_visit', type: 'datetime', nullable: true)]
private $firstVisit;
/**
* @var \DateTime
*/
#[ORM\Column(name: 'm_date_joined', type: 'datetime', nullable: false)]
private $dateJoined;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_date_activated', type: 'datetime', nullable: true)]
private $dateActivated;
/**
* @var \DateTime
*/
#[ORM\Column(name: 'm_last_login', type: 'datetime', nullable: false)]
private $lastLogin;
/**
* @var \DateTime
*/
#[ORM\Column(name: 'm_last_updated', type: 'datetime', nullable: false)]
private $lastUpdated;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_date_featured', type: 'datetime', nullable: true)]
private $dateFeatured;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_date_upgraded', type: 'datetime', nullable: true)]
private $dateUpgraded;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_news_last_visited', type: 'datetime', nullable: true, options: ['default' => '2013-01-01 00:00:00'])]
private $newsLastVisited;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_notifications_last_visited', type: 'datetime', nullable: true, options: ['default' => '2013-01-01 00:00:00'])]
private $notificationsLastVisited;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_tips_last_updated', type: 'datetime', nullable: true)]
private $tipsLastUpdated;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_news_feed_last_visited', type: 'datetime', nullable: true, options: ['default' => '2013-01-01 00:00:00'])]
private $newsFeedLastVisited;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_profile_photo_coords', type: 'string', length: 20, nullable: true)]
private $profilePhotoCoords;
/**
* @var string
*/
#[ORM\Column(name: 'm_timezone', type: 'string', length: 42, nullable: false, options: ['default' => 'UTC'])]
private $timezone = 'UTC';
/**
* @var bool|null
*/
#[ORM\Column(name: 'm_24h', type: 'boolean', nullable: true)]
private $twentyFour = '0';
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_profile_photo_updated', type: 'datetime', nullable: true)]
private $profilePhotoUpdated;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_cover_photo_coords', type: 'string', length: 20, nullable: true)]
private $coverPhotoCoords;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_cover_photo_updated', type: 'datetime', nullable: true)]
private $coverPhotoUpdated;
/**
* @var string
*/
#[ORM\Column(name: 'm_email', type: 'binary_aes_encrypted', nullable: false)]
private $email = '';
/**
* @var string
*/
#[ORM\Column(name: 'm_publishing_email', type: 'binary_aes_encrypted', nullable: false)]
private $publishingEmail = '';
/**
* @var string|null
*/
#[ORM\Column(name: 'm_sort_by', type: 'string', length: 0, nullable: true, options: ['default' => 'newest_first'])]
private $sortBy = 'newest_first';
/**
* @var int|null
*/
#[ORM\Column(name: 'm_last_site_email', type: 'smallint', nullable: true, options: ['unsigned' => true])]
private $lastSiteEmail;
/**
* @var bool
*/
#[ORM\Column(name: 'm_spam_check', type: 'boolean', nullable: false)]
private $spamCheck = true;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_profile_visibility', type: 'string', length: 0, nullable: true, options: ['default' => 'public'])]
private $profileVisibility = 'public';
/**
* @var string|null
*/
#[ORM\Column(name: 'm_age_visibility', type: 'string', length: 0, nullable: true, options: ['default' => 'public'])]
private $ageVisibility = 'public';
/**
* @var string|null
*/
#[ORM\Column(name: 'm_gender_visibility', type: 'string', length: 0, nullable: true, options: ['default' => 'public'])]
private $genderVisibility = 'public';
/**
* @var string|null
*/
#[ORM\Column(name: 'm_nsfw_visibility', type: 'string', length: 0, nullable: true, options: ['default' => 'public'])]
private $nsfwVisibility = 'public';
/**
* @var int|null
*/
#[ORM\Column(name: 'm_count_brands', type: 'smallint', nullable: true, options: ['unsigned' => true])]
private $countBrands;
/**
* @var int
*/
#[ORM\Column(name: 'm_mautic_id', type: 'integer', nullable: true, options: ['unsigned' => true])]
private $mauticId;
/**
* @var \DateTime|null
*/
#[ORM\Column(name: 'm_engagement_update', type: 'datetime', nullable: true)]
private $engagementUpdate;
#[ORM\OneToOne(targetEntity: AbArchive::class, mappedBy: 'member', cascade: ['persist'])]
private $abArchive;
#[ORM\OneToOne(targetEntity: AccountSettings::class, mappedBy: 'member', cascade: ['persist'])]
private $accountSettings;
#[ORM\OneToOne(targetEntity: MemberFlags::class, mappedBy: 'member', fetch: 'EAGER', cascade: ['persist'])]
private $flags;
#[ORM\OneToOne(targetEntity: Progress::class, mappedBy: 'member', cascade: ['persist'])]
private $progress;
#[ORM\OneToMany(targetEntity: Tour::class, mappedBy: 'member', cascade: ['persist'])]
private $tours;
#[ORM\OneToMany(targetEntity: Bitly::class, mappedBy: 'member')]
private $bitlyAccounts;
#[ORM\OneToMany(targetEntity: AndroidApp::class, mappedBy: 'member')]
private $androidApps;
#[ORM\OneToMany(targetEntity: IosApp::class, mappedBy: 'member')]
private $iosApps;
#[ORM\OneToOne(targetEntity: Business::class, mappedBy: 'member')]
private $business;
#[ORM\OneToOne(targetEntity: UTM::class, mappedBy: 'member')]
private $utm;
#[ORM\OneToMany(targetEntity: Bookmark::class, mappedBy: 'member')]
private $bookmarks;
/**
* @var Collection
*/
#[ORM\ManyToMany(targetEntity: Addons::class)]
#[ORM\JoinTable(name: 'member_addons', joinColumns: [new ORM\JoinColumn(name: 'mao_m_id', referencedColumnName: 'm_id')], inverseJoinColumns: [new ORM\JoinColumn(name: 'mao_ao_id', referencedColumnName: 'ao_id')])]
private $addons;
/**
* @var Collection
*/
#[ORM\OneToMany(targetEntity: AdminTagAssignment::class, mappedBy: 'assignedTo', orphanRemoval: true, cascade: ['persist'])]
private $adminTagAssignments;
/**
* @var bool
*/
#[ORM\Column(name: 'm_email_bounced', type: 'boolean', nullable: true)]
private $emailBounced = false;
#[ORM\OneToOne(targetEntity: LeadDynoLead::class, mappedBy: 'member', cascade: ['persist'])]
private $leadDynoLead;
#[ORM\OneToOne(targetEntity: LeadDynoAffiliate::class, mappedBy: 'member', cascade: ['persist'])]
private $leadDynoAffiliate;
/**
* @deprecated Get relationships from Organization->getMember(), and Organization->getOwner()
*
* @var LegacyAlphaMap|null
*/
#[ORM\OneToOne(targetEntity: LegacyAlphaMap::class, mappedBy: 'member', cascade: ['persist'])]
private $legacyAlphaMap;
/**
* @var string|null
*/
#[ORM\Column(name: 'm_mfa_secret', type: 'string', length: 191, nullable: true)]
private $mfaSecret;
/**
* @var Collection
*/
#[ORM\OneToMany(targetEntity: SocialProfile::class, mappedBy: 'member')]
private $socialProfiles;
/**
* @var Collection
*/
#[ORM\OneToMany(targetEntity: PostCategory::class, mappedBy: 'member')]
private $categories;
/**
* @var Organization | null
*/
#[ORM\OneToOne(targetEntity: Organization::class, mappedBy: 'legacyMember')]
private $organization;
public function __construct(
string $username,
string $email,
string $firstName,
string $timezone,
?string $countryCode,
string $billingCycle = 'monthly',
int $trialLength = 14,
?Organization $organization = null,
?\DateTimeInterface $firstVisit = null,
bool $legacySignup = false,
) {
$billingCycle = $billingCycle ?: 'monthly';
if (!in_array($billingCycle, ['yearly', 'monthly']))
{
$billingCycle = 'monthly';
}
$dateTrialExpiry = Carbon::now($timezone)->addDays($trialLength);
$this->username = $username;
$this->email = $email;
$this->firstName = $firstName;
$this->timezone = $timezone;
$this->billCountryCode = $countryCode;
$this->billingCycle = $billingCycle;
$this->organization = $organization;
$this->firstVisit = $firstVisit;
$this->legacySignup = $legacySignup;
$this->tours = new ArrayCollection();
$this->bitlyAccounts = new ArrayCollection();
$this->androidApps = new ArrayCollection();
$this->iosApps = new ArrayCollection();
$this->bookmarks = new ArrayCollection();
$this->addons = new ArrayCollection();
$this->adminTagAssignments = new ArrayCollection();
$this->socialProfiles = new ArrayCollection();
$this->categories = new ArrayCollection();
$this->accountSettings = new AccountSettings($this, false, false, false);
$this->trialExpiryLocalDate = $dateTrialExpiry;
$this->flags = (new MemberFlags($this))->setFeatures(['twitter_v2api_basic']);
$this->progress = new Progress($this);
}
public function getId(): ?int
{
return $this->id;
}
public function getOrganization(): ?Organization
{
return $this->organization;
}
/**
* True if the legacy member was previously migrated to an overhaul user, but is back to using the Legacy.
*
* @return bool
*/
public function wasOverhaulUser(): bool
{
return !$this->isInOverhaul() && $this->getDateLastMigrated() !== null;
}
/**
* @return Collection<SocialProfile>
*/
public function getSocialProfiles(): Collection
{
return $this->socialProfiles->filter(function (SocialProfile $profile): bool
{
return !$profile->isDeleted();
});
}
/**
* @return Collection<PostCategory>
*/
public function getCategories(): Collection
{
return $this->categories;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
public function getUsername(): ?string
{
return $this->username;
}
public function getDisplayName(): ?string
{
return $this->displayName;
}
public function setDisplayName(?string $displayName): self
{
$this->displayName = $displayName;
return $this;
}
public function getDemographic(): ?string
{
return $this->demographic;
}
public function setDemographic(?string $demographic): self
{
$this->demographic = $demographic;
return $this;
}
public function getFirstName(): ?string
{
return $this->firstName;
}
public function setFirstName(?string $firstName): self
{
$this->firstName = $firstName;
return $this;
}
public function getBillFirstName(): ?string
{
return $this->billFirstName;
}
public function setBillFirstName(?string $billFirstName): self
{
$this->billFirstName = $billFirstName;
return $this;
}
public function getBillLastName(): ?string
{
return $this->billLastName;
}
public function setBillLastName(?string $billLastName): self
{
$this->billLastName = $billLastName;
return $this;
}
public function getBillEmail()
{
return $this->billEmail;
}
public function setBillEmail($billEmail): self
{
$this->billEmail = $billEmail;
return $this;
}
public function getCompany(): ?string
{
return $this->company;
}
public function setCompany(?string $company): self
{
$this->company = $company;
return $this;
}
public function getWebsite(): ?string
{
return $this->website;
}
public function setWebsite(?string $website): self
{
$this->website = $website;
return $this;
}
public function getBillCountryCode(): ?string
{
return $this->billCountryCode;
}
public function setBillCountryCode(?string $billCountryCode): self
{
$this->billCountryCode = $billCountryCode;
return $this;
}
public function getDob(): ?\DateTimeInterface
{
return $this->dob;
}
public function setDob(?\DateTimeInterface $dob): self
{
$this->dob = $dob;
return $this;
}
public function getSex(): ?string
{
return $this->sex;
}
public function setSex(?string $sex): self
{
$this->sex = $sex;
return $this;
}
public function wasLegacySignup(): bool
{
return $this->legacySignup;
}
public function isInOverhaul(): bool
{
return $this->inOverhaul;
}
public function setInOverhaul(bool $inOverhaul): self
{
$this->inOverhaul = $inOverhaul;
return $this;
}
public function canRollbackToLegacy(): bool
{
return $this->allowRollbackToLegacy;
}
public function setAllowRollbackToLegacy(bool $allowRollbackToLegacy): self
{
$this->allowRollbackToLegacy = $allowRollbackToLegacy;
return $this;
}
public function getDateLastMigrated(): ?\DateTimeInterface
{
return $this->dateLastMigrated;
}
public function setDateLastMigrated(?\DateTimeInterface $dateMigrated): self
{
$this->dateLastMigrated = $dateMigrated;
return $this;
}
public function getRole(): ?int
{
return $this->role;
}
public function setRole(?int $role): self
{
$this->role = $role;
return $this;
}
public function getConfirmed(): ?bool
{
return $this->confirmed;
}
public function setConfirmed(?bool $confirmed): self
{
$this->confirmed = $confirmed;
return $this;
}
public function getPlan(): Plan
{
return $this->plan;
}
/**
* Changes plan + plan group if it's different.
*/
public function changePlan(Plan $plan): self
{
$this->plan = $plan;
if ($plan->getPlanGroup() !== null)
{
$this->planGroup = $plan->getPlanGroup()->getId();
}
return $this;
}
public function getPlanGroup(): ?int
{
return $this->planGroup;
}
public function getAddonGroup(): ?int
{
return $this->addonGroup;
}
public function setAddonGroup(?int $addonGroup): self
{
$this->addonGroup = $addonGroup;
return $this;
}
public function getCustomPlans(): ?bool
{
return $this->customPlans;
}
public function setCustomPlans(?bool $customPlans): self
{
$this->customPlans = $customPlans;
return $this;
}
public function isLitePlanAvailable(): ?bool
{
return $this->litePlanAvailable;
}
public function setLitePlanAvailable(?bool $litePlanAvailable): self
{
$this->litePlanAvailable = $litePlanAvailable;
return $this;
}
public function getHomeDesign(): ?int
{
return $this->homeDesign;
}
public function setHomeDesign(?int $homeDesign): self
{
$this->homeDesign = $homeDesign;
return $this;
}
public function getOnboarding(): ?int
{
return $this->onboarding;
}
public function setOnboarding(?int $onboarding): self
{
$this->onboarding = $onboarding;
return $this;
}
public function hasEarlyUpgradeOffer(): ?bool
{
return $this->earlyUpgradeOffer;
}
public function setEarlyUpgradeOffer(?bool $earlyUpgradeOffer): self
{
$this->earlyUpgradeOffer = $earlyUpgradeOffer;
return $this;
}
public function getTrialPlan(): ?string
{
return $this->trialPlan;
}
public function setTrialPlan(?string $trialPlan): self
{
$this->trialPlan = $trialPlan;
return $this;
}
public function getPricingDesign(): ?int
{
return $this->pricingDesign;
}
public function setPricingDesign(?int $pricingDesign): self
{
$this->pricingDesign = $pricingDesign;
return $this;
}
public function getPlanId(): int
{
return $this->plan->getId();
}
public function getBillingCycle(): ?string
{
return $this->billingCycle;
}
public function setBillingCycle(string $billingCycle): self
{
$this->billingCycle = $billingCycle;
return $this;
}
public function getCurrency(): ?string
{
return $this->currency;
}
public function setCurrency(?string $currency): self
{
$this->currency = $currency;
return $this;
}
public function getBalance(): ?string
{
return $this->balance;
}
public function setBalance(?string $balance): self
{
$this->balance = $balance;
return $this;
}
public function getSubscriptionId(): ?string
{
return $this->subscriptionId;
}
public function setSubscriptionId(?string $subscriptionId): self
{
$this->subscriptionId = $subscriptionId;
return $this;
}
public function getSubStatus(): ?string
{
return $this->subStatus;
}
public function setSubStatus(?string $subStatus): self
{
$this->subStatus = $subStatus;
return $this;
}
public function getTrialExpiryLocalDate(): ?\DateTimeInterface
{
return Carbon::instance($this->trialExpiryLocalDate)->setHour(23)->setMinute(55);
}
public function setTrialExpiryLocalDate(?\DateTimeInterface $trialExpiryLocalDate): self
{
$this->trialExpiryLocalDate = $trialExpiryLocalDate;
return $this;
}
public function getNextBillingDate(): ?\DateTimeInterface
{
return $this->nextBillingDate;
}
public function setNextBillingDate(?\DateTimeInterface $nextBillingDate): self
{
$this->nextBillingDate = $nextBillingDate;
return $this;
}
public function getNextBillAmount(): ?string
{
return $this->nextBillAmount;
}
public function setNextBillAmount(?string $nextBillAmount): self
{
$this->nextBillAmount = $nextBillAmount;
return $this;
}
public function getSpamStrikes(): int
{
return $this->spamStrikes;
}
public function setSpamStrikes(int $spamStrikes): self
{
$this->spamStrikes = $spamStrikes;
return $this;
}
public function getSuspended(): ?int
{
return $this->suspended;
}
public function setSuspended(?int $suspended): self
{
$this->suspended = $suspended;
return $this;
}
public function getAdminRating(): ?string
{
return $this->adminRating;
}
public function setAdminRating(?string $adminRating): self
{
$this->adminRating = $adminRating;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(?string $password): self
{
$this->password = $password;
return $this;
}
public function hasPasswordSet(): bool
{
return !empty($this->password);
}
public function getRef(): ?string
{
return $this->ref;
}
public function setRef(?string $ref): self
{
$this->ref = $ref;
return $this;
}
public function getRefGift(): ?bool
{
return $this->refGift;
}
public function setRefGift(?bool $refGift): self
{
$this->refGift = $refGift;
return $this;
}
public function getViews(): ?int
{
return $this->views;
}
public function setViews(?int $views): self
{
$this->views = $views;
return $this;
}
public function getFirstVisit(): ?\DateTimeInterface
{
return $this->firstVisit;
}
public function setFirstVisit(?\DateTimeInterface $firstVisit): self
{
$this->firstVisit = $firstVisit;
return $this;
}
public function getDateJoined(): ?\DateTimeInterface
{
return $this->dateJoined;
}
public function setDateJoined(\DateTimeInterface $dateJoined): self
{
$this->dateJoined = $dateJoined;
return $this;
}
public function getDateActivated(): ?\DateTimeInterface
{
return $this->dateActivated;
}
public function setDateActivated(?\DateTimeInterface $dateActivated): self
{
$this->dateActivated = $dateActivated;
return $this;
}
public function getLastLogin(): ?\DateTimeInterface
{
return $this->lastLogin;
}
public function setLastLogin(\DateTimeInterface $lastLogin): self
{
$this->lastLogin = $lastLogin;
return $this;
}
public function getLastUpdated(): ?\DateTimeInterface
{
return $this->lastUpdated;
}
public function setLastUpdated(\DateTimeInterface $lastUpdated): self
{
$this->lastUpdated = $lastUpdated;
return $this;
}
public function getDateFeatured(): ?\DateTimeInterface
{
return $this->dateFeatured;
}
public function setDateFeatured(?\DateTimeInterface $dateFeatured): self
{
$this->dateFeatured = $dateFeatured;
return $this;
}
public function getDateUpgraded(): ?\DateTimeInterface
{
return $this->dateUpgraded;
}
public function setDateUpgraded(?\DateTimeInterface $dateUpgraded): self
{
$this->dateUpgraded = $dateUpgraded;
return $this;
}
public function getNewsLastVisited(): ?\DateTimeInterface
{
return $this->newsLastVisited;
}
public function setNewsLastVisited(?\DateTimeInterface $newsLastVisited): self
{
$this->newsLastVisited = $newsLastVisited;
return $this;
}
public function getNotificationsLastVisited(): ?\DateTimeInterface
{
return $this->notificationsLastVisited;
}
public function setNotificationsLastVisited(?\DateTimeInterface $notificationsLastVisited): self
{
$this->notificationsLastVisited = $notificationsLastVisited;
return $this;
}
public function getTipsLastUpdated(): ?\DateTimeInterface
{
return $this->tipsLastUpdated;
}
public function setTipsLastUpdated(?\DateTimeInterface $tipsLastUpdated): self
{
$this->tipsLastUpdated = $tipsLastUpdated;
return $this;
}
public function getNewsFeedLastVisited(): ?\DateTimeInterface
{
return $this->newsFeedLastVisited;
}
public function setNewsFeedLastVisited(?\DateTimeInterface $newsFeedLastVisited): self
{
$this->newsFeedLastVisited = $newsFeedLastVisited;
return $this;
}
public function getProfilePhotoCoords(): ?string
{
return $this->profilePhotoCoords;
}
public function setProfilePhotoCoords(?string $profilePhotoCoords): self
{
$this->profilePhotoCoords = $profilePhotoCoords;
return $this;
}
public function getTimezone(): string
{
return $this->timezone;
}
public function setTimezone(string $timezone): self
{
$this->timezone = $timezone;
return $this;
}
public function getTwentyFour(): ?bool
{
return $this->twentyFour;
}
public function setTwentyFour(?bool $twentyFour): self
{
$this->twentyFour = $twentyFour;
return $this;
}
public function getProfilePhotoUpdated(): ?\DateTimeInterface
{
return $this->profilePhotoUpdated;
}
public function setProfilePhotoUpdated(?\DateTimeInterface $profilePhotoUpdated): self
{
$this->profilePhotoUpdated = $profilePhotoUpdated;
return $this;
}
public function getCoverPhotoCoords(): ?string
{
return $this->coverPhotoCoords;
}
public function setCoverPhotoCoords(?string $coverPhotoCoords): self
{
$this->coverPhotoCoords = $coverPhotoCoords;
return $this;
}
public function getCoverPhotoUpdated(): ?\DateTimeInterface
{
return $this->coverPhotoUpdated;
}
public function setCoverPhotoUpdated(?\DateTimeInterface $coverPhotoUpdated): self
{
$this->coverPhotoUpdated = $coverPhotoUpdated;
return $this;
}
public function getEmail()
{
return $this->email;
}
public function setEmail($email): self
{
$this->email = $email;
return $this;
}
public function getPublishingEmail()
{
return $this->publishingEmail;
}
public function setPublishingEmailmail($publishingEmail): self
{
$this->publishingEmail = $publishingEmail;
return $this;
}
public function getSortBy(): ?string
{
return $this->sortBy;
}
public function setSortBy(?string $sortBy): self
{
$this->sortBy = $sortBy;
return $this;
}
public function getLastSiteEmail(): ?int
{
return $this->lastSiteEmail;
}
public function setLastSiteEmail(?int $lastSiteEmail): self
{
$this->lastSiteEmail = $lastSiteEmail;
return $this;
}
public function isSpamCheckingEnabled(): bool
{
return $this->spamCheck;
}
public function setSpamCheckingEnabled(bool $spamCheck): self
{
$this->spamCheck = $spamCheck;
return $this;
}
public function getProfileVisibility(): ?string
{
return $this->profileVisibility;
}
public function setProfileVisibility(?string $profileVisibility): self
{
$this->profileVisibility = $profileVisibility;
return $this;
}
public function getAgeVisibility(): ?string
{
return $this->ageVisibility;
}
public function setAgeVisibility(?string $ageVisibility): self
{
$this->ageVisibility = $ageVisibility;
return $this;
}
public function getGenderVisibility(): ?string
{
return $this->genderVisibility;
}
public function setGenderVisibility(?string $genderVisibility): self
{
$this->genderVisibility = $genderVisibility;
return $this;
}
public function getNsfwVisibility(): ?string
{
return $this->nsfwVisibility;
}
public function setNsfwVisibility(?string $nsfwVisibility): self
{
$this->nsfwVisibility = $nsfwVisibility;
return $this;
}
public function getCountBrands(): ?int
{
return $this->countBrands;
}
public function setCountBrands(?int $countBrands): self
{
$this->countBrands = $countBrands;
return $this;
}
public function getEngagementUpdate(): ?\DateTimeInterface
{
return $this->engagementUpdate;
}
public function setEngagementUpdate(?\DateTimeInterface $engagementUpdate): self
{
$this->engagementUpdate = $engagementUpdate;
return $this;
}
public function setMauticId(?int $mauticId): self
{
$this->mauticId = $mauticId;
return $this;
}
public function getMauticId(): ?int
{
return $this->mauticId;
}
public function getAbArchive(): AbArchive
{
if (!$this->abArchive)
{
$abArchive = new AbArchive($this);
$this->abArchive = $abArchive;
}
return $this->abArchive;
}
public function setAbArchive(?AbArchive $abArchive): self
{
$this->abArchive = $abArchive;
return $this;
}
public function getAccountSettings(): AccountSettings
{
if (!$this->accountSettings)
{
$account_settings = new AccountSettings($this, false, false, false);
$this->accountSettings = $account_settings;
}
return $this->accountSettings;
}
public function setAccountSettings(?AccountSettings $accountSettings): self
{
$this->accountSettings = $accountSettings;
return $this;
}
public function getFlags(): MemberFlags
{
if (!$this->flags)
{
$flags = new MemberFlags($this);
$this->flags = $flags;
}
return $this->flags;
}
public function getProgress(): Progress
{
if (!$this->progress)
{
$progress = new Progress($this);
$this->progress = $progress;
}
return $this->progress;
}
public function getBitlyAccounts(): Collection
{
return $this->bitlyAccounts;
}
public function addBitlyAccount(Bitly $bitly): self
{
if (!$this->bitlyAccounts->contains($bitly))
{
$this->bitlyAccounts[] = $bitly;
}
return $this;
}
public function removeBitlyAccount(Bitly $bitly): self
{
if ($this->bitlyAccounts->contains($bitly))
{
$this->bitlyAccounts->removeElement($bitly);
}
return $this;
}
/**
* @param bool $filterConnected - true = only connected apps; false = any apps
*
* @return Collection
*/
public function getAndroidApps(bool $filterConnected = false): Collection
{
return $this->androidApps->filter(function (AndroidApp $androidApp) use ($filterConnected)
{
$isConnected = $androidApp->isConnected();
if ($filterConnected === true)
{
// only return apps that are connected correctly
return $isConnected;
}
// return all apps regardless of connection state
return true;
});
}
public function addAndroidApp(AndroidApp $androidApp): self
{
if (!$this->androidApps->contains($androidApp))
{
$this->androidApps->add($androidApp);
}
return $this;
}
public function removeAndroidApp(AndroidApp $androidApp): self
{
if ($this->androidApps->contains($androidApp))
{
$this->androidApps->removeElement($androidApp);
}
return $this;
}
/**
* @param ?bool $filterConnected - true = only connected apps; false = only disconnected apps; null = all apps
*
* @return Collection
*/
public function getIosApps(?bool $filterConnected): Collection
{
return $this->iosApps->filter(function (IosApp $iosApp) use ($filterConnected)
{
if ($filterConnected === true)
{
// only return apps that are connected correctly
return $iosApp->isConnected();
}
elseif ($filterConnected === false)
{
// only return apps that are NOT connected correctly
return !$iosApp->isConnected();
}
// return all apps regardless
return true;
});
}
public function addIosApp(IosApp $iosApp): self
{
if (!$this->iosApps->contains($iosApp))
{
$this->iosApps->add($iosApp);
}
return $this;
}
public function removeIosApp(IosApp $iosApp): self
{
if ($this->iosApps->contains($iosApp))
{
$this->iosApps->removeElement($iosApp);
}
return $this;
}
/**
* Check if the member has an iOS app capable of publishing video/carousel posts to Instagram.
*
* @return bool
*/
public function hasIosAppsThatSupportVideoCarousel(): bool
{
// currently only need to check for recent iOS apps builds.
// if we add Video/Carousel support to Android, need to change PublishMethodResolver - look up MOBILE_IOS in resolveMobilePublish() there
$iosAppsWithVideoCarouselSupport = $this->getIosApps(true)->filter(function (IosApp $iosApp)
{
// we only want apps that support video & carousel
return $iosApp->isVideoCarouselSupported();
});
return !$iosAppsWithVideoCarouselSupport->isEmpty();
}
/**
* Check if the member has an Android app capable of publishing video/carousel posts to Instagram.
*
* @return bool
*/
public function hasAndroidAppsThatSupportVideoCarousel(): bool
{
$androidAppsWithVideoCarouselSupport = $this->getAndroidApps(true)->filter(function (AndroidApp $androidApp)
{
// we only want apps that support video & carousel
return $androidApp->isVideoCarouselSupported();
});
return !$androidAppsWithVideoCarouselSupport->isEmpty();
}
/**
* Check if the member has a mobile app connected.
*
* @return bool
*/
public function isMobileAppConnected(): bool
{
return !$this->getIosApps(true)->isEmpty() || !$this->getAndroidApps(true)->isEmpty();
}
public function getBusiness(): ?Business
{
return $this->business;
}
public function setBusiness(Business $business): self
{
$this->business = $business;
return $this;
}
public function getUTM(): ?UTM
{
return $this->utm;
}
public function setUTM(?UTM $utm): self
{
$this->utm = $utm;
return $this;
}
public function getBookmarks(): Collection
{
return $this->bookmarks;
}
public function addBookmark(Bookmark $bookmark): self
{
if (!$this->bookmarks->contains($bookmark))
{
$this->bookmarks->add($bookmark);
}
return $this;
}
public function removeBookmark(Bookmark $bookmark): self
{
if ($this->bookmarks->contains($bookmark))
{
$this->bookmarks->removeElement($bookmark);
}
return $this;
}
public function getAddons(): Collection
{
return $this->addons;
}
public function addAddon(Addons $addon): self
{
if (!$this->addons->contains($addon))
{
$this->addons->add($addon);
}
return $this;
}
public function removeAddon(Addons $addon): self
{
if ($this->addons->contains($addon))
{
$this->addons->removeElement($addon);
}
return $this;
}
/**
* Fetch all admin tags assigned to member.
*/
public function getAdminTags(): Collection
{
return $this->adminTagAssignments->map(function (AdminTagAssignment $assignment): AdminTag
{
return $assignment->getAdminTag();
});
}
/**
* Add an admin tag to those assigned to member.
*
* @param AdminTag $tag
* @param Member|null $assignedBy
*/
public function addAdminTag(AdminTag $tag, ?Member $assignedBy): void
{
$this->adminTagAssignments->add(new AdminTagAssignment($tag, $this, $assignedBy, new \DateTime()));
}
/**
* Remove an admin tag from those assigned to member.
*
* @param AdminTag $tag
*/
public function removeAdminTag(AdminTag $tag): void
{
foreach ($this->adminTagAssignments as $assignment)
{
if ($assignment->getAdminTag()->getId() === $tag->getId())
{
$this->adminTagAssignments->removeElement($assignment);
}
}
}
public function hasEmailBounced(): bool
{
return $this->emailBounced ?? false;
}
public function setEmailBounced(bool $bounced): self
{
$this->emailBounced = $bounced;
return $this;
}
/**
* Get LeadDyno Affiliate object if this member has an affiliate account on LeadDyno.
*
* @return LeadDynoAffiliate
*/
public function getLeadDynoAffiliate(): ?LeadDynoAffiliate
{
return $this->leadDynoAffiliate;
}
/**
* Set a member as being a LeadDynoAffiliate.
*
* @param LeadDynoAffiliate|null $affiliate
*
* @return $this
*/
public function setLeadDynoAffiliate(?LeadDynoAffiliate $affiliate): self
{
$this->leadDynoAffiliate = $affiliate;
// set (or unset) the owning side of the relation if necessary
$newMember = null === $affiliate ? null : $this;
if ($affiliate->getMember() !== $newMember)
{
$affiliate->setMember($newMember);
}
return $this;
}
/**
* Get LeadDyno Lead object if this member was referred by a LeadDyno affiliate.
*
* @return LeadDynoLead
*/
public function getLeadDynoLead(): ?LeadDynoLead
{
return $this->leadDynoLead;
}
/**
* Get Referring Affiliate Code if this member is a LeadDyno Lead.
*
* @return string|null
*/
public function getReferringAffiliateCode(): ?string
{
$leadDynoLead = $this->leadDynoLead;
if ($leadDynoLead)
{
return $leadDynoLead->getReferringAffiliateCode();
}
return null;
}
public function setMFASecret(?string $secret): self
{
$this->mfaSecret = $secret;
return $this;
}
public function getMFASecret(): ?string
{
return $this->mfaSecret;
}
public function hasMFAEnabled(): bool
{
return !empty($this->getMFASecret());
}
/**
* Returns a string representation of the Member entity.
*
* @return string
*/
public function __toString(): string
{
return sprintf('Member #%d', $this->id);
// Customize the string representation as per your entity's properties
}
/**
* @return Collection<Tour>
*/
public function getTours(): Collection
{
return $this->tours;
}
public function addTour(Tour $tour): self
{
if (!$this->tours->contains($tour))
{
$this->tours[] = $tour;
}
return $this;
}
public function removeTour(Tour $tour): self
{
if ($this->tours->contains($tour))
{
$this->tours->removeElement($tour);
}
return $this;
}
public function skipOnboarding()
{
$this->setDateActivated(Carbon::now());
$this->getProgress()
->setSocial(true)
->setCategories(true)
->setSchedule(true)
->setImport(true)
->setQueue(true)
->setFinished(true)
->setPostStatus(true);
$newTourIds = [
201 => 201,
202 => 202,
203 => 203,
204 => 204,
];
$tours = $this->getTours();
foreach ($tours as $tour)
{
if (in_array($tour->getId(), $newTourIds))
{
unset($newTourIds[$tour->getId()]);
}
}
foreach ($newTourIds as $newTourId)
{
$tour = new Tour($this, $newTourId);
$tour->setState('seen');
$this->addTour($tour);
}
}
}