mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
280 lines
10 KiB
PHP
280 lines
10 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use Config\Services;
|
|
|
|
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',
|
|
'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();
|
|
|
|
$builder->groupBy('pedidos_linea.id');
|
|
$builder->having('IFNULL(SUM(envios_lineas.unidades_envio), 0) < cantidad_linea', null, false);
|
|
|
|
$result = $builder->get()->getResult();
|
|
|
|
if (empty($result)) {
|
|
$response = [
|
|
'status' => false,
|
|
'message' => lang('Logistica.errors.notFound'),
|
|
];
|
|
return $response;
|
|
}
|
|
|
|
$PresupuestoDireccionesModel = model('App\Models\Presupuestos\PresupuestoDireccionesModel');
|
|
$numDirecciones = $PresupuestoDireccionesModel->where('presupuesto_id', $result[0]->presupuesto_id)
|
|
->countAllResults();
|
|
if ($numDirecciones == 0) {
|
|
$response = [
|
|
'status' => false,
|
|
'message' => lang('Logistica.errors.noAddresses'),
|
|
];
|
|
return $response;
|
|
} else if ($numDirecciones > 1) {
|
|
$multienvio = true;
|
|
}
|
|
|
|
$response = [
|
|
'status' => true,
|
|
'data' => $result[0],
|
|
];
|
|
|
|
|
|
$response_envio = LogisticaService::generateEnvio($result[0]->pedido_id, $multienvio);
|
|
if ($response_envio['status'] == false) {
|
|
$response = [
|
|
'status' => false,
|
|
'message' => $response_envio['message'],
|
|
];
|
|
return $response;
|
|
} else {
|
|
$response['data']->id_envio = $response_envio['data']['id_envio'];
|
|
$response['data']->multienvio = $response_envio['data']['multienvio'];
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
|
|
|
|
public static function findLineaEnvioPorEnvio(int $envio_id)
|
|
{
|
|
$db = \Config\Database::connect();
|
|
|
|
$builder = $db->table('envios e_main');
|
|
|
|
$builder->select("
|
|
CONCAT('[', p.id, '] - ', pr.titulo) AS name,
|
|
p.id AS id,
|
|
pl.id AS linea_id,
|
|
pl.cantidad,
|
|
(
|
|
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 e.direccion = e_main.direccion
|
|
) AS unidades_enviadas,
|
|
(pl.cantidad - (
|
|
SELECT IFNULL(SUM(el2.unidades_envio), 0)
|
|
FROM envios_lineas el2
|
|
JOIN envios e2 ON e2.id = el2.envio_id
|
|
WHERE el2.pedido_id = p.id
|
|
AND e2.direccion = e_main.direccion
|
|
)) AS unidades_pendientes
|
|
");
|
|
|
|
$builder->join('envios_lineas el_main', 'el_main.envio_id = e_main.id');
|
|
$builder->join('pedidos p', 'p.id = el_main.pedido_id');
|
|
$builder->join('pedidos_linea pl', 'pl.pedido_id = p.id');
|
|
$builder->join('presupuestos pr', 'pr.id = pl.presupuesto_id');
|
|
|
|
$builder->where('p.estado', 'finalizado');
|
|
$builder->where('e_main.id', $envio_id);
|
|
|
|
$builder->groupBy('pl.id');
|
|
$builder->having('unidades_enviadas < pl.cantidad', null, false);
|
|
$builder->orderBy('name', 'ASC');
|
|
|
|
return $builder;
|
|
}
|
|
|
|
public static function addLineaEnvio($envio_id = null, $pedido_id = null, $direccion = null)
|
|
{
|
|
$modelPedido = model('App\Models\Pedidos\PedidoModel');
|
|
|
|
$builder = $modelPedido->builder();
|
|
|
|
$builder->select("
|
|
pedidos.id as pedido_id,
|
|
pedidos_linea.id as linea_id,
|
|
pedidos_linea.cantidad as total_unidades,
|
|
(
|
|
SELECT IFNULL(SUM(el.unidades_envio), 0)
|
|
FROM envios_lineas el
|
|
JOIN envios e ON e.id = el.envio_id
|
|
WHERE el.pedido_id = pedidos.id
|
|
AND e.finalizado = 1
|
|
AND TRIM(e.direccion) = '" . addslashes(trim($direccion)) . "'
|
|
) as unidades_enviadas,
|
|
pedidos_linea.cantidad - 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) < pedidos_linea.cantidad', null, false);
|
|
$builder->where('pedidos.estado', 'finalizado');
|
|
$builder->where('pedidos.id', $pedido_id);
|
|
|
|
$result = $builder->get()->getResultObject();
|
|
|
|
if (empty($result)) {
|
|
return [
|
|
'status' => false,
|
|
'message' => lang('Logistica.errors.notFound'),
|
|
];
|
|
} else {
|
|
$EnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel');
|
|
$EnvioLineasModel->save([
|
|
'envio_id' => $envio_id,
|
|
'pedido_id' => $result[0]->pedido_id,
|
|
'unidades_envio' => $result[0]->unidades_envio,
|
|
'unidades_total' => $result[0]->total_unidades,
|
|
'cajas' => null,
|
|
'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' => $result[0]->presupuesto_id,
|
|
]);
|
|
}
|
|
|
|
return [
|
|
'status' => true,
|
|
'data' => [
|
|
'unidades_envio' => $result[0]->unidades_envio,
|
|
'unidades_enviadas' => $result[0]->unidades_enviadas,
|
|
'total_unidades' => $result[0]->total_unidades,
|
|
]
|
|
];
|
|
}
|
|
|
|
|
|
|
|
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 = $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 - 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('presupuestos', 'pedidos_linea.presupuesto_id = presupuestos.id')
|
|
->join('envios_lineas', 'envios_lineas.pedido_id = pedidos.id', 'left')
|
|
->join('envios', 'envios.id = envios_lineas.envio_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);
|
|
$EnvioModel->set('direccion', $datosEnvio->direccion);
|
|
$EnvioModel->set('ciudad', $datosEnvio->ciudad);
|
|
$EnvioModel->set('cp', $datosEnvio->cp);
|
|
$EnvioModel->set('telefono', $datosEnvio->telefono);
|
|
$EnvioModel->set('email', $datosEnvio->email);
|
|
$EnvioModel->set('pais_id', $datosEnvio->pais_id);
|
|
$EnvioModel->set('cantidad', $datosEnvio->cantidad);
|
|
$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();
|
|
$idEnvio = $EnvioModel->insertID();
|
|
|
|
// se genera la linea de envio
|
|
$EnvioLineasModel = model('App\Models\Logistica\EnvioLineaModel');
|
|
$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_id' => (int) $datosEnvio->presupuesto_id
|
|
]);
|
|
|
|
|
|
|
|
return [
|
|
'status' => true,
|
|
'data' => [
|
|
'id_envio' => $idEnvio,
|
|
'multienvio' => false,
|
|
],
|
|
];
|
|
|
|
}
|
|
|
|
if (empty($datosEnvio)) {
|
|
return [
|
|
'status' => false,
|
|
'message' => lang('Logistica.errors.noAddresses'),
|
|
];
|
|
}
|
|
|
|
}
|
|
}
|