implementado pestaña clientes en usuarios

This commit is contained in:
2024-12-15 12:24:49 +01:00
parent 7c5fdc0c88
commit 9a0581319c
7 changed files with 228 additions and 80 deletions

View File

@ -425,6 +425,9 @@ $routes->resource('clienteplantillaprecioslineas', ['namespace' => 'App\Controll
$routes->group('clienteusuarios', ['namespace' => 'App\Controllers\Clientes'], function ($routes) {
$routes->post('datatable', 'Clienteusuarios::datatable', ['as' => 'dataTableOfClienteUsuarios']);
$routes->post('adduser', 'Clienteusuarios::addUserToClient');
$routes->get('delete/(:num)', 'Clienteusuarios::removeClienteFromUser/$1');
$routes->get('getusers', 'Clienteusuarios::getAvailableUsers');
});

View File

@ -1,4 +1,5 @@
<?php namespace App\Controllers\Clientes;
<?php
namespace App\Controllers\Clientes;
use App\Controllers\BaseResourceController;
@ -40,6 +41,59 @@ class Clienteusuarios extends \App\Controllers\BaseResourceController
parent::initController($request, $response, $logger);
}
public function removeClienteFromUser($user_id)
{
if ($this->request->isAJAX()) {
if (intval($user_id) > 0) {
$this->model->removeClienteFromUser($user_id);
return $this->respond(['status' => 'success', 'msg' => 'Usuario eliminado correctamente']);
}
} else {
return $this->failUnauthorized('Invalid request', 403);
}
}
public function addUserToClient(){
if ($this->request->isAJAX()) {
$user_id = $this->request->getPost("user_id");
$cliente_id = $this->request->getPost("cliente_id");
if (intval($user_id) > 0 && intval($cliente_id) > 0) {
$this->model->addUserToClient($user_id, $cliente_id);
return $this->respond(['status' => 'success', 'msg' => 'Usuario añadido correctamente']);
}
} else {
return $this->failUnauthorized('Invalid request', 403);
}
}
public function getAvailableUsers()
{
if ($this->request->isAJAX()) {
$query = $this->model->builder()->select(
[
"id",
"CONCAT(first_name, ' ', last_name) as name"
]
)
->where("deleted_at", null)
->where("cliente_id", null);
if ($this->request->getGet("q")) {
$column = "CONCAT(first_name, ' ', last_name)";
$value = $this->request->getGet("q");
$query->groupStart()
->where("LOWER(CONVERT($column USING utf8)) COLLATE utf8_general_ci LIKE", "%" . strtolower($value) . "%")
->groupEnd();
}
$items = $query->get()->getResultObject();
return $this->response->setJSON($items);
} else {
return $this->failUnauthorized('Invalid request', 403);
}
}
public function datatable()
@ -53,14 +107,19 @@ class Clienteusuarios extends \App\Controllers\BaseResourceController
}
$start = $reqData['start'] ?? 0;
$length = $reqData['length'] ?? 5;
$search = $reqData['search']['value'];
$requestedOrder = $reqData['order']['0']['column'] ?? 1;
$order = ClienteUsuariosModel::SORTABLE[$requestedOrder >= 0 ? $requestedOrder : 1];
$dir = $reqData['order']['0']['dir'] ?? 'asc';
$requestedOrder = $reqData['order'] ?? [];
$id_C = $reqData['id_cliente'] ?? -1;
$resourceData = $this->model->getResource("", $id_C)->orderBy($order, $dir)->limit($length, $start)->get()->getResultObject();
$resourceData = $this->model->getResource("", $id_C);
foreach ($requestedOrder as $order) {
$column = $order['column'] ?? 0;
$dir = $order['dir'] ?? 'asc';
$orderColumn = ClienteUsuariosModel::SORTABLE[$column] ?? null;
if ($orderColumn) {
$resourceData->orderBy($orderColumn, $dir);
}
}
$resourceData = $resourceData->limit($length, $start)->get()->getResultObject();
return $this->respond(Collection::datatable(
$resourceData,

View File

@ -3,6 +3,7 @@
return [
'add' => 'Añadir',
'address' => 'Dirección',
'blocked' => 'Bloqueado',
'non_blocked' => 'No bloqueado',
@ -38,6 +39,7 @@ return [
'user' => 'Usuario',
'userList' => 'Lista de usuarios',
'users' => 'Usuarios',
'usersAvailables' => 'Usuarios disponibles',
'zipCode' => 'Código postal',
'admin' => 'Administrador',

View File

@ -16,9 +16,10 @@ class ClienteUsuariosModel extends ShieldUserModel
protected $useAutoIncrement = true;
const SORTABLE = [
0 => "t1.first_name",
1 => "t1.last_name",
2 => "t2.secret",
0 => "t1.id",
1 => "t1.first_name",
2 => "t1.last_name",
3 => "t2.secret",
];
protected $allowedFields = ["id", "first_name", "last_name", "email"];
@ -83,6 +84,19 @@ class ClienteUsuariosModel extends ShieldUserModel
return $result;
}
public function removeClienteFromUser($user_id = -1){
$this->db->table($this->table)->where('id', $user_id)->update(['cliente_id' => null]);
}
public function addUserToClient($user_id = -1, $cliente_id = -1){
if($user_id < 1 || $cliente_id < 1){
return;
}
$this->db->table($this->table)->where('id', $user_id)->update(['cliente_id' => $cliente_id]);
}
/**
* Get resource data.
*
@ -100,15 +114,8 @@ class ClienteUsuariosModel extends ShieldUserModel
);
$builder->join("auth_identities t2", "t1.id = t2.user_id", "left");
$builder->where('t1.id', $cliente_id);
$builder->where('t1.cliente_id', $cliente_id);
return empty($search)
? $builder
: $builder
->groupStart()
->like("t1.first_name", $search)
->orLike("t1.last_name", $search)
->orLike("t2.secret", $search)
->groupEnd();
return $builder;
}
}

View File

@ -654,6 +654,24 @@
</div>
<div class="tab-pane fade" id="usuarios" role="tabpanel">
<div class="row align-items-end">
<div class="col-md-12 col-lg-4 px-4">
<div>
<label id="label_usuario" for="usuarios" class="form-label">
<?= lang('Users.usersAvailables') ?>
</label>
<select id="usuariosDisponibles" name="usuarios_disponibles" class="form-control select2bs2" style="width: 100%;">
</select>
</div>
</div>
<div class="col-md-12 col-lg-4 px-4">
<button id="addUserToClient" type="button" class="btn btn-secondary waves-effect waves-light float-start"><?= lang("Users.add")?></button>
</div>
</div>
<table id="tableOfClienteUsuarios" class="table table-striped table-hover" style="width: 100%;">
<thead>
<tr>
@ -1104,67 +1122,6 @@ function delete_direccion_envio(dataId){
<?=$this->endSection() ?>
<?= $this->section("additionalInlineJs") ?>
/****************************************
Contactos
*****************************************/
const lastColNrCU = $('#tableOfClienteUsuarios').find("tr:first th").length - 1;
var theTableCU = $('#tableOfClienteUsuarios').DataTable( {
serverSide: true,
processing: true,
autoWidth: true,
responsive: true,
lengthMenu: [ 5, 10, 25],
order: [[ 0, "asc" ], [ 1, "asc" ]],
pageLength: 10,
lengthChange: true,
searching: false,
paging: true,
info: false,
dom: '<"mt-4"><"float-end"B><"float-start"l><t><"mt-4 mb-3"p>',
ajax : $.fn.dataTable.pipeline( {
url: '<?= route_to('dataTableOfClienteUsuarios') ?>',
data: {
//id_cliente: id,
id_cliente: 1,
},
method: 'POST',
headers: {'X-Requested-With': 'XMLHttpRequest'},
async: true,
}),
columns: [
{ 'data': 'id' },
{ 'data': 'nombre' },
{ 'data': 'apellidos' },
{ 'data': 'email' },
{
data: actionBtns,
className: 'row-edit dt-center'
}
],
columnDefs: [
{
orderable: false,
searchable: false,
targets: [lastColNrCU]
},
{
"orderData": [ 0, 1 ],
"targets": 0
},
],
language: {
url: "/themes/vuexy/vendor/libs/datatables-sk/plugins/i18n/es-ES.json"
}
} );
<?=$this->endSection() ?>
<?=$this->section('css') ?>
<link rel="stylesheet" href="<?= site_url('themes/vuexy/css/datatables-editor/editor.bootstrap5.min.css') ?>">