diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 8654e8e5..41ab4a1d 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -821,6 +821,7 @@ $routes->group('logistica', ['namespace' => 'App\Controllers\Logistica'], functi $routes->post('updateProveedorEnvio', 'LogisticaController::updateProveedorEnvio'); $routes->post('finalizarEnvio', 'LogisticaController::finalizarEnvio'); $routes->post('generateEnvio', 'LogisticaController::generarEnvio'); + $routes->post('generateEnvioFerro', 'LogisticaController::generarEnvioFerro'); $routes->get('selectForNewEnvio', 'LogisticaController::findForNewEnvio'); $routes->get('selectDireccionForEnvio', 'LogisticaController::selectDireccionForEnvio'); $routes->post('imprimirEtiquetas', 'LogisticaController::imprimirEtiquetas'); diff --git a/ci4/app/Controllers/Logistica/LogisticaController.php b/ci4/app/Controllers/Logistica/LogisticaController.php index 2bd6160a..3dc24a88 100755 --- a/ci4/app/Controllers/Logistica/LogisticaController.php +++ b/ci4/app/Controllers/Logistica/LogisticaController.php @@ -101,7 +101,14 @@ class LogisticaController extends BaseController { if ($this->request->isAJAX()) { - $query = LogisticaService::findForNewEnvio(); + + $tipo_envio = $this->request->getGet('tipo_envio') ?? 'estandar'; + + if($tipo_envio == 'ferro_prototipo'){ + $query = LogisticaService::findForNewEnvioFerro(); + } else { + $query = LogisticaService::findForNewEnvio(); + } if ($this->request->getGet("q")) { $query->groupStart() ->orLike("id", $this->request->getGet("q")) @@ -121,12 +128,12 @@ class LogisticaController extends BaseController public function selectDireccionForEnvio(){ if ($this->request->isAJAX()) { - $pedido_id = $this->request->getGet('pedido_id'); - if($pedido_id == null || $pedido_id == 0){ + $ot = $this->request->getGet('ot_id'); + if($ot == null || $ot == 0){ return []; } $searchVal = $this->request->getGet("q") ?? ""; - $result = LogisticaService::findDireccionesNewEnvio($pedido_id, $searchVal); + $result = LogisticaService::findDireccionesNewEnvio($ot, $searchVal); return $this->response->setJSON($result); } else { @@ -140,9 +147,22 @@ class LogisticaController extends BaseController { if ($this->request->isAJAX()) { - $pedido_id = $this->request->getPost('pedido_id'); - $direccion = $this->request->getPost('direccion'); - $result = LogisticaService::generateEnvio($pedido_id, $direccion); + $ot_id = $this->request->getPost('ot_id'); + $direccion = $this->request->getPost('direccion') ?? ""; + $result = LogisticaService::generateEnvio($ot_id, $direccion); + return $this->response->setJSON($result); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + + public function generarEnvioFerro() + { + if ($this->request->isAJAX()) { + + $ot_id = $this->request->getPost('ot_id'); + $result = LogisticaService::generateEnvioFerro($ot_id); return $this->response->setJSON($result); } else { return $this->failUnauthorized('Invalid request', 403); @@ -387,7 +407,7 @@ class LogisticaController extends BaseController )->edit( "unidadesEnvio", function ($row, $meta) { - if($row->finalizado == 1){ + if($row->finalizado == 1 || $row->tipo_envio == 'ferro_prototipo'){ return $row->unidadesEnvio; } return 'select( "t1.id, t1.pedido_id as pedido, t3.id as presupuesto, t3.titulo as titulo, t1.unidades_envio as unidadesEnvio, t1.unidades_envio as unidadesEnvioRaw, - t1.unidades_total as unidadesTotal, + t1.unidades_total as unidadesTotal, t2.tipo_envio as tipo_envio, IFNULL(( SELECT SUM(t_sub.unidades_envio) FROM envios_lineas t_sub diff --git a/ci4/app/Services/LogisticaService.php b/ci4/app/Services/LogisticaService.php index dcbcc527..d2251313 100644 --- a/ci4/app/Services/LogisticaService.php +++ b/ci4/app/Services/LogisticaService.php @@ -94,6 +94,7 @@ class LogisticaService WHERE el.pedido_id = p.id AND el.presupuesto_id = pr.id AND e.finalizado = 1 + AND e.tipo_envio = 'estandar' ) AS unidades_enviadas, pd.cantidad AS cantidad ") @@ -115,7 +116,47 @@ class LogisticaService return $builder; } - public static function findDireccionesNewEnvio($pedido_id, $searchVal = "") + public static function findForNewEnvioFerro() + { + $db = \Config\Database::connect(); + + // 3. Subconsulta principal + $subBuilder = $db->table('pedidos_linea pl') + ->select(" + ot.id AS id, + CONCAT('[', ot.id, '] - ', pr.titulo) AS name, + p.id as pedido_id, + pr.id as presupuesto_id + ") + ->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('p.estado', ['finalizado', 'produccion']) + ->where('ot_dates.pendiente_ferro_at IS NOT NULL') + ->where('pd.is_ferro_prototipo', 1) + ->groupBy('pl.id'); + + // 4. Envolver y filtrar por unidades pendientes + $builder = $db->table("({$subBuilder->getCompiledSelect(false)}) AS sub"); + $builder->select('id, name'); + $builder->orderBy('name', 'ASC'); + + $builder->where(" + NOT EXISTS ( + SELECT 1 + FROM envios e + INNER JOIN envios_lineas le ON le.envio_id = e.id + WHERE e.tipo_envio = 'ferro_prototipo' + AND (le.pedido_id = sub.pedido_id OR le.presupuesto_id = sub.presupuesto_id) + ) + ", null, false); + + return $builder; + } + + public static function findDireccionesNewEnvio($ot_id, $searchVal = "") { $direcciones = []; @@ -126,7 +167,8 @@ class LogisticaService ->join('presupuestos pr', 'pr.id=presupuesto_direcciones.presupuesto_id') ->join('pedidos_linea pl', 'pl.presupuesto_id = pr.id') ->join('pedidos p', 'pl.pedido_id=p.id') - ->where('p.id', $pedido_id) + ->join('ordenes_trabajo ot', 'ot.pedido_id = p.id') + ->where('ot.id', $ot_id) ->where("presupuesto_direcciones.is_ferro_prototipo", 0); if ($searchVal != "") { $dirs = $dirs->groupStart() @@ -139,10 +181,13 @@ class LogisticaService $unidades_en_direccion = $modelEnvioLineasModel->select('SUM(envios_lineas.unidades_envio) as unidades_enviadas, envios_lineas.unidades_total') ->join('envios', 'envios.id = envios_lineas.envio_id') - ->where('pedido_id', $pedido_id) + ->join('pedidos_linea', 'pedidos_linea.pedido_id = envios_lineas.pedido_id') + ->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id') + ->join('ordenes_trabajo', 'ordenes_trabajo.pedido_id = pedidos.id') + ->where('ordenes_trabajo.id', $ot_id) ->where('envios.direccion', $direccion->direccion) ->where('envios.finalizado', 1) - ->groupBy('pedido_id')->get()->getResult(); + ->groupBy('ordenes_trabajo.pedido_id')->get()->getResult(); if (count($unidades_en_direccion) == 0 || $unidades_en_direccion[0]->unidades_enviadas < $unidades_en_direccion[0]->unidades_total) { array_push( $direcciones, @@ -244,7 +289,7 @@ class LogisticaService - public static function generateEnvio($pedido_id, $direccion = null) + public static function generateEnvio($ot_id, $direccion = null) { $presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel'); $direccionNormalizada = strtolower(trim($direccion)); @@ -261,6 +306,7 @@ class LogisticaService presupuesto_direcciones.pais_id, presupuesto_direcciones.cantidad as cantidad_total, presupuestos.cliente_id as cliente_id, + ordenes_trabajo.pedido_id as pedido_id, ( presupuesto_direcciones.cantidad - IFNULL(( @@ -277,7 +323,8 @@ class LogisticaService ->join('pedidos_linea', 'pedidos_linea.presupuesto_id = presupuesto_direcciones.presupuesto_id') ->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id') ->join('presupuestos', 'pedidos_linea.presupuesto_id = presupuestos.id') - ->where('pedidos.id', $pedido_id) + ->join('ordenes_trabajo', 'ordenes_trabajo.pedido_id = pedidos.id') + ->where('ordenes_trabajo.id', $ot_id) ->where('presupuesto_direcciones.is_ferro_prototipo', 0) ->like('presupuesto_direcciones.direccion', $direccion) ->groupBy('presupuesto_direcciones.id') @@ -314,7 +361,7 @@ class LogisticaService $EnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel'); $EnvioLineasModel->save([ 'envio_id' => $idEnvio, - 'pedido_id' => $pedido_id, + 'pedido_id' => $datosEnvio->pedido_id, 'unidades_envio' => $datosEnvio->cantidad, 'unidades_total' => $datosEnvio->cantidad_total, 'cajas' => 1, @@ -335,6 +382,96 @@ class LogisticaService } + public static function generateEnvioFerro($ot_id) + { + $presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel'); + + $datosEnvio = $presupuestoDireccionesModel + ->select(" + presupuestos.id as presupuesto_id, + presupuesto_direcciones.att, + presupuesto_direcciones.direccion, + presupuesto_direcciones.provincia as ciudad, + presupuesto_direcciones.cp, + presupuesto_direcciones.telefono, + presupuesto_direcciones.email, + presupuesto_direcciones.pais_id, + presupuesto_direcciones.cantidad as cantidad_total, + presupuestos.cliente_id as cliente_id, + ordenes_trabajo.pedido_id as pedido_id, + ") + ->join('pedidos_linea', 'pedidos_linea.presupuesto_id = presupuesto_direcciones.presupuesto_id') + ->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id') + ->join('presupuestos', 'pedidos_linea.presupuesto_id = presupuestos.id') + ->join('ordenes_trabajo', 'ordenes_trabajo.pedido_id = pedidos.id') + ->where('ordenes_trabajo.id', $ot_id) + ->where('presupuesto_direcciones.is_ferro_prototipo', 1) + ->where(" + NOT EXISTS ( + SELECT 1 + FROM envios e + INNER JOIN envios_lineas el ON el.envio_id = e.id + WHERE e.tipo_envio = 'ferro_prototipo' + AND (el.pedido_id = pedidos.id OR el.presupuesto_id = presupuestos.id) + ) + ", null, false) // <= Esta es la parte nueva, importante + ->groupBy('presupuesto_direcciones.id') + ->first(); + + // Validación si no hay datos o no quedan unidades + if (empty($datosEnvio)) { + return [ + 'status' => false, + 'message' => lang('Logistica.errors.noAddresses') + ]; + } + + // Crear envío + $EnvioModel = model('App\Models\Logistica\EnvioModel'); + $EnvioModel->set([ + 'cliente_id' => $datosEnvio->cliente_id, + 'att' => $datosEnvio->att, + 'direccion' => $datosEnvio->direccion, + 'ciudad' => $datosEnvio->ciudad, + 'cp' => $datosEnvio->cp, + 'telefono' => $datosEnvio->telefono, + 'email' => $datosEnvio->email, + 'pais_id' => $datosEnvio->pais_id, + 'cantidad' => 1, + 'cajas' => 1, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + 'tipo_envio' => 'ferro_prototipo', + ]); + $EnvioModel->insert(); + $idEnvio = $EnvioModel->insertID(); + + // Crear línea de envío + $EnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel'); + $EnvioLineasModel->save([ + 'envio_id' => $idEnvio, + 'pedido_id' => $datosEnvio->pedido_id, + 'unidades_envio' => 1, + 'unidades_total' => 1, + 'cajas' => 1, + 'unidades_cajas' => 1, + 'created_at' => date('Y-m-d H:i:s'), + 'updated_at' => date('Y-m-d H:i:s'), + 'created_by' => auth()->user()->id, + 'updated_by' => auth()->user()->id, + 'presupuesto_id' => (int) $datosEnvio->presupuesto_id + ]); + + return [ + 'status' => true, + 'data' => [ + 'id_envio' => $idEnvio, + ], + ]; + } + + + public static function finalizarEnvio($envio_id, $finalizar_ot = false) { // hay que comprobar que para todas las lineas de envio de este envio @@ -386,24 +523,36 @@ class LogisticaService $cantidad_enviada = $cantidad_enviada[0]->unidades_enviadas; } - if ($cantidad_enviada + $linea->unidades_envio == $pedido->total_tirada) { + if ($envio->tipo_envio == 'ferro_prototipo') { $otModel = model('App\Models\OrdenTrabajo\OrdenTrabajoModel'); $ot = $otModel->where('pedido_id', $linea->pedido_id) ->first(); $ps = (new ProductionService())->init($ot->id); $ps->updateOrdenTrabajoDate([ - "name" => "envio_at", - "envio_at" => date('Y-m-d H:i:s') + "name" => "ferro_en_cliente_at", + "ferro_en_cliente_at" => date('Y-m-d H:i:s') ]); - if ($finalizar_ot) { - $ps->updateOrdenTrabajo( - [ - "estado" => 'F' - ] - ); - array_push($ots, $ot->id); + } else { + if ($cantidad_enviada + $linea->unidades_envio == $pedido->total_tirada) { + $otModel = model('App\Models\OrdenTrabajo\OrdenTrabajoModel'); + $ot = $otModel->where('pedido_id', $linea->pedido_id) + ->first(); + $ps = (new ProductionService())->init($ot->id); + $ps->updateOrdenTrabajoDate([ + "name" => "envio_at", + "envio_at" => date('Y-m-d H:i:s') + ]); + if ($finalizar_ot) { + $ps->updateOrdenTrabajo( + [ + "estado" => 'F' + ] + ); + array_push($ots, $ot->id); + } } } + } $EnvioModel->update($envio_id, ['finalizado' => 1]); @@ -427,19 +576,19 @@ class LogisticaService $data = [ "printer" => $printer->name, "header" => [ - "_FORMAT" => "E:PEDIDO.ZPL", - "_QUANTITY" => 1, - "_PRINBTERNAME" => $printer->name, - "_JOBNAME" => "LBL101" - ], + "_FORMAT" => "E:PEDIDO.ZPL", + "_QUANTITY" => 1, + "_PRINBTERNAME" => $printer->name, + "_JOBNAME" => "LBL101" + ], ]; foreach ($lineas as $linea) { $data["labels"][] = [ "cliente" => $envio->cliente, - "titulo" => "[" . $linea->pedido_id . "] - " . $linea->titulo, + "titulo" => "[" . $linea->pedido_id . "] - " . $linea->titulo, "cantidad" => $linea->unidades_envio, - "tirada" => $linea->unidades_total, + "tirada" => $linea->unidades_total, "cajas" => $cajas, "ean" => null, "nombre" => $envio->att, @@ -452,15 +601,15 @@ class LogisticaService $servicioImpresora = new ImpresoraEtiquetaService(); $xml = $servicioImpresora->createEtiqueta($data); - if($xml == null){ + if ($xml == null) { return [ 'status' => false, 'message' => lang('Logistica.errors.noEtiquetas'), ]; } $sk_environment = getenv('SK_ENVIRONMENT'); - if($sk_environment == 'production'){ - + if ($sk_environment == 'production') { + $status = $servicioImpresora->sendToImpresoraEtiqueta("ETIQUETA", $xml, $printer); if ($status) { return [ @@ -475,7 +624,7 @@ class LogisticaService ]; } - }else{ + } else { return [ 'status' => true, 'message' => lang('Logistica.success.imprimirEtiquetas'), diff --git a/ci4/app/Views/themes/vuexy/form/logistica/viewEnvioEditForm.php b/ci4/app/Views/themes/vuexy/form/logistica/viewEnvioEditForm.php index 28450c06..7c63bd17 100644 --- a/ci4/app/Views/themes/vuexy/form/logistica/viewEnvioEditForm.php +++ b/ci4/app/Views/themes/vuexy/form/logistica/viewEnvioEditForm.php @@ -10,6 +10,7 @@

+ tipo_envio == 'ferro_prototipo') ? 'FERRO':'' ?> finalizado == 0) ? '' : 'FINALIZADO' ?>

@@ -113,7 +114,7 @@
- finalizado == 0): ?> + finalizado == 0 && $envioEntity->tipo_envio=='estandar'): ?>

@@ -171,7 +172,7 @@

- finalizado == 0): ?> + finalizado == 0 && $envioEntity->tipo_envio=='estandar'): ?>
+ tipo_envio=='estandar'): ?>
+
diff --git a/httpdocs/assets/js/safekat/pages/logistica/envio.js b/httpdocs/assets/js/safekat/pages/logistica/envio.js index 80b3f695..73adb436 100644 --- a/httpdocs/assets/js/safekat/pages/logistica/envio.js +++ b/httpdocs/assets/js/safekat/pages/logistica/envio.js @@ -4,11 +4,14 @@ import ClassSelect from '../../components/select2.js'; $(() => { let otsFilter = ''; + const tipo_envio = $('#tipo_envio').val(); - const selectPedidos = new ClassSelect($('#buscadorPedidos'), '/logistica/selectForNewEnvio', ""); + const selectPedidos = new ClassSelect($('#buscadorPedidos'), '/logistica/selectForNewEnvio', "", true, { + tipo_envio: () => $('#tipo_envio').val() + }); selectPedidos.init(); const selectDirecciones = new ClassSelect($('#selectDirecciones'), '/logistica/selectDireccionForEnvio', "", true, { - pedido_id: () => selectPedidos.getVal() + ot_id: () => selectPedidos.getVal() }); selectDirecciones.init(); @@ -19,7 +22,10 @@ $(() => { }) selectPedidos.item.on('change', () => { selectDirecciones.empty(); - $('.select-direcciones').removeClass('d-none'); + if(tipo_envio == 'ferro_prototipo') + $('.add-envio').removeClass('d-none'); + else + $('.select-direcciones').removeClass('d-none'); }) selectDirecciones.item.on('select2:open', () => { $('.add-envio').addClass('d-none'); @@ -31,12 +37,24 @@ $(() => { $('#btnAddEnvio').on('click', () => { - const pedido_id = selectPedidos.getVal(); - const direccionSeleccionada = selectDirecciones.getText(); - $.post('/logistica/generateEnvio', { - pedido_id: pedido_id, - direccion: direccionSeleccionada - }, function (response) { + let url = ''; + let data = {}; + if(tipo_envio == 'ferro_prototipo'){ + url = '/logistica/generateEnvioFerro'; + data = { + ot_id: selectPedidos.getVal() + }; + } + else{ + url = '/logistica/generateEnvio'; + data = { + ot_id: selectPedidos.getVal(), + direccion: selectDirecciones.getText() + }; + } + $.post( + url, + data, function (response) { if (response.status) { window.open(`${window.location.origin}/logistica/envio/${response.data.id_envio}`); selectDirecciones.empty(); @@ -51,7 +69,7 @@ $(() => { }); }) - + const tableEnvios = $('#tableOfEnvios').DataTable({ processing: true, serverSide: true,