Revize 8d0578dc
Přidáno uživatelem Filip Miškařík před téměř 5 roky(ů)
application/controllers/js.php | ||
---|---|---|
private function _js_users_show_work_report($work_id = NULL)
|
||
{
|
||
$this->views['users_show_work_report'] = View::factory('js/work_reports_show')->render();
|
||
}
|
||
|
||
private function _js_voip_show($user_id = NULL)
|
||
{
|
||
$this->voip_calculator($user_id);
|
||
}
|
||
|
||
private function _js_voip_calls_show_by_user($user_id = NULL)
|
||
{
|
||
$this->voip_calculator($user_id);
|
||
}
|
||
}
|
||
|
||
private function _js_work_reports_add()
|
||
{
|
||
... | ... | |
View::factory('js/__pieces/time_activity_rule')->render();
|
||
}
|
||
|
||
/**
|
||
* Calculator for VoIP calls
|
||
*
|
||
* @param integer $user_id
|
||
*/
|
||
private function voip_calculator($user_id = NULL)
|
||
{
|
||
if ($user_id && is_numeric($user_id))
|
||
{
|
||
$user = new User_Model($user_id);
|
||
|
||
if ($user && $user->id)
|
||
{
|
||
$sip = ORM::factory('voip_sip')
|
||
->where('user_id', $user->id)
|
||
->find();
|
||
|
||
if ($sip && $sip->id)
|
||
{
|
||
$view = View::factory('js/__pieces/voip_calculator');
|
||
$view->sip_name = $sip->name;
|
||
$this->views['__pieces_voip_calculator'] = $view->render();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Adds javascript for work reports forms
|
||
*/
|
application/controllers/members.php | ||
---|---|---|
}
|
||
}
|
||
|
||
/******** VoIP ***********/
|
||
|
||
if (Settings::get('voip_enabled'))
|
||
{
|
||
// VoIP SIP model
|
||
$voip_sip = new Voip_sip_Model();
|
||
// Gets sips
|
||
$voip = $voip_sip->get_all_record_by_member_limited($member->id);
|
||
// Has driver?
|
||
$has_driver = Billing::instance()->has_driver();
|
||
// Account
|
||
$b_account = null;
|
||
// Check account only if have SIP
|
||
if ($voip->count())
|
||
{
|
||
$b_account = Billing::instance()->get_account($member->id);
|
||
}
|
||
|
||
$voip_grid = new Grid('members', null, array
|
||
(
|
||
'separator' => '<br /><br />',
|
||
'use_paginator' => false,
|
||
'use_selector' => false
|
||
));
|
||
|
||
$voip_grid->field('id')
|
||
->label('ID');
|
||
|
||
$voip_grid->field('callerid')
|
||
->label(__('Number'));
|
||
|
||
$actions = $voip_grid->grouped_action_field();
|
||
|
||
if ($this->acl_check_view('VoIP_Controller', 'voip', $member->id))
|
||
{
|
||
$actions->add_action('user_id')
|
||
->icon_action('phone')
|
||
->url('voip/show')
|
||
->label('Show VoIP account');
|
||
}
|
||
|
||
if ($this->acl_check_view('Users_Controller', 'users', $member->id))
|
||
{
|
||
$actions->add_action('user_id')
|
||
->icon_action('member')
|
||
->url('users/show')
|
||
->label('Show user who own this VoIP account');
|
||
}
|
||
|
||
$voip_grid->datasource($voip);
|
||
|
||
if ($has_driver && $b_account)
|
||
{
|
||
if ($this->acl_check_view('VoIP_Controller', 'voip', $member->id))
|
||
{
|
||
$voip_grid->add_new_button(
|
||
'voip_calls/show_by_member/'.$member->id,
|
||
__('List of all calls')
|
||
);
|
||
}
|
||
|
||
if (Settings::get('finance_enabled') &&
|
||
$this->acl_check_new('Accounts_Controller', 'transfers', $member->id) &&
|
||
!$is_association)
|
||
{
|
||
$voip_grid->add_new_button(
|
||
'transfers/add_voip/'.$account->id,
|
||
__('Recharge VoIP credit')
|
||
);
|
||
}
|
||
}
|
||
}
|
||
|
||
// finds date of expiration of member fee
|
||
$expiration_info = NULL;
|
||
|
||
... | ... | |
$view->content->user_name = $user_name;
|
||
$view->content->users_grid = $users_grid;
|
||
$view->content->redir_grid = Settings::get('redirection_enabled') ? $redir_grid : '';
|
||
$view->content->voip_grid = (Settings::get('voip_enabled')) ? $voip_grid : '';
|
||
$view->content->membership_interrupts_grid = Settings::get('membership_interrupt_enabled') ?
|
||
$membership_interrupts_grid : '';
|
||
$view->content->contacts = $contacts;
|
||
... | ... | |
$view->content->domicile_gps = $domicile_gps;
|
||
$view->content->town = (isset($town)) ? $town : '';
|
||
$view->content->country = (isset($country)) ? $country : '';
|
||
$view->content->billing_has_driver = (Settings::get('voip_enabled')) ? $has_driver : FALSE;
|
||
$view->content->billing_account = (Settings::get('voip_enabled')) ? $b_account : NULL;
|
||
$view->content->count_voip = (Settings::get('voip_enabled')) ? count($voip) : 0;
|
||
$view->content->total_traffic = @$total_traffic;
|
||
$view->content->today_traffic = @$today_traffic;
|
||
$view->content->month_traffic = @$month_traffic;
|
application/controllers/settings.php | ||
---|---|---|
'name' => 'users_enabled',
|
||
'dependencies' => array()
|
||
),
|
||
'voip' => array
|
||
(
|
||
'name' => 'voip_enabled',
|
||
'dependencies' => array()
|
||
),
|
||
'vtiger' => array
|
||
(
|
||
'name' => 'vtiger_integration',
|
||
... | ... | |
$this->acl_check_edit('Settings_Controller', 'sms_settings'))
|
||
$this->sections['sms'] = __('SMS');
|
||
|
||
// is voip enabled
|
||
if (self::isModuleEnabled('voip') &&
|
||
$this->acl_check_edit('Settings_Controller', 'voip_settings'))
|
||
$this->sections['voip'] = __('VoIP');
|
||
|
||
// is notification enabled
|
||
if (self::isModuleEnabled('notification') &&
|
||
$this->acl_check_edit('Settings_Controller', 'notification_settings'))
|
||
... | ... | |
$this->email();
|
||
else if ($this->acl_check_edit('Settings_Controller', 'sms_settings'))
|
||
$this->sms();
|
||
else if ($this->acl_check_edit('Settings_Controller', 'voip_settings'))
|
||
$this->voip();
|
||
else if ($this->acl_check_edit('Settings_Controller', 'notification_settings'))
|
||
$this->notifications();
|
||
else if ($this->acl_check_edit('Settings_Controller', 'qos_settings'))
|
||
... | ... | |
->options(arr::bool())
|
||
->default(Settings::get('sms_enabled'));
|
||
|
||
// VoIP
|
||
$form_modules['voip'] = $this->form->radio('voip_enabled')
|
||
->label('VoIP')
|
||
->options(arr::bool())
|
||
->default(Settings::get('voip_enabled'));
|
||
|
||
// Network
|
||
$form_modules['networks'] = $this->form->radio('networks_enabled')
|
||
->label('Networks')
|
||
... | ... | |
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* VOIP settings
|
||
*/
|
||
public function voip()
|
||
{
|
||
// access control
|
||
if (!module::e('voip') ||
|
||
!$this->acl_check_edit(get_class($this), 'voip_settings'))
|
||
Controller::error(ACCESS);
|
||
|
||
// creating of new forge
|
||
$this->form = new Forge('settings/voip');
|
||
|
||
$this->form->group('VoIP settings');
|
||
|
||
// page title
|
||
$this->form->input('voip_number_interval')
|
||
->label('Number interval')
|
||
->rules('length[19,19]|required')
|
||
->value(addslashes(Settings::get('voip_number_interval')))
|
||
->callback(array($this, 'valid_voip_number_interval'));
|
||
|
||
$this->form->input('voip_number_exclude')
|
||
->label('Exclude numbers')
|
||
->rules('length[9,100]')
|
||
->value(addslashes(Settings::get('voip_number_exclude')))
|
||
->callback(array($this, 'valid_voip_number_exclude'));
|
||
|
||
$this->form->input('voip_sip_server')
|
||
->label('SIP server')
|
||
->rules('length[1,30]|required')
|
||
->value(addslashes(Settings::get('voip_sip_server')));
|
||
|
||
$this->form->group('Asterisk manager settings');
|
||
|
||
$this->form->input('voip_asterisk_hostname')
|
||
->label('Hostname')
|
||
->rules('length[1,50]')
|
||
->value(Settings::get('voip_asterisk_hostname'));
|
||
|
||
$this->form->input('voip_asterisk_user')
|
||
->label('User')
|
||
->rules('length[1,50]')
|
||
->value(Settings::get('voip_asterisk_user'));
|
||
|
||
$this->form->input('voip_asterisk_pass')
|
||
->label('Password')
|
||
->rules('length[1,50]')
|
||
->value(Settings::get('voip_asterisk_pass'));
|
||
|
||
|
||
$this->form->group('Billing settings');
|
||
|
||
$this->form->dropdown('voip_billing_driver')
|
||
->label('Driver')
|
||
->rules('required')
|
||
->options(array
|
||
(
|
||
Billing::INACTIVE => __('Inactive'),
|
||
Billing::NFX_LBILLING => 'lBilling - NFX'
|
||
))->selected(Settings::get('voip_billing_driver'));
|
||
|
||
$this->form->input('voip_billing_partner')
|
||
->label('Partner')
|
||
->rules('length[1,50]')
|
||
->value(Settings::get('voip_billing_partner'));
|
||
|
||
$this->form->input('voip_billing_password')
|
||
->label('Password')
|
||
->rules('length[1,50]')
|
||
->value(Settings::get('voip_billing_password'));
|
||
|
||
|
||
$this->form->group('Actual price of calls');
|
||
|
||
$this->form->input('voip_tariff_fixed')
|
||
->label('Fixed line number')
|
||
->rules('valid_numeric')
|
||
->value(Settings::get('voip_tariff_fixed'));
|
||
|
||
$this->form->input('voip_tariff_cellphone')
|
||
->label('Cellphone number')
|
||
->rules('valid_numeric')
|
||
->value(Settings::get('voip_tariff_cellphone'));
|
||
|
||
$this->form->input('voip_tariff_voip')
|
||
->label('VoIP number')
|
||
->rules('valid_numeric')
|
||
->value(Settings::get('voip_tariff_voip'));
|
||
|
||
$this->form->submit('Save');
|
||
|
||
// form validate
|
||
if ($this->form->validate())
|
||
{
|
||
$form_data = $this->form->as_array(FALSE);
|
||
$issaved = true;
|
||
$driver = true;
|
||
|
||
// enable VoIP driver
|
||
if ($form_data['voip_billing_driver'] != Billing::INACTIVE)
|
||
{
|
||
$voip_sip = new Voip_sip_Model();
|
||
|
||
// Check pre requirements of VoIP
|
||
if (!$voip_sip->check_pre_requirements())
|
||
{
|
||
// Make pre requirements
|
||
try
|
||
{
|
||
// creates helper functions
|
||
Voip_sip_Model::create_functions();
|
||
// create views
|
||
Voip_sip_Model::create_views();
|
||
}
|
||
catch (Exception $e)
|
||
{
|
||
// unset driver
|
||
Settings::set('voip_billing_driver', Billing::INACTIVE);
|
||
// don't change in next foreach
|
||
unset($form_data['voip_billing_driver']);
|
||
// error flad
|
||
$driver = false;
|
||
}
|
||
}
|
||
}
|
||
|
||
foreach ($form_data as $name => $value)
|
||
{
|
||
$issaved = $issaved && Settings::set($name, $value);
|
||
}
|
||
|
||
if (!$driver)
|
||
{ // driver error
|
||
status::error(__(
|
||
'Cannot enable VoIP driver, allow `%s` rights for MySQL user',
|
||
array('CREATE ROUTINE')
|
||
) . '.',NULL, FALSE);
|
||
}
|
||
else if ($issaved)
|
||
{
|
||
status::success('System variables have been successfully updated.');
|
||
}
|
||
else
|
||
{
|
||
status::success('System variables havent been successfully updated.');
|
||
}
|
||
|
||
url::redirect('settings/voip');
|
||
}
|
||
|
||
// drover informations
|
||
$ai = null;
|
||
|
||
if (Billing::instance()->has_driver())
|
||
{
|
||
if (Billing::instance()->test_conn())
|
||
{
|
||
$ai = __('Testing driver');
|
||
$ai .= ': lBilling - NFX......<span style="color:green">OK</span>';
|
||
}
|
||
else
|
||
{
|
||
$ai = __('Testing driver');
|
||
$ai .= ': lBilling - NFX......<span style="color:red">';
|
||
$ai .= __('Failed') . '</span>';
|
||
}
|
||
}
|
||
|
||
// create view for this template
|
||
$view = new View('main');
|
||
$view->title = __('Settings') . ' - ' . __('VoIP');
|
||
$view->content = new View('settings/main');
|
||
$view->content->current = 'voip';
|
||
$view->content->content = $this->form->html();
|
||
$view->content->headline = __('VoIP');
|
||
$view->content->additional_info = $ai;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* SMS settings
|
||
*/
|
||
... | ... | |
$view->render(TRUE);
|
||
}
|
||
|
||
// start of validation function
|
||
|
||
/**
|
||
* Check if intervals of VoIP numbers are valid
|
||
*
|
||
* @author Michal Kliment
|
||
* @param object $input input to validation
|
||
*/
|
||
public function valid_voip_number_interval($input = NULL)
|
||
{
|
||
// validators cannot be accessed
|
||
if (empty($input) || !is_object($input))
|
||
{
|
||
self::error(PAGE);
|
||
}
|
||
|
||
// parse interval to array of VoIP numbers
|
||
$numbers = explode('-', $input->value);
|
||
// check if count of numbers is smaller or longer than 2
|
||
// (123456789, 987654321; NOT 123456,654321,987654)
|
||
if (count($numbers) != 2)
|
||
{
|
||
$input->add_error('required', __('Bad VoIP number interval format'));
|
||
}
|
||
else
|
||
{
|
||
// check if first and second number are 9 characters long (123456789, NOT 1234567890)
|
||
if (strlen($numbers[0]) != 9 || strlen($numbers[1]) != 9)
|
||
{
|
||
$input->add_error('required', __(
|
||
'VoIP number must be 9 characters long'
|
||
));
|
||
}
|
||
// check if first and second number are numbers :-) (123456789, NOT abcdefghi)
|
||
if (!is_numeric($numbers[0]) || !is_numeric($numbers[1]))
|
||
{
|
||
$input->add_error('required', __('VoIP number must be a number'));
|
||
}
|
||
// check if first number are not larger than second number
|
||
if ($numbers[0] > $numbers[1])
|
||
{
|
||
$input->add_error('required', __(
|
||
'First number mustn\'t be larger then second number'
|
||
));
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Validator
|
||
*
|
||
* @param object $input
|
||
*/
|
||
public function valid_voip_number_exclude($input = NULL)
|
||
{
|
||
// validators cannot be accessed
|
||
if (empty($input) || !is_object($input))
|
||
{
|
||
self::error(PAGE);
|
||
}
|
||
|
||
$value = $input->value;
|
||
|
||
// do not check empty
|
||
if (empty($value)) {
|
||
return;
|
||
}
|
||
|
||
// parse interval to array of VoIP numbers
|
||
$numbers = explode(';', $input->value);
|
||
// check if count of numbers is smaller or longer than 2
|
||
// (123456789, 987654321; NOT 123456,654321,987654)
|
||
|
||
foreach ($numbers as $number)
|
||
{
|
||
// check if first and second number are 9 characters long (123456789, NOT 1234567890)
|
||
if (strlen($number) != 9)
|
||
{
|
||
$input->add_error('required', __('VoIP number must be 9 characters long'));
|
||
break;
|
||
}
|
||
// check if first and second number are numbers :-) (123456789, NOT abcdefghi)
|
||
if (!is_numeric($number))
|
||
{
|
||
$input->add_error('required', __('VoIP number must be a number'));
|
||
break;
|
||
}
|
||
}
|
||
}// end of validatation function
|
||
|
||
/**
|
||
* Validates suffix
|
||
*
|
application/controllers/transfers.php | ||
---|---|---|
);
|
||
|
||
$account = ORM::factory('account')->where('id', $account_id)->find();
|
||
|
||
if (Billing::instance()->has_driver() &&
|
||
Billing::instance()->get_account($account->member_id))
|
||
{
|
||
$transfers_grid->add_new_button(
|
||
'transfers/add_voip/' . $account_id,
|
||
__('Recharge VoIP credit')
|
||
);
|
||
}
|
||
}
|
||
if ($account->account_attribute_id == Account_attribute_Model::CREDIT)
|
||
{
|
||
... | ... | |
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* Function adds VoIP transfers.
|
||
*
|
||
* @author Roman Sevcik
|
||
* @param integer $origin_account
|
||
*/
|
||
public function add_voip($origin_account = NULL)
|
||
{
|
||
if (!isset($origin_account))
|
||
{
|
||
self::warning(PARAMETER);
|
||
}
|
||
|
||
$origin_acc = new Account_Model($origin_account);
|
||
|
||
if (!$origin_acc->id)
|
||
{
|
||
self::error(RECORD);
|
||
}
|
||
|
||
if (!$this->acl_check_new('Accounts_Controller', 'transfers', $origin_acc->member_id))
|
||
{ // does the user have rights for this?
|
||
self::error(ACCESS);
|
||
}
|
||
|
||
if (!Billing::instance()->has_driver() ||
|
||
!Billing::instance()->get_account($origin_acc->member_id))
|
||
{
|
||
self::error(RECORD);
|
||
}
|
||
|
||
$arr_orig_accounts[$origin_acc->id] =
|
||
$origin_acc->name . ' - ' . __('Account ID') . ' ' . $origin_acc->id .
|
||
' - ' . __('Member ID') . ' ' . $origin_acc->member_id;
|
||
|
||
// form
|
||
$form = new Forge('transfers/add_voip/' . $origin_account);
|
||
|
||
$form->group('Transfer');
|
||
|
||
$form->dropdown('oname')
|
||
->label('Origin account')
|
||
->options($arr_orig_accounts)
|
||
->style('width:450px');
|
||
|
||
$form->date('datetime')
|
||
->label('Date and time')
|
||
->years(date('Y') - 20, date('Y'))
|
||
->rules('required');
|
||
|
||
$form->input('amount')
|
||
->label('Amount')
|
||
->rules('required|valid_numeric')
|
||
->callback(array($this, 'valid_amount_to_send'));
|
||
|
||
$form->submit('Send');
|
||
|
||
if ($form->validate())
|
||
{
|
||
// default destination account
|
||
$operating = ORM::factory('account')->where(
|
||
'account_attribute_id', Account_attribute_Model::OPERATING
|
||
)->find();
|
||
|
||
$text = __('Recharging of VoIP credit');
|
||
|
||
$form_data = $form->as_array();
|
||
|
||
try
|
||
{
|
||
$db = new Transfer_Model();
|
||
$db->transaction_start();
|
||
|
||
Transfer_Model::insert_transfer(
|
||
$form_data['oname'], $operating->id, null, null,
|
||
$this->session->get('user_id'),
|
||
Transfer_Model::DEDUCT_VOIP_UNNACCOUNTED_FEE,
|
||
date('Y-m-d', $form_data['datetime']), date('Y-m-d H:i:s'),
|
||
$text, $form_data['amount']
|
||
);
|
||
|
||
$db->transaction_commit();
|
||
status::success('Transfer has been successfully added.');
|
||
}
|
||
catch (Exception $e)
|
||
{
|
||
$db->transaction_rollback();
|
||
Log::add_exception($e);
|
||
status::success('Transfer has not been successfully added');
|
||
}
|
||
url::redirect('transfers/show_by_account/' . $origin_account);
|
||
}
|
||
|
||
$headline = __('Add new VoIP transfer');
|
||
|
||
// breadcrumbs navigation
|
||
$breadcrumbs = breadcrumbs::add()
|
||
->link('members/show_all', 'Members',
|
||
$this->acl_check_view('Members_Controller', 'members')
|
||
)->disable_translation()
|
||
->link('members/show/' . $origin_acc->member->id,
|
||
'ID ' . $origin_acc->member->id . ' - ' . $origin_acc->member->name,
|
||
$this->acl_check_view(
|
||
'Members_Controller', 'members',
|
||
$origin_acc->member->id
|
||
)
|
||
)->enable_translation()
|
||
->link('transfers/show_by_account/' . $origin_account,
|
||
'Transfers', $origin_account)
|
||
->text($headline);
|
||
|
||
$info[] = __('Information') . ' : ' . __('Transfer will be effected within 15 minutes.');
|
||
$view = new View('main');
|
||
$view->title = $headline;
|
||
$view->content = new View('form');
|
||
$view->breadcrumbs = $breadcrumbs->html();
|
||
$view->content->headline = $headline;
|
||
$view->content->form = $form->html();
|
||
$view->content->aditional_info = $info;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* Function edits double-entry transfers. They should not be edited.
|
||
* Wrong transfer should be solved by new transfer.
|
application/controllers/users.php | ||
---|---|---|
$arr_contact_types[$i] = $enum_type_model->get_value($contact->type);
|
||
}
|
||
|
||
// voip is enabled
|
||
if (Settings::get('voip_enabled'))
|
||
{
|
||
$voip_sip = new Voip_sip_Model();
|
||
$voip = $voip_sip->get_record_by_user_limited($user_id);
|
||
|
||
if ($voip->count() == 0)
|
||
{
|
||
$voip = '<span style="color:red;">'.__('Nonactive').'</span> - '
|
||
.html::anchor('voip/add/'.$user_id, __('Activate'));
|
||
}
|
||
else
|
||
{
|
||
$voip = html::anchor(
|
||
'voip/show/'.$voip->current()->user_id,
|
||
$voip->current()->name
|
||
);
|
||
}
|
||
}
|
||
|
||
$aro_groups = $user->get_aro_groups_of_user($user_id);
|
||
|
||
|
||
... | ... | |
$view->content->user_data = $user;
|
||
$view->content->contacts = $contacts;
|
||
$view->content->contact_types = $arr_contact_types;
|
||
$view->content->voip = Settings::get('voip_enabled') ? $voip : '';
|
||
$view->content->aro_groups = $aro_groups;
|
||
$view->content->admin_devices_grid = @$admin_devices_grid;
|
||
$view->content->engineer_devices_grid = @$engineer_devices_grid;
|
application/controllers/voip.php | ||
---|---|---|
<?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/
|
||
*
|
||
*/
|
||
|
||
/**
|
||
* VoIP controller.
|
||
* Accounts and calls are managed by lbilling from remote server.
|
||
*
|
||
* @see Billing
|
||
* @author Sevcik Roman
|
||
* @package Controller
|
||
*/
|
||
class VoIP_Controller extends Controller
|
||
{
|
||
/**
|
||
* Only check whether is VoIP enabled
|
||
*
|
||
* @author Michal Kliment
|
||
*/
|
||
public function __construct()
|
||
{
|
||
parent::__construct();
|
||
|
||
// voip is not enabled, quit
|
||
if (!Settings::get('voip_enabled'))
|
||
Controller::error(ACCESS);
|
||
}
|
||
|
||
/**
|
||
* Redirects to show all
|
||
*/
|
||
public function index()
|
||
{
|
||
url::redirect('voip/show_all');
|
||
}
|
||
|
||
/**
|
||
* Shows all VOIP
|
||
*
|
||
* @param type $limit_results
|
||
* @param string $order_by
|
||
* @param string $order_by_direction
|
||
* @param type $page_word
|
||
* @param type $page
|
||
*/
|
||
public function show_all(
|
||
$limit_results = 100, $order_by = 'user_id', $order_by_direction = 'asc',
|
||
$page_word = null, $page = 1)
|
||
{
|
||
if (!$this->acl_check_view('VoIP_Controller', 'voip'))
|
||
Controller::error(ACCESS);
|
||
|
||
// get new selector
|
||
if (is_numeric($this->input->post('record_per_page')))
|
||
$limit_results = (int) $this->input->post('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) != 'desc')
|
||
$order_by_direction = 'asc';
|
||
|
||
$model_voip_sip = new Voip_sip_Model();
|
||
$total_voip_sip = $model_voip_sip->count_all_records();
|
||
|
||
if (($sql_offset = ($page - 1) * $limit_results) > $total_voip_sip)
|
||
$sql_offset = 0;
|
||
|
||
$all_voip_sip = $model_voip_sip->get_all_records(
|
||
$sql_offset, (int) $limit_results, $order_by, $order_by_direction
|
||
);
|
||
|
||
$headline = __('VoIP');
|
||
|
||
$grid = new Grid('voip', $headline, array
|
||
(
|
||
'use_paginator' => true,
|
||
'use_selector' => true,
|
||
'current' => $limit_results,
|
||
'selector_increace' => 100,
|
||
'selector_min' => 100,
|
||
'selector_max_multiplier' => 10,
|
||
'base_url' => Config::get('lang') . '/voip/show_all/'
|
||
. $limit_results . '/' . $order_by . '/'
|
||
. $order_by_direction,
|
||
'uri_segment' => 'page',
|
||
'total_items' => $total_voip_sip,
|
||
'items_per_page' => $limit_results,
|
||
'style' => 'classic',
|
||
'order_by' => $order_by,
|
||
'order_by_direction' => $order_by_direction,
|
||
'limit_results' => $limit_results
|
||
));
|
||
|
||
$grid->add_new_button('voip_calls/show_all', __('List of all calls'));
|
||
|
||
$grid->callback_field('locked')
|
||
->label('State')
|
||
->order(false)
|
||
->callback(array($this, 'locked'))
|
||
->class('center');
|
||
|
||
$grid->order_link_field('user_id')
|
||
->link('voip/show', 'name')
|
||
->label('Number');
|
||
|
||
$grid->order_link_field('user_id')
|
||
->link('users/show', 'ufname')
|
||
->label('User');
|
||
|
||
$grid->order_link_field('member_id')
|
||
->link('users/show', 'mname')
|
||
->label('User');
|
||
|
||
$grid->callback_field('regseconds')
|
||
->label('')
|
||
->order(false)
|
||
->callback(array($this, 'regseconds'))
|
||
->class('center');
|
||
|
||
$grid->datasource($all_voip_sip);
|
||
$view = new View('main');
|
||
$view->title = $headline;
|
||
$view->breadcrumbs = $headline;
|
||
$view->content = $grid;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
* Show VOIP
|
||
*
|
||
* @param integer $user_id
|
||
*/
|
||
public function show($user_id = NULL)
|
||
{
|
||
if (!$user_id)
|
||
Controller::warning(PARAMETER);
|
||
|
||
$user = new User_Model($user_id);
|
||
|
||
if (!$user->id)
|
||
Controller::error(RECORD);
|
||
|
||
if (!$this->acl_check_view('VoIP_Controller', 'voip', $user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
$voip_sip = new Voip_sip_Model();
|
||
|
||
//check existence of number
|
||
$voip = $voip_sip->get_record_by_user_limited($user_id);
|
||
|
||
if ($voip->count() == 0)
|
||
Controller::error(RECORD);
|
||
|
||
$voip = $voip_sip->get_record_by_user($user_id);
|
||
|
||
if ($voip->count() == 0)
|
||
Controller::error(RECORD);
|
||
|
||
$sip_server = Settings::get('voip_sip_server', FALSE);
|
||
|
||
$voip = $voip_sip->get_record_by_user($user_id);
|
||
|
||
$voip = $voip->current();
|
||
$voicemail_model = new Voip_voicemail_user_Model();
|
||
$voicemail = $voicemail_model->where('customer_id', $voip->mailbox)->find();
|
||
|
||
$link_status = (($voip->regseconds - time()) > 1);
|
||
|
||
$billing = Billing::instance();
|
||
|
||
$has_driver = $billing->has_driver();
|
||
$b_account = $billing->get_account($user->member_id);
|
||
|
||
$void_account_enabled = $has_driver && ($b_account != null);
|
||
|
||
$links[] = html::anchor(
|
||
'voip/edit_voicemail/' . $voip->user_id, __('Edit voicemail')
|
||
);
|
||
|
||
if ($void_account_enabled)
|
||
{
|
||
$links[] = html::anchor(
|
||
'voip_calls/show_by_user/' . $user_id, __('List of calls')
|
||
);
|
||
}
|
||
|
||
$regseconds = ($voip->regseconds - time() < 0 ) ? '0' : $voip->regseconds - time();
|
||
|
||
$links = implode(' | ', $links);
|
||
|
||
$breadcrumbs = breadcrumbs::add()
|
||
->link('voip/show_all', 'VoIP')
|
||
->disable_translation()
|
||
->text($voip->name);
|
||
|
||
// prices of calls
|
||
$fixed_price = null;
|
||
$cellphone_price = null;
|
||
$voip_price = null;
|
||
|
||
if ($void_account_enabled)
|
||
{
|
||
if (Settings::get('voip_tariff_fixed'))
|
||
{
|
||
$fixed_price = $billing->get_price_of_minute_call(
|
||
$voip->name, Settings::get('voip_tariff_fixed')
|
||
);
|
||
}
|
||
|
||
if (Settings::get('voip_tariff_cellphone'))
|
||
{
|
||
$cellphone_price = $billing->get_price_of_minute_call(
|
||
$voip->name, Settings::get('voip_tariff_cellphone')
|
||
);
|
||
}
|
||
|
||
if (Settings::get('voip_tariff_voip'))
|
||
{
|
||
$voip_price = $billing->get_price_of_minute_call(
|
||
$voip->name, Settings::get('voip_tariff_voip')
|
||
);
|
||
}
|
||
}
|
||
|
||
$view = new View('main');
|
||
$view->title = __('Show VoIP account');
|
||
$view->breadcrumbs = $breadcrumbs->html();
|
||
$view->content = new View('voip/show');
|
||
$view->content->headline = __('Show VoIP');
|
||
$view->content->links = $links;
|
||
$view->content->voip = $voip;
|
||
$view->content->sip_server = $sip_server;
|
||
$view->content->link_status = $link_status;
|
||
$view->content->ipaddr = $voip->ipaddr;
|
||
$view->content->port = $voip->port;
|
||
$view->content->regseconds = $regseconds;
|
||
$view->content->voice_email = $voicemail->email;
|
||
$view->content->voice_status = $voicemail->active;
|
||
$view->content->fixed_price = $fixed_price;
|
||
$view->content->cellphone_price = $cellphone_price;
|
||
$view->content->voip_price = $voip_price;
|
||
$view->content->void_account_enabled = $void_account_enabled;
|
||
$view->render(true);
|
||
}
|
||
|
||
/**
|
||
* Changes password
|
||
*
|
||
* @param integer $user_id
|
||
*/
|
||
public function change_password($user_id = NULL)
|
||
{
|
||
if (!$user_id)
|
||
Controller::warning(PARAMETER);
|
||
|
||
$user = new User_Model($user_id);
|
||
|
||
if (!$user->id)
|
||
Controller::error(RECORD);
|
||
|
||
if (!$this->acl_check_edit('VoIP_Controller', 'voip_password', $user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
$voip = ORM::factory('voip_sip')->where('user_id', $user_id)->find();
|
||
|
||
if ($voip->id == null)
|
||
Controller::error(RECORD);
|
||
|
||
$form = new Forge('voip/change_password/' . $user_id);
|
||
|
||
$form->password('password')
|
||
->label(__('New password') . ':')
|
||
->rules('required|length[6,20]');
|
||
|
||
$form->password('confirm_password')
|
||
->label(__('Confirm new password') . ':')
|
||
->rules('required|length[6,20]')
|
||
->matches($form->password);
|
||
|
||
$form->submit('Change');
|
||
|
||
if ($form->validate())
|
||
{
|
||
$form_data = $form->as_array(FALSE);
|
||
|
||
$voip_sip = new Voip_sip_Model();
|
||
$voip = $voip_sip->where('user_id', $user_id)->find();
|
||
|
||
$user = ORM::factory('user')->where('id', $user_id)->find();
|
||
|
||
$username = text::cs_utf2ascii($user->name . ' ' . $user->surname);
|
||
|
||
$voip->callerid = $username . ' <' . $voip->name . '>';
|
||
$voip->secret = $form_data['password'];
|
||
|
||
if ($voip->save())
|
||
{
|
||
status::success('Password has been successfully changed.');
|
||
}
|
||
else
|
||
{
|
||
status::error('Error - cant change password.');
|
||
}
|
||
|
||
url::redirect('voip/change_password/' . $user_id);
|
||
}
|
||
else
|
||
{
|
||
$breadcrumbs = breadcrumbs::add()
|
||
->link('voip/show_all', 'VoIP',
|
||
$this->acl_check_view('VoIP_Controller', 'voip'))
|
||
->disable_translation()
|
||
->link('voip/show/' . $voip->user_id, $voip->name,
|
||
$this->acl_check_view(
|
||
'VoIP_Controller', 'voip', $user->member_id
|
||
)
|
||
)->enable_translation()
|
||
->text('Change password');
|
||
|
||
$view = new View('main');
|
||
$view->title = __('Change password');
|
||
$view->breadcrumbs = $breadcrumbs->html();
|
||
$view->content = new View('form');
|
||
$view->content->headline = __('Password for VoIP account');
|
||
$view->content->form = $form->html();
|
||
$view->render(TRUE);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Chenges voice mail password
|
||
*
|
||
* @param integer $user_id
|
||
*/
|
||
public function change_voicemail_password($user_id = NULL)
|
||
{
|
||
if (!isset($user_id))
|
||
Controller::warning(PARAMETER);
|
||
|
||
$user = new User_Model($user_id);
|
||
|
||
if (!$user->id)
|
||
Controller::error(RECORD);
|
||
|
||
if (!$this->acl_check_edit('VoIP_Controller', 'voip_password', $user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
$voip = ORM::factory('voip_sip')->where('user_id', $user_id)->find();
|
||
|
||
if (!$voip->id)
|
||
Controller::error(RECORD);
|
||
|
||
$voicemail_model = new Voip_voicemail_user_Model();
|
||
$voicemail = $voicemail_model->where('customer_id', $voip->mailbox)->find();
|
||
|
||
$form = new Forge('voip/change_voicemail_password/' . $user_id);
|
||
|
||
$form->password('password')
|
||
->label(__('New password') . ':')
|
||
->rules('required|length[4,4]|valid_digit');
|
||
|
||
$form->password('confirm_password')
|
||
->label(__('Confirm new password') . ':')
|
||
->rules('required|length[4,4]|valid_digit')
|
||
->matches($form->password);
|
||
|
||
$form->submit('submit')->value(__('Change'));
|
||
|
||
if ($form->validate())
|
||
{
|
||
$form_data = $form->as_array(FALSE);
|
||
|
||
$voip_sip = new Voip_sip_Model();
|
||
$voip = $voip_sip->where('user_id', $user_id)->find();
|
||
|
||
$voicemail_model = new Voip_voicemail_user_Model();
|
||
$voicemail = $voicemail_model->where('customer_id', $voip->mailbox)->find();
|
||
|
||
$voicemail->password = $form_data['password'];
|
||
|
||
if ($voicemail->save())
|
||
{
|
||
status::success('Password has been successfully changed.');
|
||
}
|
||
else
|
||
{
|
||
status::error('Error - cant change password.');
|
||
}
|
||
|
||
url::redirect('voip/change_voicemail_password/' . $user_id);
|
||
}
|
||
else
|
||
{
|
||
$breadcrumbs = breadcrumbs::add()
|
||
->link('voip/show_all', 'VoIP',
|
||
$this->acl_check_view('VoIP_Controller', 'voip'))
|
||
->disable_translation()
|
||
->link('voip/show/' . $voip->user_id, $voip->name,
|
||
$this->acl_check_view(
|
||
'VoIP_Controller', 'voip', $user->member_id
|
||
)
|
||
)->enable_translation()
|
||
->text('Change voicemail password');
|
||
|
||
$view = new View('main');
|
||
$view->title = __('Change voicemail password');
|
||
$view->breadcrumbs = $breadcrumbs->html();
|
||
$view->content = new View('form');
|
||
$view->content->headline = __('Voicemail password for VoIP account');
|
||
$view->content->form = $form->html();
|
||
$view->render(TRUE);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Edits voice mail
|
||
*
|
||
* @param integer $user_id
|
||
*/
|
||
public function edit_voicemail($user_id = NULL)
|
||
{
|
||
if (!isset($user_id))
|
||
Controller::warning(PARAMETER);
|
||
|
||
$user = new User_Model($user_id);
|
||
|
||
if (!$user->id)
|
||
Controller::error(RECORD);
|
||
|
||
|
||
if (!$this->acl_check_edit('VoIP_Controller', 'voip_password', $user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
$voip = ORM::factory('voip_sip')->where('user_id', $user_id)->find();
|
||
|
||
if ($voip->id == null)
|
||
Controller::error(RECORD);
|
||
|
||
$voicemail_model = new Voip_voicemail_user_Model();
|
||
$voicemail = $voicemail_model->where('customer_id', $voip->mailbox)->find();
|
||
|
||
$form = new Forge('voip/edit_voicemail/' . $user_id);
|
||
|
||
$form->dropdown('status')
|
||
->label(__('State'))
|
||
->options(array
|
||
(
|
||
'0' => __('Inactive'),
|
||
'1' => __('Active')
|
||
))->selected($voicemail->active);
|
||
|
||
$form->input('email')
|
||
->label(__('email') . ':')
|
||
->rules('length[6,50]|valid_email')
|
||
->value($voicemail->email);
|
||
|
||
$form->submit('Edit');
|
||
|
||
if ($form->validate())
|
||
{
|
||
$form_data = $form->as_array();
|
||
|
||
$voip_sip = new Voip_sip_Model();
|
||
$voip = $voip_sip->where('user_id', $user_id)->find();
|
||
|
||
$voicemail_model = new Voip_voicemail_user_Model();
|
||
$voicemail = $voicemail_model->where('customer_id', $voip->mailbox)->find();
|
||
|
||
$voicemail->email = $form_data['email'];
|
||
$voicemail->active = $form_data['status'];
|
||
|
||
if ($voicemail->save())
|
||
{
|
||
status::success('Voicemail has been successfully changed.');
|
||
}
|
||
else
|
||
{
|
||
status::error('Error - cant change voicemail.');
|
||
}
|
||
|
||
url::redirect('voip/edit_voicemail/' . $user_id);
|
||
}
|
||
else
|
||
{
|
||
$breadcrumbs = breadcrumbs::add()
|
||
->link('voip/show_all', 'VoIP',
|
||
$this->acl_check_view('VoIP_Controller', 'voip'))
|
||
->disable_translation()
|
||
->link('voip/show/' . $voip->user_id, $voip->name,
|
||
$this->acl_check_view(
|
||
'VoIP_Controller', 'voip', $user->member_id
|
||
)
|
||
)->enable_translation()
|
||
->text('Edit voicemail');
|
||
|
||
$view = new View('main');
|
||
$view->title = __('Edit voicemail');
|
||
$view->breadcrumbs = $breadcrumbs->html();
|
||
$view->content = new View('form');
|
||
$view->content->headline = __('Voicemail for VoIP account');
|
||
$view->content->form = $form->html();
|
||
$view->render(TRUE);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Changes member limit
|
||
*
|
||
* @param integer $member_id
|
||
*/
|
||
public function change_member_limit($member_id = NULL)
|
||
{
|
||
if (!isset($member_id))
|
||
Controller::warning(PARAMETER);
|
||
|
||
if (!is_numeric($member_id))
|
||
Controller::error(RECORD);
|
||
|
||
if (!$this->acl_check_edit('VoIP_Controller', 'voip_password', $member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
$member = new Member_Model($member_id);
|
||
|
||
if (!$member->id)
|
||
Controller::error(RECORD);
|
||
|
||
$billing = Billing::instance();
|
||
|
||
$has_driver = $billing->has_driver();
|
||
$b_account = $billing->get_account($member_id);
|
||
|
||
if (!$has_driver || ($b_account == null))
|
||
Controller::error(RECORD);
|
||
|
||
$form = new Forge('voip/change_member_limit/' . $member_id);
|
||
|
||
$form->input('limit')
|
||
->rules('length[1,6]|valid_digit')
|
||
->value($member->voip_billing_limit)
|
||
->callback(array($this, 'valid_limit'));
|
||
|
||
$form->submit('Change');
|
||
|
||
if ($form->validate())
|
||
{
|
||
$form_data = $form->as_array();
|
||
|
||
$member->voip_billing_limit = $form_data['limit'];
|
||
|
||
if ($member->save())
|
||
{
|
||
status::success('Limit has been successfully changed.');
|
||
}
|
||
else
|
||
{
|
||
status::error('Error - cant change limit.');
|
||
}
|
||
|
||
url::redirect('voip/change_member_limit/' . $member_id);
|
||
}
|
||
else
|
||
{
|
||
// breadcrumbs navigation
|
||
$breadcrumbs = breadcrumbs::add()
|
||
->link('members/show_all', 'Members',
|
||
$this->acl_check_view('Members_Controller', 'members'))
|
||
->disable_translation()
|
||
->link('members/show/'.$member->id,
|
||
"ID $member->id - $member->name",
|
||
$this->acl_check_view(
|
||
'Members_Controller', 'members', $member->id
|
||
)
|
||
)
|
||
->enable_translation()
|
||
->text('Change member limit');
|
||
|
||
$view = new View('main');
|
||
$view->title = __('Change member limit');
|
||
$view->breadcrumbs = $breadcrumbs->html();
|
||
$view->content = new View('form');
|
||
$view->content->headline = 'VoIP' . __('Limit of member');
|
||
$view->content->form = $form->html();
|
||
$view->render(TRUE);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Adds VoIP for user
|
||
*
|
||
* @param integer $user_id
|
||
*/
|
||
public function add($user_id = NULL)
|
||
{
|
||
if (!isset($user_id))
|
||
Controller::warning(PARAMETER);
|
||
|
||
$user = new User_Model($user_id);
|
||
|
||
if (!$user->id)
|
||
Controller::error(RECORD);
|
||
|
||
if (!$this->acl_check_new('VoIP_Controller', 'voip', $user->member_id))
|
||
Controller::error(ACCESS);
|
||
|
||
if ($this->input->post('ranges') != NULL)
|
||
{
|
||
$number = $this->input->post('ranges');
|
||
|
||
$user = ORM::factory('user')->where('id', $user_id)->find();
|
||
|
||
$username = text::cs_utf2ascii($user->name . ' ' . $user->surname);
|
||
|
||
$voip_new = new Voip_sip_Model();
|
||
$voip_new->name = $number;
|
||
$voip_new->user_id = $user_id;
|
||
$voip_new->callerid = $username . ' <' . $number . '>';
|
||
$voip_new->mailbox = $number;
|
||
$voip_new->secret = security::generate_password();
|
||
$voip_new->username = $number;
|
||
$voip_new->save();
|
||
|
||
// get email
|
||
$emails = $user->get_user_emails($user->id);
|
||
$email = '';
|
||
|
||
if ($emails != false && $emails->current())
|
||
{
|
||
$email = $emails->current()->email;
|
||
}
|
||
|
||
$voicemail = new Voip_voicemail_user_Model();
|
||
$voicemail->customer_id = $number;
|
||
$voicemail->mailbox = $number;
|
||
$voicemail->password = security::generate_numeric_password(4);
|
||
$voicemail->fullname = $username;
|
||
$voicemail->email = $email;
|
||
$voicemail->save();
|
||
}
|
||
|
||
$voip_sip = new Voip_sip_Model();
|
||
|
||
//check existence of number
|
||
$voip = $voip_sip->get_record_by_user_limited($user_id);
|
||
|
||
if ($voip->count() != 0)
|
||
url::redirect('voip/show/' . $user_id);
|
||
|
||
$config_model = new Config_Model();
|
||
|
||
if ($config_model->check_exist_variable('voip_number_interval'))
|
||
{
|
||
$ranges = array();
|
||
$used_numbers = array();
|
||
$ranges = explode('-', $config_model->get_value_from_name('voip_number_interval'));
|
||
|
||
$exclude_numbers = explode(';', $config_model->get_value_from_name('voip_number_exclude'));
|
||
|
||
$exist_numbers = $voip_sip->select('name')->find_all();
|
||
|
||
$i = 0;
|
||
foreach ($exist_numbers as $exist_number)
|
||
{
|
||
$used_numbers[$i] = $exist_number->name;
|
||
$i++;
|
||
}
|
||
|
||
for ($i = $ranges[0]; $i <= $ranges[1]; $i++)
|
||
{
|
||
if (!in_array($i, $used_numbers) && !in_array($i, $exclude_numbers))
|
||
$selection[$i] = $i;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$selection[0] = '';
|
||
}
|
||
|
||
$ranges = form::dropdown('ranges', $selection, 'standard');
|
||
|
||
// breadcrumbs navigation
|
||
$breadcrumbs = breadcrumbs::add()
|
||
->link('members/show_all', 'Members',
|
||
$this->acl_check_view('Members_Controller', 'members'))
|
||
->disable_translation()
|
||
->link('members/show/'.$user->member->id,
|
||
'ID ' . $user->member->id . ' - ' . $user->member->name,
|
||
$this->acl_check_view(
|
||
'Members_Controller', 'members', $user->member->id
|
||
)
|
||
)
|
||
->enable_translation()
|
||
->text('Add VoIP account');
|
||
|
||
$view = new View('main');
|
||
$view->title = __('Add VoIP account');
|
||
$view->breadcrumbs = $breadcrumbs->html();
|
||
$view->content = new View('voip/add');
|
||
$view->content->user_id = $user_id;
|
||
$view->content->ranges = $ranges;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////////////////////
|
||
/// Callbacks /////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////
|
||
|
||
/**
|
||
* Function validates amount of limit.
|
||
*
|
||
* @param object $input
|
||
*/
|
||
public function valid_limit($input = NULL)
|
||
{
|
||
// validators cannot be accessed
|
||
if (empty($input) || !is_object($input))
|
||
{
|
||
self::error(PAGE);
|
||
}
|
||
|
||
if ($input->value < 0)
|
||
{
|
||
$input->add_error('required', __('Error - amount has to be positive.'));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Locked state
|
||
*
|
||
* @param object $item
|
||
* @param string $name
|
||
*/
|
||
protected static function locked($item, $name)
|
||
{
|
||
if ($item->locked == 1)
|
||
{
|
||
echo html::image(array
|
||
(
|
||
'src' => resource::state('locked'),
|
||
'alt' => __('Account locked'),
|
||
'title' => __('Account locked')
|
||
));
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Phone registration status
|
||
*
|
||
* @param object $item
|
||
* @param string $name
|
||
*/
|
||
protected static function regseconds($item, $name)
|
||
{
|
||
if (( $item->regseconds - time()) > 1)
|
||
{
|
||
echo html::image(array
|
||
(
|
||
'src' => resource::state('active'),
|
||
'alt' => __('Phone registration status') . ' - ' . __('Registered'),
|
||
'title' => __('Phone registration status') . ' - ' . __('Registered')
|
||
));
|
||
}
|
||
else
|
||
{
|
||
echo html::image(array
|
||
(
|
||
'src' => resource::state('inactive'),
|
||
'alt' => __('Phone registration status') . ' - ' . __('Not registered'),
|
||
'title' => __('Phone registration status') . ' - ' . __('Not registered')
|
||
));
|
||
}
|
||
}
|
||
|
||
}
|
||
|
application/controllers/voip_calls.php | ||
---|---|---|
<?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/
|
||
*
|
||
*/
|
||
|
||
/**
|
||
* VoIP controller for calls.
|
Také k dispozici: Unified diff
refs #1135: lBilling, voip, voip sip deleted. All relations for this controllers and models deleted.