From 44cded581ad4ecc3a88701cdfa81f60db0bc3630 Mon Sep 17 00:00:00 2001 From: Focuslinkstech <45756999+Focuslinkstech@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:52:52 +0100 Subject: [PATCH] Enhancement in bulk SMS/WA message Enhancement in SMS/WA message sending --- system/controllers/message.php | 230 ++++++++++++++++++--------------- ui/ui/message-bulk.tpl | 85 +++++++++++- 2 files changed, 207 insertions(+), 108 deletions(-) diff --git a/system/controllers/message.php b/system/controllers/message.php index 9da65ba6..a4a1a197 100644 --- a/system/controllers/message.php +++ b/system/controllers/message.php @@ -95,124 +95,144 @@ EOT; if (!in_array($admin['user_type'], ['SuperAdmin', 'Admin', 'Agent', 'Sales'])) { _alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard"); } - $ui->display('message-bulk.tpl'); - break; - case 'send_bulk-post': - // Check user permissions - if (!in_array($admin['user_type'], ['SuperAdmin', 'Admin', 'Agent', 'Sales'])) { - _alert(Lang::T('You do not have permission to access this page'), 'danger', "dashboard"); - } // Get form data $group = $_POST['group']; $message = $_POST['message']; $via = $_POST['via']; + $test = isset($_POST['test']) && $_POST['test'] === 'on' ? 'yes' : 'no'; + $batch = $_POST['batch']; + $delay = $_POST['delay']; // Initialize counters - $successCount = 0; - $failCount = 0; - $successMessages = []; - $failMessages = []; + $totalSMSSent = 0; + $totalSMSFailed = 0; + $totalWhatsappSent = 0; + $totalWhatsappFailed = 0; + $batchStatus = []; - // Check if fields are empty - if ($group == '' or $message == '' or $via == '') { - r2(U . 'message/send_bulk', 'e', Lang::T('All fields are required')); - } else { - // Get customer details from the database based on the selected group - if ($group == 'all') { - $customers = ORM::for_table('tbl_customers')->find_many(); - } elseif ($group == 'new') { - // Get customers created just a month ago - $customers = ORM::for_table('tbl_customers')->where_raw("DATE(created_at) >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)")->find_many(); - } elseif ($group == 'expired') { - // Get expired user recharges where status is 'off' - $expired = ORM::for_table('tbl_user_recharges')->where('status', 'off')->find_many(); - $customer_ids = []; - foreach ($expired as $recharge) { - $customer_ids[] = $recharge->customer_id; - } - $customers = ORM::for_table('tbl_customers')->where_in('id', $customer_ids)->find_many(); - } elseif ($group == 'active') { - // Get active user recharges where status is 'on' - $active = ORM::for_table('tbl_user_recharges')->where('status', 'on')->find_many(); - $customer_ids = []; - foreach ($active as $recharge) { - $customer_ids[] = $recharge->customer_id; - } - $customers = ORM::for_table('tbl_customers')->where_in('id', $customer_ids)->find_many(); - } - - // Loop through customers and send messages - foreach ($customers as $customer) { - // Create a copy of the original message for each customer and save it as currentMessage - $currentMessage = $message; - - // Replace placeholders in the message with actual values for each customer - $currentMessage = str_replace('[[name]]', $customer['fullname'], $currentMessage); - $currentMessage = str_replace('[[user_name]]', $customer['username'], $currentMessage); - $currentMessage = str_replace('[[phone]]', $customer['phonenumber'], $currentMessage); - $currentMessage = str_replace('[[company_name]]', $config['CompanyName'], $currentMessage); - - // Send the message based on the selected method - if ($via == 'sms' || $via == 'both') { - $smsSent = Message::sendSMS($customer['phonenumber'], $currentMessage); - if ($smsSent) { - $successCount++; - $successMessages[] = "SMS sent to {$customer['fullname']}: {$customer['phonenumber']}"; - } else { - $failCount++; - $failMessages[] = "Failed to send SMS to {$customer['fullname']}: {$customer['phonenumber']}"; - } - // Introduce a delay of 5 seconds between each SMS - sleep(5); - } - - if ($via == 'wa' || $via == 'both') { - $waSent = Message::sendWhatsapp($customer['phonenumber'], $currentMessage); - if ($waSent) { - $successCount++; - $successMessages[] = "WhatsApp message sent to {$customer['fullname']}: {$customer['phonenumber']}"; - } else { - $failCount++; - $failMessages[] = "Failed to send WhatsApp message to {$customer['fullname']}: {$customer['phonenumber']}"; - } - // Introduce a delay of 5 seconds between each WhatsApp message - sleep(5); - } - } - - $responseMessage = ''; - - if ($successCount > 0) { - $responseMessage .= "Messages Sent Successfully: {$successCount}
"; - $responseMessage .= ""; - } - - if ($failCount > 0) { - $responseMessage .= "Failed to send messages: {$failCount}
"; - $responseMessage .= ""; - } - - if ($responseMessage != '') { - r2(U . 'message/send_bulk', 's', $responseMessage); + if (_req('send') == 'now') { + // Check if fields are empty + if ($group == '' || $message == '' || $via == '') { + r2(U . 'message/send_bulk', 'e', Lang::T('All fields are required')); } else { - r2(U . 'message/send_bulk', 'e', Lang::T('No messages sent')); + // Get customer details from the database based on the selected group + if ($group == 'all') { + $customers = ORM::for_table('tbl_customers')->find_many()->as_array(); + } elseif ($group == 'new') { + // Get customers created just a month ago + $customers = ORM::for_table('tbl_customers')->where_raw("DATE(created_at) >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)")->find_many()->as_array(); + } elseif ($group == 'expired') { + // Get expired user recharges where status is 'off' + $expired = ORM::for_table('tbl_user_recharges')->where('status', 'off')->find_many(); + $customer_ids = []; + foreach ($expired as $recharge) { + $customer_ids[] = $recharge->customer_id; + } + $customers = ORM::for_table('tbl_customers')->where_in('id', $customer_ids)->find_many()->as_array(); + } elseif ($group == 'active') { + // Get active user recharges where status is 'on' + $active = ORM::for_table('tbl_user_recharges')->where('status', 'on')->find_many(); + $customer_ids = []; + foreach ($active as $recharge) { + $customer_ids[] = $recharge->customer_id; + } + $customers = ORM::for_table('tbl_customers')->where_in('id', $customer_ids)->find_many()->as_array(); + } + + // Set the batch size + $batchSize = $batch; + + // Calculate the number of batches + $totalCustomers = count($customers); + $totalBatches = ceil($totalCustomers / $batchSize); + + // Loop through batches + for ($batchIndex = 0; $batchIndex < $totalBatches; $batchIndex++) { + // Get the starting and ending index for the current batch + $start = $batchIndex * $batchSize; + $end = min(($batchIndex + 1) * $batchSize, $totalCustomers); + $batchCustomers = array_slice($customers, $start, $end - $start); + + // Loop through customers in the current batch and send messages + foreach ($batchCustomers as $customer) { + // Create a copy of the original message for each customer and save it as currentMessage + $currentMessage = $message; + $currentMessage = str_replace('[[name]]', $customer['fullname'], $currentMessage); + $currentMessage = str_replace('[[user_name]]', $customer['username'], $currentMessage); + $currentMessage = str_replace('[[phone]]', $customer['phonenumber'], $currentMessage); + $currentMessage = str_replace('[[company_name]]', $config['CompanyName'], $currentMessage); + + // Send the message based on the selected method + if ($test === 'yes') { + // Only for testing, do not send messages to customers + $batchStatus[] = [ + 'name' => $customer['fullname'], + 'phone' => $customer['phonenumber'], + 'message' => $currentMessage, + 'status' => 'Test Mode - Message not sent' + ]; + } else { + // Send the actual messages + if ($via == 'sms' || $via == 'both') { + $smsSent = Message::sendSMS($customer['phonenumber'], $currentMessage); + if ($smsSent) { + $totalSMSSent++; + $batchStatus[] = [ + 'name' => $customer['fullname'], + 'phone' => $customer['phonenumber'], + 'message' => $currentMessage, + 'status' => 'SMS Message Sent' + ]; + } else { + $totalSMSFailed++; + $batchStatus[] = [ + 'name' => $customer['fullname'], + 'phone' => $customer['phonenumber'], + 'message' => $currentMessage, + 'status' => 'SMS Message Failed' + ]; + } + } + + if ($via == 'wa' || $via == 'both') { + $waSent = Message::sendWhatsapp($customer['phonenumber'], $currentMessage); + if ($waSent) { + $totalWhatsappSent++; + $batchStatus[] = [ + 'name' => $customer['fullname'], + 'phone' => $customer['phonenumber'], + 'message' => $currentMessage, + 'status' => 'WhatsApp Message Sent' + ]; + } else { + $totalWhatsappFailed++; + $batchStatus[] = [ + 'name' => $customer['fullname'], + 'phone' => $customer['phonenumber'], + 'message' => $currentMessage, + 'status' => 'WhatsApp Message Failed' + ]; + } + } + } + } + + // Introduce a delay between each batch + if ($batchIndex < $totalBatches - 1) { + sleep($delay); + } + } } } - + $ui->assign('batchStatus', $batchStatus); + $ui->assign('totalSMSSent', $totalSMSSent); + $ui->assign('totalSMSFailed', $totalSMSFailed); + $ui->assign('totalWhatsappSent', $totalWhatsappSent); + $ui->assign('totalWhatsappFailed', $totalWhatsappFailed); + $ui->display('message-bulk.tpl'); break; - - - default: r2(U . 'message/send_sms', 'e', 'action not defined'); } diff --git a/ui/ui/message-bulk.tpl b/ui/ui/message-bulk.tpl index 7d1248ac..e28230ce 100644 --- a/ui/ui/message-bulk.tpl +++ b/ui/ui/message-bulk.tpl @@ -1,11 +1,13 @@ {include file="sections/header.tpl"} + +
{Lang::T('Send Bulk Message')}
-
+
@@ -27,11 +29,39 @@
+
+ +
+ {Lang::T('Use 20 and above if you are sending to all customers to avoid server time out')} +
+
+
+ +
+ {Lang::T('Use at least 5 secs if you are sending to all customers to avoid being banned by your message provider')} +
+
+ {Lang::T('Testing [if checked no real message is sent]')}

{Lang::T('Use placeholders:')} @@ -45,10 +75,10 @@ [[company_name]] - {Lang::T('Your Company Name')}

-
- + {Lang::T('Cancel')}
@@ -59,5 +89,54 @@
+{if $batchStatus} +

Total SMS Sent: {$totalSMSSent} Total SMS + Failed: {$totalSMSFailed} Total WhatsApp Sent: + {$totalWhatsappSent} Total WhatsApp Failed: + {$totalWhatsappFailed}

+{/if} +
+
+

Message Results

+
+ +
+ + + + + + + + + + + {foreach $batchStatus as $customer} + + + + + + + {/foreach} + +
NamePhoneMessageStatus
{$customer.name}{$customer.phone}{$customer.message}{$customer.status}
+
+ +
+ + + + + + + + {include file="sections/footer.tpl"} \ No newline at end of file