|
<?php
|
|
/**
|
|
* SMS controller.
|
|
*
|
|
* @author Lubomir Buben, Roman Sevcik
|
|
* @copyright (c) 2010 Lubomir Buben, Roman Sevcik
|
|
*
|
|
* @TODO correct functionality not confirmed - candidate for removal? (jsvitak)
|
|
* @TODO access rights missing (dzolo)
|
|
*/
|
|
|
|
class Sms_Controller extends Controller{
|
|
|
|
|
|
static public $RECEIVED = 0;
|
|
static public $SENT = 1;
|
|
|
|
static public $RECEIVED_UNREAD = 0;
|
|
static public $RECEIVED_READ = 1;
|
|
|
|
static public $SENT_OK = 0;
|
|
static public $SENT_UNSENT = 1;
|
|
static public $SENT_FAILED = 2;
|
|
|
|
public function index()
|
|
{
|
|
url::redirect(url_lang::base().'sms/show_all');
|
|
}
|
|
|
|
/**
|
|
* This function show all messages in database
|
|
* @author Roman Sevcik
|
|
* @param <type> $limit_results
|
|
* @param <type> $order_by
|
|
* @param <type> $order_by_direction
|
|
* @param <type> $page_word
|
|
* @param <type> $page
|
|
*/
|
|
public function show_all($limit_results = 100, $order_by = 'id', $order_by_direction = 'desc', $page_word = null, $page = 1)
|
|
{
|
|
// get new selector
|
|
if (is_numeric($this->input->get('record_per_page')))
|
|
$limit_results = (int) $this->input->get('record_per_page');
|
|
// parameters control
|
|
$allowed_order_type = array('id', 'name', 'user_id');
|
|
if (!in_array(strtolower($order_by), $allowed_order_type))
|
|
$order_by = 'user_id';
|
|
if (strtolower($order_by_direction) != 'asc' && strtolower($order_by_direction) != 'desc')
|
|
$order_by_direction = 'asc';
|
|
|
|
$model_sms_message = new Sms_message_Model();
|
|
|
|
$total_sms_message = $model_sms_message->count_all();
|
|
|
|
if (($sql_offset = ($page - 1) * $limit_results) > $total_sms_message)
|
|
$sql_offset = 0;
|
|
|
|
$all_sms_message = $model_sms_message->get_all_records($sql_offset, (int)$limit_results, $order_by, $order_by_direction);
|
|
|
|
$headline = url_lang::lang('texts.SMS message list');
|
|
$grid = new Grid(url_lang::base().'sms', $headline, array(
|
|
'use_paginator' => true,
|
|
'use_selector' => true,
|
|
'current' => $limit_results, //current selected 'records_per_page' value
|
|
'selector_increace' => 100, // increace
|
|
'selector_min' => 100, // minimum where selector start
|
|
'selector_max_multiplier' => 10,
|
|
'base_url' => Config::get('lang').'/sms/show_all/'.$limit_results.'/'.$order_by.'/'.$order_by_direction,
|
|
'uri_segment' => 'page', // pass a string as uri_segment to trigger former 'label' functionality
|
|
'total_items' => $total_sms_message, // use db count query here of course
|
|
'items_per_page' => $limit_results, // it may be handy to set defaults for stuff like this in config/pagination.php
|
|
'style' => 'classic',
|
|
'order_by' => $order_by,
|
|
'order_by_direction' => $order_by_direction,
|
|
'limit_results' => $limit_results
|
|
));
|
|
|
|
$drivers = Sms::get_drivers();
|
|
foreach ($drivers as $key => $driver)
|
|
{
|
|
if ($this->settings->get('sms_driver_state'.$key) == Sms::$DRIVER_ACTIVE)
|
|
$drivers[$key] = Sms::get_driver_name($key);
|
|
else
|
|
unset($drivers[$key]);
|
|
}
|
|
|
|
$grid->add_new_button(url_lang::base().'sms/show_unread', url_lang::lang('texts.Show unread messages'));
|
|
|
|
if (count($drivers) != 0)
|
|
$grid->add_new_button(url_lang::base().'sms/send', url_lang::lang('texts.Send message'));
|
|
$grid->order_field('id')->label(url_lang::lang('texts.id'));//->callback('VoIP_Controller::name');
|
|
$grid->order_field('send_date')->label(url_lang::lang('texts.Send date'));//->callback('VoIP_Controller::locked');
|
|
$grid->order_field('text')->label(url_lang::lang('texts.Text'));//->callback('VoIP_Controller::user_name');
|
|
$grid->order_callback_field('type')->label(url_lang::lang('texts.Type'))->callback('Sms_Controller::type');
|
|
$grid->callback_field('state')->label(url_lang::lang('texts.State'))->callback('Sms_Controller::state');
|
|
$grid->action_field('id') ->label(url_lang::lang('texts.Message'))->url(url_lang::base().'sms/show')->action(url_lang::lang('texts.Show'));
|
|
$grid->datasource($all_sms_message);
|
|
$view = new View('main');
|
|
$view->title = $headline;
|
|
$view->content = $grid;
|
|
$view->render(TRUE);
|
|
}
|
|
|
|
/**
|
|
* This function show all unread messages in database
|
|
* @author Roman Sevcik
|
|
* @param <type> $limit_results
|
|
* @param <type> $order_by
|
|
* @param <type> $order_by_direction
|
|
* @param <type> $page_word
|
|
* @param <type> $page
|
|
* TODO: under construction
|
|
*/
|
|
public function show_unread($limit_results = 100, $order_by = 'id', $order_by_direction = 'desc', $page_word = null, $page = 1)
|
|
{
|
|
// get new selector
|
|
if (is_numeric($this->input->get('record_per_page')))
|
|
$limit_results = (int) $this->input->get('record_per_page');
|
|
// parameters control
|
|
$allowed_order_type = array('id', 'name', 'user_id');
|
|
if (!in_array(strtolower($order_by), $allowed_order_type))
|
|
$order_by = 'user_id';
|
|
if (strtolower($order_by_direction) != 'asc' && strtolower($order_by_direction) != 'desc')
|
|
$order_by_direction = 'asc';
|
|
|
|
$model_sms_message = new Sms_message_Model();
|
|
|
|
$all_sms_message = $model_sms_message->get_unread_messages();
|
|
|
|
$total_sms_message = count($all_sms_message);
|
|
if (($sql_offset = ($page - 1) * $limit_results) > $total_sms_message)
|
|
$sql_offset = 0;
|
|
|
|
$all_sms_message = $model_sms_message->get_unread_messages($sql_offset, (int)$limit_results, $order_by, $order_by_direction);
|
|
|
|
|
|
$headline = url_lang::lang('texts.SMS message list');
|
|
$grid = new Grid(url_lang::base().'sms', $headline, array(
|
|
'use_paginator' => true,
|
|
'use_selector' => true,
|
|
'current' => $limit_results, //current selected 'records_per_page' value
|
|
'selector_increace' => 100, // increace
|
|
'selector_min' => 100, // minimum where selector start
|
|
'selector_max_multiplier' => 10,
|
|
'base_url' => Config::get('lang').'/sms/show_all/'.$limit_results.'/'.$order_by.'/'.$order_by_direction,
|
|
'uri_segment' => 'page', // pass a string as uri_segment to trigger former 'label' functionality
|
|
'total_items' => $total_sms_message, // use db count query here of course
|
|
'items_per_page' => $limit_results, // it may be handy to set defaults for stuff like this in config/pagination.php
|
|
'style' => 'classic',
|
|
'order_by' => $order_by,
|
|
'order_by_direction' => $order_by_direction,
|
|
'limit_results' => $limit_results,
|
|
));
|
|
|
|
$drivers = Sms::get_drivers();
|
|
foreach ($drivers as $key => $driver)
|
|
{
|
|
if ($this->settings->get('sms_driver_state'.$key) == Sms::$DRIVER_ACTIVE)
|
|
$drivers[$key] = Sms::get_driver_name($key);
|
|
else
|
|
unset($drivers[$key]);
|
|
}
|
|
|
|
$grid->add_new_button(url_lang::base().'sms/show_all', url_lang::lang('texts.Show all messages'));
|
|
|
|
if (count($drivers) != 0)
|
|
$grid->add_new_button(url_lang::base().'sms/send', url_lang::lang('texts.Send message'));
|
|
$grid->order_field('id')->label(url_lang::lang('texts.id'));//->callback('VoIP_Controller::name');
|
|
$grid->order_field('send_date')->label(url_lang::lang('texts.Send date'));//->callback('VoIP_Controller::locked');
|
|
$grid->order_field('text')->label(url_lang::lang('texts.Text'));//->callback('VoIP_Controller::user_name');
|
|
$grid->order_callback_field('type')->label(url_lang::lang('texts.Type'))->callback('Sms_Controller::type');
|
|
$grid->callback_field('state')->label(url_lang::lang('texts.State'))->callback('Sms_Controller::state');
|
|
$grid->action_field('id') ->label(url_lang::lang('texts.Message'))->url(url_lang::base().'sms/show')->action(url_lang::lang('texts.Show'));
|
|
$grid->datasource($all_sms_message);
|
|
$view = new View('main');
|
|
$view->title = $headline;
|
|
$view->content = $grid;
|
|
$view->render(TRUE);
|
|
}
|
|
|
|
/**
|
|
* This function show message in database
|
|
* @author Roman Sevcik
|
|
* @param <type> $sms_id
|
|
*/
|
|
public function show($sms_id = null)
|
|
{
|
|
if (!isset($sms_id))
|
|
Controller::warning(1);
|
|
|
|
$sms = ORM::factory('sms_message')->where('id', $sms_id)->find();
|
|
|
|
if ($sms->id == null)
|
|
Controller::error(RECORD);
|
|
|
|
$user = ORM::factory('user')->where('id', $sms->user_id)->find();
|
|
|
|
$array[] = html::anchor(url_lang::base().'sms/show_all', url_lang::lang('texts.Back to list of all messages'));
|
|
$array[] = html::anchor(url_lang::base().'sms/show_unread/', url_lang::lang('texts.Back to the list of unread messages'));
|
|
|
|
$links = implode(' | ', $array);
|
|
|
|
if ($sms->type == Sms_Controller::$RECEIVED)
|
|
{
|
|
if ($sms->state == Sms_Controller::$RECEIVED_UNREAD)
|
|
{
|
|
$sms->state = Sms_Controller::$RECEIVED_READ;
|
|
$sms->save();
|
|
}
|
|
|
|
$answer_sms = ORM::factory('sms_message')->where('sms_message_id', $sms->id)->find();
|
|
if ($answer_sms->id == null)
|
|
$answer = html::anchor(url_lang::base().'sms/send/'.$sms->sender.'/'.$sms->id, url_lang::lang('texts.Answer to this message'));
|
|
else
|
|
$answer = html::anchor(url_lang::base().'sms/show/'.$answer_sms->id, url_lang::lang('texts.Show answer for this message'));
|
|
}elseif ($sms->type == Sms_Controller::$SENT)
|
|
{
|
|
if ($sms->sms_message_id != null)
|
|
$answer = html::anchor(url_lang::base().'sms/show/'.$sms->sms_message_id, url_lang::lang('texts.Show parent for this message'));
|
|
else
|
|
$answer = ' - ';
|
|
}
|
|
|
|
$code = ORM::factory('contact')->find_phone_country_code($sms->receiver);
|
|
$number = substr($sms->receiver, strlen($code));
|
|
|
|
$receiver = ORM::factory('user')->get_user_by_phone_number_country_code ($number, $code);
|
|
|
|
if ($receiver && $receiver->id)
|
|
$r = html::anchor(url_lang::base().'users/show/'.$receiver->id, $code.$number, array('title' => $receiver->name.' '.$receiver->surname));
|
|
else
|
|
$r = $sms->receiver;
|
|
|
|
$view = new View('main');
|
|
$view->title = url_lang::lang('texts.Show SMS message');
|
|
$view->content = new View('sms/show');
|
|
$view->content->headline = url_lang::lang('texts.SMS message');
|
|
$view->content->links = $links;
|
|
$view->content->sms = $sms;
|
|
$view->content->answer = $answer;
|
|
$view->content->receiver = $r;
|
|
$view->content->user = $user;
|
|
$view->render(true);
|
|
}
|
|
|
|
/**
|
|
* Function save message for send to database.
|
|
* @author Roman Sevcik
|
|
* @param <type> $phone
|
|
* @param <type> $sms_id
|
|
* @param <type> $selected_subnet .
|
|
*
|
|
*/
|
|
public function send($phone = null, $sms_id = null, $selected_subnet = null)
|
|
{
|
|
$drivers = Sms::get_drivers();
|
|
foreach ($drivers as $key => $driver)
|
|
{
|
|
if ($this->settings->get('sms_driver_state'.$key) == Sms::$DRIVER_ACTIVE)
|
|
$drivers[$key] = Sms::get_driver_name($key);
|
|
else
|
|
unset($drivers[$key]);
|
|
}
|
|
|
|
if (count($drivers) == 0)
|
|
Controller::error(ACCESS);
|
|
|
|
if (!is_numeric($phone))
|
|
$phone = null;
|
|
|
|
if (!is_numeric($sms_id))
|
|
$sms_id = null;
|
|
|
|
if (!is_numeric($selected_subnet))
|
|
$selected_subnet = null;
|
|
|
|
if ($sms_id != null)
|
|
{
|
|
$sms = ORM::factory('sms_message')->where('id', $sms_id)->find();
|
|
|
|
if ($sms->id == null)
|
|
Controller::error(RECORD);
|
|
|
|
$answer_sms = ORM::factory('sms_message')->where('sms_message_id', $sms_id)->find();
|
|
if ($answer_sms->id != null)
|
|
url::redirect(url_lang::base().'sms/show/'.$answer_sms->id);
|
|
}
|
|
|
|
if (strlen($phone) == 12)
|
|
$phone = $phone;
|
|
elseif (strlen($phone) == 9)
|
|
$phone = '420'.$phone;
|
|
else
|
|
$phone = '';
|
|
|
|
|
|
$subnet_model = new Subnet_Model();
|
|
$subnets = $subnet_model->select("id","name","network_address as net_str","inet_aton(network_address) as net",
|
|
"32-log2((~inet_aton(netmask) & 0xffffffff) + 1) as mask")->orderby('net')->find_all();
|
|
|
|
$arr_subnets_netnames[] = $arr_subnets_names[] = '----- '.url_lang::lang('texts.select subnet').' -----';
|
|
$arr_subnets_ids[] = $arr_subnets_masks[] = $arr_subnets_nets[]=0;
|
|
foreach ($subnets as $subnet)
|
|
{
|
|
$arr_subnets_names[$subnet->id] = $subnet->net_str."/".$subnet->mask.": ".$subnet->name;
|
|
$this->arr_mask_by_id[$subnet->id]=$subnet->mask;
|
|
$this->arr_net_by_id[$subnet->id]=$subnet->net;
|
|
$arr_subnets_nets[] = $subnet->net;
|
|
$arr_subnets_masks[] = $subnet->mask;
|
|
$arr_subnets_netnames[] = $subnet->net_str."/".$subnet->mask.": ".$subnet->name ;
|
|
$arr_subnets_ids[]=$subnet->id;
|
|
}
|
|
|
|
array_multisort($arr_subnets_nets, SORT_NUMERIC, SORT_ASC,
|
|
$arr_subnets_masks, SORT_NUMERIC, SORT_ASC,
|
|
$arr_subnets_ids, SORT_NUMERIC, SORT_ASC,
|
|
$arr_subnets_netnames, SORT_STRING, SORT_ASC);
|
|
|
|
|
|
$sn = $this->settings->get('sms_sender_number');
|
|
$sender_number[$sn] = $sn;
|
|
|
|
$type_receiver['number'] = url_lang::lang('texts.Number');
|
|
$type_receiver['subnet'] = url_lang::lang('texts.Subnet');
|
|
$type_receiver['all'] = url_lang::lang('texts.All');
|
|
|
|
$form = new Forge(url_lang::base().'sms/send/'.$phone.'/'.$sms_id, '', 'POST', array('name' => 'sms_form', 'id' => 'sms_form'));
|
|
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
|
|
$form->group('')->label(url_lang::lang('texts.About SMS'));
|
|
$form->dropdown('sender_number')->label(url_lang::lang('texts.Number of the sender').':')->rules('required')->options($sender_number);
|
|
$form->dropdown('sms_driver')->label(url_lang::lang('texts.Driver').':')->rules('required')->options($drivers)->selected($this->settings->get('sms_driver'));
|
|
|
|
$form->group('')->label(url_lang::lang('texts.Recipient information'));
|
|
|
|
if ($sms_id == null)
|
|
$form->dropdown('type_receiver')->label(url_lang::lang('texts.Type of the recipient').':')->rules('required')->options($type_receiver)->script('onchange','change_type(document.sms_form)');
|
|
else
|
|
$form->hidden('type_receiver')->value('number');
|
|
|
|
$form->input('receiver_number')->label(url_lang::lang('texts.Number of the recipient').':')->rules('length[12,12]required|valid_phone_cs_CZ')->value($phone);
|
|
|
|
if ($sms_id == null)
|
|
if ($selected_subnet != null)
|
|
$form->dropdown('subnet_id')->label(url_lang::lang('texts.Select subnet name').':')->options($arr_subnets_names)->selected($selected_subnet);
|
|
else
|
|
$form->dropdown('subnet_id')->label(url_lang::lang('texts.Select subnet name').':')->options($arr_subnets_names);
|
|
|
|
$form->dateselect('stamp')->label(url_lang::lang('texts.Date').':');
|
|
$form->textarea('text')->label(url_lang::lang('texts.Text').':')->rules('length[1,760]|required');
|
|
$form->input('counter')->style('width:530px;');
|
|
|
|
$form->hidden('s_id')->value($sms_id);
|
|
|
|
|
|
$form->submit('submit')->value(url_lang::lang('texts.Send'));
|
|
special::required_forge_style($form, ' *', 'required');
|
|
|
|
if($form->validate())
|
|
{
|
|
$result = array();
|
|
|
|
$form_data = $form->as_array();
|
|
|
|
foreach($form_data as $key => $value)
|
|
{
|
|
$form_data[$key] = htmlspecialchars($value);
|
|
}
|
|
|
|
if ($form_data['type_receiver'] == 'number')
|
|
{
|
|
$result[]->phone = $form_data['receiver_number'];
|
|
}
|
|
else if ($form_data['type_receiver'] == 'subnet')
|
|
{
|
|
$subnet = new Subnet_Model();
|
|
$result = $subnet->get_phones_of_subnet($form_data['subnet_id']);
|
|
}
|
|
|
|
foreach ($result as $row)
|
|
{
|
|
$phone = $row->phone;
|
|
|
|
if (strlen($phone) == 12)
|
|
$phone = $phone;
|
|
elseif (strlen($phone) == 9)
|
|
$phone = '420'.$phone;
|
|
else
|
|
continue;
|
|
|
|
$sms = new Sms_message_Model();
|
|
$sms->user_id = $this->session->get('user_id');
|
|
if ($form_data['s_id'] != null)
|
|
$sms->sms_message_id = $form_data['s_id'];
|
|
$sms->stamp = date('Y-m-d H:i:s', time());
|
|
$sms->send_date = date('Y-m-d H:i:s', $form_data['stamp']);
|
|
$sms->text = text::cs_utf2ascii($form_data['text']);
|
|
$sms->sender = $form_data['sender_number'];
|
|
$sms->receiver = $phone;
|
|
$sms->driver = $form_data['sms_driver'];
|
|
$sms->type = Sms_Controller::$SENT;
|
|
$sms->state = Sms_Controller::$SENT_UNSENT;
|
|
|
|
if ($sms->save())
|
|
{
|
|
status::success('SMS message has been successfully added.');
|
|
}
|
|
else
|
|
{
|
|
status::error('Error - cant add new SMS message.');
|
|
}
|
|
url::redirect(url_lang::base().'sms/send');
|
|
}
|
|
|
|
status::warning('No SMS message has been added.');
|
|
|
|
url::redirect(url_lang::base().'sms/send');
|
|
}
|
|
else
|
|
{
|
|
$headline = url_lang::lang('texts.Send SMS message');
|
|
$view = new View('main');
|
|
$view->title = $headline;
|
|
$view->content = new View('form');
|
|
$view->content->headline = $headline;
|
|
$view->content->form = $form->html();
|
|
|
|
$array[] = html::anchor(url_lang::base().'sms/show_all', url_lang::lang('texts.Back to list of all messages'));
|
|
$array[] = html::anchor(url_lang::base().'sms/show_unread/', url_lang::lang('texts.Back to the list of unread messages'));
|
|
|
|
$links = implode(' | ', $array);
|
|
|
|
$view->content->link_back = $links;
|
|
$view->render(TRUE);
|
|
}
|
|
|
|
}
|
|
|
|
public static function type($item, $name)
|
|
{
|
|
|
|
if ($item->type == Sms_Controller::$RECEIVED)
|
|
echo '<div style="text-align:center;">'.html::image(array('src' => resource::sms('receive'), 'alt' => url_lang::lang('texts.Received message'), 'title' => url_lang::lang('texts.Received message'))).'</div>';
|
|
elseif ($item->type == Sms_Controller::$SENT)
|
|
echo '<div style="text-align:center;">'.html::image(array('src' => resource::sms('send'), 'alt' => url_lang::lang('texts.Sent message'), 'title' => url_lang::lang('texts.Sent message'))).'</div>';
|
|
}
|
|
|
|
public static function state($item, $name)
|
|
{
|
|
if ($item->type == Sms_Controller::$RECEIVED)
|
|
{
|
|
if ($item->state == Sms_Controller::$RECEIVED_READ)
|
|
{
|
|
echo '<div style="color:black;">'.url_lang::lang('texts.Read').'</div>';
|
|
}
|
|
elseif ($item->state == Sms_Controller::$RECEIVED_UNREAD)
|
|
{
|
|
echo '<b style="color:black;">'.url_lang::lang('texts.Unread').'</b>';
|
|
}
|
|
|
|
}
|
|
elseif ($item->type == Sms_Controller::$SENT)
|
|
{
|
|
if ($item->state == Sms_Controller::$SENT_OK)
|
|
{
|
|
echo '<div style="color:green;">'.url_lang::lang('texts.Sent').'</div>';
|
|
}
|
|
elseif ($item->state == Sms_Controller::$SENT_UNSENT)
|
|
{
|
|
echo '<div style="color:grey;">'.url_lang::lang('texts.Unsent').'</div>';
|
|
}
|
|
elseif ($item->state == Sms_Controller::$SENT_FAILED)
|
|
{
|
|
echo '<b style="color:red;">'.url_lang::lang('texts.Failed').'</b>';
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Function generates address book for subnet.
|
|
* @param $subnet_id
|
|
* @return unknown_type
|
|
*/
|
|
function generate_subnet_address_book($subnet_id=null){
|
|
|
|
exit;
|
|
$subnet = new Subnet_Model();
|
|
$result = $subnet->get_phones_and_names_of_subnet($subnet_id);
|
|
$text = "";
|
|
foreach ($result as $row){
|
|
if($row->id != ""){
|
|
$text .= " <Contact id=\"$row->id\">\n";
|
|
$text .= " <DisplayName>$row->name</DisplayName>\n";
|
|
$text .= " <Numbers>\n";
|
|
$text .= " <MobileTelephoneNumber>$row->phone</MobileTelephoneNumber>";
|
|
$text .= " </Numbers>\n";
|
|
}
|
|
}
|
|
return $text;
|
|
}
|
|
|
|
|
|
/**
|
|
* Checks validity of phone number.
|
|
* @param $input phone number
|
|
* @return unknown_type
|
|
*/
|
|
function callback_valid_phone($input){
|
|
$value = trim($input->value);
|
|
if(!preg_match("/^[0-9]{9,9}$/",$value)){
|
|
$input->add_error('required', url_lang::lang('texts.Bad phone format.'));
|
|
}
|
|
}
|
|
|
|
}
|