From b97e027920e1a2a618ed28512016942dca05d10b Mon Sep 17 00:00:00 2001
From: amazuecos
Date: Tue, 12 Nov 2024 18:26:22 +0100
Subject: [PATCH 1/2] feat: mensajes directos cliente
---
ci4/app/Controllers/Chat/ChatController.php | 11 +-
ci4/app/Language/es/Chat.php | 2 +-
ci4/app/Models/Chat/ChatDeparmentModel.php | 6 +-
ci4/app/Models/Chat/ChatMessageModel.php | 60 +-
ci4/app/Models/Chat/ChatModel.php | 76 +-
.../themes/vuexy/components/chat_general.php | 8 +-
httpdocs/assets/js/safekat/components/chat.js | 124 +-
.../components/internalMessagesSection.js | 4 +-
xdebug.log | 11677 ----------------
9 files changed, 200 insertions(+), 11768 deletions(-)
delete mode 100644 xdebug.log
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
-
+
+
@@ -83,13 +84,13 @@
aria-expanded="false">
-
+ -->
diff --git a/ci4/app/Views/themes/vuexy/main/menus/clientes_menu.php b/ci4/app/Views/themes/vuexy/main/menus/clientes_menu.php
index 71e53116..59ee8395 100644
--- a/ci4/app/Views/themes/vuexy/main/menus/clientes_menu.php
+++ b/ci4/app/Views/themes/vuexy/main/menus/clientes_menu.php
@@ -1,11 +1,12 @@
user()->inGroup('cliente-admin') || auth()->user()->inGroup('cliente-editor')) {
if (auth()->user()->can('perfil.edit') || auth()->user()->can('direcciones.menu')) {
- ?>
+?>
+
- user()->can('clientes.menu') ||
- auth()->user()->can('plantilla-tarifa.menu')) {
- ?>
+ if (
+ auth()->user()->can('clientes.menu') ||
+ auth()->user()->can('plantilla-tarifa.menu')
+ ) {
+ ?>
+
-
-
-
-
+?>
\ No newline at end of file
diff --git a/ci4/app/Views/themes/vuexy/main/menus/mensajes_menu.php b/ci4/app/Views/themes/vuexy/main/menus/mensajes_menu.php
index 44913967..7faa33da 100644
--- a/ci4/app/Views/themes/vuexy/main/menus/mensajes_menu.php
+++ b/ci4/app/Views/themes/vuexy/main/menus/mensajes_menu.php
@@ -2,7 +2,7 @@
/**
* MENU MENSAJES
*/
-if (auth()->user()->inGroup('beta')) {
+if (auth()->user()->inGroup('beta') || auth()->user()->inGroup('cliente-editor')) {
?>
- 0
+ ${row.totalMessages}
`
@@ -344,7 +344,6 @@ class Chat {
try {
if (contacts.length) {
- console.log(contacts)
contacts.map((c, index) => {
this._addContactToList(c)
@@ -469,7 +468,7 @@ class Chat {
${contact?.first_name ?? "" + " " +
contact?.last_name ?? ""}
- ${contact.username}
+ ${contact?.cliente_id ? "[CLIENTE]" : ""}${contact.username}
${contact.unreadMessages ? `