diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index da335ade..7b31629b 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -782,6 +782,9 @@ $routes->group('logistica', ['namespace' => 'App\Controllers\Logistica'], functi $routes->get('selectEnvios/(:any)', 'LogisticaController::selectorEnvios/$1', ['as' => 'selectEnvios']); $routes->get('buscar/(:any)', 'LogisticaController::searchPedidoOrISBN/$1', ['as' => 'buscarPedidoOrISBN']); $routes->get('datatableEnvios', 'LogisticaController::datatable_envios'); + $routes->get('datatableLineasEnvios/(:num)', 'LogisticaController::datatable_enviosEdit/$1'); + $routes->get('envio/(:num)', 'LogisticaController::editEnvio/$1'); + $routes->get('selectAddLinea', 'LogisticaController::selectAddEnvioLinea'); }); /* diff --git a/ci4/app/Controllers/Logistica/LogisticaController.php b/ci4/app/Controllers/Logistica/LogisticaController.php index 53776b1c..27d101d8 100644 --- a/ci4/app/Controllers/Logistica/LogisticaController.php +++ b/ci4/app/Controllers/Logistica/LogisticaController.php @@ -70,7 +70,7 @@ class LogisticaController extends BaseController return view(static::$viewPath . 'viewLogisticaSelectEnvios', $viewData); } - public function searchPedidoOrISBN($search = "") + public function searchPedidoOrISBN($search = "", $envio_id = null) { if (empty($search)) { @@ -80,10 +80,27 @@ class LogisticaController extends BaseController ]; return $this->response->setJSON($result); } - $result = LogisticaService::findPedidoOrISBN($search); + $result = LogisticaService::findPedidoOrISBN($search, $envio_id); return $this->response->setJSON($result); } + public function selectAddEnvioLinea(){ + + if ($this->request->isAJAX()) { + $query = LogisticaService::findLineaEnvio($this->request->getGet('direccion'))->orderBy("nombre", "asc"); + if ($this->request->getGet("q")) { + $query->groupStart() + ->orLike("pedidos.id", $this->request->getGet("q")) + ->orLike("presupuestos.titulo", $this->request->getGet("q")) + ->groupEnd(); + } + + return $this->response->setJSON($query->get()->getResultObject()); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + public function datatable_envios() { $model = model('App\Models\Logistica\EnvioModel'); @@ -111,4 +128,53 @@ class LogisticaController extends BaseController return $result->toJson(returnAsObject: true); } + + public function editEnvio($id = null){ + + if (empty($id)) { + return redirect()->to(base_url('logistica/selectEnvios/simple'))->with('error', lang('Logistica.errors.noEnvio')); + } + $model = model('App\Models\Logistica\EnvioModel'); + $envioEntity = $model->select('envios.*, lg_paises.nombre as pais') + ->join('lg_paises', 'lg_paises.id = envios.pais_id', 'left') + ->where('envios.id', $id) + ->first(); + if (empty($envioEntity)) { + return redirect()->to(base_url('logistica/selectEnvios/simple'))->with('error', lang('Logistica.errors.noEnvio')); + } + + $viewData = [ + 'currentModule' => static::$controllerSlug, + 'boxTitle' => '' . ' '. lang('Logistica.envio') . ' [' . $envioEntity->id . ']: ' . $envioEntity->direccion, + 'usingServerSideDataTable' => true, + 'envioEntity' => $envioEntity, + ]; + + $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class + + return view(static::$viewPath . 'viewEnvioEditForm', $viewData); + } + + public function datatable_enviosEdit($idEnvio) + { + $model = model('App\Models\Logistica\EnvioLineaModel'); + $q = $model->getDatatableQuery($idEnvio); + + + $result = DataTable::of($q) + ->add("rowSelected",callback: function ($q) { + return ''; + } + ) + ->add("action", callback: function ($q) { + + return ' +
+ +
+ '; + }); + + return $result->toJson(returnAsObject: true); + } } diff --git a/ci4/app/Language/es/Logistica.php b/ci4/app/Language/es/Logistica.php index e3fa7838..501049f3 100644 --- a/ci4/app/Language/es/Logistica.php +++ b/ci4/app/Language/es/Logistica.php @@ -29,10 +29,31 @@ return [ 'no' => 'No', 'si' => 'Sí', + 'envio' => 'Envío', + 'addLineasEnvio' => 'Añadir líneas al envío', + 'addLineasText'=> 'La siguiente lista muestra los envíos del cliente a la misma dirección de envío. Si desea añadir líneas a un envío existente, seleccione el envío y haga clic en "Añadir líneas al envío". Si desea crear un nuevo envío, haga clic en "Añadir".', + 'add' => 'Añadir', + + 'datosEnvio' => 'Datos del envío', + 'lineasEnvio' => 'Líneas del envío', + 'comentariosEnvio' => 'Comentarios del envío', + 'guardar' => 'Guardar', + + 'pedido' => 'Pedido', + 'presupuesto' => 'Presupuesto', + 'unidadesEnvio' => 'Unidades envío', + 'unidadesEnviadas' => 'Unidades enviadas', + 'titulo' => 'Título', + 'unidadesTotales' => 'Total unidades', + 'eliminar' => 'Eliminar', + 'generarAlbaran' => 'Generar albarán', + 'imprimirEtiquetas' => 'Imprimir etiquetas', + 'buttonsActions' => 'Acciones sobre las filas seleccionadas', + 'errors' => [ - 'noAlbaranes' => 'No se han encontrado albaranes para este pedido', + 'noEnvio' => 'No se ha encontrado el envio', 'noDataToFind' => 'No se ha introducido ningún dato para buscar', - 'notFound' => 'No se encuentra el pedido o ISBN, o el pedido aún no se ha finalizado', + 'notFound' => 'No se encuentra el pedido o ISBN, el pedido aún no se ha finalizado o no tiene envíos pendientes', 'noAddresses' => 'El pedido no tiene direcciones de envío', ], ]; \ No newline at end of file diff --git a/ci4/app/Services/LogisticaService.php b/ci4/app/Services/LogisticaService.php index 7d102ee5..e219e765 100644 --- a/ci4/app/Services/LogisticaService.php +++ b/ci4/app/Services/LogisticaService.php @@ -8,22 +8,35 @@ class LogisticaService { public static function findPedidoOrISBN($search) { + $multienvio = false; + $modelPedido = model('App\Models\Pedidos\PedidoModel'); - + $search = trim($search); $searchClean = str_replace('-', '', $search); $modelPedido = model('App\Models\Pedidos\PedidoModel'); $builder = $modelPedido->builder(); - $builder->select('pedidos.id as pedido_id, pedidos_linea.id as linea_id, presupuestos.id as presupuesto_id'); + + $builder->select([ + 'pedidos.id as pedido_id', + 'pedidos_linea.id as linea_id', + 'pedidos_linea.cantidad as cantidad_linea', + 'presupuestos.id as presupuesto_id', + ]); + $builder->join('pedidos_linea', 'pedidos_linea.pedido_id = pedidos.id', 'left'); $builder->join('presupuestos', 'presupuestos.id = pedidos_linea.presupuesto_id', 'left'); - + $builder->join('envios_lineas', 'envios_lineas.pedido_id = pedidos_linea.pedido_id', 'left'); + $builder->groupStart() ->where('pedidos.id', $search) ->whereIn('pedidos.estado', ['finalizado']) ->orWhere("REPLACE(presupuestos.isbn, '-', '')", $searchClean) - ->groupEnd(); + ->groupEnd(); + + $builder->groupBy('pedidos_linea.id'); + $builder->having('IFNULL(SUM(envios_lineas.unidades_envio), 0) < cantidad_linea', null, false); $result = $builder->get()->getResult(); @@ -44,76 +57,122 @@ class LogisticaService 'message' => lang('Logistica.errors.noAddresses'), ]; return $response; + } else if ($numDirecciones > 1) { + $multienvio = true; } - // detectar si el pedido tiene los albaranes generados - $AlbaranModel = model('App\Models\Pedidos\AlbaranModel'); - $numAlbaranes = $AlbaranModel->where('pedido_id', $result[0]->pedido_id) - ->countAllResults(); - $response = [ 'status' => true, 'data' => $result[0], - ]; + ]; - if($numAlbaranes == 0){ - $user = auth()->user()->id; - $AlbaranModel->generarAlbaranes($result[0]->pedido_id, [$result[0]->presupuesto_id], $user); - $response['data']->createAlbaran = true; - } - $response_envio = LogisticaService::generateEnvio($result[0]->pedido_id); - if($response_envio['status'] == false){ + $response_envio = LogisticaService::generateEnvio($result[0]->pedido_id, $multienvio); + if ($response_envio['status'] == false) { $response = [ 'status' => false, 'message' => $response_envio['message'], ]; return $response; - } - else{ + } else { $response['data']->id_envio = $response_envio['data']['id_envio']; $response['data']->multienvio = $response_envio['data']['multienvio']; } - return $response; + return $response; } + public static function findLineaEnvio($direccion){ - private static function generateEnvio($pedido_id){ - - // Se obtiene los datos de att, direccion, ciudad, cp, telefono, pais_id - $AlbaranModel = model('App\Models\Pedidos\AlbaranModel'); - $lineasAlbaran = $AlbaranModel->where('pedido_id', $pedido_id) - ->join('albaranes_lineas', 'albaranes_lineas.albaran_id = albaranes.id') - ->join('pedidos', 'pedidos.id = albaranes.pedido_id') - ->where('pedidos.estado', 'finalizado') - ->countAllResults(); + $modelPedido = model('App\Models\Pedidos\PedidoModel'); - $multienvio = false; + $builder = $modelPedido->builder(); + + $builder->select(" + CONCAT( + '[' , + pedidos.id, ']', + ' - ', + presupuestos.titulo, + ) as name, + pedidos.id as pedido_id"); + + $builder->join('pedidos_linea', 'pedidos_linea.pedido_id = pedidos.id', 'left'); + $builder->join('presupuestos', 'presupuestos.id = pedidos_linea.presupuesto_id', 'left'); + $builder->join('envios_lineas', 'envios_lineas.pedido_id = pedidos_linea.pedido_id', 'left'); + $builder->join('presupuesto_direcciones', 'presupuesto_direcciones.id = envios_lineas.presupuesto_direcciones_id', 'left'); + + $builder->groupBy('pedidos_linea.id'); + $builder->having('IFNULL(SUM(envios_lineas.unidades_envio), 0) < cantidad_linea', null, false); + $builder->where('pedidos.estado', 'finalizado'); + $builder->where('presupuesto_direcciones.direccion', $direccion); + + return $builder; - if($lineasAlbaran == 0){ - return [ - 'status' => false, - 'message' => lang('Logistica.errors.noAlbaranes'), - ]; - } - if($lineasAlbaran > 1){ - $multienvio = true; - } - if(!$multienvio){ + } + + + + } + + /*$builder->select([ + 'pedidos.id as pedido_id', + 'pedidos_linea.id as linea_id', + 'pedidos_linea.cantidad as total_unidades', + 'IFNULL(( + SELECT SUM(t_sub.unidades_envio) + FROM " . envios_lineas . " t_sub + JOIN envios e ON e.id = t_sub.envio_id + WHERE e.finalizado = 1 + AND t_sub.pedido_id = t1.pedido_id + AND t_sub.presupuesto_direcciones_id = t1.presupuesto_direcciones_id + ), 0) as unidades_enviadas', + 'cantidad_linea - IFNULL(SUM(envios_lineas.unidades_envio), 0) as unidades_envio', + 'presupuestos.id as presupuesto_id', + ]); + + $builder->join('pedidos_linea', 'pedidos_linea.pedido_id = pedidos.id', 'left'); + $builder->join('presupuestos', 'presupuestos.id = pedidos_linea.presupuesto_id', 'left'); + $builder->join('envios_lineas', 'envios_lineas.pedido_id = pedidos_linea.pedido_id', 'left'); + + $builder->groupBy('pedidos_linea.id'); + $builder->having('IFNULL(SUM(envios_lineas.unidades_envio), 0) < cantidad_linea', null, false); + $builder->where('pedidos.estado', 'finalizado'); + + $result = $builder->get()->getResult(); + */ + + + private static function generateEnvio($pedido_id, $multienvio = false) + { + + $presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel'); + + if (!$multienvio) { // solo hay una dirección, se obtiene de los albaranes - - $datosEnvio = $AlbaranModel - ->select('albaranes.att_albaran as att, albaranes.direccion_albaran as direccion, - presupuesto_direcciones.provincia as ciudad, presupuesto_direcciones.cp as cp, presupuesto_direcciones.telefono as telefono, presupuesto_direcciones.email as email, - presupuesto_direcciones.pais_id as pais_id, albaranes_lineas.cantidad as cantidad, albaranes_lineas.cajas as cajas') - ->where('albaranes.pedido_id', $pedido_id) - ->where('albaranes_lineas.cajas !=', null) - ->join('albaranes_lineas', 'albaranes_lineas.albaran_id = albaranes.id') - ->join('presupuesto_direcciones', 'presupuesto_direcciones.presupuesto_id = albaranes.presupuesto_id') + + $datosEnvio = $presupuestoDireccionesModel + ->select(' + presupuesto_direcciones.id as presupuesto_direcciones_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 - IFNULL(SUM(envios_lineas.unidades_envio), 0) as cantidad, + presupuesto_direcciones.cantidad as cantidad_total + ') + ->join('pedidos_linea', 'pedidos_linea.presupuesto_id = presupuesto_direcciones.presupuesto_id') + ->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id') + ->join('envios_lineas', 'envios_lineas.pedido_id = pedidos.id AND envios_lineas.presupuesto_direcciones_id = presupuesto_direcciones.id', 'left') + ->where('pedidos.id', $pedido_id) + ->groupBy('presupuesto_direcciones.id') // Necesario por el uso de SUM ->first(); + // se genera un nuevo envio con estos datos $EnvioModel = model('App\Models\Logistica\EnvioModel'); $EnvioModel->set('att', $datosEnvio->att); @@ -124,7 +183,8 @@ class LogisticaService $EnvioModel->set('email', $datosEnvio->email); $EnvioModel->set('pais_id', $datosEnvio->pais_id); $EnvioModel->set('cantidad', $datosEnvio->cantidad); - $EnvioModel->set('cajas', $datosEnvio->cajas); + $EnvioModel->set('cajas', 1); + $EnvioModel->set('multienvio', $multienvio ? 1 : 0); $EnvioModel->set('created_at', date('Y-m-d H:i:s')); $EnvioModel->set('updated_at', date('Y-m-d H:i:s')); $EnvioModel->insert(); @@ -132,18 +192,22 @@ class LogisticaService // se genera la linea de envio $EnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel'); - $EnvioLineasModel->set('envio_id', $idEnvio); - $EnvioLineasModel->set('pedido_id', $pedido_id); - $EnvioLineasModel->set('unidades_envio', $datosEnvio->cantidad); - $EnvioLineasModel->set('unidades_total', $datosEnvio->cantidad); - $EnvioLineasModel->set('cajas', $datosEnvio->cajas); - $EnvioLineasModel->set('unidades_cajas', $datosEnvio->cajas); - $EnvioLineasModel->set('created_at', date('Y-m-d H:i:s')); - $EnvioLineasModel->set('updated_at', date('Y-m-d H:i:s')); - $EnvioLineasModel->set('created_by', auth()->user()->id); - $EnvioLineasModel->set('updated_by', auth()->user()->id); - $EnvioLineasModel->insert(); - + $EnvioLineasModel->save([ + 'envio_id' => $idEnvio, + 'pedido_id' => $pedido_id, + 'unidades_envio' => $datosEnvio->cantidad, + 'unidades_total' => $datosEnvio->cantidad_total, + '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_direcciones_id' => (int) $datosEnvio->presupuesto_direcciones_id + ]); + + + return [ 'status' => true, 'data' => [ @@ -154,7 +218,7 @@ class LogisticaService } - if(empty($datosEnvio)){ + if (empty($datosEnvio)) { return [ 'status' => false, 'message' => lang('Logistica.errors.noAddresses'), diff --git a/httpdocs/assets/js/safekat/pages/logistica/envio.js b/httpdocs/assets/js/safekat/pages/logistica/envio.js index 9dcfb3c8..75b25796 100644 --- a/httpdocs/assets/js/safekat/pages/logistica/envio.js +++ b/httpdocs/assets/js/safekat/pages/logistica/envio.js @@ -14,22 +14,9 @@ $(()=>{ if(!response.status){ popErrorAlert(response.message); } - if(response.data && response.data.createAlbaran){ + if(response.data){ - Swal.fire({ - title: 'Atención!', - text: 'El pedido no contenía ningún albarán. Se han añadido automáticamente.', - icon: 'warning', - showCancelButton: false, - confirmButtonColor: '#3085d6', - confirmButtonText: 'Ok', - customClass: { - confirmButton: 'btn btn-primary me-1', - }, - buttonsStyling: false - }).then(() => { - //window.open(`${urlObj.origin}` + '/presupuestoadmin/edit/' + response.id); - }); + window.open(`${urlObj.origin}` + '/logistica/envio/' + response.id); } },