import from bitrix created

This commit is contained in:
Thekindbull 2025-07-16 09:45:40 +08:00
parent c5f369e2a5
commit 28a8933fb9
20 changed files with 391 additions and 3 deletions

View File

@ -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'),

View File

@ -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;
}

View File

@ -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 = [

View File

@ -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',

View File

@ -0,0 +1,69 @@
<?php
namespace Modules\Admin\Http\Controllers;
use Modules\Docs\Models\Document;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use App\Models\Agent\Agent;
use App\Models\Deal\Deal;
use App\Models\Deal\DealStatus;
use Modules\Bitrix\Models\BitrixId;
use App\Models\User;
//use App\Models\User\UserRole;
//use App\Models\User\Role;
class AdminBitrixController extends Controller
{
public function index()
{
return view('admin::bitrix.index', [
]);
}
public function agents()
{
return view('admin::bitrix.agents', [
'agents' => 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']);
}
}
}
}

View File

@ -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');
});

View File

@ -0,0 +1,38 @@
@php($title = 'Битрикс24: агенты')
@extends('layouts.admin')
@section('content')
<table class="table">
<thead>
<tr>
<th scope="col">Имя</th>
<th scope="col">Агентство</th>
<th scope="col">Телефон</th>
<th scope="col">Эл. почта</th>
<th scope="col">ID</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach ($agents as $agent)
<tr>
<td>{{ $agent->user->name }}
<td>{{ $agent->company->name }}
<td>{{ $agent->user->phone }}
<td>{{ $agent->user->email }}
<td>
<form method="post" action="{{ route('admin.bitrix.agent.set', ['agent' => $agent->id]) }}"
class="input-group mb-3">
@csrf
<input type="text" name="id" class="form-control" placeholder="ID из Битрикс24"
aria-label="" aria-describedby="button-addon2" value="{{ $agent->bitrixId() }}">
<button class="btn btn-outline-secondary" type="submit" id="button-addon2">Сохранить</button>
</form>
</td>
<td>
<a href="{{ route('admin.bitrix.agent.deals.sync', ['agent' => $agent->id]) }}">Sync</a>
</td>
</tr>
@endforeach
</tbody>
</table>
@endsection

View File

@ -0,0 +1,15 @@
@php($title = 'Битрикс24')
@extends('layouts.admin')
@section('content')
<div class="card">
<div class="card-header">
Агенты
</div>
<div class="card-body">
<h5 class="card-title">Управление агентами</h5>
<p class="card-text">Установить идентификаторы агентов для автоматической синхронизации информации по сделкам
</p>
<a href="{{ route('admin.bitrix.agents') }}" class="btn btn-primary">Перейти</a>
</div>
</div>
@endsection

View File

@ -38,6 +38,12 @@ class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
<li class="nav-item text-center m-2"><a
class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
href="{{ route('admin.docs') }}">Документы</a></li>
<li>
<h6 class="dropdown-header text-uppercase">Интеграции</h6>
</li>
<li class="nav-item text-center m-2"><a
class="nav-link d-flex align-items-center gap-2 fs-5 border rounded-4"
href="{{ route('admin.bitrix') }}">Битрикс24</a></li>
</ul>
@endif
</div>

View File

@ -0,0 +1,5 @@
<?php
return [
];

View File

@ -0,0 +1,31 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('bx_ids', function (Blueprint $table)
{
$table->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');
}
};

View File

@ -0,0 +1,17 @@
<?php
namespace Modules\Bitrix\Http\Controllers;
use Modules\Bitrix\Models\Bitrix;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class AdminBitrixController extends Controller
{
public function index()
{
return view('bitrix::index');
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace Modules\Bitrix\Http\Controllers;
use Modules\Bitrix\Models\Bitrix;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
class BitrixController extends Controller
{
public function index()
{
return view('bitrix::index');
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace Modules\Bitrix\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo;
class BitrixId extends Model
{
use HasFactory;
protected $table = 'bx_ids';
protected $fillable = [
'bx_id'
];
public function bitrixable(): MorphTo
{
return $this->morphTo();
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace Modules\Bitrix\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
use Livewire\Livewire;
class ModuleServiceProvider extends ServiceProvider
{
protected String $moduleName = 'Bitrix';
public function register()
{
$this->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('<name>', \Modules\<NAME>\Http\Livewire\<NAME>::class);
}
protected function registerComponent()
{
//Blade::component('<name>', \Modules\<NAME>\Http\Components\<NAME>::class);
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace Modules\Bitrix\Providers;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
public function map()
{
$this->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'));
}
}

View File

@ -0,0 +1,13 @@
<?php
use Illuminate\Support\Facades\Route;
use Modules\Bitrix\Http\Controllers\BitrixController;
Route::middleware(['auth'])->group(function() {
Route::get('/bitrix', [BitrixController::class, 'index']);
Route::middleware(['hasAccess'])->group(function() {
/** Routes that need to be protected - Маршруты которые нужно защитить */
});
});

View File

@ -0,0 +1,37 @@
<?php
namespace Modules\Bitrix\Traits;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\MorphOne;
use Illuminate\Database\Eloquent\Model;
use Modules\Bitrix\Models\BitrixId;
trait Bitrixable
{
private function bitrixable(): MorphOne
{
return $this->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;
}
}

View File

@ -0,0 +1,4 @@
@extends('layouts.app')
@section('content')
<h1> Example views </h1>
@endsection

View File

@ -2,13 +2,16 @@
<div class="fs-5 bg-light p-0 m-0 border border-1 rounded-4 overflow-hidden">
<table class="table m-0">
<tbody class="">
@foreach ($agents as $agent)
@foreach ($agents as $num => $agent)
<tr>
<td>
<img src="../../images/icons/user.png" class="img-fluid align-middle" style="height: 50px;">
</td>
<td class="fw-semibold fs-5 align-middle">
{{ $agent->user->name }}
@if (env('APP_DEBUG'))
<div class="text-secondary fs-6 fw-light">Bitrix ID: {{ $agent->bitrixId() }} </div>
@endif
</td>
<td class="align-middle">
{{ $agent->user->phone }}