feat: add subject field for messages and implement validation based on selected channel
This commit is contained in:
parent
1740c568f9
commit
1cc7057dca
@ -57,56 +57,79 @@ EOT;
|
|||||||
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
|
_alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get form data
|
$id_customer = $_POST['id_customer'] ?? '';
|
||||||
$id_customer = $_POST['id_customer'];
|
$message = $_POST['message']?? '';
|
||||||
$message = $_POST['message'];
|
$via = $_POST['via'] ?? '';
|
||||||
$via = $_POST['via'];
|
$subject = $_POST['subject'] ?? '';
|
||||||
|
|
||||||
// Check if fields are empty
|
// Validate subject based on the selected channel
|
||||||
if ($id_customer == '' or $message == '' or $via == '') {
|
if (($via === 'all' || $via === 'email' || $via === 'inbox') && empty($subject)) {
|
||||||
r2(getUrl('message/send'), 'e', Lang::T('All field is required'));
|
r2(getUrl('message/send'), 'e', LANG::T('Subject is required to send message using') . ' ' . $via . '.');
|
||||||
} else {
|
}
|
||||||
// Get customer details from the database
|
|
||||||
$c = ORM::for_table('tbl_customers')->find_one($id_customer);
|
if (empty($id_customer) || empty($message) || empty($via)) {
|
||||||
|
r2(getUrl('message/send'), 'e', Lang::T('Customer, Message, and Channel are required'));
|
||||||
|
}
|
||||||
|
|
||||||
|
$customer = ORM::for_table('tbl_customers')->find_one($id_customer);
|
||||||
|
if (!$customer) {
|
||||||
|
r2(getUrl('message/send'), 'e', Lang::T('Customer not found'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace placeholders in message and subject
|
||||||
|
$currentMessage = str_replace(
|
||||||
|
['[[name]]', '[[user_name]]', '[[phone]]', '[[company_name]]'],
|
||||||
|
[$customer['fullname'], $customer['username'], $customer['phonenumber'], $config['CompanyName']],
|
||||||
|
$message
|
||||||
|
);
|
||||||
|
|
||||||
|
$currentSubject = str_replace(
|
||||||
|
['[[name]]', '[[user_name]]', '[[phone]]', '[[company_name]]'],
|
||||||
|
[$customer['fullname'], $customer['username'], $customer['phonenumber'], $config['CompanyName']],
|
||||||
|
$subject
|
||||||
|
);
|
||||||
|
|
||||||
// Replace placeholders in the message with actual values
|
|
||||||
$message = str_replace('[[name]]', $c['fullname'], $message);
|
|
||||||
$message = str_replace('[[user_name]]', $c['username'], $message);
|
|
||||||
$message = str_replace('[[phone]]', $c['phonenumber'], $message);
|
|
||||||
$message = str_replace('[[company_name]]', $config['CompanyName'], $message);
|
|
||||||
if (strpos($message, '[[payment_link]]') !== false) {
|
if (strpos($message, '[[payment_link]]') !== false) {
|
||||||
// token only valid for 1 day, for security reason
|
$token = User::generateToken($customer['id'], 1);
|
||||||
$token = User::generateToken($c['id'], 1);
|
|
||||||
if (!empty($token['token'])) {
|
if (!empty($token['token'])) {
|
||||||
$tur = ORM::for_table('tbl_user_recharges')
|
$tur = ORM::for_table('tbl_user_recharges')
|
||||||
->where('customer_id', $c['id'])
|
->where('customer_id', $customer['id'])
|
||||||
//->where('namebp', $package)
|
|
||||||
->find_one();
|
->find_one();
|
||||||
if ($tur) {
|
if ($tur) {
|
||||||
$url = '?_route=home&recharge=' . $tur['id'] . '&uid=' . urlencode($token['token']);
|
$url = '?_route=home&recharge=' . $tur['id'] . '&uid=' . urlencode($token['token']);
|
||||||
$message = str_replace('[[payment_link]]', $url, $message);
|
$currentMessage = str_replace('[[payment_link]]', $url, $currentMessage);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$message = str_replace('[[payment_link]]', '', $message);
|
$currentMessage = str_replace('[[payment_link]]', '', $currentMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Send the message through the selected channels
|
||||||
|
$smsSent = $waSent = $emailSent = $inboxSent = false;
|
||||||
|
|
||||||
//Send the message
|
if ($via === 'sms' || $via === 'both' || $via === 'all') {
|
||||||
if ($via == 'sms' || $via == 'both') {
|
$smsSent = Message::sendSMS($customer['phonenumber'], $currentSubject);
|
||||||
$smsSent = Message::sendSMS($c['phonenumber'], $message);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($via == 'wa' || $via == 'both') {
|
if ($via === 'wa' || $via === 'both' || $via === 'all') {
|
||||||
$waSent = Message::sendWhatsapp($c['phonenumber'], $message);
|
$waSent = Message::sendWhatsapp($customer['phonenumber'], $currentSubject);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($smsSent) || isset($waSent)) {
|
if ($via === 'email' || $via === 'all') {
|
||||||
|
$emailSent = Message::sendEmail($customer['email'], $currentSubject, $currentMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($via === 'inbox' || $via === 'all') {
|
||||||
|
$inboxSent = Message::addToInbox($customer['id'], $currentSubject, $currentMessage, 'Admin');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if any message was sent successfully
|
||||||
|
if ($smsSent || $waSent || $emailSent || $inboxSent) {
|
||||||
r2(getUrl('message/send'), 's', Lang::T('Message Sent Successfully'));
|
r2(getUrl('message/send'), 's', Lang::T('Message Sent Successfully'));
|
||||||
} else {
|
} else {
|
||||||
r2(getUrl('message/send'), 'e', Lang::T('Failed to send message'));
|
r2(getUrl('message/send'), 'e', Lang::T('Failed to send message'));
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'send_bulk':
|
case 'send_bulk':
|
||||||
@ -405,16 +428,20 @@ EOT;
|
|||||||
// Get the posted data
|
// Get the posted data
|
||||||
$customerIds = $_POST['customer_ids'] ?? [];
|
$customerIds = $_POST['customer_ids'] ?? [];
|
||||||
$via = $_POST['message_type'] ?? '';
|
$via = $_POST['message_type'] ?? '';
|
||||||
|
$subject = $_POST['subject'] ?? '';
|
||||||
$message = isset($_POST['message']) ? trim($_POST['message']) : '';
|
$message = isset($_POST['message']) ? trim($_POST['message']) : '';
|
||||||
if (empty($customerIds) || empty($message) || empty($via)) {
|
if (empty($customerIds) || empty($message) || empty($via)) {
|
||||||
echo json_encode(['status' => 'error', 'message' => Lang::T('Invalid customer IDs, Message, or Message Type.')]);
|
echo json_encode(['status' => 'error', 'message' => Lang::T('Invalid customer IDs, Message, or Message Type.')]);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($via === 'all' || $via === 'email' || $via === 'inbox' && empty($subject)) {
|
||||||
|
die(json_encode(['status' => 'error', 'message' => LANG::T('Subject is required to send message using') . ' ' . $via . '.']));
|
||||||
|
}
|
||||||
|
|
||||||
// Prepare to send messages
|
// Prepare to send messages
|
||||||
$sentCount = 0;
|
$sentCount = 0;
|
||||||
$failedCount = 0;
|
$failedCount = 0;
|
||||||
$subject = Lang::T('Notification Message');
|
|
||||||
$form = 'Admin';
|
$form = 'Admin';
|
||||||
|
|
||||||
foreach ($customerIds as $customerId) {
|
foreach ($customerIds as $customerId) {
|
||||||
|
@ -18,9 +18,9 @@
|
|||||||
{if in_array($_admin['user_type'],['SuperAdmin','Admin'])}
|
{if in_array($_admin['user_type'],['SuperAdmin','Admin'])}
|
||||||
<div class="btn-group pull-right">
|
<div class="btn-group pull-right">
|
||||||
<a class="btn btn-primary btn-xs" title="save"
|
<a class="btn btn-primary btn-xs" title="save"
|
||||||
href="{Text::url('customers/csv&token=', $csrf_token)}"
|
href="{Text::url('customers/csv&token=', $csrf_token)}" onclick="return ask(this, '{Lang::T("
|
||||||
onclick="return ask(this, '{Lang::T("This will export to CSV")}?')"><span
|
This will export to CSV")}?')"><span class="glyphicon glyphicon-download"
|
||||||
class="glyphicon glyphicon-download" aria-hidden="true"></span> CSV</a>
|
aria-hidden="true"></span> CSV</a>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
{Lang::T('Manage Contact')}
|
{Lang::T('Manage Contact')}
|
||||||
@ -205,14 +205,15 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<select id="messageType" class="form-control">
|
<select style="margin-bottom: 10px;" id="messageType" class="form-control">
|
||||||
<option value="all">{Lang::T('All')}</option>
|
<option value="all">{Lang::T('All')}</option>
|
||||||
<option value="email">{Lang::T('Email')}</option>
|
<option value="email">{Lang::T('Email')}</option>
|
||||||
<option value="inbox">{Lang::T('Inbox')}</option>
|
<option value="inbox">{Lang::T('Inbox')}</option>
|
||||||
<option value="sms">{Lang::T('SMS')}</option>
|
<option value="sms">{Lang::T('SMS')}</option>
|
||||||
<option value="wa">{Lang::T('WhatsApp')}</option>
|
<option value="wa">{Lang::T('WhatsApp')}</option>
|
||||||
</select>
|
</select>
|
||||||
<br>
|
<input type="text" style="margin-bottom: 10px;" class="form-control" id="subject-content" value=""
|
||||||
|
placeholder="{Lang::T('Enter message subject here')}">
|
||||||
<textarea id="messageContent" class="form-control" rows="4"
|
<textarea id="messageContent" class="form-control" rows="4"
|
||||||
placeholder="{Lang::T('Enter your message here...')}"></textarea>
|
placeholder="{Lang::T('Enter your message here...')}"></textarea>
|
||||||
</div>
|
</div>
|
||||||
@ -260,6 +261,8 @@
|
|||||||
$('#sendMessageButton').on('click', function () {
|
$('#sendMessageButton').on('click', function () {
|
||||||
const message = $('#messageContent').val().trim();
|
const message = $('#messageContent').val().trim();
|
||||||
const messageType = $('#messageType').val();
|
const messageType = $('#messageType').val();
|
||||||
|
const subject = $('#subject-content').val().trim();
|
||||||
|
|
||||||
|
|
||||||
if (!message) {
|
if (!message) {
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
@ -332,4 +335,31 @@
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
<script>
|
||||||
|
document.getElementById('messageType').addEventListener('change', function () {
|
||||||
|
const messageType = this.value;
|
||||||
|
const subjectField = document.getElementById('subject-content');
|
||||||
|
|
||||||
|
subjectField.style.display = (messageType === 'all' || messageType === 'email' || messageType === 'inbox') ? 'block' : 'none';
|
||||||
|
|
||||||
|
switch (messageType) {
|
||||||
|
case 'all':
|
||||||
|
subjectField.placeholder = 'Enter a subject for all channels';
|
||||||
|
subjectField.required = true;
|
||||||
|
break;
|
||||||
|
case 'email':
|
||||||
|
subjectField.placeholder = 'Enter a subject for email';
|
||||||
|
subjectField.required = true;
|
||||||
|
break;
|
||||||
|
case 'inbox':
|
||||||
|
subjectField.placeholder = 'Enter a subject for inbox';
|
||||||
|
subjectField.required = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
subjectField.placeholder = 'Enter message subject here';
|
||||||
|
subjectField.required = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
{include file = "sections/footer.tpl" }
|
{include file = "sections/footer.tpl" }
|
@ -23,11 +23,25 @@
|
|||||||
<label class="col-md-2 control-label">{Lang::T('Send Via')}</label>
|
<label class="col-md-2 control-label">{Lang::T('Send Via')}</label>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<select class="form-control" name="via" id="via">
|
<select class="form-control" name="via" id="via">
|
||||||
<option value="sms" selected> {Lang::T('via SMS')}</option>
|
<option value="all" {if $via=='all' }selected{/if}>{Lang::T('All Channels')}</option>
|
||||||
<option value="wa"> {Lang::T('Via WhatsApp')}</option>
|
<option value="inbox" {if $via=='inbox' }selected{/if}>{Lang::T('Inbox')}</option>
|
||||||
<option value="both"> {Lang::T('Via WhatsApp and SMS')}</option>
|
<option value="email" {if $via=='email' }selected{/if}>{Lang::T('Email')}</option>
|
||||||
|
<option value="sms" {if $via=='sms' }selected{/if}>{Lang::T('SMS')}</option>
|
||||||
|
<option value="wa" {if $via=='wa' }selected{/if}>{Lang::T('WhatsApp')}</option>
|
||||||
|
<option value="both" {if $via=='both' }selected{/if}>{Lang::T('SMS and WhatsApp')}
|
||||||
|
</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group" id="subject">
|
||||||
|
<label class="col-md-2 control-label">{Lang::T('Subject')}</label>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<input type="text" class="form-control" name="subject" id="subject-content" value=""
|
||||||
|
placeholder="{Lang::T('Enter message subject here')}">
|
||||||
|
</div>
|
||||||
|
<p class="help-block col-md-4">
|
||||||
|
{Lang::T('You can also use the below placeholders here too')}.
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-md-2 control-label">{Lang::T('Message')}</label>
|
<label class="col-md-2 control-label">{Lang::T('Message')}</label>
|
||||||
@ -64,6 +78,33 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<script>
|
||||||
|
document.getElementById('via').addEventListener('change', function () {
|
||||||
|
const via = this.value;
|
||||||
|
const subject = document.getElementById('subject');
|
||||||
|
const subjectField = document.getElementById('subject-content');
|
||||||
|
|
||||||
|
subject.style.display = (via === 'all' || via === 'email' || via === 'inbox') ? 'block' : 'none';
|
||||||
|
|
||||||
|
switch (via) {
|
||||||
|
case 'all':
|
||||||
|
subjectField.placeholder = 'Enter a subject for all channels';
|
||||||
|
subjectField.required = true;
|
||||||
|
break;
|
||||||
|
case 'email':
|
||||||
|
subjectField.placeholder = 'Enter a subject for email';
|
||||||
|
subjectField.required = true;
|
||||||
|
break;
|
||||||
|
case 'inbox':
|
||||||
|
subjectField.placeholder = 'Enter a subject for inbox';
|
||||||
|
subjectField.required = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
subjectField.placeholder = 'Enter message subject here';
|
||||||
|
subjectField.required = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
{include file="sections/footer.tpl"}
|
{include file="sections/footer.tpl"}
|
Loading…
x
Reference in New Issue
Block a user