Przeglądaj źródła

added reclamation details view: add and remove, attach details to reclamation

Alexander Musikhin 7 miesięcy temu
rodzic
commit
4c56798ba2

+ 46 - 19
app/Http/Controllers/ReclamationController.php

@@ -3,10 +3,12 @@
 namespace App\Http\Controllers;
 
 use App\Http\Requests\CreateReclamationRequest;
+use App\Http\Requests\StoreReclamationDetailsRequest;
 use App\Http\Requests\StoreReclamationRequest;
 use App\Models\File;
 use App\Models\Order;
 use App\Models\Reclamation;
+use App\Models\ReclamationDetail;
 use App\Models\ReclamationStatus;
 use App\Models\Role;
 use App\Models\User;
@@ -18,21 +20,21 @@ use Illuminate\Support\Facades\Storage;
 class ReclamationController extends Controller
 {
     protected array $data = [
-        'active'    => 'reclamations',
-        'title'     => 'Рекламации',
-        'id'        => 'reclamations',
-        'header'    => [
-            'id'                        => 'ID',
-            'user_id'                   => 'Менеджер',
-            'status_id'                 => 'Статус',
-            'order-district_id'         => 'Округ',
-            'order-area_id'             => 'Район',
-            'order-object_address'      => 'Адрес объекта',
-            'create_date'               => 'Дата создания',
-            'finish_date'             => 'Дата завершения',
-            'reason'                    => 'Причина',
-            'guarantee'                 => 'Гарантии',
-            'whats_done'                => 'Что сделано',
+        'active' => 'reclamations',
+        'title' => 'Рекламации',
+        'id' => 'reclamations',
+        'header' => [
+            'id' => 'ID',
+            'user_id' => 'Менеджер',
+            'status_id' => 'Статус',
+            'order-district_id' => 'Округ',
+            'order-area_id' => 'Район',
+            'order-object_address' => 'Адрес объекта',
+            'create_date' => 'Дата создания',
+            'finish_date' => 'Дата завершения',
+            'reason' => 'Причина',
+            'guarantee' => 'Гарантии',
+            'whats_done' => 'Что сделано',
         ],
         'searchFields' => [
             'reason',
@@ -101,7 +103,7 @@ class ReclamationController extends Controller
         ]);
         $f = [];
         foreach ($data['photo'] as $photo) {
-            $f[] = $fileService->saveUploadedFile( 'reclamations/' . $reclamation->id . '/photo_before', $photo);
+            $f[] = $fileService->saveUploadedFile('reclamations/' . $reclamation->id . '/photo_before', $photo);
         }
         $reclamation->photos_before()->syncWithoutDetaching($f);
 
@@ -115,7 +117,7 @@ class ReclamationController extends Controller
         ]);
         $f = [];
         foreach ($data['photo'] as $photo) {
-            $f[] = $fileService->saveUploadedFile( 'reclamations/' . $reclamation->id . '/photo_after', $photo);
+            $f[] = $fileService->saveUploadedFile('reclamations/' . $reclamation->id . '/photo_after', $photo);
         }
         $reclamation->photos_after()->syncWithoutDetaching($f);
 
@@ -145,7 +147,7 @@ class ReclamationController extends Controller
         ]);
         $f = [];
         foreach ($data['document'] as $document) {
-            $f[] = $fileService->saveUploadedFile( 'reclamations/' . $reclamation->id . '/document', $document);
+            $f[] = $fileService->saveUploadedFile('reclamations/' . $reclamation->id . '/document', $document);
         }
         $reclamation->documents()->syncWithoutDetaching($f);
 
@@ -167,7 +169,7 @@ class ReclamationController extends Controller
         ]);
         $f = [];
         foreach ($data['acts'] as $document) {
-            $f[] = $fileService->saveUploadedFile( 'reclamations/' . $reclamation->id . '/act', $document);
+            $f[] = $fileService->saveUploadedFile('reclamations/' . $reclamation->id . '/act', $document);
         }
         $reclamation->acts()->syncWithoutDetaching($f);
 
@@ -182,4 +184,29 @@ class ReclamationController extends Controller
         return redirect()->route('reclamations.show', $reclamation);
     }
 
+    public function updateDetails(StoreReclamationDetailsRequest $request, Reclamation $reclamation)
+    {
+        $names      = $request->validated('name');
+        $quantity   = $request->validated('quantity');
+        foreach ($names as $key => $name) {
+            if(!$name) continue;
+            if ((int)$quantity[$key] > 1) {
+                ReclamationDetail::query()
+                    ->updateOrCreate([
+                        'reclamation_id' => $reclamation->id,
+                        'name' => $name,
+                    ],
+                    [
+                        'quantity' => $quantity[$key],
+                    ]);
+            } else {
+                ReclamationDetail::query()
+                    ->where('reclamation_details.reclamation_id', $reclamation->id)
+                    ->where('reclamation_details.name', $name)
+                    ->delete();
+            }
+        }
+        return redirect()->route('reclamations.show', $reclamation);
+    }
+
 }

+ 29 - 0
app/Http/Requests/StoreReclamationDetailsRequest.php

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

+ 53 - 6
resources/views/reclamations/edit.blade.php

@@ -48,7 +48,8 @@
                         <tr>
                             <td>
                                 @if($p->product->image)
-                                    <a href="{{ $p->product->image }}" data-toggle="lightbox" data-gallery="maf" data-size="fullscreen">
+                                    <a href="{{ $p->product->image }}" data-toggle="lightbox" data-gallery="maf"
+                                       data-size="fullscreen">
                                         <img src="{{ $p->product->image }}" alt="" class="img-thumbnail maf-img">
                                     </a>
                                 @endif
@@ -74,8 +75,51 @@
                     </tbody>
                 </table>
 
-
-
+                <div class="details">
+                    <a href="#details" data-bs-toggle="collapse">Детали замен ({{ $reclamation->details->count() }})</a>
+                    <form method="post" action="{{ route('reclamations.update-details', $reclamation) }}"
+                          class=" my-2 collapse" id="details">
+                        @csrf
+                        <div class="rows">
+                            @foreach($reclamation->details as $detail)
+                                <div class="row mb-1">
+                                    <div class="col-10">
+                                        <input type="text" name="name[]" value="{{ $detail->name }}"
+                                               class="form-control form-control-sm col-auto"
+                                               placeholder="наименование или номер детали">
+                                    </div>
+                                    <div class="col-2">
+                                        <input type="text" name="quantity[]" value="{{ $detail->quantity }}"
+                                               class="form-control form-control-sm col-auto text-end"
+                                               placeholder="кол-во">
+                                    </div>
+                                </div>
+                            @endforeach
+                            <div class="row mb-1">
+                                <div class="col-10">
+                                    <input type="text" name="name[]" value=""
+                                           class="form-control form-control-sm col-auto"
+                                           placeholder="наименование или номер детали">
+                                </div>
+                                <div class="col-2">
+                                    <input type="text" name="quantity[]" value=""
+                                           class="form-control form-control-sm col-auto text-end" placeholder="кол-во">
+                                </div>
+                            </div>
+                        </div>
+                        <div class="row">
+                            <div class="col-12 text-end">
+                                <span class="text-secondary small">Для удаления детали поставьте в количество 0</span>
+                                <a href="#" class="btn btn-light" onclick="let x = $('.rows').children().last().clone(); $('.rows').append(x);">Добавить строку</a>
+                                <button class="btn btn-primary btn-sm" type="submit">Сохранить детали</button>
+                            </div>
+                        </div>
+                        @if($errors->any())
+                            @dump($errors->all())
+                        @endif
+                    </form>
+                </div>
+                <hr>
                 <div class="documents">
                     Документы
                     <button class="btn btn-sm text-success" onclick="$('#upl-documents').trigger('click');"><i
@@ -130,7 +174,8 @@
                                        onclick="if(confirm('Удалить?')) $('#act-{{ $act->id }}').submit()"
                                        title="Удалить"></i>
                                 @endif
-                                <form action="{{ route('reclamations.delete-act', [$reclamation, $act]) }}" method="POST"
+                                <form action="{{ route('reclamations.delete-act', [$reclamation, $act]) }}"
+                                      method="POST"
                                       id="act-{{ $act->id }}" class="visually-hidden">
                                     @csrf
                                     @method('DELETE')
@@ -141,7 +186,8 @@
                 </div>
                 <hr>
                 <div class="photo_before">
-                    <a href="#photos_before" data-bs-toggle="collapse">Фотографии проблемы ({{ $reclamation->photos_before->count() }})</a>
+                    <a href="#photos_before" data-bs-toggle="collapse">Фотографии проблемы
+                        ({{ $reclamation->photos_before->count() }})</a>
                     <button class="btn btn-sm text-success" onclick="$('#upl-photo-before').trigger('click');"><i
                                 class="bi bi-plus-circle-fill"></i> Загрузить
                     </button>
@@ -174,7 +220,8 @@
                 </div>
                 <hr>
                 <div class="photo_after">
-                    <a href="#photos_after" data-bs-toggle="collapse">Фотографии после устранения ({{ $reclamation->photos_after->count() }})</a>
+                    <a href="#photos_after" data-bs-toggle="collapse">Фотографии после устранения
+                        ({{ $reclamation->photos_after->count() }})</a>
                     <button class="btn btn-sm text-success" onclick="$('#upl-photo-after').trigger('click');"><i
                                 class="bi bi-plus-circle-fill"></i> Загрузить
                     </button>

+ 1 - 1
routes/web.php

@@ -132,7 +132,7 @@ Route::middleware('auth:web')->group(function () {
     Route::post('reclamations/{reclamation}/upload-photo-before', [ReclamationController::class, 'uploadPhotoBefore'])->name('reclamations.upload-photo-before');
     Route::post('reclamations/{reclamation}/upload-photo-after', [ReclamationController::class, 'uploadPhotoAfter'])->name('reclamations.upload-photo-after');
     Route::post('reclamations/{reclamation}/upload-act', [ReclamationController::class, 'uploadAct'])->name('reclamations.upload-act');
-
+    Route::post('reclamations/{reclamation}/update-details', [ReclamationController::class, 'updateDetails'])->name('reclamations.update-details');
     // ajax search products
     Route::get('product/search', [ProductController::class, 'search'])->name('product.search');