mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
Implementado en Bubok
This commit is contained in:
@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace App\Controllers\Importadores;
|
namespace App\Controllers\Importadores;
|
||||||
|
|
||||||
use App\Controllers\BaseResourceController;
|
use App\Controllers\BaseResourceController;
|
||||||
@ -456,85 +457,33 @@ class ImportadorBubok extends BaseResourceController
|
|||||||
], 400);
|
], 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ✅ Importar archivos desde URLs y subir al SFTP
|
||||||
// Descarga y subida de archivos al SFTP
|
$uploaderService = new \App\Services\PresupuestoUploaderService(
|
||||||
$presupuestoFicheroModel = model('App\Models\Presupuestos\PresupuestoFicheroModel');
|
new \App\Libraries\SftpClientWrapper(config('PresupuestoSFTP')),
|
||||||
$ftp = new \App\Libraries\SafekatFtpClient();
|
model(\App\Models\Presupuestos\PresupuestoFicheroModel::class),
|
||||||
|
config('PresupuestoSFTP')
|
||||||
|
);
|
||||||
|
|
||||||
$archivoUrls = [
|
$archivoUrls = [
|
||||||
'cover' => $producto->cover->file ?? null,
|
'cover' => $producto->cover->file ?? null,
|
||||||
'body' => $producto->body->file ?? null,
|
'body' => $producto->body->file ?? null,
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($archivoUrls as $tipo => $url) {
|
$resultadoArchivos = $uploaderService->importarArchivosDesdeUrlsBubok($response['sk_id'], $archivoUrls);
|
||||||
if (!$url)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
try {
|
if (!$resultadoArchivos['success']) {
|
||||||
$contenido = @file_get_contents($url); // silenciar errores de PHP
|
log_message('warning', 'Errores al importar archivos desde Bubok: ' . print_r($resultadoArchivos['errores'], true));
|
||||||
|
|
||||||
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());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->respond([
|
return $this->respond([
|
||||||
'status' => 200,
|
'status' => 200,
|
||||||
'data' => [
|
'data' => [
|
||||||
'sk_id' => $response['sk_id'],
|
'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) {
|
} catch (\Throwable $e) {
|
||||||
return $this->respond([
|
return $this->respond([
|
||||||
'status' => 500,
|
'status' => 500,
|
||||||
@ -544,8 +493,4 @@ class ImportadorBubok extends BaseResourceController
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -210,4 +210,97 @@ class PresupuestoUploaderService
|
|||||||
'zipPath' => $zipPath
|
'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
|
||||||
|
];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user