Tokens.php 14.1 KB
<?php

namespace App\Models;

use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdExtension;
use App\Models\Pivots\GoalAdImage;
use App\Models\Pivots\GoalNegativeKeywordSharedSet;
use App\Models\Pivots\GoalRetargetinglist;
use App\Models\Pivots\GoalSitelink;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;

/**
 * App\Models\Tokens
 *
 * @property int $id
 * @property string $token
 * @property string $login
 * @property string $api
 * @property string|null $type
 * @property int $created_by
 * @property \Illuminate\Support\Carbon|null $check_changes
 * @property \Illuminate\Support\Carbon $check_changes_at
 * @property \Illuminate\Support\Carbon|null $check_changes_campaign
 * @property \Illuminate\Support\Carbon $check_changes_campaign_at
 * @property \Illuminate\Support\Carbon|null $check_changes_ad_group
 * @property \Illuminate\Support\Carbon $check_changes_ad_group_at
 * @property \Illuminate\Support\Carbon $check_changes_ad_extension
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property int $limit
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Campaigns[] $campaigns
 * @property-read int|null $campaigns_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $campaignsAdGroups
 * @property-read int|null $campaigns_ad_groups_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $campaignsForEnabledAdGroupsForUpdatedSelf
 * @property-read int|null $campaigns_for_enabled_ad_groups_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Campaigns[] $campaignsNotEnabledNotDisabled
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Campaigns[] $campaignsEnabledDisabled
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Campaigns[] $campaignsEnabledNotDisabledUpdatedChildren
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $cities
 * @property-read int|null $cities_count
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaigns
 * @property-read int|null $dictionary_campaigns_count
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsForExternal
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsForExternalWithTrashed
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForNotExternalForNotReserveCreate
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsNotEnabledForExternalNotDisabledForNotReserveSuspend
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternal
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalUpdated
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalDisabledForNotReserveResume
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronized
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalUpdatedNeedUpdatedForNotReserveUpdate
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf
 * @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsForManaged
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsNotForManaged
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalAdExtension[] $goalAdExtensions
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalAdExtension[] $goalAdExtensionsForNotExternalForNotReserveCreate
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalNegativeKeywordSharedSet[] $goalNegativeKeywordSharedSets
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalNegativeKeywordSharedSet[] $goalNegativeKeywordSharedSetsForNotExternalForNotReserveCreate
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Pivots\GoalNegativeKeywordSharedSet[] $goalNegativeKeywordSharedSetsForExternalForNotReserveUpdateNeedUpdated
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Limits[] $limits
 * @property-read int|null $limits_count
 * @property string|null $timestamp
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckChangesAdGroup($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckChangesCampaign($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereTimestamp($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens filter(array $filters)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens newQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens query()
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereApi($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCreatedBy($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereLimit($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereLogin($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckChanges($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckCampaign($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckAdGroup($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereToken($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereType($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Tokens whereUpdatedAt($value)
 * @mixin \Eloquent
 */
class Tokens extends Model
{
    CONST MAIN = 'main';
    CONST GOAL = 'goal';

    protected $fillable = [
        'token',
        'login',
        'type',
        'check_changes',
        'check_changes_campaign',
        'check_changes_ad_group',
        'limit',
        'retargetinglists_loaded_at'
    ];

    protected $casts = [
        'limit' => 'integer',
        'check_changes' => 'datetime',
        'check_changes_campaign' => 'datetime',
        'check_changes_ad_group' => 'datetime',
        'check_changes_ad_extension' => 'datetime',
        'retargetinglists_loaded_at' => 'datetime',
    ];

    public function getCheckChangesAtAttribute()
    {
        return $this->check_changes
            ? $this->check_changes
            : Carbon::now();
    }

    public function getCheckChangesCampaignAtAttribute()
    {
        return $this->check_changes_campaign
            ? $this->check_changes_campaign
            : Carbon::now();
    }

    public function getCheckChangesAdGroupAtAttribute()
    {
        return $this->check_changes_ad_group
            ? $this->check_changes_ad_group
            : Carbon::now();
    }

    /**
     * @param Builder $query
     * @param array $filters
     * @return Builder
     */
    public function scopeFilter($query, array $filters)
    {
        return $query->when($filters['login'] ?? null, function ($query, $search) {
            $query->where('login', 'like', '%'.$search.'%');
        })->when($filters['type'] ?? null, function ($query, $type) {
            $query->where('type', $type);
        })->when($filters['api'] ?? null, function ($query, $api) {
            $query->where('api', $api);
        });
    }

    public function isMain()
    {
        return $this->type === $this::MAIN;
    }

    public function errors()
    {
        return $this->hasMany(YandexError::class, 'token_id')
            ->orderBy('created_at', 'DESC');
    }

    public function limits()
    {
        return $this->hasMany(Limits::class, 'token', 'id')
            ->orderBy('updated_at', 'DESC');
    }

    public function campaigns()
    {
        return $this->hasMany(Campaigns::class, 'token', 'id')
            ->orderBy('updated_at', 'DESC');
    }

    public function campaignsAdGroups()
    {
        return $this->hasManyThrough(AdGroup::class, Campaigns::class, 'token', 'campaign_id');
    }

    public function campaignsForEnabledAdGroupsForUpdatedSelf()
    {
        return $this->campaignsAdGroups()->forUpdatedSelf()->where(Campaigns::getModel()->getTable() . '.enabled', true);
    }

    public function campaignsNotEnabledNotDisabled()
    {
        return $this->campaigns()->forEnabled(false)->notDisabled();
    }

    public function campaignsEnabledDisabled()
    {
        return $this->campaigns()->forEnabled()->disabled();
    }

    public function campaignsEnabledNotDisabledUpdatedChildren()
    {
        return $this->campaigns()->forEnabled()->notDisabled()->forUpdatedChildren();
    }

    public function cities()
    {
        return $this->hasMany(Dictionary::class, 'token_id', 'id')
            ->orderBy('updated_at', 'DESC');
    }

    public function dictionaryCampaigns()
    {
        return $this->hasManyThrough(DictionaryCampaign::class, Dictionary::class, 'token_id', 'dictionary_id')
            ->orderBy(DictionaryCampaign::getModel()->getTable() . '.created_at', 'ASC')
            ->orderBy(DictionaryCampaign::getModel()->getTable() . '.' . DictionaryCampaign::getModel()->getKeyName(), 'ASC');
    }

    public function dictionaryCampaignsForExternal()
    {
        return $this->dictionaryCampaigns()->forExternal();
    }

    public function dictionaryCampaignsForExternalWithTrashed()
    {
        return $this->dictionaryCampaigns()->forExternal()->withTrashed();
    }

    public function dictionaryCampaignsEnabledForExternal()
    {
        return $this->dictionaryCampaigns()->enabled()->forExternal();
    }

    public function dictionaryCampaignsEnabledForExternalUpdated()
    {
        return $this->dictionaryCampaigns()->enabled()->forExternal()->forUpdated();
    }

    public function dictionaryCampaignsEnabledForExternalUpdatedNeedUpdatedForNotReserveUpdate()
    {
        return $this->dictionaryCampaigns()->enabled()->forExternal()->forUpdated()->needUpdated()->forNotReserveUpdate();
    }

    public function dictionaryCampaignsEnabledForNotExternalForNotReserveCreateSynchronized()
    {
        return $this->dictionaryCampaigns()->enabled()->forNotExternal()->forNotReserveCreate()->synchronized();
    }

    public function dictionaryCampaignsNotEnabledForExternalNotDisabledForNotReserveSuspend()
    {
        return $this->dictionaryCampaigns()->enabled(false)->forExternal()->notDisabled()->forNotReserveSuspend();
    }

    public function dictionaryCampaignsEnabledForExternalDisabledForNotReserveResume()
    {
        return $this->dictionaryCampaigns()->enabled()->forExternal()->disabled()->forNotReserveResume();
    }

    public function dictionaryCampaignsEnabledForExternalSynchronized()
    {
        return $this->dictionaryCampaigns()->enabled()->forExternal()->synchronized();
    }

    public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf()
    {
        return $this->dictionaryCampaigns()->enabled()->forExternal()->synchronized()->forUpdatedSelf();
    }

    public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren()
    {
        return $this->dictionaryCampaigns()->enabled()->forExternal()->synchronized()->forUpdatedChildren();
    }

    public function campaignsForManaged()
    {
        return $this->campaigns()->forManaged();
    }

    public function campaignsNotForManaged()
    {
        return $this->campaigns()->forManaged(false);
    }

    public function goalAdExtensions()
    {
        return $this->hasMany(GoalAdExtension::class, 'token_id');
    }

    public function goalAdExtensionsForNotExternalForNotReserveCreate()
    {
        return $this->goalAdExtensions()->forNotExternal()->forNotReserveCreate();
    }

    public function goalNegativeKeywordSharedSets()
    {
        return $this->hasMany(GoalNegativeKeywordSharedSet::class, 'token_id');
    }

    public function goalNegativeKeywordSharedSetsForNotExternalForNotReserveCreate()
    {
        return $this->goalNegativeKeywordSharedSets()->forNotExternal()->forNotReserveCreate();
    }

    public function goalNegativeKeywordSharedSetsForExternalForNotReserveUpdateNeedUpdated()
    {
        return $this->goalNegativeKeywordSharedSets()->forExternal()->forNotReserveUpdate()->needUpdated();
    }

    public function goalSitelinks()
    {
        return $this->hasMany(GoalSitelink::class, 'token_id');
    }

    public function goalSitelinksForNotExternalForNotReserveCreate()
    {
        return $this->goalSitelinks()->forNotExternal()->forNotReserveCreate();
    }

    public function goalRetargetinglists()
    {
        return $this->hasMany(GoalRetargetinglist::class, 'token_id');
    }

    public function goalRetargetinglistsForNotExternalForNotReserveCreate()
    {
        return $this->goalRetargetinglists()->forNotExternal()->forNotReserveCreate();
    }

    public function goalRetargetinglistsForExternalNeedDeletedForNotReserveDelete()
    {
        return $this->goalRetargetinglists()->forExternal()->needDeleted()->forNotReserveDelete();
    }

    public function goalRetargetinglistsForExternalForNotReserveUpdateNeedUpdated()
    {
        return $this->goalRetargetinglists()->forExternal()->forNotReserveUpdate()->needUpdated();
    }

    public function goalAdImages()
    {
        return $this->hasMany(GoalAdImage::class, 'token_id');
    }

    public function goalAdImagesForNotExternalForNotReserveCreate()
    {
        return $this->goalAdImages()->forNotExternal()->forNotReserveCreate();
    }

}