mirror of
https://git.imnavajas.es/jjimenez/safekat.git
synced 2025-07-25 22:52:08 +00:00
hecho lo de proximos envios
This commit is contained in:
@ -765,6 +765,7 @@ $routes->group('produccion', ['namespace' => 'App\Controllers\Produccion'], func
|
|||||||
$routes->get('tareas/datatable/(:num)', 'Ordentrabajo::tareas_datatable/$1', ['as' => 'datatableTareasOrdenTrabajo']);
|
$routes->get('tareas/datatable/(:num)', 'Ordentrabajo::tareas_datatable/$1', ['as' => 'datatableTareasOrdenTrabajo']);
|
||||||
$routes->get('maquinas/ots/datatable/(:num)','Ordentrabajo::datatable_maquina_ordenes_trabajo/$1');
|
$routes->get('maquinas/ots/datatable/(:num)','Ordentrabajo::datatable_maquina_ordenes_trabajo/$1');
|
||||||
$routes->get('maquinas/ots/(:num)','Ordentrabajo::get_maquina_ots/$1');
|
$routes->get('maquinas/ots/(:num)','Ordentrabajo::get_maquina_ots/$1');
|
||||||
|
|
||||||
/**======================
|
/**======================
|
||||||
* UPDATES
|
* UPDATES
|
||||||
*========================**/
|
*========================**/
|
||||||
@ -872,6 +873,7 @@ $routes->group('logistica', ['namespace' => 'App\Controllers\Logistica'], functi
|
|||||||
$routes->get('selectDireccionForEnvio', 'LogisticaController::selectDireccionForEnvio');
|
$routes->get('selectDireccionForEnvio', 'LogisticaController::selectDireccionForEnvio');
|
||||||
$routes->post('imprimirEtiquetas', 'LogisticaController::imprimirEtiquetas');
|
$routes->post('imprimirEtiquetas', 'LogisticaController::imprimirEtiquetas');
|
||||||
$routes->post('ficharEmbalaje', 'LogisticaController::ficharEmbalaje');
|
$routes->post('ficharEmbalaje', 'LogisticaController::ficharEmbalaje');
|
||||||
|
$routes->get('datatableProximosEnvios/(:num)', 'LogisticaController::datatable_proximosEnvios/$1');
|
||||||
|
|
||||||
$routes->get('listAlbaranes', 'LogisticaController::listAlbaranes', ['as' => 'albaranesList']);
|
$routes->get('listAlbaranes', 'LogisticaController::listAlbaranes', ['as' => 'albaranesList']);
|
||||||
});
|
});
|
||||||
|
|||||||
@ -98,7 +98,8 @@ class LogisticaController extends BaseController
|
|||||||
return view(static::$viewPath . 'viewImpresionEtiquetas', $viewData);
|
return view(static::$viewPath . 'viewImpresionEtiquetas', $viewData);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function listAlbaranes(){
|
public function listAlbaranes()
|
||||||
|
{
|
||||||
$viewData = [
|
$viewData = [
|
||||||
'currentModule' => static::$controllerSlug,
|
'currentModule' => static::$controllerSlug,
|
||||||
'boxTitle' => lang('Albaran.albaranes'),
|
'boxTitle' => lang('Albaran.albaranes'),
|
||||||
@ -140,7 +141,8 @@ class LogisticaController extends BaseController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function selectDireccionForEnvio(){
|
public function selectDireccionForEnvio()
|
||||||
|
{
|
||||||
|
|
||||||
if ($this->request->isAJAX()) {
|
if ($this->request->isAJAX()) {
|
||||||
$ot = $this->request->getGet('ot_id');
|
$ot = $this->request->getGet('ot_id');
|
||||||
@ -450,6 +452,24 @@ class LogisticaController extends BaseController
|
|||||||
return $result->toJson(returnAsObject: true);
|
return $result->toJson(returnAsObject: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function datatable_proximosEnvios($envio_id = null)
|
||||||
|
{
|
||||||
|
$q = LogisticaService::findNextEnvios($envio_id);
|
||||||
|
|
||||||
|
$result = DataTable::of($q)
|
||||||
|
->edit(
|
||||||
|
"ot",
|
||||||
|
function ($row, $meta) {
|
||||||
|
return '<a href="' . base_url('produccion/ordentrabajo/edit/' . $row->ot) . '" target="_blank">' . $row->ot . '</a>';
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
$result = $result->toJson(returnAsObject: true);
|
||||||
|
$query = model('App\Models\Logistica\EnvioModel')->db->getLastQuery();
|
||||||
|
return $result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
public function setCajaLinea()
|
public function setCajaLinea()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|||||||
@ -60,6 +60,7 @@ return [
|
|||||||
'selectAll' => 'Seleccionar todo',
|
'selectAll' => 'Seleccionar todo',
|
||||||
'peso' => 'Peso (kg): ',
|
'peso' => 'Peso (kg): ',
|
||||||
'unidadesTotalesFooter' => 'Unidades:',
|
'unidadesTotalesFooter' => 'Unidades:',
|
||||||
|
'fechaEncuadernado' => 'Fecha encuadernado',
|
||||||
|
|
||||||
'codigoSeguimiento' => 'Código de seguimiento',
|
'codigoSeguimiento' => 'Código de seguimiento',
|
||||||
'empresaMensajería' => 'Empresa de mensajería',
|
'empresaMensajería' => 'Empresa de mensajería',
|
||||||
|
|||||||
@ -143,4 +143,25 @@ class OrdenTrabajoModel extends Model
|
|||||||
->groupBy('orden_trabajo_tareas.id');
|
->groupBy('orden_trabajo_tareas.id');
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function queryProximosEnvios()
|
||||||
|
{
|
||||||
|
$query = $this->builder()
|
||||||
|
->select([
|
||||||
|
'ordenes_trabajo.id as ot',
|
||||||
|
'orden_trabajo_dates.encuadernacion_at as fechaEncuadernado',
|
||||||
|
])
|
||||||
|
->join('pedidos', 'pedidos.id = ordenes_trabajo.pedido_id', 'left')
|
||||||
|
->join('pedidos_linea', 'pedidos.id = pedidos_linea.pedido_id', 'left')
|
||||||
|
->join('presupuestos', 'presupuestos.id = pedidos_linea.presupuesto_id', 'left')
|
||||||
|
->join('presupuesto_direcciones', 'presupuestos.id = presupuesto_direcciones.presupuesto_id', 'left')
|
||||||
|
->join('orden_trabajo_dates', 'orden_trabajo_dates.orden_trabajo_id = ordenes_trabajo.id', 'left')
|
||||||
|
->where('ordenes_trabajo.deleted_at', null)
|
||||||
|
->where('orden_trabajo_dates.encuadernacion_at !=', null)
|
||||||
|
|
||||||
|
//->where('orden_trabajo_dates.fecha_encuadernado_at >=', 0)
|
||||||
|
//->where('ordenes_trabajo.fecha_entrega_warning >=', date("Y-m-d H:i:s"))
|
||||||
|
->groupBy('ordenes_trabajo.id');
|
||||||
|
return $query;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -79,6 +79,79 @@ class LogisticaService
|
|||||||
return $builder;
|
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()
|
public static function findForNewEnvio()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -149,26 +149,41 @@
|
|||||||
|
|
||||||
<div class="col-sm-4 px-3">
|
<div class="col-sm-4 px-3">
|
||||||
|
|
||||||
<div id="proximosEnvios" class="card overflow-hidden" style="height: 100px; ">
|
|
||||||
<div>Java</div>
|
<div class="accordion accordion-bordered mt-3 mb-5" id="accordioAlbaranes">
|
||||||
<div>PHP</div>
|
|
||||||
<div>Lua</div>
|
<div class="card accordion-item">
|
||||||
<div>SQL</div>
|
<h2 class="accordion-header" id="headingAlbaranes">
|
||||||
<div>Java</div>
|
<button type="button" class="accordion-button" data-bs-toggle="collapse"
|
||||||
<div>PHP</div>
|
data-bs-target="#proximosEnviosTip" aria-expanded="false"
|
||||||
<div>Lua</div>
|
aria-controls="proximosEnviosTip">
|
||||||
<div>SQL</div>
|
<h4>Proximos envíos (1 semana)</h4>
|
||||||
<div>Java</div>
|
</button>
|
||||||
<div>PHP</div>
|
</h2>
|
||||||
<div>Lua</div>
|
<div id="proximosEnviosTip" class="accordion-collapse collapse"
|
||||||
<div>SQL</div>
|
data-bs-parent="#accordioAlbaranes">
|
||||||
<div>Java</div>
|
<div id="" class="accordion-body">
|
||||||
<div>PHP</div>
|
|
||||||
<div>Lua</div>
|
<table id="tableProximosEnvios"
|
||||||
<div>SQL</div>
|
class="table table-striped table-hover w-100">
|
||||||
<!-- ... -->
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><?= lang("Logistica.ordenTrabajo") ?></th>
|
||||||
|
<th><?= lang("Logistica.fechaEncuadernado") ?></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -218,8 +233,8 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2 px-3">
|
<div class="col-sm-2 px-3">
|
||||||
<button id="btnImprimirEtiquetas" name="btnImprimirEtiquetas" tabindex="1"
|
<button id="btnImprimirEtiquetas" name="btnImprimirEtiquetas"
|
||||||
class="btn btn-info w-100">
|
tabindex="1" class="btn btn-info w-100">
|
||||||
<?= lang("Logistica.imprimirEtiquetas") ?>
|
<?= lang("Logistica.imprimirEtiquetas") ?>
|
||||||
<i class="ti ti-printer"></i>
|
<i class="ti ti-printer"></i>
|
||||||
</button>
|
</button>
|
||||||
@ -230,8 +245,9 @@
|
|||||||
<label for="impresoraEtiquetas" class="form-label">
|
<label for="impresoraEtiquetas" class="form-label">
|
||||||
<?= lang("Logistica.impresoraEtiquetas") ?>
|
<?= lang("Logistica.impresoraEtiquetas") ?>
|
||||||
</label>
|
</label>
|
||||||
<select id="impresoraEtiquetas" name="impresora_etiquetas" tabindex="1"
|
<select id="impresoraEtiquetas" name="impresora_etiquetas"
|
||||||
maxlength="50" class="form-control select2bs2" style="width: 100%;">
|
tabindex="1" maxlength="50" class="form-control select2bs2"
|
||||||
|
style="width: 100%;">
|
||||||
<?php foreach ($envioEntity->impresoras as $impresora): ?>
|
<?php foreach ($envioEntity->impresoras as $impresora): ?>
|
||||||
<option value="<?= $impresora->id ?>">
|
<option value="<?= $impresora->id ?>">
|
||||||
<?= $impresora->name ?>
|
<?= $impresora->name ?>
|
||||||
@ -294,7 +310,8 @@
|
|||||||
<?= lang("Logistica.cajas") ?>
|
<?= lang("Logistica.cajas") ?>
|
||||||
</label>
|
</label>
|
||||||
<input type="number" id="cajas" name="cajas" tabindex="1" maxlength="50"
|
<input type="number" id="cajas" name="cajas" tabindex="1" maxlength="50"
|
||||||
class="form-control" value="<?= old('cajas', $envioEntity->cajas) ?>">
|
class="form-control"
|
||||||
|
value="<?= old('cajas', $envioEntity->cajas) ?>">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -335,8 +352,9 @@
|
|||||||
<label for="codigoSeguimiento" class="form-label">
|
<label for="codigoSeguimiento" class="form-label">
|
||||||
<?= lang("Logistica.codigoSeguimiento") ?>
|
<?= lang("Logistica.codigoSeguimiento") ?>
|
||||||
</label>
|
</label>
|
||||||
<input type="text" id="codigoSeguimiento" name="codigo_seguimiento" tabindex="1"
|
<input type="text" id="codigoSeguimiento" name="codigo_seguimiento"
|
||||||
maxlength="100" class="form-control" <?= ($envioEntity->finalizado == 0) ? '' : 'readonly' ?>
|
tabindex="1" maxlength="100" class="form-control"
|
||||||
|
<?= ($envioEntity->finalizado == 0) ? '' : 'readonly' ?>
|
||||||
value="<?= esc(old('codigo_seguimiento', $envioEntity->codigo_seguimiento)) ?>">
|
value="<?= esc(old('codigo_seguimiento', $envioEntity->codigo_seguimiento)) ?>">
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-3 px-3">
|
<div class="col-sm-3 px-3">
|
||||||
@ -353,8 +371,9 @@
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</select>
|
</select>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<input type="text" id="empresaMensajeriaInput" name="empresa_mensajeria_input"
|
<input type="text" id="empresaMensajeriaInput"
|
||||||
tabindex="1" maxlength="100" class="form-control" readonly
|
name="empresa_mensajeria_input" tabindex="1" maxlength="100"
|
||||||
|
class="form-control" readonly
|
||||||
value="<?= old('empresa_mensajeria', $envioEntity->proveedor_nombre) ?>">
|
value="<?= old('empresa_mensajeria', $envioEntity->proveedor_nombre) ?>">
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -20,6 +20,7 @@ class EnvioEdit {
|
|||||||
];
|
];
|
||||||
|
|
||||||
this.table = null;
|
this.table = null;
|
||||||
|
this.tableProximosEnvios = null;
|
||||||
|
|
||||||
this.buscarPedidos = new ClassSelect($("#buscadorPedidos"), '/logistica/selectAddLinea', "", true, { 'envio': $("#id").val() });
|
this.buscarPedidos = new ClassSelect($("#buscadorPedidos"), '/logistica/selectAddLinea', "", true, { 'envio': $("#id").val() });
|
||||||
|
|
||||||
@ -43,12 +44,6 @@ class EnvioEdit {
|
|||||||
this.proveedor.init();
|
this.proveedor.init();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($("#proximosEnvios").length) {
|
|
||||||
new PerfectScrollbar(document.getElementById('proximosEnvios'), {
|
|
||||||
wheelPropagation: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
this.table = $('#tableLineasEnvio').DataTable({
|
this.table = $('#tableLineasEnvio').DataTable({
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: true,
|
serverSide: true,
|
||||||
@ -101,6 +96,46 @@ class EnvioEdit {
|
|||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.tableProximosEnvios = $('#tableProximosEnvios').DataTable({
|
||||||
|
processing: true,
|
||||||
|
serverSide: true,
|
||||||
|
autoWidth: true,
|
||||||
|
responsive: true,
|
||||||
|
scrollX: true,
|
||||||
|
orderCellsTop: true,
|
||||||
|
orderable: false,
|
||||||
|
order: [[1, 'asc']],
|
||||||
|
lengthMenu: [5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500],
|
||||||
|
pageLength: 5,
|
||||||
|
"dom": 'tp',
|
||||||
|
"ajax": {
|
||||||
|
"url": "/logistica/datatableProximosEnvios/" + $('#id').val(),
|
||||||
|
},
|
||||||
|
"columns": [
|
||||||
|
{data: 'ot'},
|
||||||
|
{data: 'fechaEncuadernado'}
|
||||||
|
],
|
||||||
|
"language": {
|
||||||
|
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
|
||||||
|
},
|
||||||
|
"columnDefs": [
|
||||||
|
{
|
||||||
|
"targets": [0, 1],
|
||||||
|
"className": "text-center",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
drawCallback: function(){
|
||||||
|
$(this.api().table().container()).find('table').css('width', '100%');
|
||||||
|
this.api().columns.adjust();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#proximosEnviosTip' + this.id).on('shown.bs.collapse', () => {
|
||||||
|
if (this.tableProximosEnvios) {
|
||||||
|
this.tableProximosEnvios.columns.adjust().draw(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
$('#btnImprimirEtiquetas').on('click', () => {
|
$('#btnImprimirEtiquetas').on('click', () => {
|
||||||
const table = this.table;
|
const table = this.table;
|
||||||
const selectedRows = table.rows({ page: 'current' }).nodes().filter((node) => {
|
const selectedRows = table.rows({ page: 'current' }).nodes().filter((node) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user