Quellcode durchsuchen

fix(schedule): add reclamation links and fix product SKU year scoping

- Add clickable links to reclamation details from schedule address codes
- Extract reclamation ID from РЕКЛ-XXXX format and route to reclamations.show
- Add conditional routing: reclamations vs order links based on source
- Fix product SKU loading in document generation by adding year scope
- Add withoutGlobalScopes() to prevent scope conflicts in multi-year data
- Preserve explicit year filtering for products_sku relation

Fixes navigation from schedule view to related reclamation records and resolves
year-based data loading issues in document generation service.
Alexander Musikhin vor 1 Woche
Ursprung
Commit
edef9ceba6

+ 2 - 0
app/Models/PricingCode.php

@@ -10,6 +10,8 @@ class PricingCode extends Model
     const TYPE_TSN_NUMBER = 'tsn_number';
     const TYPE_PRICING_CODE = 'pricing_code';
 
+    const DEFAULT_SORT_BY = 'created_at';
+
     protected $fillable = [
         'type',
         'code',

+ 7 - 2
app/Services/ExportOneOrderService.php

@@ -26,6 +26,11 @@ class ExportOneOrderService
      */
     public function handle(Order $order, int $userId): string
     {
+        $productsSku = $order->products_sku()
+            ->withoutGlobalScopes()
+            ->where('year', $order->year)
+            ->get();
+        $order->setRelation('products_sku', $productsSku);
 
         $inputFileType = 'Xlsx';
         $inputFileName = './templates/Order.xlsx';
@@ -37,7 +42,7 @@ class ExportOneOrderService
         $sheet->setCellValue('A1', 'МАФ площадки ' . $order->common_name);
         $i = 3;
 
-        foreach ($order->products_sku as $sku) {
+        foreach ($productsSku as $sku) {
 
             $mnfDate = ($sku->manufacture_date) ? DateHelper::getHumanDate($sku->manufacture_date, true) : '';
 
@@ -79,4 +84,4 @@ class ExportOneOrderService
         return $fileModel?->link ?? '';
 
     }
-}
+}

+ 18 - 1
app/Services/ExportOrdersService.php

@@ -3,6 +3,7 @@
 namespace App\Services;
 
 use App\Helpers\DateHelper;
+use App\Models\ProductSKU;
 use App\Models\Product;
 use Illuminate\Support\Collection;
 use Illuminate\Support\Facades\Log;
@@ -25,6 +26,18 @@ class ExportOrdersService
      */
     public function handle(Collection $orders, int $userId): string
     {
+        $orderIds = $orders->pluck('id')->filter()->values();
+        $orderYears = $orders->pluck('year')->filter()->unique()->values();
+
+        $productsSkuByOrder = collect();
+        if ($orderIds->isNotEmpty() && $orderYears->isNotEmpty()) {
+            $productsSkuByOrder = ProductSKU::query()
+                ->withoutGlobalScopes()
+                ->whereIn('order_id', $orderIds)
+                ->whereIn('year', $orderYears)
+                ->get()
+                ->groupBy('order_id');
+        }
 
         $inputFileType = 'Xlsx'; // Xlsx - Xml - Ods - Slk - Gnumeric - Csv
         $inputFileName = './templates/Orders.xlsx';
@@ -40,6 +53,10 @@ class ExportOrdersService
         $prevInstDate = '';
         $j = 1;
         foreach ($orders as $order) {
+            $orderProductsSku = ($productsSkuByOrder->get($order->id) ?? collect())
+                ->where('year', (int) $order->year)
+                ->values();
+            $order->setRelation('products_sku', $orderProductsSku);
 
             $instDate = ($order->installation_date) ? DateHelper::getHumanDate($order->installation_date, true) : '';
             $readyDate = ($order->ready_date) ? DateHelper::getHumanDate($order->ready_date, true) : '';
@@ -91,4 +108,4 @@ class ExportOrdersService
         return $fileModel?->link ?? '';
 
     }
-}
+}

+ 12 - 2
app/Services/GenerateDocumentsService.php

@@ -36,7 +36,11 @@ class GenerateDocumentsService
     public function generateInstallationPack(Order $order, int $userId): string
     {
         $techDocsPath = base_path('/tech-docs/');
-        $products_sku = $order->products_sku;
+        $products_sku = $order->products_sku()
+            ->withoutGlobalScopes()
+            ->where('year', $order->year)
+            ->get();
+        $order->setRelation('products_sku', $products_sku);
         $articles = [];
         Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp/Схемы сборки/');
 
@@ -112,6 +116,12 @@ class GenerateDocumentsService
      */
     public function generateHandoverPack(Order $order, int $userId): string
     {
+        $productsSku = $order->products_sku()
+            ->withoutGlobalScopes()
+            ->where('year', $order->year)
+            ->get();
+        $order->setRelation('products_sku', $productsSku);
+
         $articles = [];
         Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp/ПАСПОРТ/');
         Storage::disk('public')->makeDirectory('orders/' . $order->id . '/tmp/СЕРТИФИКАТ/');
@@ -127,7 +137,7 @@ class GenerateDocumentsService
             }
         }
 
-        foreach ($order->products_sku as $sku) {
+        foreach ($productsSku as $sku) {
             // copy certificates
             if ($sku->product->certificate_id) {
                 $from = $sku->product->certificate->path;

+ 3 - 2
app/Services/ImportOrdersService.php

@@ -88,8 +88,6 @@ class ImportOrdersService extends ImportBaseService
 
                 $logMessage = "Row $strNumber: " . $r['orders.object_address'] . '. ';
                 $year = (int)$r['orders.year'];
-                session(['year' => $year]);
-
                 // округ
                 if (!($districtId = $this->findId('districts.shortname', $r['districts.name']))) {
                     if((string)$r['districts.name'] !== '')  {
@@ -162,6 +160,7 @@ class ImportOrdersService extends ImportBaseService
 
                 // order
                 $order = Order::query()
+                    ->withoutGlobalScopes()
                     ->where('year', $year)
                     ->where('object_address', $r['orders.object_address'])
                     ->first();
@@ -189,6 +188,7 @@ class ImportOrdersService extends ImportBaseService
                 // maf order
                 if ($r['maf_orders.order_number'] != '') {
                     $mafOrder = MafOrder::query()
+                        ->withoutGlobalScopes()
                         ->where('year', $year)
                         ->where('product_id', $product->id)
                         ->where('order_number', $r['maf_orders.order_number'])
@@ -221,6 +221,7 @@ class ImportOrdersService extends ImportBaseService
                 $statement_date = is_int($r['products_sku.statement_date']) ? DateHelper::excelDateToISODate($r['products_sku.statement_date']) : null;
 
                 $productSKU = ProductSKU::query()
+                    ->withoutGlobalScopes()
                     ->where('year', $year)
                     ->where('rfid', $r['products_sku.rfid'])
                     ->where('product_id', $product->id)

+ 16 - 1
resources/views/schedule/index.blade.php

@@ -114,7 +114,22 @@
                         @foreach($schs as $schedule)
                             {!! (!$loop->first) ? '<tr>':'' !!}
                             <td style="background: {{ $schedule->brigadier->color }}"
-                                class="align-middle code-{{ $schedule->id }}">{{ $schedule->address_code }}</td>
+                                class="align-middle code-{{ $schedule->id }}">
+                                @php
+                                    $reclamationId = null;
+                                    if ($schedule->source === 'Рекламации' && preg_match('/^РЕКЛ-(\d+)$/u', (string) $schedule->address_code, $matches)) {
+                                        $reclamationId = (int) $matches[1];
+                                    }
+                                @endphp
+
+                                @if($reclamationId)
+                                    <a href="{{ route('reclamations.show', ['reclamation' => $reclamationId]) }}">{{ $schedule->address_code }}</a>
+                                @elseif($schedule->source === 'Площадки' && $schedule->order_id)
+                                    <a href="{{ route('order.show', ['order' => $schedule->order_id, 'sync_year' => 1]) }}">{{ $schedule->address_code }}</a>
+                                @else
+                                    {{ $schedule->address_code }}
+                                @endif
+                            </td>
                             <td style="background: {{ $schedule->brigadier->color }}"
                                 class="align-middle">{{ $schedule?->district?->shortname }}</td>
                             <td style="background: {{ $schedule->brigadier->color }}"