Explorar o código

Generate reclamation pack - xls

Alexander Musikhin hai 7 meses
pai
achega
2db7973c4b

+ 6 - 0
app/Http/Controllers/ReclamationController.php

@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
 use App\Http\Requests\CreateReclamationRequest;
 use App\Http\Requests\StoreReclamationDetailsRequest;
 use App\Http\Requests\StoreReclamationRequest;
+use App\Jobs\GenerateReclamationPack;
 use App\Models\File;
 use App\Models\Order;
 use App\Models\Reclamation;
@@ -209,4 +210,9 @@ class ReclamationController extends Controller
         return redirect()->route('reclamations.show', $reclamation);
     }
 
+    public function generateReclamationPack(Reclamation $reclamation)
+    {
+        GenerateReclamationPack::dispatch($reclamation, auth()->user()->id);
+        return redirect()->route('reclamations.show', $reclamation)->with(['success' => 'Задача генерации документов создана!']);
+    }
 }

+ 39 - 0
app/Jobs/GenerateReclamationPack.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Events\SendWebSocketMessageEvent;
+use App\Models\Reclamation;
+use App\Services\GenerateDocumentsService;
+use Exception;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Queue\Queueable;
+use Illuminate\Support\Facades\Log;
+
+class GenerateReclamationPack implements ShouldQueue
+{
+    use Queueable;
+
+    /**
+     * Create a new job instance.
+     */
+    public function __construct(private readonly Reclamation $reclamation, private readonly int $userId)
+    {
+        //
+    }
+
+    /**
+     * Execute the job.
+     */
+    public function handle(): void
+    {
+        try {
+            $link = (new GenerateDocumentsService())->generateReclamationPack($this->reclamation, $this->userId);
+            Log::info('Generate installation pack finished!');
+            event(new SendWebSocketMessageEvent('Пакет документов рекламации готов!', $this->userId, ['success' => true, 'link' => $link]));
+        } catch (Exception $e) {
+            Log::error('Generate installation pack failed! ' . $e->getMessage());
+            event(new SendWebSocketMessageEvent('Ошибка создания пакета документов рекламации! ', $this->userId, ['error' => $e->getMessage()]));
+        }
+    }
+}

+ 140 - 3
app/Services/GenerateDocumentsService.php

@@ -6,10 +6,10 @@ use App\Helpers\DateHelper;
 use App\Helpers\ExcelHelper;
 use App\Models\Contract;
 use App\Models\Order;
+use App\Models\Reclamation;
 use Exception;
 use Illuminate\Support\Facades\Storage;
 use Illuminate\Support\Str;
-use PhpOffice\PhpSpreadsheet\Cell\Cell;
 use PhpOffice\PhpSpreadsheet\IOFactory;
 use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
 use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
@@ -19,6 +19,8 @@ class GenerateDocumentsService
     const INSTALL_FILENAME = 'Монтаж ';
     const HANDOVER_FILENAME = 'Сдача ';
 
+    const RECLAMATION_FILENAME = 'Рекламация ';
+
     /**
      * @param Order $order
      * @param int $userId
@@ -113,7 +115,6 @@ class GenerateDocumentsService
         // copy app photos
         foreach ($order->photos as $photo) {
             $from = $photo->path;
-            @dump($photo->original_name);
             $to = 'orders/' . $order->id . '/tmp/ФОТО ПСТ/' . $photo->original_name;
             if (!Storage::disk('public')->exists($to)) {
                 Storage::disk('public')->copy($from, $to);
@@ -155,7 +156,7 @@ class GenerateDocumentsService
         $fileModel = (new FileService())->createZipArchive('orders/' . $order->id . '/tmp', self::HANDOVER_FILENAME . $order->common_name . '.zip', $userId);
 
         // remove temp files
-//        Storage::disk('public')->deleteDirectory('orders/' . $order->id . '/tmp');
+        Storage::disk('public')->deleteDirectory('orders/' . $order->id . '/tmp');
         $order->documents()->syncWithoutDetaching($fileModel);
 
         // return link
@@ -208,6 +209,7 @@ class GenerateDocumentsService
 
         $writer->save(storage_path('app/public/orders/') . $order->id . '/tmp/' . $fileName);
     }
+
     private function generateQualityDeclaration(Order $order): void
     {
         $inputFileType = 'Xlsx';
@@ -259,6 +261,7 @@ class GenerateDocumentsService
 
         $writer->save(storage_path('app/public/orders/') . $order->id . '/tmp/' . $fileName);
     }
+
     private function generateInventory(Order $order): void
     {
         $inputFileType = 'Xlsx';
@@ -296,6 +299,7 @@ class GenerateDocumentsService
 
         $writer->save(storage_path('app/public/orders/') . $order->id . '/tmp/' . $fileName);
     }
+
     private function generatePassport(Order $order): void
     {
         $inputFileType = 'Xlsx';
@@ -331,4 +335,137 @@ class GenerateDocumentsService
         $writer->save(storage_path('app/public/orders/') . $order->id . '/tmp/' . $fileName);
     }
 
+    public function generateReclamationPack(Reclamation $reclamation, int $userId): string
+    {
+        Storage::disk('public')->makeDirectory('reclamations/' . $reclamation->id . '/tmp/' . $reclamation->order->object_address . '/ФОТО НАРУШЕНИЯ/');
+        // copy photos
+        foreach ($reclamation->photos_before as $photo) {
+            $from = $photo->path;
+            $to = 'reclamations/' . $reclamation->id . '/tmp/' . $reclamation->order->object_address . '/ФОТО НАРУШЕНИЯ/' . $photo->original_name;
+            if (!Storage::disk('public')->exists($to)) {
+                Storage::disk('public')->copy($from, $to);
+            }
+        }
+
+        // create xls and pdf
+        $this->generateReclamationOrder($reclamation);
+        $this->generateReclamationAct($reclamation);
+        $this->generateReclamationGuarantee($reclamation);
+
+        // create zip archive
+        $fileModel = (new FileService())->createZipArchive('reclamations/' . $reclamation->id . '/tmp', self::RECLAMATION_FILENAME . $reclamation->order->object_address . '.zip', $userId);
+
+        // remove temp files
+        Storage::disk('public')->deleteDirectory('reclamations/' . $reclamation->id . '/tmp');
+        $reclamation->documents()->syncWithoutDetaching($fileModel);
+
+        // return link
+        return $fileModel?->link ?? '';
+    }
+
+    private function generateReclamationOrder(Reclamation $reclamation): void
+    {
+        $inputFileType = 'Xlsx';
+        $inputFileName = './templates/ReclamationOrder.xlsx';
+
+        $reader = IOFactory::createReader($inputFileType);
+        $spreadsheet = $reader->load($inputFileName);
+        $sheet = $spreadsheet->getActiveSheet();
+
+        $articles = [];
+        foreach ($reclamation->skus as $p) {
+            $articles[] = $p->product->article;
+        }
+
+        $sheet->setCellValue('J4', DateHelper::getHumanDate($reclamation->create_date, true));
+        $sheet->setCellValue('L10', $reclamation->order->common_name);
+        $sheet->setCellValue('L11', $reclamation->order->area?->responsible?->name);
+        $sheet->setCellValue('W11', $reclamation->order->area?->responsible?->phone);
+        $sheet->setCellValue('L12', $reclamation->order->year);
+        $sheet->setCellValue('G13', $reclamation->guarantee);
+        $sheet->setCellValue('G14', implode(', ', $articles));
+        $sheet->setCellValue('Y15', DateHelper::getHumanDate($reclamation->finish_date, true));
+        $sheet->setCellValue('U20', DateHelper::getHumanDate($reclamation->create_date, true));
+
+        // save file
+        $fileName = 'Монтажная заявка - ' . $reclamation->order->object_address . '.xlsx';
+        $writer = new Xlsx($spreadsheet);
+        Storage::disk('public')->makeDirectory('reclamations/' . $reclamation->id . '/tmp/' . $reclamation->order->object_address);
+
+        $writer->save(storage_path('app/public/reclamations/') . $reclamation->id . '/tmp/' . $reclamation->order->object_address . '/' . $fileName);
+    }
+
+    public function generateReclamationAct(Reclamation $reclamation): void
+    {
+        $inputFileType = 'Xlsx';
+        $inputFileName = './templates/ReclamationAct.xlsx';
+
+        $reader = IOFactory::createReader($inputFileType);
+        $spreadsheet = $reader->load($inputFileName);
+        $sheet = $spreadsheet->getActiveSheet();
+
+        $mafs = [];
+        foreach ($reclamation->skus as $p) {
+            $mafs[] = $p->product->passport_name . ', тип ' . $p->product->nomenclature_number;
+        }
+
+        $sheet->setCellValue('A17', $reclamation->order->object_address);
+        $sheet->setCellValue('A22', implode('; ', $mafs));
+        $sheet->setCellValue('A27', $reclamation->whats_done);
+
+        $i = 24;
+        $n = 1;
+        foreach ($reclamation->skus as $p) {
+            if ($n++ > 1) {
+                $i++;
+                $sheet->insertNewRowBefore($i, 1);
+                $range = 'D' . $i . ':I' . $i;
+                $sheet->mergeCells($range);
+            }
+            $sheet->setCellValue('D' . $i, $p->rfid);
+        }
+
+        // save file
+        $fileName = 'Акт - ' . $reclamation->order->object_address . '.xlsx';
+        $writer = new Xlsx($spreadsheet);
+        Storage::disk('public')->makeDirectory('reclamations/' . $reclamation->id . '/tmp/' . $reclamation->order->object_address);
+        $writer->save(storage_path('app/public/reclamations/') . $reclamation->id . '/tmp/' . $reclamation->order->object_address . '/' . $fileName);
+    }
+
+    private function generateReclamationGuarantee(Reclamation $reclamation): void
+    {
+        $inputFileType = 'Xlsx';
+        $inputFileName = './templates/ReclamationGuarantee.xlsx';
+
+        $reader = IOFactory::createReader($inputFileType);
+        $spreadsheet = $reader->load($inputFileName);
+        $sheet = $spreadsheet->getActiveSheet();
+
+        $mafs = [];
+        foreach ($reclamation->skus as $p) {
+            $mafs[] = 'Тип ' . $p->product->nomenclature_number . '(' . $p->product->passport_name . ')' ;
+        }
+
+        $text = "ООО «НАШ ДВОР-СТ» в рамках обязательств по Договору №{$reclamation->order?->contract?->contract_number}" .
+            " от " . DateHelper::getHumanDate($reclamation->order?->contract?->contract_date ?? '1970-01-01', true) .
+            " г. на выполнение комплекса работ по поставке, монтажу устанавливаемых на городских территориях малых архитектурных форм гарантирует " .
+            $reclamation->guarantee . " на оборудовании «" . implode('; ', $mafs) .
+            "» установленному по адресу г. Москва, " . $reclamation->order->object_address . " в срок до " .
+            DateHelper::getHumanDate($reclamation->finish_date, true). " г. в связи с отсутствием детали в наличии и ее производством.";
+
+
+        $sheet->setCellValue('B9', $reclamation->id);
+        $sheet->setCellValue('D9', DateHelper::getHumanDate($reclamation->create_date, true));
+        $sheet->setCellValue('A19', $text);
+
+        // save file
+        $fileName = 'Гарантийное письмо - ' . $reclamation->order->object_address . '.xlsx';
+        $writer = new Xlsx($spreadsheet);
+        Storage::disk('public')->makeDirectory('reclamations/' . $reclamation->id . '/tmp/' . $reclamation->order->object_address);
+        $writer->save(storage_path('app/public/reclamations/') . $reclamation->id . '/tmp/' . $reclamation->order->object_address . '/' . $fileName);
+
+//        $writerPdf = new \PhpOffice\PhpSpreadSheet\Writer\Pdf\;
+
+    }
+
 }

+ 1 - 1
database/migrations/2025_04_30_172039_create_reclamations_table.php

@@ -12,7 +12,7 @@ return new class extends Migration
     public function up(): void
     {
         Schema::create('reclamations', function (Blueprint $table) {
-            $table->id();
+            $table->id()->from(100);
             $table->foreignId('order_id')->constrained('orders')->restrictOnDelete();
             $table->foreignId('user_id')->constrained('users')->restrictOnDelete();
             $table->date('create_date')->useCurrent();

+ 2 - 1
resources/views/reclamations/edit.blade.php

@@ -7,7 +7,8 @@
             <div class="col-xl-6">
                 <h4>Рекламация</h4>
             </div>
-            <div class="col-xl-6 text-end">
+            <div class="col-xl-6 text-end mb-2">
+                <a href="{{ route('order.generate-reclamation-pack', $reclamation) }}" class="btn btn-primary btn-sm">Пакет документов рекламации</a>
 
             </div>
         </div>

+ 1 - 0
routes/web.php

@@ -109,6 +109,7 @@ Route::middleware('auth:web')->group(function () {
 
     Route::get('order/generate-installation-pack/{order}', [OrderController::class, 'generateInstallationPack'])->name('order.generate-installation-pack');
     Route::get('order/generate-handover-pack/{order}', [OrderController::class, 'generateHandoverPack'])->name('order.generate-handover-pack');
+    Route::get('reclamation/generate-reclamation-pack/{reclamation}', [ReclamationController::class, 'generateReclamationPack'])->name('order.generate-reclamation-pack');
 
     // Склад (МАФ)
     Route::get('product_sku', [ProductSKUController::class, 'index'])->name('product_sku.index');

BIN=BIN
templates/ReclamationAct.xlsx


BIN=BIN
templates/ReclamationGuarantee.xlsx


BIN=BIN
templates/ReclamationOrder.xlsx