diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php index 352900d5..ff50b561 100644 --- a/ci4/app/Config/Routes.php +++ b/ci4/app/Config/Routes.php @@ -762,6 +762,7 @@ $routes->group('chat', ['namespace' => 'App\Controllers\Chat'], function ($route + }); /* diff --git a/ci4/app/Controllers/Chat/ChatController.php b/ci4/app/Controllers/Chat/ChatController.php index 9b9962fd..daa1f564 100644 --- a/ci4/app/Controllers/Chat/ChatController.php +++ b/ci4/app/Controllers/Chat/ChatController.php @@ -59,6 +59,7 @@ class ChatController extends BaseController $chat = $this->chatModel->getChatPresupuesto($chat_department_id, $presupuesto_id); if ($chat) { $data["messages"] = $this->chatMessageModel->get_chat_messages($chat->id); + $this->chatMessageModel->set_chat_department_messages_as_read($chat->id); } $data["chat"] = $chat; return $this->response->setJSON($data); @@ -73,6 +74,8 @@ class ChatController extends BaseController $chat = $this->chatModel->getChatPedido($chat_department_id, $pedido_id); if ($chat) { $data["messages"] = $this->chatMessageModel->get_chat_messages($chat->id); + $this->chatMessageModel->set_chat_department_messages_as_read($chat->id); + } $data["chat"] = $chat; return $this->response->setJSON($data); @@ -87,6 +90,8 @@ class ChatController extends BaseController $chat = $this->chatModel->getChatFactura($chat_department_id, $factura_id); if ($chat) { $data["messages"] = $this->chatMessageModel->get_chat_messages($chat->id); + $this->chatMessageModel->set_chat_department_messages_as_read($chat->id); + } $data["chat"] = $chat; return $this->response->setJSON($data); @@ -177,6 +182,7 @@ class ChatController extends BaseController foreach ($users as $user) { $user->unreadMessages = $this->chatMessageModel->get_chat_unread_messages_count($user->id); } + usort($users, fn($a, $b) => $a->unreadMessages < $b->unreadMessages); return $this->response->setJSON($users); } public function get_chat_internal_contact(int $user_id) @@ -203,14 +209,35 @@ class ChatController extends BaseController $response = []; if($cliente_id){ $data = $this->clienteModel->getClienteDataPresupuestoPedidoFactura($cliente_id); + $response["totalMessages"] = 0; $response["chatFacturas"] = $this->chatModel->getClienteChatFacturas($data["facturas"]); + foreach ($response["chatFacturas"] as $key => $value) { + $response["totalMessages"] += $value->unreadMessages; + } $response["chatPresupuestos"] = $this->chatModel->getClienteChatPresupuestos($data["presupuestos"]); + foreach ($response["chatPresupuestos"] as $key => $value) { + $response["totalMessages"] += $value->unreadMessages; + } $response["chatPedidos"] = $this->chatModel->getClienteChatPedidos($data["pedidos"]); + foreach ($response["chatPedidos"] as $key => $value) { + $response["totalMessages"] += $value->unreadMessages; + } $response["data"] = $data; + }else{ + $response["internals"] = $this->chatModel->getChatDepartmentNotifications(); + $internal_notifications = $this->chatModel->getChatInternalNotifications(); + foreach ($internal_notifications as $value) { + $response["internals"][] = $value; + } + $response["totalMessages"] = 0; + foreach ($response["internals"] as $key => $value) { + $response["totalMessages"] += $value->unreadMessages; + } } return $this->response->setJSON($response); } + public function get_chat_department_users(int $chat_department_id) { $data = $this->chatDeparmentModel->getChatDepartmentUsers($chat_department_id); diff --git a/ci4/app/Models/Chat/ChatDeparmentModel.php b/ci4/app/Models/Chat/ChatDeparmentModel.php index a0c0bab2..9d7fc206 100644 --- a/ci4/app/Models/Chat/ChatDeparmentModel.php +++ b/ci4/app/Models/Chat/ChatDeparmentModel.php @@ -59,7 +59,7 @@ class ChatDeparmentModel extends Model 'chat_departments.id', 'chat_departments.name', 'chat_departments.display', - 'chat_department_users.user_id' + 'chat_department_users.user_id', ] ) ->join( diff --git a/ci4/app/Models/Chat/ChatMessageModel.php b/ci4/app/Models/Chat/ChatMessageModel.php index e9f72308..f87c1243 100644 --- a/ci4/app/Models/Chat/ChatMessageModel.php +++ b/ci4/app/Models/Chat/ChatMessageModel.php @@ -118,4 +118,27 @@ class ChatMessageModel extends Model ->where("receiver_id", auth()->user()->id)->update(); return $messagesFromReceiver; } + public function set_chat_department_messages_as_read(int $chat_id): int + { + $chatDepartmentModel = model(ChatDeparmentModel::class); + $chatModel = model(ChatModel::class); + + if(auth()->user()->cliente_id){ + $messagesFromReceiver = $this->builder() + ->set("viewed", true) + ->where("chat_id", $chat_id) + ->whereNotIn("sender_id", [auth()->user()->id])->update(); + }else{ + $chat_department_id = $chatModel->find($chat_id)->chat_department_id; + $users_in_chat = array_map(fn($x) => $x->id, $chatDepartmentModel->getChatDepartmentUsers($chat_department_id)); + $messagesFromReceiver = $this->builder() + ->set("viewed", true) + ->where("chat_id", $chat_id) + ->whereNotIn("sender_id", $users_in_chat) + ->update(); + } + + return $messagesFromReceiver; + } + } diff --git a/ci4/app/Models/Chat/ChatModel.php b/ci4/app/Models/Chat/ChatModel.php index ee6788bd..bbddee86 100644 --- a/ci4/app/Models/Chat/ChatModel.php +++ b/ci4/app/Models/Chat/ChatModel.php @@ -2,6 +2,9 @@ namespace App\Models\Chat; +use App\Models\Facturas\FacturaModel; +use App\Models\Pedidos\PedidoModel; +use App\Models\Presupuestos\PresupuestoModel; use App\Models\Usuarios\UserModel; use CodeIgniter\Model; use stdClass; @@ -11,7 +14,7 @@ class ChatModel extends Model protected $table = 'chats'; protected $primaryKey = 'id'; protected $useAutoIncrement = true; - protected $returnType = 'array'; + protected $returnType = 'object'; protected $useSoftDeletes = false; protected $protectFields = true; protected $allowedFields = [ @@ -204,14 +207,18 @@ class ChatModel extends Model ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("pedidos","pedidos.id = chats.pedido_id","left") - ->join("chat_messages","pedidos.id = chats.pedido_id","left") - ->whereNotIn("chat_messages.sender_id",[auth()->user()->id]) ->whereIn("pedidos.id",$pedidos) ->get()->getResultObject(); $chatMessageModel = model(ChatMessageModel::class); - + $count = 0; foreach ($results as $row) { - $row->messages = $chatMessageModel->get_chat_messages($row->chatId); + $messages = $chatMessageModel->get_chat_messages($row->chatId); + foreach ($messages as $key => $message) { + if($message->sender_id != auth()->user()->id && $message->viewed == false){ + $count++; + } + } + $row->unreadMessages=$count; } return $results; } @@ -227,14 +234,18 @@ class ChatModel extends Model ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("facturas","facturas.id = chats.factura_id","left") - ->join("chat_messages","chats.id = chat_messages.chat_id","left") - ->whereNotIn("chat_messages.sender_id",[auth()->user()->id]) ->whereIn("facturas.id",$facturas) ->get()->getResultObject(); $chatMessageModel = model(ChatMessageModel::class); - + $count = 0; foreach ($results as $row) { - $row->messages = $chatMessageModel->get_chat_messages($row->chatId); + $messages = $chatMessageModel->get_chat_messages($row->chatId); + foreach ($messages as $key => $message) { + if($message->sender_id != auth()->user()->id && $message->viewed == false){ + $count++; + } + } + $row->unreadMessages=$count; } return $results; } @@ -250,16 +261,99 @@ class ChatModel extends Model ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("presupuestos","presupuestos.id = chats.presupuesto_id","left") - ->join("chat_messages","chats.id = chat_messages.chat_id","left") - ->whereNotIn("chat_messages.sender_id",[auth()->user()->id]) ->whereIn("presupuestos.id",$presupuestos) ->get()->getResultObject(); $chatMessageModel = model(ChatMessageModel::class); - + $count = 0; foreach ($results as $row) { - $row->messages = $chatMessageModel->get_chat_messages($row->chatId); + $messages = $chatMessageModel->get_chat_messages($row->chatId); + foreach ($messages as $key => $message ) { + if($message->sender_id != auth()->user()->id && $message->viewed == false){ + $count++; + } + } + $row->unreadMessages=$count; } - + return $results; } + public function getChatDepartmentNotifications() + { + $chatMessageModel = model(ChatMessageModel::class); + $presupuestoModel = model(PresupuestoModel::class); + $facturaModel = model(FacturaModel::class); + $pedidoModel = model(PedidoModel::class); + + $q = $this->db->table("chats") + ->select([ + "chats.id as chatId", + "chats.pedido_id as pedidoId", + "chats.presupuesto_id as presupuestoId", + "chats.factura_id as facturaId", + "chats.presupuesto_id as presupuestoId", + "chats.chat_department_id as chatDepartmentId", + "chat_departments.display as chatDisplay", + ]) + ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") + ->join("chat_department_users","chat_department_users.chat_department_id = chats.chat_department_id","left") + ->where("chat_department_users.user_id",auth()->user()->id); + $rows = $q->get()->getResultObject(); + + foreach ($rows as $row) { + $messages = $chatMessageModel->get_chat_messages($row->chatId); + $count = 0; + foreach ($messages as $m) { + if($m->viewed == false && $m->sender_id != auth()->user()->id) + $count++; + } + if($row->presupuestoId){ + $row->model = $presupuestoModel->find($row->presupuestoId); + $row->uri = "/presupuestos/cosidotapablanda/edit/".$row->presupuestoId; + $row->title = $row->presupuestoId; + $row->avatar = "PRE"; + $row->unreadMessages = $count; + } + elseif($row->pedidoId){ + $row->model = $pedidoModel->find($row->pedidoId); + $row->uri = "/pedidos/edit/".$row->pedidoId; + $row->title = $row->pedidoId; + $row->avatar = "P"; + $row->unreadMessages = $count; + + } + elseif($row->facturaId){ + $row->model = $facturaModel->find($row->facturaId); + $row->uri = "/facturas/edit/".$row->facturaId; + $row->avatar = "F"; + $row->title = $row->facturaId; + $row->unreadMessages = $count; + } + } + return $rows; + + } + public function getChatInternalNotifications() + { + $chatMessageModel = model(ChatMessageModel::class); + $userModel = model(UserModel::class); + $internalMessages = $chatMessageModel->builder() + ->select([ + "chat_id as chatId", + "sender_id", + "COUNT(viewed) as unreadMessages", + ]) + ->where("receiver_id",auth()->user()->id) + ->where("viewed",false)->get()->getResultObject(); + foreach ($internalMessages as $m) { + if($m->sender_id){ + $sender = $userModel->find($m->sender_id); + $m->model = $sender; + $m->title = $sender->username; + $m->chatDisplay = ($sender->first_name ?? "")." ".($sender->last_name ?? ""); + $m->avatar = strtoupper(mb_substr($sender->first_name, 0, 1).mb_substr($sender->last_name, 0, 1)); + $m->uri = "#"; + } + } + return $internalMessages; + } } diff --git a/ci4/app/Views/themes/vuexy/components/chat_factura.php b/ci4/app/Views/themes/vuexy/components/chat_factura.php index 734619f3..f177503d 100644 --- a/ci4/app/Views/themes/vuexy/components/chat_factura.php +++ b/ci4/app/Views/themes/vuexy/components/chat_factura.php @@ -144,5 +144,4 @@ = $this->section("additionalExternalJs") ?> - = $this->endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/components/chat_pedido.php b/ci4/app/Views/themes/vuexy/components/chat_pedido.php index d4674950..ac2dbc31 100644 --- a/ci4/app/Views/themes/vuexy/components/chat_pedido.php +++ b/ci4/app/Views/themes/vuexy/components/chat_pedido.php @@ -146,5 +146,4 @@ = $this->section("additionalExternalJs") ?> - = $this->endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php b/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php index c7247afa..18d1cfc2 100644 --- a/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php +++ b/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php @@ -146,5 +146,4 @@ = $this->section("additionalExternalJs") ?> - = $this->endSection() ?> \ No newline at end of file diff --git a/ci4/app/Views/themes/vuexy/main/defaultlayout.php b/ci4/app/Views/themes/vuexy/main/defaultlayout.php index c5f5f1f4..cb651dea 100644 --- a/ci4/app/Views/themes/vuexy/main/defaultlayout.php +++ b/ci4/app/Views/themes/vuexy/main/defaultlayout.php @@ -113,9 +113,11 @@ $picture = "/assets/img/default-user.png"; href="javascript:void(0);" data-bs-toggle="dropdown" data-bs-auto-close="outside" + id="message-notification-dropdown" aria-expanded="false"> +