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..4980bd96 100755 --- a/ci4/app/Controllers/Facturacion/Facturas.php +++ b/ci4/app/Controllers/Facturacion/Facturas.php @@ -313,6 +313,62 @@ 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, + ]; + + if($factura_id == 0){ + return; + } + + $model = model('\App\Models\Facturas\FacturaModel'); + $model->update($factura_id, $data); + } + else { + return $this->failUnauthorized('Invalid request', 403); + } + } + public function addLineaPedidoImpresion($factura_id){ @@ -386,6 +442,97 @@ 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, + ]; + + $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'] ?? ''; + + $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 +554,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..67d0e499 --- /dev/null +++ b/ci4/app/Controllers/Facturacion/FacturasPagos.php @@ -0,0 +1,144 @@ +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' ) + ->set( function ($val, $data, $field) { + // Convierte la fecha de formato DD/MM/YYYY a YYYY-MM-DD + $date = DateTime::createFromFormat('d/m/Y', $val)->format('Y-m-d'); + return DateTime::createFromFormat('d/m/Y', $val)->format('Y-m-d'); + }), + Field::inst( 'fecha_vencimiento_at' ) + ->set( function ($val, $data, $field) { + // Convierte la fecha de formato DD/MM/YYYY a YYYY-MM-DD + return DateTime::createFromFormat('d/m/Y', $val)->format('Y-m-d'); + }), + 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..3650cbda 100755 --- a/ci4/app/Controllers/Test.php +++ b/ci4/app/Controllers/Test.php @@ -25,7 +25,7 @@ class Test extends BaseController $data = $model->obtenerLineasPedidoSinFacturar(999); */ - $model = model("\App\Models\Facturas\FacturaLineaModel"); + $model = model("\App\Models\Facturas\FacturaPagoModel"); $data = $model->getResource(9)->get()->getResultObject(); echo('
');
diff --git a/ci4/app/Entities/Facturas/FacturaEntity.php b/ci4/app/Entities/Facturas/FacturaEntity.php
index 131ac828..fc6c50ef 100644
--- a/ci4/app/Entities/Facturas/FacturaEntity.php
+++ b/ci4/app/Entities/Facturas/FacturaEntity.php
@@ -33,7 +33,7 @@ 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 = [
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..801b96c5 100644
--- a/ci4/app/Language/en/Facturas.php
+++ b/ci4/app/Language/en/Facturas.php
@@ -61,8 +61,22 @@ 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",
'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..a4278db9 100644
--- a/ci4/app/Language/es/Facturas.php
+++ b/ci4/app/Language/es/Facturas.php
@@ -61,8 +61,23 @@ 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",
+
'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..6c370437 100755
--- a/ci4/app/Models/Configuracion/FormaPagoModel.php
+++ b/ci4/app/Models/Configuracion/FormaPagoModel.php
@@ -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..165a386d 100644
--- a/ci4/app/Models/Facturas/FacturaModel.php
+++ b/ci4/app/Models/Facturas/FacturaModel.php
@@ -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";
@@ -79,6 +79,7 @@ class FacturaModel extends \App\Models\BaseModel {
$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");
return empty($search)
? $builder
@@ -98,5 +99,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..6b172315 100644
--- a/ci4/app/Views/themes/vuexy/form/facturas/_facturaCabeceraItems.php
+++ b/ci4/app/Views/themes/vuexy/form/facturas/_facturaCabeceraItems.php
@@ -11,7 +11,7 @@
- = lang('Facturas.factura') . ': '?> = lang('Facturas.' . $facturaEntity->estado)?>
+ = lang('Facturas.factura') . ': '?> ;"> = lang('Facturas.' . $facturaEntity->estado)?>
@@ -38,7 +38,7 @@
-
@@ -50,7 +50,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="creditoAsegurado" tabindex="3" name="creditoAsegurado" class="form-control select2bs2 update-cabecera" style="width: 100%;">
@@ -63,7 +63,7 @@
-
+ estado != 'borrador')?'disabled ':''?> type="text" value="" tabindex="4" id="fecha_factura_at" name="fecha_factura_at" tabindex="1" maxLength="11" class="form-control update-cabecera" value="= old('fecha_factura_at', $facturaEntity->fecha_factura_at) ?>" >
@@ -76,7 +76,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="cliente_id" tabindex="5" name="cliente_id" class="form-control select2bs2 update-cabecera" style="width: 100%;">
@@ -91,7 +91,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="cliente_nombre" name="cliente_nombre" tabindex="6" class="form-control update-cabecera" value="= old('cliente_nombre', $facturaEntity->cliente_nombre) ?>">
@@ -100,7 +100,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="cliente_cif" name="cliente_cif" tabindex="7" class="form-control update-cabecera" value="= old('cliente_cif', $facturaEntity->cliente_cif) ?>">
@@ -109,7 +109,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="cliente_pais" name="cliente_pais" tabindex="8" class="form-control update-cabecera" value="= old('cliente_pais', $facturaEntity->cliente_pais) ?>">
@@ -122,7 +122,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="cliente_direccion" name="cliente_address" tabindex="6" class="form-control update-cabecera" value="= old('cliente_address', $facturaEntity->cliente_address) ?>">
@@ -131,7 +131,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="cliente_cp" name="cliente_cp" tabindex="7" class="form-control update-cabecera" value="= old('cliente_cp', $facturaEntity->cliente_cp) ?>">
@@ -140,7 +140,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="cliente_ciudad" name="cliente_ciudad" tabindex="8" class="form-control update-cabecera" value="= old('cliente_ciudad', $facturaEntity->cliente_ciudad) ?>">
@@ -149,7 +149,7 @@
-
+ estado != 'borrador')?'disabled ':''?> id="cliente_provincia" name="cliente_provincia" tabindex="8" class="form-control update-cabecera" value="= old('cliente_provincia', $facturaEntity->cliente_provincia) ?>">
@@ -163,11 +163,11 @@
estado === 'validada' && (auth()->user()->inGroup('beta') || auth()->user()->inGroup('admin'))) : ?>
@@ -304,4 +304,53 @@ $('#cliente_id').select2({
}
});
+
+$('#editarValidada').on('click', function(){
+
+ $('.update-cabecera').prop('disabled', false);
+});
+
+
+$('#duplicar').on('click', function() {
+ var id = =$facturaEntity->id ?>;
+ var url = '= route_to('duplicarFactura', ':id') ?>';
+ url = url.replace(':id', id );
+ $.ajax({
+ url: url,
+ type: 'POST',
+ data: {
+ = csrf_token() ?? "token" ?>: = csrf_token() ?>v,
+ },
+ success: function(response){
+ if('error' in response){
+
+ } else {
+ var url = '= route_to('editarFactura', ':id') ?>';
+ url = url.replace(':id', response.id);
+
+ window.location.href = url;
+ }
+ }
+ });
+});
+
+
+$(".update-cabecera").on("change", function(){
+
+ $.ajax({
+ url: '= route_to('updateCabecera', $facturaEntity->id) ?>',
+ type: 'POST',
+ data: {
+ = csrf_token() ?? "token" ?>: = csrf_token() ?>v,
+ name: this.name,
+ value: $(this).val()
+ },
+ success: function(response){
+ if('error' in response){
+
+ }
+ }
+ });
+});
+
=$this->endSection() ?>
\ No newline at end of file
diff --git a/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php b/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php
index 09798fba..a392c655 100644
--- a/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php
+++ b/ci4/app/Views/themes/vuexy/form/facturas/_facturaLineasItems.php
@@ -13,7 +13,7 @@