MERGE_CODE_MERGE : RV

This commit is contained in:
VENKATESHWARAN 2025-01-29 15:03:10 +05:30
commit 4c6b9f27f8
11 changed files with 789 additions and 494 deletions

View File

@ -503,6 +503,8 @@ $routes->group("/ticket", ["filter" => "authMVC"], function ($routes) {
$routes->get('view/(:any)','TicketController::view_ticket/$1'); $routes->get('view/(:any)','TicketController::view_ticket/$1');
$routes->get('mail_template','TicketController::mailTemplate'); $routes->get('mail_template','TicketController::mailTemplate');
$routes->post('crud_mail_template/(:any)','TicketController::crudTemplate/$1'); $routes->post('crud_mail_template/(:any)','TicketController::crudTemplate/$1');
$routes->post('note','TicketController::crudNote'); $routes->post('note/(:any)','TicketController::crudNote/$1');
$routes->post('reply','TicketController::saveReply');
// $routes->post('ticket_messages','TicketController::getTicketMessage');
}); });

View File

@ -1669,11 +1669,12 @@ class MasterController extends AdminController
["filePath" => ROOTPATH."public/sample_excel/sample_inception.xls","fileName" => "sample_inception.xls"], ["filePath" => ROOTPATH."public/sample_excel/sample_inception.xls","fileName" => "sample_inception.xls"],
["filePath" => ROOTPATH."public/assets/images/login_bg.jpg","fileName" => "login_bg.jpg"] ["filePath" => ROOTPATH."public/assets/images/login_bg.jpg","fileName" => "login_bg.jpg"]
]; ];
$email_id = 'hariharan@nhanceindia.in'; $email_id = 'srinivas.saravanan@venbainfotech.com';
$params = ['mail'=>$email_id];
$common = ['mail_type'=>'test_mail_cli']; $common = ['mail_type'=>'test_mail_cli'];
$bcc = "vijayalakshmi@nhanceindia.in,vitvelz@gmail.com,velmurugan.s@venbainfotech.com,hariharan@nhanceindia.in,hariharan@jubiliant.in,srinivas.saravanan@venbainfotech.com"; // $bcc = "vijayalakshmi@nhanceindia.in,vitvelz@gmail.com,velmurugan.s@venbainfotech.com,hariharan@nhanceindia.in,hariharan@jubiliant.in,srinivas.saravanan@venbainfotech.com";
// Send email and get response // Send email and get response
$result = MailHelper::send_email(['mail' => $email_id, 'subject' => 'Mail Via CLI','bcc'=>$bcc ,'message' => $message,'attachments' => $attachments,'common'=>$common]); $result = MailHelper::send_email(['mail' => $email_id, 'params'=>$params,'subject' => 'Mail Via CLI','message' => $message,'attachments' => $attachments,'common'=>$common]);
log_message('error',json_encode($result)); log_message('error',json_encode($result));

View File

@ -11,6 +11,8 @@ use App\Models\TicketHistoryModel;
use App\Models\TicketMailTemplateModel; use App\Models\TicketMailTemplateModel;
use App\Models\TicketMessageModel; use App\Models\TicketMessageModel;
use App\Models\TicketNoteModel; use App\Models\TicketNoteModel;
use App\Models\UserModel;
use DOMDocument;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
use Kint\Kint; use Kint\Kint;
@ -35,9 +37,10 @@ class TicketController extends BaseController
protected $ticketMasterModel; protected $ticketMasterModel;
protected $ticketHistoryModel; protected $ticketHistoryModel;
protected $ticketMailTemplateModel; protected $ticketMailTemplateModel;
protected $ticketMesageModel; protected $ticketMessageModel;
protected $ticketNoteModel; protected $ticketNoteModel;
protected $triggerType; protected $triggerType;
protected $userModel;
public function __construct() public function __construct()
{ {
@ -110,6 +113,9 @@ class TicketController extends BaseController
$this->clientModel = new ClientModel(); $this->clientModel = new ClientModel();
$this->ticketHistoryModel = new TicketHistoryModel(); $this->ticketHistoryModel = new TicketHistoryModel();
$this->ticketMailTemplateModel = new TicketMailTemplateModel(); $this->ticketMailTemplateModel = new TicketMailTemplateModel();
$this->ticketNoteModel = new TicketNoteModel();
$this->ticketMessageModel = new TicketMessageModel();
$this->userModel = new UserModel();
} }
@ -210,6 +216,16 @@ class TicketController extends BaseController
// dd($ticket_data); // dd($ticket_data);
$data = $this->ticket_form_data($ticket_data['ticket_type_id']); $data = $this->ticket_form_data($ticket_data['ticket_type_id']);
$data['ticket_data'] = $ticket_data; $data['ticket_data'] = $ticket_data;
$data['reply_data'] = $this->ticketMasterModel
->join('ticket_claim_status','ticket_master.claim_status_id = ticket_claim_status.id and ticket_claim_status.is_active = 1')
->join('ticket_mail_template','ticket_claim_status.trigger_type = ticket_mail_template.trigger_type and ticket_claim_status.ticket_type = ticket_mail_template.ticket_type and ticket_mail_template.is_active = 1')
->where('ticket_master.id',$ticket_id)
->where('ticket_master.is_active',1)
->first();
$data['placeHolders'] = $this->placeHolders;
$data['message_data'] = $this->getTicketMessage($ticket_id);
// dd($data);
return $this->loadLayout('ticket_edit_onbording', $data); return $this->loadLayout('ticket_edit_onbording', $data);
} }
@ -360,8 +376,77 @@ class TicketController extends BaseController
} }
} }
public function crudNote(){ public function crudNote($action){
// action = 1 is read, action 2 is insert/update
if ($action == 1){
$ticket_master_id = $this->request->getPost('id');
if (isset($ticket_master_id) && $ticket_master_id != ''){
$data = $this->ticketNoteModel->where('is_active',1)->where('ticket_id',$ticket_master_id)->first();
if ($data){
return $this->respond(['status' => true, 'data' => $data],200);
}else{
return $this->respond(['status' => false],404);
}
}
}elseif ($action == 2){
$data = $this->request->getPost();
// if (isset($data['id']) && $data['id'] != ''){
$status = $this->ticketNoteModel->save($data);
// }
if ($status){
return $this->respond(['status'=>true],200);
}else{
return $this->respond(['status'=>false],404);
}
}
}
public function saveReply(){
$received_data = $this->request->getPost();
$received_data['sender'] = 'staff';
$status = $this->ticketMessageModel->save($received_data);
if ($status){
return $this->respond(['status' => true,'code'=>200],200);
}else{
return $this->respond(['status' => false,'code' => 404],404);
}
}
public function getTicketMessage($ticket_master_id){
// log_message('error','Function called');die();
// $ticket_master_id = $this->request->getPost('id');
$user_id = get_session_userid();
$logged_user = $this->userModel->select('first_name,last_name,profile')->where('id',$user_id)->first();
$dataToSend = [];
$dataToSend['user_name'] = $logged_user['first_name'].' '.$logged_user['last_name'];
$dataToSend['messages'] = $this->ticketMessageModel->where('is_active',1)
->where('ticket_id',$ticket_master_id)->orderBy('created_at', 'DESC')
->findAll();
foreach ($dataToSend['messages'] as $message){
$mail_content_converted = $this->convertHtmlToText($message['mail_content']);
$message['mail_content'] = $mail_content_converted;
}
$dataToSend['emp_name'] = $this->ticketMasterModel->select('emp_name')
->where('id',$ticket_master_id)->where('is_active',1)
->first()['emp_name'];
// dd($dataToSend);
if($dataToSend){
return $dataToSend;
}else{
$data = [];
return $data;
}
}
public function convertHtmlToText($html) {
$dom = new DOMDocument();
@$dom->loadHTML($html);
return strip_tags($dom->saveHTML());
} }
public function sendTringger($ticket_id = 13) public function sendTringger($ticket_id = 13)
@ -387,5 +472,4 @@ class TicketController extends BaseController
} }
} }

View File

@ -56,11 +56,12 @@ class GmailResponseHandler{
// 'employee_id' => isset($params['params']['common']['employee_id']) ? $params['params']['common']['employee_id'] : null, // 'employee_id' => isset($params['params']['common']['employee_id']) ? $params['params']['common']['employee_id'] : null,
// 'mail_type' => isset($params['params']['common']['mail_type']) ? $params['params']['common']['mail_type'] : null, // 'mail_type' => isset($params['params']['common']['mail_type']) ? $params['params']['common']['mail_type'] : null,
// 'gmail_api_status' => isset($params['gmail_api']['status']) ? $params['gmail_api']['status'] : null, // 'gmail_api_status' => isset($params['gmail_api']['status']) ? $params['gmail_api']['status'] : null,
// 'gmail_api_id' => isset($params['gmail_api']['data']['id']) ? $params['gmail_api']['data']['id'] : null // 'gmail_api_id' => isset($params['gmail_api']['data']['id']) ? $params['gmail_api']['data']['id'] : null,
// 'received_message' => isset($params['gmail_api']['data']['labelIds'])?json_encode($params['gmail_api']['data']['labelIds']): null
// ]; // ];
// Initialize data array // Initialize data array
$data = []; $data = [];
// print_r($params['params']['common']);die(); // // print_r($params['params']['common']);die();
if (isset($params['params']['common'])) { if (isset($params['params']['common'])) {
foreach ($params['params']['common'] as $key => $value) { foreach ($params['params']['common'] as $key => $value) {
$data[$key] = isset($value) ? $value : null; $data[$key] = isset($value) ? $value : null;

View File

@ -12,7 +12,7 @@ class TicketMessageModel extends Model
protected $returnType = 'array'; protected $returnType = 'array';
protected $useSoftDeletes = false; protected $useSoftDeletes = false;
protected $protectFields = true; protected $protectFields = true;
protected $allowedFields = []; protected $allowedFields = ['id','sender','ticket_id','mail_subject','emp_mail','mail_content','created_at'];
// Callbacks // Callbacks

View File

@ -1,28 +1,37 @@
<div id="ticket_messages_div">
<?php $messages = $message_data['messages'];
foreach ($messages as $message) :
?>
<?php if ($message['sender'] == 'user') { ?>
<div class="card mb-3" style="margin-right: 23px;"> <div class="card mb-3" style="margin-right: 23px;">
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<div class="col-xl-2 col-lg-3"> <div class="col-xl-2 col-lg-3">
<div class="text-center"> <div class="text-center">
<div class="mb-3"> <div style="padding-left: 10px;" class="mb-3">
<div class="row">
<img src="https://venbait.in/nhance/helpdesk/dev/assets/helpdeskz/images/user.jpg" <img src="https://venbait.in/nhance/helpdesk/dev/assets/helpdeskz/images/user.jpg"
class="user-avatar rounded-circle img-fluid" style="max-width: 100px"> class="user-avatar rounded-circle img-fluid col-mb-6" style="max-width: 70px">
<div style="padding-left: 10px;padding-top: 15px;" class="col-mb-6"><?= $message_data['emp_name'] ?></div>
</div>
<span style="text-align: center; position: relative;text-align: center;bottom: 28px;left: 15px;" class="badge badge-dark">User</span>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<div>RUPESH</div>
<span class="badge badge-dark">User</span>
</div> </div>
</div> </div>
</div> </div>
<div class="col"> <div class="col">
<div class="mb-3"> <div class="mb-3">
<div class="text-muted"><i class="fa fa-calendar"></i> 16 December 2024 04:15 pm</div> <div class="text-muted"><i class="fa fa-calendar"></i> <?php echo (new DateTime($message['created_at']))->format('j F Y h:i a');?></div>
</div> </div>
<div id="msg_388" class="form-group"> <div id="msg_388" class="form-group">
Body </div> <p><?= $message['mail_content'] ?></p>
<div class="form-group mt-5"> </div>
<!-- <div class="form-group mt-5">
<button class="btn btn-dark btn-sm" type="button" onclick="quoteMessage(388);"><i <button class="btn btn-dark btn-sm" type="button" onclick="quoteMessage(388);"><i
class="fa fa-quote-left"></i> Quote</button> class="fa fa-quote-left"></i> Quote</button>
</div> </div> -->
<div class="border-top mt-3 pt-4 text-right"> <div class="border-top mt-3 pt-4 text-right">
</div> </div>
</div> </div>
@ -30,38 +39,41 @@
</div> </div>
</div> </div>
<?php } else { ?>
<div class="card mb-3 bg-staff" style="margin-right: 23px;"> <div class="card mb-3 bg-staff" style="margin-right: 23px;">
<div class="card-body"> <div class="card-body">
<div class="row"> <div class="row">
<div class="col-xl-2 col-lg-3"> <div class="col-xl-2 col-lg-3">
<div class="text-center"> <div class="text-center">
<div class="mb-3"> <div style="padding-left: 10px;" class="mb-3">
<div class="row">
<img src="https://venbait.in/nhance/helpdesk/dev/assets/helpdeskz/images/agent.jpg" <img src="https://venbait.in/nhance/helpdesk/dev/assets/helpdeskz/images/agent.jpg"
class="user-avatar rounded-circle img-fluid" style="max-width: 100px"> class="user-avatar rounded-circle img-fluid col-mb-6" style="max-width: 70px">
<div style="padding-left: 10px;padding-top: 15px;" class="col-mb-6"><?= $message_data['user_name'] ?></div>
</div> </div>
<div class="mb-3"> <span style="text-align: center; position: relative;text-align: center;bottom: 28px;left: 15px;" class="badge badge-primary">Staff</span>
<div>Venkatesh HelpDesk Admin</div>
<span class="badge badge-primary">Staff</span>
</div> </div>
</div> </div>
</div> </div>
<div class="col"> <div class="col">
<div class="mb-3"> <div class="mb-3">
<div class="text-muted"><i class="fa fa-calendar"></i> 24 January 2025 03:41 pm</div> <div class="text-muted"><i class="fa fa-calendar"></i> <?php echo (new DateTime($message['created_at']))->format('j F Y h:i a');?></div>
</div> </div>
<div id="msg_394" class="form-group"> <div id="msg_394" class="form-group">
<p>hi how are you i am fine</p> <p><?= $message['mail_content'] ?></p>
</div> </div>
<div class="form-group mt-5"> <!-- <div class="form-group mt-5">
<button class="btn btn-dark btn-sm" type="button" onclick="quoteMessage(394);"><i <button class="btn btn-dark btn-sm" type="button" onclick="quoteMessage(394);"><i
class="fa fa-quote-left"></i> Quote</button> class="fa fa-quote-left"></i> Quote</button>
</div> </div> -->
<div class="border-top mt-3 pt-4 text-right"> <!-- <div class="border-top mt-3 pt-4 text-right">
<i class="fa fa-globe"></i> 115.97.253.189 <i class="fa fa-globe"></i> 115.97.253.189
</div> </div> -->
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<?php } endforeach; ?>
</div>

View File

@ -106,16 +106,17 @@ function submitClaimForm(event, form) {
contentType: false, contentType: false,
success: function(response) { success: function(response) {
// Hide loader // Hide loader
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
console.log('Form submitted response:', response); console.log('Form submitted response:', response);
if (response.status === true) { if (response.status === true) {
location.reload();
toastr.success(response.message, 'SUCCESS'); toastr.success(response.message, 'SUCCESS');
} else { } else {
toastr.error(response.message, 'ERROR'); toastr.error(response.message, 'ERROR');
} }
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
}, },
error: function(xhr, status, error) { error: function(xhr, status, error) {
console.error(xhr.responseText); console.error(xhr.responseText);
@ -127,4 +128,6 @@ function submitClaimForm(event, form) {
} }
}); });
} }
</script> </script>

View File

@ -58,7 +58,8 @@ if ($ticket_form == 1) {
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="empDetailsModalLabel">Fetch Employee Data</h5> <h5 class="modal-title" id="empDetailsModalLabel">Fetch Employee Data</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close" onclick="toResetTheModelFields()"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"
onclick="toResetTheModelFields()">
<span aria-hidden="true">&times;</span> <span aria-hidden="true">&times;</span>
</button> </button>
</div> </div>
@ -77,7 +78,8 @@ if ($ticket_form == 1) {
<div class="col-md-5" style="display:true;"> <div class="col-md-5" style="display:true;">
<div class="form-group"> <div class="form-group">
<label>Employee Data Points</label> <label>Employee Data Points</label>
<select name="employee_data_points" id="employee_data_points" class="form-control"> <select name="employee_data_points" id="employee_data_points"
class="form-control">
<option value="mobile">Employee Mobile Number</option> <option value="mobile">Employee Mobile Number</option>
<option value="emp_code">Employee ID</option> <option value="emp_code">Employee ID</option>
</select> </select>
@ -88,7 +90,8 @@ if ($ticket_form == 1) {
<div class="form-group"> <div class="form-group">
<label id="employee_data_points_label">Employee Mobile Number</label> <label id="employee_data_points_label">Employee Mobile Number</label>
<input class="form-control" type="text" id="emp_mobile_number_for_claim" <input class="form-control" type="text" id="emp_mobile_number_for_claim"
name="mobile_numbers" onkeypress="return onlyNumbers(event)" maxlength="10"> name="mobile_numbers" onkeypress="return onlyNumbers(event)"
maxlength="10">
</div> </div>
<div class="text-danger" id="error_dis"></div> <div class="text-danger" id="error_dis"></div>
</div> </div>
@ -168,7 +171,8 @@ if ($ticket_form == 1) {
<div class="form-group"> <div class="form-group">
<label>Employee</label> <label>Employee</label>
<select name="search_by_client_employee" id="search_by_client_employee" <select name="search_by_client_employee" id="search_by_client_employee"
class="form-control SelExample" onchange="getTheEmpDataForClaimSearchByMobile(this, 'client')"> class="form-control SelExample"
onchange="getTheEmpDataForClaimSearchByMobile(this, 'client')">
<option value="0">Select Employee</option> <option value="0">Select Employee</option>
</select> </select>
</div> </div>
@ -189,19 +193,20 @@ if ($ticket_form == 1) {
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a class="btn btn-primary close" data-dismiss="modal" aria-label="Close" onclick="toResetTheModelFields()">Submit</a> <a class="btn btn-primary close" data-dismiss="modal" aria-label="Close"
onclick="toResetTheModelFields()">Submit</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<script> <script>
var client_list = ''; // local variable for storing the client branch list var client_list = ''; // local variable for storing the client branch list
var branch_list = ''; // local variable for storing the client branch list var branch_list = ''; // local variable for storing the client branch list
var policy_list = ''; // local variable for storing the client policy list var policy_list = ''; // local variable for storing the client policy list
$(document).ready(function() { $(document).ready(function() {
getClientAndBranchAndPolicy(); getClientAndBranchAndPolicy();
$('#emp_client_data_list').select2(); $('#emp_client_data_list').select2();
$('#emp_client_branch_data_list').select2(); $('#emp_client_branch_data_list').select2();
@ -210,10 +215,10 @@ if ($ticket_form == 1) {
$('#search_by_client_employee').select2(); $('#search_by_client_employee').select2();
$('#employee_by_number').select2(); $('#employee_by_number').select2();
$('#member_by_number').select2(); $('#member_by_number').select2();
}) })
//on change functions //on change functions
$(document).ready(function() { $(document).ready(function() {
$('#emp_client_data_list').change(function() { $('#emp_client_data_list').change(function() {
@ -245,9 +250,9 @@ if ($ticket_form == 1) {
}) })
}) })
function toggleAccordion(id) { function toggleAccordion(id) {
const content = document.getElementById(id); const content = document.getElementById(id);
const arrow = document.querySelector(`#${id === 'mobileAccordion' ? 'mobileArrow' : 'clientBranchArrow'}`); const arrow = document.querySelector(`#${id === 'mobileAccordion' ? 'mobileArrow' : 'clientBranchArrow'}`);
@ -259,15 +264,15 @@ if ($ticket_form == 1) {
content.classList.add('show'); content.classList.add('show');
arrow.classList.add('rotate'); arrow.classList.add('rotate');
} }
} }
function openFetchEmpDataodal() { function openFetchEmpDataodal() {
var myModal = new bootstrap.Modal(document.getElementById('empDetailsModal')); var myModal = new bootstrap.Modal(document.getElementById('empDetailsModal'));
myModal.show(); myModal.show();
} }
//get client , branch, policy data //get client , branch, policy data
function getClientAndBranchAndPolicy() { function getClientAndBranchAndPolicy() {
$.ajax({ $.ajax({
url: '<?= base_url("/util/getClientAndBranchAndPolicy") ?>', url: '<?= base_url("/util/getClientAndBranchAndPolicy") ?>',
type: "GET", type: "GET",
@ -290,10 +295,10 @@ if ($ticket_form == 1) {
console.error(status, error); console.error(status, error);
} }
}); });
} }
//append the clients data to the modal //append the clients data to the modal
function appendClients(data) { function appendClients(data) {
$('#emp_client_data_list').empty(); $('#emp_client_data_list').empty();
$('#emp_client_data_list').append($('<option>', { $('#emp_client_data_list').append($('<option>', {
@ -311,10 +316,10 @@ if ($ticket_form == 1) {
$('#emp_client_data_list').append(option).select2(); $('#emp_client_data_list').append(option).select2();
}); });
} }
//append the clients branch data to the modal //append the clients branch data to the modal
function appendBranch(data) { function appendBranch(data) {
$('#emp_client_branch_data_list').empty(); $('#emp_client_branch_data_list').empty();
$('#emp_client_branch_data_list').append($('<option>', { $('#emp_client_branch_data_list').append($('<option>', {
@ -332,10 +337,10 @@ if ($ticket_form == 1) {
$('#emp_client_branch_data_list').append(option).select2(); $('#emp_client_branch_data_list').append(option).select2();
}); });
} }
//append the clients policy data to the modal //append the clients policy data to the modal
function appendPolicy(data) { function appendPolicy(data) {
$('#emp_client_policy_data_list').empty(); $('#emp_client_policy_data_list').empty();
@ -353,9 +358,9 @@ if ($ticket_form == 1) {
$('#emp_client_policy_data_list').append(option).select2(); $('#emp_client_policy_data_list').append(option).select2();
}); });
} }
function submitClaimForm(event, form) { function submitClaimForm(event, form) {
event.preventDefault(); event.preventDefault();
@ -398,9 +403,9 @@ if ($ticket_form == 1) {
$('.loader-mask').delay(350).fadeOut('slow'); $('.loader-mask').delay(350).fadeOut('slow');
} }
}); });
} }
function getEmpData(input) { function getEmpData(input) {
console.log(input) console.log(input)
let param = $(input).val(); let param = $(input).val();
@ -439,15 +444,15 @@ if ($ticket_form == 1) {
$('.loader').fadeOut(); $('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow'); $('.loader-mask').delay(350).fadeOut('slow');
}); });
} }
function getTheEmpDataForClaimSearchByMobile(input, searchType = null) { function getTheEmpDataForClaimSearchByMobile(input, searchType = null) {
console.log(input) console.log(input)
let type = $('#employee_data_points').val() let type = $('#employee_data_points').val()
let param = $('#emp_mobile_number_for_claim').val() let param = $('#emp_mobile_number_for_claim').val()
if(searchType == 'client'){ if (searchType == 'client') {
type = 'emp_code'; type = 'emp_code';
param = $(input).val(); param = $(input).val();
} }
@ -470,9 +475,9 @@ if ($ticket_form == 1) {
if (response.status) { if (response.status) {
console.log(response.message, 'SUCCESS'); console.log(response.message, 'SUCCESS');
if(searchType == 'client'){ if (searchType == 'client') {
appendMember(response.memberData, 'search_by_client_member'); appendMember(response.memberData, 'search_by_client_member');
}else{ } else {
appendMember(response.memberData, 'member_by_number'); appendMember(response.memberData, 'member_by_number');
} }
setClientAndInsurerData(response.data); setClientAndInsurerData(response.data);
@ -496,9 +501,9 @@ if ($ticket_form == 1) {
$('.loader').fadeOut(); $('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow'); $('.loader-mask').delay(350).fadeOut('slow');
}); });
} }
function appendEmployee(data, attrId) { function appendEmployee(data, attrId) {
console.log('data', data) console.log('data', data)
@ -518,9 +523,9 @@ if ($ticket_form == 1) {
$('#' + attrId).append(option).select2(); $('#' + attrId).append(option).select2();
}); });
} }
function appendMember(data, attrId) { function appendMember(data, attrId) {
console.log('data', data); console.log('data', data);
@ -561,9 +566,9 @@ if ($ticket_form == 1) {
// Reinitialize select2 // Reinitialize select2
$('#' + attrId).select2(); $('#' + attrId).select2();
} }
function appendACMS(data) { function appendACMS(data) {
console.log(data); console.log(data);
@ -583,16 +588,16 @@ if ($ticket_form == 1) {
$('#acm_id').append(option); $('#acm_id').append(option);
}); });
} }
function onlyNumbers(event) { function onlyNumbers(event) {
var charcode; var charcode;
charcode = event.which || event.keyCode; charcode = event.which || event.keyCode;
if (charcode >= 48 && charcode <= 57 || charcode == 46) return true; if (charcode >= 48 && charcode <= 57 || charcode == 46) return true;
return false; return false;
} }
function setClientAndInsurerData(data) { function setClientAndInsurerData(data) {
$('#insurer_id').val(data.insurer_id); $('#insurer_id').val(data.insurer_id);
$('#insurer_name').val(data.insurer_name); $('#insurer_name').val(data.insurer_name);
@ -606,9 +611,9 @@ if ($ticket_form == 1) {
$('#emp_name').val(data.emp_name); $('#emp_name').val(data.emp_name);
$('#emp_mobile').val(data.emp_mobile); $('#emp_mobile').val(data.emp_mobile);
$('#emp_mail').val(data.emp_email); $('#emp_mail').val(data.emp_email);
} }
function unSetClientAndInsurerData() { function unSetClientAndInsurerData() {
$('#insurer_id').val(""); $('#insurer_id').val("");
$('#insurer_name').val(""); $('#insurer_name').val("");
@ -622,9 +627,9 @@ if ($ticket_form == 1) {
$('#emp_name').val(""); $('#emp_name').val("");
$('#emp_mobile').val(""); $('#emp_mobile').val("");
$('#emp_mail').val(""); $('#emp_mail').val("");
} }
function setMemberData(input) { function setMemberData(input) {
var selectedOption = $(input).find(':selected'); var selectedOption = $(input).find(':selected');
@ -645,19 +650,19 @@ if ($ticket_form == 1) {
$(this).prop('selected', true); $(this).prop('selected', true);
} }
}); });
} }
$('#employee_data_points').on('change', function(){ $('#employee_data_points').on('change', function() {
let value = $(this).val() let value = $(this).val()
if(value == "mobile"){ if (value == "mobile") {
$('#employee_data_points_label').text('Employee Mobile Number') $('#employee_data_points_label').text('Employee Mobile Number')
}else{ } else {
$('#employee_data_points_label').text('Employee ID') $('#employee_data_points_label').text('Employee ID')
} }
}) })
function toResetTheModelFields() { function toResetTheModelFields() {
$('#emp_mobile_number_for_claim').val(''); $('#emp_mobile_number_for_claim').val('');
$('#employee_data_points').val(); $('#employee_data_points').val();
@ -668,6 +673,5 @@ if ($ticket_form == 1) {
$('#emp_client_policy_data_list').val('0').select2(); $('#emp_client_policy_data_list').val('0').select2();
$('#search_by_client_employee').val('0').select2(); $('#search_by_client_employee').val('0').select2();
$('#search_by_client_member').val('0').select2(); $('#search_by_client_member').val('0').select2();
} }
</script>
</script>

View File

@ -182,10 +182,10 @@ table.dataTable tbody td {
<select id="ticket_mail_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;"> <select id="ticket_mail_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;">
<option value="">PlaceHolders</option> <option value="">PlaceHolders</option>
<?php foreach ($placeHolders as $value): ?> <?php foreach ($placeHolders as $value): ?>
<?php if($value == 'member_name' || $value == 'member_mobile' || $value == 'nhance_logo' || $value == 'client_logo' || $value == 'app_link' || $value == 'client_name'){ ?>member_mobile <?php // if($value == 'member_name' || $value == 'member_mobile' || $value == 'nhance_logo' || $value == 'client_logo' || $value == 'app_link' || $value == 'client_name'){ ?>member_mobile
<?php $valueChange = str_replace('_', ' ', $value); $valueChange = ucwords($valueChange); ?> <?php $valueChange = str_replace('_', ' ', $value); $valueChange = ucwords($valueChange); ?>
<option value="[[<?php echo $value; ?>]]"><?php echo $valueChange; ?></option> <option value="[[<?php echo $value; ?>]]"><?php echo $valueChange; ?></option>
<?php } ?> <?php //} ?>
<?php endforeach; ?> <?php endforeach; ?>
</select> </select>
</div> </div>
@ -259,14 +259,52 @@ $(document).ready(function() {
const editor = Jodit.make("#ticket_mail_editor", editorConfig); const editor = Jodit.make("#ticket_mail_editor", editorConfig);
let lastActiveField = null;
// Track last active input field
$("#template_subject").on("focus", function() {
lastActiveField = this;
});
// Track Jodit editor focus separately
editor.events.on("focus", function() {
lastActiveField = editor;
});
document.addEventListener('change', function(event) { document.addEventListener('change', function(event) {
var target = event.target; var target = event.target;
if (target.matches('#ticket_mail_customButton')) if (target.matches('#ticket_mail_customButton')) {
{ let placeholderValue = $(target).val();
editor.selection.insertHTML($(target).val()); if (!placeholderValue) return;
if (lastActiveField) {
if (lastActiveField.id === "template_subject") {
insertAtCursor(lastActiveField, placeholderValue);
} else {
editor.selection.insertHTML(placeholderValue);
}
}
$(target).val(''); $(target).val('');
} }
}); });
function insertAtCursor(input, textToInsert) {
if (document.selection) {
input.focus();
var sel = document.selection.createRange();
sel.text = textToInsert;
} else if (input.selectionStart || input.selectionStart === 0) {
let startPos = input.selectionStart;
let endPos = input.selectionEnd;
input.value = input.value.substring(0, startPos) + textToInsert + input.value.substring(endPos, input.value.length);
input.selectionStart = input.selectionEnd = startPos + textToInsert.length;
} else {
input.value += textToInsert;
}
}
$('.close').click(function () { $('.close').click(function () {
$('#template_subject').val(''); $('#template_subject').val('');
$('#template_name').val(''); $('#template_name').val('');

View File

@ -7,11 +7,11 @@
<div class="form-row"> <div class="form-row">
<div class="form-group col-md-12"> <div class="form-group col-md-12">
<label for="ticket_note">Add Notes</label> <label for="ticket_note">Add Notes</label>
<textarea class="form-control" id="ticket_note" name="ticket_note" rows="3" <textarea class="form-control" id="ticket_note" name="note" rows="3"
placeholder="Enter Text"><?= isset($client['addon_subheading']) ? $client['addon_subheading'] : '' ?></textarea> placeholder="Enter Text"><?= isset($ticket_note['note']) ? $ticket_note['note'] : '' ?></textarea>
</div> </div>
</div> </div>
</div><input type="hidden" value=""> </div><input type="hidden" id="note_id">
<div class="form-group text-right m-b-0"> <div class="form-group text-right m-b-0">
<button type="submit" class="btn btn-primary" id="ticket_note_submit">Submit</button> <button type="submit" class="btn btn-primary" id="ticket_note_submit">Submit</button>
</div> </div>
@ -24,6 +24,28 @@
<script> <script>
$(document).ready(function() { $(document).ready(function() {
url = '<?= base_url('ticket/note/1')?>';
data = { id : $('#ticket_master_id').val()};
$.ajax({
url:url,
data:data,
type: 'POST',
success: function(res) {
if (res.status == true){
$('#ticket_note').val(res.data.note);
$('#note_id').val(res.data.id);
}
},
error: function (xhr, status, error) {
console.error(xhr.responseText);
console.error(status, error);
setTimeout(function() {
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
toastr.warning('Something Went Wrong!', 'warning');
}, 1000);
}
})
$("#ticket_note_form").submit(function(event) { $("#ticket_note_form").submit(function(event) {
@ -31,13 +53,23 @@ $(document).ready(function() {
$('.loader').fadeIn(); $('.loader').fadeIn();
$('.loader-mask').fadeIn(); $('.loader-mask').fadeIn();
var url = '<?= base_url("/ticket/note"); ?>'; var url = '<?= base_url("/ticket/note/2"); ?>';
var formData = new FormData($('#ticket_note_form')[0]); var formData = $(this).serializeArray();
var ticket_id = $('#ticket_master_id').val();
if (ticket_id != null && ticket_id != ''){
formData.push({ name: 'ticket_id', value: ticket_id});
}
var primary_key = $('#note_id').val();
if (primary_key != null && primary_key != ''){
formData.push({ name: 'id', value: primary_key});
}
console.log(formData);
sendAjaxRequestForGlobal(url, 'POST', formData, function(response) { sendAjaxRequestForGlobal(url, 'POST', formData, function(response) {
if (response.status == true) { if (response.status == true) {
$('.loader').fadeOut(); $('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow'); $('.loader-mask').delay(350).fadeOut('slow');
toastr.success('Note Added Successfully','Success');
} else { } else {
$('.loader').fadeOut(); $('.loader').fadeOut();

View File

@ -7,28 +7,39 @@
<!-- Email To Field --> <!-- Email To Field -->
<div class="form-group col-md-4"> <div class="form-group col-md-4">
<label for="emp_mail_for_to">To</label> <label for="emp_mail_for_to">To</label>
<input type="text" class="form-control" id="emp_mail_for_to" name="emp_mail_for_to" placeholder="Recipient email"> <input type="text" value="<?= isset($reply_data['emp_mail'])?$reply_data['emp_mail']:'' ?>" class="form-control" id="emp_mail_for_to" name="emp_mail" placeholder="Recipient email" readonly>
</div> </div>
<!-- Subject Field --> <!-- Subject Field -->
<div class="form-group col-md-4"> <div class="form-group col-md-4">
<label for="mail_subject">Subject</label> <label for="mail_subject">Subject</label>
<input type="text" class="form-control" id="mail_subject" name="mail_subject" placeholder="Mail subject"> <input type="text" class="form-control" value="<?= isset($reply_data['subject'])?$reply_data['subject']:'' ?>" id="mail_subject" name="mail_subject" placeholder="Mail subject">
</div> </div>
<!-- Mail Content Field --> <!-- Mail Content Field -->
<div class="form-group col-md-12"> <div class="form-group col-md-12">
<label for="mail_content">Mail Content</label> <!-- <textarea class="form-control" rows="5" placeholder="Enter Mail Content"></textarea> -->
<textarea class="form-control" id="mail_content" name="mail_content" rows="3" placeholder="Enter mail content"> <div class="form-row" id="rac_rate_dropdown">
<?= isset($client['addon_subheading']) ? $client['addon_subheading'] : '' ?> <div class="form-group col-md-12">
</textarea> <select id="ticket_mail_customButton" class="form-control" style="border:none;right: 6px;width: auto;position: absolute;z-index: 1;top: 17px;height: 32px;float: right;">
<option value="">PlaceHolders</option>
<?php foreach ($placeHolders as $value): ?>
<!-- <?php // if($value == 'member_name' || $value == 'member_mobile' || $value == 'nhance_logo' || $value == 'client_logo' || $value == 'app_link' || $value == 'client_name'){ ?>member_mobile -->
<?php $valueChange = str_replace('_', ' ', $value); $valueChange = ucwords($valueChange); ?>
<option value="[[<?php echo $value; ?>]]"><?php echo $valueChange; ?></option>
<?php //} ?>
<?php endforeach; ?>
</select>
</div>
</div>
<div id="ticket_mail_editor" name="content" style="height: 300px;"></div>
</div> </div>
</div> </div>
</div> </div>
<!-- Submit Button --> <!-- Submit Button -->
<div class="form-group text-right"> <div class="form-group text-right">
<button type="submit" class="btn btn-primary" id="ticket_reply_submit">Submit</button> <button type="submit" class="btn btn-primary" id="ticket_reply_submit">Send Mail</button>
</div> </div>
</form> </form>
</div> </div>
@ -37,31 +48,138 @@
<script> <script>
$(document).ready(function() { $(document).ready(function() {
var toolbar = "bold,italic,strikethrough,|,superscript,subscript,|,align,";
const editorConfig = {
buttons: toolbar.concat(['fontsize']),
fontsize: [8, 10, 12, 14, 16, 18, 20, 22, 24], // Customize font sizes
showPlaceholder: false,
toolbarButtonSize: 'small',
toolbarAdaptive: false,
saveHeightInStorage: true,
minHeight: 400,
extraButtons: [
{
name: 'info',
iconURL: '<?= base_url()."public"; ?>/assets/images/image-solid.svg', // Replace with the actual icon URL
exec: function (editor) {
const fileInput = document.getElementById("Question_title_fileInput");
fileInput.click();
},
},
],
};
const editor = Jodit.make("#ticket_mail_editor", editorConfig);
var mail_content = '<?=isset($reply_data['mail_content'])?$reply_data['mail_content']:'' ?>';
$('.jodit-wysiwyg').html(mail_content);
let lastActiveField = null;
// Track last active input field
$("#mail_subject").on("focus", function() {
lastActiveField = this;
});
// Track Jodit editor focus separately
editor.events.on("focus", function() {
lastActiveField = editor;
});
document.addEventListener('change', function(event) {
var target = event.target;
if (target.matches('#ticket_mail_customButton')) {
let placeholderValue = $(target).val();
if (!placeholderValue) return;
if (lastActiveField) {
if (lastActiveField.id === "mail_subject") {
insertAtCursor(lastActiveField, placeholderValue);
} else {
editor.selection.insertHTML(placeholderValue);
}
}
$(target).val('');
}
});
function insertAtCursor(input, textToInsert) {
if (document.selection) {
input.focus();
var sel = document.selection.createRange();
sel.text = textToInsert;
} else if (input.selectionStart || input.selectionStart === 0) {
let startPos = input.selectionStart;
let endPos = input.selectionEnd;
input.value = input.value.substring(0, startPos) + textToInsert + input.value.substring(endPos, input.value.length);
input.selectionStart = input.selectionEnd = startPos + textToInsert.length;
} else {
input.value += textToInsert;
}
}
$("#ticket_reply_form").submit(function(event) { $("#ticket_reply_form").submit(function(event) {
event.preventDefault(); event.preventDefault();
var joditEditor = editor;
// Show loaders if (joditEditor)
$('.loader, .loader-mask').fadeIn(); {
var mailContent = $(joditEditor.currentPlace.container).find('.jodit-wysiwyg').html();
var url = '<?= base_url("/ticket/reply"); ?>'; var formData = $(this).serializeArray();
var formData = new FormData(this); formData.push({ name: 'mail_content', value: mailContent });
// formData.push({ name: 'client_id', value: $('#general_PrimaryKey').val() });
// Send AJAX request // var isAutoMailEnabled = $('#statusSwitch').is(':checked') ? 1 : 0;
sendAjaxRequestForGlobal(url, 'POST', formData, function(response) { // formData.push({ name: 'is_auto_mail', value: isAutoMailEnabled });
$('.loader, .loader-mask').fadeOut(); var ticket_id = $('#ticket_master_id').val();
if (ticket_id != null && ticket_id != ''){
if (response.status) { formData.push({ name: 'ticket_id', value: ticket_id});
toastr.success('Mail sent successfully.', 'Success'); }
} else { // console.log(formData);
toastr.error(response.message || 'Failed to send mail.', 'Error'); $('.loader').fadeIn();
$('.loader-mask').fadeIn();
var form_action = '<?= base_url("/ticket/reply"); ?>';
$.ajax({
url: form_action,
type: "POST",
data: formData,
dataType: 'json',
success: function(res)
{
if(res.status == true){
// $('#new_mail_template').find('.close').click();
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
toastr.success('Message Sent successfully!', 'Success');
reloadTicket_conversation();
}else if (res.status == false){
toastr.error('Failed to Send Message', 'error');
} }
}, function(xhr, status, error) {
console.error('Error:', error);
console.error('Response:', xhr.responseText);
$('.loader, .loader-mask').fadeOut(); },
toastr.error('An error occurred while processing the request.', 'Error'); error: function (xhr, status, error)
{
console.error(xhr.responseText);
console.error(status, error);
setTimeout(function()
{
$('.loader').fadeOut();
$('.loader-mask').delay(350).fadeOut('slow');
toastr.error('Something Wrong!', 'warning');
}, 1000);
}
}); });
}
else
{
console.error("Jodit editor instance is not defined.");
}
}); });
}); });
</script> </script>
<script>
function reloadTicket_conversation() {
$("#ticket_messages_div").load(location.href + " #ticket_messages_div");
}
</script>