Campaigns.php 10.7 KB
<?php

namespace App\Models;

use App\Models\Pivots\DictionaryCampaignVariable;
use App\Models\Pivots\DictionaryCampaign;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Collection;

/**
 * App\Models\Campaigns
 *
 * @property int $id
 * @property int $token
 * @property int $external_id
 * @property string|null $name
 * @property array|null $time_targeting
 * @property array|null $negative_keywords
 * @property array|null $blocked_ips
 * @property array|null $excluded_sites
 * @property array|null $daily_budget
 * @property string|null $text_campaign_strategy_search
 * @property string|null $text_campaign_strategy_network
 * @property array|null $settings
 * @property array|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 array|null $priority_goals
 * @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 $dictionary_campaign_variables_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Variable[] $dictionaryCampaigns
 * @property-read int|null $dictionary_campaigns_count
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forGroupsLoadable()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forManaged($value = true)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns forEnabled($value = true)
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns notDisabled()
 * @method static \Illuminate\Database\Eloquent\Builder|Campaigns disabled()
 * @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 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',
        'priority_goals',
        'updated_self',
        'updated_children',
        'manage',
        'enabled',
        'disabled_at',
    ];

    protected $casts = [
        'external_id' => 'int',
        'time_targeting' => 'array',
        'negative_keywords' => 'array',
        'blocked_ips' => 'array',
        'settings' => 'array',
        'counter_ids' => 'array',
        'excluded_sites' => 'array',
        'daily_budget' => 'array',
        'priority_goals' => 'array',
        'groups_loaded_at' => 'datetime',
        'updated_self' => 'datetime',
        'updated_children' => 'datetime',
        'manage' => 'boolean',
        'enabled' => 'boolean',
        'disabled_at' => 'datetime',
    ];

    /**
     * @return Collection
     */
    static public function getPropertiesWatch()
    {
        return collect([
            'name',
            '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',
            'priority_goals',
        ]);
    }

    /**
     * @return array
     */
    static public function getSettingOptionsAllow()
    {
        return [
            'ADD_METRICA_TAG',
            'ADD_OPENSTAT_TAG',
            'ADD_TO_FAVORITES',
            'ENABLE_AREA_OF_INTEREST_TARGETING',
            'ENABLE_COMPANY_INFO',
            'ENABLE_SITE_MONITORING',
            'EXCLUDE_PAUSED_COMPETING_ADS',
            'MAINTAIN_NETWORK_CPC',
            'REQUIRE_SERVICING',
            'CAMPAIGN_EXACT_PHRASE_MATCHING_ENABLED',
        ];
    }

    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 (DictionaryCampaign::getPropertiesCopyWithPivot()->first(function ($property_name) use ($campaign) {
                return $campaign->{$property_name} !== $campaign->getOriginal($property_name);
            })) {
                $campaign->dictionaryCampaigns()->enabled()->synchronized()->update(
                    DictionaryCampaign::copyPropertyInCampaign($campaign)
                );
            }

            if (self::getPropertiesWatch()->first(function ($property_name) use ($campaign) {
                return $campaign->{$property_name} !== $campaign->getOriginal($property_name);
            })) {
                $campaign->dictionaryCampaigns()->enabled()->synchronized()->forExternal()->update([
                    'updated_need' => Carbon::now(),
                ]);
            }

        });
    }

    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(Builder $query)
    {
        $query->whereNotNull('updated_self');
    }

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

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

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

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

    public function scopeDisabled(Builder $query)
    {
        return $query->whereNotNull('disabled_at');
    }

    public function scopeNotDisabled(Builder $query)
    {
        return $query->whereNull('disabled_at');
    }

}