Commit a74e801f by Vladislav

#19465 Реализация синхронизации данных по РК.

1 parent a5d3b5fa
......@@ -47,11 +47,12 @@ class AdGroupsLoadUpdated extends Command
'campaignsAdGroupsForUpdatedSelf' => function (HasManyThrough $query) {
return $query->limit(10);
},
])->where('type', '!=', Tokens::MAIN)
])
->where('type', '!=', Tokens::MAIN)
->first();
if (!$token) {
throw new \Exception('Не найден токен блин');
return 0;
}
$factory = APIRequest::getInstance(API::YANDEX);
......
......@@ -48,7 +48,8 @@ class CampaignsAdd extends Command
return $query->limit(10);
},
'dictionaryCampaignsEnabledForNotExternal.campaign'
])->where('type', '!=', Tokens::MAIN)
])
->where('type', '!=', Tokens::MAIN)
->get();
foreach ($tokens as $token) {
......
......@@ -60,11 +60,6 @@ class CampaignsLoadUpdated extends Command
$factory = APIRequest::getInstance(API::YANDEX);
$factory->setToken($token);
$ids = [];
foreach ($campaigns as $campaign) {
$ids[] = $campaign['external_id'];
}
$factory->getRequest('campaigns', 'get')->call([
'ids' => $campaigns->pluck('external_id')->all(),
]);
......
......@@ -65,7 +65,7 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
'FieldNames' => [
'AdGroupIds',
],
"Timestamp" => $token->check_changes_ad_group_at->toIso8601ZuluString(),
'Timestamp' => $token->check_changes_ad_group_at->toIso8601ZuluString(),
]);
$tokens = Tokens::has('dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren')
......@@ -87,7 +87,6 @@ class CampaignsLoadUpdatedChildrenAdGroups extends Command
'FieldNames' => [
'AdGroupIds',
],
"Timestamp" => $token->check_changes_at->toIso8601ZuluString(),
]);
}
......
......@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
use App\Models\Pivots\DictionaryCampaign;
use App\Models\Tokens;
use App\Models\Variable;
use Carbon\Carbon;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Support\Facades\Request;
use Inertia\Inertia;
......@@ -176,6 +177,11 @@ class CampaignVariablesController extends Controller
if (is_null($value)) {
$dictionary_campaign->dictionaryCampaignVariables()->where('variable_id', $variable_id)
->delete();
$dictionary_campaign->update([
'updated_need' => Carbon::now(),
]);
} else {
$dictionary_campaign_variable = $dictionary_campaign->dictionaryCampaignVariables()->firstWhere('variable_id', $variable_id);
......@@ -190,6 +196,10 @@ class CampaignVariablesController extends Controller
]);
}
$dictionary_campaign->update([
'updated_need' => Carbon::now(),
]);
}
}
......
......@@ -114,7 +114,7 @@ class AdGroup extends Model
public function scopeForUpdatedSelf(Builder $query)
{
$query->whereNotNull('updated_self');
$query->whereNotNull("{$query->getModel()->getTable()}.updated_self");
}
}
......@@ -22,12 +22,10 @@ use Illuminate\Support\Collection;
* @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 $bidding_strategy
* @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 array|null $relevant_keywords
* @property string|null $attribution_model
* @property array|null $priority_goals
* @property string|null $updated_self
......@@ -94,12 +92,10 @@ class Campaigns extends Model
'blocked_ips',
'excluded_sites',
'daily_budget',
'text_campaign_strategy_search',
'text_campaign_strategy_network',
'bidding_strategy',
'settings',
'counter_ids',
'relevant_keywords_setting_budget_percent',
'relevant_keywords_setting_optimize_goal_id',
'relevant_keywords',
'attribution_model',
'priority_goals',
'updated_self',
......@@ -114,8 +110,10 @@ class Campaigns extends Model
'time_targeting' => 'array',
'negative_keywords' => 'array',
'blocked_ips' => 'array',
'bidding_strategy' => 'json',
'settings' => 'array',
'counter_ids' => 'array',
'relevant_keywords' => 'json',
'excluded_sites' => 'array',
'daily_budget' => 'array',
'priority_goals' => 'array',
......@@ -138,12 +136,10 @@ class Campaigns extends Model
'blocked_ips',
'excluded_sites',
'daily_budget',
'text_campaign_strategy_search',
'text_campaign_strategy_network',
'bidding_strategy',
'settings',
'counter_ids',
'relevant_keywords_setting_budget_percent',
'relevant_keywords_setting_optimize_goal_id',
'relevant_keywords',
'attribution_model',
'priority_goals',
]);
......
......@@ -15,9 +15,12 @@ use Illuminate\Database\Eloquent\Model;
* @property string $api
* @property string|null $type
* @property int $created_by
* @property string|null $timestamp
* @property \Illuminate\Support\Carbon|null $check_changes
* @property \Illuminate\Support\Carbon $check_changes_at
* @property \Illuminate\Support\Carbon|null $check_changes_campaign
* @property \Illuminate\Support\Carbon $check_changes_campaign_at
* @property \Illuminate\Support\Carbon|null $check_changes_ad_group
* @property \Illuminate\Support\Carbon|null $check_changes_ad_group_at
* @property \Illuminate\Support\Carbon $check_changes_ad_group_at
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property int $limit
......@@ -54,7 +57,9 @@ use Illuminate\Database\Eloquent\Model;
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereLimit($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereLogin($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereTimestamp($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckChanges($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckCampaign($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereCheckAdGroup($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereToken($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|Tokens whereUpdatedAt($value)
......@@ -69,14 +74,31 @@ class Tokens extends Model
'token',
'login',
'type',
'timestamp',
'check_changes',
'check_changes_campaign',
'check_changes_ad_group',
];
protected $casts = [
'check_changes' => 'datetime',
'check_changes_campaign' => 'datetime',
'check_changes_ad_group' => 'datetime',
];
public function getCheckChangesAtAttribute()
{
return $this->check_changes
? $this->check_changes
: Carbon::now()->addDays(-1);
}
public function getCheckChangesCampaignAtAttribute()
{
return $this->check_changes_campaign
? $this->check_changes_campaign
: Carbon::now()->addDays(-1);
}
public function getCheckChangesAdGroupAtAttribute()
{
return $this->check_changes_ad_group
......@@ -114,7 +136,7 @@ class Tokens extends Model
public function campaignsAdGroups()
{
return $this->hasManyThrough(Campaigns::class, AdGroup::class, 'token', 'campaign_id');
return $this->hasManyThrough(AdGroup::class, Campaigns::class, 'token', 'campaign_id');
}
public function campaignsAdGroupsForUpdatedSelf()
......
......@@ -30,11 +30,16 @@ class AddCampaigns extends DirectRequest
public function handle($response)
{
try {
if (!isset($response['result'])) {
Log::debug($response);
}
foreach ($response['result']['AddResults'] as $key => $add_result) {
$id = $add_result['Id'] ?? '';
if (!$id) {
Log::debug("AddCampaigns, empty Id, [dictionary_campaigns.id = {$this->dictionaryCampaigns->get($key)->getKey()}]", $add_result);
Log::debug("AddCampaigns, empty Id, [dictionary_campaigns.id = {$this->dictionaryCampaigns->get($key)->getKey()}]");
Log::debug($add_result);
continue;
}
......@@ -67,18 +72,41 @@ class AddCampaigns extends DirectRequest
$list = Variable::getListVariablesByDictionaryCampaign($dictionaryCampaign);
$bidding_strategy = $dictionaryCampaign->campaign->bidding_strategy;
if (isset($bidding_strategy['Network']['NetworkDefault']) && is_null($bidding_strategy['Network']['NetworkDefault']['LimitPercent'])) {
unset($bidding_strategy['Network']['NetworkDefault']);
}
if (isset($bidding_strategy['Network']['WbMaximumClicks']) && is_null($bidding_strategy['Network']['WbMaximumClicks']['BidCeiling'])) {
unset($bidding_strategy['Network']['WbMaximumClicks']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['WbMaximumConversionRate']) && is_null($bidding_strategy['Network']['WbMaximumConversionRate']['BidCeiling'])) {
unset($bidding_strategy['Network']['WbMaximumConversionRate']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['AverageCpc']) && is_null($bidding_strategy['Network']['AverageCpc']['BidCeiling'])) {
unset($bidding_strategy['Network']['AverageCpc']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['WeeklyClickPackage']) && is_null($bidding_strategy['Network']['WeeklyClickPackage']['BidCeiling'])) {
unset($bidding_strategy['Network']['WeeklyClickPackage']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['AverageRoi']) && is_null($bidding_strategy['Network']['AverageRoi']['BidCeiling'])) {
unset($bidding_strategy['Network']['AverageRoi']['BidCeiling']);
}
if (isset($bidding_strategy['Network']['PayForConversion']) && is_null($bidding_strategy['Network']['PayForConversion']['WeeklySpendLimit'])) {
unset($bidding_strategy['Network']['PayForConversion']['WeeklySpendLimit']);
}
$data = [
'Name' => StrReplaceByVariables::getInstance($dictionaryCampaign->name, $list)->get(),
'StartDate' => Carbon::now()->format('Y-m-d'),
'TextCampaign' => [
'BiddingStrategy' => [
'Search' => [
'BiddingStrategyType' => $dictionaryCampaign->campaign->text_campaign_strategy_search,
],
'Network' => [
'BiddingStrategyType' => $dictionaryCampaign->campaign->text_campaign_strategy_network,
],
],
'BiddingStrategy' => $bidding_strategy,
],
];
......@@ -112,11 +140,8 @@ class AddCampaigns extends DirectRequest
];
}
if ($dictionaryCampaign->campaign->relevant_keywords_setting_budget_percent) {
$data['TextCampaign']['RelevantKeywords'] = [
'BudgetPercent' => $dictionaryCampaign->campaign->relevant_keywords_setting_budget_percent,
'OptimizeGoalId' => $dictionaryCampaign->campaign->relevant_keywords_setting_optimize_goal_id,
];
if ($dictionaryCampaign->campaign->relevant_keywords) {
$data['TextCampaign']['RelevantKeywords'] = $dictionaryCampaign->campaign->relevant_keywords;
}
if ($dictionaryCampaign->campaign->attribution_model) {
......
......@@ -58,11 +58,10 @@ class CheckCampaignsChange extends DirectRequest
}
}
\Log::debug($data);
}
}
$this->getToken()->update([
'timestamp' => $response['result']['Timestamp'],
'check_changes_campaign' => Carbon::createFromTimestamp($response['result']['Timestamp']),
]);
$this->setToken($this->getToken()->refresh());
}
......@@ -72,7 +71,7 @@ class CheckCampaignsChange extends DirectRequest
$this->setService('changes');
$this->setMethod('checkCampaigns');
$this->setParams([
"Timestamp" => $this->getToken()->timestamp
'Timestamp' => $this->getToken()->check_changes_campaign_at->toIso8601ZuluString(),
]);
}
}
......@@ -52,6 +52,7 @@ class CheckChanges extends DirectRequest
}
if (isset($this->getParams()['CampaignIds'])) {
if ($this->getToken()->isMain()) {
Campaigns::whereIn('external_id', $this->getParams()['CampaignIds'])->update([
'updated_children' => null,
......@@ -61,17 +62,17 @@ class CheckChanges extends DirectRequest
'updated_children' => null,
]);
}
}
$this->getToken()->update([
'check_changes' => [
Carbon::createFromTimestamp($response['result']['Timestamp']),
]
]);
$this->getToken()->update([
'check_changes_ad_group' => Carbon::createFromTimestamp($response['result']['Timestamp']),
]);
} else {
$this->getToken()->update([
'check_changes' => Carbon::createFromTimestamp($response['result']['Timestamp']),
]);
}
$this->getToken()->update([
'timestamp' => $response['result']['Timestamp'],
]);
$this->setToken($this->getToken()->refresh());
}
......
......@@ -2,8 +2,6 @@
namespace App\Service\Requests\Direct;
use App\Jobs\ProcessCallLimitedAPI;
use App\Service\API\API;
use App\Service\Requests\APIRequest;
use App\Service\Requests\DirectRequest;
class CheckDictionariesChange extends DirectRequest {
......@@ -14,8 +12,6 @@ class CheckDictionariesChange extends DirectRequest {
}
function handle($response){
$this->token->timestamp = $response['result']['Timestamp'] ?? '';
$this->token->save();
}
private function requestPrepare($params){
......
......@@ -22,56 +22,35 @@ class GetCampaigns extends DirectRequest
function handle($response)
{
try {
$campaigns_data = [];
foreach ($response['result']['Campaigns'] as $campaign_data) {
$external_id = $campaign_data['Id'];
$data = [
'external_id' => $campaign_data['Id'],
'external_id' => $external_id,
'token' => $this->getToken()->id,
'name' => $campaign_data['Name'],
'time_targeting' => json_encode($campaign_data['TimeTargeting']),
'negative_keywords' => json_encode($campaign_data['NegativeKeywords']['Items'] ?? []),
'blocked_ips' => json_encode($campaign_data['BlockedIps']['Items'] ?? []),
'excluded_sites' => json_encode($campaign_data['ExcludedSites']['Items'] ?? []),
'daily_budget' => json_encode($campaign_data['DailyBudget'] ?? []),
'text_campaign_strategy_search' => $campaign_data['TextCampaign']['BiddingStrategy']['Search']['BiddingStrategyType'],
'text_campaign_strategy_network' => $campaign_data['TextCampaign']['BiddingStrategy']['Network']['BiddingStrategyType'],
'settings' => json_encode($campaign_data['TextCampaign']['Settings'] ?? []),
'counter_ids' => json_encode($campaign_data['TextCampaign']['CounterIds']['Items'] ?? []),
'relevant_keywords_setting_budget_percent' => $campaign_data['TextCampaign']['RelevantKeywords']['BudgetPercent'] ?? null,
'relevant_keywords_setting_optimize_goal_id' => $campaign_data['TextCampaign']['RelevantKeywords']['OptimizeGoalId'] ?? null,
'time_targeting' => $campaign_data['TimeTargeting'],
'negative_keywords' => $campaign_data['NegativeKeywords']['Items'] ?? [],
'blocked_ips' => $campaign_data['BlockedIps']['Items'] ?? [],
'excluded_sites' => $campaign_data['ExcludedSites']['Items'] ?? [],
'daily_budget' => $campaign_data['DailyBudget'],
'bidding_strategy' => $campaign_data['TextCampaign']['BiddingStrategy'],
'settings' => $campaign_data['TextCampaign']['Settings'],
'counter_ids' => $campaign_data['TextCampaign']['CounterIds']['Items'] ?? [],
'relevant_keywords' => $campaign_data['TextCampaign']['RelevantKeywords'],
'attribution_model' => $campaign_data['TextCampaign']['AttributionModel'],
'priority_goals' => json_encode($campaign_data['TextCampaign']['PriorityGoals'] ?? []),
'priority_goals' => $campaign_data['TextCampaign']['PriorityGoals'],
'updated_self' => null,
'updated_children' => null,
];
$campaigns_data[] = $data;
}
if ($this->getToken()->isMain()) {
Campaigns::upsert($campaigns_data, [
'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',
]);
} else {
foreach ($campaigns_data as $campaign_data) {
if ($this->getToken()->isMain()) {
Campaigns::updateOrCreate([
'external_id' => $external_id
], $data);
} else {
$dictionaryCampaign = DictionaryCampaign::synchronized()
->find($campaign_data['external_id']);
->find($external_id);
if (!$dictionaryCampaign)
continue;
......@@ -80,6 +59,7 @@ class GetCampaigns extends DirectRequest
$dictionaryCampaign::copyPropertyInCampaign($campaign_data)
);
}
}
} catch (\Exception $e) {
Log::debug($e);
......
......@@ -24,7 +24,8 @@ class ResumeCampaigns extends DirectRequest
$external_id = $resume_result['Id'] ?? '';
if (!$external_id) {
Log::debug("resumeCampaigns, empty Id", $resume_result);
Log::debug("resumeCampaigns, empty Id");
Log::debug($resume_result);
continue;
}
......
......@@ -25,7 +25,8 @@ class SuspendCampaigns extends DirectRequest
$external_id = $suspend_result['Id'] ?? '';
if (!$external_id) {
Log::debug("SuspendCampaigns, empty Id", $suspend_result);
Log::debug("SuspendCampaigns, empty Id");
Log::debug($suspend_result);
continue;
}
......
......@@ -74,18 +74,8 @@ class UpdateCampaigns extends DirectRequest
'Name' => StrReplaceByVariables::getInstance($dictionaryCampaign->name, $list)->get(),
'StartDate' => Carbon::now()->format('Y-m-d'),
'TextCampaign' => [
'BiddingStrategy' => [
'Search' => [
'BiddingStrategyType' => $dictionaryCampaign->campaign->text_campaign_strategy_search,
],
'Network' => [
'BiddingStrategyType' => $dictionaryCampaign->campaign->text_campaign_strategy_network,
],
],
'RelevantKeywords' => [
'BudgetPercent' => $dictionaryCampaign->campaign->relevant_keywords_setting_budget_percent,
'OptimizeGoalId' => $dictionaryCampaign->campaign->relevant_keywords_setting_optimize_goal_id,
],
'BiddingStrategy' => $dictionaryCampaign->campaign->bidding_strategy,
'RelevantKeywords' => $dictionaryCampaign->campaign->relevant_keywords,
'AttributionModel' => $dictionaryCampaign->campaign->attribution_model,
],
];
......
......@@ -21,6 +21,8 @@ class CreateTokensTable extends Migration
$table->enum('type', ['main', 'goal'])->nullable();
$table->integer('created_by');
$table->string('timestamp')->nullable();
$table->timestamp('check_changes')->nullable();
$table->timestamp('check_changes_campaign')->nullable();
$table->timestamp('check_changes_ad_group')->nullable();
$table->timestamps();
......
......@@ -23,12 +23,10 @@ class CreateCampaignsTable extends Migration
$table->json('blocked_ips')->nullable();
$table->json('excluded_sites')->nullable();
$table->json('daily_budget')->nullable();
$table->string('text_campaign_strategy_search')->nullable();
$table->string('text_campaign_strategy_network')->nullable();
$table->json('bidding_strategy')->nullable();
$table->json('settings')->nullable();
$table->json('counter_ids')->nullable();
$table->integer('relevant_keywords_setting_budget_percent')->nullable();
$table->bigInteger('relevant_keywords_setting_optimize_goal_id')->nullable();
$table->json('relevant_keywords')->nullable();
$table->string('attribution_model', 4)->nullable();
$table->json('priority_goals')->nullable();
$table->timestamp('updated_self')->nullable();
......
......@@ -77,7 +77,7 @@ class CheckChangesAdGroupsTest extends TestCase
'FieldNames' => [
'AdGroupIds',
],
"Timestamp" => $this->token_main->check_changes_ad_group_at->toIso8601ZuluString(),
'Timestamp' => $this->token_main->check_changes_ad_group_at->toIso8601ZuluString(),
];
$this->request = APIRequest::getInstance(API::YANDEX)
......
......@@ -110,12 +110,12 @@ class GetCampaignsTest extends TestCase
$this->assertEquals($campaign->blocked_ips, $data_campaign['BlockedIps']['Items']);
$this->assertEquals($campaign->excluded_sites, $data_campaign['ExcludedSites']['Items']);
$this->assertEquals($campaign->daily_budget, $data_campaign['DailyBudget']);
$this->assertEquals($campaign->text_campaign_strategy_search, $data_campaign['TextCampaign']['BiddingStrategy']['Search']['BiddingStrategyType']);
$this->assertEquals($campaign->text_campaign_strategy_network, $data_campaign['TextCampaign']['BiddingStrategy']['Network']['BiddingStrategyType']);
$this->assertEquals($campaign->bidding_strategy['Search']['BiddingStrategyType'], $data_campaign['TextCampaign']['BiddingStrategy']['Search']['BiddingStrategyType']);
$this->assertEquals($campaign->bidding_strategy['Network']['BiddingStrategyType'], $data_campaign['TextCampaign']['BiddingStrategy']['Network']['BiddingStrategyType']);
$this->assertEquals($campaign->settings, $data_campaign['TextCampaign']['Settings']);
$this->assertEquals($campaign->counter_ids, $data_campaign['TextCampaign']['CounterIds']['Items']);
$this->assertEquals($campaign->relevant_keywords_setting_budget_percent, $data_campaign['TextCampaign']['RelevantKeywords']['BudgetPercent']);
$this->assertEquals($campaign->relevant_keywords_setting_optimize_goal_id, $data_campaign['TextCampaign']['RelevantKeywords']['OptimizeGoalId']);
$this->assertEquals($campaign->relevant_keywords['BudgetPercent'], $data_campaign['TextCampaign']['RelevantKeywords']['BudgetPercent']);
$this->assertEquals($campaign->relevant_keywords['OptimizeGoalId'], $data_campaign['TextCampaign']['RelevantKeywords']['OptimizeGoalId']);
$this->assertEquals($campaign->attribution_model, $data_campaign['TextCampaign']['AttributionModel']);
$this->assertEquals($campaign->priority_goals, $data_campaign['TextCampaign']['PriorityGoals']);
$this->assertEquals($campaign->updated_self, null);
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!