BidModifier.php 2.85 KB
<?php

namespace App\Models;

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

class BidModifier extends Model
{
    use SoftDeletes;

    const LEVEL_CAMPAIGN = 'CAMPAIGN';
    const LEVEL_AD_GROUP = 'AD_GROUP';

    const TYPE_MOBILE_ADJUSTMENT = 'MOBILE_ADJUSTMENT';
    const TYPE_DESKTOP_ADJUSTMENT = 'DESKTOP_ADJUSTMENT';
    const TYPE_DEMOGRAPHICS_ADJUSTMENT = 'DEMOGRAPHICS_ADJUSTMENT';
    const TYPE_RETARGETING_ADJUSTMENT = 'RETARGETING_ADJUSTMENT';
    const TYPE_REGIONAL_ADJUSTMENT = 'REGIONAL_ADJUSTMENT';
    const TYPE_VIDEO_ADJUSTMENT = 'VIDEO_ADJUSTMENT';
    const TYPE_SMART_AD_ADJUSTMENT = 'SMART_AD_ADJUSTMENT';


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

        'level',
        'type',

        'mobile_adjustment',
        'desktop_adjustment',
        'demographics_adjustment',
        'retargeting_adjustment',

        'updated_self',

        'updated_at',
        'deleted_at',
    ];

    protected $casts = [
        'mobile_adjustment' => 'json',
        'desktop_adjustment' => 'json',
        'demographics_adjustment' => 'json',
        'retargeting_adjustment' => 'json',

        'updated_self' => 'datetime',
    ];

    /**
     * @return Collection
     */
    static public function getPropertiesWatch()
    {
        return collect([
            'mobile_adjustment',
            'desktop_adjustment',
            'demographics_adjustment',
            'retargeting_adjustment',
        ]);
    }

    public function getBidModifierValueAttribute()
    {
        if ($this->mobile_adjustment) {
            return $this->mobile_adjustment['BidModifier'];
        } elseif ($this->desktop_adjustment) {
            return $this->desktop_adjustment['BidModifier'];
        } elseif ($this->demographics_adjustment) {
            return $this->demographics_adjustment['BidModifier'];
        } elseif ($this->retargeting_adjustment) {
            return $this->retargeting_adjustment['BidModifier'];
        }
    }

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

    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 goalBidModifiers()
    {
        return $this->hasMany(GoalBidModifier::class, 'bid_modifier_id');
    }

}