db->table('chats') ->select( [ "chats.*", "chat_messages.created_at as messageCreatedAt", "chat_messages.message as messageText", ] ) ->join("chat_messages", "chats.id = chat_messages.chat_id", "left") ->orderBy("created_at", "desc") ->where("chats.id", $chat_id) ->get()->getResultObject(); } public function getChatPresupuesto(int $chat_department_id, int $presupuesto_id) { return $this->builder()->where("presupuesto_id", $presupuesto_id)->where("chat_department_id", $chat_department_id)->get()->getFirstRow(); } public function getChatPedido(int $chat_department_id, int $pedido_id) { return $this->builder()->where("pedido_id", $pedido_id)->where("chat_department_id", $chat_department_id)->get()->getFirstRow(); } public function getChatFactura(int $chat_department_id, int $factura_id) { return $this->builder()->where("factura_id", $factura_id)->where("chat_department_id", $chat_department_id)->get()->getFirstRow(); } public function createChatPresupuesto(int $chat_department_id, int $presupuesto_id): int { return $this->insert([ "presupuesto_id" => $presupuesto_id, "chat_department_id" => $chat_department_id ]); } public function createChatPedido(int $chat_department_id, int $pedido_id) : int { return $this->insert([ "pedido_id" => $pedido_id, "chat_department_id" => $chat_department_id ]); } public function createChatFactura(int $chat_department_id, int $factura_id) : int { return $this->insert([ "factura_id" => $factura_id, "chat_department_id" => $chat_department_id ]); } public function createChatSingle() : int { return $this->insert(["chat_department_id" => null]); } public function existChatPresupuesto(int $chat_department_id, int $presupuesto_id): bool { $countChatPresupuesto = $this->builder() ->where("presupuesto_id", $presupuesto_id) ->where("chat_department_id", $chat_department_id) ->countAllResults(); return $countChatPresupuesto > 0; } public function existChatPedido(int $chat_department_id, int $pedido_id): bool { $countChatPresupuesto = $this->builder() ->where("pedido_id", $pedido_id) ->where("chat_department_id", $chat_department_id) ->countAllResults(); return $countChatPresupuesto > 0; } public function existChatFactura(int $chat_department_id, int $factura_id): bool { $countChatPresupuesto = $this->builder() ->where("factura_id", $factura_id) ->where("chat_department_id", $chat_department_id) ->countAllResults(); return $countChatPresupuesto > 0; } public function getChatPedidosChat() : array { $query = $this->db->table("chats") ->select([ "chats.id as chatId", "chats.pedido_id as pedidoId", "chats.chat_department_id as chatDepartmentId", "chat_departments.display as chatDisplay", "pedidos.id as title" ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("pedidos","pedidos.id = chats.pedido_id","left") ->get()->getResultObject(); return $query; } public function getChatPresupuestosChat() : array { $query = $this->db->table("chats") ->select([ "chats.id as chatId", "chats.pedido_id as pedidoId", "chats.chat_department_id as chatDepartmentId", "chat_departments.display as chatDisplay", "presupuestos.titulo as title" ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("presupuestos","presupuestos.id = chats.pedido_id","left") ->get()->getResultObject(); return $query; } public function getChatFacturasChat() : array { $query = $this->db->table("chats") ->select([ "chats.id as chatId", "chats.pedido_id as pedidoId", "chats.chat_department_id as chatDepartmentId", "chat_departments.display as chatDisplay", "facturas.numero as title" ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("facturas","facturas.id = chats.pedido_id","left") ->get()->getResultObject(); return $query; } public function getChatSingleChat() : array { $query = $this->db->table("chats") ->select([ "chats.id as chatId", "chats.chat_department_id as chatDepartmentId", "chat_departments.display as chatDisplay", "facturas.numero as title" ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("facturas","facturas.id = chats.pedido_id","left") ->get()->getResultObject(); return $query; } public function getClienteChatPedidos(array $pedidos) : array { $q = $this->db->table("chats") ->select([ "chats.id as chatId", "chats.pedido_id as pedidoId", "chats.chat_department_id as chatDepartmentId", "chat_departments.display as chatDisplay", "pedidos.id as title" ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("pedidos","pedidos.id = chats.pedido_id","left") ->where('chats.chat_department_id is NOT NULL', NULL, FALSE); if(count($pedidos)>0){ $q->whereIn("pedidos.id",$pedidos); }else{ return []; } $results = $q->get()->getResultObject(); $chatMessageModel = model(ChatMessageModel::class); $count = 0; foreach ($results as $row) { $messages = $chatMessageModel->get_chat_messages($row->chatId); foreach ($messages as $key => $message) { if($message->sender_id != auth()->user()->id && $message->viewed == false){ $count++; } } $row->uri = "/pedidos/edit/".$row->pedidoId; $row->unreadMessages=$count; } return $results; } public function getClienteChatFacturas(array $facturas) : array { $q = $this->db->table("chats") ->select([ "chats.id as chatId", "chats.factura_id as facturaId", "chats.chat_department_id as chatDepartmentId", "chat_departments.display as chatDisplay", "facturas.numero as title" ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("facturas","facturas.id = chats.factura_id","left") ->where('chats.chat_department_id is NOT NULL', NULL, FALSE); if(count($facturas)>0){ $q->whereIn("facturas.id",$facturas); }else{ return []; } $results = $q->get()->getResultObject(); $chatMessageModel = model(ChatMessageModel::class); $count = 0; foreach ($results as $row) { $messages = $chatMessageModel->get_chat_messages($row->chatId); foreach ($messages as $key => $message) { if($message->sender_id != auth()->user()->id && $message->viewed == false){ $count++; } } $row->uri = "/facturas/edit/".$row->facturaId; $row->unreadMessages=$count; } return $results; } public function getClienteChatPresupuestos(array $presupuestos) : array { $q = $this->db->table("chats") ->select([ "chats.id as chatId", "chats.presupuesto_id as presupuestoId", "chats.chat_department_id as chatDepartmentId", "chat_departments.display as chatDisplay", "presupuestos.titulo as title" ]) ->join("chat_departments","chat_departments.id = chats.chat_department_id","left") ->join("presupuestos","presupuestos.id = chats.presupuesto_id","left") ->where('chats.chat_department_id is NOT NULL', NULL, FALSE); if(count($presupuestos)>0){ $q->whereIn("presupuestos.id",$presupuestos); }else{ return []; } $results = $q->get()->getResultObject(); $chatMessageModel = model(ChatMessageModel::class); $count = 0; foreach ($results as $row) { $messages = $chatMessageModel->get_chat_messages($row->chatId); foreach ($messages as $key => $message ) { if($message->sender_id != auth()->user()->id && $message->viewed == false){ $count++; } } $row->uri = "/presupuestos/presupuestocliente/edit/".$row->presupuestoId; $row->unreadMessages=$count; } return $results; } public function getChatDepartmentNotifications() { $chatDeparmentModel = model(ChatDeparmentModel::class); $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.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; $chatDeparmentUsers = $chatDeparmentModel->getChatDepartmentUsers($row->chatDepartmentId); $chatDeparmentUsersId = array_map(fn($x) => $x->id,$chatDeparmentUsers); foreach ($messages as $m) { if($m->viewed == false && $m->sender_id != auth()->user()->id && in_array($m->sender_id,$chatDeparmentUsersId) == false) $count++; } if($row->presupuestoId){ $row->model = $presupuestoModel->find($row->presupuestoId); $row->uri = "/presupuestoadmin/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); $presupuestoModel = model(PresupuestoModel::class); $facturaModel = model(FacturaModel::class); $pedidoModel = model(PedidoModel::class); $chatNotificationModel = model(ChatNotification::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.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 = "/presupuestoadmin/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); $row->uri = "/pedidos/edit/".$row->pedidoId; $row->title = $row->pedidoId; $row->avatar = "P"; $row->unreadMessages = $this->countUnreadMessagePedido($row->pedidoId); $rows_new[] = $row; } elseif($row->facturaId){ $row->model = $facturaModel->find($row->facturaId); $row->uri = "/facturas/edit/".$row->facturaId; $row->avatar = "F"; $row->title = $row->facturaId; $row->unreadMessages = $this->countUnreadMessageFactura($row->facturaId); $rows_new[] = $row; } } 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 { $data = []; $query = $this->builder()->select([ "chats.id as chatId", "chat_messages.message", "users.username as senderUserName", "chat_messages.created_at", "CONCAT(users.first_name,' ',users.last_name) as senderFullName", ]) ->join("chat_messages","chat_messages.chat_id = chats.id","left") ->join("users","users.id = chat_messages.sender_id","left") ->where("chats.id",$chat_id) ->where("chats.presupuesto_id",$presupuesto_id); $data["chatId"] = $chat_id; $data["messages"] = $query->get()->getResultObject(); $data["chatTitle"] = $this->find($chat_id)->title; $data["users"] = $this->getChatUsers($chat_id); return $data; } public function getChatInternalHebraPedido($chat_id,$pedido_id){ $data = []; $query = $this->builder()->select([ "chats.id as chatId", "chat_messages.message", "users.username as senderUserName", "chat_messages.created_at", "CONCAT(users.first_name,' ',users.last_name) as senderFullName", ]) ->join("chat_messages","chat_messages.chat_id = chats.id","left") ->join("users","users.id = chat_messages.sender_id","left") ->where("chats.id",$chat_id) ->where("chats.pedido_id",$pedido_id); $data["chatId"] = $chat_id; $data["messages"] = $query->get()->getResultObject(); $data["chatTitle"] = $this->find($chat_id)->title; $data["users"] = $this->getChatUsers($chat_id); return $data; } public function getChatInternalHebraFactura($chat_id,$factura_id){ $data = []; $query = $this->builder()->select([ "chats.id as chatId", "chat_messages.message", "users.username as senderUserName", "chat_messages.created_at", "CONCAT(users.first_name,' ',users.last_name) as senderFullName", ]) ->join("chat_messages","chat_messages.chat_id = chats.id","left") ->join("users","users.id = chat_messages.sender_id","left") ->where("chats.id",$chat_id) ->where("chats.factura_id",$factura_id); $data["chatId"] = $chat_id; $data["messages"] = $query->get()->getResultObject(); $data["chatTitle"] = $this->find($chat_id)->title; $data["users"] = $this->getChatUsers($chat_id); return $data; } public function getChatUsers(int $chat_id) { $query = $this->builder()->select([ "users.username", "CONCAT(users.first_name,' ',users.last_name) as userFullName", ]) ->join("chat_users","chat_users.chat_id = chats.id") ->join("users","users.id = chat_users.user_id","left") ->where("chats.id",$chat_id); return $query->get()->getResultObject(); } public function getPresupuestoHebras($presupuesto_id) : array { $data = []; $chats = $this->builder()->select("chats.id as chatId") ->where("chats.chat_department_id",null) ->where("chats.presupuesto_id",$presupuesto_id)->get()->getResultObject(); foreach ($chats as $chat) { $data[$chat->chatId] = $this->getChatInternalHebraPresupuesto($chat->chatId,$presupuesto_id); } return $data; } public function getPedidoHebras($pedido_id) : array { $data = []; $chats = $this->builder()->select("chats.id as chatId") ->where("chats.chat_department_id",null) ->where("chats.pedido_id",$pedido_id)->get()->getResultObject(); foreach ($chats as $chat) { $data[$chat->chatId] = $this->getChatInternalHebraPedido($chat->chatId,$pedido_id); } return $data; } public function getFacturaHebras($factura_id) : array { $data = []; $chats = $this->builder()->select("chats.id as chatId") ->where("chats.chat_department_id",null) ->where("chats.factura_id",$factura_id)->get()->getResultObject(); foreach ($chats as $chat) { $data[$chat->chatId] = $this->getChatInternalHebraFactura($chat->chatId,$factura_id); } return $data; } public function countUnreadMessagePresupuesto($presupuesto_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",$presupuesto_id) ->where("chat_notifications.viewed",false) ->where("chat_notifications.user_id",auth()->user()->id) ->countAllResults(); } public function countUnreadMessagePedido($pedido_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.pedido_id",$pedido_id) ->where("chat_notifications.viewed",false) ->where("chat_notifications.user_id",auth()->user()->id) ->countAllResults(); } public function countUnreadMessageFactura($factura_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.factura_id",$factura_id) ->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); } public function getOpenChatCliente(int $user_id) : array { $q = $this->builder()->distinct()->select([ "users.*" ]) ->join("chat_messages","chat_messages.chat_id = chats.id","left") ->join("users","users.id = chat_messages.sender_id","left") ->where("chat_messages.receiver_id",$user_id); return $q->get()->getResultObject(); } public function getChatDepartmentMessagesCount(int $chat_id,int $chat_department_id) : int { $q = $this->builder()->select([ "chat_messages.id" ]) ->join("chat_messages","chat_messages.chat_id = chats.id",'left') ->where("chats.chat_department_id",$chat_department_id) ->where("chats.id",$chat_id) ->countAllResults(); return $q; } public function getChatFirstUser(int $chat_id) : object { $q = $this->builder()->select(["users.id", "CONCAT(users.first_name,' ',users.last_name) as userFullName", ]) ->join("chat_messages","chat_messages.chat_id = chats.id",'left') ->join("users","users.id = chat_messages.sender_id","left") ->where("chats.id",$chat_id) ->where("chat_messages.deleted_at",null) ->orderBy("chat_messages.created_at",'ASC'); return $q->get()->getFirstRow(); } /** * Check if all messages of a chat sended to an user have been viewed. * * @param integer $chat_id * @param integer $user_id * @return boolean True : All messages readed */ public function isMessageChatViewed(int $chat_id, int $user_id) : bool { $q = $this->builder()->select(["chat_notifications.id"]) ->join("chat_messages","chat_messages.chat_id = chats.id",'left') ->join("chat_notifications","chat_notifications.chat_message_id = chat_messages.id",'left') ->where("chats.id",$chat_id) ->where("chat_notifications.user_id",$user_id) ->where("chat_notifications.viewed",false); $unread_messages_count = $q->countAllResults(); if($unread_messages_count > 0){ $result = false; }else{ $result = true; } return $result; } public function getQueryDatatable(): BaseBuilder { $query = $this->builder() ->select([ "chats.id", "chats.created_at", "chats.updated_at", "chats.title", ]) ->where("chat_department_id",null) ->where("pedido_id",null) ->where("presupuesto_id",null) ->where("factura_id",null) ->where("title is NOT NULL",NULL,FALSE) ->orderBy("created_at", "DESC"); return $query; } public function createNewDirectChat(string $title,string $message,array $users) { $chatMessageModel = model(ChatMessageModel::class); $chatNotificationModel = model(ChatNotification::class); $chatUserModel = model(ChatUser::class); $auth_user_id = auth()->user()->id; $chat_id = $this->insert(["title" => $title]); $chat_message_id = $chatMessageModel->insert([ "chat_id" => $chat_id, "sender_id" => $auth_user_id, "receiver_id" => null, "message" => $message ]); $chatUserModel->insert(["chat_id" => $chat_id,"user_id" => $auth_user_id]); foreach ($users as $key => $user_id) { $chatUserModel->insert(["chat_id" => $chat_id,"user_id" => $user_id]); $chatNotificationModel->insert(["chat_message_id" => $chat_message_id,"user_id" => $user_id]); } } /** * Obtain users and messages from `chat_id` * * @param integer $chat_id * @return array * [ * "chat" => object, * "messages" => array , * "users" => array * ] */ public function getChatDirect(int $chat_id) : array { $auth_user = auth()->user()->id; $chat = $this->find($chat_id); $query = $this->builder()->select([ "users.*", ]) ->join("chat_users","chat_users.chat_id = chats.id") ->join("users","users.id = chat_users.user_id","left") ->where("chats.id",$chat_id); $users = $query->get()->getResultObject(); $query = $this->builder()->select([ "chat_messages.*", "users.first_name as sender_first_name", "users.last_name as sender_last_name", ]) ->join("chat_messages","chat_messages.chat_id = chats.id","left") ->join("users","chat_messages.sender_id = users.id","left") ->where("chats.id",$chat_id); $messages = $query->get()->getResultObject(); $validatedMessages = []; foreach ($messages as $key => $message) { if($auth_user == $message->sender_id){ $message->pos = 'right'; $validatedMessages[] = $message; }else{ $message->pos = 'left'; $validatedMessages[] = $message; } } $data = [ "chat" => $chat, "users" => $users, "messages" => $validatedMessages ]; return $data; } }