AdGroup.php 8.17 KB
<?php

namespace App\Models;

use App\Models\Pivots\GoalAdGroup;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Collection;

/**
 * App\Models\AdGroup
 *
 * @property int $id
 * @property int $campaign_id
 * @property int $external_id
 * @property int $campaign_external_id
 * @property string|null $name
 * @property string|null $tracking_params
 * @property string|null $status
 * @property string|null $serving_status
 * @property string|null $type
 * @property string|null $sub_type
 * @property array|null $restricted_region_ids
 * @property array|null $region_ids
 * @property array|null $negative_keywords
 * @property array|null $negative_keyword_shared_set_ids
 * @property array|null $mobile_app_ad_group
 * @property array|null $dynamic_text_ad_group
 * @property array|null $dynamic_text_feed_ad_group
 * @property array|null $cpm_banner_user_profile_ad_group
 * @property array|null $cpm_video_ad_group
 * @property array|null $smart_ad_group
 * @property \Illuminate\Support\Carbon|null $keywords_loaded_at
 * @property \Illuminate\Support\Carbon|null $updated_self
 * @property \Illuminate\Support\Carbon|null $created_at
 * @property \Illuminate\Support\Carbon|null $updated_at
 * @property-read \App\Models\Campaigns $campaign
 * @property-read \App\Models\Campaigns|null $campaignForEnabledForManaged
 * @property-read \Illuminate\Database\Eloquent\Collection|GoalAdGroup[] $goalGroups
 * @property-read int|null $goal_groups_count
 * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Keyword[] $keywords
 * @property-read int|null $keywords_count
 * @method static Builder|AdGroup whereCpmBannerUserProfileAdGroup($value)
 * @method static Builder|AdGroup whereCpmVideoAdGroup($value)
 * @method static Builder|AdGroup whereDynamicTextAdGroup($value)
 * @method static Builder|AdGroup whereDynamicTextFeedAdGroup($value)
 * @method static Builder|AdGroup whereKeywordsLoadedAt($value)
 * @method static Builder|AdGroup whereMobileAppAdGroup($value)
 * @method static Builder|AdGroup whereSmartAdGroup($value)
 * @method static Builder|AdGroup forKeywordsLoadable()
 * @method static Builder|AdGroup forUpdatedSelf()
 * @method static Builder|AdGroup newModelQuery()
 * @method static Builder|AdGroup newQuery()
 * @method static Builder|AdGroup query()
 * @method static Builder|AdGroup whereCampaignExternalId($value)
 * @method static Builder|AdGroup whereCampaignId($value)
 * @method static Builder|AdGroup whereCreatedAt($value)
 * @method static Builder|AdGroup whereExternalId($value)
 * @method static Builder|AdGroup whereId($value)
 * @method static Builder|AdGroup whereName($value)
 * @method static Builder|AdGroup whereNegativeKeywordSharedSetIds($value)
 * @method static Builder|AdGroup whereNegativeKeywords($value)
 * @method static Builder|AdGroup whereRegionIds($value)
 * @method static Builder|AdGroup whereRestrictedRegionIds($value)
 * @method static Builder|AdGroup whereServingStatus($value)
 * @method static Builder|AdGroup whereStatus($value)
 * @method static Builder|AdGroup whereSubType($value)
 * @method static Builder|AdGroup whereTrackingParams($value)
 * @method static Builder|AdGroup whereType($value)
 * @method static Builder|AdGroup whereUpdatedSelf($value)
 * @method static Builder|AdGroup whereUpdatedAt($value)
 * @mixin \Eloquent
 */
class AdGroup extends Model
{
    use SoftDeletes;

    const STATUS_ACCEPTED = 'ACCEPTED';
    const STATUS_DRAFT = 'DRAFT';
    const STATUS_MODERATION = 'MODERATION';
    const STATUS_PREACCEPTED = 'PREACCEPTED';
    const STATUS_REJECTED = 'REJECTED';

    const SERVING_ELIGIBLE = 'ELIGIBLE';
    const SERVING_RARELY_SERVED = 'RARELY_SERVED';

    const TYPE_TEXT_AD_GROUP = 'TEXT_AD_GROUP';
    const TYPE_MOBILE_APP_AD_GROUP = 'MOBILE_APP_AD_GROUP';
    const TYPE_DYNAMIC_TEXT_AD_GROUP = 'DYNAMIC_TEXT_AD_GROUP';
    const TYPE_CPM_BANNER_AD_GROUP = 'CPM_BANNER_AD_GROUP';
    const TYPE_CPM_VIDEO_AD_GROUP = 'CPM_VIDEO_AD_GROUP';
    const TYPE_SMART_AD_GROUP = 'SMART_AD_GROUP';


    const SUB_TYPE_WEBPAGE = 'WEBPAGE';
    const SUB_TYPE_FEED = 'FEED';
    const SUB_TYPE_NONE = 'NONE';
    const SUB_TYPE_KEYWORDS = 'KEYWORDS';
    const SUB_TYPE_USER_PROFILE = 'USER_PROFILE';


    protected $fillable = [
        'campaign_id',
        'external_id',
        'campaign_external_id',
        'name',
        'region_ids',
        'negative_keywords',
        'negative_keyword_shared_set_ids',
        'tracking_params',
        'mobile_app_ad_group',
        'dynamic_text_ad_group',
        'dynamic_text_feed_ad_group',
        'cpm_banner_user_profile_ad_group',
        'cpm_video_ad_group',
        'smart_ad_group',
        'status',
        'type',
        'sub_type',
        'serving_status',
        'restricted_region_ids',
        'updated_self',
        'keywords_loaded_at',
    ];

    protected $casts = [
        'region_ids' => 'array',
        'negative_keywords' => 'json',
        'negative_keyword_shared_set_ids' => 'json',
        'mobile_app_ad_group' => 'json',
        'dynamic_text_ad_group' => 'json',
        'dynamic_text_feed_ad_group' => 'json',
        'cpm_banner_user_profile_ad_group' => 'json',
        'cpm_video_ad_group' => 'json',
        'smart_ad_group' => 'json',
        'restricted_region_ids' => 'json',
        'updated_self' => 'datetime',
        'keywords_loaded_at' => 'datetime',
    ];

    /**
     * @return Collection
     */
    static public function getPropertiesWatch()
    {
        return collect([
            'name',
            'region_ids',
            'negative_keywords',
            'negative_keyword_shared_set_ids',
            'tracking_params',
            'mobile_app_ad_group',
            'dynamic_text_ad_group',
            'dynamic_text_feed_ad_group',
            'cpm_banner_user_profile_ad_group',
            'cpm_video_ad_group',
            'smart_ad_group',
        ]);
    }

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

        static::created(function (AdGroup $ad_group) {
            if ($ad_group->campaign) {
                $ad_group->campaign->copyGroupInGoalGroup();
                $ad_group->campaign->copyGroupInGoalKeyword();
            }
        });

        static::updated(function (AdGroup $ad_group) {

            if (GoalAdGroup::getPropertiesCopyWithPivot()->first(function ($property_name) use ($ad_group) {
                return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
            })) {
                if (!is_null($ad_group->campaign_id) && is_null($ad_group->getOriginal('campaign_id'))) {
                    $ad_group->campaign->copyGroupInGoalGroup();
                    $ad_group->campaign->copyGroupInGoalKeyword();
                } else {
                    $ad_group->goalGroups()->has('dictionaryCampaignSynchronized')->update(
                        GoalAdGroup::copyPropertyFromMain($ad_group)
                    );
                }
            }

            if (self::getPropertiesWatch()->first(function ($property_name) use ($ad_group) {
                return $ad_group->{$property_name} !== $ad_group->getOriginal($property_name);
            })) {
                $ad_group->goalGroups()->has('dictionaryCampaignSynchronized')->forExternal()->update([
                    'updated_need' => Carbon::now(),
                ]);
            }

        });
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeForUpdatedSelf($query)
    {
        return $query->whereNotNull("{$query->getModel()->getTable()}.updated_self");
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeForKeywordsLoadable($query)
    {
        return $query->whereNull('keywords_loaded_at');
    }

    public function goalGroups()
    {
        return $this->hasMany(GoalAdGroup::class, 'ad_group_id');
    }

    public function keywords()
    {
        return $this->hasMany(Keyword::class, 'ad_group_id');
    }

    public function campaign()
    {
        return $this->belongsTo(Campaigns::class, 'campaign_id');
    }

    public function campaignForEnabledForManaged()
    {
        return $this->campaign()->forEnabled()->forManaged();
    }

}