diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 4d5746c2..4feb4e14 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -39,13 +39,13 @@ $routes->group('tarifas', ['namespace' => 'App\Controllers\Tarifas'], function ( /* Cliente */ $routes->group('acabados', ['namespace' => 'App\Controllers\Tarifas\Acabados'], function ($routes) { - + $routes->get('', 'TarifaAcabados::index', ['as' => 'tarifaAcabadoList']); $routes->match(['get', 'post'], 'add', 'TarifaAcabados::add', ['as' => 'tarifaAcabadoAdd']); $routes->match(['get', 'post'], 'edit/(:num)', 'TarifaAcabados::edit/$1', ['as' => 'tarifaAcabadoEdit']); $routes->get('delete/(:num)', 'TarifaAcabados::delete/$1', ['as' => 'tarifaAcabadoDelete']); $routes->post('datatable', 'TarifaAcabados::datatable', ['as' => 'tarifaAcabadoDT']); - + $routes->get('select','TarifaAcabados::show_select',["as" => "showSelectTarifaAcabado"]); $routes->group('lineas', ['namespace' => 'App\Controllers\Tarifas\Acabados'], function ($routes) { $routes->post('datatable', 'TarifaAcabadosLineas::datatable', ['as' => 'tarifaAcabadoLineasDT']); $routes->post('datatable_editor', 'TarifaAcabadosLineas::datatable_editor', ['as' => 'tarifaAcabadoLineasDTE']); @@ -92,6 +92,14 @@ $routes->group('configuracion', ['namespace' => 'App\Controllers\Configuracion'] $routes->get('datatable', 'ConfigErrores::datatable', ['as' => 'erroresPresupuestoDatatable']); $routes->post('edit/(:num)', 'ConfigErrores::update_error_presupuesto/$1', ['as' => 'erroresPresupuestoUpdate']); }); + $routes->group("servicios", ["namespace" => 'App\Controllers\Configuracion'], function ($routes) { + $routes->get('', 'ServicioCliente::index', ['as' => 'servicioClienteList']); + $routes->get('(:num)', 'ServicioCliente::show/$1', ['as' => 'servicioClienteShow']); + $routes->post('(:num)', 'ServicioCliente::store/$1', ['as' => 'servicioClienteStore']); + $routes->post('update/(:num)', 'ServicioCliente::update_servicio_cliente/$1', ['as' => 'updateServicioCliente']); + $routes->get('edit/(:num)', 'ServicioCliente::viewForm/$1', ['as' => 'servicioClienteViewForm']); + $routes->get('datatable', 'ServicioCliente::datatable', ['as' => 'servicioClienteDatatable']); + }); }); @@ -159,6 +167,8 @@ $routes->group('tarifasmanipulado', ['namespace' => 'App\Controllers\Tarifas'], $routes->post('datatable', 'Tarifasmanipulado::datatable', ['as' => 'dataTableOfTarifasManipulado']); $routes->post('allmenuitems', 'Tarifasmanipulado::allItemsSelect', ['as' => 'select2ItemsOfTarifasManipulado']); $routes->post('menuitems', 'Tarifasmanipulado::menuItems', ['as' => 'menuItemsOfTarifasManipulado']); + $routes->get('select','Tarifasmanipulado::show_select',["as" => "showSelectTarifaManipulado"]); + }); $routes->resource('tarifasmanipulado', ['namespace' => 'App\Controllers\Tarifas', 'controller' => 'Tarifasmanipulado', 'except' => 'show,new,create,update']); diff --git a/ci4/app/Controllers/Configuracion/ServicioCliente.php b/ci4/app/Controllers/Configuracion/ServicioCliente.php new file mode 100644 index 00000000..bc282142 --- /dev/null +++ b/ci4/app/Controllers/Configuracion/ServicioCliente.php @@ -0,0 +1,89 @@ +servicioClienteModel = model(ServicioClienteModel::class); + } + + + public function index() + { + $this->viewData['breadcrumb'] = [ + ['title' => lang("App.menu_configuration"), 'route' => "javascript:void(0);", 'active' => false], + ['title' => lang("App.menu_servicios_cliente"), 'route' => site_url('configuracion/servicios'), 'active' => true] + ]; + return view(static::$viewPath . $this->indexRoute, $this->viewData); + } + public function viewForm(int $servicio_cliente_id) + { + $servicioCliente = $this->servicioClienteModel->find($servicio_cliente_id); + $this->viewData['breadcrumb'] = [ + ['title' => lang("App.menu_configuration"), 'route' => "javascript:void(0);", 'active' => false], + ['title' => lang("App.menu_servicios_cliente"), 'route' => site_url('configuracion/servicios'), 'active' => false], + ['title' => $servicioCliente->nombre, 'route' => site_url('configuracion/servicios/edit/' . $servicio_cliente_id), 'active' => true] + ]; + $this->viewData["model"] = $servicioCliente; + + return view(static::$viewPath . 'ServicioClienteEdit', $this->viewData); + } + public function show(int $id) + { + $data = $this->servicioClienteModel->find($id)->withAllTarifas(); + return $this->response->setJSON($data); + } + public function update_servicio_cliente(int $id) + { + $data = $this->request->getPost(); + $status = $this->servicioClienteModel->update($id, [ + "nombre" => $data["nombre"], + "code" => $data["code"] + ]); + if (isset($data["tarifa_manipulado_id"])) { + $this->servicioClienteModel->upsertTarifaManipulado($id, $data["tarifa_manipulado_id"]); + }else if(isset($data["tarifa_acabado_id"])) { + + $this->servicioClienteModel->upsertTarifaAcabado($id, $data["tarifa_acabado_id"]); + }else{ + $this->servicioClienteModel->detachTarifas($id); + } + + return $this->response->setJSON(["message" => lang("App.global_success"), "status" => $status]); + } + public function store() + { + // $this->servicioClienteModel->update($id,[$this->request->getPost()]); + return $this->response->setJSON([]); + } + public function datatable() + { + $query = $this->servicioClienteModel->getQueryDatatable()->orderBy("created_at", "DESC"); + return DataTable::of($query) + ->edit('created_at', fn($q) => $q->created_at ? Time::createFromFormat('Y-m-d H:i:s', $q->created_at)->format("d/m/Y H:i") : "") + ->add("action", fn($q) => $q->id) + ->toJson(true); + } +} diff --git a/ci4/app/Controllers/Tarifas/Acabados/TarifaAcabados.php b/ci4/app/Controllers/Tarifas/Acabados/TarifaAcabados.php index 85920898..7c4d4c54 100644 --- a/ci4/app/Controllers/Tarifas/Acabados/TarifaAcabados.php +++ b/ci4/app/Controllers/Tarifas/Acabados/TarifaAcabados.php @@ -1,4 +1,6 @@ -viewData['proveedores'] = $this->getProveedores(); + $this->viewData['proveedores'] = $this->getProveedores(); $this->viewData['tarifaacabadoEntity'] = isset($sanitizedData) ? new TarifaAcabadoEntity($sanitizedData) : new TarifaAcabadoEntity(); $this->viewData['formAction'] = route_to('tarifaAcabadoAdd'); @@ -169,7 +171,7 @@ class TarifaAcabados extends BaseResourceController // JJO $sanitizedData['user_updated_id'] = auth()->user()->id; - + if ($this->request->getPost('mostrar_en_presupuesto') == null) { $sanitizedData['mostrar_en_presupuesto'] = false; } @@ -181,7 +183,7 @@ class TarifaAcabados extends BaseResourceController if ($this->request->getPost('acabado_sobrecubierta') == null) { $sanitizedData['acabado_sobrecubierta'] = false; } - + $noException = true; if ($successfulResult = $this->canValidate()) : // if ($successfulResult = $this->validate($this->formValidationRules) ) : @@ -207,7 +209,7 @@ class TarifaAcabados extends BaseResourceController if ($noException && $successfulResult) : $id = $tarifaacabadoEntity->id ?? $id; - $message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]) .'.'; + $message = lang('Basic.global.updateSuccess', [lang('Basic.global.record')]) . '.'; if ($thenRedirect) : if (!empty($this->indexRoute)) : @@ -312,12 +314,26 @@ class TarifaAcabados extends BaseResourceController } } - private function getProveedores(){ + private function getProveedores() + { $provTipoModel = new ProveedorTipoModel(); $provModel = new ProveedorModel(); $tipoId = $provTipoModel->getTipoId("Acabados"); return $provModel->getProvList($tipoId); } - + public function show_select() + { + $query = $this->model->builder() + ->select( + ["id", "nombre as name", "code as description"] + ) + ->where("deleted_at",null); + if ($this->request->getGet("q")) { + $query->groupStart() + ->orLike("nombre", $this->request->getGet("q")) + ->groupEnd(); + } + return $this->response->setJSON($query->get()->getResultObject()); + } } diff --git a/ci4/app/Controllers/Tarifas/Tarifasmanipulado.php b/ci4/app/Controllers/Tarifas/Tarifasmanipulado.php index 29833e50..ce497cd4 100755 --- a/ci4/app/Controllers/Tarifas/Tarifasmanipulado.php +++ b/ci4/app/Controllers/Tarifas/Tarifasmanipulado.php @@ -1,4 +1,6 @@ -viewData['tarifaManipuladoEntity'] = isset($sanitizedData) ? new TarifaManipuladoEntity($sanitizedData) : new TarifaManipuladoEntity(); - $this->viewData['formAction'] = site_url('tarifas/tarifasmanipulado/add');//route_to('createTarifaManipulado'); + $this->viewData['formAction'] = site_url('tarifas/tarifasmanipulado/add'); //route_to('createTarifaManipulado'); $this->viewData['boxTitle'] = lang('Basic.global.addNew') . ' ' . lang('Tarifamanipulado.moduleTitle') . ' ' . lang('Basic.global.addNewSuffix'); @@ -153,7 +155,7 @@ class Tarifasmanipulado extends \App\Controllers\BaseResourceController $message = lang('Basic.global.notFoundWithIdErr', [mb_strtolower(lang('Tarifamanipulado.tarifamanipulado')), $id]); return $this->redirect2listView('sweet-error', $message); endif; - + if ($this->request->getPost()) : @@ -293,5 +295,19 @@ class Tarifasmanipulado extends \App\Controllers\BaseResourceController return $this->failUnauthorized('Invalid request', 403); } } + public function show_select() + { + $query = $this->model->builder() + ->select( + ["id", "nombre as name", "code as description"] + ) + ->where("deleted_at", null); + if ($this->request->getGet("q")) { + $query->groupStart() + ->orLike("nombre", $this->request->getGet("q")) + ->groupEnd(); + } + return $this->response->setJSON($query->get()->getResultObject()); + } } diff --git a/ci4/app/Database/Migrations/2024-11-30-160000_TareasServicioTable.php b/ci4/app/Database/Migrations/2024-11-30-160000_TareasServicioTable.php index f8cc36e9..3efceaa0 100644 --- a/ci4/app/Database/Migrations/2024-11-30-160000_TareasServicioTable.php +++ b/ci4/app/Database/Migrations/2024-11-30-160000_TareasServicioTable.php @@ -11,7 +11,7 @@ class ServicioClienteTareas extends Migration "id" => [ "type" => "INT", "unsigned" => true, - "autoincrement" => true + "auto_increment" => true ], "servicio_cliente_id" => [ "type" => "INT", @@ -21,12 +21,14 @@ class ServicioClienteTareas extends Migration "tarifa_acabado_id" => [ "type" => "INT", "unsigned" => true, + "null" => true, "comment" => "Tarifa de acabado asociada a servicio" ], "tarifa_manipulado_id" => [ "type" => "INT", "unsigned" => true, - "comment" => "Tarifa de manipulado asociada a servicio" + "null" => true, + "comment" => "Tarifa de manipulado asociada a servicio", ] ]; @@ -51,6 +53,8 @@ class ServicioClienteTareas extends Migration ], ]); + $this->forge->addPrimaryKey("id"); + $this->forge->addForeignKey('servicio_cliente_id','servicios_cliente','id'); $this->forge->addForeignKey('tarifa_acabado_id','lg_tarifa_acabado','id'); $this->forge->addForeignKey('tarifa_manipulado_id','lg_tarifa_manipulado','id'); diff --git a/ci4/app/Database/Migrations/2024-12-08-195700_AlterColumnServiciosCliente.php b/ci4/app/Database/Migrations/2024-12-08-195700_AlterColumnServiciosCliente.php new file mode 100644 index 00000000..61a5aabc --- /dev/null +++ b/ci4/app/Database/Migrations/2024-12-08-195700_AlterColumnServiciosCliente.php @@ -0,0 +1,38 @@ + [ + "name" => "deleted_at", + "type" => "datetime", + "default" => null, + "null" => true, + ], + "updated_at" => [ + "name" => "updated_at", + "type" => "datetime", + "default" => null, + "null" => true, + ], + ]; + public function up() + { + $this->forge->modifyColumn("servicios_cliente", $this->ALTER_COLUMNS); + } + + public function down() + { + $this->forge->addField([ + "is_deleted" => [ + "type" => "boolean", + "default" => false, + "null" => false, + ] + ]); + } +} diff --git a/ci4/app/Entities/Configuracion/ServicioClienteEntity.php b/ci4/app/Entities/Configuracion/ServicioClienteEntity.php new file mode 100644 index 00000000..1c824f3e --- /dev/null +++ b/ci4/app/Entities/Configuracion/ServicioClienteEntity.php @@ -0,0 +1,59 @@ + null, + "code" => null, + ]; + protected $casts = [ + "nombre" => "string", + "code" => "string", + ]; + + public function withManipuladoTarifas() + { + $this->attributes["tarifas_manipulado"] = $this->getManipuladoTarifas(); + return $this; + } + public function withAcabadoTarifas() + { + $this->attributes["tarifas_acabado"] = $this->getAcabadoTarifas(); + return $this; + } + public function withAllTarifas(){ + $this->withManipuladoTarifas(); + $this->withAcabadoTarifas(); + return $this; + } + public function getManipuladoTarifas(): ?object + { + $model = model(ServicioClienteModel::class); + return $model->builder()->select("lg_tarifa_manipulado.*") + ->join("servicio_cliente_tareas","servicio_cliente_tareas.servicio_cliente_id = servicios_cliente.id",'left') + ->join("lg_tarifa_manipulado","lg_tarifa_manipulado.id = servicio_cliente_tareas.tarifa_manipulado_id",'left') + ->where("servicio_cliente_tareas.servicio_cliente_id",$this->attributes["id"]) + ->where("lg_tarifa_manipulado.id IS NOT NULL",NULL,FALSE) + ->where("servicio_cliente_tareas.deleted_at", NULL) // Exclude soft-deleted rows + ->get()->getFirstRow(); + } + public function getAcabadoTarifas(): ?object + { + $model = model(ServicioClienteModel::class); + return $model->builder()->select("lg_tarifa_acabado.*") + ->join("servicio_cliente_tareas","servicio_cliente_tareas.servicio_cliente_id = servicios_cliente.id",'left') + ->join("lg_tarifa_acabado","lg_tarifa_acabado.id = servicio_cliente_tareas.tarifa_acabado_id",'left') + ->where("servicio_cliente_tareas.servicio_cliente_id",$this->attributes["id"]) + ->where("servicio_cliente_tareas.deleted_at", NULL) // Exclude soft-deleted rows + ->where("lg_tarifa_acabado.id IS NOT NULL",NULL,FALSE) + ->get()->getFirstRow(); + } +} diff --git a/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php index 68bef7a7..d8c3ff53 100644 --- a/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php +++ b/ci4/app/Entities/Produccion/OrdenTrabajoEntity.php @@ -1,5 +1,5 @@ "Papel generico", "menu_papelimpresion" => "Papel impresión", "menu_series_facturas" => "Series facturas", + "menu_servicios_cliente" => "Servicios cliente", "menu_ubicaciones" => "Ubicaciones", "menu_serviciocliente" => "Servicio cliente", "menu_tamanioformatos" => "Tamaño formatos", diff --git a/ci4/app/Language/es/ServicioCliente.php b/ci4/app/Language/es/ServicioCliente.php new file mode 100644 index 00000000..5218a72b --- /dev/null +++ b/ci4/app/Language/es/ServicioCliente.php @@ -0,0 +1,14 @@ + "Servicios cliente", + "infoTarifaManipulado" => "La tarifa seleccionada estará asociada al servicio.", + "infoTarifaAcabado" => "La tarifa seleccionada estará asociada al servicio.", + + "datatable" => [ + "nombre" => "Nombre", + "code" => "Código", + "created_at" => "Fecha creación", + ] +]; \ No newline at end of file diff --git a/ci4/app/Models/Configuracion/ServicioClienteModel.php b/ci4/app/Models/Configuracion/ServicioClienteModel.php new file mode 100644 index 00000000..657081b5 --- /dev/null +++ b/ci4/app/Models/Configuracion/ServicioClienteModel.php @@ -0,0 +1,143 @@ +builder()->select(["id", "nombre", "code", "created_at"])->where("deleted_at", null); + return $q; + } + /** + * Actualiza la tarifa de acabado `lg_tarifas_acabado` si ya existe una asociada o inserta si ya no existe. + * + * @param integer $servicio_cliente_id + * @param integer $tarifa_acabado_id + * @return boolean + */ + public function upsertTarifaAcabado(int $servicio_cliente_id, int $tarifa_acabado_id): bool + { + $servicioClienteTareaModel = model(ServicioClienteTareaModel::class); + $q = $servicioClienteTareaModel + ->where("servicio_cliente_id", $servicio_cliente_id); + if ($q->countAllResults() > 0) { + $this->detachTarifas($servicio_cliente_id); + } + $r = $this->attachTarifaAcabado($servicio_cliente_id, $tarifa_acabado_id); + return $r; + } + /** + * Actualiza la tarifa de manipulado `lg_tarifas_manipulado` si ya existe una asociada o inserta si ya no existe. + * + * @param integer $servicio_cliente_id + * @param integer $tarifa_manipulado_id + * @return boolean + */ + public function upsertTarifaManipulado(int $servicio_cliente_id, int $tarifa_manipulado_id): bool + { + $servicioClienteTareaModel = model(ServicioClienteTareaModel::class); + $q = $servicioClienteTareaModel + ->where("servicio_cliente_id", $servicio_cliente_id); + if ($q->countAllResults() > 0) { + $this->detachTarifas($servicio_cliente_id); + } + $r = $this->attachTarifaManipulado($servicio_cliente_id, $tarifa_manipulado_id); + return $r; + } + /** + * Asocia tarifa de acabado a servicio cliente + * + * @param integer $servicio_cliente_id + * @param integer $tarifa_acabado_id + * @return integer + */ + public function attachTarifaAcabado(int $servicio_cliente_id, int $tarifa_acabado_id): int + { + $servicioClienteTareaModel = model(ServicioClienteTareaModel::class); + $id = $servicioClienteTareaModel->insert([ + "servicio_cliente_id" => $servicio_cliente_id, + "tarifa_acabado_id" => $tarifa_acabado_id + ]); + return $id; + } + /** + * Asocia tarifa de manipulado a servicio cliente + * + * @param integer $servicio_cliente_id + * @param integer $tarifa_manipulado_id + * @return integer + */ + public function attachTarifaManipulado(int $servicio_cliente_id, int $tarifa_manipulado_id): int + { + $servicioClienteTareaModel = model(ServicioClienteTareaModel::class); + $id = $servicioClienteTareaModel->insert([ + "servicio_cliente_id" => $servicio_cliente_id, + "tarifa_manipulado_id" => $tarifa_manipulado_id + ]); + return $id; + } + /** + * Elimina todas las tarifas asociadas a un servicio cliente + * + * @param integer $servicio_cliente_id + * @return bool + */ + public function detachTarifas(int $servicio_cliente_id): bool + { + $servicioClienteTareaModel = model(ServicioClienteTareaModel::class); + $s = $servicioClienteTareaModel->where("servicio_cliente_id", $servicio_cliente_id)->delete(); + return $s; + } +} diff --git a/ci4/app/Models/Configuracion/ServicioClienteTareaModel.php b/ci4/app/Models/Configuracion/ServicioClienteTareaModel.php new file mode 100644 index 00000000..8017161e --- /dev/null +++ b/ci4/app/Models/Configuracion/ServicioClienteTareaModel.php @@ -0,0 +1,53 @@ +" data-id="= $model->id ?>"> +
| = lang('ServicioCliente.datatable.nombre') ?> | += lang('ServicioCliente.datatable.code') ?> | += lang('ServicioCliente.datatable.created_at') ?> | += lang('Basic.global.Action') ?> | +
|---|