diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 06be3baa..a9e395e1 100755 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -548,6 +548,7 @@ $routes->group('facturas', ['namespace' => 'App\Controllers\Facturacion'], funct $routes->post('updateCabecera/(:any)', 'Facturas::updateCabecera/$1', ['as' => 'updateCabecera']); $routes->post('datatablePagos/(:any)', 'FacturasPagos::datatable/$1', ['as' => 'dataTableOfPagosFacturas']); $routes->post('editorPagos', 'FacturasPagos::datatable_editor', ['as' => 'editorOfPagosFacturas']); + $routes->post('deleteFacturaLineaPago', 'Facturas::deleteLineaPago', ['as' => 'deleteLineaPago']); $routes->post('datatablePedidos', 'Facturas::datatablePedidos', ['as' => 'dataTableOfFacturasPedido']); $routes->get('getdatoscliente/(:any)', 'Facturas::getDatosFacturacionClienteForm/$1'); }); diff --git a/ci4/app/Controllers/Facturacion/Facturas.php b/ci4/app/Controllers/Facturacion/Facturas.php index d8feb554..ea45c3c7 100755 --- a/ci4/app/Controllers/Facturacion/Facturas.php +++ b/ci4/app/Controllers/Facturacion/Facturas.php @@ -787,6 +787,32 @@ class Facturas extends \App\Controllers\BaseResourceController } } + public function deleteLineaPago() + { + + if ($this->request->isAJAX()) { + + $postData = $this->request->getPost(); + $factura_id = $postData['factura_id'] ?? 0; + $pago_id = $postData['pago_id'] ?? 0; + + $model_factura_pago = model('\App\Models\Facturas\FacturaPagoModel'); + $model_factura_pago->update($pago_id, [ + 'deleted_at' => date('Y-m-d H:i:s'), + 'user_updated_id' => auth()->user()->id, + ]); + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + $data = [ + $csrfTokenName => $newTokenHash + ]; + return $this->respond($data); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + public function validar($factura_id) { diff --git a/ci4/app/Controllers/Facturacion/FacturasLineas.php b/ci4/app/Controllers/Facturacion/FacturasLineas.php index 42a00d05..0c12c403 100755 --- a/ci4/app/Controllers/Facturacion/FacturasLineas.php +++ b/ci4/app/Controllers/Facturacion/FacturasLineas.php @@ -16,14 +16,15 @@ class FacturasLineas extends \App\Controllers\BaseResourceController protected static $controllerSlug = 'factura-lineas'; - public function datatable($factura_id = null){ + public function datatable($factura_id = null) + { if ($this->request->isAJAX() && $factura_id != null) { $reqData = $this->request->getPost(); - if (!isset($reqData['draw']) || !isset($reqData['columns']) ) { + if (!isset($reqData['draw']) || !isset($reqData['columns'])) { $errstr = 'No data available in response to this specific request.'; - $response = $this->respond(Collection::datatable( [], 0, 0, $errstr ), 400, $errstr); + $response = $this->respond(Collection::datatable([], 0, 0, $errstr), 400, $errstr); return $response; } $start = $reqData['start'] ?? 0; @@ -46,31 +47,32 @@ class FacturasLineas extends \App\Controllers\BaseResourceController } - public function deleteLinea($factura_linea_id = 0){ - + public function deleteLinea($factura_linea_id = 0) + { + if (!empty(static::$pluralObjectNameCc) && !empty(static::$singularObjectNameCc)) { - $objName = mb_strtolower(lang(ucfirst(static::$pluralObjectNameCc).'.'.static::$singularObjectNameCc)); + $objName = mb_strtolower(lang(ucfirst(static::$pluralObjectNameCc) . '.' . static::$singularObjectNameCc)); } else { $objName = lang('Basic.global.record'); } - if($factura_linea_id == 0){ + if ($factura_linea_id == 0) { return $this->failNotFound(lang('Basic.global.deleteError', [$objName])); } $facturaLinea = $this->model->find($factura_linea_id); - if($facturaLinea == null){ + if ($facturaLinea == null) { return $this->failNotFound(lang('Basic.global.deleteError', [$objName])); } - if($facturaLinea->pedido_linea_impresion_id != null){ - $this->model->deleteFacturasLineasPedido($facturaLinea->factura_id, $facturaLinea->pedido_linea_impresion_id, $facturaLinea->cantidad); + if ($facturaLinea->pedido_linea_impresion_id != null) { + $this->model->deleteFacturasLineasPedido($facturaLinea->factura_id, $facturaLinea->pedido_linea_impresion_id, $facturaLinea->cantidad); } - if($facturaLinea->pedido_maquetacion_id != null){ + if ($facturaLinea->pedido_maquetacion_id != null) { //$this->model->deleteFacturasLineasPedido($facturaLinea->factura_id, $facturaLinea->pedido_maquetacion_id, $facturaLinea->cantidad); } - + $facturaLinea = $this->model->delete($factura_linea_id); $message = lang('Basic.global.deleteSuccess', [lang('Basic.global.record')]); $response = $this->respondDeleted(['id' => $factura_linea_id, 'msg' => $message]); @@ -78,51 +80,86 @@ class FacturasLineas extends \App\Controllers\BaseResourceController } - public function datatable_editor() { + public function datatable_editor() + { if ($this->request->isAJAX()) { include(APPPATH . "ThirdParty/DatatablesEditor/DataTables.php"); // Build our Editor instance and process the data coming from _POST - $response = Editor::inst( $db, 'facturas_lineas' ) + $response = Editor::inst($db, 'facturas_lineas') ->fields( - Field::inst( 'id' ), - Field::inst( 'base' ), - Field::inst( 'total_iva' ), - Field::inst( 'total' ), - Field::inst( 'cantidad' ) - ->validator('Validate::numeric', array( - 'message' => lang('Facturas.validation.numerico')) + Field::inst('id'), + Field::inst('base'), + Field::inst('total_iva'), + Field::inst('total'), + Field::inst('cantidad') + ->validator( + 'Validate::numeric', + array( + 'message' => lang('Facturas.validation.numerico') + ) ) - ->validator('Validate::notEmpty', array( - 'message' => lang('Facturas.validation.requerido')) + ->validator( + 'Validate::notEmpty', + array( + 'message' => lang('Facturas.validation.requerido') + ) ), - Field::inst( 'descripcion' ) - ->validator('Validate::notEmpty', array( - 'message' => lang('Facturas.validation.requerido')) + Field::inst('descripcion') + ->validator( + 'Validate::notEmpty', + array( + 'message' => lang('Facturas.validation.requerido') + ) ), - Field::inst( 'iva' ) - ->validator('Validate::numeric', array( - 'message' => lang('Facturas.validation.numerico')) + Field::inst('iva') + ->validator( + 'Validate::numeric', + array( + 'message' => lang('Facturas.validation.numerico') + ) ) - ->validator('Validate::notEmpty', array( - 'message' => lang('Facturas.validation.requerido')) + ->validator( + 'Validate::notEmpty', + array( + 'message' => lang('Facturas.validation.requerido') + ) ), - Field::inst( 'pedido_linea_impresion_id' ) - ->setFormatter(function($val, $data, $opts) { + Field::inst('total') + ->validator( + 'Validate::numeric', + array( + 'message' => lang('Facturas.validation.numerico') + ) + ) + ->validator( + 'Validate::notEmpty', + array( + 'message' => lang('Facturas.validation.requerido') + ) + ), + Field::inst('pedido_linea_impresion_id') + ->setFormatter(function ($val, $data, $opts) { return $val === '' ? null : $val; }), - Field::inst( 'factura_id' ), - Field::inst( 'user_updated_id' ), + Field::inst('pedido_maquetacion_id') + ->setFormatter(function ($val, $data, $opts) { + return $val === '' ? null : $val; + }), + Field::inst('factura_id'), + Field::inst('user_updated_id'), ) ->on('preCreate', function ($editor, &$values) { $totales = $this->generate_totales( - $values['factura_id'], - $values['pedido_linea_impresion_id'], - $values['total'], - $values['iva'], + $values['factura_id'], + $values['pedido_linea_impresion_id'], + $values['total'], + $values['iva'], $values['cantidad'], - $values['old_cantidad']); + $values['old_cantidad'], + $values['base'] + ); $editor ->field('user_updated_id') ->setValue(auth()->user()->id); @@ -141,12 +178,14 @@ class FacturasLineas extends \App\Controllers\BaseResourceController }) ->on('preEdit', function ($editor, $id, &$values) { $totales = $this->generate_totales( - $values['factura_id'], - $values['pedido_linea_impresion_id'], - $values['total'], - $values['iva'], + $values['factura_id'], + $values['pedido_linea_impresion_id'], + $values['total'], + $values['iva'], $values['cantidad'], - $values['old_cantidad']); + $values['old_cantidad'], + $values['base'] + ); $editor ->field('factura_id') ->setValue($values['factura_id']); @@ -185,8 +224,9 @@ class FacturasLineas extends \App\Controllers\BaseResourceController } } - public function updateTotalesFactura($factura_id = 0){ - if($factura_id == 0){ + public function updateTotalesFactura($factura_id = 0) + { + if ($factura_id == 0) { return; } @@ -194,26 +234,42 @@ class FacturasLineas extends \App\Controllers\BaseResourceController $model->updateTotales($factura_id); } - private function generate_totales($factura_id, $pedido_linea_id, $total, $iva, $cantidad, $old_cantidad) + private function generate_totales($factura_id, $pedido_linea_id, $total, $iva, $cantidad, $old_cantidad, $base_input) { - + // si es una linea que se refiere a pedido if ($pedido_linea_id != null && $factura_id != null) { // se actualiza la cantidad de la linea de pedido en la tabla pivote facturas_pedidos_lineas $this->model->updateFacturaPedidoLinea($factura_id, $pedido_linea_id, $old_cantidad, $cantidad); } - - // se calcula y se actualiza el subtotal, total_iva y total - // redondeando a 4 decimales el precio_unidad y a dos el resto - $precio_unidad = round($total / $old_cantidad, 4); - $base = round($precio_unidad * $cantidad, 2); - $total_iva = round($base * $iva / 100, 2); - $total = round($base + $total_iva, 2); - $values = []; - $values['base'] = $base; - $values['total_iva'] = $total_iva; - $values['total'] = $total; - + + // Si es una linea añadida a mano, el total y el iva tienen que venir metidos a mano + if ($pedido_linea_id != null) { + + // se calcula y se actualiza el subtotal, total_iva y total + // redondeando a 4 decimales el precio_unidad y a dos el resto + $precio_unidad = round($total / $old_cantidad, 4); + $base = round($precio_unidad * $cantidad, 2); + $total_iva = round($base * $iva / 100, 2); + $total = round($base + $total_iva, 2); + $values = []; + $values['base'] = $base; + $values['total_iva'] = $total_iva; + $values['total'] = $total; + } + else{ + // se pasa la base y el iva + $total_iva = round($base_input * $iva / 100, 2); + $total = round($base_input + $total_iva, 2); + + $values = []; + $values['base'] = $base_input; + $values['total_iva'] = $total_iva; + $values['total'] = $total; + + } + + return $values; } } diff --git a/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php b/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php index 3257e01a..013753d8 100755 --- a/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php +++ b/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php @@ -186,10 +186,10 @@ var editor_lineas = new $.fn.dataTable.Editor( { { name: "cantidad", attr: { - type: "text", - name : "cantidad", - class :"autonumeric" - } + type: "text", + name : "cantidad", + class :"autonumeric" + } }, { name: "descripcion", type: "textarea", @@ -199,11 +199,21 @@ var editor_lineas = new $.fn.dataTable.Editor( { } }, { name: "iva", + type: "select", + options: [ + { label: "4%", value: 4 }, + { label: "21%", value: 21 } + ], attr: { - type: "text", - name : "iva", - class :"autonumeric" - } + class: "autonumeric" + } + }, { + name: "base", + attr: { + type: "text", + name : "total", + class :"autonumeric" + } }, { name: "pedido_linea_impresion_id", type: "hidden" @@ -213,9 +223,6 @@ var editor_lineas = new $.fn.dataTable.Editor( { }, { name: "id", type: "hidden" - }, { - name: "base", - type: "hidden" }, ] } ); @@ -480,7 +487,7 @@ var tableLineas = $('#tableOfLineasFactura').DataTable({ return sum; }, 0); - const totalTotal = table.column(10).data().reduce((a, b) => parseFloat(a) + parseFloat(b), 0); + let totalTotal = table.column(10).data().reduce((a, b) => parseFloat(a) + parseFloat(b), 0); autoNumericSubtotal.set(totalSubtotal); autoNumericIVA_4.set(totalIVA_4); @@ -488,6 +495,7 @@ var tableLineas = $('#tableOfLineasFactura').DataTable({ $('#total-iva-sum-4').closest('tr').addClass('d-none'); } else{ + totalTotal += totalIVA_4; $('#total-iva-sum-4').closest('tr').removeClass('d-none'); } autoNumericIVA_21.set(totalIVA_21); @@ -495,6 +503,7 @@ var tableLineas = $('#tableOfLineasFactura').DataTable({ $('#total-iva-sum-21').closest('tr').addClass('d-none'); } else{ + totalTotal += totalIVA_21; $('#total-iva-sum-21').closest('tr').removeClass('d-none'); } autoNumericTotal.set(totalTotal); diff --git a/ci4/app/Views/themes/vuexy/form/facturas/_pagosFacturasItems.php b/ci4/app/Views/themes/vuexy/form/facturas/_pagosFacturasItems.php index 943f8e8d..dd555edf 100755 --- a/ci4/app/Views/themes/vuexy/form/facturas/_pagosFacturasItems.php +++ b/ci4/app/Views/themes/vuexy/form/facturas/_pagosFacturasItems.php @@ -73,6 +73,45 @@ const actionBtns_pagos = function(data) { } +$(document).on('click', '.btn-delete-pago', function(e) { + + const dataId = $(this).attr('data-id'); + const row = $(this).closest('tr'); + if ($.isNumeric(dataId)) { + asyncConfirmDialogWithParams( + "Borrar Linea de pagos", + "¿Está seguro de borrar la línea? Esta acción no se puede deshacer.", + deleteConfirmedLineaPago, function(){}, [dataId, row]) + } +}); + +function deleteConfirmedLineaPago(params){ + + var factura_linea_id = params[0]; + var row = params[1]; + const row_data = tablePagos.row($(row)).data(); + const tabla = tablePagos; + + if(row_data.id != null){ + var url = ''; + $.ajax({ + url: url, + method: 'POST', + data: { + factura_id: id ?>, + pago_id: row_data.id, + : v + } + }).done((data, textStatus, jqXHR) => { + tabla.clearPipeline().draw(); + $('#tableOfLineasFactura').DataTable().clearPipeline().draw(); + + }).fail((jqXHR, textStatus, errorThrown) => { + popErrorAlert(jqXHR.responseJSON.messages.error) + }) + } +} + const editor_pagos = new $.fn.dataTable.Editor( { ajax: { url: "",