diff --git a/ci4/app/Config/RBAC/permissionMatrix.php b/ci4/app/Config/RBAC/permissionMatrix.php index c9f0a2ee..63f2d991 100644 --- a/ci4/app/Config/RBAC/permissionMatrix.php +++ b/ci4/app/Config/RBAC/permissionMatrix.php @@ -49,6 +49,9 @@ const SK_PERMISSION_MATRIX = [ "tarifa-envio.edit", "tarifa-envio.delete", "tarifa-envio.menu", + "servicio-acabado.create", + "servicio-acabado.delete", + "servicio-acabado.menu", "proveedores.create", "proveedores.edit", "proveedores.delete", @@ -89,7 +92,6 @@ const SK_PERMISSION_MATRIX = [ "roles-permisos.edit", "roles-permisos.delete", "roles-permisos.menu", - "tickets.create", "tickets.edit", "tickets.menu", ], @@ -129,7 +131,6 @@ const SK_PERMISSION_MATRIX = [ "direcciones.menu", "presupuesto.create", "presupuesto.edit", - "presupuesto.delete", "presupuesto.menu", "presupuesto-cliente.create", "presupuesto-cliente.edit", @@ -221,10 +222,6 @@ const SK_PERMISSION_MATRIX = [ "tarifa-encuadernacion.edit", "tarifa-encuadernacion.delete", "tarifa-encuadernacion.menu", - "tarifa-extra.create", - "tarifa-extra.edit", - "tarifa-extra.delete", - "tarifa-extra.menu", "tarifa-envio.create", "tarifa-envio.edit", "tarifa-envio.delete", @@ -269,7 +266,6 @@ const SK_PERMISSION_MATRIX = [ "roles-permisos.edit", "roles-permisos.delete", "roles-permisos.menu", - "tickets.create", "tickets.edit", "tickets.menu", ], diff --git a/ci4/app/Config/RBAC/permissions.php b/ci4/app/Config/RBAC/permissions.php index 35e8235f..ac95e36a 100644 --- a/ci4/app/Config/RBAC/permissions.php +++ b/ci4/app/Config/RBAC/permissions.php @@ -53,6 +53,10 @@ const SK_PERMISSIONS = [ 'tarifa-envio.edit' => 'Can edit', 'tarifa-envio.delete' => 'Can delete', 'tarifa-envio.menu' => 'Menu shall be visualize', + 'servicio-acabado.create' => 'Can create', + 'servicio-acabado.edit' => 'Can edit', + 'servicio-acabado.delete' => 'Can delete', + 'servicio-acabado.menu' => 'Menu shall be visualize', 'proveedores.create' => 'Can create', 'proveedores.edit' => 'Can edit', 'proveedores.delete' => 'Can delete', @@ -93,7 +97,6 @@ const SK_PERMISSIONS = [ 'roles-permisos.edit' => 'Can edit', 'roles-permisos.delete' => 'Can delete', 'roles-permisos.menu' => 'Menu shall be visualize', - 'tickets.create' => 'Can create', 'tickets.edit' => 'Can edit', 'tickets.menu' => 'Menu shall be visualize', ]; diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index a0109cd4..b4f6144b 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -209,6 +209,19 @@ $routes->group('tarifasmanipulado', ['namespace' => 'App\Controllers\Tarifas'], $routes->resource('tarifasmanipulado', ['namespace' => 'App\Controllers\Tarifas', 'controller' => 'Tarifasmanipulado', 'except' => 'show,new,create,update']); +$routes->group('serviciosacabado', ['namespace' => 'App\Controllers\Tarifas\Acabados'], function ($routes) { + $routes->get('', 'ServiciosAcabado::index', ['as' => 'serviciosAcabadoList']); + $routes->get('add', 'ServiciosAcabado::add', ['as' => 'newServicioAcabado']); + $routes->post('add', 'ServiciosAcabado::add', ['as' => 'createServicioAcabado']); + $routes->get('edit/(:num)', 'ServiciosAcabado::edit/$1', ['as' => 'editServicioAcabado']); + $routes->post('edit/(:num)', 'ServiciosAcabado::edit/$1', ['as' => 'updateServicioAcabado']); + $routes->get('datatable', 'ServiciosAcabado::datatable'); + $routes->get('getselectedtarifas', 'ServiciosAcabado::getTarifasSeleccionadas'); + $routes->get('gettarifas', 'ServiciosAcabado::getTarifas'); +}); +$routes->resource('tarifasmanipulado', ['namespace' => 'App\Controllers\Tarifas\Acabados', 'controller' => 'ServiciosAcabado', 'except' => 'show,new,create,update']); + + $routes->group('tarifamanipuladolineas', ['namespace' => 'App\Controllers\Tarifas'], function ($routes) { $routes->get('', 'Tarifamanipuladolineas::index', ['as' => 'tarifaManipuladoLineaList']); $routes->get('add', 'Tarifamanipuladolineas::add', ['as' => 'newTarifaManipuladoLinea']); diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php b/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php index 53f8f45d..fd44b1da 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestoacabados.php @@ -137,10 +137,21 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController $newTokenHash = csrf_hash(); $csrfTokenName = csrf_token(); - $values = $this->model->getPrecioTarifa($tarifa_acabado_id, $tirada, $proveedor_id, $POD); + $data = []; + + $model = model('App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel'); + $tarifas = $model->getTarifasForServicio($tarifa_acabado_id); + + foreach ($tarifas as $tarifa) { + $values = $this->model->getPrecioTarifa($tarifa, $tirada, $proveedor_id, $POD); + $values[0]->tarifa_id = $tarifa; + array_push($data, $values[0]); + } + + //$values = $this->model->getPrecioTarifa($tarifa_acabado_id, $tirada, $proveedor_id, $POD); $data = [ - 'values' => $values, + 'values' => $data, $csrfTokenName => $newTokenHash ]; @@ -157,26 +168,31 @@ class Presupuestoacabados extends \App\Controllers\BaseResourceController $cubierta = $this->request->getGet("cubierta") ?? 0; $sobrecubierta = $this->request->getGet("sobrecubierta") ?? 0; + $cliente = $this->request->getGet("cliente") ?? 0; - $model = model('App\Models\Tarifas\Acabados\TarifaAcabadoModel'); + $model = model('App\Models\Tarifas\Acabados\ServicioAcabadoModel'); $query = $model->builder()->select( [ "id", "nombre as name" ] ) - ->where("lg_tarifa_acabado.is_deleted", 0) - ->where("lg_tarifa_acabado.mostrar_en_presupuesto", 1); + ->where("servicios_acabado.deleted_at", null); + if($cubierta == 1){ - $query->where("lg_tarifa_acabado.acabado_cubierta", 1); + $query->where("servicios_acabado.acabado_cubierta", 1); } else if ($sobrecubierta == 1){ - $query->where("lg_tarifa_acabado.acabado_sobrecubierta", 1); + $query->where("servicios_acabado.acabado_sobrecubierta", 1); + } + + if ($cliente == 1) { + $query->where("servicios_acabado.mostrar_en_presupuesto_cliente", 1); } if ($this->request->getGet("q")) { $query->groupStart() - ->orLike("lg_tarifa_acabado.nombre", $this->request->getGet("q")) + ->orLike("servicios_acabado.nombre", $this->request->getGet("q")) ->groupEnd(); } diff --git a/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php b/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php index 32085f3f..6fdfd9fa 100644 --- a/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestoadmin.php @@ -1128,18 +1128,21 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController $solapas = $this->request->getGet('solapas') ?? 0; $lomo = $this->request->getGet('lomo') ?? 0; - $anchoLibro = 2* $ancho + 2 * $solapas + $lomo; - $tipo = $this->request->getGet("tipo"); $uso = $this->request->getGet("uso") ?? 'interior'; + + $anchoLibro = $ancho; + $cubierta = false; if ($uso == 'cubierta') { $cubierta = true; + $anchoLibro = 2* $ancho + 2 * $solapas + $lomo; } $sobrecubierta = false; if ($uso == 'sobrecubierta') { $sobrecubierta = true; + $anchoLibro = 2* $ancho + 2 * $solapas + $lomo; } $guardas = false; if ($uso == 'guardas') { @@ -1191,7 +1194,7 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController $solapas = $this->request->getGet('solapas') ?? 0; $lomo = $this->request->getGet('lomo') ?? 0; - $anchoLibro = 2* $ancho + 2 * $solapas + $lomo; + $anchoLibro = $ancho; $tipo_impresion_id = $this->request->getGet("tipo_impresion"); $tapa_dura = model('App\Models\Configuracion\TipoPresupuestoModel')->get_isTapaDura(intval($tipo_impresion_id)); @@ -1202,10 +1205,12 @@ class Presupuestoadmin extends \App\Controllers\BaseResourceController $cubierta = false; if ($uso == 'cubierta') { $cubierta = true; + $anchoLibro = 2* $ancho + 2 * $solapas + $lomo; } $sobrecubierta = false; if ($uso == 'sobrecubierta') { $sobrecubierta = true; + $anchoLibro = 2* $ancho + 2 * $solapas + $lomo; } $guardas = false; if ($uso == 'guardas') { diff --git a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php index 8ffaac81..357dddb2 100755 --- a/ci4/app/Controllers/Presupuestos/Presupuestocliente.php +++ b/ci4/app/Controllers/Presupuestos/Presupuestocliente.php @@ -1290,37 +1290,55 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController // Servicios if ($sobrecubierta) { if (intval($sobrecubierta['acabado']) > 0) { - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $servicio = $model->getPrecioTarifa(intval($sobrecubierta['acabado']), intval($selected_tirada), -1, $POD); - if (count($servicio) > 0) { - if ($servicio[0]->total > 0) { - $this->guardarServicio($id, $servicio[0], 'acabado', false, true); + $modelServicioAcabado = model('App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel'); + $serviciosAcabado = $modelServicioAcabado->getTarifasForServicio($sobrecubierta['acabado']); + + foreach ($serviciosAcabado as $service) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $servicio = $model->getPrecioTarifa(intval($service), intval($selected_tirada), -1, $POD); + + if (count($servicio) > 0) { + if ($servicio[0]->total > 0) { + $this->guardarServicio($id, $servicio[0], 'acabado', false, true); + } } } } } if (intval($cubierta['acabado']) > 0) { - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $servicio = $model->getPrecioTarifa(intval($cubierta['acabado']), intval($selected_tirada), -1, $POD); - if (count($servicio) > 0) { - if ($servicio[0]->total > 0) { - $this->guardarServicio($id, $servicio[0], 'acabado', true, false); + $modelServicioAcabado = model('App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel'); + $serviciosAcabado = $modelServicioAcabado->getTarifasForServicio($sobrecubierta['acabado']); + + foreach ($serviciosAcabado as $service) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $servicio = $model->getPrecioTarifa(intval($service), intval($selected_tirada), -1, $POD); + + if (count($servicio) > 0) { + if ($servicio[0]->total > 0) { + $this->guardarServicio($id, $servicio[0], 'acabado', true, false); + } } } + } if (is_array($faja) && $faja !== [] && intval($faja['acabado']) > 0) { - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $servicio = $model->getPrecioTarifa(intval($faja['acabado']), intval($selected_tirada), -1, $POD); - if (count($servicio) > 0) { - if ($servicio[0]->total > 0) { - $this->guardarServicio($id, $servicio[0], 'acabado', false, false, true); + $modelServicioAcabado = model('App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel'); + $serviciosAcabado = $modelServicioAcabado->getTarifasForServicio($faja['acabado']); + + foreach ($serviciosAcabado as $service) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $servicio = $model->getPrecioTarifa(intval($service), intval($selected_tirada), -1, $POD); + + if (count($servicio) > 0) { + if ($servicio[0]->total > 0) { + $this->guardarServicio($id, $servicio[0], 'acabado', false, false, true); + } } } - } foreach ($resultado_presupuesto['values']['serviciosDefecto']['encuadernacion'] as $servicio) { $this->guardarServicio($id, $servicio, 'encuadernacion'); @@ -1415,10 +1433,10 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController 'url' => site_url('presupuestos/presupuestocliente/edit'), 'message' => lang('Basic.global.saveSuccess', [lang('Basic.global.record')]), ]); - }else{ + } else { return [ 'sk_id' => $id, - 'sk_url' => site_url('presupuestos/presupuestocliente/edit/' . $id) + 'sk_url' => site_url('presupuestos/presupuestocliente/edit/' . $id) ]; } } @@ -1439,7 +1457,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $data['lsc'] = $presupuesto->lomo_sobrecubierta; $data['eb'] = $presupuesto->envio_base; $data['state'] = intval($presupuesto->estado_id); - if($presupuesto->estado_id == 2){ // confirmado + if ($presupuesto->estado_id == 2) { // confirmado $data['datosGenerales']['selectedTirada'] = $presupuesto->tirada; } $data['datosGenerales']['titulo'] = $presupuesto->titulo; @@ -1492,7 +1510,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $data['cubierta']['solapas'] = $presupuesto->solapas ? 1 : 0; $data['cubierta']['solapas_ancho'] = $presupuesto->solapas_ancho; $data['cubierta']['cabezada'] = $presupuesto->cabezada; - $modelAcabado = model("App\Models\Tarifas\Acabados\TarifaAcabadoModel"); + $modelAcabado = model("App\Models\Tarifas\Acabados\ServicioAcabadoModel"); $data['cubierta']['acabado']['id'] = $presupuesto->acabado_cubierta_id; if ($presupuesto->acabado_cubierta_id == 0) { $data['cubierta']['acabado']['text'] = "Ninguno"; @@ -2127,36 +2145,41 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController // Acabado Cubierta if (intval($datos_entrada['cubierta']['acabado']) != 0) { + $modelServicioAcabado = model('App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel'); + $serviciosAcabado = $modelServicioAcabado->getTarifasForServicio(intval($datos_entrada['cubierta']['acabado'])); - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoCubierta = $model->getPrecioTarifa(intval($datos_entrada['cubierta']['acabado']), $datosPedido->tirada, -1, $POD); + foreach ($serviciosAcabado as $servicio) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $acabadoCubierta = $model->getPrecioTarifa(intval($servicio), $datosPedido->tirada, -1, $POD); - if (count($acabadoCubierta) > 0) { - if ($acabadoCubierta[0]->total <= 0) { + if (count($acabadoCubierta) > 0) { + if ($acabadoCubierta[0]->total <= 0) { - $input_data['tarifas_acabado_cubierta'] = intval($datos_entrada['cubierta']['acabado']); - $errorModel = new ErrorPresupuesto(); - $errorModel->insertError( - $datos_entrada['id'], - auth()->user()->id, - 'No se puede obtener acabados de cubierta', - $input_data - ); - $return_data = [ - 'errors' => (object) ([ - 'status' => 1 - ]), - ]; - return $return_data; - } - $coste_servicios += round(floatval($acabadoCubierta[0]->total), 2); - if ($extra_info) { - $totalServicios += round(floatval($acabadoCubierta[0]->total), 2); - $base = round(floatval($acabadoCubierta[0]->total / (1 + $acabadoCubierta[0]->margen / 100.0)), 2); - $base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada; - $margenServicios += round(floatval($acabadoCubierta[0]->total - $base), 2); + $input_data['tarifas_acabado_cubierta'] = intval($servicio); + $errorModel = new ErrorPresupuesto(); + $errorModel->insertError( + $datos_entrada['id'], + auth()->user()->id, + 'No se puede obtener acabados de cubierta', + $input_data + ); + $return_data = [ + 'errors' => (object) ([ + 'status' => 1 + ]), + ]; + return $return_data; + } + $coste_servicios += round(floatval($acabadoCubierta[0]->total), 2); + if ($extra_info) { + $totalServicios += round(floatval($acabadoCubierta[0]->total), 2); + $base = round(floatval($acabadoCubierta[0]->total / (1 + $acabadoCubierta[0]->margen / 100.0)), 2); + $base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada; + $margenServicios += round(floatval($acabadoCubierta[0]->total - $base), 2); + } } } + } @@ -2217,35 +2240,40 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController // Acabado sobrecubierta if (intval($datos_entrada['sobrecubierta']['acabado']) != 0) { - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoSobrecubierta = $model->getPrecioTarifa(intval($datos_entrada['sobrecubierta']['acabado']), $datosPedido->tirada, -1, $POD); + $modelServicioAcabado = model('App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel'); + $serviciosAcabado = $modelServicioAcabado->getTarifasForServicio(intval($datos_entrada['sobrecubierta']['acabado'])); - if (count($acabadoSobrecubierta) > 0) { + foreach ($serviciosAcabado as $servicio) { + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $acabadoSobrecubierta = $model->getPrecioTarifa(intval($servicio), $datosPedido->tirada, -1, $POD); - if ($acabadoSobrecubierta[0]->total <= 0) { + if (count($acabadoSobrecubierta) > 0) { - $input_data['tarifas_acabado_sobrecubierta'] = intval($datos_entrada['sobrecubierta']['acabado']); - $errorModel = new ErrorPresupuesto(); - $errorModel->insertError( - $datos_entrada['id'], - auth()->user()->id, - 'No se puede obtener acabados de sobrecubierta', - $input_data - ); - $return_data = [ - 'errors' => (object) ([ - 'status' => 1 - ]), - ]; - return $return_data; - } + if ($acabadoSobrecubierta[0]->total <= 0) { - $coste_servicios += round(floatval($acabadoSobrecubierta[0]->total), 2); - if ($extra_info) { - $totalServicios += round(floatval($acabadoSobrecubierta[0]->total), 2); - $base = round(floatval($acabadoSobrecubierta[0]->total / (1 + $acabadoSobrecubierta[0]->margen / 100.0)), 2); - $base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada; - $margenServicios += round(floatval($acabadoSobrecubierta[0]->total - $base), 2); + $input_data['tarifas_acabado_sobrecubierta'] = intval($servicio); + $errorModel = new ErrorPresupuesto(); + $errorModel->insertError( + $datos_entrada['id'], + auth()->user()->id, + 'No se puede obtener acabados de sobrecubierta', + $input_data + ); + $return_data = [ + 'errors' => (object) ([ + 'status' => 1 + ]), + ]; + return $return_data; + } + + $coste_servicios += round(floatval($acabadoSobrecubierta[0]->total), 2); + if ($extra_info) { + $totalServicios += round(floatval($acabadoSobrecubierta[0]->total), 2); + $base = round(floatval($acabadoSobrecubierta[0]->total / (1 + $acabadoSobrecubierta[0]->margen / 100.0)), 2); + $base = round(floatval($base / $datosPedido->tirada), 2) * $datosPedido->tirada; + $margenServicios += round(floatval($acabadoSobrecubierta[0]->total - $base), 2); + } } } } @@ -2370,14 +2398,18 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController // Acabado faja if (intval($faja['acabado']) != 0) { - $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); - $acabadoFaja = $model->getPrecioTarifa(intval($faja['acabado']), $datosPedido->tirada, -1, $POD); + $modelServicioAcabado = model('App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel'); + $serviciosAcabado = $modelServicioAcabado->getTarifasForServicio(intval($faja['acabado'])); + + foreach ($serviciosAcabado as $servicio) + $model = model('App\Models\Presupuestos\PresupuestoAcabadosModel'); + $acabadoFaja = $model->getPrecioTarifa(intval($servicio), $datosPedido->tirada, -1, $POD); if (count($acabadoFaja) > 0) { if ($acabadoFaja[0]->total <= 0) { - $input_data['tarifas_acabado_faja'] = intval($faja['acabado']); + $input_data['tarifas_acabado_faja'] = intval($servicio); $errorModel = new ErrorPresupuesto(); $errorModel->insertError( $datos_entrada['id'], @@ -2902,7 +2934,7 @@ class Presupuestocliente extends \App\Controllers\BaseResourceController $margenImpresion += round($linea['precio_impresion_horas'], 2); // coste de maquina y magen son MARGEN, no COSTE $margenImpresion += round($linea['margen_impresion_horas'], 2); $margenImpresion += round($linea['margen_click_pedido'], 2); - + } protected function calcular_lomo($lineas, $lomo_inicial) diff --git a/ci4/app/Controllers/Tarifas/Acabados/ServiciosAcabado.php b/ci4/app/Controllers/Tarifas/Acabados/ServiciosAcabado.php new file mode 100644 index 00000000..69c0066a --- /dev/null +++ b/ci4/app/Controllers/Tarifas/Acabados/ServiciosAcabado.php @@ -0,0 +1,327 @@ +viewData['pageTitle'] = lang('Servicioacabado.moduleTitle'); + $this->viewData['usingSweetAlert'] = true; + + $this->viewData = ['usingServerSideDataTable' => true]; + + // Breadcrumbs + $this->viewData['breadcrumb'] = [ + ['title' => lang("App.menu_tarifas"), 'route' => "javascript:void(0);", 'active' => false], + ['title' => lang("App.menu_servicioAcabado"), 'route' => route_to('serviciosAcabadoList'), 'active' => true] + ]; + + helper("time"); + parent::initController($request, $response, $logger); + } + + + public function index() + { + + checkPermission('tarifa-acabado.menu'); + + $viewData = [ + 'currentModule' => static::$controllerSlug, + 'pageSubTitle' => lang('Basic.global.ManageAllRecords', [lang('Servicioacabado.serviciosacabado')]), + 'servicioacabadoEntity' => new ServicioAcabadoEntity(), + 'usingServerSideDataTable' => true, + ]; + + $viewData = array_merge($this->viewData, $viewData); // merge any possible values from the parent controller class + + return view(static::$viewPath . 'viewServiciosAcabadoList', $viewData); + } + + public function add() + { + + checkPermission('tarifa-acabado.create', $this->indexRoute); + + if ($this->request->getPost()) : + + $nullIfEmpty = true; // !(phpversion() >= '8.1'); + + $postData = $this->request->getPost(); + + $sanitizedData = $this->sanitized($postData, $nullIfEmpty); + + $tarifasSeleccionadas = $postData['tarifasAcabado'] ?? []; + unset($postData['tarifasAcabado']); + + $sanitizedData = $this->sanitized($postData, $nullIfEmpty); + + $sanitizedData['user_updated_id'] = auth()->user()->id; + + if ($this->request->getPost('mostrar_en_presupuesto_cliente') == null) { + $sanitizedData['mostrar_en_presupuesto'] = false; + } + + if ($this->request->getPost('acabado_cubierta') == null) { + $sanitizedData['acabado_cubierta'] = false; + } + + if ($this->request->getPost('acabado_sobrecubierta') == null) { + $sanitizedData['acabado_sobrecubierta'] = false; + } + + $noException = true; + if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : + + + if ($this->canValidate()) : + try { + $successfulResult = $this->model->skipValidation(true)->save($sanitizedData); + } catch (\Exception $e) { + $noException = false; + $this->dealWithException($e); + } + else: + $this->viewData['errorMessage'] = lang('Basic.global.formErr1', [lang('Basic.global.record')]); + $this->session->setFlashdata('formErrors', $this->model->errors()); + endif; + + $thenRedirect = true; // Change this to false if you want your user to stay on the form after submission + endif; + if ($noException && $successfulResult) : + + $id = $this->model->db->insertID(); + + $message = lang('Basic.global.saveSuccess', [lang('Basic.global.record')]) . '.'; + + $modelTable = model("App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel"); + + foreach ($tarifasSeleccionadas as $tarifaId) { + $modelTable->insert(['servicio_id' => $id, 'tarifa_id' => $tarifaId, 'user_updated_id' => auth()->user()->id]); + } + + if ($thenRedirect) : + if (!empty($this->indexRoute)) : + return redirect()->to(site_url('/serviciosacabado/edit/' . $id))->with('message', $message); + else: + return $this->redirect2listView('sweet-success', $message); + endif; + else: + $this->session->setFlashData('sweet-success', $message); + endif; + + endif; // $noException && $successfulResult + + endif; // ($requestMethod === 'post') + + + $this->viewData['tarifasSeleccionadas'] = []; + $this->viewData['servicio'] = isset($sanitizedData) ? new ServicioAcabadoEntity($sanitizedData) : new ServicioAcabadoEntity(); + $this->viewData['formAction'] = route_to('createServicioAcabado'); + $this->viewData['boxTitle'] = lang('Basic.global.addNew') . ' ' . lang('ServicioAcabado.moduleTitle') . ' ' . lang('Basic.global.addNewSuffix'); + + + return $this->displayForm(__METHOD__); + } + + + public function edit($requestedId = null) + { + + if ($requestedId == null): + return $this->redirect2listView(); + endif; + $id = filter_var($requestedId, FILTER_SANITIZE_URL); + $servicio = $this->model->find($id); + + if ($servicio == false): + $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('ServicioAcabado.servicioacabado')), $id]); + return $this->redirect2listView('sweet-error', $message); + endif; + + if ($this->request->getPost()): + + $nullIfEmpty = true; // !(phpversion() >= '8.1'); + + $postData = $this->request->getPost(); + + $tarifasSeleccionadas = $postData['tarifasAcabado'] ?? []; + unset($postData['tarifasAcabado']); + + $sanitizedData = $this->sanitized($postData, $nullIfEmpty); + + $sanitizedData['user_updated_id'] = auth()->user()->id; + + if ($this->request->getPost('mostrar_en_presupuesto_cliente') == null) { + $sanitizedData['mostrar_en_presupuesto'] = false; + } + + if ($this->request->getPost('acabado_cubierta') == null) { + $sanitizedData['acabado_cubierta'] = false; + } + + if ($this->request->getPost('acabado_sobrecubierta') == null) { + $sanitizedData['acabado_sobrecubierta'] = false; + } + + + $noException = true; + if ($successfulResult = $this->canValidate()): // if ($successfulResult = $this->validate($this->formValidationRules) ) : + + + if ($this->canValidate()): + try { + $successfulResult = $this->model->skipValidation(true)->update($id, $sanitizedData); + } catch (\Exception $e) { + $noException = false; + $this->dealWithException($e); + } + else: + $this->viewData['warningMessage'] = lang('Basic.global.formErr1', [mb_strtolower(lang('ServicioAcabado.servicioacabado'))]); + $this->session->setFlashdata('formErrors', $this->model->errors()); + + endif; + + $servicio->fill($sanitizedData); + + $modelTable = model("App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel"); + + $modelTable->where('servicio_id',$id)->delete(); + foreach ($tarifasSeleccionadas as $tarifaId) { + $modelTable->insert(['servicio_id' => $id, 'tarifa_id' => $tarifaId, 'user_updated_id' => auth()->user()->id]); + } + + $thenRedirect = false; + endif; + + if ($noException && $successfulResult): + $id = $servicio->id ?? $id; + $message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]) . '.'; + + if ($thenRedirect): + if (!empty($this->indexRoute)): + return redirect()->to(route_to($this->indexRoute))->with('sweet-success', $message); + else: + return $this->redirect2listView('sweet-success', $message); + endif; + else: + $this->session->setFlashData('sweet-success', $message); + endif; + + endif; // $noException && $successfulResult + endif; // ($requestMethod === 'post') + + $this->viewData['servicio'] = $servicio; + + $this->viewData['tarifasSeleccionadas'] = $this->getTarifasSeleccionadasForView($id); + + $this->viewData['formAction'] = route_to('updateServicioAcabado', $id); + + $this->viewData['boxTitle'] = lang('Basic.global.edit2') . ' ' . lang('ServicioAcabado.moduleTitle') . ' ' . lang('Basic.global.edit3'); + + + return $this->displayForm(__METHOD__, $id); + } // end function edit(...) + + + public function datatable() + { + + $model = model(ServicioAcabadoModel::class); + $q = $model->getDatatableQuery(); + //return $this->response->setJSON($q->get()); + return DataTable::of($q) + ->add("action", callback: function ($q) { + return '' + . (auth()->user()->can("servicio-acabado.delete") ? + '' + : ''); + }) + ->edit( + "updated_at", + fn($q) => Time::createFromFormat("Y-m-d H:i:s", $q->updated_at)->format("d/m/Y") + ) + ->toJson(returnAsObject: true); + } + + + public function getTarifasSeleccionadasForView($servicioId){ + + $model = model("App\Models\Tarifas\Acabados\TarifasAcabadoServiciosAcabadoModel"); + $ids = $model->getTarifasForServicio($servicioId); + + return $ids; + } + + + public function getTarifasSeleccionadas() + { + $model = model("App\Models\Tarifas\Acabados\TarifaAcabadoModel"); + $ids = $this->request->getGet('ids'); + + if (empty($ids)) { + return $this->response->setJSON([]); + } + + $query = $model->select('lg_tarifa_acabado.id, lg_tarifa_acabado.nombre')->whereIn('lg_tarifa_acabado.id', $ids); + + $query->where('lg_tarifa_acabado.deleted_at', null); + + $tarifas = $query->findAll(); + + return $this->response->setJSON($tarifas); + } + + public function getTarifas() + { + $model = model("App\Models\Tarifas\Acabados\TarifaAcabadoModel"); + + $search = $this->request->getGet('search'); // Obtiene el parámetro de búsqueda + + $acabado_cubierta = $this->request->getGet('acabado_cubierta'); + $acabado_sobrecubierta = $this->request->getGet('acabado_sobrecubierta'); + + $query = $model->select('lg_tarifa_acabado.id, lg_tarifa_acabado.nombre'); + + if (!empty($search)) { + $query->like('lg_tarifa_acabado.nombre', $search); + } + + if($acabado_cubierta){ + $query->where('lg_tarifa_acabado.acabado_cubierta', $acabado_cubierta); + } + if($acabado_sobrecubierta){ + $query->where('lg_tarifa_acabado.acabado_sobrecubierta', $acabado_sobrecubierta); + } + + $query->where('lg_tarifa_acabado.deleted_at', null); + + $tarifas = $query->findAll(); + + return $this->response->setJSON($tarifas); + } + +} \ No newline at end of file diff --git a/ci4/app/Database/Migrations/2025-02-24-093400_serviciosAcabado.php b/ci4/app/Database/Migrations/2025-02-24-093400_serviciosAcabado.php new file mode 100644 index 00000000..86b95c2b --- /dev/null +++ b/ci4/app/Database/Migrations/2025-02-24-093400_serviciosAcabado.php @@ -0,0 +1,113 @@ +forge->addField([ + 'id' => [ + 'type' => 'INT', + 'constraint' => 11, + 'unsigned' => true, + 'auto_increment' => true, + ], + 'nombre' =>[ + 'type' => 'VARCHAR', + 'constraint' => 100, + ], + 'comentarios' => [ + 'type' => 'TEXT', + 'null' => true, + ], + 'acabado_cubierta' => [ + 'type' => 'BOOLEAN', + 'default' => false, + ], + 'acabado_sobrecubierta' => [ + 'type' => 'BOOLEAN', + 'default' => false, + ], + 'mostrar_en_presupuesto_cliente' => [ + 'type' => 'BOOLEAN', + 'default' => true, + ], + 'user_updated_id' => [ + 'type' => 'INT', + 'constraint' => 11, + 'unsigned' => true, + ], + 'created_at' => [ + 'type' => 'DATETIME', + 'null' => true, + ], + 'updated_at' => [ + 'type' => 'DATETIME', + 'null' => true, + ], + 'deleted_at' => [ + 'type' => 'DATETIME', + 'null' => true, + ], + ]); + + $this->forge->addPrimaryKey('id'); + $this->forge->addForeignKey('user_updated_id', 'users', 'id', 'CASCADE', 'CASCADE'); + + $this->forge->createTable('servicios_acabado'); + + $this->forge->addField([ + 'id' => [ + 'type' => 'INT', + 'constraint' => 11, + 'unsigned' => true, + 'auto_increment' => true, + ], + 'tarifa_id' => [ + 'type' => 'INT', + 'constraint' => 11, + 'unsigned' => true, + ], + 'servicio_id' => [ + 'type' => 'INT', + 'constraint' => 11, + 'unsigned' => true, + ], + 'user_updated_id' => [ + 'type' => 'INT', + 'constraint' => 11, + 'unsigned' => true, + ], + 'created_at' => [ + 'type' => 'DATETIME', + 'null' => true, + ], + 'updated_at' => [ + 'type' => 'DATETIME', + 'null' => true, + ], + 'deleted_at' => [ + 'type' => 'DATETIME', + 'null' => true, + ], + ]); + + $this->forge->addPrimaryKey('id'); + $this->forge->addForeignKey('servicio_id', 'servicios_acabado', 'id', 'NO_ACTION', 'NO_ACTION'); + $this->forge->addForeignKey('tarifa_id', 'lg_tarifa_acabado', 'id', 'NO_ACTION', 'NO_ACTION'); + $this->forge->addForeignKey('user_updated_id', 'users', 'id', 'NO_ACTION', 'NO_ACTION'); + + $this->forge->createTable('tarifasAcabado_serviciosAcabado'); + } + + public function down() + { + $this->forge->dropTable('servicios_acabado'); + $this->forge->dropTable('tarifasAcabado_serviciosAcabado'); + } +} diff --git a/ci4/app/Entities/Tarifas/Acabados/ServicioAcabadoEntity.php b/ci4/app/Entities/Tarifas/Acabados/ServicioAcabadoEntity.php new file mode 100644 index 00000000..da0fb821 --- /dev/null +++ b/ci4/app/Entities/Tarifas/Acabados/ServicioAcabadoEntity.php @@ -0,0 +1,23 @@ + null, + "nombre" => null, + 'mostrar_en_cliente' => false, + "comentarios" => null, + "user_updated_id" => 0, + "created_at" => null, + "updated_at" => null, + "deleted_at" => null, + ]; + protected $casts = [ + "mostrar_en_cliente" => "boolean", + "comentarios" => "string", + "user_updated_id" => "int", + ]; +} \ No newline at end of file diff --git a/ci4/app/Entities/Tarifas/Acabados/TarifasAcabadosServicioAcabadoEntity.php b/ci4/app/Entities/Tarifas/Acabados/TarifasAcabadosServicioAcabadoEntity.php new file mode 100644 index 00000000..05239d9d --- /dev/null +++ b/ci4/app/Entities/Tarifas/Acabados/TarifasAcabadosServicioAcabadoEntity.php @@ -0,0 +1,22 @@ + null, + "tarifa_id" => null, + 'servicio_id' => false, + "user_updated_id" => 0, + "created_at" => null, + "updated_at" => null, + "deleted_at" => null, + ]; + protected $casts = [ + "tarifa_id" => "int", + "servicio_id" => "int", + "user_updated_id" => "int", + ]; +} \ No newline at end of file diff --git a/ci4/app/Language/es/App.php b/ci4/app/Language/es/App.php index a24597ea..260274e6 100755 --- a/ci4/app/Language/es/App.php +++ b/ci4/app/Language/es/App.php @@ -797,6 +797,7 @@ return [ "menu_tarifamanipulado" => "Manipulado", "menu_tarifaencuadernacion" => "Encuadernación", "menu_tarifapapelcompra" => "Papel compra", + "menu_servicioAcabado" => "Servicios acabado", "menu_tarifaacabado" => "Acabado", "menu_tarifapapeldefecto" => "Papel defecto", "menu_tarifaenvio" => "Envío", diff --git a/ci4/app/Language/es/RolesPermisos.php b/ci4/app/Language/es/RolesPermisos.php index ccc4176a..9fbe24ba 100644 --- a/ci4/app/Language/es/RolesPermisos.php +++ b/ci4/app/Language/es/RolesPermisos.php @@ -38,6 +38,7 @@ return [ 'tarifaPreimpresionSection' => 'Tarifas de preimpresión', 'tarifaManipuladoSection' => 'Tarifas de manipulado', 'tarifaAcabadoSection' => 'Tarifas de acabado', + 'servicioAcabadoSection' => 'Servicios de acabado', 'tarifaEncuadernacionSection' => 'Tarifas de encuadernación', 'tarifaEnvioSection' => 'Tarifas de envio', 'tarifaExtraSection' => 'Tarifas extra', diff --git a/ci4/app/Language/es/ServicioAcabado.php b/ci4/app/Language/es/ServicioAcabado.php new file mode 100755 index 00000000..5be98521 --- /dev/null +++ b/ci4/app/Language/es/ServicioAcabado.php @@ -0,0 +1,30 @@ + 'ID', + 'moduleTitle' => 'Servicios Acabado', + 'nombre' => 'Nombre', + 'comentarios' => 'Comentarios', + 'mostrar_en_presupuesto_cliente' => 'Mostrar en presupuesto (cliente)', + 'serviciosacabado' => 'Servicios Acabado', + 'servicioacabado' => 'Servicio Acabado', + 'tarifasacabado' => 'Tarifas Acabado', + "servicio_cubierta" => "Servicio cubierta", + "servicio_sobrecubierta" => "Servicio sobrecubierta", + 'tarifaacabado' => 'Tarifa Acabado', + 'servicioscabadoList' => 'Lista Servicios Acabado', + 'updatedAt' => 'Actualizado en', + 'createdAt' => 'Creado en', + 'deletedAt' => 'Borrado en', + 'userUpdateId' => 'Modificado por', + 'validation' => [ + 'nombre' => [ + 'max_length' => 'El campo {field} no puede exceder {param} caracteres en longitud.', + 'required' => 'El campo {field} es obligatorio.', + 'is_unique' => 'Ya existe un servicio con el campo {field} guardado.', + ], + ], +]; \ No newline at end of file diff --git a/ci4/app/Models/Tarifas/Acabados/ServicioAcabadoModel.php b/ci4/app/Models/Tarifas/Acabados/ServicioAcabadoModel.php new file mode 100644 index 00000000..fbf51dea --- /dev/null +++ b/ci4/app/Models/Tarifas/Acabados/ServicioAcabadoModel.php @@ -0,0 +1,49 @@ + [ + "label" => "ServicioAcabado.nombre", + "rules" => "trim|required|max_length[100]", + ], + ]; + + public function getDatatableQuery(): BaseBuilder + { + $builder = $this->db + ->table($this->table . " t1") + ->select( + "t1.id, + t1.nombre, + t1.acabado_cubierta, + t1.acabado_sobrecubierta, + t1.mostrar_en_presupuesto_cliente, + CONCAT(users.first_name, ' ', users.last_name) as user_updated, + t1.updated_at", + ) + ->join("users", "t1.user_updated_id = users.id", "left") + ->where("t1.deleted_at", null); + return $builder; + } +} + + diff --git a/ci4/app/Models/Tarifas/Acabados/TarifasAcabadoServiciosAcabadoModel.php b/ci4/app/Models/Tarifas/Acabados/TarifasAcabadoServiciosAcabadoModel.php new file mode 100644 index 00000000..0f5643e9 --- /dev/null +++ b/ci4/app/Models/Tarifas/Acabados/TarifasAcabadoServiciosAcabadoModel.php @@ -0,0 +1,39 @@ +db + ->table($this->table . " t1") + ->select( + "t1.tarifa_id", + ) + ->where("t1.servicio_id", $servicioId) + ->where("t1.deleted_at", null); + $ids = $builder->get()->getResultArray(); + + return array_column($ids, 'tarifa_id'); + } + +} + + diff --git a/ci4/app/Views/themes/vuexy/form/tarifas/acabado/viewServiciosAcabadoForm.php b/ci4/app/Views/themes/vuexy/form/tarifas/acabado/viewServiciosAcabadoForm.php new file mode 100644 index 00000000..4d829cba --- /dev/null +++ b/ci4/app/Views/themes/vuexy/form/tarifas/acabado/viewServiciosAcabadoForm.php @@ -0,0 +1,100 @@ +include("themes/_commonPartialsBs/select2bs5") ?> +include("themes/_commonPartialsBs/sweetalert") ?> +extend('themes/vuexy/main/defaultlayout') ?> + +section("content") ?> +
+
+
+
+

+
+
+ + + getErrors()) ? $validation->listErrors("bootstrap_style") : "" ?> +
+
+
+ + +
+ +
+ Seleccione si es servicio cubierta o sobrecubierta (o ambos) antes de + seleccionar las tarifas asociadas. Al cambiar estas opciones, se borrará la + selección. +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ + +
+
+ + +
+ + +
+ + +
+ +
+ +
+ user()->can('tarifa-acabado.edit')): ?> + " /> + + "btn btn-secondary float-start"]) ?> +
+
+
+
+
+ +endSection() ?> + +section('additionalExternalJs') ?> + + + +endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/form/tarifas/acabado/viewServiciosAcabadoList.php b/ci4/app/Views/themes/vuexy/form/tarifas/acabado/viewServiciosAcabadoList.php new file mode 100644 index 00000000..c8860f11 --- /dev/null +++ b/ci4/app/Views/themes/vuexy/form/tarifas/acabado/viewServiciosAcabadoList.php @@ -0,0 +1,59 @@ +include('themes/_commonPartialsBs/datatables') ?> +include('themes/_commonPartialsBs/_confirm2delete') ?> +extend('themes/vuexy/main/defaultlayout') ?> +section('content'); ?> +
+
+ +
+
+

+ user()->can('servicio-acabado.create')): ?> + 'btn btn-primary float-end']); ?> + +
+
+ + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+ + +endSection() ?> + + +section('additionalExternalJs') ?> + + + + + + + + + + +endSection() ?> + diff --git a/ci4/app/Views/themes/vuexy/main/menus/tarifas_menu.php b/ci4/app/Views/themes/vuexy/main/menus/tarifas_menu.php index 5705c3e4..28160327 100644 --- a/ci4/app/Views/themes/vuexy/main/menus/tarifas_menu.php +++ b/ci4/app/Views/themes/vuexy/main/menus/tarifas_menu.php @@ -5,6 +5,7 @@ if ( auth()->user()->can('tarifa-preimpresion.menu') || auth()->user()->can('tarifa-manipulado.menu') || + auth()->user()->can('servicio-acabado.menu') || auth()->user()->can('tarifa-acabado.menu') || auth()->user()->can('tarifa-encuadernacion.menu') || auth()->user()->can('tarifa-envio.menu') || @@ -39,6 +40,13 @@ if ( + user()->can('servicio-acabado.menu')) { ?> + + user()->can('tarifa-encuadernacion.menu')) { ?>