mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
Merge branch 'main' into feat/update-ot-flow
This commit is contained in:
@ -13,7 +13,7 @@ class EmailService
|
||||
|
||||
// Si no estamos en producción, forzar el destinatario a uno fijo
|
||||
if ($skEnv !== 'production') {
|
||||
$recipient = env('MAIL_DEV_RECIPIENT', 'imnavajas@coit.es'); // fallback opcional
|
||||
$recipient = env('MAIL_DEV_RECIPIENT', 'imnavajas@coit.es,info@jjimenez.eu'); // fallback opcional
|
||||
}
|
||||
|
||||
$settings_model = model('App\Models\Configuracion\ConfigVariableModel');
|
||||
@ -43,7 +43,13 @@ class EmailService
|
||||
$email->setSubject($subject);
|
||||
$email->setMessage($body);
|
||||
|
||||
return $email->send();
|
||||
if (!$email->send()) {
|
||||
log_message('error', 'Error enviando email: ' . $email->printDebugger(['headers', 'subject', 'body']));
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
} catch (\Throwable $e) {
|
||||
log_message('error', 'EmailService failed: ' . $e->getMessage());
|
||||
return false;
|
||||
|
||||
@ -57,7 +57,8 @@ class LogisticaService
|
||||
->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('p.fecha_encuadernado IS NOT NULL')
|
||||
->where('DATE(p.fecha_encuadernado) <=', date('Y-m-d'))
|
||||
->where("NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM envios_lineas el
|
||||
@ -78,6 +79,79 @@ class LogisticaService
|
||||
return $builder;
|
||||
}
|
||||
|
||||
public static function findNextEnvios(int $envio_id)
|
||||
{
|
||||
$db = \Config\Database::connect();
|
||||
|
||||
// 1. Dirección del envío actual
|
||||
$envio = $db->table('envios')->select('direccion')->where('id', $envio_id)->get()->getRow();
|
||||
if (!$envio) {
|
||||
return $db->table('(SELECT NULL AS id, NULL AS name) AS empty')->where('1 = 0');
|
||||
}
|
||||
|
||||
$direccionNormalizada = str_replace(' ', '', strtolower(trim($envio->direccion)));
|
||||
$direccionSQL = $db->escape($direccionNormalizada);
|
||||
|
||||
// 2. Obtener presupuestos con esa dirección
|
||||
$presupuestosConEsaDireccion = $db->table('presupuesto_direcciones')
|
||||
->select('presupuesto_id')
|
||||
->where("REPLACE(LOWER(TRIM(direccion)), ' ', '') = $direccionSQL", null, false)
|
||||
->get()
|
||||
->getResultArray();
|
||||
|
||||
$presupuestoIds = array_column($presupuestosConEsaDireccion, 'presupuesto_id');
|
||||
if (empty($presupuestoIds)) {
|
||||
return $db->table('(SELECT NULL AS id, NULL AS name) AS empty')->where('1 = 0');
|
||||
}
|
||||
|
||||
$hoy = date('Y-m-d');
|
||||
$sieteDiasDespues = date('Y-m-d', strtotime('+7 days'));
|
||||
|
||||
// 3. Subconsulta principal
|
||||
$subBuilder = $db->table('pedidos_linea pl')
|
||||
->select("
|
||||
ot.id AS ot,
|
||||
DATE(p.fecha_encuadernado) as fechaEncuadernado,
|
||||
(
|
||||
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 REPLACE(LOWER(TRIM(e.direccion)), ' ', '') = $direccionSQL
|
||||
AND (e.finalizado = 1 OR e.id = $envio_id)
|
||||
) 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('pr.id', $presupuestoIds)
|
||||
->whereIn('p.estado', ['finalizado', 'produccion'])
|
||||
->where('p.fecha_encuadernado IS NOT NULL')
|
||||
->where('DATE(p.fecha_encuadernado) >=', $hoy)
|
||||
->where('DATE(p.fecha_encuadernado) <=', $sieteDiasDespues)
|
||||
->where("NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM envios_lineas el
|
||||
WHERE el.envio_id = $envio_id
|
||||
AND el.pedido_id = p.id
|
||||
AND el.presupuesto_id = pr.id
|
||||
GROUP BY el.pedido_id, el.presupuesto_id
|
||||
HAVING SUM(el.unidades_envio) >= pd.cantidad
|
||||
)", null, false)
|
||||
->groupBy('pl.id');
|
||||
|
||||
// 4. Envolver y filtrar por unidades pendientes
|
||||
$builder = $db->table("({$subBuilder->getCompiledSelect(false)}) AS sub");
|
||||
$builder->select('ot, fechaEncuadernado');
|
||||
$builder->where('cantidad > unidades_enviadas');
|
||||
|
||||
return $builder;
|
||||
}
|
||||
|
||||
|
||||
public static function findForNewEnvio()
|
||||
{
|
||||
@ -103,16 +177,15 @@ class LogisticaService
|
||||
->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')
|
||||
->where('p.fecha_encuadernado IS NOT NULL')
|
||||
->where('DATE(p.fecha_encuadernado) <=', date('Y-m-d'))
|
||||
->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;
|
||||
}
|
||||
@ -289,6 +362,81 @@ class LogisticaService
|
||||
}
|
||||
|
||||
|
||||
public static function sendConfirmacionEnvio($envio, $lineaEnvio, $isFerro = false)
|
||||
{
|
||||
|
||||
$view = \Config\Services::renderer();
|
||||
|
||||
if ($isFerro)
|
||||
$subject = '[Safekat]' . " El envio del ferro de su pedido se ha realizado";
|
||||
else
|
||||
$subject = '[Safekat]' . " El envio de su pedido se ha realizado";
|
||||
|
||||
$presupuestoModel = model('App\Models\Presupuestos\PresupuestoModel');
|
||||
$presupuesto = $presupuestoModel->find($lineaEnvio->presupuesto_id);
|
||||
$proveedorModel = model('App\Models\Compras\ProveedorModel');
|
||||
$proveedor = $proveedorModel->find($envio->proveedor_id);
|
||||
$userModel = model('App\Models\Usuarios\UserModel');
|
||||
$datos_correo = $userModel->select("CONCAT(users.first_name, ' ', users.last_name) as comercial_nombre, auth_identities.secret as comercial_correo, clientes.email as cliente_email")
|
||||
->join('auth_identities', 'auth_identities.user_id = users.id')
|
||||
->join('clientes', 'clientes.comercial_id = users.id')
|
||||
->where('clientes.id', $presupuesto->cliente_id)
|
||||
->first();
|
||||
|
||||
|
||||
|
||||
$pedido = (object) [
|
||||
'pedido_id' => $lineaEnvio->pedido_id,
|
||||
'titulo' => $presupuesto->titulo,
|
||||
'cp' => $envio->cp,
|
||||
'proveedor_nombre' => $proveedor->nombre,
|
||||
'codigo_seguimiento' => $envio->codigo_seguimiento,
|
||||
'comercial_nombre' => $datos_correo->comercial_nombre,
|
||||
'comercial_correo' => $datos_correo->comercial_correo,
|
||||
];
|
||||
|
||||
if ($proveedor->nombre == "GLS") {
|
||||
$pedido->url = 'https://m.asmred.com/e/' . $envio->codigo_seguimiento . '/' . $envio->cp;
|
||||
}
|
||||
|
||||
$content = $view->setVar('datos_pedido', $pedido)
|
||||
->render('themes/vuexy/mail/envio_pedido');
|
||||
// Renderiza la plantilla completa
|
||||
if ($isFerro)
|
||||
$finalBody = $view->setVar('emailTitle2', "El ferro de su pedido " . $lineaEnvio->pedido_id . " ha sido enviado el " . date('d/m/Y'))
|
||||
->setVar('content', $content)
|
||||
->render('themes/vuexy/mail/mail_layout_2');
|
||||
else
|
||||
$finalBody = $view->setVar('emailTitle2', "Su pedido " . $lineaEnvio->pedido_id . " ha sido enviado el " . date('d/m/Y'))
|
||||
->setVar('content', $content)
|
||||
->render('themes/vuexy/mail/mail_layout_2');
|
||||
|
||||
|
||||
$email = service('emailService');
|
||||
$result = $email->send($subject, $finalBody, $datos_correo->cliente_email);
|
||||
|
||||
$chat = Service('chat');
|
||||
$data = [
|
||||
'chat_department_id' => 5,
|
||||
'client' => $presupuesto->cliente_id,
|
||||
'message' => "El pedido " . $lineaEnvio->pedido_id . " ha sido enviado el " . date('d/m/Y') . ".<br><br>" .
|
||||
"CP:" . $envio->cp . ".<br>" .
|
||||
"Proveedor envío: " . $proveedor->nombre . ".<br>" .
|
||||
"Código de seguimiento: " . $envio->codigo_seguimiento . ".<br>"
|
||||
];
|
||||
if ($proveedor->nombre == "GLS") {
|
||||
$data['message'] = $data['message'] . 'URL segumiento: <a style="color:white;" target="_blank" href="' . 'https://m.asmred.com/e/' . $envio->codigo_seguimiento . '/' . $envio->cp . ' ">' .
|
||||
'https://m.asmred.com/e/' . $envio->codigo_seguimiento . '/' . $envio->cp . '</a>';
|
||||
}
|
||||
$chat->storeChatMessage(5, "pedido", $lineaEnvio->pedido_id, $data);
|
||||
|
||||
return [
|
||||
'status' => $result,
|
||||
'message' => $result ? lang('Logistica.success.emailSent') : lang('Logistica.errors.emailNotSent'),
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
|
||||
public static function generateEnvio($ot_id, $direccion = null)
|
||||
{
|
||||
@ -533,16 +681,29 @@ class LogisticaService
|
||||
"name" => "ferro_en_cliente_at",
|
||||
"ferro_en_cliente_at" => date('Y-m-d H:i:s')
|
||||
]);
|
||||
|
||||
LogisticaService::sendConfirmacionEnvio($envio, $linea, true);
|
||||
|
||||
} else {
|
||||
if ($cantidad_enviada + $linea->unidades_envio == $pedido->total_tirada) {
|
||||
if ($cantidad_enviada + $linea->unidades_envio >= $pedido->total_tirada) {
|
||||
$otModel = model('App\Models\OrdenTrabajo\OrdenTrabajoModel');
|
||||
$ot = $otModel->where('pedido_id', $linea->pedido_id)
|
||||
->first();
|
||||
$ps = (new ProductionService())->init($ot->id);
|
||||
$date = $ps->getOrdenTrabajo()->dates()->embalaje_at;
|
||||
if (is_null($date) || empty($date)) {
|
||||
$ps->updateOrdenTrabajoDate([
|
||||
"name" => "embalaje_at",
|
||||
"embalaje_at" => date('Y-m-d H:i:s')
|
||||
]);
|
||||
}
|
||||
$ps->updateOrdenTrabajoDate([
|
||||
"name" => "envio_at",
|
||||
"envio_at" => date('Y-m-d H:i:s')
|
||||
]);
|
||||
|
||||
LogisticaService::sendConfirmacionEnvio($envio, $linea);
|
||||
|
||||
if ($finalizar_ot) {
|
||||
$ps->updateOrdenTrabajo(
|
||||
[
|
||||
@ -572,6 +733,29 @@ class LogisticaService
|
||||
return $data_return;
|
||||
}
|
||||
|
||||
public static function ficharEmbalaje($ids = null)
|
||||
{
|
||||
|
||||
if (is_null($ids) || empty($ids) || count($ids) == 0) {
|
||||
return [
|
||||
'status' => false,
|
||||
'message' => lang('Logistica.errors.noLineas'),
|
||||
];
|
||||
}
|
||||
|
||||
for ($index = 0; $index < count($ids); $index++) {
|
||||
$ps = (new ProductionService())->init($ids[$index]);
|
||||
$ps->updateOrdenTrabajoDate([
|
||||
"name" => "embalaje_at",
|
||||
"embalaje_at" => date('Y-m-d')
|
||||
]);
|
||||
}
|
||||
return [
|
||||
'status' => true,
|
||||
'message' => lang('Logistica.success.successFicharEmbalaje'),
|
||||
];
|
||||
}
|
||||
|
||||
public static function generateEtiquetasTitulos($envio, $lineas, $printer, $cajas)
|
||||
{
|
||||
$data = [
|
||||
|
||||
Reference in New Issue
Block a user