diff --git a/app/Modules/Admin/Views/posts/path/create-form.blade.php b/app/Modules/Admin/Views/posts/path/create-form.blade.php index 6ecc8a2..191f011 100644 --- a/app/Modules/Admin/Views/posts/path/create-form.blade.php +++ b/app/Modules/Admin/Views/posts/path/create-form.blade.php @@ -10,17 +10,20 @@
{{ $message }}
@enderror -
+
+ +
@if($availableCities = GetAvailableCities()) @foreach($availableCities as $key=>$city)
- -
@endforeach @endif +
diff --git a/app/Modules/Docs/Routes/web.php b/app/Modules/Docs/Routes/web.php index 6ed87de..000df14 100644 --- a/app/Modules/Docs/Routes/web.php +++ b/app/Modules/Docs/Routes/web.php @@ -5,8 +5,6 @@ Route::middleware(['auth'])->group(function () { - Route::get('/docs', [DocsController::class, 'index'])->name('docs.index'); Route::get('/docs/{document}/download', [DocsController::class, 'download'])->name('docs.download'); - }); \ No newline at end of file diff --git a/app/Modules/Invite/Config/config.php b/app/Modules/Invite/Config/config.php new file mode 100644 index 0000000..ce09543 --- /dev/null +++ b/app/Modules/Invite/Config/config.php @@ -0,0 +1,5 @@ +id(); + $table->uuid('hash'); + $table->foreignId('company_id')->references('id')->on('companies')->onDelete('cascade'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('invites'); + } +}; diff --git a/app/Modules/Invite/Database/Migrations/2026_04_27_000002_create_invite_agents_table.php b/app/Modules/Invite/Database/Migrations/2026_04_27_000002_create_invite_agents_table.php new file mode 100644 index 0000000..6913731 --- /dev/null +++ b/app/Modules/Invite/Database/Migrations/2026_04_27_000002_create_invite_agents_table.php @@ -0,0 +1,30 @@ +id(); + $table->foreignId('invite_id')->references('id')->on('invites'); + $table->foreignId('agent_id')->references('id')->on('agents'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('invite_agents'); + } +}; diff --git a/app/Modules/Invite/Http/Controllers/InviteController.php b/app/Modules/Invite/Http/Controllers/InviteController.php new file mode 100644 index 0000000..e93f9c8 --- /dev/null +++ b/app/Modules/Invite/Http/Controllers/InviteController.php @@ -0,0 +1,125 @@ +user()->id)->pluck('company_id')->toArray(); + if (!$company) { + if (auth()->user()->hasRole(Role::CITY_MANAGER)) { + $citiesIds = CityManager::where('user_id', auth()->user()->id)->pluck('city_id')->toArray(); + foreach (Company::whereIn('city_id', $citiesIds)->get() as $company) { + $companies[] = $company; + } + } + if (auth()->user()->hasRole(Role::COMPANY_ADMIN)) { + $companyAdmin = CompanyAdmin::where('user_id', auth()->user()->id)->first(); + $companies[] = $companyAdmin->company; + } + if (count($companies) > 1) { + return view('invite::companies', [ + 'companies' => $companies + ]); + } else { + return to_route('company.invites', [ + 'company' => $companies[0] + ]); + } + } + return view('invite::index', [ + 'company' => $company, + 'invites' => Invite::where('company_id', $company->id)->get() + ]); + } + public function create(Request $request, Company $company) { + Invite::create([ + 'hash' => Uuid::uuid4(), + 'company_id' => $company->id + ]); + return back(); + } + public function open(Request $request, $hash) { + if (!$invite = Invite::where('hash', $hash)->first()) { + return back(); + } + return view('invite::form', [ + 'invite' => $invite + ]); + return back(); + } + + public function process(Request $request, $hash) { + if (!$invite = Invite::where('hash', $hash)->first()) { + return back(); + } + $user = User::where('email', $request->email)->orWhere('phone', $request->phone)->first(); + + if ($user) { + if (UserRole::where('user_id', Role::AGENT)->get()) { + return back()->withInput()->withErrors('Агент с данным телефоном или электронной почтой уже зарегистрирован'); + } + } else { + $user = User::create([ + 'name' => $request->name, + 'email' => $request->email, + 'phone' => $request->phone + ]); + } + $agent = Agent::create([ + 'company_id' => $invite->company_id, + 'user_id' => $user->id + ]); + if (!$agent && $user->wasRecentlyCreated) { + $user->delete(); + return back()->withInput()->withErrors('При создании учетной записи возникла ошибка. Попробуйте сделать это немного позже'); + } + $registration = InviteAgent::create([ + 'invite_id' => $invite->id, + 'agent_id' => $agent->id + ]); + if (!$registration) { + $agent->forceDelete(); + return back()->withInput()->withErrors('При создании учетной записи возникла ошибка. Попробуйте сделать это немного позже'); + } + $user->setForcedPassword(); + return to_route('company.invite.success', [ + 'hash' => $invite->hash + ]); + } + + public function success(Request $request, $hash) { + if (!$invite = Invite::where('hash', $hash)->first()) { + return back(); + } + return view('invite::success', [ + 'invite' => $invite + ]); + } + public function delete (Invite $invite) { + $invite->delete(); + return back()->withSuccess('Ссылка-приглашение была успешно удалена'); + } + public function agents(Invite $invite) { + return view('invite::agents', [ + 'invite' => $invite + ]); + } +} \ No newline at end of file diff --git a/app/Modules/Invite/Models/Invite.php b/app/Modules/Invite/Models/Invite.php new file mode 100644 index 0000000..91aff65 --- /dev/null +++ b/app/Modules/Invite/Models/Invite.php @@ -0,0 +1,26 @@ +belongsTo(Company::class, 'company_id'); + } + + public function registrations() + { + return $this->HasMany(InviteAgent::class, 'invite_id'); + } +} diff --git a/app/Modules/Invite/Models/InviteAgent.php b/app/Modules/Invite/Models/InviteAgent.php new file mode 100644 index 0000000..9e6f747 --- /dev/null +++ b/app/Modules/Invite/Models/InviteAgent.php @@ -0,0 +1,27 @@ +belongsTo(Agent::class, 'agent_id'); + } + + public function invite() + { + return $this->belongsTo(Invite::class, 'invite_id'); + } +} diff --git a/app/Modules/Invite/Providers/ModuleServiceProvider.php b/app/Modules/Invite/Providers/ModuleServiceProvider.php new file mode 100644 index 0000000..61c5dc3 --- /dev/null +++ b/app/Modules/Invite/Providers/ModuleServiceProvider.php @@ -0,0 +1,71 @@ +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('document', \Modules\Docs\Http\Components\DocumentComponent::class); + } +} \ No newline at end of file diff --git a/app/Modules/Invite/Providers/RouteServiceProvider.php b/app/Modules/Invite/Providers/RouteServiceProvider.php new file mode 100644 index 0000000..2aed1e6 --- /dev/null +++ b/app/Modules/Invite/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\\Invite\\Http\\Controllers') + ->group(app_path('Modules/Invite/Routes/web.php')); + } +} \ No newline at end of file diff --git a/app/Modules/Invite/Routes/web.php b/app/Modules/Invite/Routes/web.php new file mode 100644 index 0000000..48ed732 --- /dev/null +++ b/app/Modules/Invite/Routes/web.php @@ -0,0 +1,17 @@ +group(function () +{ + Route::get('company/{company}/invites', [InviteController::class, 'index'])->name('company.invites'); + Route::get('company/invites', [InviteController::class, 'index'])->name('company.invites.select'); + + Route::post('company/{company}/create', [InviteController::class, 'create'])->name('company.invites.create'); + Route::get('company/invite/{hash}', [InviteController::class, 'open'])->name('company.invite.open'); + Route::post('company/invite/{hash}', [InviteController::class, 'process'])->name('company.invite.process'); + Route::get('company/invite/{hash}/success', [InviteController::class, 'success'])->name('company.invite.success'); + Route::get('company/invite/{invite}/agents', [InviteController::class, 'agents'])->name('company.invite.agents'); + Route::post('company/invite/{invite}/delete', [InviteController::class, 'delete'])->name('company.invite.delete'); +}); \ No newline at end of file diff --git a/app/Modules/Invite/Views/agents.blade.php b/app/Modules/Invite/Views/agents.blade.php new file mode 100644 index 0000000..48db33f --- /dev/null +++ b/app/Modules/Invite/Views/agents.blade.php @@ -0,0 +1,40 @@ +@php($title = 'Зарегистрированные по приглашению агенты') +@extends('layouts.app') +@section('content') +

{{ $invite->company->name }}

+
+
+
+
+ @csrf + +
+
+
+ +
Зарегистрированные по приглашению агенты
+
+ @foreach ($invite->registrations()->orderBy('created_at', 'desc')->get() as $inviteRegistration) +
+
+ {{ $inviteRegistration->agent->user?->name }} +
+
+ {{ $inviteRegistration->created_at->diffForHumans() }} +
+
+ +
+
+ @endforeach +
+
+@endsection \ No newline at end of file diff --git a/app/Modules/Invite/Views/companies.blade.php b/app/Modules/Invite/Views/companies.blade.php new file mode 100644 index 0000000..1c00e50 --- /dev/null +++ b/app/Modules/Invite/Views/companies.blade.php @@ -0,0 +1,45 @@ +@php($title = 'Приглашения агентов') +@extends('layouts.app') +@section('content') +
+
+
+
+ @csrf + +
+
+
+ +
Доступные агентства
+
+ @foreach ($companies as $company) + + {{ $company->name }} + + + + + + @endforeach +
+ +
+@endsection \ No newline at end of file diff --git a/app/Modules/Invite/Views/components/invite.blade.php b/app/Modules/Invite/Views/components/invite.blade.php new file mode 100644 index 0000000..720a68b --- /dev/null +++ b/app/Modules/Invite/Views/components/invite.blade.php @@ -0,0 +1,18 @@ +
+
+

{{ $document->name }}

+
+ {{ $document->description }} +
+
Загружен: {{ $document->created_at->diffForHumans() }}
+
+ +
diff --git a/app/Modules/Invite/Views/form.blade.php b/app/Modules/Invite/Views/form.blade.php new file mode 100644 index 0000000..370b63a --- /dev/null +++ b/app/Modules/Invite/Views/form.blade.php @@ -0,0 +1,32 @@ +@php($title = 'Приглашения агентов') +@extends('layouts.guest') +@section('content') + +@endsection \ No newline at end of file diff --git a/app/Modules/Invite/Views/index.blade.php b/app/Modules/Invite/Views/index.blade.php new file mode 100644 index 0000000..f8b69f0 --- /dev/null +++ b/app/Modules/Invite/Views/index.blade.php @@ -0,0 +1,75 @@ +@php($title = 'Приглашения агентов') +@extends('layouts.app') +@section('content') +
+
+
+
+ @csrf + +
+
+
+ +
Действующие приглашения для
{{ $company->name }}
+
+ @foreach ($invites as $invite) +
+
+
+ + +
+
+
+ Зарегистрировалось:  +
+ {{ $invite->registrations()->count() }} +
+
+
+ Создано:
{{ $invite->created_at->diffForHumans() }} +
+
+ Обновлено:
{{ $invite->updated_at->diffForHumans() }} +
+
+ +
+
+ @endforeach +
+ +
+@endsection \ No newline at end of file diff --git a/app/Modules/Invite/Views/success.blade.php b/app/Modules/Invite/Views/success.blade.php new file mode 100644 index 0000000..b11e754 --- /dev/null +++ b/app/Modules/Invite/Views/success.blade.php @@ -0,0 +1,14 @@ +@php($title = 'Приглашения агентов') +@extends('layouts.guest') +@section('content') + +
+ + + +
+ Регистрация прошла успешно. На указанную электронную почту направлено сообщение с логином и паролем для доступа к агентсткому кабинету {{ $invite->company->name }} +
+
+ +@endsection \ No newline at end of file diff --git a/app/Modules/Main/Http/Controllers/Company/CreateAgentController.php b/app/Modules/Main/Http/Controllers/Company/CreateAgentController.php index 661be36..9f09c97 100644 --- a/app/Modules/Main/Http/Controllers/Company/CreateAgentController.php +++ b/app/Modules/Main/Http/Controllers/Company/CreateAgentController.php @@ -14,7 +14,7 @@ class CreateAgentController extends Controller { - public function __invoke(Request $request) + public function __invoke(Request $request, ) { $company = Company::findOrFail($request->company_id); if ($request->user()->cannot('update', $company)) diff --git a/app/Modules/Main/Providers/ModuleServiceProvider.php b/app/Modules/Main/Providers/ModuleServiceProvider.php index 6d0e199..300fa9c 100644 --- a/app/Modules/Main/Providers/ModuleServiceProvider.php +++ b/app/Modules/Main/Providers/ModuleServiceProvider.php @@ -29,12 +29,16 @@ public function boot() $this->registerLivewire(); $this->registerHelpers(); try { - define('DESIGN_PARAMETERS', Design::getParameters()); + if (!defined('DESIGN_PARAMETERS')) { + define('DESIGN_PARAMETERS', Design::getParameters()); + } if (array_key_exists('title', DESIGN_PARAMETERS)) { \Config::set('app.name', DESIGN_PARAMETERS['title']); } } catch (\Exception $e) { - define('DESIGN_PARAMETERS', []); + if (!defined('DESIGN_PARAMETERS')) { + define('DESIGN_PARAMETERS', []); + } } ; } diff --git a/app/Modules/Main/Views/company/agents/table.blade.php b/app/Modules/Main/Views/company/agents/table.blade.php index 0689939..dad5e23 100644 --- a/app/Modules/Main/Views/company/agents/table.blade.php +++ b/app/Modules/Main/Views/company/agents/table.blade.php @@ -17,11 +17,18 @@ -
- +
+
@if (!$status || $status == 'all' || $status == $statuses::ACTIVE) @@ -39,4 +46,4 @@ @endif
@livewire('company.agent.create', ['containerId' => 'createAgentModal']) -@endsection +@endsection \ No newline at end of file diff --git a/app/Modules/Plan7/Routes/web.php b/app/Modules/Plan7/Routes/web.php index 536347e..9cf6389 100644 --- a/app/Modules/Plan7/Routes/web.php +++ b/app/Modules/Plan7/Routes/web.php @@ -1,12 +1,7 @@ group(function () { - - Route::get('/doc', [DocsController::class, 'index'])->name('docs.index'); - Route::get('/docs/{document}/download', [DocsController::class, 'download'])->name('docs.download'); - }); \ No newline at end of file diff --git a/resources/views/auth/login.blade.php b/resources/views/auth/login.blade.php index f2cfbb5..591ae68 100644 --- a/resources/views/auth/login.blade.php +++ b/resources/views/auth/login.blade.php @@ -1,5 +1,4 @@ @extends('layouts.guest') - @section('content')
diff --git a/routes/web.php b/routes/web.php index 98be77a..1fb9ecc 100644 --- a/routes/web.php +++ b/routes/web.php @@ -15,33 +15,28 @@ | */ -Route::get('/', function () -{ +Route::get('/', function () { return view(view: 'welcome'); })->name('welcome'); Auth::routes(); -Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) -{ +Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) { $request->fulfill(); return redirect('/home'); })->middleware(['auth', 'signed'])->name('verification.verify'); -Route::middleware(['auth'])->group(function () -{ +Route::middleware(['auth'])->group(function () { 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('projects', function () -{ +Route::get('projects', function () { return view(view: 'makets.projects'); }); -Route::get('profile', function () -{ +Route::get('profile', function () { return view(view: 'user.profile'); });