From 9fa55fed782dceb28c0f9f0dd733caeecbc7534a Mon Sep 17 00:00:00 2001 From: Thekindbull Date: Thu, 20 Mar 2025 10:32:29 +0800 Subject: [PATCH] contracts created --- .../Bitrix/ClientsApiController.php | 68 +++++ .../Bitrix/ContractApiController.php | 29 ++ .../Company/ConfirmCompanyController.php | 1 + .../Controllers/ConfirmClientFromBitrix.php | 2 +- .../Controllers/Deal/ContractController.php | 30 +++ app/Livewire/CreateClientForm.php | 2 +- app/Livewire/MainMenu.php | 27 ++ app/Models/Agent/Agent.php | 30 +++ app/Models/Bitrix/SendClient.php | 2 +- app/Models/Company/CompanyAdmin.php | 21 ++ app/Models/Deal/Contract.php | 28 ++ app/Models/Deal/ContractStatus.php | 11 + app/Models/Deal/Deal.php | 27 ++ app/Models/User/Role.php | 17 ++ app/Models/User/UserRole.php | 18 ++ .../2025_03_12_023918_create_roles_table.php | 36 +++ ...5_03_12_024023_create_user_roles_table.php | 30 +++ ...12_145038_create_client_contract_table.php | 35 +++ lang/ru.json | 3 +- .../views/clients/contract/index.blade.php | 110 ++++++++ resources/views/left-panel.blade.php | 3 + .../views/livewire/clients-table.blade.php | 21 +- .../livewire/create-client-form.blade.php | 36 ++- resources/views/livewire/main-menu.blade.php | 57 ++++ resources/views/makets/news.blade.php | 12 +- resources/views/makets/projects.blade.php | 249 +++++------------- resources/views/user/dashboard.blade.php | 24 +- routes/api.php | 13 +- routes/web.php | 1 + 29 files changed, 716 insertions(+), 227 deletions(-) create mode 100644 app/Http/Controllers/Bitrix/ClientsApiController.php create mode 100644 app/Http/Controllers/Bitrix/ContractApiController.php create mode 100644 app/Http/Controllers/Deal/ContractController.php create mode 100644 app/Livewire/MainMenu.php create mode 100644 app/Models/Deal/Contract.php create mode 100644 app/Models/Deal/ContractStatus.php create mode 100644 app/Models/User/Role.php create mode 100644 app/Models/User/UserRole.php create mode 100644 database/migrations/2025_03_12_023918_create_roles_table.php create mode 100644 database/migrations/2025_03_12_024023_create_user_roles_table.php create mode 100644 database/migrations/2025_03_12_145038_create_client_contract_table.php create mode 100644 resources/views/clients/contract/index.blade.php create mode 100644 resources/views/livewire/main-menu.blade.php diff --git a/app/Http/Controllers/Bitrix/ClientsApiController.php b/app/Http/Controllers/Bitrix/ClientsApiController.php new file mode 100644 index 0000000..cf50a02 --- /dev/null +++ b/app/Http/Controllers/Bitrix/ClientsApiController.php @@ -0,0 +1,68 @@ +hash)->first()) + { + switch ( $request->action ) + { + case $this::ACTION_CONFIRM: + $this->confirm($deal, $request); + break; + case $this::ACTION_UPDATE_CONTRACT: + $this->updateContract($deal, $request); + break; + } + return true; + } + return false; + } + + public function confirm(Deal $deal, Request $request) + { + if ((bool) $request->is_unique) + { + $deal->status = DealStatus::UNIQUE; + } + else + { + $deal->status = DealStatus::NOT_UNIQUE; + } + + Log::build([ + 'driver' => 'single', + 'path' => storage_path('logs/bitrix.log'), + ])->error( + json_encode( + [ + 'is_unique' => $request->is_unique, + 'deal' => $deal->id, + 'status' => $deal->status + ] + ) + ); + $deal->save(); + return $deal->id; + } + + public function update_contract(Deal $deal, Request $request) + { + $contract = new ContractApiController; + $contract($deal, $request); + } + } diff --git a/app/Http/Controllers/Bitrix/ContractApiController.php b/app/Http/Controllers/Bitrix/ContractApiController.php new file mode 100644 index 0000000..6d2b788 --- /dev/null +++ b/app/Http/Controllers/Bitrix/ContractApiController.php @@ -0,0 +1,29 @@ + $deal->id], + [ + 'status' => ContractStatus::NEW , + 'comment' => $request->comment, + 'price' => $request->price, + 'reward' => $request->reward, + 'square' => $request->square, + 'floor' => $request->floor + ] + ); + return true; + } + } \ No newline at end of file diff --git a/app/Http/Controllers/Company/ConfirmCompanyController.php b/app/Http/Controllers/Company/ConfirmCompanyController.php index d51e5cd..4a987df 100644 --- a/app/Http/Controllers/Company/ConfirmCompanyController.php +++ b/app/Http/Controllers/Company/ConfirmCompanyController.php @@ -34,6 +34,7 @@ public function __invoke(Request $request) ]); $user->setForcedPassword(); } + CompanyAdmin::where('user_id', $user->id)->delete();//удаляю, если уже была админская учетка CompanyAdmin::create([ 'user_id' => $user->id, 'company_id' => $company->id diff --git a/app/Http/Controllers/ConfirmClientFromBitrix.php b/app/Http/Controllers/ConfirmClientFromBitrix.php index 3cd2000..4ea31cf 100644 --- a/app/Http/Controllers/ConfirmClientFromBitrix.php +++ b/app/Http/Controllers/ConfirmClientFromBitrix.php @@ -1,5 +1,5 @@ $contract + ] + ); + + } + + public function getAllDealsInCompany(Request $request) + { + $user = auth()->user(); + } + } diff --git a/app/Livewire/CreateClientForm.php b/app/Livewire/CreateClientForm.php index ebea135..2007c7e 100644 --- a/app/Livewire/CreateClientForm.php +++ b/app/Livewire/CreateClientForm.php @@ -177,7 +177,7 @@ public function sendToBitrix(Deal $deal) 'BROKER_PHONE' => $agent->user->phone, 'BROKER_INN' => $agent->company->inn, 'OBJECT_NAME' => Complex::find($this->client['complexId'])->name, - 'CALLBACK_URL' => route('deal.confirm', ['hash' => $this->client['confirmToken']]), + 'CALLBACK_URL' => route('api.client', ['hash' => $this->client['confirmToken']]), ]; $sender = new SendClient($deal->id, $data); $response = $sender->send(); diff --git a/app/Livewire/MainMenu.php b/app/Livewire/MainMenu.php new file mode 100644 index 0000000..90fbafc --- /dev/null +++ b/app/Livewire/MainMenu.php @@ -0,0 +1,27 @@ +userId = auth()->user()->id; + } + public function render() + { + return view('livewire.main-menu', [ + 'userRoles' => UserRole::where('user_id', $this->userId)->pluck('role_id')->toArray(), + 'roles' => Role::class + ]); + } + } diff --git a/app/Models/Agent/Agent.php b/app/Models/Agent/Agent.php index 0b0ac64..2a7c7a5 100644 --- a/app/Models/Agent/Agent.php +++ b/app/Models/Agent/Agent.php @@ -9,6 +9,8 @@ use App\Models\Company\Company; use App\Models\User; +use App\Models\User\UserRole; +use App\Models\User\Role; use App\Models\Deal\Deal; class Agent extends Model @@ -34,4 +36,32 @@ public function deals() { return $this->hasMany(Deal::class); } + + protected static function booted(): void + { + static::created(function (Agent $agent) + { + UserRole::create([ + 'user_id' => $agent->user_id, + 'role_id' => Role::AGENT + ]); + }); + static::updated(function (Agent $agent) + { + if ($agent->trashed()) + { + UserRole::where([ + 'user_id' => $agent->user_id, + 'role_id' => Role::AGENT + ])->delete(); + } + else + { + UserRole::create([ + 'user_id' => $agent->user_id, + 'role_id' => Role::AGENT + ]); + } + }); + } } diff --git a/app/Models/Bitrix/SendClient.php b/app/Models/Bitrix/SendClient.php index 92af2e3..3421dd4 100644 --- a/app/Models/Bitrix/SendClient.php +++ b/app/Models/Bitrix/SendClient.php @@ -26,7 +26,7 @@ class SendClient public function __construct($id, $data) { - $this->ID = $id; + $this->ID = env('BITRIX_CODE_PREFIX', '') . $id; $data = array_change_key_case($data, CASE_UPPER); $finalData = []; $refl = new \ReflectionClass(__CLASS__); diff --git a/app/Models/Company/CompanyAdmin.php b/app/Models/Company/CompanyAdmin.php index 8a27f00..380d5a9 100644 --- a/app/Models/Company/CompanyAdmin.php +++ b/app/Models/Company/CompanyAdmin.php @@ -5,6 +5,9 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use App\Models\User\UserRole; +use App\Models\User\Role; + class CompanyAdmin extends Model { use HasFactory; @@ -13,4 +16,22 @@ class CompanyAdmin extends Model 'company_id' ]; + protected static function booted(): void + { + static::created(function (CompanyAdmin $admin) + { + UserRole::create([ + 'user_id' => $admin->user_id, + 'role_id' => Role::COMPANY_ADMIN + ]); + }); + static::deleted(function (CompanyAdmin $admin) + { + UserRole::where([ + 'user_id' => $admin->user_id, + 'role_id' => Role::COMPANY_ADMIN + ])->delete(); + }); + + } } diff --git a/app/Models/Deal/Contract.php b/app/Models/Deal/Contract.php new file mode 100644 index 0000000..6d23d59 --- /dev/null +++ b/app/Models/Deal/Contract.php @@ -0,0 +1,28 @@ +belongsTo(Deal::class, 'deal_id'); + } + } diff --git a/app/Models/Deal/ContractStatus.php b/app/Models/Deal/ContractStatus.php new file mode 100644 index 0000000..f294dd8 --- /dev/null +++ b/app/Models/Deal/ContractStatus.php @@ -0,0 +1,11 @@ +belongsTo(\App\Models\Agent\Agent::class, 'agent_id'); } + + public function contract() + { + return $this->hasOne(Contract::class, 'deal_id'); + } + + protected static function booted(): void + { + static::created(function (Deal $deal) + { + UserRole::create([ + 'user_id' => $deal->client_id, + 'role_id' => Role::CLIENT + ]); + }); + static::deleted(function (Deal $deal) + { + UserRole::where([ + 'user_id' => $deal->client_id, + 'role_id' => Role::CLIENT + ])->delete(); + }); + + } } diff --git a/app/Models/User/Role.php b/app/Models/User/Role.php new file mode 100644 index 0000000..67a5ace --- /dev/null +++ b/app/Models/User/Role.php @@ -0,0 +1,17 @@ +id(); + $table->string('name'); + $table->timestamps(); + }); + + DB::table('roles')->insert([ + ['id' => 1, 'name' => 'Super admin'], + ['id' => 2, 'name' => 'Company admin'], + ['id' => 3, 'name' => 'Agent'], + ['id' => 4, 'name' => 'Client'], + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('roles'); + } + }; diff --git a/database/migrations/2025_03_12_024023_create_user_roles_table.php b/database/migrations/2025_03_12_024023_create_user_roles_table.php new file mode 100644 index 0000000..8b28d8d --- /dev/null +++ b/database/migrations/2025_03_12_024023_create_user_roles_table.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreignId(column: 'role_id')->references('id')->on('roles')->onDelete('cascade'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_roles'); + } + }; diff --git a/database/migrations/2025_03_12_145038_create_client_contract_table.php b/database/migrations/2025_03_12_145038_create_client_contract_table.php new file mode 100644 index 0000000..d967f4f --- /dev/null +++ b/database/migrations/2025_03_12_145038_create_client_contract_table.php @@ -0,0 +1,35 @@ +id(); + $table->foreignId('deal_id')->references('id')->on('deals')->onDelete('cascade'); + $table->enum('status', ['NEW', 'DECLINE', 'TREATY', 'SUCCESS', 'RESERVATION'])->default('NEW'); + $table->string('comment')->nullable(); + $table->float('price')->nullable(); + $table->float('reward')->nullable(); + $table->float('square')->nullable(); + $table->integer('floor')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('client_contract'); + } + }; diff --git a/lang/ru.json b/lang/ru.json index 1a87168..f6a9108 100644 --- a/lang/ru.json +++ b/lang/ru.json @@ -29,5 +29,6 @@ "Phone": "Номер телефона", "Email": "Электронная почта", "SelfEmployer name": "ФИО полностью", - "SoleProperty name": "ФИО полностью" + "SoleProperty name": "ФИО полностью", + "contract status new": "Новый" } \ No newline at end of file diff --git a/resources/views/clients/contract/index.blade.php b/resources/views/clients/contract/index.blade.php new file mode 100644 index 0000000..4e22527 --- /dev/null +++ b/resources/views/clients/contract/index.blade.php @@ -0,0 +1,110 @@ +@extends('layouts.app') + +@section('content') +
+
+ +
+
+
ФИО
+
{{ $contract->deal->user->name }}
+
+
+
Email
+
{{ $contract->deal->user->email }}
+
+
+
Телефон
+
{{ $contract->deal->user->phone }}
+
+ +
+ +
+
+
{{ $contract->deal->complex->city->name }}
+
Не выбрано
+
+ +
+ +
+
+
+
+
Статус
+
+ {{ __('contract status ' . strtolower($contract->status)) }} +
+
+
+
Дата создания
+
+ {{ $contract->created_at->format('d.m.y H:i') }}
+
+
+
+
+
Площадь объекта
+
{{ $contract->square }}
+
+
+
Этаж
+
{{ $contract->floor }}
+
+
+
+
+
Комментарий к договору
+
{{ $contract->comment }}
+
+
+
+
+
+
+
+
+
+
История договора
+ @for ($i = 0; $i <= 4; $i++) +
+
+ + + +
+
+
05.03.25
+
Запланирована встреча с клиентом
+
+
+ @endfor +
+
+@endsection diff --git a/resources/views/left-panel.blade.php b/resources/views/left-panel.blade.php index 6348ada..86e6641 100644 --- a/resources/views/left-panel.blade.php +++ b/resources/views/left-panel.blade.php @@ -1,3 +1,5 @@ + + diff --git a/resources/views/livewire/clients-table.blade.php b/resources/views/livewire/clients-table.blade.php index 3ec852a..57ba1e9 100644 --- a/resources/views/livewire/clients-table.blade.php +++ b/resources/views/livewire/clients-table.blade.php @@ -7,9 +7,9 @@ @foreach ($deals as $deal) - + {{ $deal->user->name }} @if ($deal->status == $statuses::MODERATION) @@ -30,7 +30,7 @@ {{ $deal->complex->city->name }} - + @@ -39,6 +39,21 @@ + @if ($deal->contract) + + + + + + + + + + @else + + @endif @endif @endforeach diff --git a/resources/views/livewire/create-client-form.blade.php b/resources/views/livewire/create-client-form.blade.php index 3f9dc3c..a2e417f 100644 --- a/resources/views/livewire/create-client-form.blade.php +++ b/resources/views/livewire/create-client-form.blade.php @@ -10,12 +10,12 @@ Добавить клиента
-
+
- + @error('client.firstName') {{ $message }} @@ -23,12 +23,12 @@ class="form-control rounded-4 @error('client.firstName') is-invalid @enderror" @enderror
-
+
- + @error('client.secondName') {{ $message }} @@ -39,7 +39,7 @@ class="form-control rounded-4 @error('client.secondName') is-invalid @enderror"
-
+
-
+
- @if($adminAccount) + @if ($adminAccount)
- @foreach ($agents as $agent)
@script - + @endscript
diff --git a/resources/views/livewire/main-menu.blade.php b/resources/views/livewire/main-menu.blade.php new file mode 100644 index 0000000..b5e712f --- /dev/null +++ b/resources/views/livewire/main-menu.blade.php @@ -0,0 +1,57 @@ +
+ + +
diff --git a/resources/views/makets/news.blade.php b/resources/views/makets/news.blade.php index 38a1b0f..4315b7b 100644 --- a/resources/views/makets/news.blade.php +++ b/resources/views/makets/news.blade.php @@ -14,7 +14,7 @@
-
+
@@ -28,7 +28,7 @@
-
+
@@ -25,7 +25,7 @@
-
+
-
+
Комнатность
- +
@@ -82,7 +83,8 @@ Срок заселения
- +
@@ -101,7 +103,8 @@  
- + @@ -115,183 +118,73 @@
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% + @for ($i = 0; $i <= 3; $i++) +
+
+
+ ... +
+ Новые + корпуса + Ипотека + 5% +
+
+
+
+ Пионер + от 4,5 млн. Р +
+

Иркутск, ул. 4-я Совесткая, 11

-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% +
+
+ ... +
+ Новые + корпуса + Ипотека + 5% +
+
+
+
+ Пионер + от 4,5 млн. Р +
+

Иркутск, ул. 4-я Совесткая, 11

-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% +
+
+ ... +
+ Новые + корпуса + Ипотека + 5% +
+
+
+
+ Пионер + от 4,5 млн. Р +
+

Иркутск, ул. 4-я Совесткая, 11

-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% -
-
-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% -
-
-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% -
-
-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% -
-
-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% -
-
-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
-
- ... -
- Новые - корпуса - Ипотека - 5% -
-
-
-
- Пионер - от 4,5 млн. Р -
-

Иркутск, ул. 4-я Совесткая, 11

-
-
-
+ @endfor
-@endsection \ No newline at end of file +@endsection diff --git a/resources/views/user/dashboard.blade.php b/resources/views/user/dashboard.blade.php index 2d78fa2..8170cac 100644 --- a/resources/views/user/dashboard.blade.php +++ b/resources/views/user/dashboard.blade.php @@ -33,7 +33,7 @@ class="list-group-item list-group-item-action p-3 bg-white rounded border border
-
@@ -45,8 +45,8 @@ class="list-group-item list-group-item-action p-3 bg-white rounded border border
Новости
Смотреть все
-
-
+
+
@@ -58,14 +58,14 @@ class="badge bg-body-secondary text-dark border-secondary bg-opacity-75 fs-6 rou
+ style="height:200px;background-image:url('https://img3.sibdom.ru/images/photo_crop_282_212/houses/photo_main/97/97be/97be2371dd0bba9c4605c3ea6f06e213.jpg')">
-
+
@@ -77,14 +77,14 @@ class="badge bg-body-secondary text-dark border-secondary bg-opacity-75 fs-6 rou
+ style="height:200px;background-image:url('https://img3.sibdom.ru/images/photo_crop_282_212/houses/photo_main/97/97be/97be2371dd0bba9c4605c3ea6f06e213.jpg')">
-
+
@@ -96,7 +96,7 @@ class="badge bg-body-secondary text-dark border-secondary bg-opacity-75 fs-6 rou
+ style="height:200px;background-image:url('https://img3.sibdom.ru/images/photo_crop_282_212/houses/photo_main/97/97be/97be2371dd0bba9c4605c3ea6f06e213.jpg')"> @@ -110,8 +110,8 @@ class="badge bg-body-secondary text-dark border-secondary bg-opacity-75 fs-6 rou
Избранное
Смотреть все
-
-
+
+
... @@ -130,7 +130,7 @@ class="" alt="...">

Иркутск, ул. 4-я Совесткая, 11

-
+
... @@ -149,7 +149,7 @@ class="" alt="...">

Иркутск, ул. 4-я Совесткая, 11

-
+
... diff --git a/routes/api.php b/routes/api.php index da06763..94321dc 100644 --- a/routes/api.php +++ b/routes/api.php @@ -5,6 +5,7 @@ use App\Http\Controllers\ConfirmClientFromBitrix; use App\Http\Controllers\Company\ConfirmCompanyController; +use App\Http\Controllers\Bitrix\ClientsApiController; /* |-------------------------------------------------------------------------- @@ -17,9 +18,13 @@ | */ -Route::middleware('auth:sanctum')->get('/user', function (Request $request) { +Route::middleware('auth:sanctum')->get('/user', function (Request $request) + { return $request->user(); -}); + }); -Route::post('/client/confirm', [ConfirmClientFromBitrix::class, 'confirm'])->name('deal.confirm'); -Route::post('/company/status/update', ConfirmCompanyController::class)->name('company.status.update'); \ No newline at end of file +Route::post('/client', [ClientsApiController::class, 'index'])->name('api.client'); + +//Route::post('/client/confirm', [ConfirmClientFromBitrix::class, 'confirm'])->name('deal.confirm'); +//Route::post('/client/{$deal}/contract', CoController::class)->name('company.status.update'); +Route::post('/company/status/update', ConfirmCompanyController::class)->name('company.status.update'); diff --git a/routes/web.php b/routes/web.php index d592d74..37109c4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -39,6 +39,7 @@ { Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); Route::get('/clients/table', [App\Http\Controllers\ClientsTableController::class, 'index'])->name('clients.table'); + Route::get('/contract/{contract}', [App\Http\Controllers\Deal\ContractController::class, 'index'])->name('contract'); Route::get('/company/details/', [App\Http\Controllers\Company\DetailsController::class, 'index'])->name('company.details'); Route::post('/company/{company}/details/', [App\Http\Controllers\Company\DetailsController::class, 'store'])->name('company.details.store'); Route::get('/agents/table', [App\Http\Controllers\Company\AgentsTableController::class, 'index'])->name('company.agents.table');