Commit fbb8704d by Vladislav

#19472 Синхронизация групп с целевыми

1 parent 95745322
......@@ -43,7 +43,10 @@ class AdGroupsAdd extends Command
public function handle()
{
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternal.groupsForNotExternal')
->with('dictionaryCampaignsEnabledForExternal.groupsForNotExternal')
->with([
'dictionaryCampaignsEnabledForExternal.groupsForNotExternal.dictionaryCampaign',
'dictionaryCampaignsEnabledForExternal.groupsForNotExternal.group',
])
->where('type', '!=', Tokens::MAIN)
->get();
......@@ -54,7 +57,8 @@ class AdGroupsAdd extends Command
$factory->getRequest('AdGroup', 'add')
->call([
'goalAdGroups' => $token->dictionaryCampaignsEnabledForExternal->pluck('groupsForNotExternal'),
'goalAdGroups' => $token->dictionaryCampaignsEnabledForExternal->pluck('groupsForNotExternal')
->collapse(),
]);
}
......
......@@ -78,15 +78,21 @@ class AdGroup extends Model
'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',
'region_ids',
'negative_keywords',
'negative_keyword_shared_set_ids',
'tracking_params',
'updated_self',
];
......@@ -94,10 +100,16 @@ class AdGroup extends Model
'campaign_id' => 'int',
'external_id' => 'int',
'campaign_external_id' => 'int',
'restricted_region_ids' => 'json',
'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',
];
......
......@@ -3,7 +3,6 @@
namespace App\Models\Pivots;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Variable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\Pivot;
......@@ -17,6 +16,7 @@ class GoalAdGroup extends Pivot
protected $fillable = [
'external_id',
'campaign_external_id',
'ad_group_id',
'dictionary_campaign_id',
'name',
'negative_keywords',
......@@ -27,9 +27,10 @@ class GoalAdGroup extends Pivot
];
protected $casts = [
'dictionary_campaign_id' => 'int',
'external_id' => 'int',
'campaign_external_id' => 'int',
'ad_group_id' => 'int',
'dictionary_campaign_id' => 'int',
'negative_keywords' => 'array',
'external_upload_at' => 'datetime',
'external_updated_at' => 'datetime',
......@@ -43,6 +44,7 @@ class GoalAdGroup extends Pivot
'id',
'external_id',
'campaign_external_id',
'ad_group_id',
'dictionary_campaign_id',
'name',
'negative_keywords',
......@@ -82,9 +84,10 @@ class GoalAdGroup extends Pivot
return [
$property_name => $value
];
})->flatMap(function ($val) {
return $val;
})->all();
})
->collapse()
->put('ad_group_id', $ad_group[AdGroup::getModel()->getKeyName()])
->all();
}
public function scopeForExternal(Builder $query)
......@@ -107,9 +110,14 @@ class GoalAdGroup extends Pivot
$query->whereNotNull('updated_self');
}
public function group()
{
return $this->belongsTo(AdGroup::class, 'ad_group_id');
}
public function dictionaryCampaign()
{
return $this->belongsTo(Campaigns::class, 'dictionary_campaign_id');
return $this->belongsTo(DictionaryCampaign::class, 'dictionary_campaign_id');
}
public function dictionaryCampaignVariables()
......
......@@ -5,6 +5,7 @@ namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Models\Variable;
use App\Service\Contract\APIRequest;
use App\Service\Requests\DirectRequest;
......@@ -15,13 +16,11 @@ use Illuminate\Support\Facades\Log;
class AddAdGroup extends DirectRequest
{
CONST MAX_COUNT = 10;
protected $max_count = 1000;
protected $timestamp;
/* @var Collection|DictionaryCampaign[] $dictionaryCampaigns */
protected $dictionaryCampaigns;
/* @var Collection|Variable[] $dictionaryCampaigns */
protected $variables;
/* @var Collection|GoalAdGroup[] */
protected $goalAdGroups;
public function call($params = null)
{
......@@ -32,7 +31,7 @@ class AddAdGroup extends DirectRequest
public function getObjectsCount()
{
return count($this->getParams()['Campaigns']);
return count($this->getParams()['AdGroups']);
}
public function slice($maxObjects): ?APIRequest
......@@ -40,11 +39,11 @@ class AddAdGroup extends DirectRequest
$splinter = $this->sliceByKey($maxObjects, 'Campaigns');
$splinter->putParams([
'dictionaryCampaigns' => $this->dictionaryCampaigns->slice($maxObjects)->values(),
'goalAdGroups' => $this->goalAdGroups->slice($maxObjects)->values(),
]);
$this->putParams([
'dictionaryCampaigns' => $this->dictionaryCampaigns->slice(0, $maxObjects),
'goalAdGroups' => $this->goalAdGroups->slice(0, $maxObjects),
]);
return $splinter;
......@@ -62,23 +61,19 @@ class AddAdGroup extends DirectRequest
$external_id = $add_result['Id'] ?? '';
if (!$external_id) {
Log::debug("AddCampaigns, empty Id");
Log::debug("AddAdGroup, empty Id");
Log::debug($add_result);
Log::debug($this->getParams());
continue;
}
$dictionaryCampaign = $this->dictionaryCampaigns->get($key);
$goalAdGroup = $this->goalAdGroups->get($key);
$dictionaryCampaign->update([
$goalAdGroup->update([
'external_id' => $external_id,
'external_upload_at' => Carbon::now(),
]);
$dictionaryCampaign->groups()->update([
'campaign_external_id' => $external_id,
]);
}
} catch (\Exception $e) {
Log::debug($e);
......@@ -87,12 +82,12 @@ class AddAdGroup extends DirectRequest
public function putParams($params)
{
$this->dictionaryCampaigns = $params['dictionaryCampaigns'];
$this->goalAdGroups = $params['goalAdGroups'];
}
private function requestPrepare($params)
{
$this->setService('Campaigns');
$this->setService('AdGroups');
$this->setMethod('add');
$this->putParams($params);
......@@ -100,77 +95,59 @@ class AddAdGroup extends DirectRequest
$variables = Variable::all();
$this->setParams([
'Campaigns' => $this->dictionaryCampaigns->map(function (DictionaryCampaign $dictionaryCampaign) use ($variables) {
'AdGroups' => $this->goalAdGroups->map(function (GoalAdGroup $goalAdGroup) use ($variables) {
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign, $variables);
$list = Variable::getListVariablesByDictionaryCampaign($goalAdGroup->dictionaryCampaign, $variables);
$data = [
'Name' => StrReplaceByVariables::getInstance($dictionaryCampaign->name, $list)->get(),
'StartDate' => Carbon::now()->format('Y-m-d'),
'TextCampaign' => [
'BiddingStrategy' => $dictionaryCampaign->campaign->bidding_strategy,
],
'Name' => StrReplaceByVariables::getInstance($goalAdGroup->name, $list)->get(),
'CampaignId' => $goalAdGroup->campaign_external_id,
'RegionIds' => $goalAdGroup->group->region_ids,
];
if ($dictionaryCampaign->campaign->priority_goals && count($dictionaryCampaign->campaign->priority_goals)) {
$data['PriorityGoals'] = $dictionaryCampaign->campaign->priority_goals;
if ($goalAdGroup->group->tracking_params) {
$data['TrackingParams'] = $goalAdGroup->group->tracking_params;
}
if ($dictionaryCampaign->campaign->daily_budget && count($dictionaryCampaign->campaign->daily_budget)) {
$data['DailyBudget'] = $dictionaryCampaign->campaign->daily_budget;
if ($goalAdGroup->group->mobile_app_ad_group && count($goalAdGroup->group->mobile_app_ad_group)) {
$data['MobileAppAdGroup'] = $goalAdGroup->group->mobile_app_ad_group;
}
if ($dictionaryCampaign->negative_keywords && count($dictionaryCampaign->negative_keywords)) {
$data['NegativeKeywords'] = [
'Items' => array_map(function ($value) use ($list) {
return StrReplaceByVariables::getInstance($value, $list)->get();
}, $dictionaryCampaign->negative_keywords),
];
if ($goalAdGroup->group->dynamic_text_ad_group && count($goalAdGroup->group->dynamic_text_ad_group)) {
$data['DynamicTextAdGroup'] = $goalAdGroup->group->dynamic_text_ad_group;
}
if ($dictionaryCampaign->campaign->blocked_ips && count($dictionaryCampaign->campaign->blocked_ips)) {
$data['BlockedIps'] = [
'Items' => $dictionaryCampaign->campaign->blocked_ips,
];
if ($goalAdGroup->group->dynamic_text_feed_ad_group && count($goalAdGroup->group->dynamic_text_feed_ad_group)) {
$data['DynamicTextFeedAdGroup'] = $goalAdGroup->group->dynamic_text_feed_ad_group;
}
if ($dictionaryCampaign->excluded_sites && count($dictionaryCampaign->excluded_sites)) {
$data['ExcludedSites'] = [
'Items' => array_map(function ($value) use ($list) {
return StrReplaceByVariables::getInstance($value, $list)->get();
}, $dictionaryCampaign->excluded_sites),
];
}
/* TODO При создании есть параметр при получении в директ нет
* $data['CpmBannerKeywordsAdGroup']
*/
if ($dictionaryCampaign->campaign->relevant_keywords) {
$data['TextCampaign']['RelevantKeywords'] = $dictionaryCampaign->campaign->relevant_keywords;
if ($goalAdGroup->group->cpm_banner_user_profile_ad_group && count($goalAdGroup->group->cpm_banner_user_profile_ad_group)) {
$data['CpmBannerUserProfileAdGroup'] = $goalAdGroup->group->cpm_banner_user_profile_ad_group;
}
if ($dictionaryCampaign->campaign->attribution_model) {
$data['TextCampaign']['AttributionModel'] = $dictionaryCampaign->campaign->attribution_model;
if ($goalAdGroup->group->cpm_video_ad_group && count($goalAdGroup->group->cpm_video_ad_group)) {
$data['CpmVideoAdGroup'] = $goalAdGroup->group->cpm_video_ad_group;
}
if ($dictionaryCampaign->campaign->settings && count($dictionaryCampaign->campaign->settings)) {
$settingsAllow = Campaigns::getSettingOptionsAllow();
$settings = [];
foreach ($dictionaryCampaign->campaign->settings as $setting) {
if (isset($setting['Option']) && in_array($setting['Option'], $settingsAllow)) {
$settings[] = $setting;
}
}
if (count($settings)) {
$data['TextCampaign']['Settings'] = $settings;
}
if ($goalAdGroup->group->smart_ad_group && count($goalAdGroup->group->smart_ad_group)) {
$data['SmartAdGroup'] = $goalAdGroup->group->smart_ad_group;
}
if ($goalAdGroup->negative_keywords && count($goalAdGroup->negative_keywords)) {
$data['NegativeKeywords'] = [
'Items' => array_map(function ($value) use ($list) {
return StrReplaceByVariables::getInstance($value, $list)->get();
}, $goalAdGroup->negative_keywords),
];
}
if ($dictionaryCampaign->campaign->counter_ids && count($dictionaryCampaign->campaign->counter_ids)) {
$data['TextCampaign']['CounterIds'] = [
'Items' => $dictionaryCampaign->campaign->counter_ids,
if ($goalAdGroup->group->negative_keyword_shared_set_ids && count($goalAdGroup->group->negative_keyword_shared_set_ids)) {
$data['NegativeKeywordSharedSetIds'] = [
'Items' => $goalAdGroup->group->negative_keyword_shared_set_ids,
];
}
......
......@@ -19,10 +19,8 @@ class AddCampaigns extends DirectRequest
protected $max_count = 10;
protected $timestamp;
/* @var Collection|DictionaryCampaign[] $dictionaryCampaigns */
/* @var Collection|DictionaryCampaign[] */
protected $dictionaryCampaigns;
/* @var Collection|Variable[] $dictionaryCampaigns */
protected $variables;
public function call($params = null)
{
......
......@@ -6,6 +6,7 @@ use App\Jobs\ProcessCallLimitedAPI;
use App\Models\AdGroup;
use App\Models\Campaigns;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Pivots\GoalAdGroup;
use App\Service\Requests\DirectRequest;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
......@@ -64,15 +65,22 @@ class GetAdGroups extends DirectRequest
'external_id' => $external_id,
'campaign_external_id' => $ad_group['CampaignId'],
'name' => $ad_group['Name'],
'region_ids' => $ad_group['RegionIds'],
'negative_keywords' => $ad_group['NegativeKeywords'],
'negative_keyword_shared_set_ids' => $ad_group['NegativeKeywordSharedSetIds'],
'tracking_params' => $ad_group['TrackingParams'],
'mobile_app_ad_group' => $ad_group['MobileAppAdGroup'] ?? null,
'dynamic_text_ad_group' => $ad_group['DynamicTextAdGroup'] ?? null,
'dynamic_text_feed_ad_group' => $ad_group['DynamicTextFeedAdGroup'] ?? null,
'cpm_banner_user_profile_ad_group' => $ad_group['CpmBannerUserProfileAdGroup'] ?? null,
'cpm_video_ad_group' => $ad_group['CpmVideoAdGroup'] ?? null,
'smart_ad_group' => $ad_group['SmartAdGroup'] ?? null,
'status' => $ad_group['Status'],
'type' => $ad_group['Type'],
'sub_type' => $ad_group['Subtype'],
'serving_status' => $ad_group['ServingStatus'],
'restricted_region_ids' => $ad_group['RestrictedRegionIds'],
'region_ids' => $ad_group['RegionIds'],
'negative_keywords' => $ad_group['NegativeKeywords'],
'negative_keyword_shared_set_ids' => $ad_group['NegativeKeywordSharedSetIds'],
'tracking_params' => $ad_group['TrackingParams'],
'updated_self' => null,
];
......@@ -82,14 +90,13 @@ class GetAdGroups extends DirectRequest
'external_id' => $external_id
], $data);
} else {
$dictionaryCampaign = DictionaryCampaign::synchronized()
->find($external_id);
$goalAdGroup = GoalAdGroup::find($external_id);
if (!$dictionaryCampaign)
if (!$goalAdGroup)
continue;
$dictionaryCampaign->update(
$dictionaryCampaign::copyPropertyFromMain($campaign_data)
$goalAdGroup->update(
$goalAdGroup::copyPropertyFromMain($data)
);
}
......
......@@ -20,7 +20,16 @@ class CreateAdGroupsTable extends Migration
$table->bigInteger('external_id')->unique();
$table->bigInteger('campaign_external_id');
$table->string('name', 255)->nullable();
$table->json('region_ids')->nullable();
$table->json('negative_keywords')->nullable();
$table->json('negative_keyword_shared_set_ids')->nullable();
$table->string('tracking_params', 255)->nullable();
$table->json('mobile_app_ad_group')->nullable();
$table->json('dynamic_text_ad_group')->nullable();
$table->json('dynamic_text_feed_ad_group')->nullable();
$table->json('cpm_banner_user_profile_ad_group')->nullable();
$table->json('cpm_video_ad_group')->nullable();
$table->json('smart_ad_group')->nullable();
$table->enum('status', [
AdGroup::STATUS_ACCEPTED,
AdGroup::STATUS_DRAFT,
......@@ -48,9 +57,6 @@ class CreateAdGroupsTable extends Migration
AdGroup::SUB_TYPE_USER_PROFILE,
])->nullable();
$table->json('restricted_region_ids')->nullable();
$table->json('region_ids')->nullable();
$table->json('negative_keywords')->nullable();
$table->json('negative_keyword_shared_set_ids')->nullable();
$table->timestamp('updated_self')->nullable();
$table->timestamps();
......
......@@ -17,6 +17,7 @@ class CreateGoalAdGroupsTable extends Migration
$table->id();
$table->bigInteger('external_id')->nullable();
$table->bigInteger('campaign_external_id')->nullable();
$table->bigInteger('ad_group_id')->unsigned();
$table->bigInteger('dictionary_campaign_id')->unsigned();
$table->string('name', 255)->nullable();
$table->text('negative_keywords')->nullable();
......@@ -29,6 +30,8 @@ class CreateGoalAdGroupsTable extends Migration
$table->foreign('dictionary_campaign_id')->references('id')->on('dictionary_campaigns')
->cascadeOnDelete();
$table->foreign('ad_group_id')->references('id')->on('ad_groups')
->cascadeOnDelete();
});
}
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!