diff --git a/app/Http/Controllers/Bitrix/ClientsApiController.php b/app/Http/Controllers/Bitrix/ClientsApiController.php index 319ebaf..351a241 100644 --- a/app/Http/Controllers/Bitrix/ClientsApiController.php +++ b/app/Http/Controllers/Bitrix/ClientsApiController.php @@ -53,6 +53,11 @@ public function confirm(Deal $deal, Request $request) $deal->notify(new DealNotUnique()); } + if (!$agent->bitrixId) + { + $agent->bitrixId()->create(['bx_id' => $request->agent_id]); + } + Log::build([ 'driver' => 'single', 'path' => storage_path('logs/bitrix.log'), diff --git a/app/Http/Controllers/Bitrix/ContractApiController.php b/app/Http/Controllers/Bitrix/ContractApiController.php index 2f50964..2485f50 100644 --- a/app/Http/Controllers/Bitrix/ContractApiController.php +++ b/app/Http/Controllers/Bitrix/ContractApiController.php @@ -31,6 +31,11 @@ public function __invoke(Deal $deal, Request $request) ] ); $agent = $deal->agent; + if (!$deal->bitrixId) + { + $deal->bitrixId()->create(['bx_id' => $request->deal_id]); + } + $agent->user->notify(new ContractUpdated($deal->contract)); return true; } diff --git a/app/Models/Agent/Agent.php b/app/Models/Agent/Agent.php index fd9d9f3..6fc30b9 100644 --- a/app/Models/Agent/Agent.php +++ b/app/Models/Agent/Agent.php @@ -14,14 +14,16 @@ use App\Models\Deal\Deal; use App\Notifications\AgentCreated; - use Modules\Payment\Traits\Paymentable; +use Modules\Bitrix\Traits\Bitrixable; class Agent extends Model { use HasFactory; use SoftDeletes; use Paymentable; + use Bitrixable; + public const STATUS_ACTIVE = "ACTIVE"; public const STATUS_DISMISSED = "DISMISSED"; protected $fillable = [ diff --git a/app/Models/Deal/Deal.php b/app/Models/Deal/Deal.php index ea690c4..c796c39 100644 --- a/app/Models/Deal/Deal.php +++ b/app/Models/Deal/Deal.php @@ -9,10 +9,11 @@ use App\Models\User\Role; use Modules\Contracts\Models\Contract; use Illuminate\Notifications\Notifiable; +use Modules\Bitrix\Traits\Bitrixable; class Deal extends Model { - use HasFactory, Notifiable; + use HasFactory, Notifiable, Bitrixable; protected $fillable = [ 'client_id', 'complex_id', diff --git a/app/Modules/Admin/Http/Controllers/AdminBitrixController.php b/app/Modules/Admin/Http/Controllers/AdminBitrixController.php new file mode 100644 index 0000000..947dd04 --- /dev/null +++ b/app/Modules/Admin/Http/Controllers/AdminBitrixController.php @@ -0,0 +1,69 @@ + Agent::all() + ]); + } + public function setAgentId(Request $request, Agent $agent) + { + $agent->setBitrixId($request->id); + return back()->withSuccess('ID агента обновлен'); + } + public function syncDeals(Agent $agent) + { + $url = 'https://b24alfa.pro/channels/lk/getDealsOfContact?id=' . $agent->bitrixId(); + $data = file_get_contents($url); + $deals = json_decode($data, true); + foreach ($deals as $deal) + { + $client = false; + //Загрузка контактов + if ($deal['contacts'][0]['phone']) + { + $client = User::createOrFirst( + ['phone' => $deal['contacts'][0]['phone']], + [ + 'name' => $deal['contacts'][0]['name'], + 'phone' => $deal['contacts'][0]['phone'] + ] + ); + } + //Загрузка сделок + if (BitrixId::where('bx_id', $deal['deal']['deal_id'])->count() == 0) + { + $dealItem = Deal::create([ + 'client_id' => $client->id, + 'complex_id' => 1, + 'agent_id' => $agent->id, + 'status' => DealStatus::UNIQUE, + ]); + $dealItem->setBitrixId($deal['deal']['deal_id']); + } + } + } +} \ No newline at end of file diff --git a/app/Modules/Admin/Routes/web.php b/app/Modules/Admin/Routes/web.php index 86c1f1c..1532b76 100644 --- a/app/Modules/Admin/Routes/web.php +++ b/app/Modules/Admin/Routes/web.php @@ -55,4 +55,10 @@ Route::get('/admin/docs/{document}/edit', [Modules\Admin\Http\Controllers\AdminDocsController::class, 'edit'])->name('admin.docs.edit'); Route::post('/admin/docs/{document}/update', [Modules\Admin\Http\Controllers\AdminDocsController::class, 'update'])->name('admin.docs.update'); Route::post('/admin/docs/{document}/delete', [Modules\Admin\Http\Controllers\AdminDocsController::class, 'delete'])->name('admin.docs.delete'); + + Route::get('/admin/bitrix', [Modules\Admin\Http\Controllers\AdminBitrixController::class, 'index'])->name('admin.bitrix'); + Route::get('/admin/bitrix/agents', [Modules\Admin\Http\Controllers\AdminBitrixController::class, 'agents'])->name('admin.bitrix.agents'); + Route::post('/admin/bitrix/agents/{agent}/set', [Modules\Admin\Http\Controllers\AdminBitrixController::class, 'setAgentId'])->name('admin.bitrix.agent.set'); + Route::get('/admin/bitrix/agents/{agent}/deals/sync', [Modules\Admin\Http\Controllers\AdminBitrixController::class, 'syncDeals'])->name('admin.bitrix.agent.deals.sync'); + }); \ No newline at end of file diff --git a/app/Modules/Admin/Views/bitrix/agents.blade.php b/app/Modules/Admin/Views/bitrix/agents.blade.php new file mode 100644 index 0000000..50281c3 --- /dev/null +++ b/app/Modules/Admin/Views/bitrix/agents.blade.php @@ -0,0 +1,38 @@ +@php($title = 'Битрикс24: агенты') +@extends('layouts.admin') +@section('content') + + + + + + + + + + + + + @foreach ($agents as $agent) + + + + + @endforeach + +
ИмяАгентствоТелефонЭл. почтаID
{{ $agent->user->name }} + {{ $agent->company->name }} + {{ $agent->user->phone }} + {{ $agent->user->email }} + +
+ @csrf + + +
+
+ Sync +
+@endsection diff --git a/app/Modules/Admin/Views/bitrix/index.blade.php b/app/Modules/Admin/Views/bitrix/index.blade.php new file mode 100644 index 0000000..d672a6d --- /dev/null +++ b/app/Modules/Admin/Views/bitrix/index.blade.php @@ -0,0 +1,15 @@ +@php($title = 'Битрикс24') +@extends('layouts.admin') +@section('content') +
+
+ Агенты +
+
+
Управление агентами
+

Установить идентификаторы агентов для автоматической синхронизации информации по сделкам +

+ Перейти +
+
+@endsection diff --git a/app/Modules/Admin/Views/menu/index.blade.php b/app/Modules/Admin/Views/menu/index.blade.php index 7a1cf93..44993f1 100644 --- a/app/Modules/Admin/Views/menu/index.blade.php +++ b/app/Modules/Admin/Views/menu/index.blade.php @@ -38,6 +38,12 @@ class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4" +
  • + +
  • + @endif diff --git a/app/Modules/Bitrix/Config/config.php b/app/Modules/Bitrix/Config/config.php new file mode 100644 index 0000000..ce09543 --- /dev/null +++ b/app/Modules/Bitrix/Config/config.php @@ -0,0 +1,5 @@ +id(); + $table->morphs('bitrixable'); + $table->integer('bx_id')->nullable(); + $table->text('data')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('bx_ids'); + } +}; diff --git a/app/Modules/Bitrix/Http/Controllers/AdminBitrixController.php b/app/Modules/Bitrix/Http/Controllers/AdminBitrixController.php new file mode 100644 index 0000000..c37b875 --- /dev/null +++ b/app/Modules/Bitrix/Http/Controllers/AdminBitrixController.php @@ -0,0 +1,17 @@ +morphTo(); + } +} diff --git a/app/Modules/Bitrix/Providers/ModuleServiceProvider.php b/app/Modules/Bitrix/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..7de50ee --- /dev/null +++ b/app/Modules/Bitrix/Providers/ModuleServiceProvider.php @@ -0,0 +1,68 @@ +app->register(RouteServiceProvider::class); + } + + public function boot() + { + $this->registerViews(); + $this->registerLivewireViews(); + $this->registerMigrations(); + $this->registerConfig(); + $this->registerComponent(); + $this->registerLivewire(); + } + + protected function registerViews() + { + $moduleViewsPath = __DIR__.'/../Views'; + $this->loadViewsFrom( + $moduleViewsPath, strtolower($this->moduleName) + ); + } + + protected function registerLivewireViews() + { + $moduleViewsPath = __DIR__.'/../Views/livewire'; + $this->loadViewsFrom( + $moduleViewsPath, strtolower($this->moduleName) + ); + } + + protected function registerMigrations() + { + $this->loadMigrationsFrom( + app_path('Modules/'.$this->moduleName.'/Database/Migrations') + ); + } + + protected function registerConfig() + { + $path = app_path('Modules/'.$this->moduleName.'/Config/config.php'); + $this->mergeConfigFrom( + $path, strtolower($this->moduleName) + ); + } + + protected function registerLivewire() + { + //Livewire::component('', \Modules\\Http\Livewire\::class); + } + + protected function registerComponent() + { + //Blade::component('', \Modules\\Http\Components\::class); + } +} \ No newline at end of file diff --git a/app/Modules/Bitrix/Providers/RouteServiceProvider.php b/app/Modules/Bitrix/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..56d8a6d --- /dev/null +++ b/app/Modules/Bitrix/Providers/RouteServiceProvider.php @@ -0,0 +1,24 @@ +registerWebRoutes(); + } + + protected function registerWebRoutes() + { + //Add Web Routes with web Guard + Route::middleware('web') + //Set Default Controllers Namespace + ->namespace('Modules\\Bitrix\\Http\\Controllers') + ->group(app_path('Modules/Bitrix/Routes/web.php')); + } +} \ No newline at end of file diff --git a/app/Modules/Bitrix/Routes/web.php b/app/Modules/Bitrix/Routes/web.php new file mode 100644 index 0000000..f4f8846 --- /dev/null +++ b/app/Modules/Bitrix/Routes/web.php @@ -0,0 +1,13 @@ +group(function() { + + Route::get('/bitrix', [BitrixController::class, 'index']); + + Route::middleware(['hasAccess'])->group(function() { + /** Routes that need to be protected - Маршруты которые нужно защитить */ + }); +}); \ No newline at end of file diff --git a/app/Modules/Bitrix/Traits/Bitrixable.php b/app/Modules/Bitrix/Traits/Bitrixable.php new file mode 100644 index 0000000..9e021e3 --- /dev/null +++ b/app/Modules/Bitrix/Traits/Bitrixable.php @@ -0,0 +1,37 @@ +morphOne(BitrixId::class, 'bitrixable'); + } + public function bitrixId() + { + if ($row = $this->bitrixable()->first()) + { + return $row->bx_id; + } + return false; + } + public function setBitrixId($id): bool + { + $this->bitrixable()->delete(); + $bitrixId = new BitrixId([ + 'bx_id' => $id + ]); + if ($this->bitrixable()->save($bitrixId)) + { + return true; + } + return false; + } +} diff --git a/app/Modules/Bitrix/Views/index.blade.php b/app/Modules/Bitrix/Views/index.blade.php new file mode 100644 index 0000000..f8198cf --- /dev/null +++ b/app/Modules/Bitrix/Views/index.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.app') + @section('content') +

    Example views

    + @endsection \ No newline at end of file diff --git a/resources/views/livewire/agents-table.blade.php b/resources/views/livewire/agents-table.blade.php index ade8222..ef144bc 100644 --- a/resources/views/livewire/agents-table.blade.php +++ b/resources/views/livewire/agents-table.blade.php @@ -2,13 +2,16 @@
    - @foreach ($agents as $agent) + @foreach ($agents as $num => $agent)
    {{ $agent->user->name }} + @if (env('APP_DEBUG')) +
    Bitrix ID: {{ $agent->bitrixId() }}
    + @endif
    {{ $agent->user->phone }}