203 lines
5.5 KiB
PHP
203 lines
5.5 KiB
PHP
<?php
|
|
|
|
namespace App\Helpers;
|
|
|
|
use App\Models\Contact\Gender;
|
|
use App\Models\Account\Account;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class AccountHelper
|
|
{
|
|
/**
|
|
* Indicates whether the given account has limitations with her current
|
|
* plan.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function hasLimitations(Account $account): bool
|
|
{
|
|
if ($account->has_access_to_paid_version_for_free) {
|
|
return false;
|
|
}
|
|
|
|
if (! config('monica.requires_subscription')) {
|
|
return false;
|
|
}
|
|
|
|
if ($account->isSubscribed()) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Indicate whether an account has reached the contact limit if the account
|
|
* is on a free trial.
|
|
*
|
|
* @param Account $account
|
|
* @return bool
|
|
*/
|
|
public static function hasReachedContactLimit(Account $account): bool
|
|
{
|
|
return $account->contacts()->real()->active()->count() >= config('monica.number_of_allowed_contacts_free_account');
|
|
}
|
|
|
|
/**
|
|
* Check if the account can be downgraded, based on a set of rules.
|
|
*
|
|
* @param Account $account
|
|
* @return bool
|
|
*/
|
|
public static function canDowngrade(Account $account): bool
|
|
{
|
|
$canDowngrade = true;
|
|
$numberOfUsers = $account->users()->count();
|
|
$numberPendingInvitations = $account->invitations()->count();
|
|
$numberActiveContacts = $account->contacts()->active()->count();
|
|
|
|
// number of users in the account should be == 1
|
|
if ($numberOfUsers > 1) {
|
|
$canDowngrade = false;
|
|
}
|
|
|
|
// there should not be any pending user invitations
|
|
if ($numberPendingInvitations > 0) {
|
|
$canDowngrade = false;
|
|
}
|
|
|
|
// there should not be more than the number of contacts allowed
|
|
if ($numberActiveContacts > config('monica.number_of_allowed_contacts_free_account')) {
|
|
$canDowngrade = false;
|
|
}
|
|
|
|
return $canDowngrade;
|
|
}
|
|
|
|
/**
|
|
* Get the default gender for this account.
|
|
*
|
|
* @param Account $account
|
|
* @return string
|
|
*/
|
|
public static function getDefaultGender(Account $account): string
|
|
{
|
|
$defaultGenderType = Gender::MALE;
|
|
|
|
if ($account->default_gender_id) {
|
|
$defaultGender = Gender::where([
|
|
'account_id' => $account->id,
|
|
])->find($account->default_gender_id);
|
|
|
|
if ($defaultGender) {
|
|
$defaultGenderType = $defaultGender->type;
|
|
}
|
|
}
|
|
|
|
return $defaultGenderType;
|
|
}
|
|
|
|
/**
|
|
* Get the reminders for the month given in parameter.
|
|
* - 0 means current month
|
|
* - 1 means month+1
|
|
* - 2 means month+2...
|
|
*
|
|
* @param Account $account
|
|
* @param int $month
|
|
*/
|
|
public static function getUpcomingRemindersForMonth(Account $account, int $month)
|
|
{
|
|
$startOfMonth = now(DateHelper::getTimezone())->addMonthsNoOverflow($month)->startOfMonth();
|
|
|
|
// don't get reminders for past events:
|
|
if ($startOfMonth->isPast()) {
|
|
$startOfMonth = now(DateHelper::getTimezone());
|
|
}
|
|
|
|
$endOfMonth = now(DateHelper::getTimezone())->addMonthsNoOverflow($month)->endOfMonth();
|
|
|
|
return $account->reminderOutboxes()
|
|
->with(['reminder', 'reminder.contact'])
|
|
->whereBetween('planned_date', [$startOfMonth, $endOfMonth])
|
|
->where('nature', 'reminder')
|
|
->orderBy('planned_date', 'asc')
|
|
->get();
|
|
}
|
|
|
|
/**
|
|
* Get the number of activities grouped by year.
|
|
*
|
|
* @param Account $account
|
|
* @return Collection
|
|
*/
|
|
public static function getYearlyActivitiesStatistics(Account $account): Collection
|
|
{
|
|
$activitiesStatistics = collect([]);
|
|
$activities = $account->activities()
|
|
->select('happened_at')
|
|
->latest('happened_at')
|
|
->get();
|
|
$years = [];
|
|
|
|
foreach ($activities as $activity) {
|
|
$yearStatistic = $activity->happened_at->format('Y');
|
|
$foundInYear = false;
|
|
|
|
foreach ($years as $year => $number) {
|
|
if ($year == $yearStatistic) {
|
|
$years[$year] = $number + 1;
|
|
$foundInYear = true;
|
|
}
|
|
}
|
|
|
|
if (! $foundInYear) {
|
|
$years[$yearStatistic] = 1;
|
|
}
|
|
}
|
|
|
|
foreach ($years as $year => $number) {
|
|
$activitiesStatistics->put($year, $number);
|
|
}
|
|
|
|
return $activitiesStatistics;
|
|
}
|
|
|
|
/**
|
|
* Get the number of calls grouped by year.
|
|
*
|
|
* @return Collection
|
|
*/
|
|
public static function getYearlyCallStatistics(Account $account): Collection
|
|
{
|
|
$callsStatistics = collect([]);
|
|
$calls = $account->calls()
|
|
->select('called_at')
|
|
->latest('called_at')
|
|
->get();
|
|
$years = [];
|
|
|
|
foreach ($calls as $call) {
|
|
$yearStatistic = $call->called_at->format('Y');
|
|
$foundInYear = false;
|
|
|
|
foreach ($years as $year => $number) {
|
|
if ($year == $yearStatistic) {
|
|
$years[$year] = $number + 1;
|
|
$foundInYear = true;
|
|
}
|
|
}
|
|
|
|
if (! $foundInYear) {
|
|
$years[$yearStatistic] = 1;
|
|
}
|
|
}
|
|
|
|
foreach ($years as $year => $number) {
|
|
$callsStatistics->put($year, $number);
|
|
}
|
|
|
|
return $callsStatistics;
|
|
}
|
|
}
|