|
|
@@ -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);
|
|
|
+ }
|
|
|
}
|