From 5e954ae350554dfefa05e3e6314baff1e4350009 Mon Sep 17 00:00:00 2001 From: imnavajas Date: Wed, 23 Jul 2025 14:02:59 +0200 Subject: [PATCH] Implementado en Bubok --- .../Importadores/ImportadorBubok.php | 81 +++------------- .../Services/PresupuestoUploaderService.php | 93 +++++++++++++++++++ 2 files changed, 106 insertions(+), 68 deletions(-) diff --git a/ci4/app/Controllers/Importadores/ImportadorBubok.php b/ci4/app/Controllers/Importadores/ImportadorBubok.php index 03d46982..419223c3 100644 --- a/ci4/app/Controllers/Importadores/ImportadorBubok.php +++ b/ci4/app/Controllers/Importadores/ImportadorBubok.php @@ -1,4 +1,5 @@ $producto->cover->file ?? null, 'body' => $producto->body->file ?? null, ]; - foreach ($archivoUrls as $tipo => $url) { - if (!$url) - continue; + $resultadoArchivos = $uploaderService->importarArchivosDesdeUrlsBubok($response['sk_id'], $archivoUrls); - try { - $contenido = @file_get_contents($url); // silenciar errores de PHP - - if ($contenido === false || strlen($contenido) === 0) { - // No se pudo descargar el archivo: generar archivo de error para FTP - $errorMessage = "ERROR: No se pudo descargar el archivo remoto para $tipo desde la URL: $url"; - - $remoteDir = $ftp->getPresupuestoRemotePath($response['sk_id']); // crea esta función si no existe - $remoteErrorFile = $remoteDir . '/ERROR_' . strtoupper($tipo) . '.txt'; - - // Crear archivo temporal con el mensaje de error - $tempErrorFile = WRITEPATH . 'uploads/presupuestos/ERROR_' . $tipo . '.txt'; - file_put_contents($tempErrorFile, $errorMessage); - - if (!$ftp->is_dir($remoteDir)) { - $ftp->mkdir($remoteDir, recursive: true); - } - - $ftp->put($remoteErrorFile, $tempErrorFile, $ftp::SOURCE_LOCAL_FILE); - - continue; // no procesar este archivo - } - - // ✅ Procesar normalmente si la descarga tuvo éxito - $nombreOriginal = basename(parse_url($url, PHP_URL_PATH)); - $extension = pathinfo($nombreOriginal, PATHINFO_EXTENSION); - - $nombreLimpio = $presupuestoFicheroModel->saveFileInBBDD( - $response['sk_id'], - $nombreOriginal, - $extension, - auth()->id() - ); - - if (is_null($nombreLimpio)) - continue; - - $rutaLocal = WRITEPATH . 'uploads/presupuestos/'; - if (!is_dir($rutaLocal)) { - mkdir($rutaLocal, 0777, true); - } - - file_put_contents($rutaLocal . $nombreLimpio, $contenido); - } catch (\Throwable $e) { - //log_message('error', 'Error inesperado en descarga de archivo remoto: ' . $e->getMessage()); - } - } - - - // Subir al FTP después de guardar localmente - try { - $ftp->uploadFilePresupuesto($response['sk_id']); - } catch (\Throwable $e) { - log_message('error', 'Error subiendo archivos al FTP: ' . $e->getMessage()); + if (!$resultadoArchivos['success']) { + log_message('warning', 'Errores al importar archivos desde Bubok: ' . print_r($resultadoArchivos['errores'], true)); } return $this->respond([ 'status' => 200, 'data' => [ 'sk_id' => $response['sk_id'], - 'sk_url' => $response['sk_url'] ?? null + 'sk_url' => $response['sk_url'] ?? null, + 'archivos_subidos' => $resultadoArchivos['archivos_subidos'], + 'errores_archivos' => $resultadoArchivos['errores'] ] ]); - - } catch (\Throwable $e) { return $this->respond([ 'status' => 500, @@ -544,8 +493,4 @@ class ImportadorBubok extends BaseResourceController ]); } } - - - - } diff --git a/ci4/app/Services/PresupuestoUploaderService.php b/ci4/app/Services/PresupuestoUploaderService.php index 04c4cfe7..19174fd3 100644 --- a/ci4/app/Services/PresupuestoUploaderService.php +++ b/ci4/app/Services/PresupuestoUploaderService.php @@ -210,4 +210,97 @@ class PresupuestoUploaderService 'zipPath' => $zipPath ]; } + + + public function importarArchivosDesdeUrlsBubok(int $presupuestoId, array $urls): array + { + $resultados = []; + $errores = []; + + foreach ($urls as $tipo => $url) { + if (empty($url)) { + $errores[] = "URL vacía para tipo: {$tipo}"; + continue; + } + + try { + // Intenta descargar el contenido del archivo desde la URL + $contenido = @file_get_contents($url); + + // Si no se puede descargar, se genera un archivo de error local (no se guarda en BBDD) + if ($contenido === false || strlen($contenido) === 0) { + $mensajeError = "ERROR: No se pudo descargar el archivo remoto para $tipo desde la URL: $url"; + $nombreError = 'ERROR_' . strtoupper($tipo) . '.txt'; + + // Ruta local en la estructura estándar (no BBDD) + $rutaError = $this->fileModel->getAbsolutePath($presupuestoId, $nombreError); + + // Crear el directorio si no existe + $directorio = dirname($rutaError); + if (!is_dir($directorio)) { + mkdir($directorio, 0755, true); + } + + // Guardar el archivo con el mensaje de error + file_put_contents($rutaError, $mensajeError); + + // Registrar el error en el array de errores + $errores[] = $mensajeError; + continue; + } + + // Nombre original y extensión del archivo descargado + $nombreOriginal = basename(parse_url($url, PHP_URL_PATH)); + $extension = pathinfo($nombreOriginal, PATHINFO_EXTENSION); + + // Registrar el archivo en la base de datos y obtener el nombre limpio + $nombreLimpio = $this->fileModel->saveFileInBBDD( + $presupuestoId, + $nombreOriginal, + $extension, + auth()->id() + ); + + if (!$nombreLimpio) { + $errores[] = "No se pudo registrar '$nombreOriginal' en la base de datos."; + continue; + } + + // Obtener la ruta completa donde se guardará el archivo localmente + $rutaAbsoluta = $this->fileModel->getAbsolutePath($presupuestoId, $nombreLimpio); + + // Crear el directorio si no existe + $directorio = dirname($rutaAbsoluta); + if (!is_dir($directorio)) { + mkdir($directorio, 0755, true); + } + + // Guardar el archivo en el sistema de archivos local + file_put_contents($rutaAbsoluta, $contenido); + + // Añadir el archivo a la lista de resultados + $resultados[] = [ + 'nombre' => $nombreLimpio, + 'tipo' => $tipo, + 'ruta_local' => $rutaAbsoluta + ]; + } catch (\Throwable $e) { + $errores[] = "Error inesperado procesando '$tipo': " . $e->getMessage(); + } + } + + // Subida de todos los archivos válidos al servidor remoto SFTP + try { + $this->uploadToRemote($presupuestoId); + } catch (\Throwable $e) { + $errores[] = "Error al subir archivos al SFTP: " . $e->getMessage(); + } + + // Devolver el resumen del proceso + return [ + 'success' => empty($errores), + 'archivos_subidos' => $resultados, + 'errores' => $errores + ]; + } }