Projekt

Obecné

Profil

<?php defined('SYSPATH') or die('No direct script access.');
/*
* This file is part of open source system FreeNetIS
* and it is released under GPLv3 licence.
*
* More info about licence can be found:
* http://www.gnu.org/licenses/gpl-3.0.html
*
* More info about project can be found:
* http://www.freenetis.org/
*
*/

/**
* SMS controller.
*
* @author 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')->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.'));
}
}

}
(56-56/75)