From e804aa3768100d5c6f37c21cce4c15a41796b91f Mon Sep 17 00:00:00 2001 From: imnavajas Date: Thu, 17 Jul 2025 14:17:42 +0200 Subject: [PATCH 1/2] Diferenciar naming en base a donde se invoca la descarga, OT vs PRESUPUESTO --- .../Presupuestos/Presupuestocliente.php | 16 +++++++-- .../Controllers/Produccion/Ordenmaquina.php | 35 ------------------- .../Produccion/Ordentrabajomaquetacion.php | 35 ------------------- .../Produccion/Pedidoproduccion.php | 35 ------------------- ci4/app/Libraries/SafekatFtpClient.php | 8 +++-- .../themes/vuexy/components/dropzone.php | 2 +- .../vuexy/form/produccion/ot/otFiles.php | 6 +++- .../components/forms/fileUploadDropzone.js | 10 +++--- .../assets/js/safekat/pages/produccion/ot.js | 2 ++ 9 files changed, 33 insertions(+), 116 deletions(-) delete mode 100755 ci4/app/Controllers/Produccion/Ordenmaquina.php delete mode 100755 ci4/app/Controllers/Produccion/Ordentrabajomaquetacion.php delete mode 100755 ci4/app/Controllers/Produccion/Pedidoproduccion.php diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index 15e036e9..6ed7c197 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -3686,21 +3686,30 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController public function download_zip() { $presupuesto_id = $this->request->getPost('presupuesto_id'); + $ot_id = $this->request->getPost('ot_id'); + if (!$presupuesto_id) { return $this->response->setStatusCode(400)->setBody('Presupuesto ID requerido'); } + // Definir prefijo si se recibió un ot_id válido + $prefijo = (!empty($ot_id) && is_numeric($ot_id)) ? "OT_{$ot_id}" : null; + $ftpClient = new \App\Libraries\SafekatFtpClient(); try { - $zipPath = $ftpClient->downloadZipPresupuesto((int) $presupuesto_id); + $zipPath = $ftpClient->downloadZipPresupuesto((int) $presupuesto_id, $prefijo); if ($zipPath === null || !file_exists($zipPath)) { return $this->response->setStatusCode(404)->setBody('No se encontraron archivos'); } + $nombreArchivo = $prefijo + ? "{$prefijo}_PRESUPUESTO_{$presupuesto_id}.zip" + : "archivos_presupuesto_{$presupuesto_id}.zip"; + return $this->response - ->download($zipPath, null) // null = usar nombre original del archivo - ->setFileName('archivos_presupuesto_' . $presupuesto_id . '.zip'); + ->download($zipPath, null) + ->setFileName($nombreArchivo); } catch (\Throwable $e) { log_message('error', $e->getMessage()); return $this->response->setStatusCode(500)->setBody('Error interno'); @@ -3708,4 +3717,5 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController } + } diff --git a/ci4/app/Controllers/Produccion/Ordenmaquina.php b/ci4/app/Controllers/Produccion/Ordenmaquina.php deleted file mode 100755 index a92f0ae8..00000000 --- a/ci4/app/Controllers/Produccion/Ordenmaquina.php +++ /dev/null @@ -1,35 +0,0 @@ -base_dir, 'pedidos_files', $rootIdExtern]); } - public function downloadZipPresupuesto(int $presupuesto_id): ?string + public function downloadZipPresupuesto(int $presupuesto_id, ?string $prefijo = null): ?string { $modelPedidoLinea = model(PedidoLineaModel::class); $model = model(PresupuestoFicheroModel::class); @@ -143,8 +143,11 @@ class SafekatFtpClient foreach ($files as $file) { $originalName = $file->nombre ?? basename($file->file_path); - $localFile = $localTempDir . '/' . $originalName; + $prefixedName = $prefijo ? $prefijo . '_' . $originalName : $originalName; + + $localFile = $localTempDir . '/' . $prefixedName; $remoteFile = $remotePath . '/' . basename($file->file_path); + $this->ftp->get($remoteFile, $localFile); } @@ -167,4 +170,5 @@ class SafekatFtpClient } + } diff --git a/ci4/app/Views/themes/vuexy/components/dropzone.php b/ci4/app/Views/themes/vuexy/components/dropzone.php index 4065ca91..3ca591e9 100755 --- a/ci4/app/Views/themes/vuexy/components/dropzone.php +++ b/ci4/app/Views/themes/vuexy/components/dropzone.php @@ -12,7 +12,7 @@ data-bs-parent="#accordionPresupuestoFiles">
-
+
Arrastre aquí los ficheros o haga click diff --git a/ci4/app/Views/themes/vuexy/form/produccion/ot/otFiles.php b/ci4/app/Views/themes/vuexy/form/produccion/ot/otFiles.php index e44420b3..a41d93a0 100755 --- a/ci4/app/Views/themes/vuexy/form/produccion/ot/otFiles.php +++ b/ci4/app/Views/themes/vuexy/form/produccion/ot/otFiles.php @@ -1,5 +1,9 @@
- 'dropzone-ot-files','modelId' => $presupuesto->id]) ?> + 'dropzone-ot-files', + 'modelId' => $presupuesto->id, + 'otId' => $ot->id + ]) ?>
\ No newline at end of file diff --git a/httpdocs/assets/js/safekat/components/forms/fileUploadDropzone.js b/httpdocs/assets/js/safekat/components/forms/fileUploadDropzone.js index 5de39541..c9dc14a6 100644 --- a/httpdocs/assets/js/safekat/components/forms/fileUploadDropzone.js +++ b/httpdocs/assets/js/safekat/components/forms/fileUploadDropzone.js @@ -1,6 +1,6 @@ import Ajax from '../ajax.js'; -import { alertSuccessMessage } from '../alerts/sweetAlert.js' +import { alertSuccessMessage, alertWarningMessage } from '../alerts/sweetAlert.js' const PREVIEW_TEMPLATE = `
@@ -25,7 +25,7 @@ const PREVIEW_TEMPLATE = ` class FileUploadDropzone { - constructor({ domElement, nameId = "presupuesto_id", getUri = null, postUri = null, resourcePath = "presupuestos" }) { + constructor({ domElement, nameId = "presupuesto_id", getUri = null, postUri = null, resourcePath = "presupuestos", otId = null }) { Dropzone.autoDiscover = false; this.domElement = domElement this.jqElement = $(domElement) @@ -35,6 +35,7 @@ class FileUploadDropzone { this.btnDownloadFiles = $(`#${domElement.replace('#', '')}_btnDownloadFiles`); this.dataPost = {} this.nameId = nameId; + this.otId = otId; this.getUri = getUri this.postUri = postUri this.dataPost[nameId] = this.modelId; @@ -160,7 +161,8 @@ class FileUploadDropzone { url: `/presupuestoadmin/download_zip`, type: 'POST', data: { - [this.nameId]: this.modelId + [this.nameId]: this.modelId, + 'ot_id': this.otId }, xhrFields: { responseType: 'blob' @@ -185,7 +187,7 @@ class FileUploadDropzone { window.URL.revokeObjectURL(url); }, error: () => { - alertWarningMessage("Error al descargar el archivo ZIP."); + alertWarningMessage("Error", "Error al descargar el archivo ZIP."); }, complete: () => { $("#loader").modal('hide'); diff --git a/httpdocs/assets/js/safekat/pages/produccion/ot.js b/httpdocs/assets/js/safekat/pages/produccion/ot.js index ef2a16e9..b4909d85 100644 --- a/httpdocs/assets/js/safekat/pages/produccion/ot.js +++ b/httpdocs/assets/js/safekat/pages/produccion/ot.js @@ -10,6 +10,7 @@ class OrdenTrabajo { this.otForm = this.item.find("#ot-edit-form") this.block = document.querySelector('.section-block'); this.modelId = this.item.data("id"); + this.otId = parseInt($("#dropzone-ot-files").data("ot-id")) || null; this.tareasTableItem = this.item.find("#ot-task-table"); this.tareasId = [] this.summaryData = {} @@ -70,6 +71,7 @@ class OrdenTrabajo { this.configUploadDropzone = { domElement: '#dropzone-ot-files', nameId: "presupuesto_id", + otId: this.otId, getUri: '/presupuestos/presupuestocliente/get_files', postUri: '/presupuestos/presupuestocliente/upload_files' } From 2639fe705ec7017053c1e41721f810453773a5a8 Mon Sep 17 00:00:00 2001 From: Ignacio Martinez Navajas Date: Fri, 18 Jul 2025 10:54:56 +0200 Subject: [PATCH 2/2] =?UTF-8?q?A=C3=B1adida=20fucionalidad=20de=20tener=20?= =?UTF-8?q?por=20defecto=20el=20detalle=20de=20costes=20cerrados?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/_resumenPresupuestoItems.php | 195 ++++++++++-------- log.json | Bin 0 -> 45676 bytes 2 files changed, 107 insertions(+), 88 deletions(-) create mode 100644 log.json diff --git a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_resumenPresupuestoItems.php b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_resumenPresupuestoItems.php index 7aae8cc5..56e2f9ec 100755 --- a/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_resumenPresupuestoItems.php +++ b/ci4/app/Views/themes/vuexy/form/presupuestos/admin/_resumenPresupuestoItems.php @@ -13,92 +13,110 @@
- -
-
Coste papel
-
-
Margen papel
-
-
+
+
Costes detallados
+ +
-
- - Coste impresión -
-
- -
Coste clicks
-
- -
+
+ +
+
Coste papel
+
+
Margen papel
+
+
-
Coste horas
-
- -
+
+ + Coste impresión +
+
+ +
Coste clicks
+
+ +
-
Coste tinta
-
- -
+
Coste horas
+
+ +
-
Coste corte
-
- -
-
- - Margen impresión -
-
-
- -
Margen clicks
-
- -
+
Coste tinta
+
+ +
-
Margen horas
-
- -
+
Coste corte
+
+ +
+
+ + Margen impresión +
+
+
+ +
Margen clicks
+
+ +
-
Margen tinta
-
- -
+
Margen horas
+
+ +
-
Margen corte
-
- -
+
Margen tinta
+
+ +
+ +
Margen corte
+
+ +
+ +
Coste servicios
+
+
Margen servicios
+
+
+ +
Coste de envío
+
+
Margen envío
+
+
+ +
-
Coste servicios
-
-
Margen servicios
-
-
-
Coste de envío
-
-
Margen envío
-
-

@@ -111,7 +129,7 @@ class="autonumeric-resumen-percent">
-
Total envío base
+
Total envío base
@@ -168,7 +186,8 @@
- estado_id == 2): ?> -
-
- - > -
-
- +
+
+ + > +
+
+

diff --git a/log.json b/log.json new file mode 100644 index 0000000000000000000000000000000000000000..2d094a5de49b8999933db521e8a3433002a2b70f GIT binary patch literal 45676 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 cO2yyDS6}_N>wvT~{_tnrE8IPL(^b literal 0 HcmV?d00001