Browse Source

added upload and remove documents and statements

Alexander Musikhin 7 tháng trước cách đây
mục cha
commit
6df0f3f8c5

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

@@ -266,6 +266,51 @@ class OrderController extends Controller
     {
         $order->photos()->detach($file);
         Storage::disk('public')->delete($file->path);
+        $file->delete();
+        return redirect()->route('order.show', $order);
+    }
+
+    public function uploadDocument(Request $request, Order $order, FileService $fileService)
+    {
+        $data = $request->validate([
+            'document.*' => 'file',
+        ]);
+        $f = [];
+        foreach ($data['document'] as $document) {
+            $f[] = $fileService->saveUploadedFile( $order->id . '/document', $document);
+        }
+        $order->documents()->syncWithoutDetaching($f);
+
+        return redirect()->route('order.show', $order);
+    }
+
+    public function deleteDocument(Order $order, File $file)
+    {
+        $order->documents()->detach($file);
+        Storage::disk('public')->delete($file->path);
+        $file->delete();
+        return redirect()->route('order.show', $order);
+    }
+
+    public function uploadStatement(Request $request, Order $order, FileService $fileService)
+    {
+        $data = $request->validate([
+            'statement.*' => 'file',
+        ]);
+        $f = [];
+        foreach ($data['statement'] as $statement) {
+            $f[] = $fileService->saveUploadedFile( $order->id . '/statement', $statement);
+        }
+        $order->statements()->syncWithoutDetaching($f);
+
+        return redirect()->route('order.show', $order);
+    }
+
+    public function deleteStatement(Order $order, File $file)
+    {
+        $order->statements()->detach($file);
+        Storage::disk('public')->delete($file->path);
+        $file->delete();
         return redirect()->route('order.show', $order);
     }
 

+ 3 - 3
app/Models/Order.php

@@ -135,17 +135,17 @@ class Order extends Model
 
     public function photos(): BelongsToMany
     {
-        return $this->belongsToMany(File::class, 'order_file');
+        return $this->belongsToMany(File::class, 'order_photo');
     }
 
     public function documents(): BelongsToMany
     {
-        return $this->belongsToMany(File::class, 'order_file', 'order_id', 'file_id');
+        return $this->belongsToMany(File::class, 'order_document');
     }
 
     public function statements(): BelongsToMany
     {
-        return $this->belongsToMany(File::class, 'order_file', 'order_id', 'file_id');
+        return $this->belongsToMany(File::class, 'order_statement');
     }
 
 

+ 2 - 2
database/migrations/2025_04_25_195408_create_order_file_table.php → database/migrations/2025_04_25_195408_create_order_photo_table.php

@@ -11,7 +11,7 @@ return new class extends Migration
      */
     public function up(): void
     {
-        Schema::create('order_file', function (Blueprint $table) {
+        Schema::create('order_photo', function (Blueprint $table) {
             $table->id();
             $table->foreignId('order_id')->constrained('orders');
             $table->foreignId('file_id')->constrained('files');
@@ -23,6 +23,6 @@ return new class extends Migration
      */
     public function down(): void
     {
-        Schema::dropIfExists('order_file');
+        Schema::dropIfExists('order_photo');
     }
 };

+ 28 - 0
database/migrations/2025_04_26_121556_create_order_document_table.php

@@ -0,0 +1,28 @@
+<?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('order_document', function (Blueprint $table) {
+            $table->id();
+            $table->foreignId('order_id')->constrained('orders');
+            $table->foreignId('file_id')->constrained('files');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('order_document');
+    }
+};

+ 28 - 0
database/migrations/2025_04_26_121607_create_order_statement_table.php

@@ -0,0 +1,28 @@
+<?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('order_statement', function (Blueprint $table) {
+            $table->id();
+            $table->foreignId('order_id')->constrained('orders');
+            $table->foreignId('file_id')->constrained('files');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::dropIfExists('order_statement');
+    }
+};

+ 1 - 1
resources/sass/app.scss

@@ -69,7 +69,7 @@
 }
 
 .rm-but {
-  position: fixed;
+  position: absolute;
   margin-left: -18px;
   margin-top: 1px;
 }

+ 54 - 1
resources/views/orders/show.blade.php

@@ -62,10 +62,63 @@
                                 </form>
                             </div>
                         @endforeach
-
                     </div>
+                </div>
 
+                <hr>
+
+                <div class="documents">
+                    Документы <button class="btn btn-sm text-success" onclick="$('#upl-documents').trigger('click');"><i class="bi bi-plus-circle-fill"></i> Загрузить</button>
+                    <form action="{{ route('order.upload-document', $order) }}" enctype="multipart/form-data" method="post" class="visually-hidden">
+                        @csrf
+                        <input required type="file" id="upl-documents" onchange="$(this).parent().submit()" multiple name="document[]" class="form-control form-control-sm">
+                    </form>
+                    <div class="row my-2 g-1">
+                        @foreach($order->documents as $document)
+                            <div class="col-12">
+                                <a href="{{ $document->link }}">
+                                    {{ $document->original_name }}
+                                </a>
+                                @if(hasRole('admin'))
+                                    <i class="bi bi-x-circle-fill fs-6 text-danger cursor-pointer ms-2"
+                                       onclick="if(confirm('Удалить?')) $('#document-{{ $document->id }}').submit()"
+                                       title="Удалить"></i>
+                                @endif
+                                <form action="{{ route('order.delete-document', [$order, $document]) }}" method="POST" id="document-{{ $document->id }}" class="visually-hidden">
+                                    @csrf
+                                    @method('DELETE')
+                                </form>
+                            </div>
+                        @endforeach
+                    </div>
                 </div>
+                <hr>
+                <div class="statements">
+                    Ведомости <button class="btn btn-sm text-success" onclick="$('#upl-statements').trigger('click');"><i class="bi bi-plus-circle-fill"></i> Загрузить</button>
+                    <form action="{{ route('order.upload-statement', $order) }}" enctype="multipart/form-data" method="post" class="visually-hidden">
+                        @csrf
+                        <input required type="file" id="upl-statements" onchange="$(this).parent().submit()" multiple name="statement[]" class="form-control form-control-sm">
+                    </form>
+                    <div class="row my-2 g-1">
+                        @foreach($order->statements as $statement)
+                            <div class="col-12">
+                                <a href="{{ $statement->link }}">
+                                    {{ $statement->original_name }}
+                                </a>
+                                @if(hasRole('admin'))
+                                    <i class="bi bi-x-circle-fill fs-6 text-danger cursor-pointer ms-2"
+                                       onclick="if(confirm('Удалить?')) $('#statement-{{ $statement->id }}').submit()"
+                                       title="Удалить"></i>
+                                @endif
+                                <form action="{{ route('order.delete-statement', [$order, $statement]) }}" method="POST" id="statement-{{ $statement->id }}" class="visually-hidden">
+                                    @csrf
+                                    @method('DELETE')
+                                </form>
+                            </div>
+                        @endforeach
+                    </div>
+                </div>
+
 
             </div>
             <div class="col-xl-9">

+ 8 - 2
routes/web.php

@@ -87,8 +87,14 @@ Route::middleware('auth:web')->group(function () {
     Route::post('order/move-maf', [OrderController::class, 'moveMaf'])->name('order.move-maf');
 
     Route::post('order/{order}/upload-photo', [OrderController::class, 'uploadPhoto'])->name('order.upload-photo');
-    // admin?
-    Route::delete('order/delete-photo/{order}/{file}', [OrderController::class, 'deletePhoto'])->name('order.delete-photo');
+    Route::post('order/{order}/upload-document', [OrderController::class, 'uploadDocument'])->name('order.upload-document');
+    Route::post('order/{order}/upload-statement', [OrderController::class, 'uploadStatement'])->name('order.upload-statement');
+
+    Route::middleware('role:' . Role::ADMIN)->group(function (){
+        Route::delete('order/delete-photo/{order}/{file}', [OrderController::class, 'deletePhoto'])->name('order.delete-photo');
+        Route::delete('order/delete-document/{order}/{file}', [OrderController::class, 'deleteDocument'])->name('order.delete-document');
+        Route::delete('order/delete-statement/{order}/{file}', [OrderController::class, 'deleteStatement'])->name('order.delete-statement');
+    });
 
     // Склад (МАФ)
     Route::get('product_sku', [ProductSKUController::class, 'index'])->name('product_sku.index');