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.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; $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 = "/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); $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.presupuesto_id as presupuestoId", "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(); foreach ($rows as $row) { 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); } 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); } 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); } } return $rows; } 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(); } }