Advertisement.php 6.79 KB
<?php

namespace App\Models;

use App\Models\Pivots\AdvertisementAdExtension;
use App\Models\Pivots\GoalAdvertisement;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Collection;

class Advertisement 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 STATUS_UNKNOWN = 'UNKNOWN';

    const STATE_OFF = 'OFF';
    const STATE_ON = 'ON';
    const STATE_SUSPENDED = 'SUSPENDED';
    const STATE_OFF_BY_MONITORING = 'OFF_BY_MONITORING';
    const STATE_ARCHIVED = 'ARCHIVED';
    const STATE_UNKNOWN = 'UNKNOWN';

    const AGE_LABEL_0 = 'AGE_0';
    const AGE_LABEL_6 = 'AGE_6';
    const AGE_LABEL_12 = 'AGE_12';
    const AGE_LABEL_16 = 'AGE_16';
    const AGE_LABEL_18 = 'AGE_18';
    const AGE_LABEL_MONTHS_0 = 'MONTHS_0';
    const AGE_LABEL_MONTHS_1 = 'MONTHS_1';
    const AGE_LABEL_MONTHS_2 = 'MONTHS_2';
    const AGE_LABEL_MONTHS_3 = 'MONTHS_3';
    const AGE_LABEL_MONTHS_4 = 'MONTHS_4';
    const AGE_LABEL_MONTHS_5 = 'MONTHS_5';
    const AGE_LABEL_MONTHS_6 = 'MONTHS_6';
    const AGE_LABEL_MONTHS_7 = 'MONTHS_7';
    const AGE_LABEL_MONTHS_8 = 'MONTHS_8';
    const AGE_LABEL_MONTHS_9 = 'MONTHS_9';
    const AGE_LABEL_MONTHS_10 = 'MONTHS_10';
    const AGE_LABEL_MONTHS_11 = 'MONTHS_11';
    const AGE_LABEL_MONTHS_12 = 'MONTHS_12';

    const TYPE_TEXT_AD = 'TEXT_AD';
    const TYPE_MOBILE_APP_AD = 'MOBILE_APP_AD';
    const TYPE_DYNAMIC_TEXT_AD = 'DYNAMIC_TEXT_AD';
    const TYPE_IMAGE_AD = 'IMAGE_AD';
    const TYPE_CPC_VIDEO_AD = 'CPC_VIDEO_AD';
    const TYPE_CPM_BANNER_AD = 'CPM_BANNER_AD';
    const TYPE_CPM_VIDEO_AD = 'CPM_VIDEO_AD';
    const TYPE_SMART_AD = 'SMART_AD';

    const SUB_TYPE_NONE = 'NONE';
    const SUB_TYPE_TEXT_IMAGE_AD = 'TEXT_IMAGE_AD';
    const SUB_TYPE_MOBILE_APP_IMAGE_AD = 'MOBILE_APP_IMAGE_AD';
    const SUB_TYPE_MOBILE_APP_CPC_VIDEO_AD_BUILDER_AD = 'MOBILE_APP_CPC_VIDEO_AD_BUILDER_AD';
    const SUB_TYPE_TEXT_AD_BUILDER_AD = 'TEXT_AD_BUILDER_AD';
    const SUB_TYPE_MOBILE_APP_AD_BUILDER_AD = 'MOBILE_APP_AD_BUILDER_AD';


    protected $fillable = [
        'external_id',
        'campaign_external_id',
        'ad_group_external_id',
        'campaign_id',
        'ad_group_id',

        'status',
        'state',
        'status_clarification',
        'ad_categories',
        'age_label',

        'title',
        'title2',
        'text',
        'href',
        'mobile',
        'display_domain',
        'display_url_path',
        'v_card_external_id',
        'ad_image_hash',
        'sitelink_external_id',
        'display_url_path_moderation',
        'v_card_moderation',
        'site_links_moderation',
        'ad_image_moderation',
        'ad_extensions',
        'video_extension',
        'price_extension',
        'turbo_page_id',
        'turbo_page_moderation',
        'business_id',
        'prefer_v_card_over_business',

        'updated_self',
        'archived_need',
        'reserve_archive_at',
        'deleted_need',
        'reserve_delete_at',

        'deleted_at',
    ];

    protected $casts = [
        'ad_categories' => 'array',
        'mobile' => 'boolean',
        'display_url_path_moderation' => 'json',
        'v_card_moderation' => 'json',
        'site_links_moderation' => 'json',
        'ad_image_moderation' => 'json',
        'ad_extensions' => 'json',
        'video_extension' => 'json',
        'price_extension' => 'json',
        'turbo_page_moderation' => 'json',
        'prefer_v_card_over_business' => 'boolean',
        'archived_need' => 'datetime',
        'reserve_archive_at' => 'datetime',
        'deleted_need' => 'datetime',
        'reserve_delete_at' => 'datetime',
    ];

    /**
     * @return Collection
     */
    static public function getPropertiesWatch()
    {
        return collect([
            'age_label',

            'title',
            'title2',
            'text',
            'href',
            'display_url_path',
            'v_card_external_id',
            'ad_image_hash',
            'sitelink_external_id',
            'ad_extensions',
            'video_extension',
            'price_extension',
            'turbo_page_id',
            'business_id',
            'prefer_v_card_over_business',
        ]);
    }

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

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeForArchived($query)
    {
        return $query->where('state', Advertisement::STATE_ARCHIVED);
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeForNotArchived($query)
    {
        return $query->where('state', '!=', Advertisement::STATE_ARCHIVED);
    }

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeNeedArchived($query)
    {
        return $query->whereNotNull('archived_need');
    }

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

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

    /**
     * @param Builder $query
     * @return Builder
     */
    public function scopeNeedDeleted($query)
    {
        return $query->whereNotNull('deleted_need');
    }

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

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

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

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

    public function goalAdvertisements()
    {
        return $this->hasMany(GoalAdvertisement::class, 'advertisement_id');
    }

    public function adExtensions()
    {
        return $this->belongsToMany(AdExtension::class, AdvertisementAdExtension::getModel()->getTable(), 'advertisement_id', 'ad_extension_id')
            ->using(AdvertisementAdExtension::class)
            ->withPivot(AdvertisementAdExtension::getWithPivot())
            ->withTimestamps();
    }

    public function errors()
    {
        return $this->morphMany(YandexError::class, 'cause');
    }

}