diff --git a/.gitignore b/.gitignore index 2d42bcbe..2740fefd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ ci4/.env .vscode/ -./xdebug.log \ No newline at end of file +xdebug.log \ No newline at end of file diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index 351c5438..1aaf1de3 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -788,7 +788,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController return $this->respond([ 'status' => $id, - 'url' => site_url('presupuestocliente/list'), + 'url' => site_url('presupuestos/presupuestocliente/edit'), 'message' => lang('Basic.global.saveSuccess', [lang('Basic.global.record')]), $csrfTokenName => $newTokenHash ]); @@ -797,6 +797,89 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } } + public function get_files(){ + + // Check if the request is a POST request + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + + $presupuesto_id = $this->request->getPost()['presupuesto_id'] ?? 0; + + $model = model('App\Models\Presupuestos\PresupuestoFicheroModel'); + $files = $model->getFiles($presupuesto_id); + + $result = []; + + foreach ($files as $file) { + + $size = filesize($file->file_path); + $splitPath = explode("presupuestos/", $file->file_path); + + // se crea un objeto con el nombre del fichero y el tamaño + $obj = (object) array( + 'name' => $file->nombre, + 'size' => $size, + 'hash' => $splitPath[1] ?? $file->file_path); + + + // se añade el objeto al array + array_push($result, $obj); + } + + return json_encode($result); + } + } + + public function upload_files(){ + + $model = model('App\Models\Presupuestos\PresupuestoFicheroModel'); + + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + + $presupuesto_id = $_POST['presupuesto_id']; + $old_files = json_decode($_POST['oldFiles']); + + // Comprobar si se han subido archivos + if (!empty($_FILES['file']) || !empty($old_files)) { + + + // Borrar los archivos existentes del presupuesto + $model->deleteFiles($presupuesto_id, $old_files); + + if (!empty($_FILES['file'])){ + $files = $_FILES['file']; + + // Iterar sobre los archivos + for ($i = 0; $i < count($files['name']); $i++) { + // Aquí puedes acceder a las propiedades del archivo + $name = $files['name'][$i]; + $extension = explode('.', $files['name'][$i])[1]; + $tmp_name = $files['tmp_name'][$i]; + + $new_name = $model->saveFileInBBDD($presupuesto_id, $name, $extension, auth()->id()); + + // Se sube el fichero + // Pero primero se comprueba que la carpeta presupuestos exista + if (!is_dir(WRITEPATH . 'uploads/presupuestos')) { + mkdir(WRITEPATH . 'uploads/presupuestos', 0777, true); + } + + if(!is_null($new_name)){ + move_uploaded_file($tmp_name, WRITEPATH . 'uploads/presupuestos/' . $new_name); + } + } + } + } + else{ + // Borrar los archivos existentes del presupuesto + $model->deleteFiles($presupuesto_id); + } + } + return json_encode(['message' => 'Archivos subidos correctamente']); + } + + + + /*********************** * @@ -1479,7 +1562,6 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } } - protected function calcular_coste_linea($linea, &$totalPapel, &$margenPapel, &$sumForFactor, &$totalImpresion, &$margenImpresion) { if (count($linea) == 0) @@ -1676,14 +1758,18 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController protected function obtenerPaginasColor($presupuestoEntity) { $comparador_data = json_decode($presupuestoEntity->comparador_json_data); - if (property_exists($comparador_data, 'color')) { - $presupuestoEntity->paginasColor = $comparador_data->color->paginas; + if(!is_null($comparador_data)){ + if (property_exists($comparador_data, 'color')) { + $presupuestoEntity->paginasColor = $comparador_data->color->paginas; + } + if (property_exists($comparador_data, 'colorhq')) { + $presupuestoEntity->paginasColor = $comparador_data->colorhq->paginas; + } else { + $presupuestoEntity->paginasColor = 0; + } } - if (property_exists($comparador_data, 'colorhq')) { - $presupuestoEntity->paginasColor = $comparador_data->colorhq->paginas; - } else { + else $presupuestoEntity->paginasColor = 0; - } } protected function obtenerTiradas($presupuestoEntity) diff --git a/ci4/app/Controllers/Sistema/Intranet.php b/ci4/app/Controllers/Sistema/Intranet.php new file mode 100644 index 00000000..48cb27a5 --- /dev/null +++ b/ci4/app/Controllers/Sistema/Intranet.php @@ -0,0 +1,37 @@ +setContentType($mime_type); + + // Set the output + $response->setBody(file_get_contents($resource_path)); + + // Send the response to the browser + $response->send(); + } + + } + +} \ No newline at end of file diff --git a/ci4/app/Entities/Presupuestos/PresupuestoFicheroEntity.php b/ci4/app/Entities/Presupuestos/PresupuestoFicheroEntity.php new file mode 100644 index 00000000..8948c1e8 --- /dev/null +++ b/ci4/app/Entities/Presupuestos/PresupuestoFicheroEntity.php @@ -0,0 +1,19 @@ + null, + "presupuesto_id" => null, + "nombre" => null, + "file_path" => null, + "upload_by" => null, + "upload_at" => null, + ]; + protected $casts = [ + "presupuesto_id" => "int", + ]; +} diff --git a/ci4/app/Models/Presupuestos/PresupuestoFicheroModel.php b/ci4/app/Models/Presupuestos/PresupuestoFicheroModel.php new file mode 100644 index 00000000..46ab3db6 --- /dev/null +++ b/ci4/app/Models/Presupuestos/PresupuestoFicheroModel.php @@ -0,0 +1,89 @@ +generateFileHash($filename) . '.' . $extension; + + $this->db->table($this->table . " t1") + ->set('presupuesto_id', $presupuesto_id) + ->set('nombre', $filename) + ->set('file_path', WRITEPATH . 'uploads/presupuestos/' . $new_filename) + ->set('upload_by', $user_id) + ->set('upload_at', date('Y-m-d H:i:s')) + ->insert(); + + return $new_filename; + } catch (\Exception $e) { + return null; + } + } + + public function deleteFiles($presupuesto_id, $old_files = []){ + + $files = $this->db + ->table($this->table . " t1") + ->where('presupuesto_id', $presupuesto_id)->get()->getResult(); + if($files){ + foreach($files as $file){ + + // se comprueba que el $file->nombre no sea igual a ninguno de los elementos del array $old_files + if (!in_array($file->nombre, $old_files)) { + if (file_exists($file->file_path)) { + unlink($file->file_path); + } + + $this->db + ->table($this->table . " t1") + ->where('presupuesto_id', $presupuesto_id) + ->where('nombre', $file->nombre) + ->delete(); + } + } + } + } + + + public function getFiles($presupuesto_id){ + return $this->db + ->table($this->table . " t1") + ->where('presupuesto_id', $presupuesto_id)->get()->getResult(); + } + + + /** + * Función para convertir el nombre y extensión de un fichero en un hash único + * usando cifrado simétrico. + * + * @param string $filename Nombre del fichero con extensión + * @return string Hash encriptado del fichero + */ + private function generateFileHash($filename) { + return hash('sha256', $filename); + } + + +} diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php index 8bdcfd46..45d3720d 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/_resumenItems.php @@ -145,10 +145,29 @@ echo ''; endforeach; endif; - echo ''; echo ''; endif; ?> + + estado_id==2): ?> +
+

Ficheros

+
+
+
+ Arrastre aquí los ficheros o haga click +
+
+ +
+
+
+ +
+ @@ -181,7 +200,117 @@ window.routes_resumen = { duplicarPresupuesto: "", } -if(estado_id?>==2) +if(estado_id?>==2){ previewEsquemaCubierta(true); + const previewTemplate = `
+
+
+ +
+
+
+
+
+
+
+
+
+
+
`; + + Dropzone.autoDiscover = false; + + var dropzoneMulti = new Dropzone('#dropzone-multi', { + url: "", + addRemoveLinks: true, + previewTemplate: previewTemplate, + paramName: "file", + uploadMultiple: true, + parallelUploads: 4, // Ajusta este número al máximo número de archivos que esperas subir a la vez + maxFiles: 5, // Ajusta este número al máximo número de archivos que esperas subir a la vez + autoProcessQueue: true, + dictRemoveFile: "Eliminar", + acceptedFiles: 'image/*, application/pdf', + maxFilesize: 5e+7, // Bytes + init: function() { + thisDropzone = this; + $('#loader').show(); + + $.ajax({ + url: "", + type: 'POST', + data: { presupuesto_id: id ?> }, + + }).done(function(response) { + if(response == null || response == ""){ + return; + } + values = JSON.parse(response); + for(var i = 0; i < values.length; i++){ + var mockFile = { name: values[i].name, size: values[i].size, hash: values[i].hash}; + + thisDropzone.files.push(mockFile); // add to files array + thisDropzone.emit("addedfile", mockFile); + thisDropzone.emit("thumbnail", mockFile, window.location.host + "/sistema/intranet/presupuestos/"+values[i].hash); + thisDropzone.emit("complete", mockFile); + thisDropzone.options.success.call(thisDropzone, mockFile); + }; + }).always(function() { + $('#loader').hide(); + }); + + this.on("addedfile", function (file) { + if(file.hash){ + var viewButton = Dropzone.createElement("Ver"); + file.previewElement.appendChild(viewButton); + // Listen to the view button click event + viewButton.addEventListener("click", function (e) { + + window.open(window.location.protocol + "//" + window.location.host + "/sistema/intranet/presupuestos/"+file.hash, '_blank'); + }); + } + }); + } + }); + + $('#presupuesto-cliente-form').submit(function(e){ + e.preventDefault(); + var files = dropzoneMulti.files; + $('#loader').show(); + + var formData = new FormData(); + var oldFiles = []; + var counter = 0; + for (var i = 0; i < files.length; i++) { + + if(files[i].upload){ + var file = files[i]; + formData.append('file[' + counter + ']', file); + counter += 1; + } + else{ + oldFiles.push(files[i].name); + } + } + formData.append('oldFiles', JSON.stringify(oldFiles)); + + formData.append('presupuesto_id', id ?>); + + $.ajax({ + url: "", + type: 'POST', + data: formData, + processData: false, // Indicar a jQuery que no procese los datos + contentType: false // Indicar a jQuery que no establezca el tipo de contenido + }).done(function(response) { + // Aquí puedes manejar la respuesta del servidor + }).always(function() { + $('#loader').hide(); + }) + + return false; + }); +} endSection() ?> diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/disenioLibro.js b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/disenioLibro.js index 42185cd8..10eb0d72 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/disenioLibro.js +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/disenioLibro.js @@ -735,7 +735,10 @@ async function calcularPresupuesto() { } catch(error){ } - console.log(response); + + //For debug only + //console.log(response); + $('#loader').hide(); $('#divTiradasPrecio').empty(); diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js index c99aaa9d..7d493fa9 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/resumen.js @@ -279,11 +279,13 @@ function finalizarPresupuesto(confirmar){ data: datos, success: function(response) { - if(Object.keys(response).length > 0) { - if(response.status > 0){ - window.location.href = response.url; + if(confirmar){ + if(Object.keys(response).length > 0) { + if(response.status > 0){ + window.location.href = response.url + '/' + response.status; + } + } - } $('#loader').hide(); diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php index a8ec48a5..6abd657c 100644 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/cliente/viewPresupuestoclienteForm.php @@ -78,7 +78,7 @@
-
+ @@ -179,7 +179,6 @@
- @@ -239,10 +238,12 @@ if(estado_id ?>==1){ + endSection() ?> section('additionalExternalJs') ?> +