diff --git a/ci4/app/Config/Routes.php b/ci4/app/Config/Routes.php
index ef4675af..bcbf0798 100644
--- a/ci4/app/Config/Routes.php
+++ b/ci4/app/Config/Routes.php
@@ -795,6 +795,11 @@ $routes->group('chat', ['namespace' => 'App\Controllers\Chat'], function ($route
$routes->get('direct/conversation/(:num)', 'ChatController::get_chat_direct/$1', ['as' => 'getChatDirect']);
$routes->get('direct/users/select/(:num)', 'ChatController::get_chat_direct_select_users/$1', ['as' => 'getChatDirectSelectUsers']);
+
+ $routes->get('direct/client/users/select/presupuesto/(:num)', 'ChatController::get_presupuesto_client_users/$1/$2', ['as' => 'getPresupuestoClientUsers']);
+ $routes->get('direct/client/users/select/pedido/(:num)', 'ChatController::get_pedido_client_users/$1/$2', ['as' => 'getPedidoClientUsers']);
+ $routes->get('direct/client/users/select/factura/(:num)', 'ChatController::get_factura_client_users/$1/$2', ['as' => 'getFacturaClientUsers']);
+
$routes->get('direct/users/(:num)', 'ChatController::get_chat_direct_users', ['as' => 'getChatDirectUsers']);
$routes->post('direct/users/(:num)', 'ChatController::store_chat_direct_users/$1', ['as' => 'storeChatDirectUsers']);
$routes->get('direct/messages/(:num)', 'ChatController::get_chat_direct_messages/$1', ['as' => 'getChatDirectMessages']);
diff --git a/ci4/app/Controllers/Chat/ChatController.php b/ci4/app/Controllers/Chat/ChatController.php
index 3526b6da..854f562b 100644
--- a/ci4/app/Controllers/Chat/ChatController.php
+++ b/ci4/app/Controllers/Chat/ChatController.php
@@ -10,6 +10,9 @@ use App\Models\Chat\ChatModel;
use App\Models\ChatNotification;
use App\Models\ChatUser;
use App\Models\Clientes\ClienteModel;
+use App\Models\Facturas\FacturaModel;
+use App\Models\Pedidos\PedidoModel;
+use App\Models\Presupuestos\PresupuestoModel;
use App\Models\Usuarios\UserModel;
use App\Services\MessageService;
use CodeIgniter\HTTP\ResponseInterface;
@@ -396,6 +399,72 @@ class ChatController extends BaseController
return $this->response->setJSON($query->get()->getResultObject());
}
+ public function get_presupuesto_client_users(int $presupuesto_id)
+ {
+ $pm = model(PresupuestoModel::class);
+ $p = $pm->find($presupuesto_id);
+ $query = $this->userModel->builder()->select(
+ [
+ "id",
+ "CONCAT(first_name,' ',last_name,'(',username,')') as name"
+ ]
+ )
+ ->where("deleted_at", null)
+ ->whereNotIn("id", [auth()->user()->id])
+ ->where("cliente_id",$p->cliente_id);
+ if ($this->request->getGet("q")) {
+ $query->groupStart()
+ ->orLike("users.username", $this->request->getGet("q"))
+ ->orLike("CONCAT(first_name,' ',last_name)", $this->request->getGet("q"))
+ ->groupEnd();
+ }
+
+ return $this->response->setJSON($query->get()->getResultObject());
+ }
+ public function get_pedido_client_users(int $pedido_id)
+ {
+ $pm = model(PedidoModel::class);
+ $p = $pm->find($pedido_id);
+ $query = $this->userModel->builder()->select(
+ [
+ "id",
+ "CONCAT(first_name,' ',last_name,'(',username,')') as name"
+ ]
+ )
+ ->where("deleted_at", null)
+ ->whereNotIn("id", [auth()->user()->id])
+ ->where("cliente_id",$p->cliente()->id);
+ if ($this->request->getGet("q")) {
+ $query->groupStart()
+ ->orLike("users.username", $this->request->getGet("q"))
+ ->orLike("CONCAT(first_name,' ',last_name)", $this->request->getGet("q"))
+ ->groupEnd();
+ }
+
+ return $this->response->setJSON($query->get()->getResultObject());
+ }
+ public function get_factura_client_users(int $factura_id)
+ {
+ $fm = model(FacturaModel::class);
+ $f = $fm->find($factura_id);
+ $query = $this->userModel->builder()->select(
+ [
+ "id",
+ "CONCAT(first_name,' ',last_name,'(',username,')') as name"
+ ]
+ )
+ ->where("deleted_at", null)
+ ->whereNotIn("id", [auth()->user()->id])
+ ->where("cliente_id",$f->cliente_id);
+ if ($this->request->getGet("q")) {
+ $query->groupStart()
+ ->orLike("users.username", $this->request->getGet("q"))
+ ->orLike("CONCAT(first_name,' ',last_name)", $this->request->getGet("q"))
+ ->groupEnd();
+ }
+
+ return $this->response->setJSON($query->get()->getResultObject());
+ }
public function store_hebra_presupuesto()
{
$auth_user = auth()->user();
diff --git a/ci4/app/Entities/Pedidos/PedidoEntity.php b/ci4/app/Entities/Pedidos/PedidoEntity.php
index a847c03b..016bf7e2 100644
--- a/ci4/app/Entities/Pedidos/PedidoEntity.php
+++ b/ci4/app/Entities/Pedidos/PedidoEntity.php
@@ -1,6 +1,10 @@
"float",
"total_tirada" => "float",
];
+
+ public function cliente() : ?ClienteEntity
+ {
+ $m = model(ClienteModel::class);
+ $pl = model(PedidoLineaModel::class);
+ $pm = model(PresupuestoModel::class);
+ $pedido_linea = $pl->where('pedido_id',$this->attributes["id"])->first();
+ $pre = $pm->find($pedido_linea->presupuesto_id);
+ return $m->find($pre->cliente_id);
+ }
}
diff --git a/ci4/app/Views/themes/vuexy/components/chat_factura.php b/ci4/app/Views/themes/vuexy/components/chat_factura.php
index f3e13cdf..c9e9748d 100644
--- a/ci4/app/Views/themes/vuexy/components/chat_factura.php
+++ b/ci4/app/Views/themes/vuexy/components/chat_factura.php
@@ -1,4 +1,9 @@
+user()->inGroup('admin')) { ?>
+
+
+
+
+ = view("themes/vuexy/components/modals/modalNewDirectMessageClient", ["modelId" => $modelId]) ?>
+
= $this->section('css') ?>
diff --git a/ci4/app/Views/themes/vuexy/components/chat_pedido.php b/ci4/app/Views/themes/vuexy/components/chat_pedido.php
index 64cb9c3c..9422acf7 100644
--- a/ci4/app/Views/themes/vuexy/components/chat_pedido.php
+++ b/ci4/app/Views/themes/vuexy/components/chat_pedido.php
@@ -1,5 +1,9 @@
-
+user()->inGroup('admin')) { ?>
+
+
+
+
+ = view("themes/vuexy/components/modals/modalNewDirectMessageClient", ["modelId" => $modelId]) ?>
+
diff --git a/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php b/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php
index 76c30928..238a7477 100644
--- a/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php
+++ b/ci4/app/Views/themes/vuexy/components/chat_presupuesto.php
@@ -1,7 +1,11 @@
-
+ user()->inGroup('admin')) { ?>
+
+
+
+
+
+ = view("themes/vuexy/components/modals/modalNewDirectMessageClient", ["modelId" => $modelId]) ?>
= $this->section('css') ?>
diff --git a/ci4/app/Views/themes/vuexy/components/modals/modalNewDirectMessageClient.php b/ci4/app/Views/themes/vuexy/components/modals/modalNewDirectMessageClient.php
new file mode 100644
index 00000000..c2f6759f
--- /dev/null
+++ b/ci4/app/Views/themes/vuexy/components/modals/modalNewDirectMessageClient.php
@@ -0,0 +1,47 @@
+
+
>
+
+
+
+
+
+ = view("themes/vuexy/components/alerts/alert", ["id" => "alertDirectMessage"]) ?>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/httpdocs/assets/js/safekat/components/alerts/alert.js b/httpdocs/assets/js/safekat/components/alerts/alert.js
index ace6fde9..25595040 100644
--- a/httpdocs/assets/js/safekat/components/alerts/alert.js
+++ b/httpdocs/assets/js/safekat/components/alerts/alert.js
@@ -7,6 +7,8 @@ class Alert {
this.icon = this.item.find(".icon-alert")
this.iconSuccess = "ti-circle-check"
this.iconError = "ti-exclamation-mark"
+ this.iconInfo = "ti-question-mark"
+
@@ -14,6 +16,7 @@ class Alert {
setIcon(iconClass){
this.icon.removeClass(this.iconSuccess)
this.icon.removeClass(this.iconError)
+ this.icon.removeClass(this.iconInfo)
this.icon.addClass(iconClass)
}
setAsError() {
@@ -24,16 +27,25 @@ class Alert {
}
setAsSuccess() {
this.item.removeClass("alert-danger")
+ this.item.removeClass("alert-warning")
+ this.item.removeClass("alert-info")
this.item.addClass("alert-success")
this.setIcon(this.iconSuccess)
}
setAsWarning() {
this.item.removeClass("alert-success")
+ this.item.removeClass("alert-danger")
+ this.item.removeClass("alert-info")
this.item.addClass("alert-warning")
+ this.setIcon(this.iconError)
+
}
setAsInfo() {
- this.item.removeClass("alert-*")
+ this.item.removeClass("alert-success")
+ this.item.removeClass("alert-danger")
+ this.item.addClass("alert-warning")
this.item.addClass("alert-info")
+ this.setIcon(this.iconInfo)
}
show() {
this.item.removeClass("d-none")
@@ -48,6 +60,16 @@ class Alert {
this.body.append(content)
}
setErrors() { }
+ reset(){
+ this.item.removeClass("alert-success")
+ this.item.removeClass("alert-danger")
+ this.item.removeClass("alert-warning")
+ this.item.removeClass("alert-info")
+ this.item.setContent("")
+ this.item.setHeadingTitle("")
+ this.item.hide()
+
+ }
}
export default Alert;
\ No newline at end of file
diff --git a/httpdocs/assets/js/safekat/components/modals/modalDirectMessageClient.js b/httpdocs/assets/js/safekat/components/modals/modalDirectMessageClient.js
new file mode 100644
index 00000000..5e93e03f
--- /dev/null
+++ b/httpdocs/assets/js/safekat/components/modals/modalDirectMessageClient.js
@@ -0,0 +1,85 @@
+import Ajax from "../ajax.js";
+import Modal from "../modal.js"
+import ClassSelect from "../select2.js";
+import Alert from "../alerts/alert.js";
+
+class ModalDirectMessageClient {
+ constructor(model="presupuesto",domItem = null) {
+ this.item = domItem
+ this.modal = new Modal(domItem)
+ this.alert = new Alert(this.item.find("#alertDirectMessage"))
+ this.modelId = this.item.data("id");
+ this.selectItem = this.item.find("#select-clients")
+ this.model = model
+ this.selectClientUser = new ClassSelect(this.selectItem,`/chat/direct/client/users/select/${this.model}/${this.modelId}`,"Seleccione contacto",true)
+ this.messageInput = this.item.find("#new-direct-message-cliente-text")
+ this.title = this.item.find("#new-direct-message-cliente-title")
+ this.btnSubmitMessage = this.item.find("#submit-new-direct-message-client")
+ }
+ init() {
+ this.selectClientUser.init()
+ this.modal.item.on("hidden.bs.modal",this.reset_close.bind(this))
+ this.modal.item.on("shown.bs.modal",this.reset_show.bind(this))
+ this.btnSubmitMessage.on("click",this._handleStoreChatDirectMessage.bind(this))
+ }
+ reset(){
+ this.messageInput.val("")
+ this.title.val("")
+ this.selectClientUser.reset();
+ }
+ reset_close(){
+ this.messageInput.val("")
+ this.title.val("")
+ this.selectClientUser.reset();
+ this.alert.hide()
+ this.alert.setHeadingTitle("")
+ this.alert.setContent("")
+ this.alert.setAsSuccess()
+ }
+ reset_show(){
+ this.messageInput.val("")
+ this.title.val("")
+ this.selectClientUser.reset();
+ this.alert.hide()
+ this.alert.setHeadingTitle("")
+ this.alert.setContent("")
+ this.alert.setAsSuccess()
+ }
+ _handleStoreChatDirectMessage() {
+ const data = { "message": this.messageInput.val(), "title": this.title.val() , "users" : this.selectClientUser.getVal() }
+ if (data.message) {
+ const ajax = new Ajax(
+ `/messages/direct`,
+ data,
+ null,
+ this._handleStoreNewDirectMessageSuccess.bind(this),
+ this._handleStoreNewDirectMessageError.bind(this)
+ )
+ ajax.post()
+ }else{
+ this.alert.show()
+ this.alert.setAsWarning()
+ this.alert.setHeadingTitle("Tienes que añadir un mensaje")
+ }
+ }
+ _handleStoreNewDirectMessageSuccess(response) {
+ try {
+ this.alert.setAsSuccess()
+ this.alert.setHeadingTitle(response.message)
+ this.alert.setContent(response.message)
+ this.alert.show()
+ } catch (error) {
+ } finally {
+ this.reset()
+ }
+
+ }
+ _handleStoreNewDirectMessageError(error){
+ this.alert.setHeadingTitle(error.message)
+ this.alert.setAsError()
+ this.alert.setContent(JSON.stringify(error.errors))
+ this.alert.show()
+ }
+}
+
+export default ModalDirectMessageClient
\ No newline at end of file
diff --git a/httpdocs/assets/js/safekat/pages/chatFactura.js b/httpdocs/assets/js/safekat/pages/chatFactura.js
index a70088e2..f05ead5a 100644
--- a/httpdocs/assets/js/safekat/pages/chatFactura.js
+++ b/httpdocs/assets/js/safekat/pages/chatFactura.js
@@ -1,5 +1,6 @@
import Chat from '../components/chat.js'
import InternalMessages from "../components/internalMessagesSection.js"
+import ModalDirectMessageClient from '../components/modals/modalDirectMessageClient.js'
$(document).ready(() => {
let chat = new Chat($("#chat-factura"))
@@ -9,5 +10,9 @@ $(document).ready(() => {
let internalMessages = new InternalMessages($("#internal_messages_chat"))
internalMessages.init()
}
-
+ let modalDirectMessageClient = new ModalDirectMessageClient("factura", $("#modalNewDirectMessageClient"))
+ modalDirectMessageClient.init()
+ $("#direct-message-cliente").on("click",() => {
+ modalDirectMessageClient.modal.show()
+ })
})
\ No newline at end of file
diff --git a/httpdocs/assets/js/safekat/pages/chatPedido.js b/httpdocs/assets/js/safekat/pages/chatPedido.js
index f987780c..2115a246 100644
--- a/httpdocs/assets/js/safekat/pages/chatPedido.js
+++ b/httpdocs/assets/js/safekat/pages/chatPedido.js
@@ -1,5 +1,6 @@
import Chat from '../components/chat.js'
import InternalMessages from "../components/internalMessagesSection.js"
+import ModalDirectMessageClient from '../components/modals/modalDirectMessageClient.js'
$(document).ready(() => {
let chat = new Chat($("#chat-pedido"))
@@ -9,5 +10,10 @@ $(document).ready(() => {
let internalMessages = new InternalMessages($("#internal_messages_chat"))
internalMessages.init()
}
+ let modalDirectMessageClient = new ModalDirectMessageClient("pedido", $("#modalNewDirectMessageClient"))
+ modalDirectMessageClient.init()
+ $("#direct-message-cliente").on("click",() => {
+ modalDirectMessageClient.modal.show()
+ })
})
\ No newline at end of file
diff --git a/httpdocs/assets/js/safekat/pages/chatPresupuesto.js b/httpdocs/assets/js/safekat/pages/chatPresupuesto.js
index 8a6ee177..1f306f0c 100644
--- a/httpdocs/assets/js/safekat/pages/chatPresupuesto.js
+++ b/httpdocs/assets/js/safekat/pages/chatPresupuesto.js
@@ -1,13 +1,18 @@
import Chat from '../components/chat.js'
import InternalMessages from "../components/internalMessagesSection.js"
-
-$(document).ready(() => {
+import ModalDirectMessageClient from '../components/modals/modalDirectMessageClient.js'
+$(function () {
let chat = new Chat($("#chat-presupuesto"))
chat.init()
chat.initPresupuesto()
- if($("#internal_messages_chat").length > 0){
- let internalMessages = new InternalMessages($("#internal_messages_chat"))
- internalMessages.init()
+ if ($("#internal_messages_chat").length > 0) {
+ let internalMessages = new InternalMessages($("#internal_messages_chat"))
+ internalMessages.init()
+ let modalDirectMessageClient = new ModalDirectMessageClient("presupuesto", $("#modalNewDirectMessageClient"))
+ modalDirectMessageClient.init()
+ $("#direct-message-cliente").on("click",() => {
+ modalDirectMessageClient.modal.show()
+ })
}
})
\ No newline at end of file