Prechádzať zdrojové kódy

added upload certificate to catalog maf

Alexander Musikhin 7 mesiacov pred
rodič
commit
bd4a76b158

+ 3 - 3
app/Http/Controllers/OrderController.php

@@ -255,7 +255,7 @@ class OrderController extends Controller
         ]);
         $f = [];
         foreach ($data['photo'] as $photo) {
-            $f[] = $fileService->saveUploadedFile( $order->id . '/photo', $photo);
+            $f[] = $fileService->saveUploadedFile( 'orders/' . $order->id . '/photo', $photo);
         }
         $order->photos()->syncWithoutDetaching($f);
 
@@ -277,7 +277,7 @@ class OrderController extends Controller
         ]);
         $f = [];
         foreach ($data['document'] as $document) {
-            $f[] = $fileService->saveUploadedFile( $order->id . '/document', $document);
+            $f[] = $fileService->saveUploadedFile( 'orders/' . $order->id . '/document', $document);
         }
         $order->documents()->syncWithoutDetaching($f);
 
@@ -299,7 +299,7 @@ class OrderController extends Controller
         ]);
         $f = [];
         foreach ($data['statement'] as $statement) {
-            $f[] = $fileService->saveUploadedFile( $order->id . '/statement', $statement);
+            $f[] = $fileService->saveUploadedFile( 'orders/' . $order->id . '/statement', $statement);
         }
         $order->statements()->syncWithoutDetaching($f);
 

+ 25 - 0
app/Http/Controllers/ProductController.php

@@ -5,7 +5,9 @@ namespace App\Http\Controllers;
 use App\Http\Requests\StoreProductRequest;
 use App\Jobs\Export\ExportCatalog;
 use App\Jobs\Import\ImportCatalog;
+use App\Models\File;
 use App\Models\Product;
+use App\Services\FileService;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Log;
@@ -157,4 +159,27 @@ class ProductController extends Controller
         }
         return $ret;
     }
+
+    public function uploadCertificate(Request $request, Product $product, FileService $fileService)
+    {
+        $data = $request->validate([
+            'certificate' => 'file',
+        ]);
+
+        $f = $fileService->saveUploadedFile('products/' . $product->id . '/certificate', $data['certificate']);
+
+        $product->update(['certificate_id' => $f->id]);
+
+        return redirect()->route('catalog.index');
+    }
+
+    public function deleteCertificate(Product $product, File $file)
+    {
+        $product->update(['certificate_id' => null]);
+        Storage::disk('public')->delete($file->path);
+        $file->delete();
+        return redirect()->route('catalog.index');
+    }
+
+
 }

+ 1 - 1
app/Http/Requests/StoreProductRequest.php

@@ -34,7 +34,7 @@ class StoreProductRequest extends FormRequest
             'installation_price'    => 'required|numeric',
             'total_price'           => 'required|numeric',
             'manufacturer_name'     => 'required|string',
-            'note'                  => 'required|string',
+            'note'                  => 'nullable|string',
         ];
     }
 }

+ 6 - 3
app/Models/Product.php

@@ -10,10 +10,8 @@ use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\Relations\HasMany;
-use Illuminate\Database\Eloquent\Relations\HasOne;
 use Illuminate\Database\Eloquent\SoftDeletes;
-use Illuminate\Support\Facades\DB;
-use Illuminate\Support\Facades\Storage;
+
 
 #[ScopedBy([YearScope::class])]
 class Product extends Model
@@ -37,6 +35,7 @@ class Product extends Model
         'total_price',
         'manufacturer_name',
         'note',
+        'certificate_id',
     ];
 
     // set year attribute to current selected year
@@ -123,6 +122,10 @@ class Product extends Model
         return $this->belongsToMany(Order::class, 'products_sku', 'order_id', 'product_id');
     }
 
+    public function certificate(): BelongsTo
+    {
+        return $this->belongsTo(File::class, 'certificate_id', 'id');
+    }
 
     public function maf_orders(): HasMany
     {

+ 33 - 0
database/migrations/2025_04_26_223512_add_field_to_products_table.php

@@ -0,0 +1,33 @@
+<?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::table('products', function (Blueprint $table) {
+            $table->foreignId('certificate_id')
+                ->after('note')
+                ->nullable()
+                ->constrained('files', 'id')
+                ->nullOnDelete();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('products', function (Blueprint $table) {
+            $table->dropForeign('products_certificate_id_foreign');
+            $table->dropColumn('certificate_id');
+        });
+    }
+};

+ 18 - 0
resources/views/catalog/edit.blade.php

@@ -2,6 +2,21 @@
 
 @section('content')
     <div class="px-3">
+        <div class="row mb-2">
+            <div class="col-6">
+                <h3>МАФ {{ $product->common_name ?? 'Новый МАФ' }}</h3>
+            </div>
+            <div class="col-6 text-end">
+                @if(isset($product))
+                     <button class="btn btn-sm text-success" onclick="$('#upl-cert').trigger('click');"><i class="bi bi-plus-circle-fill"></i> Загрузить сертификат</button>
+
+                    <form action="{{ route('catalog.upload-certificate', $product) }}" class="visually-hidden" method="POST" enctype="multipart/form-data">
+                        @csrf
+                        <input type="file" name="certificate" onchange="$(this).parent().submit()" required id="upl-cert" />
+                    </form>
+                @endif
+            </div>
+        </div>
         <div class="">
             <form action="{{ ($product) ? route('catalog.update', $product) : route('catalog.store') }}" method="post">
 
@@ -23,6 +38,9 @@
 
                     </div>
                     <div class="col-xl-6">
+                        @if($product->certificate)
+                            @include('partials.input', ['name' => 'cert', 'title' => 'Сертификат', 'value' => $product->certificate->original_name, 'disabled' => true])
+                        @endif
                         <div class="row mb-2">
                             <label for="note" class="col-form-label my-1">
                                 Примечание <sup>*</sup>

+ 2 - 0
routes/web.php

@@ -89,11 +89,13 @@ Route::middleware('auth:web')->group(function () {
     Route::post('order/{order}/upload-photo', [OrderController::class, 'uploadPhoto'])->name('order.upload-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::post('catalog/{product}/upload-certificate', [ProductController::class, 'uploadCertificate'])->name('catalog.upload-certificate');
 
     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::delete('catalog/delete-certificate/{product}/{file}', [ProductController::class, 'deleteCertificate'])->name('catalog.delete-certificate');
     });
 
     Route::get('order/generate-installation-pack/{order}', [OrderController::class, 'generateInstallationPack'])->name('order.generate-installation-pack');