Campaigns.php 8.72 KB
<?php

namespace App\Models;

use App\Models\Pivots\DictionaryCampaignVariable;
use App\Models\Pivots\DictionaryCampaign;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

/**
 * App\Models\Campaigns
 *
 * @property int $id
 * @property int $token
 * @property int $external_id
 * @property string|null $name
 * @property string|null $time_targeting
 * @property string|null $negative_keywords
 * @property string|null $blocked_ips
 * @property string|null $excluded_sites
 * @property string|null $daily_budget
 * @property string|null $text_campaign_strategy_search
 * @property string|null $text_campaign_strategy_network
 * @property string|null $settings
 * @property string|null $counter_ids
 * @property int|null $relevant_keywords_setting_budget_percent
 * @property int|null $relevant_keywords_setting_optimize_goal_id
 * @property string|null $attribution_model
 * @property string|null $priority_goals
 * @property array $updated
 * @property string|null $updated_self
 * @property string|null $updated_children
 * @property bool $manage
 * @property bool $enabled
 * @property \Illuminate\Support\Carbon|null $groups_loaded_at
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $dictionaries
 * @property-read int|null $dictionaries_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\AdGroup[] $groups
 * @property-read int|null $groups_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaignVariables
 * @property-read int|null $dictionaryCampaignVariables_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaigns
 * @property-read int|null $dictionaryCampaigns_count
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forEnabled()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forGroupsLoadable()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forManaged()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forUpdatedSelf()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forUpdatedChildren()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns newModelQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns newQuery()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns notForEnabled()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns notForManaged()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns query()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereAttributionModel($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereBlockedIps($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereCounterIds($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereCreatedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereDailyBudget($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereEnabled($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereExcludedSites($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereExternalId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereGroupsLoadedAt($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereManage($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereName($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereNegativeKeywords($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns wherePriorityGoals($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereRelevantKeywordsSettingBudgetPercent($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereRelevantKeywordsSettingOptimizeGoalId($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereSettings($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTextCampaignStrategyNetwork($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTextCampaignStrategySearch($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereTimeTargeting($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereToken($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedSelf($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedChildren($value)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns whereUpdatedAt($value)
 * @mixin \Eloquent
 */
class Campaigns extends Model
{
    use HasFactory;

    protected $fillable = [
        'external_id',
        'token',
        'name',
        'time_targeting',
        'negative_keywords',
        'blocked_ips',
        'excluded_sites',
        'daily_budget',
        'text_campaign_strategy_search',
        'text_campaign_strategy_network',
        'settings',
        'counter_ids',
        'relevant_keywords_setting_budget_percent',
        'relevant_keywords_setting_optimize_goal_id',
        'attribution_model',
        'updated_self',
        'updated_children',
        'manage',
        'enabled',
    ];

    protected $casts = [
        'external_id' => 'int',
        'manage' => 'boolean',
        'enabled' => 'boolean',
        'groups_loaded_at' => 'datetime',
        'updated_self' => 'datetime',
        'updated_children' => 'datetime',
    ];

    public static function boot()
    {
        parent::boot();

        static::created(function(Campaigns $campaign)
        {
            if ($campaign->manage) {
                Dictionary::whereNotNull('token_id')->each(function (Dictionary $dictionary) use ($campaign) {
                    $campaign->dictionaries()->syncWithoutDetaching([
                        $dictionary->getKey() => DictionaryCampaign::copyPropertyInCampaign($campaign),
                    ]);
                });
            }
        });

        static::updated(function(Campaigns $campaign)
        {
            if ($campaign->manage !== $campaign->getOriginal('manage')) {
                if ($campaign->manage) {
                    Dictionary::whereNotNull('token_id')->each(function (Dictionary $dictionary) use ($campaign) {
                        $campaign->dictionaries()->syncWithoutDetaching([
                            $dictionary->getKey() => DictionaryCampaign::copyPropertyInCampaign($campaign),
                        ]);
                    });
                } else {
                    $campaign->dictionaries()->detach();
                }
            }
            if ($campaign->name !== $campaign->getOriginal('name')) {
                $campaign->dictionaryCampaign()->update([
                    'name' => $campaign->name,
                ]);
            }
        });

        /*
        static::deleting(function(Campaigns $campaign_delete)
        {
            $campaign_delete->dictionaries()->detach();
            $campaign_delete->groups()->delete();
        });
        */
    }

    public function groups()
    {
        return $this->hasMany(AdGroup::class, 'campaign_id');
    }

    public function dictionaryCampaigns()
    {
        return $this->hasMany(DictionaryCampaign::class, 'campaign_id');
    }

    public function dictionaryCampaignVariables()
    {
        return $this->hasManyThrough(DictionaryCampaignVariable::class, DictionaryCampaign::class, 'campaign_id', 'dictionary_campaign_id');
    }

    public function dictionaries()
    {
        return $this->belongsToMany(Dictionary::class, 'dictionary_campaigns', 'campaign_id', 'dictionary_id')
            ->using(DictionaryCampaign::class)
            ->withPivot(DictionaryCampaign::getWithPivot())
            ->withTimestamps();
    }

    public function scopeForUpdatedSelf($query)
    {
        $query->whereNotNull('updated_self');
    }

    public function scopeForUpdatedChildren($query)
    {
        $query->whereNotNull('updated_children');
    }

    public function scopeForGroupsLoadable($query)
    {
        $query->whereNull('groups_loaded_at');
    }

    public function scopeForManaged($query)
    {
        $query->where('manage', true);
    }

    public function scopeNotForManaged($query)
    {
        $query->where('manage', false);
    }

    public function scopeForEnabled($query)
    {
        $query->where('enabled', true);
    }

    public function scopeNotForEnabled($query)
    {
        $query->where('enabled', false);
    }
}