diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index f55032f7..8a92468c 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -655,13 +655,22 @@ $routes->group('facturas', ['namespace' => 'App\Controllers\Facturacion'], funct $routes->get('add', 'Facturas::add', ['as' => 'newFactura']); $routes->post('add', 'Facturas::add', ['as' => 'createFactura']); $routes->get('edit/(:any)', 'Facturas::edit/$1', ['as' => 'editarFactura']); + $routes->get('validar/(:any)', 'Facturas::validar/$1', ['as' => 'validarFactura']); $routes->post('update/(:any)', 'Facturas::update/$1', ['as' => 'actualizarFactura']); + $routes->post('duplicate/(:any)', 'Facturas::duplicate/$1', ['as' => 'duplicarFactura']); $routes->post('datatable/(:any)', 'FacturasLineas::datatable/$1', ['as' => 'dataTableOfLineasFacturas']); $routes->post('menuPedidosPendientes/(:num)', 'Facturas::menuPedidosPendientes/$1', ['as' => 'menuPedidosPendientesImpresion']); $routes->post('addLineaPedidoImpresion/(:num)', 'Facturas::addLineaPedidoImpresion/$1', ['as' => 'addLineaPedidoImpresion2Factura']); $routes->post('addLineaPedidoImpresion/(:num)', 'Facturas::addLineaPedidoImpresion/$1', ['as' => 'addLineaPedidoImpresion2Factura']); $routes->get('deleteLinea/(:any)', 'FacturasLineas::deleteLinea/$1', ['as' => 'deleteLineaFactura']); + $routes->get('delete/(:any)', 'Facturas::delete/$1', ['as' => 'borrarFactura']); + $routes->post('deleteFacturaLineaPedido', 'Facturas::deleteLineaPedidoImpresion', ['as' => 'deleteLineaPedidoImpresion']); $routes->post('editorLineas', 'FacturasLineas::datatable_editor', ['as' => 'editorOfLineasFacturas']); + $routes->post('updateTotales/(:any)', 'Facturas::updateTotales/$1', ['as' => 'updateFacturaTotales']); + $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']); + }); diff --git a/ci4/app/Controllers/Facturacion/Facturas.php b/ci4/app/Controllers/Facturacion/Facturas.php index 7f673e1e..e7fd5709 100755 --- a/ci4/app/Controllers/Facturacion/Facturas.php +++ b/ci4/app/Controllers/Facturacion/Facturas.php @@ -143,6 +143,11 @@ class Facturas extends \App\Controllers\BaseResourceController helper('form'); + + $this->viewData['breadcrumb'] = [ + ['title' => lang("App.menu_facturas"), 'route' => "javascript:void(0);", 'active' => false], + ['title' => lang("Facturas.facturaList"), 'route' => route_to('facturasList'), 'active' => true] + ]; $this->viewData['usingSelect2'] = true; @@ -168,9 +173,15 @@ class Facturas extends \App\Controllers\BaseResourceController $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Facturas.factura')), $id]); return $this->redirect2listView('sweet-error', $message); endif; + $this->obtenerDatosFormulario($factura); + $this->viewData['breadcrumb'] = [ + ['title' => lang("App.menu_facturas"), 'route' => "javascript:void(0);", 'active' => false], + ['title' => lang("Facturas.facturaList"), 'route' => route_to('facturasList'), 'active' => true] + ]; + $this->viewData['facturaEntity'] = $factura; $this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . lang('Facturas.factura') . ' ' . lang('Basic.global.edit3'); @@ -313,6 +324,72 @@ class Facturas extends \App\Controllers\BaseResourceController } } + public function duplicate($factura_id = 0){ + if($this->request->isAJAX()){ + + $factura_origen = $this->model->find($factura_id); + // se quita la key "id" del objeto + unset($factura_origen->id); + $factura_origen->estado = 'borrador'; + $factura_origen->estado_pago = 'pendiente'; + $factura_origen->base = 0; + $factura_origen->total = 0; + $factura_origen->pendiente = 0; + $factura_origen->total_pagos = 0; + $factura_origen->user_created_id = auth()->user()->id; + $factura_origen->user_updated_id = null; + + $this->model->insert($factura_origen); + $id = $this->model->getInsertID(); + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + $data = [ + 'id' => $id, + $csrfTokenName => $newTokenHash + ]; + return $this->respond($data); + + }else{ + return $this->failUnauthorized('Invalid request', 403); + } + } + + public function updateTotales($factura_id = 0){ + if($this->request->isAJAX()){ + + $postData = $this->request->getPost(); + + $data = [ + 'base' => $postData['base'] ?? 0, + 'total' => $postData['total'] ?? 0, + 'pendiente' => $postData['pendiente'] ?? 0, + 'total_pagos' => $postData['total_pagos'] ?? 0, + 'user_updated_id' => auth()->user()->id, + 'estado_pago' => (intval($postData['pendiente'] ?? 0)==0) ? 'pagada' : 'pendiente', + ]; + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + $data_ret = [ + $csrfTokenName => $newTokenHash + ]; + + if($factura_id == 0){ + return $this->respond($data_ret); + } + + $data_ret['estado_pago'] = $data['estado_pago']; + $model = model('\App\Models\Facturas\FacturaModel'); + $model->update($factura_id, $data); + + return $this->respond($data_ret); + } + else { + return $this->failUnauthorized('Invalid request', 403); + } + } + public function addLineaPedidoImpresion($factura_id){ @@ -386,6 +463,113 @@ class Facturas extends \App\Controllers\BaseResourceController } } + public function deleteLineaPedidoImpresion(){ + + if ($this->request->isAJAX()) { + + $postData = $this->request->getPost(); + $factura_id = $postData['factura_id'] ?? 0; + $linea_id = $postData['linea_id'] ?? 0; + $cantidad = $postData['cantidad'] ?? 0; + + $model_factura_linea = model('\App\Models\Facturas\FacturaLineaModel'); + $model_factura_linea->deleteFacturasLineasPedido($factura_id, $linea_id, $cantidad); + + $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){ + + if($this->request->isAJAX()){ + + $factura = $this->model->find($factura_id); + + if($factura){ + $model_series = model('\App\Models\Configuracion\SeriesFacturasModel'); + $numero = $model_series->getSerieNumerada($factura->serie_id); + + $data = [ + 'estado' => 'validada', + 'numero' => $numero, + 'user_updated_id' => auth()->user()->id, + ]; + + if((strpos($numero, "REC ") === 0)){ + $data['estado_pago'] = 'pagada'; + } + + $this->model->update($factura_id, $data); + } + + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + $data = [ + $csrfTokenName => $newTokenHash + ]; + return $this->respond($data); + } + else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + + public function updateCabecera($factura_id){ + + if($this->request->isAJAX()){ + if($factura_id == 0){ + return; + } + $factura = $this->model->find($factura_id); + if($factura){ + $postData = $this->request->getPost(); + + $dataName = $postData['name'] ?? ''; + $dataValue = $postData['value'] ?? ''; + + if($dataName == 'factura_rectificativa_id'){ + // se actualiza la factura donde el campo 'numero' sea igual al valor de $dataValue. El campo a actualizar es 'factura_rectificada_id' + $factura_rectificada = $this->model->where('numero', $dataValue)->first(); + if($factura_rectificada){ + $data2 = [ + 'factura_rectificada_id' => $factura->numero, + 'user_updated_id' => auth()->user()->id, + ]; + $this->model->update($factura_rectificada->id, $data2); + } + } + + $data = [ + $dataName => $dataValue, + 'user_updated_id' => auth()->user()->id, + ]; + + $this->model->update($factura_id, $data); + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + $data = [ + $csrfTokenName => $newTokenHash + ]; + return $this->respond($data); + } + } + else { + return $this->failUnauthorized('Invalid request', 403); + } + } + /************************************* * FUNCIONES AUXILIARES ************************************/ @@ -407,6 +591,9 @@ class Facturas extends \App\Controllers\BaseResourceController $serieModel = model('App\Models\Configuracion\SeriesFacturasModel'); $serie = $serieModel->find($factura->serie_id); $factura->serie_nombre = $serie->nombre; + + $formaPagoModel = model('App\Models\Configuracion\FormaPagoModel'); + $factura->formas_pago = $formaPagoModel->getMenuItems(); $factura->fecha_factura_at_text = $factura->fecha_factura_at ? date('d/m/Y', strtotime($factura->fecha_factura_at)) : ''; } diff --git a/ci4/app/Controllers/Facturacion/FacturasLineas.php b/ci4/app/Controllers/Facturacion/FacturasLineas.php index 22ae8580..21ae2c0a 100644 --- a/ci4/app/Controllers/Facturacion/FacturasLineas.php +++ b/ci4/app/Controllers/Facturacion/FacturasLineas.php @@ -83,96 +83,100 @@ class FacturasLineas extends \App\Controllers\BaseResourceController include(APPPATH . "ThirdParty/DatatablesEditor/DataTables.php"); - // Build our Editor instance and process the data coming from _POST - $response = Editor::inst( $db, 'cliente_plantilla_precios_lineas' ) + $response = Editor::inst( $db, 'facturas_lineas' ) ->fields( - Field::inst( 'plantilla_id' ), - Field::inst( 'tipo' ), - Field::inst( 'tipo_maquina' ), - Field::inst( 'tipo_impresion' ), + 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')) + ), + Field::inst( 'descripcion' ) + ->validator('Validate::notEmpty', array( + 'message' => lang('Facturas.validation.requerido')) + ), + Field::inst( 'precio_unidad' ) + ->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar') + ->validator('Validate::numeric', array( + "decimal" => ',', + 'message' => lang('Facturas.validation.decimal')) + ) + ->validator('Validate::notEmpty', array( + 'message' => lang('Facturas.validation.requerido')) + ), + Field::inst( 'iva' ) + ->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( 'updated_at' ), - Field::inst( 'tiempo_min' ) - ->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar') - ->validator( 'Validate::notEmpty',array( - 'message' => lang('ClientePrecios.validation.required')) - ) - ->validator('Validate::numeric', array( - "decimal" => ',', - 'message' => lang('ClientePrecios.validation.decimal')) - ), - - Field::inst( 'tiempo_max' ) - ->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar') - ->validator( 'Validate::notEmpty',array( - 'message' => lang('ClientePrecios.validation.required')) - ) - ->validator('Validate::numeric', array( - "decimal" => ',', - 'message' => lang('ClientePrecios.validation.decimal')) - ), - - Field::inst( 'precio_hora' ) - ->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar') - ->validator( 'Validate::notEmpty',array( - 'message' => lang('ClientePrecios.validation.required')) - ) - ->validator('Validate::numeric', array( - "decimal" => ',', - 'message' => lang('ClientePrecios.validation.decimal')) - ), - - Field::inst( 'margen' ) - ->getFormatter( 'Format::toDecimalChar')->setFormatter( 'Format::fromDecimalChar') - ->validator( 'Validate::notEmpty',array( - 'message' => lang('ClientePrecios.validation.required')) - ) - ->validator('Validate::numeric', array( - "decimal" => ',', - 'message' => lang('ClientePrecios.validation.decimal')) - ), - ) - ->validator(function ($editor, $action, $data) { - if ($action === Editor::ACTION_CREATE || $action === Editor::ACTION_EDIT) { - foreach ($data['data'] as $pkey => $values) { - // Si no se quiere borrar... - if ($data['data'][$pkey]['is_deleted'] != 1) { - $process_data['tiempo_min'] = $data['data'][$pkey]['tiempo_min']; - $process_data['tiempo_max'] = $data['data'][$pkey]['tiempo_max']; - $process_data['tipo'] = $data['data'][$pkey]['tipo']; - $process_data['tipo_maquina'] = $data['data'][$pkey]['tipo_maquina']; - $process_data['tipo_impresion'] = $data['data'][$pkey]['tipo_impresion']; - - $response = $this->model->checkIntervals($process_data, $pkey, $data['data'][$pkey]['plantilla_id']); - // No se pueden duplicar valores al crear o al editar - if (!empty($response)) { - return $response; - } - } - } - } - }) ->on('preCreate', function ($editor, &$values) { - $session = session(); - $datetime = (new \CodeIgniter\I18n\Time("now")); + $totales = $this->generate_totales( + $values['factura_id'], + $values['pedido_linea_impresion_id'], + $values['precio_unidad'], + $values['iva'], + $values['cantidad'], + $values['old_cantidad']); $editor ->field('user_updated_id') - ->setValue($session->id_user); + ->setValue(auth()->user()->id); $editor - ->field('updated_at') - ->setValue($datetime->format('Y-m-d H:i:s')); + ->field('base') + ->setValue($totales['base']); + $editor + ->field('total_iva') + ->setValue($totales['total_iva']); + $editor + ->field('total') + ->setValue($totales['total']); + $editor + ->field('user_updated_id') + ->setValue(auth()->user()->id); }) - ->on('preEdit', function ($editor, &$values) { - $session = session(); - $datetime = (new \CodeIgniter\I18n\Time("now")); + ->on('preEdit', function ($editor, $id, &$values) { + $totales = $this->generate_totales( + $values['factura_id'], + $values['pedido_linea_impresion_id'], + $values['precio_unidad'], + $values['iva'], + $values['cantidad'], + $values['old_cantidad']); + $editor + ->field('factura_id') + ->setValue($values['factura_id']); + $editor + ->field('pedido_linea_impresion_id') + ->setValue(null); + $editor + ->field('pedido_maquetacion_id') + ->setValue(null); $editor ->field('user_updated_id') - ->setValue($session->id_user); + ->setValue(auth()->user()->id); $editor - ->field('updated_at') - ->setValue($datetime->format('Y-m-d H:i:s')); + ->field('base') + ->setValue($totales['base']); + $editor + ->field('total_iva') + ->setValue($totales['total_iva']); + $editor + ->field('total') + ->setValue($totales['total']); }) ->debug(true) ->process($_POST) @@ -189,4 +193,36 @@ class FacturasLineas extends \App\Controllers\BaseResourceController return $this->failUnauthorized('Invalid request', 403); } } -} \ No newline at end of file + + public function updateTotalesFactura($factura_id = 0){ + if($factura_id == 0){ + return; + } + + $model = model('\App\Models\Facturas\FacturaModel'); + $model->updateTotales($factura_id); + } + + private function generate_totales($factura_id, $pedido_linea_id, $precio_unidad, $iva, $cantidad, $old_cantidad) + { + + // 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 + $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; + + return $values; + } +} + diff --git a/ci4/app/Controllers/Facturacion/FacturasPagos.php b/ci4/app/Controllers/Facturacion/FacturasPagos.php new file mode 100644 index 00000000..a7559933 --- /dev/null +++ b/ci4/app/Controllers/Facturacion/FacturasPagos.php @@ -0,0 +1,142 @@ +request->isAJAX() && $factura_id != null) { + + $reqData = $this->request->getPost(); + 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); + return $response; + } + $start = $reqData['start'] ?? 0; + $length = $reqData['length'] ?? 5; + $search = $reqData['search']['value']; + $requestedOrder = $reqData['order']['0']['column'] ?? 0; + //$order = FacturaModel::SORTABLE[$requestedOrder >= 0 ? $requestedOrder : 0]; + $dir = $reqData['order']['0']['dir'] ?? 'asc'; + + $resourceData = $this->model->getResource($factura_id)->orderBy(1, $dir)->limit($length, $start)->get()->getResultObject(); + + return $this->respond(Collection::datatable( + $resourceData, + $this->model->getResource($factura_id)->countAllResults(), + $this->model->getResource($factura_id)->countAllResults() + )); + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + + + 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_pagos' ) + ->fields( + Field::inst( 'id' ), + Field::inst( 'forma_pago_id' ), + Field::inst( 'notes' ) + ->validator('Validate::notEmpty', array( + 'message' => lang('Facturas.validation.requerido')) + ), + Field::inst( 'fecha_pago_at' ) + ->validator( Validate::dateFormat( 'Y-m-d H:i:s' ) ) + ->getFormatter( Format::dateSqlToFormat( 'Y-m-d H:i:s' ) ) + ->setFormatter( Format::dateFormatToSql( 'Y-m-d H:i:s' ) ), + Field::inst( 'fecha_vencimiento_at' ) + ->validator( Validate::dateFormat( 'Y-m-d H:i:s' ) ) + ->getFormatter( Format::dateSqlToFormat( 'Y-m-d H:i:s' ) ) + ->setFormatter( Format::dateFormatToSql( 'Y-m-d H:i:s' ) ), + Field::inst( 'total' ) + ->validator('Validate::numeric', array( + 'message' => lang('Facturas.validation.numerico')) + ) + ->validator('Validate::notEmpty', array( + 'message' => lang('Facturas.validation.requerido')) + ), + Field::inst( 'factura_id' ), + Field::inst( 'user_updated_id' ), + ) + ->on('preCreate', function ($editor, &$values) { + /* + $editor + ->field('user_updated_id') + ->setValue(auth()->user()->id); + $editor + ->field('base') + ->setValue($totales['base']); + $editor + ->field('total_iva') + ->setValue($totales['total_iva']); + $editor + ->field('total') + ->setValue($totales['total']); + $editor + ->field('user_updated_id') + ->setValue(auth()->user()->id); + */ + }) + ->on('preEdit', function ($editor, $id, &$values) { + /* + $editor + ->field('factura_id') + ->setValue($values['factura_id']); + $editor + ->field('pedido_linea_impresion_id') + ->setValue(null); + $editor + ->field('pedido_maquetacion_id') + ->setValue(null); + $editor + ->field('user_updated_id') + ->setValue(auth()->user()->id); + $editor + ->field('base') + ->setValue($totales['base']); + $editor + ->field('total_iva') + ->setValue($totales['total_iva']); + $editor + ->field('total') + ->setValue($totales['total']); + */ + }) + ->debug(true) + ->process($_POST) + ->data(); + + $newTokenHash = csrf_hash(); + $csrfTokenName = csrf_token(); + + $response[$csrfTokenName] = $newTokenHash; + + echo json_encode($response); + + } else { + return $this->failUnauthorized('Invalid request', 403); + } + } + +} \ No newline at end of file diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index 6e2a81c7..aa2cdbdf 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -398,7 +398,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'servicios' => $servicios, ); - $return_data = $this->calcular_presupuesto($datos_presupuesto, 0, true); //TRUE FOR DEBUG + $return_data = $this->calcular_presupuesto($datos_presupuesto, 0, false); //TRUE FOR DEBUG array_merge($return_data, [$csrfTokenName => $newTokenHash]); return $this->respond($return_data); diff --git a/ci4/app/Controllers/Test.php b/ci4/app/Controllers/Test.php index 972808b2..eb68eaba 100755 --- a/ci4/app/Controllers/Test.php +++ b/ci4/app/Controllers/Test.php @@ -25,12 +25,7 @@ class Test extends BaseController $data = $model->obtenerLineasPedidoSinFacturar(999); */ - $model = model("\App\Models\Facturas\FacturaLineaModel"); - $data = $model->getResource(9)->get()->getResultObject(); - - echo('
');
- var_dump($data);
- echo('');
+ xdebug_info();
diff --git a/ci4/app/Entities/Facturas/FacturaEntity.php b/ci4/app/Entities/Facturas/FacturaEntity.php
index 131ac828..99f923b5 100644
--- a/ci4/app/Entities/Facturas/FacturaEntity.php
+++ b/ci4/app/Entities/Facturas/FacturaEntity.php
@@ -8,8 +8,8 @@ class FacturaEntity extends \CodeIgniter\Entity\Entity
protected $attributes = [
'id' => null,
'pedido_id' => null,
- 'factura_retificada_id' => null,
- 'factura_retificativa_id' => null,
+ 'factura_rectificada_id' => null,
+ 'factura_rectificativa_id' => null,
'cliente_id' => null,
'serie_id' => null,
'numero' => null,
@@ -33,14 +33,12 @@ class FacturaEntity extends \CodeIgniter\Entity\Entity
'updated_at' => null,
'deleted_at' => null,
'user_created_id' => null,
- 'user_update_id' => null,
+ 'user_updated_id' => null,
];
protected $casts = [
'id' => 'int',
'pedido_id' => 'int',
- 'factura_retificada_id' => 'int',
- 'factura_retificativa_id' => 'int',
'cliente_id' => 'int',
'serie_id' => 'int',
'base' => 'float',
diff --git a/ci4/app/Entities/Facturas/FacturaPagoEntity.php b/ci4/app/Entities/Facturas/FacturaPagoEntity.php
index a47ce19a..84f065cb 100644
--- a/ci4/app/Entities/Facturas/FacturaPagoEntity.php
+++ b/ci4/app/Entities/Facturas/FacturaPagoEntity.php
@@ -14,7 +14,7 @@ class FacturaPagoEntity extends \CodeIgniter\Entity\Entity
'forma_pago_id' => null,
'total' => null,
'deleted_at' => null,
- 'user_update_id' => null,
+ 'user_updated_id' => null,
];
diff --git a/ci4/app/Language/en/Basic.php b/ci4/app/Language/en/Basic.php
index 4b55be18..4863c32d 100755
--- a/ci4/app/Language/en/Basic.php
+++ b/ci4/app/Language/en/Basic.php
@@ -89,6 +89,7 @@ return [
'ok' => 'Ok',
'wait' => 'Wait',
'yes' => 'Yes',
+ 'back' => 'Back',
],
diff --git a/ci4/app/Language/en/Facturas.php b/ci4/app/Language/en/Facturas.php
index 762954bb..48c60a51 100644
--- a/ci4/app/Language/en/Facturas.php
+++ b/ci4/app/Language/en/Facturas.php
@@ -22,6 +22,7 @@ return [
'serieFacturacion' => 'Billing Series',
'creditoAsegurado' => 'Secured Credit',
'facturaRectificada' => 'Rectified Invoice',
+ 'facturaRectificativa' => 'Rectifying Invoice',
'razonSocial' => 'Business Name',
'cif' => 'Tax ID',
'direccion' => 'Address',
@@ -61,8 +62,23 @@ return [
'peiddoImpresion' => 'Print Order',
'peiddoMaquetacion' => 'Layout Order',
'nuevaLinea' => 'New Line',
+ 'validarFactura' => 'Validate Invoice',
+ 'borrarFactura' => 'Delete Invoice',
+ 'imprimirFactura' => 'Print',
+ 'pagos' => 'Payments',
+ 'notas' => 'Notes',
+ 'fechaVencimiento' => 'Due Date',
+ "fechaCobro" => "Collection Date",
+ "cantidad" => "Quantity",
+ "addPago" => "Add Payment",
+ "facturaPagada" => "Rectifying Invoice already paid",
'errors' => [
'requiredFields' => 'Fields marked with * are required',
- ]
+ ],
+ 'validation' => [
+ 'numerico' => 'Must be numeric',
+ 'requerido' => 'Required',
+ 'decimal' => 'Must be decimal',
+ ],
];
\ No newline at end of file
diff --git a/ci4/app/Language/es/Basic.php b/ci4/app/Language/es/Basic.php
index 1c98ea3d..bb333f54 100755
--- a/ci4/app/Language/es/Basic.php
+++ b/ci4/app/Language/es/Basic.php
@@ -90,6 +90,7 @@ return [
'wait' => 'Espere',
'yes' => 'Si',
'no' => 'No',
+ 'back' => 'Volver',
],
diff --git a/ci4/app/Language/es/Facturas.php b/ci4/app/Language/es/Facturas.php
index 36bcbcf5..90e6962f 100644
--- a/ci4/app/Language/es/Facturas.php
+++ b/ci4/app/Language/es/Facturas.php
@@ -22,6 +22,7 @@ return [
'serieFacturacion' => 'Serie facturación',
'creditoAsegurado' => 'Crédito asegurado',
'facturaRectificada' => 'Factura rectificada',
+ 'facturaRectificativa' => 'Factura rectificativa',
'razonSocial' => 'Razón Social',
'cif' => 'CIF',
'direccion' => 'Dirección',
@@ -61,8 +62,24 @@ return [
'pedidoImpresion' => 'Pedido Impresión',
'pedidoMaquetacion' => 'Pedido Maquetación',
'nuevaLinea' => 'Nueva Línea',
-
+ 'validarFactura' => 'Validar Factura',
+ 'borrarFactura' => 'Borrar Factura',
+ 'imprimirFactura' => 'Imprimir',
+ 'pagos' => 'Pagos',
+ 'notas' => 'Notas',
+ "fechaVencimiento" => "Fecha Vencimiento",
+ "fechaCobro" => "Fecha Cobro",
+ "cantidad" => "Cantidad",
+ "addPago" => "Añadir Pago",
+ "facturaPagada" => "Factura rectificativa ya abonada",
+
'errors' => [
'requiredFields' => 'Los campos marcados con * son obligatorios',
+ ],
+ 'validation' => [
+ "requerido" => "El campo es obligatorio.",
+ "numerico" => "El campo debe ser numérico.",
+ "decimal" => "El campo debe ser decimal.",
]
+
];
\ No newline at end of file
diff --git a/ci4/app/Models/Configuracion/FormaPagoModel.php b/ci4/app/Models/Configuracion/FormaPagoModel.php
index 69833688..d22a1bd5 100755
--- a/ci4/app/Models/Configuracion/FormaPagoModel.php
+++ b/ci4/app/Models/Configuracion/FormaPagoModel.php
@@ -3,7 +3,7 @@ namespace App\Models\Configuracion;
class FormaPagoModel extends \App\Models\BaseModel
{
- protected $table = "lg_formas_pago";
+ protected $table = "formas_pago";
/**
* Whether primary key uses auto increment.
@@ -38,6 +38,18 @@ class FormaPagoModel extends \App\Models\BaseModel
],
];
+ public function getMenuItems(){
+ $items = $this->findAll();
+ $menuItems = [];
+ foreach ($items as $item) {
+ $menuItems[] = [
+ "value" => $item->id,
+ "label" => $item->nombre,
+ ];
+ }
+ return $menuItems;
+ }
+
/**
* Get resource data.
*
diff --git a/ci4/app/Models/Configuracion/SeriesFacturasModel.php b/ci4/app/Models/Configuracion/SeriesFacturasModel.php
index 5b914953..701ddf05 100644
--- a/ci4/app/Models/Configuracion/SeriesFacturasModel.php
+++ b/ci4/app/Models/Configuracion/SeriesFacturasModel.php
@@ -108,4 +108,19 @@ class SeriesFacturasModel extends \App\Models\BaseModel
return $result;
}
+
+ public function getSerieNumerada($id)
+ {
+ $number = $this->db->table($this->table)
+ ->select("next, formato")
+ ->where("id", $id)
+ ->get()->getFirstRow();
+
+ $this->db->table($this->table)
+ ->where("id", $id)
+ ->set("next", $number->next + 1, false)
+ ->update();
+
+ return str_replace("{number}", $number->next, $number->formato);
+ }
}
diff --git a/ci4/app/Models/Facturas/FacturaLineaModel.php b/ci4/app/Models/Facturas/FacturaLineaModel.php
index a9d4d901..757f4bad 100644
--- a/ci4/app/Models/Facturas/FacturaLineaModel.php
+++ b/ci4/app/Models/Facturas/FacturaLineaModel.php
@@ -38,8 +38,8 @@ class FacturaLineaModel extends \App\Models\BaseModel {
->select(
"t1.id AS id, t1.factura_id AS factura_id,
t1.pedido_linea_impresion_id AS pedido_linea_impresion_id, t1.pedido_maquetacion_id AS pedido_maquetacion_id,
- t1.descripcion AS concepto, t1.cantidad as unidades, t1.precio_unidad AS precio_unidad, t1.iva AS iva,
- t1.base AS subtotal, t1.total_iva AS total_iva, t1.total AS total, t1.data AS data, t2.pedido_id AS pedido_id,
+ t1.descripcion AS descripcion, t1.cantidad as cantidad, t1.precio_unidad AS precio_unidad, t1.iva AS iva,
+ t1.base AS base, t1.total_iva AS total_iva, t1.total AS total, t1.data AS data, t2.pedido_id AS pedido_id,
t3.total_aceptado AS total_aceptado"
)
->join("pedidos_linea t2", "t2.id = t1.pedido_linea_impresion_id", "left")
@@ -68,5 +68,30 @@ class FacturaLineaModel extends \App\Models\BaseModel {
->where("pedido_linea_id", $pedido_linea_id)
->where("cantidad", $cantidad)
->delete();
- }
+ }
+
+ public function updateFacturaPedidoLinea($factura_id, $pedido_linea_id, $cantidad, $cantidad_new)
+ {
+ // Obtener la ID del registro que queremos actualizar
+ $record = $this->db->table("facturas_pedidos_lineas")
+ ->select('id')
+ ->where("factura_id", $factura_id)
+ ->where("pedido_linea_id", $pedido_linea_id)
+ ->where("cantidad", $cantidad)
+ ->limit(1)
+ ->get()
+ ->getRow();
+
+ // Si existe el registro
+ if ($record) {
+ $data = [
+ "cantidad" => $cantidad_new
+ ];
+
+ // Actualizar el registro especificado por su ID
+ $this->db->table("facturas_pedidos_lineas")
+ ->where("id", $record->id)
+ ->update($data);
+ }
+ }
}
\ No newline at end of file
diff --git a/ci4/app/Models/Facturas/FacturaModel.php b/ci4/app/Models/Facturas/FacturaModel.php
index 30e61341..e492a8a4 100644
--- a/ci4/app/Models/Facturas/FacturaModel.php
+++ b/ci4/app/Models/Facturas/FacturaModel.php
@@ -26,8 +26,8 @@ class FacturaModel extends \App\Models\BaseModel {
// Lista de columnas basada en los campos de la tabla, para asignación masiva
protected $allowedFields = [
'pedido_id',
- 'factura_retificada_id',
- 'factura_retificativa_id',
+ 'factura_rectificada_id',
+ 'factura_rectificativa_id',
'cliente_id',
'serie_id',
'numero',
@@ -51,7 +51,7 @@ class FacturaModel extends \App\Models\BaseModel {
'updated_at',
'deleted_at',
'user_created_id',
- 'user_update_id'
+ 'user_updated_id'
];
protected $returnType = "App\Entities\Facturas\FacturaEntity";
@@ -72,13 +72,17 @@ class FacturaModel extends \App\Models\BaseModel {
"t1.id AS id, t1.numero AS numero, DATE_FORMAT(t1.fecha_factura_at, '%d/%m/%Y') AS fecha_factura_at,
t2.nombre AS cliente, t1.base AS base, t1.total AS total, t1.pendiente AS pendiente,
t1.creditoAsegurado AS creditoAsegurado, t1.estado AS estado, t1.estado_pago AS estado_pago,
- t4.nombre AS forma_pago, DATE_FORMAT(t3.fecha_vencimiento_at, '%d/%m/%Y') AS vencimiento"
+ GROUP_CONCAT(DISTINCT t4.nombre ORDER BY t4.nombre ASC SEPARATOR ', ') AS forma_pago,
+ DATE_FORMAT(MIN(CASE WHEN t3.fecha_vencimiento_at != '0000-00-00 00:00:00' THEN t3.fecha_vencimiento_at ELSE NULL END), '%d/%m/%Y') AS vencimiento,
+ t2.vencimiento AS dias_vencimiento"
);
$builder->join("clientes t2", "t2.id = t1.cliente_id", "left");
$builder->join("facturas_pagos t3", "t3.factura_id = t1.id", "left");
$builder->join("formas_pago t4", "t3.forma_pago_id = t4.id", "left");
+ $builder->where("t1.deleted_at IS NULL");
+ $builder->groupBy("t1.id"); // Agrupa por id de la factura
return empty($search)
? $builder
@@ -98,5 +102,14 @@ class FacturaModel extends \App\Models\BaseModel {
return $builder->get()->getRow()->cantidad;
}
-
+
+ public function deleteFacturasLineasPedido($factura_id, $pedido_linea_id, $cantidad)
+ {
+ $this->db->table("facturas_pedidos_lineas")
+ ->where("factura_id", $factura_id)
+ ->where("pedido_linea_id", $pedido_linea_id)
+ ->where("cantidad", $cantidad)
+ ->delete();
+ }
+
}
\ No newline at end of file
diff --git a/ci4/app/Models/Facturas/FacturaPagoModel.php b/ci4/app/Models/Facturas/FacturaPagoModel.php
index 1a17f9fb..82e06cdb 100644
--- a/ci4/app/Models/Facturas/FacturaPagoModel.php
+++ b/ci4/app/Models/Facturas/FacturaPagoModel.php
@@ -14,7 +14,7 @@ class FacturaPagoModel extends \App\Models\BaseModel {
'forma_pago_id',
'total',
'deleted_at',
- 'user_update_id'
+ 'user_updated_id'
];
protected $returnType = "App\Entities\Facturas\FacturaPagoEntity";
@@ -23,4 +23,20 @@ class FacturaPagoModel extends \App\Models\BaseModel {
protected $useSoftDeletes = true;
public static $labelField = "id";
+
+ public function getResource($factura_id)
+ {
+ $builder = $this->db
+ ->table($this->table . " t1")
+ ->select(
+ "t1.id AS id, t1.factura_id AS factura_id,
+ t1.notes AS notes, t1.fecha_pago_at AS fecha_pago_at, t1.fecha_vencimiento_at AS fecha_vencimiento_at,
+ t1.forma_pago_id AS forma_pago_id, t2.nombre as forma_pago, t1.total AS total"
+ )
+ ->join("formas_pago t2", "t2.id = t1.forma_pago_id", "left")
+ ->where("t1.factura_id", $factura_id)
+ ->where("t1.deleted_at", null);
+
+ return $builder;
+ }
}
\ No newline at end of file
diff --git a/ci4/app/Models/Pedidos/PedidoLineaModel.php b/ci4/app/Models/Pedidos/PedidoLineaModel.php
index 8aee0c2a..d7eb4699 100644
--- a/ci4/app/Models/Pedidos/PedidoLineaModel.php
+++ b/ci4/app/Models/Pedidos/PedidoLineaModel.php
@@ -78,38 +78,39 @@ class PedidoLineaModel extends \App\Models\BaseModel
}
- public function obtenerLineasPedidoSinFacturar($cliente_id){
-
+ public function obtenerLineasPedidoSinFacturar($cliente_id) {
$resultaArray = [];
-
+
+ $subquery = $this->db
+ ->table('facturas_pedidos_lineas')
+ ->select('pedido_linea_id, SUM(cantidad) AS total_cantidad')
+ ->groupBy('pedido_linea_id')
+ ->getCompiledSelect();
+
$builder = $this->db
->table($this->table . " t1")
- ->select("t1.id AS id, t1.pedido_id AS pedido_id, t3.titulo AS titulo, t4.codigo AS tipo_impresion");
-
- $builder->join("pedidos t2", "t2.id = t1.pedido_id", "left");
- $builder->join("presupuestos t3", "t3.id = t1.presupuesto_id", "left");
- $builder->join("tipos_presupuestos t4", "t4.id = t3.tipo_impresion_id", "left");
-
- $builder->join("facturas_pedidos_lineas fpl", "fpl.pedido_linea_id = t1.id", "left");
-
- $builder->where("t3.cliente_id", $cliente_id);
- $builder->where("t2.estado", "finalizado");
-
-
- $builder->where("(`t3`.`tirada` > `fpl`.`cantidad` OR fpl.pedido_linea_id IS NULL)");
-
+ ->select("t1.id AS id, t1.pedido_id AS pedido_id, t3.titulo AS titulo, t4.codigo AS tipo_impresion")
+ ->join("pedidos t2", "t2.id = t1.pedido_id", "left")
+ ->join("presupuestos t3", "t3.id = t1.presupuesto_id", "left")
+ ->join("tipos_presupuestos t4", "t4.id = t3.tipo_impresion_id", "left")
+ ->join("($subquery) fpl", "fpl.pedido_linea_id = t1.id", "left")
+ ->where("t3.cliente_id", $cliente_id)
+ ->where("t2.estado", "finalizado")
+ ->where("(t3.tirada > IFNULL(fpl.total_cantidad, 0))");
+
// Ejecutar la consulta y devolver resultados
$query = $builder->get();
$data = $query->getResult();
-
- foreach($data as $register){
+
+ foreach($data as $register) {
$item = (object)[
'id' => $register->id,
'text' => '['. lang('Pedidos.pedido') . ' ' . $register->pedido_id . '] ' . $register->titulo . ' - ' . lang('Presupuestos.' . $register->tipo_impresion),
];
array_push($resultaArray, $item);
}
-
+
return $resultaArray;
}
+
}
\ No newline at end of file
diff --git a/ci4/app/Views/themes/vuexy/form/facturas/_addPedidosItems.php b/ci4/app/Views/themes/vuexy/form/facturas/_addPedidosItems.php
index cae8922e..1b616980 100644
--- a/ci4/app/Views/themes/vuexy/form/facturas/_addPedidosItems.php
+++ b/ci4/app/Views/themes/vuexy/form/facturas/_addPedidosItems.php
@@ -117,13 +117,12 @@ $('#addNewPedidoImpresion').on('click', function(){
success: function(response) {
yeniden(response.= csrf_token() ?>);
- // Se actualiza la tabla de lineas de factura
- $('#tableOfLineasFactura').DataTable().clearPipeline();
- $('#tableOfLineasFactura').DataTable().ajax.reload();
// se ajustan el ancho de las columnas
$('#tableOfLineasFactura').DataTable().columns.adjust().draw();
$('#pedidoImpresion').val(null).trigger('change');
-
+ // Se actualiza la tabla de lineas de factura
+ tableLineas.clearPipeline();
+ tableLineas.draw();
}
});
});
diff --git a/ci4/app/Views/themes/vuexy/form/facturas/_facturaCabeceraItems.php b/ci4/app/Views/themes/vuexy/form/facturas/_facturaCabeceraItems.php
index 47754d47..4bba5e7f 100644
--- a/ci4/app/Views/themes/vuexy/form/facturas/_facturaCabeceraItems.php
+++ b/ci4/app/Views/themes/vuexy/form/facturas/_facturaCabeceraItems.php
@@ -11,7 +11,11 @@
| + | id | @@ -31,26 +31,26 @@ | |||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Subtotal: | +Subtotal: | ||||||||||||||||||
| I.V.A.: | +I.V.A.: | ||||||||||||||||||
| Total: | +Total: | ||||||||||||||||||
| Pendiente de pago: | -+ | serie_id == 7 || $facturaEntity->serie_id == 9)? "style='display:none;'":"" ?> colspan="9" style="text-align:right">Pendiente de pago: | +serie_id == 7 || $facturaEntity->serie_id == 9)? "style='display:none;'":"" ?> id="pendiente-pago"> | - | `; - } - else{ + + `; + } + else + { + return ``; + } + + + if (data.pedido_id === null) { return `+ | `; + } + else{ + return ` + + `; } + }; + var editor_lineas = new $.fn.dataTable.Editor( { ajax: { url: "= route_to('editorOfLineasFacturas') ?>", @@ -119,23 +140,57 @@ var editor_lineas = new $.fn.dataTable.Editor( { idSrc: 'id', fields: [ { - name: "unidades", + name: "cantidad", }, { - name: "concepto" + name: "descripcion", + type: "textarea", + attr: { + rows: 5, + style: "height: 120px;" + } }, { name: "precio_unidad", - } + attr: { + style: "min-width: 65px;" + } + }, { + name: "iva", + }, { + name: "pedido_linea_impresion_id", + type: "hidden" + }, { + name: "pedido_maquetacion_id", + type: "hidden" + }, { + name: "id", + type: "hidden" + }, { + name: "base", + type: "hidden" + }, ] } ); + +var old_cantidad = 0; + +editor_lineas.on( 'preEdit', function ( e, json, data, id ) { + + old_cantidad = data.cantidad; + +}); + editor_lineas.on( 'preSubmit', function ( e, d, type ) { + if ( type === 'create'){ d.data[0]['factura_id'] = = $facturaEntity->id ?>; + d.data[0]['old_cantidad'] = null; } else if(type === 'edit' ) { for (v in d.data){ d.data[v]['factura_id'] = = $facturaEntity->id ?>; + d.data[v]['old_cantidad'] = old_cantidad; } } }); @@ -155,9 +210,10 @@ editor_lineas.on( 'submitSuccess', function ( e, json, data, action ) { // Activate an inline edit on click of a table cell $('#tableOfLineasFactura').on( 'click', 'tbody span.edit', function (e) { - editor_lineas.inline( - tableLineas.cells(this.parentNode.parentNode, '*').nodes(), - { + + editor_lineas.inline(tableLineas.cells(this.closest('tr'), '*').nodes(), + { + cancelHtml: '', cancelTrigger: 'span.cancel', submitHtml: '', @@ -175,45 +231,58 @@ var tableLineas = $('#tableOfLineasFactura').DataTable({ responsive: true, scrollX: true, columns: [ - {data: null, render: actionBtns}, + { + data: actionBtns, + className: 'row-edit dt-center' + }, {data: "id"}, {data: "pedido_linea_impresion_id"}, {data: "pedido_maquetacion_id"}, {data: "pedido_id"}, - {data: "unidades"}, + {data: "cantidad"}, { - data: "concepto", + data: "descripcion", render: function (data, type, row, meta) { - // se convierten a float data.total_aceptado y subtotal - var total_aceptado = parseFloat(row.total_aceptado); - var subtotal = parseFloat(row.subtotal); + if(row.pedido_linea_impresion_id != null){ + + // se convierten a float data.total_aceptado y subtotal + var total_aceptado = parseFloat(row.total_aceptado); + var subtotal = parseFloat(row.base); - var error_text = ''; - if(total_aceptado != subtotal){ - error_text = 'El total del pedido ('+ total_aceptado + '€) no coincide con la línea ('+ subtotal + '€)'; + var error_text = ''; + if(total_aceptado != subtotal){ + error_text = 'El total del pedido ('+ total_aceptado + '€) no coincide con la línea ('+ subtotal + '€)'; + } + + return ` +||||||||||||||
| + | + | = lang('Facturas.formaPago') ?> | += lang('Facturas.notas') ?> | += lang('Facturas.fechaVencimiento') ?> | += lang('Facturas.fechaCobro') ?> | += lang('Facturas.cantidad') ?> | +
|---|---|---|---|---|---|---|
| Total: | ++ | |||||
= lang("Facturas.facturaPagada") ?>
+ +