Commit 6f86a701 by Vladislav

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

1 parent 879faa7e
......@@ -42,10 +42,10 @@ class AdGroupsUpdate extends Command
*/
public function handle()
{
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalSynchronized.groupsForExternalForNeedUpdated')
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated')
->with([
'dictionaryCampaignsEnabledForExternalSynchronized.groupsForExternalForNeedUpdated.dictionaryCampaign',
'dictionaryCampaignsEnabledForExternalSynchronized.groupsForExternalForNeedUpdated.group',
'dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated.dictionaryCampaign',
'dictionaryCampaignsEnabledForExternalUpdated.groupsForExternalForNeedUpdated.group',
])
->where('type', '!=', Tokens::MAIN)
->get();
......@@ -57,7 +57,7 @@ class AdGroupsUpdate extends Command
$factory->getRequest('AdGroup', 'update')
->call([
'goalAdGroups' => $token->dictionaryCampaignsEnabledForExternal->pluck('dictionaryCampaignsEnabledForExternalSynchronized')
'goalAdGroups' => $token->dictionaryCampaignsEnabledForExternalUpdated->pluck('groupsForExternalForNeedUpdated')
->collapse(),
]);
}
......
......@@ -50,7 +50,8 @@ class CampaignsCheckChange extends Command
->call();
}
$tokens = Tokens::has('dictionaryCampaignsEnabledForExternal')
$tokens = Tokens::has('dictionaryCampaignsEnabledForExternalUpdated')
->with('dictionaryCampaignsEnabledForExternalUpdated')
->where('type', '!=', Tokens::MAIN)->get();
foreach ($tokens as $token) {
......
......@@ -47,7 +47,7 @@ class CampaignsLoadUpdated extends Command
*/
public function handle()
{
$campaigns = Campaigns::forUpdatedSelf()->get();
$campaigns = Campaigns::forEnabled()->forUpdatedSelf()->get();
if (!$campaigns->count()) {
return;
}
......
......@@ -42,8 +42,8 @@ class CampaignsUpdate extends Command
*/
public function handle()
{
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalSynchronizedNeedUpdated')
->with('dictionaryCampaignsEnabledForExternalSynchronizedNeedUpdated.campaign')
$tokens = Tokens::whereHas('dictionaryCampaignsEnabledForExternalUpdatedNeedUpdated')
->with('dictionaryCampaignsEnabledForExternalUpdatedNeedUpdated.campaign')
->where('type', '!=', Tokens::MAIN)
->get();
......@@ -53,7 +53,7 @@ class CampaignsUpdate extends Command
$factory->getRequest('Campaigns', 'update')
->call([
'dictionaryCampaigns' => $token->dictionaryCampaignsEnabledForExternalSynchronizedNeedUpdated,
'dictionaryCampaigns' => $token->dictionaryCampaignsEnabledForExternalUpdatedNeedUpdated,
]);
}
......
......@@ -173,9 +173,13 @@ class AdGroup extends Model
});
}
public function scopeForUpdatedSelf(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForUpdatedSelf($query)
{
$query->whereNotNull("{$query->getModel()->getTable()}.updated_self");
return $query->whereNotNull("{$query->getModel()->getTable()}.updated_self");
}
public function goalGroups()
......
......@@ -193,7 +193,7 @@ class Campaigns extends Model
if (DictionaryCampaign::getPropertiesCopyWithPivot()->first(function ($property_name) use ($campaign) {
return $campaign->{$property_name} !== $campaign->getOriginal($property_name);
})) {
$campaign->dictionaryCampaigns()->enabled()->updated()->update(
$campaign->dictionaryCampaigns()->enabled()->forUpdated()->update(
DictionaryCampaign::copyPropertyFromMain($campaign)
);
}
......@@ -339,37 +339,67 @@ class Campaigns extends Model
->withTimestamps();
}
public function scopeForUpdatedSelf(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForUpdatedSelf($query)
{
$query->whereNotNull('updated_self');
return $query->whereNotNull('updated_self');
}
public function scopeForUpdatedChildren(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForUpdatedChildren($query)
{
$query->whereNotNull('updated_children');
return $query->whereNotNull('updated_children');
}
public function scopeForGroupsLoadable(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForGroupsLoadable($query)
{
$query->whereNull('groups_loaded_at');
return $query->whereNull('groups_loaded_at');
}
public function scopeForManaged(Builder $query, $manage = true)
/**
* @param Builder $query
* @param bool $manage
* @return Builder
*/
public function scopeForManaged($query, $manage = true)
{
$query->where('manage', $manage);
return $query->where('manage', $manage);
}
public function scopeForEnabled(Builder $query, $enabled = true)
/**
* @param Builder $query
* @param bool $enabled
* @return Builder
*/
public function scopeForEnabled($query, $enabled = true)
{
$query->where('enabled', $enabled);
return $query->where('enabled', $enabled);
}
public function scopeDisabled(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeDisabled($query)
{
return $query->whereNotNull('disabled_at');
}
public function scopeNotDisabled(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeNotDisabled($query)
{
return $query->whereNull('disabled_at');
}
......
......@@ -2,6 +2,7 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
......@@ -53,24 +54,23 @@ class Contact extends Model
{
use SoftDeletes;
public function organization()
{
return $this->belongsTo(Organization::class);
}
public function getNameAttribute()
{
return $this->first_name.' '.$this->last_name;
}
/**
* @param Builder $query
* @return Builder
*/
public function scopeOrderByName($query)
{
$query->orderBy('last_name')->orderBy('first_name');
return $query->orderBy('last_name')->orderBy('first_name');
}
/**
* @param Builder $query
* @param array $filters
* @return Builder
*/
public function scopeFilter($query, array $filters)
{
$query->when($filters['search'] ?? null, function ($query, $search) {
return $query->when($filters['search'] ?? null, function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->where('first_name', 'like', '%'.$search.'%')
->orWhere('last_name', 'like', '%'.$search.'%')
......@@ -87,4 +87,14 @@ class Contact extends Model
}
});
}
public function organization()
{
return $this->belongsTo(Organization::class);
}
public function getNameAttribute()
{
return $this->first_name.' '.$this->last_name;
}
}
......@@ -40,7 +40,11 @@ class Dictionary extends Model
{
CONST CITY = 'City';
public function scopeDefaultOrderBy(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeDefaultOrderBy($query)
{
return $query->orderBy('name');
}
......
......@@ -2,6 +2,7 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
......@@ -38,8 +39,12 @@ class Limits extends Model
{
use HasFactory;
/**
* @param Builder $query
* @return Builder
*/
public function scopeComplited($query)
{
$query->where('reserved', 0);
return $query->where('reserved', 0);
}
}
......@@ -2,6 +2,7 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletes;
/**
......@@ -53,9 +54,14 @@ class Organization extends Model
return $this->hasMany(Contact::class);
}
/**
* @param Builder $query
* @param array $filters
* @return Builder
*/
public function scopeFilter($query, array $filters)
{
$query->when($filters['search'] ?? null, function ($query, $search) {
return $query->when($filters['search'] ?? null, function ($query, $search) {
$query->where('name', 'like', '%'.$search.'%');
})->when($filters['trashed'] ?? null, function ($query, $trashed) {
if ($trashed === 'with') {
......
......@@ -44,7 +44,7 @@ use Illuminate\Support\Collection;
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forNotExternal()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign needUpdated()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign enabled($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign updated($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forUpdated($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign synced($value = true)
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign synchronized()
* @method static \Illuminate\Database\Eloquent\Builder|DictionaryCampaign forUpdatedSelf()
......@@ -174,62 +174,113 @@ class DictionaryCampaign extends Pivot
})->all();
}
public function scopeDisabled(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeDisabled($query)
{
return $query->whereNotNull('disabled_at');
}
public function scopeNotDisabled(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeNotDisabled($query)
{
return $query->whereNull('disabled_at');
}
public function scopeForExternal(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForExternal($query)
{
return $query->whereNotNull('external_id');
}
public function scopeForNotExternal(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForNotExternal($query)
{
return $query->whereNull('external_id');
}
public function scopeEnabled(Builder $query, $enabled = true)
/**
* @param Builder $query
* @param bool $enabled
* @return Builder
*/
public function scopeEnabled($query, $enabled = true)
{
return $query->where('enabled', $enabled);
}
public function scopeUpdated(Builder $query, $updated = true)
/**
* @param Builder $query
* @param bool $updated
* @return Builder
*/
public function scopeForUpdated($query, $updated = true)
{
return $query->where('updated', $updated);
}
public function scopeNeedUpdated(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeNeedUpdated($query)
{
return $query->whereNotNull('updated_need');
}
public function scopeSynced(Builder $query, $synced = true)
/**
* @param Builder $query
* @param bool $synced
* @return Builder
*/
public function scopeSynced($query, $synced = true)
{
return $query->where('synced', $synced);
}
public function scopeSynchronized(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeSynchronized($query)
{
return $query->synced()->updated();
return $query->synced()->forUpdated();
}
public function scopeForUpdatedSelf(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForUpdatedSelf($query)
{
$query->whereNotNull('updated_self');
return $query->whereNotNull('updated_self');
}
public function scopeForUpdatedChildren(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForUpdatedChildren($query)
{
$query->whereNotNull('updated_children');
return $query->whereNotNull('updated_children');
}
public function scopeJoinDictionaries(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeJoinDictionaries($query)
{
$dictionary_model = Dictionary::getModel();
......
......@@ -134,24 +134,40 @@ class GoalAdGroup extends Pivot
->all();
}
public function scopeForExternal(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForExternal($query)
{
return $query->whereNotNull('external_id');
}
public function scopeForNotExternal(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForNotExternal($query)
{
return $query->whereNull('external_id');
}
public function scopeNeedUpdated(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeNeedUpdated($query)
{
return $query->whereNotNull('updated_need');
}
public function scopeForUpdatedSelf(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeForUpdatedSelf($query)
{
$query->whereNotNull('updated_self');
return $query->whereNotNull('updated_self');
}
public function group()
......
......@@ -4,6 +4,7 @@ namespace App\Models;
use App\Models\Pivots\DictionaryCampaign;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
/**
......@@ -39,9 +40,11 @@ use Illuminate\Database\Eloquent\Model;
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsForExternal
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForNotExternal
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsNotEnabledForExternalNotDisabled
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternal
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalUpdated
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalDisabled
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronized
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedNeedUpdated
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalUpdatedNeedUpdated
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf
* @property-read \Illuminate\Database\Eloquent\Collection|DictionaryCampaign[] $dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\Dictionary[] $campaignsForManaged
......@@ -112,9 +115,14 @@ class Tokens extends Model
: Carbon::now()->addDays(-1);
}
/**
* @param Builder $query
* @param array $filters
* @return Builder
*/
public function scopeFilter($query, array $filters)
{
$query->when($filters['login'] ?? null, function ($query, $search) {
return $query->when($filters['login'] ?? null, function ($query, $search) {
$query->where('login', 'like', '%'.$search.'%');
})->when($filters['type'] ?? null, function ($query, $type) {
$query->where('type', $type);
......@@ -185,7 +193,17 @@ class Tokens extends Model
public function dictionaryCampaignsEnabledForExternal()
{
return $this->dictionaryCampaignsForExternal()->enabled();
return $this->dictionaryCampaigns()->enabled()->forExternal();
}
public function dictionaryCampaignsEnabledForExternalUpdated()
{
return $this->dictionaryCampaigns()->enabled()->forExternal()->forUpdated();
}
public function dictionaryCampaignsEnabledForExternalUpdatedNeedUpdated()
{
return $this->dictionaryCampaigns()->enabled()->forExternal()->forUpdated()->needUpdated();
}
public function dictionaryCampaignsEnabledForNotExternal()
......@@ -195,32 +213,27 @@ class Tokens extends Model
public function dictionaryCampaignsNotEnabledForExternalNotDisabled()
{
return $this->dictionaryCampaignsForExternal()->enabled(false)->notDisabled();
return $this->dictionaryCampaigns()->enabled(false)->forExternal()->notDisabled();
}
public function dictionaryCampaignsEnabledForExternalDisabled()
{
return $this->dictionaryCampaignsForExternal()->enabled()->disabled();
return $this->dictionaryCampaigns()->enabled()->forExternal()->disabled();
}
public function dictionaryCampaignsEnabledForExternalSynchronized()
{
return $this->dictionaryCampaignsForExternal()->enabled()->synchronized();
}
public function dictionaryCampaignsEnabledForExternalSynchronizedNeedUpdated()
{
return $this->dictionaryCampaignsEnabledForExternalSynchronized()->enabled()->needUpdated();
return $this->dictionaryCampaigns()->enabled()->forExternal()->synchronized();
}
public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedSelf()
{
return $this->dictionaryCampaignsEnabledForExternalSynchronized()->forUpdatedSelf();
return $this->dictionaryCampaigns()->enabled()->forExternal()->synchronized()->forUpdatedSelf();
}
public function dictionaryCampaignsEnabledForExternalSynchronizedUpdatedChildren()
{
return $this->dictionaryCampaignsEnabledForExternalSynchronized()->forUpdatedChildren();
return $this->dictionaryCampaigns()->enabled()->forExternal()->synchronized()->forUpdatedChildren();
}
public function campaignsForManaged()
......
......@@ -5,6 +5,7 @@ namespace App\Models;
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Support\Facades\App;
......@@ -87,22 +88,37 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac
return $this->email === 'johndoe@example.com';
}
/**
* @param Builder $query
* @return Builder
*/
public function scopeOrderByName($query)
{
$query->orderBy('last_name')->orderBy('first_name');
return $query->orderBy('last_name')->orderBy('first_name');
}
/**
* @param Builder $query
* @param string $role
* @return Builder
*/
public function scopeWhereRole($query, $role)
{
switch ($role) {
case 'user': return $query->where('owner', false);
case 'owner': return $query->where('owner', true);
}
return $query;
}
/**
* @param Builder $query
* @param array $filters
* @return Builder
*/
public function scopeFilter($query, array $filters)
{
$query->when($filters['search'] ?? null, function ($query, $search) {
return $query->when($filters['search'] ?? null, function ($query, $search) {
$query->where(function ($query) use ($search) {
$query->where('first_name', 'like', '%'.$search.'%')
->orWhere('last_name', 'like', '%'.$search.'%')
......
......@@ -59,7 +59,11 @@ class Variable extends Model
return $variable_list;
}
public function scopeDefaultOrderBy(Builder $query)
/**
* @param Builder $query
* @return Builder
*/
public function scopeDefaultOrderBy($query)
{
return $query->orderBy('name');
}
......
......@@ -31,7 +31,7 @@ class CheckCampaignsChanges extends DirectRequest
if (in_array(self::SELF, $campaign_data['ChangesIn']) || in_array(self::CHILDREN, $campaign_data['ChangesIn'])) {
$data = [];
if (in_array(self::SELF, $campaign_data['ChangesIn'])) {
if ($this->getToken()->isMain() && in_array(self::SELF, $campaign_data['ChangesIn'])) {
$data['updated_self'] = Carbon::now();
}
......@@ -52,10 +52,16 @@ class CheckCampaignsChanges extends DirectRequest
} else {
$dictionaryCampaign = DictionaryCampaign::synchronized()->find($external_id);
$dictionaryCampaign = DictionaryCampaign::firstWhere('external_id', $external_id);
if ($dictionaryCampaign) {
$data['external_updated_at'] = Carbon::now();
if ($dictionaryCampaign->updated) {
$data['updated_need'] = Carbon::now();
}
$dictionaryCampaign->update($data);
}
......
......@@ -80,13 +80,14 @@ class CheckChanges extends DirectRequest
]);
}
} else {
$goalAdGroup = GoalAdGroup::where('external_id', $ad_group_id)->first();
$goalAdGroup = GoalAdGroup::with('dictionaryCampaign')->firstWhere('external_id', $ad_group_id)->first();
if ($goalAdGroup) {
if ($goalAdGroup && $goalAdGroup->dictionaryCampaign && $goalAdGroup->dictionaryCampaign->updated) {
$goalAdGroup->update([
'updated_self' => Carbon::now(),
'updated_need' => Carbon::now(),
]);
}
}
}
......
......@@ -112,7 +112,7 @@ export default {
},
citySynced(city_id, campaign_id, synced) {
this.$inertia.post(this.route('token.city.campaign.synced', [this.token.id, city_id, campaign_id]), {
updated: synced ? 1 : 0,
synced: synced ? 1 : 0,
})
},
cityEnabled(city_id, campaign_id, enabled) {
......
......@@ -147,9 +147,42 @@ class CheckCampaignsTest extends TestCase
$campaign = $this->dictionary->campaigns()->first();
$this->assertEquals(true, $campaign->pivot->updated);
$this->assertNotNull($campaign->pivot->external_updated_at);
$this->assertNotNull($campaign->pivot->updated_self);
$this->assertNotNull($campaign->pivot->updated_children);
$this->assertNotNull($campaign->pivot->updated_need);
$campaign->pivot->update([
'external_updated_at' => null,
'updated_need' => null,
'updated' => false,
]);
$this->request->handle([
'result' => [
'Timestamp' => 1622459200,
'Campaigns' => [
[
'ChangesIn' => ['SELF', 'CHILDREN'],
'CampaignId' => 1
]
]
]
]);
$this->assertEquals($this->request->getToken()->check_changes_campaign_at->timestamp, 1622459200);
$campaign = $this->dictionary->campaigns()->first();
$this->assertEquals(false, $campaign->pivot->updated);
$this->assertNotNull($campaign->pivot->external_updated_at);
$this->assertNull($campaign->pivot->updated_need);
$campaign->pivot->update([
'updated' => true,
]);
$campaign = $this->dictionary->campaigns()->first();
$campaign->pivot->update([
'external_id' => 1,
......
......@@ -174,7 +174,7 @@ class LimitsTest extends TestCase
$requestCmpgn = $request->getRequest('Campaigns', 'update');
$this->token->limit = 191;
$requestCmpgn->call([
'dictionaryCampaigns' => $this->token->dictionaryCampaignsEnabledForExternalSynchronizedNeedUpdated
'dictionaryCampaigns' => $this->token->dictionaryCampaignsEnabledForExternalUpdatedNeedUpdated
]);
$objects = $this->limitService->countObjectsLimit($requestCmpgn);
$this->assertEquals($objects, 0);
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!