cambiado ael añadir envios

This commit is contained in:
2025-04-24 23:44:07 +02:00
parent f16654f4ad
commit 5c68334e9a
8 changed files with 200 additions and 109 deletions

View File

@ -158,8 +158,11 @@ class LogisticaService
->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('ot_dates.embalaje_at IS NOT NULL')
->where("NOT EXISTS (
SELECT 1
FROM envios_lineas el
@ -180,11 +183,84 @@ class LogisticaService
return $builder;
}
public static function findPedidosNewEnvio()
{
$db = \Config\Database::connect();
// 3. Subconsulta principal
$subBuilder = $db->table('pedidos_linea pl')
->select("
pl.id AS id,
CONCAT('[', p.id, '] - ', pr.titulo) AS name,
(
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 e.finalizado = 1
) 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('p.estado', ['finalizado', 'produccion'])
->where('ot_dates.embalaje_at IS NOT NULL')
->groupBy('pl.id');
// 4. Envolver y filtrar por unidades pendientes
$builder = $db->table("({$subBuilder->getCompiledSelect(false)}) AS sub");
$builder->select('id, name');
$builder->where('cantidad > unidades_enviadas');
$builder->orderBy('name', 'ASC');
return $builder;
}
public static function findDireccionesNewEnvio($pedido_id, $searchVal = "")
{
$direcciones = [];
$counter = 1;
$PresupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
$dirs = $PresupuestoDireccionesModel->select('direccion')
->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);
if ($searchVal != "") {
$dirs = $dirs->groupStart()
->Like("id", $searchVal)
->groupEnd();
}
$dirs = $dirs->orderBy('direccion', 'asc')->findAll();
foreach ($dirs as $key => $direccion) {
$modelEnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel');
$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)
->where('envios.direccion', $direccion->direccion)
->where('envios.finalizado', 1)
->groupBy('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,
(object) [
"id" => $counter,
'name' => $direccion->direccion
]
);
$counter++;
}
}
return $direcciones;
}
public static function addLineaEnvio($envio_id = null, $pedido_id = null, $direccion = null)
{
@ -276,7 +352,6 @@ class LogisticaService
$presupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
$direccionNormalizada = strtolower(trim($direccion));
// Consulta con cálculo exacto de unidades pendientes por dirección
$datosEnvio = $presupuestoDireccionesModel
->select("
presupuestos.id as presupuesto_id,
@ -297,7 +372,7 @@ class LogisticaService
JOIN envios e ON e.id = el.envio_id
WHERE el.pedido_id = pedidos.id
AND el.presupuesto_id = presupuestos.id
AND TRIM(LOWER(e.direccion)) = '$direccionNormalizada'
AND e.direccion LIKE " . $presupuestoDireccionesModel->db->escape("%$direccion%") . "
AND e.finalizado = 1
), 0)
) as cantidad
@ -306,7 +381,7 @@ class LogisticaService
->join('pedidos', 'pedidos.id = pedidos_linea.pedido_id')
->join('presupuestos', 'pedidos_linea.presupuesto_id = presupuestos.id')
->where('pedidos.id', $pedido_id)
->where("TRIM(LOWER(presupuesto_direcciones.direccion)) = '$direccionNormalizada'", null, false)
->like('presupuesto_direcciones.direccion', $direccion)
->groupBy('presupuesto_direcciones.id')
->first();