trabajando en añadir lineas a envio

This commit is contained in:
2025-04-17 13:47:26 +02:00
parent 9e90ec798c
commit 3949607a3c
5 changed files with 223 additions and 82 deletions

View File

@ -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'),