mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
trabajando en añadir lineas a envio
This commit is contained in:
@ -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');
|
||||
});
|
||||
|
||||
/*
|
||||
|
||||
@ -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' => '<i class="ti ti-truck ti-xl"></i>' . ' '. 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 '<input type="checkbox" class="form-check-input" name="row_selected[]" value="' . $q->id . '">';
|
||||
}
|
||||
)
|
||||
->add("action", callback: function ($q) {
|
||||
|
||||
return '
|
||||
<div class="btn-group btn-group-sm">
|
||||
<a href="javascript:void(0);"><i class="ti ti-pencil ti-sm btn-edit mx-2" data-id="' . $q->id . '"></i></a>
|
||||
</div>
|
||||
';
|
||||
});
|
||||
|
||||
return $result->toJson(returnAsObject: true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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',
|
||||
],
|
||||
];
|
||||
@ -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'),
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user