diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php old mode 100644 new mode 100755 diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Admin/OrganizationController.php b/app/Http/Controllers/Admin/OrganizationController.php new file mode 100755 index 0000000..2fa898e --- /dev/null +++ b/app/Http/Controllers/Admin/OrganizationController.php @@ -0,0 +1,108 @@ +middleware('auth'); + } + + public function index() + { + Gate::authorize('viewAny', Organization::class); + + $organizations = Organization::withCount('users', 'groups', 'courses') + ->orderBy('created_at', 'desc') + ->paginate(20); + + return view('admin.organizations.index', compact('organizations')); + } + + public function create() + { + Gate::authorize('create', Organization::class); + + return view('admin.organizations.create'); + } + + public function store(Request $request) + { + Gate::authorize('create', Organization::class); + + $validated = $request->validate([ + 'name' => 'required|string|max:255|unique:organizations', + 'inn' => 'nullable|string|max:20', + 'kpp' => 'nullable|string|max:20', + 'address' => 'nullable|string|max:500', + 'phone' => 'nullable|string|max:20', + 'email' => 'nullable|email|max:255', + 'description' => 'nullable|string', + ]); + + $validated['is_active'] = $request->boolean('is_active'); + + Organization::create($validated); + + return redirect()->route('admin.organizations.index') + ->with('success', 'Организация успешно создана.'); + } + + public function show(Organization $organization) + { + Gate::authorize('view', $organization); + + $organization->load(['users', 'groups', 'courseRequests']); + + return view('admin.organizations.show', compact('organization')); + } + + public function edit(Organization $organization) + { + Gate::authorize('update', $organization); + + return view('admin.organizations.edit', compact('organization')); + } + + public function update(Request $request, Organization $organization) + { + Gate::authorize('update', $organization); + + $validated = $request->validate([ + 'name' => 'required|string|max:255|unique:organizations,name,' . $organization->id, + 'inn' => 'nullable|string|max:20', + 'kpp' => 'nullable|string|max:20', + 'address' => 'nullable|string|max:500', + 'phone' => 'nullable|string|max:20', + 'email' => 'nullable|email|max:255', + 'description' => 'nullable|string', + ]); + + $validated['is_active'] = $request->boolean('is_active'); + + $organization->update($validated); + + return redirect()->route('admin.organizations.show', $organization) + ->with('success', 'Организация успешно обновлена.'); + } + + public function destroy(Organization $organization) + { + Gate::authorize('delete', $organization); + + if ($organization->users()->count() > 0) { + return back()->with('error', 'Невозможно удалить организацию с пользователями.'); + } + + $organization->delete(); + + return redirect()->route('admin.organizations.index') + ->with('success', 'Организация успешно удалена.'); + } +} diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php old mode 100644 new mode 100755 diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php old mode 100644 new mode 100755 diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/PreventRequestsDuringMaintenance.php b/app/Http/Middleware/PreventRequestsDuringMaintenance.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/TrustHosts.php b/app/Http/Middleware/TrustHosts.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/ValidateSignature.php b/app/Http/Middleware/ValidateSignature.php old mode 100644 new mode 100755 diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php old mode 100644 new mode 100755 diff --git a/app/Models/Answer.php b/app/Models/Answer.php old mode 100644 new mode 100755 diff --git a/app/Models/Course.php b/app/Models/Course.php old mode 100644 new mode 100755 diff --git a/app/Models/CourseAssignment.php b/app/Models/CourseAssignment.php old mode 100644 new mode 100755 diff --git a/app/Models/CourseCategory.php b/app/Models/CourseCategory.php old mode 100644 new mode 100755 diff --git a/app/Models/CourseModule.php b/app/Models/CourseModule.php old mode 100644 new mode 100755 diff --git a/app/Models/CourseRequest.php b/app/Models/CourseRequest.php old mode 100644 new mode 100755 diff --git a/app/Models/CourseRequestItem.php b/app/Models/CourseRequestItem.php old mode 100644 new mode 100755 diff --git a/app/Models/Group.php b/app/Models/Group.php old mode 100644 new mode 100755 diff --git a/app/Models/Log.php b/app/Models/Log.php old mode 100644 new mode 100755 diff --git a/app/Models/Organization.php b/app/Models/Organization.php old mode 100644 new mode 100755 diff --git a/app/Models/Question.php b/app/Models/Question.php old mode 100644 new mode 100755 diff --git a/app/Models/QuestionMatchingPair.php b/app/Models/QuestionMatchingPair.php old mode 100644 new mode 100755 diff --git a/app/Models/ScormData.php b/app/Models/ScormData.php old mode 100644 new mode 100755 diff --git a/app/Models/Test.php b/app/Models/Test.php old mode 100644 new mode 100755 diff --git a/app/Models/TestAttempt.php b/app/Models/TestAttempt.php old mode 100644 new mode 100755 diff --git a/app/Models/TestResponse.php b/app/Models/TestResponse.php old mode 100644 new mode 100755 diff --git a/app/Models/User.php b/app/Models/User.php old mode 100644 new mode 100755 diff --git a/app/Models/UserCourseProgress.php b/app/Models/UserCourseProgress.php old mode 100644 new mode 100755 diff --git a/app/Policies/OrganizationPolicy.php b/app/Policies/OrganizationPolicy.php new file mode 100755 index 0000000..98b036c --- /dev/null +++ b/app/Policies/OrganizationPolicy.php @@ -0,0 +1,65 @@ +hasRole(['Administrator', 'Manager']); + } + + /** + * Determine whether the user can view the model. + */ + public function view(User $user, Organization $organization): bool + { + return $user->hasRole(['Administrator', 'Manager', 'Curator']); + } + + /** + * Determine whether the user can create models. + */ + public function create(User $user): bool + { + return $user->hasRole(['Administrator', 'Manager']); + } + + /** + * Determine whether the user can update the model. + */ + public function update(User $user, Organization $organization): bool + { + return $user->hasRole(['Administrator', 'Manager']); + } + + /** + * Determine whether the user can delete the model. + */ + public function delete(User $user, Organization $organization): bool + { + return $user->hasRole(['Administrator']); + } + + /** + * Determine whether the user can restore the model. + */ + public function restore(User $user, Organization $organization): bool + { + return $user->hasRole(['Administrator']); + } + + /** + * Determine whether the user can permanently delete the model. + */ + public function forceDelete(User $user, Organization $organization): bool + { + return $user->hasRole(['Administrator']); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php old mode 100644 new mode 100755 diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php old mode 100644 new mode 100755 index 54756cd..c5e5d65 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -2,7 +2,8 @@ namespace App\Providers; -// use Illuminate\Support\Facades\Gate; +use App\Models\Organization; +use App\Policies\OrganizationPolicy; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider @@ -13,7 +14,7 @@ class AuthServiceProvider extends ServiceProvider * @var array */ protected $policies = [ - // + Organization::class => OrganizationPolicy::class, ]; /** diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php old mode 100644 new mode 100755 diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php old mode 100644 new mode 100755 diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php old mode 100644 new mode 100755 diff --git a/resources/views/admin/organizations/create.blade.php b/resources/views/admin/organizations/create.blade.php new file mode 100644 index 0000000..dd9d9b6 --- /dev/null +++ b/resources/views/admin/organizations/create.blade.php @@ -0,0 +1,143 @@ +@extends('layouts.app') + +@section('title', 'Добавить организацию') + +@section('content') +
+
+ + +
+
+

Добавить организацию

+ + Назад + +
+ + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf +
+
+
+
+
Основная информация
+ +
+ + + @error('name') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('description') +
{{ $message }}
+ @enderror +
+ +
+ + +
+
+
+
+ +
+
+
+
Контактная информация
+ +
+ + + @error('inn') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('kpp') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('email') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('phone') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('address') +
{{ $message }}
+ @enderror +
+
+
+
+
+ +
+ + + Отмена + +
+
+
+
+
+@endsection diff --git a/resources/views/admin/organizations/edit.blade.php b/resources/views/admin/organizations/edit.blade.php new file mode 100644 index 0000000..65cc1a0 --- /dev/null +++ b/resources/views/admin/organizations/edit.blade.php @@ -0,0 +1,144 @@ +@extends('layouts.app') + +@section('title', 'Редактировать организацию') + +@section('content') +
+
+ + +
+
+

Редактировать организацию

+ + Назад + +
+ + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ @csrf + @method('PUT') +
+
+
+
+
Основная информация
+ +
+ + + @error('name') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('description') +
{{ $message }}
+ @enderror +
+ +
+ is_active) ? 'checked' : '' }}> + +
+
+
+
+ +
+
+
+
Контактная информация
+ +
+ + + @error('inn') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('kpp') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('email') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('phone') +
{{ $message }}
+ @enderror +
+ +
+ + + @error('address') +
{{ $message }}
+ @enderror +
+
+
+
+
+ +
+ + + Отмена + +
+
+
+
+
+@endsection diff --git a/resources/views/admin/organizations/index.blade.php b/resources/views/admin/organizations/index.blade.php new file mode 100644 index 0000000..ba9e30c --- /dev/null +++ b/resources/views/admin/organizations/index.blade.php @@ -0,0 +1,154 @@ +@extends('layouts.app') + +@section('title', 'Организации') + +@section('content') +
+
+ + + + +
+
+

Организации

+ @can('create', App\Models\Organization::class) + + @endcan +
+ + @if(session('success')) + + @endif + + @if(session('error')) + + @endif + +
+
+
+ + + + + + + + + + + + + + + + @forelse($organizations as $org) + + + + + + + + + + + + @empty + + + + @endforelse + +
IDНазваниеINN/KPPEmailПользователейГруппКурсовСтатусДействия
{{ $org->id }} + + {{ $org->name }} + + + @if($org->inn) + {{ $org->inn }} + @if($org->kpp)
{{ $org->kpp }}@endif + @else + + @endif +
{{ $org->email ?? '—' }}{{ $org->users_count }}{{ $org->groups_count }}{{ $org->courses_count ?? 0 }} + @if($org->is_active) + Активна + @else + Не активна + @endif + +
+ + + + @can('update', $org) + + + + @endcan + @can('delete', $org) +
+ @csrf + @method('DELETE') + +
+ @endcan +
+
+ +

Организаций пока нет

+
+
+
+
+ + @if($organizations->hasPages()) +
+ {{ $organizations->links() }} +
+ @endif +
+
+
+@endsection diff --git a/resources/views/admin/organizations/show.blade.php b/resources/views/admin/organizations/show.blade.php new file mode 100644 index 0000000..e7ad68f --- /dev/null +++ b/resources/views/admin/organizations/show.blade.php @@ -0,0 +1,178 @@ +@extends('layouts.app') + +@section('title', $organization->name) + +@section('content') +
+
+ + +
+
+

{{ $organization->name }}

+
+ @can('update', $organization) + + Редактировать + + @endcan + + Назад + +
+
+ + @if(session('success')) +
+ {{ session('success') }} +
+ @endif + +
+
+
+
+
Информация
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Название:{{ $organization->name }}
ИНН/КПП:{{ $organization->inn ?? '—' }} / {{ $organization->kpp ?? '—' }}
Адрес:{{ $organization->address ?? '—' }}
Email:{{ $organization->email ?? '—' }}
Телефон:{{ $organization->phone ?? '—' }}
Статус: + @if($organization->is_active) + Активна + @else + Не активна + @endif +
Описание:{{ $organization->description ?? '—' }}
+
+
+
+ +
+
+
+
Статистика
+
+
+
+
+
{{ $organization->users->count() }}
+
Пользователей
+
+
+
{{ $organization->groups->count() }}
+
Групп
+
+
+
{{ $organization->courseRequests->count() }}
+
Заявок
+
+
+
+
+
+
+ +
+
+
+
+
Пользователи
+
+
+ @if($organization->users->count() > 0) +
    + @foreach($organization->users->take(5) as $user) +
  • + {{ $user->name }} + {{ $user->email }} +
  • + @endforeach +
+ @if($organization->users->count() > 5) +
+ + ещё {{ $organization->users->count() - 5 }} пользователей +
+ @endif + @else +

Нет пользователей

+ @endif +
+
+
+ +
+
+
+
Группы
+
+
+ @if($organization->groups->count() > 0) +
    + @foreach($organization->groups->take(5) as $group) +
  • + {{ $group->name }} + @if($group->description) +
    {{ Str::limit($group->description, 50) }} + @endif +
  • + @endforeach +
+ @if($organization->groups->count() > 5) +
+ + ещё {{ $organization->groups->count() - 5 }} групп +
+ @endif + @else +

Нет групп

+ @endif +
+
+
+
+
+
+
+@endsection diff --git a/resources/views/dashboard/admin.blade.php b/resources/views/dashboard/admin.blade.php index 0db34b4..1ac591c 100644 --- a/resources/views/dashboard/admin.blade.php +++ b/resources/views/dashboard/admin.blade.php @@ -15,13 +15,13 @@