diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index bbd2c1e0..b289ef74 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -897,7 +897,10 @@ $routes->group('chat', ['namespace' => 'App\Controllers\Chat'], function ($route $routes->get('department/presupuesto/(:num)/(:num)', 'ChatController::get_chat_presupuesto/$1/$2', ['as' => 'getChatPresupuesto']); $routes->get('department/pedido/(:num)/(:num)', 'ChatController::get_chat_pedido/$1/$2', ['as' => 'getChatPedido']); $routes->get('department/factura/(:num)/(:num)', 'ChatController::get_chat_factura/$1/$2', ['as' => 'getChatFactura']); - $routes->get('department/(:num)/users', 'ChatController::get_chat_department_users/$1', ['as' => 'getChatDepartmentUsers']); + $routes->get('department/users/presupuesto/(:num)/(:num)', 'ChatController::get_chat_department_presupuesto_users/$1/$2', ['as' => 'getPresupuestoChatDepartmentUsers']); + $routes->get('department/users/pedido/(:num)/(:num)', 'ChatController::get_chat_department_pedido_users/$1/$2', ['as' => 'getPedidoChatDepartmentUsers']); + $routes->get('department/users/factura/(:num)/(:num)', 'ChatController::get_chat_department_factura_users/$1/$2', ['as' => 'getFacturaChatDepartmentUsers']); + $routes->post('department/user', 'ChatController::subscribe_to_chat_deparment/$1', ['as' => 'subscribeToChatDepartment']); $routes->delete('department/user/(:num)', 'ChatController::delete_user_from_department/$1', ['as' => 'deleteUserFromDepartment']); diff --git a/ci4/app/Controllers/Chat/ChatController.php b/ci4/app/Controllers/Chat/ChatController.php index 4a2e97c2..6813243b 100644 --- a/ci4/app/Controllers/Chat/ChatController.php +++ b/ci4/app/Controllers/Chat/ChatController.php @@ -207,15 +207,18 @@ class ChatController extends BaseController $chat_message_id = $this->chatMessageModel->insert(["chat_id" => $chatId, "sender_id" => auth()->user()->id, "message" => $data["message"]]); $dataResponse = $this->chatMessageModel->find($chat_message_id); $chatDepartmentUsers = $this->chatDeparmentModel->getChatDepartmentUsers($data["chat_department_id"]); + $chatExternalUsers = $this->chatDeparmentModel->getChatDeparmentPresupuestoUsers($data["chat_department_id"],$data["model_id"]); $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $data['client']]); - $cliente_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',$data['client'])->countAllResults(); + $cliente_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',$data['client'])->where('presupuesto_id',$data['model_id'])->countAllResults(); $auth_user_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',auth()->user()->id)->countAllResults(); if($cliente_in_department_count == 0){ - $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => $data['client']]); + $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => $data['client'],'presupuesto_id' => $data['model_id']]); } if($auth_user_in_department_count){ - $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => auth()->user()->id]); - + $users_always_in_department = array_map(fn($q) => $q->id,$chatDepartmentUsers); + if(!in_array(auth()->user()->id,$users_always_in_department)){ + $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'presupuesto_id' => $data['model_id']]); + } } foreach ($chatDepartmentUsers as $user) { @@ -223,6 +226,11 @@ class ChatController extends BaseController $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $user->id]); } } + foreach ($chatExternalUsers as $user) { + if ($user->id != auth()->user()->id) { + $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $user->id]); + } + } return $this->response->setJSON($dataResponse); } public function store_chat_message_pedido() @@ -239,21 +247,30 @@ class ChatController extends BaseController $chat_message_id = $this->chatMessageModel->insert(["chat_id" => $chatId, "sender_id" => auth()->user()->id, "message" => $data["message"]]); $dataResponse = $this->chatMessageModel->find($chat_message_id); $chatDepartmentUsers = $this->chatDeparmentModel->getChatDepartmentUsers($data["chat_department_id"]); + $chatExternalUsers = $this->chatDeparmentModel->getChatDeparmentPedidoUsers($data["chat_department_id"],$data["model_id"]); $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $data['client']]); - $cliente_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',$data['client'])->countAllResults(); + $cliente_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',$data['client'])->where('pedido_id',$data['model_id'])->countAllResults(); $auth_user_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',auth()->user()->id)->countAllResults(); if($cliente_in_department_count == 0){ - $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => $data['client']]); + $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => $data['client'],'pedido_id' => $data['model_id']]); } if($auth_user_in_department_count){ - $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => auth()->user()->id]); - + $users_always_in_department = array_map(fn($q) => $q->id,$chatDepartmentUsers); + if(!in_array(auth()->user()->id,$users_always_in_department)){ + $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'pedido_id' => $data['model_id']]); + } } + foreach ($chatDepartmentUsers as $user) { if ($user->id != auth()->user()->id) { $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $user->id]); } } + foreach ($chatExternalUsers as $user) { + if ($user->id != auth()->user()->id) { + $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $user->id]); + } + } return $this->response->setJSON($dataResponse); } public function store_chat_message_factura() @@ -270,21 +287,30 @@ class ChatController extends BaseController $chat_message_id = $this->chatMessageModel->insert(["chat_id" => $chatId, "sender_id" => auth()->user()->id, "message" => $data["message"]]); $dataResponse = $this->chatMessageModel->find($chat_message_id); $chatDepartmentUsers = $this->chatDeparmentModel->getChatDepartmentUsers($data["chat_department_id"]); + $chatExternalUsers = $this->chatDeparmentModel->getChatDeparmentFacturaUsers($data["chat_department_id"],$data["model_id"]); $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $data['client']]); - $cliente_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',$data['client'])->countAllResults(); + $cliente_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',$data['client'])->where('factura_id',$data['model_id'])->countAllResults(); $auth_user_in_department_count = $this->chatDeparmentUserModel->where('chat_department_id',$data["chat_department_id"])->where('user_id',auth()->user()->id)->countAllResults(); if($cliente_in_department_count == 0){ - $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => $data['client']]); + $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => $data['client'],'factura_id' => $data['model_id']]); } if($auth_user_in_department_count){ - $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'user_id' => auth()->user()->id]); - + $users_always_in_department = array_map(fn($q) => $q->id,$chatDepartmentUsers); + if(!in_array(auth()->user()->id,$users_always_in_department)){ + $this->chatDeparmentUserModel->insert(['chat_department_id' => $data["chat_department_id"],'factura_id' => $data['model_id']]); + } } + foreach ($chatDepartmentUsers as $user) { if ($user->id != auth()->user()->id) { $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $user->id]); } } + foreach ($chatExternalUsers as $user) { + if ($user->id != auth()->user()->id) { + $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id, "user_id" => $user->id]); + } + } return $this->response->setJSON($dataResponse); } public function store_chat_message_single() @@ -392,10 +418,23 @@ class ChatController extends BaseController return $this->response->setJSON($response); } - public function get_chat_department_users(int $chat_department_id) + public function get_chat_department_presupuesto_users(int $chat_department_id,int $presupuesto_id) { - $data = $this->chatDeparmentModel->getChatDepartmentUsers($chat_department_id); - return $this->response->setJSON($data); + $adminUsers = $this->chatDeparmentModel->getChatDepartmentUsers($chat_department_id); + $externalUsers = $this->chatDeparmentModel->getChatDeparmentPresupuestoUsers($chat_department_id,$presupuesto_id); + return $this->response->setJSON(['admin_users' => $adminUsers,'external_users' => $externalUsers]); + } + public function get_chat_department_pedido_users(int $chat_department_id,$pedido_id) + { + $adminUsers = $this->chatDeparmentModel->getChatDepartmentUsers($chat_department_id); + $externalUsers = $this->chatDeparmentModel->getChatDeparmentPedidoUsers($chat_department_id,$pedido_id); + return $this->response->setJSON(['admin_users' => $adminUsers,'external_users' => $externalUsers]); + } + public function get_chat_department_factura_users(int $chat_department_id,$factura_id) + { + $adminUsers = $this->chatDeparmentModel->getChatDepartmentUsers($chat_department_id); + $externalUsers = $this->chatDeparmentModel->getChatDeparmentFacturaUsers($chat_department_id,$factura_id); + return $this->response->setJSON(['admin_users' => $adminUsers,'external_users' => $externalUsers]); } public function get_chat_users_internal() { @@ -837,8 +876,18 @@ class ChatController extends BaseController } public function delete_user_from_department($chat_department_id) { + $data = $this->request->getPost(); $user_id = auth()->user()->id; - $chatDepartmentUserEntity = $this->chatDeparmentUserModel->where('chat_department_id',$chat_department_id)->where('user_id',$user_id); + $adminExist = $this->chatDeparmentUserModel->where('chat_department_id',$chat_department_id) + ->where('user_id',$user_id) + ->where('pedido_id',null) + ->where('factura_id',null) + ->where('presupuesto_id',null)->countAllResults(); + if($adminExist) + { + return $this->response->setJSON(["message" => lang('Chat.exit_admin_chat_wrong'),"status" => false]); + } + $chatDepartmentUserEntity = $this->chatDeparmentUserModel->where('chat_department_id',$chat_department_id)->where('user_id',$user_id)->where($data['model_fk'],$data['model_id_fk']); if($chatDepartmentUserEntity->countAllResults() > 0) { $deleted = $this->chatDeparmentUserModel->where('chat_department_id',$chat_department_id)->where('user_id',$user_id)->delete(); @@ -851,12 +900,21 @@ class ChatController extends BaseController { $data = $this->request->getPost(); $user_id = auth()->user()->id; - $chatDepartmentUserEntity = $this->chatDeparmentUserModel->where('chat_department_id',$data['chat_department_id'])->where('user_id',$user_id); + $adminExist = $this->chatDeparmentUserModel->where('chat_department_id',$data['chat_department_id']) + ->where('user_id',$user_id) + ->where('pedido_id',null) + ->where('factura_id',null) + ->where('presupuesto_id',null)->countAllResults(); + if($adminExist) + { + return $this->response->setJSON(["message" => lang('Chat.subscribe_chat_wrong'),"status" => false]); + } + $chatDepartmentUserEntity = $this->chatDeparmentUserModel->where('chat_department_id',$data['chat_department_id'])->where('user_id',$user_id)->where($data['model_fk'],$data['model_id_fk']); if($chatDepartmentUserEntity->countAllResults() > 0) { return $this->response->setJSON(["message" => lang('Chat.subscribe_chat_wrong'),"status" => false]); }else{ - $this->chatDeparmentUserModel->insert(["chat_department_id" => $data["chat_department_id"],"user_id" => $user_id]); + $this->chatDeparmentUserModel->insert(["chat_department_id" => $data["chat_department_id"],"user_id" => $user_id,$data['model_fk'] => $data['model_id_fk']]); return $this->response->setJSON(["message" => lang('Chat.subscribe_chat_ok'), "status" => true]); } } diff --git a/ci4/app/Database/Migrations/2025-03-17-080000_AddForeignChatDepartmentUsers.php b/ci4/app/Database/Migrations/2025-03-17-080000_AddForeignChatDepartmentUsers.php new file mode 100644 index 00000000..a92c42e7 --- /dev/null +++ b/ci4/app/Database/Migrations/2025-03-17-080000_AddForeignChatDepartmentUsers.php @@ -0,0 +1,45 @@ + [ + "type" => "INT", + "constraint" => 16, + "unsigned" => true, + "null" => true + ], + "presupuesto_id" => [ + "type" => "INT", + "constraint" => 10, + "unsigned" => true, + "null" => true + ], + "factura_id" => [ + "type" => "INT", + "constraint" => 10, + "unsigned" => true, + "null" => true + ], + ]; + public function up() + { + $this->forge->addColumn("chat_department_users",$this->COLUMNS); + $this->forge->addForeignKey('pedido_id', 'pedidos', 'id'); + $this->forge->addForeignKey('factura_id', 'facturas', 'id'); + $this->forge->addForeignKey('presupuesto_id', 'presupuestos', 'id'); + } + + public function down() + { + $this->forge->dropForeignKey("chat_department_users","pedido_id"); + $this->forge->dropForeignKey("chat_department_users","factura_id"); + $this->forge->dropForeignKey("chat_department_users","presupuesto_id"); + $this->forge->dropColumn("chat_department_users",["pedido_id","factura_id","presupuesto_id"]); + } +} diff --git a/ci4/app/Language/es/Chat.php b/ci4/app/Language/es/Chat.php index 3488f38b..122ab47a 100644 --- a/ci4/app/Language/es/Chat.php +++ b/ci4/app/Language/es/Chat.php @@ -40,9 +40,7 @@ return [ "subscribe_chat" => 'Subscribirse al chat', "exit_chat_ok" => "Ha salido de la conversación correctamente. No recibirá más notificaciones a no ser que sea añadido de nuevo.", "exit_chat_wrong" => "No puede salir de la conversación porque no pertenece a ella.", + "exit_admin_chat_wrong" => "Perteneces como personal a este chat y no puedes salirte. Contacta administrador para ello.", "subscribe_chat_ok" => "Te has subscrito al chat correctamente. Ahora recibirás notificaciones cuando lleguen mensajes.", "subscribe_chat_wrong" => "Ya perteneces a este chat.", - - - ]; \ No newline at end of file diff --git a/ci4/app/Models/Chat/ChatDeparmentModel.php b/ci4/app/Models/Chat/ChatDeparmentModel.php index f729ec04..ecaab80c 100644 --- a/ci4/app/Models/Chat/ChatDeparmentModel.php +++ b/ci4/app/Models/Chat/ChatDeparmentModel.php @@ -89,7 +89,7 @@ class ChatDeparmentModel extends Model $departmentName = $row['name']; // If the department is not yet added to the array, initialize it if (!isset($departments[$departmentName])) { - + $departments[$departmentName] = [ 'id' => $row['id'], 'name' => $row['name'], @@ -105,9 +105,10 @@ class ChatDeparmentModel extends Model } return $departments; } - public function getChatDepartmentUsers(int $chat_deparment_id) + + public function getChatDeparmentUserQuery(int $chat_deparment_id) { - $result = $this->builder() + $query = $this->builder() ->select( [ "users.*" @@ -123,12 +124,42 @@ class ChatDeparmentModel extends Model "chat_department_users.user_id = users.id", 'left' )->where("chat_departments.id", $chat_deparment_id) - ->where("chat_department_users.deleted_at",null) - ->where("users.deleted_at",null) + ->where("chat_department_users.deleted_at", null) + + ->where("users.deleted_at", null); + return $query; + } + public function getChatDepartmentUsers(int $chat_deparment_id) + { + $result = $this->getChatDeparmentUserQuery($chat_deparment_id) + ->where('chat_department_users.presupuesto_id', null) + ->where('chat_department_users.pedido_id', null) + ->where('chat_department_users.factura_id', null) ->get()->getResultObject(); return $result; } - public function getDisplay(int $chat_deparment_id) : string + public function getChatDeparmentPresupuestoUsers(int $chat_deparment_id, int $presupuesto_id) + { + $result = $this->getChatDeparmentUserQuery($chat_deparment_id) + ->where('chat_department_users.presupuesto_id', $presupuesto_id) + ->get()->getResultObject(); + return $result; + } + public function getChatDeparmentPedidoUsers(int $chat_deparment_id, int $pedido_id) + { + $result = $this->getChatDeparmentUserQuery($chat_deparment_id) + ->where('chat_department_users.pedido_id', $pedido_id) + ->get()->getResultObject(); + return $result; + } + public function getChatDeparmentFacturaUsers(int $chat_deparment_id, int $factura_id) + { + $result = $this->getChatDeparmentUserQuery($chat_deparment_id) + ->where('chat_department_users.factura_id', $factura_id) + ->get()->getResultObject(); + return $result; + } + public function getDisplay(int $chat_deparment_id): string { return $this->find($chat_deparment_id)->display; } @@ -139,9 +170,9 @@ class ChatDeparmentModel extends Model "display as name", "description" ]); - if($query){ - $q->orLike("display",$query) - ->orLike("name",$query); + if ($query) { + $q->orLike("display", $query) + ->orLike("name", $query); } return $q; } diff --git a/ci4/app/Models/Chat/ChatDeparmentUserModel.php b/ci4/app/Models/Chat/ChatDeparmentUserModel.php index 9dbde312..4b550648 100644 --- a/ci4/app/Models/Chat/ChatDeparmentUserModel.php +++ b/ci4/app/Models/Chat/ChatDeparmentUserModel.php @@ -15,7 +15,10 @@ class ChatDeparmentUserModel extends Model protected $protectFields = true; protected $allowedFields = [ "chat_department_id", - "user_id" + "user_id", + "pedido_id", + "factura_id", + "presupuesto_id" ]; protected bool $allowEmptyInserts = false; @@ -47,6 +50,7 @@ class ChatDeparmentUserModel extends Model protected $afterFind = []; protected $beforeDelete = []; protected $afterDelete = []; + public function getChatDepartmentUser(int $user_id) { return $this->db->table($this->table." t1") @@ -55,6 +59,5 @@ class ChatDeparmentUserModel extends Model ->where("t1.user_id",$user_id) ->where("t1.deleted_at",null) ->get()->getResultObject(); - } } diff --git a/httpdocs/assets/js/safekat/components/chat.js b/httpdocs/assets/js/safekat/components/chat.js index 72ea62e9..47a11a8b 100644 --- a/httpdocs/assets/js/safekat/components/chat.js +++ b/httpdocs/assets/js/safekat/components/chat.js @@ -1,7 +1,7 @@ import Ajax from '../components/ajax.js' import Modal from './modal.js' import ClassSelect from './select2.js' -import {alertConfirmAction, alertConfirmationDelete, alertError, alertSuccess} from "./alerts/sweetAlert.js" +import { alertConfirmAction, alertConfirmationDelete, alertError, alertSuccess } from "./alerts/sweetAlert.js" class Chat { @@ -14,7 +14,7 @@ class Chat { this.sendBtnMessageDepartment = this.domItem.find("#send-msg-btn-deparment") this.sendBtnMessageInternal = this.domItem.find("#send-msg-btn-internal") this.chatSidebarLeftUserAbout = this.domItem.find('.chat-sidebar-left-user-about'), - this.messageInput = this.domItem.find(".message-input") + this.messageInput = this.domItem.find(".message-input") this.sideBar = this.domItem.find(".sidebar-body") this.selectItem = this.domItem.find(".chat-search-client") this.btnExitChat = this.domItem.find(".exit-chat") @@ -55,8 +55,8 @@ class Chat { } this.sendBtnMessageDepartment.addClass("d-none") - this.btnExitChat.on('click',this._handleExitChatDepartment.bind(this)) - this.btnSubscribeChat.on('click',this._handleSubscribeChatDepartment.bind(this)) + this.btnExitChat.on('click', this._handleExitChatDepartment.bind(this)) + this.btnSubscribeChat.on('click', this._handleSubscribeChatDepartment.bind(this)) this.sendBtnMessageInternal.addClass("d-none") if (this.chatContactsBody[0]) { @@ -98,7 +98,7 @@ class Chat { this.selectParticipants.init() this.modalNewParticipant.toggle() }) - + this.selectParticipants.item.on("change", () => { if (this.selectParticipants.getVal().length > 0) { this.btnAddParticipantSubmit.removeClass("d-none") @@ -106,19 +106,18 @@ class Chat { this.btnAddParticipantSubmit.addClass("d-none") } }) - this.btnUpdateMessagesUnviewed.on("click",this._handleUpdateChatMessagesUnread.bind(this)) + this.btnUpdateMessagesUnviewed.on("click", this._handleUpdateChatMessagesUnread.bind(this)) this._handleGetChatDirect() - setInterval(this._handleReloadChatDirectMessages.bind(this),10000) + setInterval(this._handleReloadChatDirectMessages.bind(this), 10000) } - initSelectClient() - { - this.selectClientUser = new ClassSelect(this.selectItem,`/chat/direct/client/users/select/${this.chatType}/${this.modelId}`,"Seleccione contacto",true) + initSelectClient() { + this.selectClientUser = new ClassSelect(this.selectItem, `/chat/direct/client/users/select/${this.chatType}/${this.modelId}`, "Seleccione contacto", true) this.selectClientUser.init() - this.selectItem.on('change',() => { - if(this.selectClientUser.getVal()){ - this.sendBtnMessageDepartment.attr('disabled',null) - }else{ - this.sendBtnMessageDepartment.attr('disabled','disabled') + this.selectItem.on('change', () => { + if (this.selectClientUser.getVal()) { + this.sendBtnMessageDepartment.attr('disabled', null) + } else { + this.sendBtnMessageDepartment.attr('disabled', 'disabled') } }) @@ -228,7 +227,7 @@ class Chat { this.domItem.find("#chat-header-users").empty() this.domItem.find("#chat-header-dropdown-users").removeClass("d-none") let ajax = new Ajax( - `/chat/department/${this.chatDeparmentId}/users`, + `/chat/department/users/${this.chatType}/${this.chatDeparmentId}/${this.modelId}`, null, null, this._getChatDeparmentUsersSuccess.bind(this), @@ -238,31 +237,34 @@ class Chat { ajax.get() } _getChatDeparmentUsersSuccess(deparmentUsers) { - deparmentUsers.map((user) => { - this.domItem.find("#chat-header-users").append( - ` -
- ${user.username} -
-+ ${user.username} +
+