diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 95774bd2..55d5f84b 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -522,6 +522,9 @@ $routes->group('albaranes', ['namespace' => 'App\Controllers\Albaranes'], functi $routes->post('updateAlbaranLinea', 'Albaran::updateAlbaranLinea'); $routes->post('addIvaAlbaran', 'Albaran::addLineasIva'); $routes->post('nuevaLineaAlbaran', 'Albaran::addBlankLineaAlbaran'); + $routes->get('datatable', 'Albaran::datatable', ['as' => 'dataTableOfAlbaranes']); + $routes->get('getAlbaran', 'Albaran::getAlbaran'); + $routes->get('edit/(:num)', 'Albaran::editAlbaran/$1', ['as' => 'editarAlbaran']); }); $routes->resource('albaranes', ['namespace' => 'App\Controllers\Pedidos', 'controller' => 'Albaran', 'except' => 'show,new,create,update']); @@ -821,6 +824,9 @@ $routes->group('logistica', ['namespace' => 'App\Controllers\Logistica'], functi $routes->get('selectForNewEnvio', 'LogisticaController::findForNewEnvio'); $routes->get('selectDireccionForEnvio', 'LogisticaController::selectDireccionForEnvio'); $routes->post('imprimirEtiquetas', 'LogisticaController::imprimirEtiquetas'); + + $routes->get('listAlbaranes', 'LogisticaController::listAlbaranes', ['as' => 'albaranesList']); + }); /* diff --git a/ci4/app/Controllers/Albaranes/Albaran.php b/ci4/app/Controllers/Albaranes/Albaran.php index 109d00f0..8682fb99 100755 --- a/ci4/app/Controllers/Albaranes/Albaran.php +++ b/ci4/app/Controllers/Albaranes/Albaran.php @@ -47,6 +47,18 @@ class Albaran extends \App\Controllers\BaseResourceController } } + public function editAlbaran($albaran_id){ + + $albaran = $this->model->find($albaran_id); + if ($albaran == false) { + return redirect()->to(base_url('albaranesList')); + } + $this->viewData['boxTitle'] = lang('Albaran.editAlbaran') . ' ' . $albaran->numero_albaran; + $this->viewData['albaranId'] = $albaran_id; + + return view('themes/vuexy/form/logistica/albaranes/viewAlbaranesEdit', $this->viewData); + } + public function addLinea($albaran_id) { @@ -305,6 +317,23 @@ class Albaran extends \App\Controllers\BaseResourceController } } + public function getAlbaran() + { + + if ($this->request->isAJAX()) { + + $id = $this->request->getGet('id'); + $albaran = $this->model->getAlbaranData($id); + $data = [ + 'success' => true, + 'data' => $albaran, + ]; + return $this->respond($data); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + public function generateAlbaran() { @@ -324,6 +353,32 @@ class Albaran extends \App\Controllers\BaseResourceController } } + public function datatable(){ + + $pedidosFilter = $this->request->getGet('pedidosFilter'); + $q = $this->model->getDatatableQuery(); + + if($pedidosFilter != null && !empty($pedidosFilter)) { + $q->groupStart(); + $q->like('t4.id', $pedidosFilter); + $q->groupEnd(); + } + $result = DataTable::of($q) + ->add( + "action", + callback: function ($q) { + return ' +
+ + +
+ '; + } + ); + + return $result->toJson(returnAsObject: true); + } + public function datatablesLineasAlbaran() { diff --git a/ci4/app/Controllers/Logistica/LogisticaController.php b/ci4/app/Controllers/Logistica/LogisticaController.php index ecc38ba2..f293bb3e 100755 --- a/ci4/app/Controllers/Logistica/LogisticaController.php +++ b/ci4/app/Controllers/Logistica/LogisticaController.php @@ -69,6 +69,17 @@ class LogisticaController extends BaseController return view(static::$viewPath . 'viewLogisticaSelectEnvios', $viewData); } + public function listAlbaranes(){ + $viewData = [ + 'currentModule' => static::$controllerSlug, + 'boxTitle' => lang('Albaran.albaranes'), + 'usingServerSideDataTable' => true, + ]; + + $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class + + return view(static::$viewPath . '/albaranes/viewAlbaranesList', $viewData); + } public function findForNewEnvio() { diff --git a/ci4/app/Database/Migrations/2025-04-26-180000_AddFerroProtoPresupuestoDirecciones.php b/ci4/app/Database/Migrations/2025-04-26-180000_AddFerroProtoPresupuestoDirecciones.php new file mode 100644 index 00000000..a80e7131 --- /dev/null +++ b/ci4/app/Database/Migrations/2025-04-26-180000_AddFerroProtoPresupuestoDirecciones.php @@ -0,0 +1,36 @@ + [ + "type" => "INT", + "unsigned" => true, + "default" => 0, + "comment" => "Click iniciales de una tarea de impresion" + ], + "click_end" => [ + "type" => "INT", + "unsigned" => true, + "default" => 0, + "comment" => "Click finales de una tarea de impresion" + ], + ]; + public function up() + { + $this->forge->addColumn('orden_trabajo_tareas', $this->COLUMNS); + } + + public function down() + { + $this->forge->dropColumn('orden_trabajo_tareas', array_keys($this->COLUMNS)); + } +} diff --git a/ci4/app/Language/es/Albaran.php b/ci4/app/Language/es/Albaran.php index 31966e67..ac7aace4 100644 --- a/ci4/app/Language/es/Albaran.php +++ b/ci4/app/Language/es/Albaran.php @@ -1,13 +1,19 @@ 'ID', 'fechaCreacion' => 'Fecha de creación', "fechaAlbaran" => 'Fecha de albarán', 'numEnvio' => 'Número de envío', 'cliente' => 'Cliente', 'albaran' => 'Albarán', + 'numAlbaran' => 'Número de albarán', + 'numPedidos' => 'Número de Pedidos', + 'unidadesTotal' => 'Unidades Totales', + 'albaranes' => 'Albaranes', 'att' => 'Att', 'direccion' => 'Dirección', 'cajas' => 'Cajas', + 'acciones' => 'Acciones', 'unidades' => 'Unidades', 'titulo' => 'Título', @@ -28,4 +34,6 @@ return [ 'iva4' => 'IVA 4%', 'iva21' => 'IVA 21%', + + 'editAlbaran' => 'Editar albarán', ]; \ No newline at end of file diff --git a/ci4/app/Models/Albaranes/AlbaranModel.php b/ci4/app/Models/Albaranes/AlbaranModel.php index 42b492f2..a8c871a3 100644 --- a/ci4/app/Models/Albaranes/AlbaranModel.php +++ b/ci4/app/Models/Albaranes/AlbaranModel.php @@ -173,6 +173,37 @@ class AlbaranModel extends \App\Models\BaseModel return $albaran_data; } + + public function getAlbaranData($albaran_id=null){ + if (!$albaran_id) { + return []; + } + + $albaran_data = $this->db->table('albaranes t1') + ->select(" + t1.id, + t1.att_albaran AS att, + t1.direccion_albaran AS direccion, + t1.envio_id, + t1.numero_albaran AS numero_albaran, + DATE_FORMAT(t1.created_at, '%d/%m/%Y') AS fecha_creacion, + DATE_FORMAT(t1.fecha_albaran, '%d/%m/%Y') AS fecha_albaran, + t1.mostrar_precios AS mostrar_precios, + t2.nombre AS cliente, + t1.cajas AS cajas + ") + ->join('clientes t2', 't1.cliente_id = t2.id', 'left') + ->where('t1.id', $albaran_id) + ->where('t1.deleted_at IS NULL') + ->get() + ->getResultObject(); + if (count($albaran_data) == 0) { + return []; + } + + return $albaran_data[0]; + } + /** * Get resource data for creating PDFs. * @@ -203,4 +234,25 @@ class AlbaranModel extends \App\Models\BaseModel return $builder; } + + public function getDatatableQuery() + { + $builder = $this->db + ->table($this->table . " t1") + ->select( + "t1.id, t1.numero_albaran as numero_albaran, t1.envio_id as envio_id, GROUP_CONCAT(DISTINCT t4.id) AS pedidos, + t5.nombre as cliente, t1.att_albaran as att, t1.direccion_albaran as direccion, SUM(t2.cantidad) as unidades_total, + t1.cajas as cajas" + ) + ->join("albaranes_lineas t2", "t1.id = t2.albaran_id", "left") + ->join("pedidos_linea t3", "t2.pedido_linea_id = t3.id", "left") + ->join("pedidos t4", "t3.pedido_id = t4.id", "left") + ->join("clientes t5", "t1.cliente_id = t5.id", "left"); + + $builder->where("t1.deleted_at IS NULL"); + $builder->where("t2.deleted_at IS NULL"); + $builder->groupBy("t1.id"); + + return $builder; + } } \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/logistica/albaranes/viewAlbaranesEdit.php b/ci4/app/Views/themes/vuexy/form/logistica/albaranes/viewAlbaranesEdit.php new file mode 100644 index 00000000..15cdd857 --- /dev/null +++ b/ci4/app/Views/themes/vuexy/form/logistica/albaranes/viewAlbaranesEdit.php @@ -0,0 +1,35 @@ +include("themes/_commonPartialsBs/sweetalert") ?> +include('themes/_commonPartialsBs/datatables') ?> +include("themes/_commonPartialsBs/select2bs5") ?> +extend('themes/vuexy/main/defaultlayout') ?> + +section('content'); ?> +
+
+
+
+

+
+
+ + + + + +
+
+
+
+ + +endSection() ?> + + +section('css') ?> + +endSection() ?> + +section('additionalExternalJs') ?> + + +endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/logistica/albaranes/viewAlbaranesList.php b/ci4/app/Views/themes/vuexy/form/logistica/albaranes/viewAlbaranesList.php new file mode 100644 index 00000000..fc5d63ca --- /dev/null +++ b/ci4/app/Views/themes/vuexy/form/logistica/albaranes/viewAlbaranesList.php @@ -0,0 +1,65 @@ +include("themes/_commonPartialsBs/sweetalert") ?> +include('themes/_commonPartialsBs/datatables') ?> +include("themes/_commonPartialsBs/select2bs5") ?> +extend('themes/vuexy/main/defaultlayout') ?> + +section('content'); ?> +
+
+
+
+

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+
+ + +endSection() ?> + + +section('css') ?> + +endSection() ?> + +section('additionalExternalJs') ?> + + +endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/logistica/viewPanelLogistica.php b/ci4/app/Views/themes/vuexy/form/logistica/viewPanelLogistica.php index 76698bb6..d716dbe5 100755 --- a/ci4/app/Views/themes/vuexy/form/logistica/viewPanelLogistica.php +++ b/ci4/app/Views/themes/vuexy/form/logistica/viewPanelLogistica.php @@ -25,7 +25,7 @@ " alt="Etiquetas de títulos">
-
+
" alt="Albaranes">
diff --git a/httpdocs/assets/js/safekat/components/albaranComponent.js b/httpdocs/assets/js/safekat/components/albaranComponent.js index 92ca1c32..c3f300aa 100644 --- a/httpdocs/assets/js/safekat/components/albaranComponent.js +++ b/httpdocs/assets/js/safekat/components/albaranComponent.js @@ -1,14 +1,17 @@ import DatePicker from "./datepicker.js"; class AlbaranComponent { - constructor(item) { + constructor(item, url_after_delete = '') { + + this.url_after_delete = url_after_delete; + this.item = item; this.id = item.id; this.numero = item.numero_albaran; this.cliente = item.cliente; this.att = item.att; this.direccion = item.direccion; - this.envio_id = item.envio_id; + this.envio_id = item.envio_id != null ? item.envio_id : ''; this.fecha = null; if(this.item.fecha_albaran != null){ const [dia, mes, anio] = item.fecha_albaran.split('/'); @@ -461,6 +464,9 @@ class AlbaranComponent { if (response.success) { // quitar del dom el albarán $(`#accordioAlbaran${albaranId}`).remove(); + if(this.url_after_delete != ''){ + window.location.href = this.url_after_delete; + } } else { Swal.fire({ title: 'Error', diff --git a/httpdocs/assets/js/safekat/pages/albaranes/edit.js b/httpdocs/assets/js/safekat/pages/albaranes/edit.js new file mode 100644 index 00000000..d7e85649 --- /dev/null +++ b/httpdocs/assets/js/safekat/pages/albaranes/edit.js @@ -0,0 +1,43 @@ +import Ajax from '../../components/ajax.js'; +import AlbaranComponent from '../../components/albaranComponent.js'; + +$(() => { + + const dropdown = document.querySelector(".dropdown-language"); + const activeItem = dropdown.querySelector(".dropdown-menu .dropdown-item"); + let locale = 'es'; + if (activeItem) { + locale = activeItem.getAttribute("data-language"); + } + + new Ajax('/translate/getTranslation', { locale: locale, translationFile: ['Albaran'] }, {}, + function (translations) { + window.language = JSON.parse(translations); + new Ajax( + '/albaranes/getAlbaran', + { + id: $('#id').val() + }, + {}, + function (data, headers, success, error, type) { + if (success) { + const albaran = new AlbaranComponent(data.data, '/logistica/listAlbaranes'); + albaran.mount('#albaranContainer'); + $('.accordion-button').trigger('click'); + + } else { + popErrorAlert(error); + } + }, + function (data, headers, success, error, type) { + popErrorAlert(error); + } + ).get(); + }, + function (error) { + console.log("Error getting translations:", error); + } + ).post(); + + +}); \ No newline at end of file diff --git a/httpdocs/assets/js/safekat/pages/albaranes/list.js b/httpdocs/assets/js/safekat/pages/albaranes/list.js new file mode 100644 index 00000000..06c91cea --- /dev/null +++ b/httpdocs/assets/js/safekat/pages/albaranes/list.js @@ -0,0 +1,160 @@ +import Ajax from "../../components/ajax.js"; + +$(() => { + + let pedidosFilter = ''; + + const dropdown = document.querySelector(".dropdown-language"); + const activeItem = dropdown.querySelector(".dropdown-menu .dropdown-item"); + let locale = 'es'; + if (activeItem) { + locale = activeItem.getAttribute("data-language"); + } + + new Ajax('/translate/getTranslation', { locale: locale, translationFile: ['Albaran'] }, {}, + function (translations) { + window.language = JSON.parse(translations); + }, + function (error) { + console.log("Error getting translations:", error); + } + ).post(); + + + $('#btnAddEnvio').on('click', () => { + const pedido_id = selectPedidos.getVal(); + const direccionSeleccionada = selectDirecciones.getText(); + $.post('/albaranes/datatable', { + pedido_id: pedido_id, + direccion: direccionSeleccionada + }, function (response) { + if (response.status) { + window.open(`${window.location.origin}/logistica/envio/${response.data.id_envio}`); + selectDirecciones.empty(); + selectPedidos.empty(); + $('.select-direcciones').addClass('d-none'); + $('.add-envio').addClass('d-none'); + } else { + popErrorAlert(response.message); + } + }).fail(function (xhr, status, error) { + popErrorAlert(error); + }); + }) + + + const tableAlbaranes = $('#tableOfAlbaranes').DataTable({ + processing: true, + serverSide: true, + autoWidth: true, + responsive: true, + scrollX: true, + orderCellsTop: true, + lengthMenu: [5, 10, 25, 50, 75, 100, 250, 500, 1000, 2500], + pageLength: 50, + "dom": 'lBrtip', + "ajax": { + "url": "/albaranes/datatable", + "data": function (d) { + d.pedidosFilter = pedidosFilter; + } + }, + "columns": [ + { "data": "id" }, + { "data": "numero_albaran" }, + { "data": "envio_id" }, + { "data": "pedidos" }, + { "data": "cliente" }, + { "data": "att" }, + { "data": "direccion" }, + { "data": "unidades_total" }, + { "data": "cajas" }, + { "data": "action" } + + ], + "language": { + url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json" + }, + "columnDefs": [ + { + orderable: false, + searchable: false, + targets: [9] + }, + ], + "order": [[0, "desc"]], + }); + + $(document).on('click', '.btn-delete', function (e) { + const data = { + albaranId: $(this).attr('data-id') + }; + const url = '/albaranes/borrarAlbaran'; + + Swal.fire({ + title: window.language.Albaran.borrarAlbaran, + text: window.language.Albaran.borrarAlbaranConfirm, + icon: 'warning', + showCancelButton: true, + confirmButtonColor: '#3085d6', + cancelButtonColor: '#d33', + confirmButtonText: window.language.Albaran.borrar, + cancelButtonText: window.language.Albaran.cancelar, + customClass: { + confirmButton: 'btn btn-primary me-1', + cancelButton: 'btn btn-outline-secondary' + }, + buttonsStyling: false + }).then((result) => { + + + $.ajax({ + url: url, + type: 'POST', + data: data, + success: (response) => { + if (response.success) { + tableAlbaranes.draw(); + } else { + Swal.fire({ + title: 'Error', + text: 'No se ha podido borrar el albarán', + icon: 'error', + showCancelButton: false, + confirmButtonColor: '#3085d6', + confirmButtonText: 'Ok', + customClass: { + confirmButton: 'btn btn-primary me-1', + }, + buttonsStyling: false + }); + } + }, + error: (xhr, status, error) => { + console.error(error); + } + }); + }); + + }); + + + $(document).on('click', '.btn-edit', function (e) { + window.location.href = '/albaranes/edit/' + $(this).attr('data-id'); + }); + + $(document).on("keyup", ".albaran-filter", (event) => { + let columnName = $(event.currentTarget).attr("name"); + let columnIndex = $('#tableOfAlbaranes').DataTable().columns().eq(0).filter(function (index) { + return $('#tableOfAlbaranes').DataTable().column(index).dataSrc() === columnName; + })[0]; + $('#tableOfAlbaranes').DataTable().column(columnIndex).search($(event.currentTarget).val()).draw() + }) + + + $(document).on("keyup", ".albaran-filter-pedidos", (event) => { + pedidosFilter = $(event.currentTarget).val(); + $('#tableOfAlbaranes').DataTable().ajax.reload(); + }) + +}); \ No newline at end of file