Răsfoiți Sursa

added responsible, index, addition

Alexander Musikhin 8 luni în urmă
părinte
comite
8dacd47f94

+ 1 - 0
app/Http/Controllers/OrderController.php

@@ -14,6 +14,7 @@ use Illuminate\Http\Request;
 
 class OrderController extends Controller
 {
+    const DEFAULT_SORT_BY = 'updated_at';
     protected array $data = [
         'active'    => 'orders',
         'title'     => 'Заказы',

+ 71 - 0
app/Http/Controllers/ResponsibleController.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\StoreResponsibleRequest;
+use App\Models\Dictionary\Area;
+use App\Models\Responsible;
+use Illuminate\Http\Request;
+
+class ResponsibleController extends Controller
+{
+
+    protected array $data = [
+        'active'    => 'responsibles',
+        'title'     => 'Ответственные',
+        'id'        => 'responsibles',
+        'header'    => [
+            'id'            => 'ID',
+            'area-name'     => 'Район',
+            'name'          => 'ФИО',
+            'phone'         => 'Телефон',
+            'created_at'    => 'Дата создания'
+        ],
+        'searchFields' => [
+            'name',
+            'phone',
+        ],
+        'ranges' => [],
+        'filters' => [],
+    ];
+    public function __construct()
+    {
+        $this->data['areas'] = Area::query()->get()->pluck('name', 'id');
+    }
+
+
+    public function index(Request $request)
+    {
+        $model = new Responsible;
+//        $this->data['ranges'] = [];
+//        $this->createFilters($model, 'area-name');
+        $this->createDateFilters($model, 'created_at');
+
+        $q = $model::query();
+        $this->acceptFilters($q, $request);
+        $this->acceptSearch($q, $request);
+        $this->setSortAndOrderBy($model, $request);
+
+        $q->orderBy($this->data['sortBy'], $this->data['orderBy']);
+        $this->data['responsibles'] = $q->paginate()->withQueryString();
+
+        return view('responsibles.index', $this->data);
+    }
+
+    public function store(StoreResponsibleRequest $request)
+    {
+        $responsible = Responsible::query()->create($request->validated());
+        Area::query()->where('id', $request->validated('area_id'))->update(['areas.responsible_id' => $responsible->id]);
+        return redirect()->route('responsible.index');
+    }
+
+    public function update(StoreResponsibleRequest $request, Responsible $responsible)
+    {
+
+    }
+
+    public function destroy()
+    {
+
+    }
+}

+ 6 - 4
app/Http/Middleware/EnsureUserHasRole.php

@@ -3,7 +3,6 @@
 namespace App\Http\Middleware;
 
 use Closure;
-use Illuminate\Foundation\Support\Providers\RouteServiceProvider;
 use Illuminate\Http\Request;
 use Symfony\Component\HttpFoundation\Response;
 
@@ -12,14 +11,17 @@ class EnsureUserHasRole
     /**
      * Handle an incoming request.
      *
-     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
+     * @param Request $request
+     * @param Closure $next
+     * @param mixed ...$roles
+     * @return Response
      */
     public function handle(Request $request, Closure $next, ... $roles): Response
     {
         if(in_array($request->user()->role, $roles)) {
             return $next($request);
         }
-
-        return redirect('/home');
+        abort(404);
+//        return redirect('/home');
     }
 }

+ 30 - 0
app/Http/Requests/StoreResponsibleRequest.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class StoreResponsibleRequest extends FormRequest
+{
+    /**
+     * Determine if the user is authorized to make this request.
+     */
+    public function authorize(): bool
+    {
+        return auth()->check() && hasRole('admin');
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array
+     */
+    public function rules(): array
+    {
+        return [
+            'area_id'   => 'required|exists:areas,id',
+            'name'      => 'required|string',
+            'phone'     => 'required|string',
+        ];
+    }
+}

+ 21 - 0
app/Models/Responsible.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Models;
+
+use App\Models\Dictionary\Area;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\HasOne;
+
+class Responsible extends Model
+{
+    const DEFAULT_SORT_BY = 'updated_at';
+    protected $fillable = [
+        'name',
+        'phone',
+    ];
+
+    public function area(): HasOne
+    {
+        return $this->hasOne(Area::class, 'responsible_id', 'id');
+    }
+}

+ 40 - 0
database/migrations/2025_04_03_192940_create_responsibles_table.php

@@ -0,0 +1,40 @@
+<?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('responsibles', function (Blueprint $table) {
+            $table->id();
+            $table->string('name');
+            $table->string('phone');
+            $table->timestamps();
+        });
+        Schema::table('areas', function (Blueprint $table) {
+            $table->foreignId('responsible_id')
+                ->nullable()
+                ->after('district_id')
+                ->constrained('responsibles')
+                ->restrictOnDelete();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('areas', function (Blueprint $table) {
+            $table->dropForeign('areas_responsible_id_foreign');
+            $table->dropColumn('responsible_id');
+        });
+        Schema::dropIfExists('responsibles');
+    }
+};

+ 1 - 0
resources/views/layouts/menu.blade.php

@@ -5,4 +5,5 @@
 
 @if(hasrole('admin'))
     <li class="nav-item"><a class="nav-link" href="{{ route('user.index') }}">Пользователи</a></li>
+    <li class="nav-item"><a class="nav-link" href="{{ route('responsible.index') }}">Ответственные</a></li>
 @endif

+ 0 - 2
resources/views/products_sku/index.blade.php

@@ -56,8 +56,6 @@
                             @include('partials.input', ['name' => 'certificate_type', 'title' => 'Вид сертификации', 'required' => true])
                             @include('partials.submit', ['name' => 'Добавить'])
                         </div>
-
-
                     </form>
                 </div>
             </div>

+ 71 - 0
resources/views/responsibles/index.blade.php

@@ -0,0 +1,71 @@
+@extends('layouts.app')
+
+@section('content')
+
+    <div class="row mb-3">
+        <div class="col-6">
+            <h3>Ответственные</h3>
+        </div>
+        <div class="col-6 text-end">
+            <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addModal">
+                Добавить
+            </button>
+
+        </div>
+    </div>
+
+
+    @include('partials.table', [
+        'id'        => $id,
+        'header'    => $header,
+        'strings'   => $responsibles
+    ])
+
+    <div class="row pt-3 px-3">
+        <div class="col-12 pagination">
+            {{ $responsibles->links() }}
+        </div>
+    </div>
+
+    <!-- Модальное окно добавления-->
+    <div class="modal fade" id="addModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
+        <div class="modal-dialog modal-fullscreen-sm-down modal-lg">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h1 class="modal-title fs-5" id="addModalLabel">Добавить заказ МАФ</h1>
+                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
+                </div>
+                <div class="modal-body">
+                    <form action="{{ route('responsible.store') }}" method="post">
+                        @csrf
+
+                        @include('partials.select', ['name' => 'area_id', 'title' => 'Район', 'options' => $areas])
+                        @include('partials.input', ['name' => 'name', 'title' => 'ФИО', 'required' => true])
+                        @include('partials.input', ['name' => 'phone', 'title' => 'Телефон', 'required' => true])
+
+                        @include('partials.submit', ['name' => 'Добавить'])
+
+                    </form>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    @if($errors->count())
+        @dump($errors)
+    @endif
+@endsection
+
+
+@push('scripts')
+{{--    <script type="module">--}}
+{{--        $('#select_maf').on('change', function () {--}}
+{{--            $('#product_id').val($(this).val());--}}
+{{--            $('#product_name').val($('#select_maf option:selected').text()).slideDown();--}}
+{{--            $('#select_maf_form').slideUp();--}}
+{{--            $('#sku_form').slideDown();--}}
+
+
+{{--        });--}}
+{{--    </script>--}}
+@endpush

+ 8 - 1
routes/web.php

@@ -4,6 +4,7 @@ use App\Http\Controllers\AreaController;
 use App\Http\Controllers\OrderController;
 use App\Http\Controllers\ProductController;
 use App\Http\Controllers\ProductSKUController;
+use App\Http\Controllers\ResponsibleController;
 use App\Http\Controllers\UserController;
 use App\Models\Role;
 use Illuminate\Support\Facades\Auth;
@@ -20,7 +21,7 @@ Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name
 Route::middleware('auth:web')->group(function () {
 
     // admin routes
-    Route::prefix('admin')->middleware('role:' . Role::ADMIN)->group(function (){
+    Route::middleware('role:' . Role::ADMIN)->prefix('admin')->group(function (){
         Route::prefix('users')->group(function (){
             Route::get('', [UserController::class, 'index'])->name('user.index');
             Route::get('create', [UserController::class, 'create'])->name('user.create');
@@ -29,6 +30,12 @@ Route::middleware('auth:web')->group(function () {
             Route::put('{user}', [UserController::class, 'update'])->name('user.update');
             Route::delete('{user}', [UserController::class, 'destroy'])->name('user.destroy');
         });
+        Route::prefix('responsibles')->group(function (){
+            Route::get('', [ResponsibleController::class, 'index'])->name('responsible.index');
+            Route::post('store', [ResponsibleController::class, 'store'])->name('responsible.store');
+            Route::post('update/{responsible}', [ResponsibleController::class, 'update'])->name('responsible.update');
+            Route::delete('delete/{responsible}', [ResponsibleController::class, 'destroy'])->name('responsible.destroy');
+        });
     });
 
     // profile