Просмотр исходного кода

flujo completado, se validan y guardan en temp, se procesan y mueven a de temp a final, revisar optimizacion

EmilianoOrtiz 3 месяцев назад
Родитель
Сommit
0aa88f0530

+ 158 - 1
sistema-mantenimiento-back/app/Http/Controllers/ValidateLoadArchivesController.php

@@ -167,7 +167,17 @@ class ValidateLoadArchivesController extends Controller
                 return $this->responseController->makeResponse(true, $tempFiles['message'], [], 400);
             }
             Log::info('✓ Archivos temporales subidos');
+            
+            // Extract and save individual files as temp
+            Log::info('Paso 7: Extrayendo y guardando archivos individuales como temporales');
+            $individualTempFiles = $this->extractAndSaveIndividualFilesAsTemp($request->file('zip_file'), $request->input('linea'), "0000000001");
+            if ($individualTempFiles === false) {
+                return $this->responseController->makeResponse(true, 'Error procesando archivos individuales', [], 400);
+            }
+            Log::info('✓ Archivos individuales guardados como temporales: ' . count($individualTempFiles));
+            
             $comparison['temp_files'] = $tempFiles['files'];
+            $comparison['individual_temp_files'] = $individualTempFiles;
         }
         
         Log::info('=== VALIDACIÓN COMPLETADA EXITOSAMENTE ===');
@@ -423,7 +433,8 @@ class ValidateLoadArchivesController extends Controller
             'linea' => 'required|integer',
             'temp_files' => 'required|array',
             'temp_files.excel' => 'required|string',
-            'temp_files.zip' => 'required|string'
+            'temp_files.zip' => 'required|string',
+            'individual_temp_files' => 'required|array'
         ]);
 
         if ($validator->fails()) {
@@ -461,6 +472,21 @@ class ValidateLoadArchivesController extends Controller
             }
             $finalFiles['zip'] = $zipFinal;
             
+            // Move individual temp files to final storage
+            Log::info('Moviendo archivos individuales de temporal a final');
+            $individualFiles = [];
+            foreach ($form['individual_temp_files'] as $tempFile) {
+                $finalFileId = $this->moveToFinal($tempFile['temp_id'], $form['linea'], $idUser);
+                if ($finalFileId) {
+                    $individualFiles[] = [
+                        'original_name' => $tempFile['original_name'],
+                        'final_id' => $finalFileId
+                    ];
+                }
+            }
+            $finalFiles['individual_files'] = $individualFiles;
+            Log::info('Archivos individuales procesados: ' . count($individualFiles));
+            
             Log::info('=== PROCESAMIENTO COMPLETADO EXITOSAMENTE ===');
             return $this->responseController->makeResponse(false, 'Archivos procesados exitosamente.', $finalFiles);
             
@@ -494,4 +520,135 @@ class ValidateLoadArchivesController extends Controller
             return false;
         }
     }
+    
+    /**
+     * Extracts individual files from ZIP and saves them as temporary files
+     */
+    private function extractAndSaveIndividualFilesAsTemp($zipFile, $line, $idUser)
+    {
+        try {
+            $zip = new ZipArchive();
+            if ($zip->open($zipFile->getPathname()) !== TRUE) {
+                Log::error('Cannot open ZIP file');
+                return false;
+            }
+            
+            $tempFiles = [];
+            $tempDir = storage_path('app/tempFiles/extracted_' . time());
+            mkdir($tempDir, 0755, true);
+            
+            for ($i = 0; $i < $zip->numFiles; $i++) {
+                $fullPath = $zip->getNameIndex($i);
+                
+                // Skip directories
+                if (substr($fullPath, -1) === '/') {
+                    continue;
+                }
+                
+                $fileName = basename($fullPath);
+                if (empty($fileName)) continue;
+                
+                // Extract file to temp directory
+                if ($zip->extractTo($tempDir, $fullPath)) {
+                    $finalExtractPath = $tempDir . '/' . $fileName;
+                    if (file_exists($tempDir . '/' . $fullPath)) {
+                        rename($tempDir . '/' . $fullPath, $finalExtractPath);
+                    }
+                    
+                    if (file_exists($finalExtractPath)) {
+                        // Upload as temp file
+                        $tempFileId = $this->uploadExtractedFileAsTemp($finalExtractPath, $fileName, $line, $idUser);
+                        if ($tempFileId) {
+                            $tempFiles[] = [
+                                'original_name' => $fileName,
+                                'temp_id' => $tempFileId
+                            ];
+                        }
+                        unlink($finalExtractPath);
+                    }
+                }
+            }
+            
+            $zip->close();
+            //$this->removeDirectory($tempDir);
+            
+            return $tempFiles;
+            
+        } catch (\Exception $e) {
+            Log::error('Error en extractAndSaveIndividualFilesAsTemp: ' . $e->getMessage());
+            return false;
+        }
+    }
+    
+    /**
+     * Uploads an extracted file as temporary file
+     */
+    private function uploadExtractedFileAsTemp($filePath, $fileName, $line, $idUser)
+    {
+        try {
+            $extension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
+            $mimeType = $this->getMimeType($extension);
+            
+            // Create a temporary uploaded file object
+            $tempFile = new \Illuminate\Http\UploadedFile(
+                $filePath,
+                $fileName,
+                $mimeType,
+                null,
+                true
+            );
+            
+            $request = new Request();
+            $request->files->set('file', $tempFile);
+            $request->merge([
+                'id_user' => $this->encryptionController->encrypt($idUser),
+                'linea' => $line
+            ]);
+            
+            $response = $this->documentManagementController->uploadTempFile($request);
+            $data = json_decode($response->getContent());
+            
+            return $data->error ? false : $data->response->idArchivo;
+            
+        } catch (\Exception $e) {
+            Log::error('Error en uploadExtractedFileAsTemp: ' . $e->getMessage());
+            return false;
+        }
+    }
+    
+    /**
+     * Gets MIME type for file extension
+     */
+    private function getMimeType($extension)
+    {
+        $mimeTypes = [
+            'pdf' => 'application/pdf',
+            'doc' => 'application/msword',
+            'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+            'xls' => 'application/vnd.ms-excel',
+            'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+            'ppt' => 'application/vnd.ms-powerpoint',
+            'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+            'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg',
+            'png' => 'image/png', 'gif' => 'image/gif', 'bmp' => 'image/bmp',
+            'txt' => 'text/plain', 'dwg' => 'application/acad', 'dxf' => 'application/dxf'
+        ];
+        
+        return $mimeTypes[$extension] ?? 'application/octet-stream';
+    }
+    
+    /**
+     * Recursively removes a directory and its contents
+     */
+    private function removeDirectory($dir)
+    {
+        if (!is_dir($dir)) return;
+        
+        $files = array_diff(scandir($dir), ['.', '..']);
+        foreach ($files as $file) {
+            $path = $dir . '/' . $file;
+            is_dir($path) ? $this->removeDirectory($path) : unlink($path);
+        }
+        rmdir($dir);
+    }
 }

+ 1 - 1
sistema-mantenimiento-back/routes/api.php

@@ -555,4 +555,4 @@ Route::middleware(['jwt.auth'])->group(function(){
 
 // Endpoints for file validation and processing - outside middleware for public access
 Route::post("/validate-load-archives", "App\Http\Controllers\ValidateLoadArchivesController@validateFiles");
-Route::post("/process-load-archives", "App\Http\Controllers\ValidateLoadArchivesController@processLoadArchives");
+Route::post("/process-load-archives", "App\Http\Controllers\ValidateLoadArchivesController@processLoadArchives");