Alexander Musikhin 3 hete
szülő
commit
f0b6b96385

+ 53 - 0
app/Http/Controllers/Admin/AdminSettingsController.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace App\Http\Controllers\Admin;
+
+use App\Http\Controllers\Controller;
+use App\Models\Setting;
+use App\Models\User;
+use Illuminate\Http\RedirectResponse;
+use Illuminate\Http\Request;
+use Illuminate\View\View;
+
+class AdminSettingsController extends Controller
+{
+    public function index(): View
+    {
+        $users = User::query()
+            ->orderBy('name')
+            ->pluck('name', 'id')
+            ->toArray();
+
+        return view('admin.settings.index', [
+            'active' => 'admin_settings',
+            'title' => 'Настройки',
+            'users' => $users,
+            'defaultMafOrderUserId' => Setting::getInt(
+                Setting::KEY_DEFAULT_MAF_ORDER_USER_ID,
+                (int) config('app.default_maf_order_user_id')
+            ),
+            'reclamationActRepresentativeUserId' => Setting::getInt(
+                Setting::KEY_RECLAMATION_ACT_REPRESENTATIVE_USER_ID
+            ),
+        ]);
+    }
+
+    public function store(Request $request): RedirectResponse
+    {
+        $data = $request->validate([
+            'default_maf_order_user_id' => ['nullable', 'integer', 'exists:users,id'],
+            'reclamation_act_representative_user_id' => ['nullable', 'integer', 'exists:users,id'],
+        ]);
+
+        Setting::set(
+            Setting::KEY_DEFAULT_MAF_ORDER_USER_ID,
+            $data['default_maf_order_user_id'] ?? null
+        );
+        Setting::set(
+            Setting::KEY_RECLAMATION_ACT_REPRESENTATIVE_USER_ID,
+            $data['reclamation_act_representative_user_id'] ?? null
+        );
+
+        return back()->with('success', 'Настройки сохранены.');
+    }
+}

+ 42 - 0
app/Models/Setting.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Setting extends Model
+{
+    public const KEY_DEFAULT_MAF_ORDER_USER_ID = 'default_maf_order_user_id';
+    public const KEY_RECLAMATION_ACT_REPRESENTATIVE_USER_ID = 'reclamation_act_representative_user_id';
+
+    protected $fillable = [
+        'key',
+        'value',
+    ];
+
+    public static function get(string $key, mixed $default = null): mixed
+    {
+        $value = static::query()->where('key', $key)->value('value');
+
+        return $value ?? $default;
+    }
+
+    public static function getInt(string $key, ?int $default = null): ?int
+    {
+        $value = static::get($key, $default);
+
+        if ($value === null || $value === '') {
+            return $default;
+        }
+
+        return (int) $value;
+    }
+
+    public static function set(string $key, mixed $value): void
+    {
+        static::query()->updateOrCreate(
+            ['key' => $key],
+            ['value' => $value === null ? null : (string) $value]
+        );
+    }
+}

+ 11 - 1
app/Services/GenerateDocumentsService.php

@@ -10,7 +10,9 @@ use App\Models\File;
 use App\Models\Order;
 use App\Models\ProductSKU;
 use App\Models\Reclamation;
+use App\Models\Setting;
 use App\Models\Ttn;
+use App\Models\User;
 use Exception;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Storage;
@@ -425,6 +427,14 @@ class GenerateDocumentsService
         $spreadsheet = $reader->load($inputFileName);
         $sheet = $spreadsheet->getActiveSheet();
 
+        $representativeId = Setting::getInt(Setting::KEY_RECLAMATION_ACT_REPRESENTATIVE_USER_ID);
+        if ($representativeId) {
+            $representative = User::query()->withTrashed()->find($representativeId);
+            if ($representative) {
+                $sheet->setCellValue('A14', 'службы сервиса ' . $representative->name);
+            }
+        }
+
         $mafs = [];
         foreach ($reclamation->skus as $p) {
             $mafs[] = $p->product->passport_name . ', тип ' . $p->product->nomenclature_number;
@@ -604,4 +614,4 @@ class GenerateDocumentsService
         return $fileModel->link ?? '';
     }
 
-}
+}

+ 7 - 2
app/Services/ImportOrdersService.php

@@ -8,6 +8,7 @@ use App\Models\MafOrder;
 use App\Models\Order;
 use App\Models\Product;
 use App\Models\ProductSKU;
+use App\Models\Setting;
 use Exception;
 
 class ImportOrdersService extends ImportBaseService
@@ -64,6 +65,10 @@ class ImportOrdersService extends ImportBaseService
         if(!$this->prepare()) {
             return false;
         }
+        $defaultMafOrderUserId = Setting::getInt(
+            Setting::KEY_DEFAULT_MAF_ORDER_USER_ID,
+            (int) config('app.default_maf_order_user_id')
+        );
         $strNumber = 0;
         $this->errorRows = [];
         $result = [
@@ -193,7 +198,7 @@ class ImportOrdersService extends ImportBaseService
                             ->create([
                                 'year' => $year,
                                 'order_number' => $r['maf_orders.order_number'],
-                                'user_id' => config('app.default_maf_order_user_id'),
+                                'user_id' => $defaultMafOrderUserId,
                                 'status' => 'на складе',
                                 'product_id' => $product->id,
                                 'quantity' => 1,
@@ -282,4 +287,4 @@ class ImportOrdersService extends ImportBaseService
 
         return true;
     }
-}
+}

+ 7 - 2
app/Services/ImportReclamationsService.php

@@ -8,6 +8,7 @@ use App\Models\Order;
 use App\Models\Product;
 use App\Models\ProductSKU;
 use App\Models\Reclamation;
+use App\Models\Setting;
 use Illuminate\Support\Str;
 
 class ImportReclamationsService extends ImportBaseService
@@ -48,6 +49,10 @@ class ImportReclamationsService extends ImportBaseService
             'reclamationsCreated' => 0,
             'mafAttached' => 0,
         ];
+        $defaultMafOrderUserId = Setting::getInt(
+            Setting::KEY_DEFAULT_MAF_ORDER_USER_ID,
+            (int) config('app.default_maf_order_user_id')
+        );
         $errors = [
             'district_not_found' => [],
             'area_not_found' => [],
@@ -84,7 +89,7 @@ class ImportReclamationsService extends ImportBaseService
 //                }
 
                 // manager
-                $userId = config('app.default_maf_order_user_id');
+                $userId = $defaultMafOrderUserId;
 
                 // status
                 if (!($statusId = $this->findId('reclamation_statuses.name', $r['reclamation_statuses.name']))) {
@@ -234,4 +239,4 @@ class ImportReclamationsService extends ImportBaseService
 
     }
 
-}
+}

+ 23 - 0
database/migrations/2026_02_12_213712_create_settings_table.php

@@ -0,0 +1,23 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        Schema::create('settings', function (Blueprint $table) {
+            $table->id();
+            $table->string('key')->unique();
+            $table->text('value')->nullable();
+            $table->timestamps();
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('settings');
+    }
+};

+ 36 - 0
resources/views/admin/settings/index.blade.php

@@ -0,0 +1,36 @@
+@extends('layouts.app')
+
+@section('content')
+    <div class="row mb-3">
+        <div class="col-12">
+            <h3>Настройки</h3>
+        </div>
+    </div>
+
+    @if(session('success'))
+        <div class="alert alert-success alert-dismissible fade show" role="alert">
+            {{ session('success') }}
+            <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Закрыть"></button>
+        </div>
+    @endif
+
+    <form action="{{ route('admin.settings.store') }}" method="post">
+        @csrf
+        @include('partials.select', [
+            'name' => 'default_maf_order_user_id',
+            'title' => 'Пользователь по умолчанию для заказов МАФ',
+            'options' => $users,
+            'value' => old('default_maf_order_user_id', $defaultMafOrderUserId),
+            'first_empty' => true,
+        ])
+        @include('partials.select', [
+            'name' => 'reclamation_act_representative_user_id',
+            'title' => 'Представитель компании для акта рекламаций',
+            'options' => $users,
+            'value' => old('reclamation_act_representative_user_id', $reclamationActRepresentativeUserId),
+            'first_empty' => true,
+        ])
+
+        @include('partials.submit', ['name' => 'Сохранить'])
+    </form>
+@endsection

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

@@ -33,6 +33,7 @@
             <ul class="dropdown-menu dropdown-menu-end">
                 <li class="dropdown-item"><a class="nav-link" href="{{ route('contract.index', session('gp_contracts')) }}">Договоры</a></li>
                 <li class="dropdown-item"><a class="nav-link" href="{{ route('user.index', session('gp_users')) }}">Пользователи</a></li>
+                <li class="dropdown-item"><a class="nav-link" href="{{ route('admin.settings.index') }}">Настройки</a></li>
                 <li class="dropdown-item"><a class="nav-link" href="{{ route('admin.district.index') }}">Округа</a></li>
                 <li class="dropdown-item"><a class="nav-link" href="{{ route('admin.area.index') }}">Районы</a></li>
                 <li class="dropdown-item"><a class="nav-link" href="{{ route('import.index', session('gp_import')) }}">Импорт</a></li>
@@ -42,4 +43,4 @@
         </li>
 
     @endif
-@endif
+@endif

+ 6 - 0
routes/web.php

@@ -2,6 +2,7 @@
 
 use App\Http\Controllers\Admin\AdminAreaController;
 use App\Http\Controllers\Admin\AdminDistrictController;
+use App\Http\Controllers\Admin\AdminSettingsController;
 use App\Http\Controllers\AreaController;
 use App\Http\Controllers\ClearDataController;
 use App\Http\Controllers\YearDataController;
@@ -84,6 +85,11 @@ Route::middleware('auth:web')->group(function () {
             Route::get('download/{file}', [YearDataController::class, 'download'])->name('year-data.download');
         });
 
+        Route::prefix('settings')->group(function () {
+            Route::get('', [AdminSettingsController::class, 'index'])->name('admin.settings.index');
+            Route::post('', [AdminSettingsController::class, 'store'])->name('admin.settings.store');
+        });
+
         // Справочник округов
         Route::prefix('districts')->group(function (){
             Route::get('', [AdminDistrictController::class, 'index'])->name('admin.district.index');