diff --git a/ci4/app/Controllers/Chat/ChatController.php b/ci4/app/Controllers/Chat/ChatController.php index cad8ad6b..4633aed8 100644 --- a/ci4/app/Controllers/Chat/ChatController.php +++ b/ci4/app/Controllers/Chat/ChatController.php @@ -175,9 +175,10 @@ class ChatController extends BaseController "chat_id" => $chatId, "sender_id" => auth()->user()->id, "message" => $data["message"], - "receiver_id" => $data["receiver_id"] + "receiver_id" => $data["receiver_id"], ] ); + $this->chatNotificationModel->insert(["chat_message_id" => $chat_message_id,"user_id" => auth()->user()->id]); $dataResponse = $this->chatMessageModel->find($chat_message_id); return $this->response->setJSON($dataResponse); } @@ -192,7 +193,7 @@ class ChatController extends BaseController ->where("deleted_at", null) ->get()->getResultObject(); foreach ($users as $user) { - $user->unreadMessages = $this->chatMessageModel->get_chat_unread_messages_count($user->id); + $user->unreadMessages = $this->chatMessageModel->get_chat_messages_count($user->id); } usort($users, fn($a, $b) => $a->unreadMessages < $b->unreadMessages); return $this->response->setJSON($users); @@ -207,12 +208,12 @@ class ChatController extends BaseController ->where("deleted_at", null) ->where("id", $user_id) ->get()->getFirstRow(); - $this->chatMessageModel->set_chat_messages_as_read($user_id); return $this->response->setJSON($users); } public function get_chat_internal_messages(int $user_id) { $conversation = $this->chatMessageModel->get_chat_contact_messages($user_id); + return $this->response->setJSON($conversation); } public function get_chat_cliente() @@ -238,9 +239,13 @@ class ChatController extends BaseController } else { $response["internals"] = $this->chatModel->getChatDepartmentNotifications(); $internal_notifications = $this->chatModel->getChatInternalNotifications(); + $mensajes_directos = $this->chatModel->getChatDirectMessageNotifications(); foreach ($internal_notifications as $value) { $response["internals"][] = $value; } + foreach ($mensajes_directos as $value) { + $response["internals"][] = $value; + } $response["totalMessages"] = 0; foreach ($response["internals"] as $key => $value) { $response["totalMessages"] += $value->unreadMessages; diff --git a/ci4/app/Language/es/Chat.php b/ci4/app/Language/es/Chat.php index 3bc975c8..ea5eaac2 100644 --- a/ci4/app/Language/es/Chat.php +++ b/ci4/app/Language/es/Chat.php @@ -4,7 +4,7 @@ return [ "chat" => "Mensajería", "messages" => "Mensajes", "modal" => [ - "new_hebra" => "Nueva hebra", + "new_hebra" => "Nuevo hilo", "title" => "Título", "new_message" => "Nuevo mensaje", "new_receivers" => "Nuevos participantes", diff --git a/ci4/app/Models/Chat/ChatDeparmentModel.php b/ci4/app/Models/Chat/ChatDeparmentModel.php index e51f29ce..55a46179 100644 --- a/ci4/app/Models/Chat/ChatDeparmentModel.php +++ b/ci4/app/Models/Chat/ChatDeparmentModel.php @@ -82,9 +82,9 @@ class ChatDeparmentModel extends Model "left" ) ->where("chat_departments.type", $type); - if (auth()->user()->cliente_id == null) { - $query->where("chat_department_users.user_id", auth()->user()->id); - } + // if (auth()->user()->cliente_id == null) { + // $query->where("chat_department_users.user_id", auth()->user()->id); + // } $results = $query->get()->getResultArray(); // Create the desired structure diff --git a/ci4/app/Models/Chat/ChatMessageModel.php b/ci4/app/Models/Chat/ChatMessageModel.php index f87c1243..2e1fc469 100644 --- a/ci4/app/Models/Chat/ChatMessageModel.php +++ b/ci4/app/Models/Chat/ChatMessageModel.php @@ -2,6 +2,7 @@ namespace App\Models\Chat; +use App\Models\ChatNotification; use App\Models\Usuarios\UserModel; use CodeIgniter\Model; @@ -75,7 +76,9 @@ class ChatMessageModel extends Model { $conversationArray = []; $userModel = model(UserModel::class); + $chatNotificationModel = model(ChatNotification::class); $receiverUser = $userModel->find($receiver_id); + $chat_id = null; $messagesFromClient = $this->builder() ->where("sender_id", auth()->user()->id) ->where("receiver_id", $receiverUser->id) @@ -95,7 +98,9 @@ class ChatMessageModel extends Model $conversationArray[] = $message; } $dates = array(); + foreach ($conversationArray as $key => $row) { + $chatNotificationModel->builder()->set("viewed", true)->where("chat_message_id", $row->id)->where("user_id", auth()->user()->id)->update(); $dates[$key] = strtotime($row->created_at); } array_multisort($dates, SORT_ASC, $conversationArray); @@ -110,11 +115,25 @@ class ChatMessageModel extends Model ->where("receiver_id", auth()->user()->id)->countAllResults(); return $messagesFromReceiver; } + public function get_chat_messages_count(int $sender_id): int + { + $messagesFromReceiver = $this->builder() + ->groupStart() + ->where("sender_id", $sender_id) + ->where("receiver_id", auth()->user()->id) + ->orGroupStart() + ->where("receiver_id", $sender_id) + ->where("sender_id", auth()->user()->id) + ->groupEnd() + ->groupEnd() + ->countAllResults(); + return $messagesFromReceiver; + } public function set_chat_messages_as_read(int $sender_id): int { $messagesFromReceiver = $this->builder() ->set("viewed", true) - ->where("sender_id", $sender_id) + ->where("user_id", $sender_id) ->where("receiver_id", auth()->user()->id)->update(); return $messagesFromReceiver; } @@ -122,23 +141,32 @@ class ChatMessageModel extends Model { $chatDepartmentModel = model(ChatDeparmentModel::class); $chatModel = model(ChatModel::class); - - if(auth()->user()->cliente_id){ + $messagesFromReceiver = 0; + $auth_user = auth()->user(); + $chat_department_id = $chatModel->find($chat_id)->chat_department_id; + $users_in_chat = array_map(fn($x) => $x->id, $chatDepartmentModel->getChatDepartmentUsers($chat_department_id)); + if (auth()->user()->cliente_id) { + // Si el usuario es cliente, marca como leídos todos los mensajes exceptos los suyos $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(); + ->set("viewed", true) + ->where("chat_id", $chat_id) + ->whereNotIn("sender_id", [$auth_user->id])->update(); + } else { + // Si el usuario no es cliente y está dentro de los usuarios de departamento + // marca como leido todos los mensajes, excepto los mensajes de los usuarios + // de dentro del departamento + if (in_array($auth_user->id, $users_in_chat) == true) { + // if (($key = array_search($auth_user->id, $users_in_chat)) !== false) { + // unset($users_in_chat[$key]); + // } + $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 29367da0..dc11eb6a 100644 --- a/ci4/app/Models/Chat/ChatModel.php +++ b/ci4/app/Models/Chat/ChatModel.php @@ -16,7 +16,7 @@ class ChatModel extends Model protected $primaryKey = 'id'; protected $useAutoIncrement = true; protected $returnType = 'object'; - protected $useSoftDeletes = false; + protected $useSoftDeletes = true; protected $protectFields = true; protected $allowedFields = [ "pedido_id", @@ -33,7 +33,7 @@ class ChatModel extends Model protected array $castHandlers = []; // Dates - protected $useTimestamps = false; + protected $useTimestamps = true; protected $dateFormat = 'datetime'; protected $createdField = 'created_at'; protected $updatedField = 'updated_at'; @@ -313,7 +313,6 @@ class ChatModel extends Model "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", ]) @@ -372,22 +371,23 @@ class ChatModel extends Model "chats.pedido_id as pedidoId", "chats.presupuesto_id as presupuestoId", "chats.factura_id as facturaId", - "chats.presupuesto_id as presupuestoId", - "chats.title as chatDisplay" + "chats.title as chatDisplay", ]) ->join("chat_messages","chat_messages.chat_id = chats.id","left") ->join("chat_notifications","chat_notifications.chat_message_id = chat_messages.id","left") ->where("chat_notifications.user_id",auth()->user()->id) ->where("chat_notifications.viewed",false); $rows = $q->get()->getResultObject(); - + $rows_new = []; foreach ($rows as $row) { + $row->unreadMessages = 0; 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 = $this->countUnreadMessagePresupuesto($row->presupuestoId); + $rows_new[] = $row; } elseif($row->pedidoId){ $row->model = $pedidoModel->find($row->pedidoId); @@ -395,6 +395,7 @@ class ChatModel extends Model $row->title = $row->pedidoId; $row->avatar = "P"; $row->unreadMessages = $this->countUnreadMessagePedido($row->pedidoId); + $rows_new[] = $row; } @@ -404,10 +405,42 @@ class ChatModel extends Model $row->avatar = "F"; $row->title = $row->facturaId; $row->unreadMessages = $this->countUnreadMessageFactura($row->facturaId); - + $rows_new[] = $row; } } - return $rows; + return $rows_new; + } + public function getChatDirectMessageNotifications(){ + $chatMessageModel = model(ChatMessageModel::class); + $chatNotificationModel = model(ChatNotification::class); + + $q = $this->db->table("chats") + ->select([ + "chats.id as chatId", + "chats.title as chatDisplay", + "COUNT(chat_notifications.user_id) as unreadMessages" + ]) + ->join("chat_messages","chat_messages.chat_id = chats.id","left") + ->join("chat_notifications","chat_notifications.chat_message_id = chat_messages.id","left") + ->where("chats.presupuesto_id",null) + ->where("chats.chat_department_id",null) + ->where("chats.pedido_id",null) + ->where("chats.factura_id",null) + ->where("chat_notifications.viewed",false) + ->where("chat_notifications.user_id",auth()->user()->id); + $rows = $q->get()->getResultObject(); + $rows_new = []; + foreach ($rows as $row) { + if($row->chatId){ + $row->model = []; + $row->uri = "/mensajes/internos"; + $row->avatar = "MD"; + $row->title = "MD"; + $row->chatDisplay = $this->getSenderIdFromChatMessage($row->chatId)?->username ?? "Unknown"; + $rows_new[] = $row; + } + } + return $rows_new; } public function getChatInternalHebraPresupuesto(int $chat_id,int $presupuesto_id) : array { @@ -541,4 +574,31 @@ class ChatModel extends Model ->where("chat_notifications.viewed",false) ->where("chat_notifications.user_id",auth()->user()->id)->countAllResults(); } + public function countUnreadMessageDirectos(int $chat_id) : int|string + { + return $this->builder()->select() + ->join("chat_messages","chat_messages.chat_id = chats.id","left") + ->join("chat_notifications","chat_notifications.chat_message_id = chat_messages.id","left") + ->where("chats.presupuesto_id",null) + ->where("chats.pedido_id",null) + ->where("chats.factura_id",null) + ->where("chats.chat_department_id",null) + ->where("chat_messages.chat_id",$chat_id) + ->where("chat_notifications.viewed",false) + ->where("chat_notifications.user_id",auth()->user()->id)->countAllResults(); + } + public function getSenderIdFromChatMessage(int $chat_id) + { + $first_message = $this->builder()->select() + ->join("chat_messages","chat_messages.chat_id = chats.id","left") + ->where("chats.presupuesto_id",null) + ->where("chats.pedido_id",null) + ->where("chats.factura_id",null) + ->where("chats.id",$chat_id) + ->where("chat_messages.receiver_id",auth()->user()->id)->get()->getFirstRow(); + $userModel = model(UserModel::class); + return $userModel->find($first_message->sender_id); + } + + } diff --git a/ci4/app/Views/themes/vuexy/components/chat_general.php b/ci4/app/Views/themes/vuexy/components/chat_general.php index af8ff7ef..617523e7 100644 --- a/ci4/app/Views/themes/vuexy/components/chat_general.php +++ b/ci4/app/Views/themes/vuexy/components/chat_general.php @@ -42,9 +42,6 @@
  • Contactos
  • -
  • -
    No Contacts Found
    -