generando el grupo de envios

This commit is contained in:
2025-04-14 22:00:52 +02:00
parent c157b1215c
commit 16dc39ee15
7 changed files with 149 additions and 25 deletions

View File

@ -774,7 +774,7 @@ $routes->group('logistica', ['namespace' => 'App\Controllers\Logistica'], functi
$routes->get('print/label/test', 'LogisticaController::print_test_label');
$routes->get('panel', 'LogisticaController::panel', ['as' => 'LogisticaPanel']);
$routes->get('selectEnvios/(:any)', 'LogisticaController::selectorEnvios/$1', ['as' => 'selectEnvios']);
$routes->get('buscar/(:any)', 'LogisticaController::searchPedidoOrISBN/$1', ['as' => 'buscarPedidoOrISBN']);
});
/*

View File

@ -4,6 +4,7 @@ namespace App\Controllers\Logistica;
use App\Controllers\BaseController;
use App\Services\ImpresoraEtiquetaService;
use App\Services\LogisticaService;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
@ -70,28 +71,14 @@ class LogisticaController extends BaseController
public function searchPedidoOrISBN($search = ""){
$modelPedido = model('App\Models\Pedidos\PedidoModel');
$search = trim($search);
$searchClean = str_replace('-', '', $search);
$modelPedido = model('App\Models\Pedidos\PedidoModel');
// Builder con joins
$builder = $modelPedido->builder();
$builder->select('pedidos.*');
$builder->join('pedidos_linea', 'pedidos_linea.pedido_id = pedidos.id', 'left');
$builder->join('presupuestos', 'presupuestos.id = pedidos_linea.presupuesto_id', 'left');
// Agrupar condiciones: por ID exacto o por ISBN sin guiones
$builder->groupStart()
->where('pedidos.id', $search)
->orWhere("REPLACE(presupuestos.isbn, '-', '')", $searchClean)
->groupEnd();
$result = $builder->get()->getResult();
$response = [
'status' => true,
'data' => $result,
];
if(empty($search)){
$result = [
'status' => false,
'message' => lang('Logistica.errors.noDataToFind'),
];
return $this->response->setJSON($result);
}
$result = LogisticaService::findPedidoOrISBN($search);
return $this->response->setJSON($result);
}
}

View File

@ -382,6 +382,16 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController
'descripcion' => $linea_pedido->concepto
]);
// se actualiza el totalizador del pedido
$total_tirada = $pedidoModel
->selectSum('cantidad')
->where('pedido_id', $idPedido)
->first()->cantidad;
$pedidoModel = model('App\Models\Pedidos\PedidoModel');
$pedidoModel->update($idPedido, [
'total_tirada' => $total_tirada
]);
// se actualiza la factura
$linea_pedido = $this->model->generarLineaPedido($id, true, $idPedido)[0];
$facturaLineaModel = model('App\Models\Facturas\FacturaLineaModel');

View File

@ -26,4 +26,10 @@ return [
'finalizado' => 'Finalizado',
'acciones' => 'Acciones',
'backToPanel' => 'Volver al panel',
'errors' => [
'noDataToFind' => 'No se ha introducido ningún dato para buscar',
'notFound' => 'No se encuentra el pedido o ISBN',
'noAddresses' => 'El pedido no tiene direcciones de envío',
],
];

View File

@ -0,0 +1,67 @@
<?php
namespace App\Services;
use Config\Services;
class LogisticaService
{
public static function findPedidoOrISBN($search)
{
$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->join('pedidos_linea', 'pedidos_linea.pedido_id = pedidos.id', 'left');
$builder->join('presupuestos', 'presupuestos.id = pedidos_linea.presupuesto_id', 'left');
$builder->groupStart()
->where('pedidos.id', $search)
->whereIn('pedidos.estado', ['finalizado'])
->orWhere("REPLACE(presupuestos.isbn, '-', '')", $searchClean)
->groupEnd();
$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;
}
// 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;
}
return $response;
}
}

View File

@ -11,6 +11,8 @@
</div>
<div class="card-body">
<?= view("themes/_commonPartialsBs/_alertBoxes") ?>
<div class="card accordion-item active mb-5">
<h4 class="accordion-header px-4 py-3">
<?= lang("Logistica.nuevoEnvio") ?>
@ -72,7 +74,8 @@
</div>
<div class="mt-3">
<button type="button" class="btn btn-secondary" id="btnImprimirEtiquetas" onclick="window.location.href='<?= route_to('LogisticaPanel') ?>'">
<button type="button" class="btn btn-secondary" id="btnImprimirEtiquetas"
onclick="window.location.href='<?= route_to('LogisticaPanel') ?>'">
<?= lang('Logistica.backToPanel') ?>
</button>
</div>
@ -80,4 +83,14 @@
</div>
</div>
<?= $this->endSection() ?>
<?= $this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.css') ?>" />
<?= $this->endSection() ?>
<?= $this->section('additionalExternalJs') ?>
<script src="<?= site_url('themes/vuexy/vendor/libs/sweetalert2/sweetalert2.js') ?>"></script>
<script type="module" src="<?= site_url("assets/js/safekat/pages/logistica/envio.js") ?>"></script>
<?= $this->endSection() ?>

View File

@ -0,0 +1,41 @@
import Ajax from '../../components/ajax.js';
$(()=>{
$('#buscadorPedidos').on('keydown', function(e) {
if (e.key === 'Enter' || e.keyCode === 13) {
e.preventDefault(); // Evita el submit si está dentro de un form
let search = $(this).val().trim();
new Ajax(
'/logistica/buscar/'+search,
{},
{},
function(response) {
if(response.data.createAlbaran){
Swal.fire({
title: 'Atención!',
text: 'El pedido no contenía ningún albarán. Se han añadido automáticamente.',
icon: 'warning',
showCancelButton: false,
confirmButtonColor: '#3085d6',
confirmButtonText: 'Ok',
customClass: {
confirmButton: 'btn btn-primary me-1',
},
buttonsStyling: false
}).then(() => {
//window.open(`${urlObj.origin}` + '/presupuestoadmin/edit/' + response.id);
});
}
},
function(xhr, status, error) {
popErrorAlert(error.responseJSON.message);
}
).get();
}
});
});