hubtel_sms/controllers/Hubtel_sms.php
2025-01-14 00:21:05 +00:00

431 lines
13 KiB
PHP

<?php
defined('BASEPATH') or exit('No direct script access allowed');
class Hubtel_sms extends AdminController
{
public function __construct()
{
parent::__construct();
$this->load->helper('hubtel_sms/hubtel_sms');
$this->load->model('hubtel_sms_model');
$this->load->library('hubtel_sms/hubtel_api');
}
public function index()
{
if (!has_permission('hubtel_sms', '', 'view')) {
access_denied('Hubtel SMS');
}
if (!is_hubtel_sms_enabled()) {
set_alert('warning', _l('hubtel_sms_module_disabled'));
redirect(admin_url());
}
$data['title'] = _l('hubtel_sms');
// Get statistics
$data['total_messages'] = $this->hubtel_sms_model->get_total_messages();
$data['sent_messages'] = $this->hubtel_sms_model->get_total_messages('sent');
$data['failed_messages'] = $this->hubtel_sms_model->get_total_messages('failed');
$data['total_cost'] = $this->hubtel_sms_model->get_total_cost();
// Get messages and templates
$data['messages'] = $this->hubtel_sms_model->get_messages();
$data['templates'] = $this->hubtel_sms_model->get_templates();
// Load client groups for bulk SMS
$this->load->model('client_groups_model');
$data['client_groups'] = $this->client_groups_model->get_groups();
$this->load->view('hubtel_sms/manage', $data);
}
public function send_sms()
{
if (!has_permission('hubtel_sms', '', 'create')) {
access_denied('Send SMS');
}
if ($this->input->post()) {
$response = $this->hubtel_sms_model->send_sms(
$this->input->post('to'),
$this->input->post('message'),
$this->input->post('template_id')
);
if ($response['success']) {
set_alert('success', _l('sms_sent_successfully'));
} else {
set_alert('danger', $response['message']);
}
}
redirect(admin_url('hubtel_sms'));
}
public function send_bulk_sms()
{
if (!has_permission('hubtel_sms', '', 'create')) {
access_denied('Send Bulk SMS');
}
if ($this->input->post()) {
$client_groups = $this->input->post('client_groups');
$message = $this->input->post('message');
$template_id = $this->input->post('template_id');
$success = 0;
$failed = 0;
$total_recipients = 0;
if (!empty($client_groups)) {
$this->load->model('clients_model');
foreach ($client_groups as $group_id) {
$clients = $this->clients_model->get_clients_by_group($group_id);
foreach ($clients as $client) {
if (!empty($client['phonenumber'])) {
$total_recipients++;
$response = $this->hubtel_sms_model->send_sms(
$client['phonenumber'],
$message,
$template_id
);
if ($response['success']) {
$success++;
} else {
$failed++;
}
}
}
}
}
set_alert('info', sprintf(
_l('bulk_sms_sent_info'),
$total_recipients,
$success,
$failed
));
}
redirect(admin_url('hubtel_sms'));
}
public function view_message($id)
{
if (!has_permission('hubtel_sms', '', 'view')) {
access_denied('View Message');
}
$message = $this->hubtel_sms_model->get_messages($id);
// If message ID exists, get logs, otherwise use empty array
$logs = [];
if ($message && isset($message->message_id)) {
$logs = $this->hubtel_sms_model->get_message_logs($message->message_id);
}
echo $this->load->view('hubtel_sms/message_details', [
'message' => $message,
'logs' => $logs
], true);
}
public function preview_template($id)
{
if (!has_permission('hubtel_sms', '', 'view')) {
access_denied('Preview Template');
}
$template = $this->hubtel_sms_model->get_template($id);
echo $this->load->view('hubtel_sms/template_preview', [
'template' => $template
], true);
}
public function get_template($id)
{
if (!has_permission('hubtel_sms', '', 'view')) {
access_denied('Get Template');
}
$template = $this->hubtel_sms_model->get_template($id);
if ($template) {
echo json_encode([
'success' => true,
'template' => $template
]);
} else {
echo json_encode([
'success' => false,
'message' => _l('template_not_found')
]);
}
}
public function resend($id)
{
if (!has_permission('hubtel_sms', '', 'create')) {
access_denied('Resend SMS');
}
$message = $this->hubtel_sms_model->get_messages($id);
if ($message) {
$response = $this->hubtel_sms_model->send_sms(
$message->to,
$message->message
);
echo json_encode($response);
} else {
echo json_encode([
'success' => false,
'message' => _l('message_not_found')
]);
}
}
public function get_recipients_preview()
{
if (!has_permission('hubtel_sms', '', 'view')) {
access_denied('Get Recipients Preview');
}
$groups = $this->input->get('groups');
$recipients = [];
if (!empty($groups)) {
$this->load->model('clients_model');
foreach ($groups as $group_id) {
$clients = $this->clients_model->get_clients_by_group($group_id);
$group_name = $this->client_groups_model->get_group($group_id)->name;
foreach ($clients as $client) {
if (!empty($client['phonenumber'])) {
$recipients[] = [
'company' => $client['company'],
'phonenumber' => $client['phonenumber'],
'group_name' => $group_name
];
}
}
}
}
echo json_encode([
'success' => true,
'html' => $this->load->view('hubtel_sms/recipients_preview', [
'recipients' => $recipients
], true),
'count' => count($recipients)
]);
}
public function settings()
{
if (!has_permission('hubtel_sms', '', 'edit')) {
access_denied('Hubtel SMS Settings');
}
if ($this->input->post()) {
$data = $this->input->post();
// Update options
update_option('hubtel_sms_client_id', $data['client_id']);
update_option('hubtel_sms_client_secret', $data['client_secret']);
update_option('hubtel_sms_sender_id', $data['sender_id']);
update_option('hubtel_sms_enabled', isset($data['enabled']) ? 1 : 0);
set_alert('success', _l('settings_updated'));
redirect(admin_url('hubtel_sms/settings'));
}
// Get statistics
$data['title'] = _l('hubtel_sms_settings');
$data['total_messages'] = $this->hubtel_sms_model->get_total_messages();
$data['sent_messages'] = $this->hubtel_sms_model->get_total_messages('sent');
$data['failed_messages'] = $this->hubtel_sms_model->get_total_messages('failed');
$data['total_cost'] = $this->hubtel_sms_model->get_total_cost();
$data['recent_messages'] = $this->hubtel_sms_model->get_recent_messages(5);
$this->load->view('hubtel_sms/settings', $data);
}
public function get_recent_messages()
{
if (!has_permission('hubtel_sms', '', 'view')) {
ajax_access_denied();
}
$messages = $this->hubtel_sms_model->get_recent_messages(5);
if ($messages) {
// Format messages for display
foreach ($messages as &$message) {
$message['date_sent_formatted'] = _dt($message['date_sent']);
$message['cost_formatted'] = app_format_money($message['rate'], get_base_currency());
}
}
echo json_encode([
'success' => true,
'messages' => $messages ?? []
]);
}
// public function get_recent_messages()
// {
// if (!has_permission('hubtel_sms', '', 'view')) {
// ajax_access_denied();
// }
// $messages = $this->hubtel_sms_model->get_recent_messages(5);
// echo json_encode(['success' => true, 'messages' => $messages]);
// }
public function send_test()
{
if (!has_permission('hubtel_sms', '', 'edit')) {
ajax_access_denied();
}
$number = $this->input->post('number');
if (!$number) {
echo json_encode([
'success' => false,
'message' => _l('enter_phone_number')
]);
return;
}
$sender_id = get_option('hubtel_sms_sender_id');
// Record test message attempt
$result = $this->hubtel_api->send_sms(
$number,
'This Is A Test Message',
$sender_id
);
// Log the test attempt
log_activity('SMS Test Attempt - Number: ' . $number . ', Response: ' . json_encode($result));
if ($result['success']) {
$message = _l('test_sms_sent_successfully');
if (isset($result['data']['messageId'])) {
$message .= ' (ID: ' . $result['data']['messageId'] . ')';
}
$result['message'] = $message;
}
echo json_encode($result);
}
private function get_module_statistics()
{
return [
'total_messages' => $this->hubtel_sms_model->get_total_messages(),
'sent_messages' => $this->hubtel_sms_model->get_total_messages('sent'),
'failed_messages' => $this->hubtel_sms_model->get_total_messages('failed'),
'total_cost' => $this->hubtel_sms_model->get_total_cost(),
'recent_messages' => $this->hubtel_sms_model->get_recent_messages(5),
];
}
public function get_account_info()
{
if (!has_permission('hubtel_sms', '', 'view')) {
ajax_access_denied();
}
$balance = $this->hubtel_api->get_balance();
if (!$balance) {
echo json_encode([
'success' => false,
'message' => _l('unable_to_get_balance')
]);
return;
}
echo json_encode([
'success' => true,
'data' => [
'balance' => $balance['balance'] ?? 0,
'currency' => $balance['currency'] ?? 'GHS',
'statistics' => $this->get_module_statistics()
]
]);
}
public function template($id = '')
{
if (!has_permission('hubtel_sms', '', $id ? 'edit' : 'create')) {
access_denied('SMS Templates');
}
if ($this->input->post()) {
$data = $this->input->post();
if ($id) {
$success = $this->hubtel_sms_model->update_template($id, $data);
$message = _l('template_updated');
} else {
$success = $this->hubtel_sms_model->add_template($data);
$message = _l('template_added');
}
if ($success) {
set_alert('success', $message);
}
redirect(admin_url('hubtel_sms'));
}
$data['title'] = $id ? _l('edit_template') : _l('new_template');
if ($id) {
$data['template'] = $this->hubtel_sms_model->get_template($id);
if (!$data['template']) {
show_404();
}
}
// Get merge fields for templates
$data['available_merge_fields'] = [
'client' => [
'{contact_firstname}' => _l('contact_firstname'),
'{contact_lastname}' => _l('contact_lastname'),
'{client_company}' => _l('client_company'),
'{client_phonenumber}' => _l('client_phonenumber')
],
'invoice' => [
'{invoice_number}' => _l('invoice_number'),
'{invoice_duedate}' => _l('invoice_duedate'),
'{invoice_total}' => _l('invoice_total'),
'{invoice_status}' => _l('invoice_status')
]
];
$this->load->view('hubtel_sms/template', $data);
}
public function delete_template($id)
{
if (!has_permission('hubtel_sms', '', 'delete')) {
access_denied('Delete SMS Template');
}
if ($this->hubtel_sms_model->delete_template($id)) {
set_alert('success', _l('template_deleted'));
}
redirect(admin_url('hubtel_sms'));
}
}