a42647c6fe
Шаг 2 «Конкурентного поля»: один номер встречается в нескольких местах — код сайта плюс карточки 2ГИС/Яндекс с разными адресами. Раньше хранилось одно provenance_url/label — список терялся. Теперь сквозной провод движок→контракт→джоб→БД→API; фронт уже умел показывать кликабельным списком с подтверждениями. - autopodbor_sources +3 колонки where_found/office/confirmations миграция 2026_06_30_120000, идемпотентная, RLS-review APPROVE 7/7 - canon-sync schema.sql v8.59 плюс CHANGELOG, вкл. catch-up phone_type/box 29.06 - тесты бэкенда автоподбора 122/122 НЕ на проде, воркстри avtopodbor. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
48 lines
1007 B
PHP
48 lines
1007 B
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Models;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
|
|
class AutopodborSource extends Model
|
|
{
|
|
public $timestamps = false;
|
|
|
|
protected $fillable = [
|
|
'tenant_id',
|
|
'competitor_id',
|
|
'study_run_id',
|
|
'signal_type',
|
|
'identifier',
|
|
'phone_kind',
|
|
'phone_type',
|
|
'provenance_url',
|
|
'provenance_label',
|
|
'dedup_key',
|
|
'created_project_id',
|
|
'box',
|
|
'where_found',
|
|
'office',
|
|
'confirmations',
|
|
];
|
|
|
|
protected $casts = [
|
|
'created_at' => 'datetime',
|
|
'where_found' => 'array',
|
|
'confirmations' => 'integer',
|
|
];
|
|
|
|
public function competitor(): BelongsTo
|
|
{
|
|
return $this->belongsTo(AutopodborCompetitor::class, 'competitor_id');
|
|
}
|
|
|
|
public function project(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Project::class, 'created_project_id');
|
|
}
|
|
}
|