From 438000ebad7ee46c2e651939fbae44e1e0dea303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaime=20Jim=C3=A9nez?= Date: Mon, 19 May 2025 18:41:48 +0200 Subject: [PATCH] hecho lo de proximos envios --- ci4/app/Config/Routes.php | 2 + .../Logistica/LogisticaController.php | 58 ++- ci4/app/Language/es/Logistica.php | 1 + .../Models/OrdenTrabajo/OrdenTrabajoModel.php | 21 + ci4/app/Services/LogisticaService.php | 73 +++ .../form/logistica/viewEnvioEditForm.php | 473 +++++++++--------- .../js/safekat/pages/logistica/envioEdit.js | 47 +- 7 files changed, 423 insertions(+), 252 deletions(-) diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 4e1c1a81..f94097e3 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -765,6 +765,7 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func $routes->get('tareas/datatable/(:num)', 'Ordentrabajo::tareas_datatable/$1', ['as' => 'datatableTareasOrdenTrabajo']); $routes->get('maquinas/ots/datatable/(:num)','Ordentrabajo::datatable_maquina_ordenes_trabajo/$1'); $routes->get('maquinas/ots/(:num)','Ordentrabajo::get_maquina_ots/$1'); + /**====================== * UPDATES *========================**/ @@ -872,6 +873,7 @@ $routes->group('logistica', ['namespace' => 'App\Controllers\Logistica'], functi $routes->get('selectDireccionForEnvio', 'LogisticaController::selectDireccionForEnvio'); $routes->post('imprimirEtiquetas', 'LogisticaController::imprimirEtiquetas'); $routes->post('ficharEmbalaje', 'LogisticaController::ficharEmbalaje'); + $routes->get('datatableProximosEnvios/(:num)', 'LogisticaController::datatable_proximosEnvios/$1'); $routes->get('listAlbaranes', 'LogisticaController::listAlbaranes', ['as' => 'albaranesList']); }); diff --git a/ci4/app/Controllers/Logistica/LogisticaController.php b/ci4/app/Controllers/Logistica/LogisticaController.php index 4ffd0733..23c4d3de 100755 --- a/ci4/app/Controllers/Logistica/LogisticaController.php +++ b/ci4/app/Controllers/Logistica/LogisticaController.php @@ -98,7 +98,8 @@ class LogisticaController extends BaseController return view(static::$viewPath . 'viewImpresionEtiquetas', $viewData); } - public function listAlbaranes(){ + public function listAlbaranes() + { $viewData = [ 'currentModule' => static::$controllerSlug, 'boxTitle' => lang('Albaran.albaranes'), @@ -117,7 +118,7 @@ class LogisticaController extends BaseController $tipo_envio = $this->request->getGet('tipo_envio') ?? 'estandar'; - if($tipo_envio == 'ferro_prototipo'){ + if ($tipo_envio == 'ferro_prototipo') { $query = LogisticaService::findForNewEnvioFerro(); } else { $query = LogisticaService::findForNewEnvio(); @@ -140,16 +141,17 @@ class LogisticaController extends BaseController } } - public function selectDireccionForEnvio(){ + public function selectDireccionForEnvio() + { if ($this->request->isAJAX()) { $ot = $this->request->getGet('ot_id'); - if($ot == null || $ot == 0){ + if ($ot == null || $ot == 0) { return []; } $searchVal = $this->request->getGet("q") ?? ""; $result = LogisticaService::findDireccionesNewEnvio($ot, $searchVal); - + return $this->response->setJSON($result); } else { return $this->failUnauthorized('Invalid request', 403); @@ -187,12 +189,12 @@ class LogisticaController extends BaseController public function imprimirEtiquetas() { if ($this->request->isAJAX()) { - $envio_id = $this->request->getPost('envio_id'); + $envio_id = $this->request->getPost('envio_id'); $ids = $this->request->getPost('envio_lineas'); $cajas = $this->request->getPost('cajas'); $printer_id = $this->request->getPost('printer_id'); - if($cajas == null || $cajas == 0){ + if ($cajas == null || $cajas == 0) { return $this->response->setJSON([ 'status' => false, 'message' => 'Cajas no válidas' @@ -204,7 +206,7 @@ class LogisticaController extends BaseController ->join('clientes', 'clientes.id = envios.cliente_id', 'left') ->where('envios.id', $envio_id) ->first(); - if($envio == null){ + if ($envio == null) { return $this->response->setJSON([ 'status' => false, 'message' => 'Envio no válido' @@ -215,7 +217,7 @@ class LogisticaController extends BaseController $lineas = $model->select('envios_lineas.*, presupuestos.titulo as titulo, presupuestos.referencia_cliente as referencia_cliente') ->join('presupuestos', 'presupuestos.id = envios_lineas.presupuesto_id', 'left') ->whereIn('envios_lineas.id', $ids)->findAll(); - if($lineas == null){ + if ($lineas == null) { return $this->response->setJSON([ 'status' => false, 'message' => 'Lineas no válidas' @@ -228,7 +230,7 @@ class LogisticaController extends BaseController ->where('id', $printer_id) ->orderBy('name', 'asc') ->first(); - if($impresora == null){ + if ($impresora == null) { return $this->response->setJSON([ 'status' => false, 'message' => 'Impresora no válida' @@ -332,14 +334,14 @@ class LogisticaController extends BaseController if (empty($envioEntity)) { return redirect()->to(base_url('logistica/selectEnvios/simple'))->with('error', lang('Logistica.errors.noEnvio')); } - + $modelProveedor = model('App\Models\Compras\ProveedorModel'); $proveedor = $modelProveedor->select('id, nombre') ->where('deleted_at', null) ->where('id', $envioEntity->proveedor_id) ->orderBy('nombre', 'asc') ->first(); - if(!empty($proveedor)){ + if (!empty($proveedor)) { $envioEntity->proveedor_nombre = $proveedor->nombre; } @@ -386,7 +388,7 @@ class LogisticaController extends BaseController $id = $this->request->getPost('id') ?? null; $finalizar_ots = $this->request->getPost('finalizar_ots') ?? false; - + $result = LogisticaService::finalizarEnvio($id, $finalizar_ots); return $this->response->setJSON($result); } else { @@ -439,17 +441,35 @@ class LogisticaController extends BaseController )->edit( "unidadesEnvio", function ($row, $meta) { - if($row->finalizado == 1 || $row->tipo_envio == 'ferro_prototipo'){ + if ($row->finalizado == 1 || $row->tipo_envio == 'ferro_prototipo') { return $row->unidadesEnvio; } return ''; + data-id="' . $row->id . '" data-name="unidades_envio" value="' . $row->unidadesEnvio . '">'; } ); return $result->toJson(returnAsObject: true); } + public function datatable_proximosEnvios($envio_id = null) + { + $q = LogisticaService::findNextEnvios($envio_id); + + $result = DataTable::of($q) + ->edit( + "ot", + function ($row, $meta) { + return '' . $row->ot . ''; + } + ); + + $result = $result->toJson(returnAsObject: true); + $query = model('App\Models\Logistica\EnvioModel')->db->getLastQuery(); + return $result; + + } + public function setCajaLinea() { @@ -490,7 +510,7 @@ class LogisticaController extends BaseController $fieldName = $this->request->getPost('name'); $fieldValue = $this->request->getPost('value'); - if (!$id || !$fieldName || ($fieldName=='unidades_envio' && !$fieldValue)) { + if (!$id || !$fieldName || ($fieldName == 'unidades_envio' && !$fieldValue)) { return $this->response->setJSON([ 'status' => false, 'message' => 'Datos inválidos' @@ -499,7 +519,7 @@ class LogisticaController extends BaseController $model = model('App\Models\Logistica\EnvioLineaModel'); $updated = $model->update($id, [ - "" . $fieldName => $fieldValue==""? null: $fieldValue, + "" . $fieldName => $fieldValue == "" ? null : $fieldValue, ]); return $this->response->setJSON([ @@ -522,7 +542,7 @@ class LogisticaController extends BaseController $model = model('App\Models\Logistica\EnvioModel'); $updated = $model->update($id, [ - "codigo_seguimiento" => $fieldValue==""? null: $fieldValue, + "codigo_seguimiento" => $fieldValue == "" ? null : $fieldValue, ]); return $this->response->setJSON([ @@ -545,7 +565,7 @@ class LogisticaController extends BaseController $model = model('App\Models\Logistica\EnvioModel'); $updated = $model->update($id, [ - "proveedor_id" => $fieldValue==""? null: $fieldValue, + "proveedor_id" => $fieldValue == "" ? null : $fieldValue, ]); return $this->response->setJSON([ diff --git a/ci4/app/Language/es/Logistica.php b/ci4/app/Language/es/Logistica.php index be9a91d8..4213a476 100755 --- a/ci4/app/Language/es/Logistica.php +++ b/ci4/app/Language/es/Logistica.php @@ -60,6 +60,7 @@ return [ 'selectAll' => 'Seleccionar todo', 'peso' => 'Peso (kg): ', 'unidadesTotalesFooter' => 'Unidades:', + 'fechaEncuadernado' => 'Fecha encuadernado', 'codigoSeguimiento' => 'Código de seguimiento', 'empresaMensajería' => 'Empresa de mensajería', diff --git a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php index e28a7e1b..5c81a5ab 100755 --- a/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php +++ b/ci4/app/Models/OrdenTrabajo/OrdenTrabajoModel.php @@ -143,4 +143,25 @@ class OrdenTrabajoModel extends Model ->groupBy('orden_trabajo_tareas.id'); return $query; } + + public function queryProximosEnvios() + { + $query = $this->builder() + ->select([ + 'ordenes_trabajo.id as ot', + 'orden_trabajo_dates.encuadernacion_at as fechaEncuadernado', + ]) + ->join('pedidos', 'pedidos.id = ordenes_trabajo.pedido_id', 'left') + ->join('pedidos_linea', 'pedidos.id = pedidos_linea.pedido_id', 'left') + ->join('presupuestos', 'presupuestos.id = pedidos_linea.presupuesto_id', 'left') + ->join('presupuesto_direcciones', 'presupuestos.id = presupuesto_direcciones.presupuesto_id', 'left') + ->join('orden_trabajo_dates', 'orden_trabajo_dates.orden_trabajo_id = ordenes_trabajo.id', 'left') + ->where('ordenes_trabajo.deleted_at', null) + ->where('orden_trabajo_dates.encuadernacion_at !=', null) + + //->where('orden_trabajo_dates.fecha_encuadernado_at >=', 0) + //->where('ordenes_trabajo.fecha_entrega_warning >=', date("Y-m-d H:i:s")) + ->groupBy('ordenes_trabajo.id'); + return $query; + } } diff --git a/ci4/app/Services/LogisticaService.php b/ci4/app/Services/LogisticaService.php index 6d5f91b9..5e2fe8e1 100644 --- a/ci4/app/Services/LogisticaService.php +++ b/ci4/app/Services/LogisticaService.php @@ -79,6 +79,79 @@ class LogisticaService return $builder; } + public static function findNextEnvios(int $envio_id) + { + $db = \Config\Database::connect(); + + // 1. Dirección del envío actual + $envio = $db->table('envios')->select('direccion')->where('id', $envio_id)->get()->getRow(); + if (!$envio) { + return $db->table('(SELECT NULL AS id, NULL AS name) AS empty')->where('1 = 0'); + } + + $direccionNormalizada = str_replace(' ', '', strtolower(trim($envio->direccion))); + $direccionSQL = $db->escape($direccionNormalizada); + + // 2. Obtener presupuestos con esa dirección + $presupuestosConEsaDireccion = $db->table('presupuesto_direcciones') + ->select('presupuesto_id') + ->where("REPLACE(LOWER(TRIM(direccion)), ' ', '') = $direccionSQL", null, false) + ->get() + ->getResultArray(); + + $presupuestoIds = array_column($presupuestosConEsaDireccion, 'presupuesto_id'); + if (empty($presupuestoIds)) { + return $db->table('(SELECT NULL AS id, NULL AS name) AS empty')->where('1 = 0'); + } + + $hoy = date('Y-m-d'); + $sieteDiasDespues = date('Y-m-d', strtotime('+7 days')); + + // 3. Subconsulta principal + $subBuilder = $db->table('pedidos_linea pl') + ->select(" + ot.id AS ot, + DATE(p.fecha_encuadernado) as fechaEncuadernado, + ( + SELECT IFNULL(SUM(el.unidades_envio), 0) + FROM envios_lineas el + JOIN envios e ON e.id = el.envio_id + WHERE el.pedido_id = p.id + AND el.presupuesto_id = pr.id + AND REPLACE(LOWER(TRIM(e.direccion)), ' ', '') = $direccionSQL + AND (e.finalizado = 1 OR e.id = $envio_id) + ) AS unidades_enviadas, + pd.cantidad AS cantidad + ") + ->join('pedidos p', 'p.id = pl.pedido_id') + ->join('presupuestos pr', 'pr.id = pl.presupuesto_id') + ->join('presupuesto_direcciones pd', 'pd.presupuesto_id = pr.id') + ->join('ordenes_trabajo ot', 'ot.pedido_id = p.id') + ->join('orden_trabajo_dates ot_dates', 'ot_dates.orden_trabajo_id = ot.id') + ->whereIn('pr.id', $presupuestoIds) + ->whereIn('p.estado', ['finalizado', 'produccion']) + ->where('p.fecha_encuadernado IS NOT NULL') + ->where('DATE(p.fecha_encuadernado) >=', $hoy) + ->where('DATE(p.fecha_encuadernado) <=', $sieteDiasDespues) + ->where("NOT EXISTS ( + SELECT 1 + FROM envios_lineas el + WHERE el.envio_id = $envio_id + AND el.pedido_id = p.id + AND el.presupuesto_id = pr.id + GROUP BY el.pedido_id, el.presupuesto_id + HAVING SUM(el.unidades_envio) >= pd.cantidad + )", null, false) + ->groupBy('pl.id'); + + // 4. Envolver y filtrar por unidades pendientes + $builder = $db->table("({$subBuilder->getCompiledSelect(false)}) AS sub"); + $builder->select('ot, fechaEncuadernado'); + $builder->where('cantidad > unidades_enviadas'); + + return $builder; + } + public static function findForNewEnvio() { diff --git a/ci4/app/Views/themes/vuexy/form/logistica/viewEnvioEditForm.php b/ci4/app/Views/themes/vuexy/form/logistica/viewEnvioEditForm.php index 27eecf8c..c90fe1e5 100644 --- a/ci4/app/Views/themes/vuexy/form/logistica/viewEnvioEditForm.php +++ b/ci4/app/Views/themes/vuexy/form/logistica/viewEnvioEditForm.php @@ -130,7 +130,7 @@
- +
-
- - +
-
-
-

- -

+
+

+ +

+
+
+ + + + + + + + + + +
+ +
+ +
-
-
-
-

-
-
-
- -
- finalizado == 0 && $envioEntity->tipo_envio == 'estandar'): ?> -
-
- -
- -
-
- -
-
- -
- -
-
- - -
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
-
- - -
-
-
- - -
-
- -
- -
+
-
+ -
- -
-

- -

- -
-
- - -
- -
-
-

- +

-
-
- - finalizado == 0) ? '' : 'readonly' ?> - value="codigo_seguimiento)) ?>"> -
-
- - finalizado == 0): ?> - - - - -
- finalizado == 0): ?> -
- +
+
+
+

- tipo_envio == 'estandar'): ?> -
-
- - + finalizado == 0 && $envioEntity->tipo_envio == 'estandar'): ?> +
+ +
+ +
+ +
+
+ +
+
+ +
+ +
+
+ + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + +
+
+
+ + +
+
+ +
+ + + +
+
+
-
+
+ +
+

+ +

+ +
+
+ + +
+ +
+
+
+ +
+
+

+ +

+ +
+
+ + finalizado == 0) ? '' : 'readonly' ?> + value="codigo_seguimiento)) ?>"> +
+
+ + finalizado == 0): ?> + + + + +
+ finalizado == 0): ?> +
+ +
+ tipo_envio == 'estandar'): ?> +
+ +
+ + +
+
+
+ +
- - endSection() ?> + endSection() ?> - section('css') ?> - - - - "> - " /> + section('css') ?> + + + + "> + " /> - endSection() ?> + endSection() ?> - section('additionalExternalJs') ?> - - - - - endSection() ?> \ No newline at end of file + section('additionalExternalJs') ?> + + + + + endSection() ?> \ No newline at end of file diff --git a/httpdocs/assets/js/safekat/pages/logistica/envioEdit.js b/httpdocs/assets/js/safekat/pages/logistica/envioEdit.js index 63c6c3e3..71c300f9 100644 --- a/httpdocs/assets/js/safekat/pages/logistica/envioEdit.js +++ b/httpdocs/assets/js/safekat/pages/logistica/envioEdit.js @@ -20,6 +20,7 @@ class EnvioEdit { ]; this.table = null; + this.tableProximosEnvios = null; this.buscarPedidos = new ClassSelect($("#buscadorPedidos"), '/logistica/selectAddLinea', "", true, { 'envio': $("#id").val() }); @@ -43,12 +44,6 @@ class EnvioEdit { this.proveedor.init(); } - if ($("#proximosEnvios").length) { - new PerfectScrollbar(document.getElementById('proximosEnvios'), { - wheelPropagation: false - }); - } - this.table = $('#tableLineasEnvio').DataTable({ processing: true, serverSide: true, @@ -101,6 +96,46 @@ class EnvioEdit { ] }); + this.tableProximosEnvios = $('#tableProximosEnvios').DataTable({ + processing: true, + serverSide: true, + autoWidth: true, + responsive: true, + scrollX: true, + orderCellsTop: true, + orderable: false, + order: [[1, 'asc']], + lengthMenu: [5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500], + pageLength: 5, + "dom": 'tp', + "ajax": { + "url": "/logistica/datatableProximosEnvios/" + $('#id').val(), + }, + "columns": [ + {data: 'ot'}, + {data: 'fechaEncuadernado'} + ], + "language": { + url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" + }, + "columnDefs": [ + { + "targets": [0, 1], + "className": "text-center", + }, + ], + drawCallback: function(){ + $(this.api().table().container()).find('table').css('width', '100%'); + this.api().columns.adjust(); + } + }); + + $('#proximosEnviosTip' + this.id).on('shown.bs.collapse', () => { + if (this.tableProximosEnvios) { + this.tableProximosEnvios.columns.adjust().draw(false); + } + }); + $('#btnImprimirEtiquetas').on('click', () => { const table = this.table; const selectedRows = table.rows({ page: 'current' }).nodes().filter((node) => {