Projekt

Obecné

Profil

<?php defined('SYSPATH') or die('No direct script access.');
/*
*/

/**
* Phone_invoices_Controller managing phone invoices.
*
* @author Ondřej Fibich
*/
class Phone_invoices_Controller extends Controller_Application
{

/**
* Fuction checks access rights
* Return true if user with $login may view own $axo_section
* in this controller else return false
* @see Phone_invoices_Controller::user_field
*
* @param $axo_value object to view
* @param string $login
* @staticvar gacl $gacl_class
* @return boolean returns true if member has enough access rights
*/
private static function _acl_check_view($axo_value, $login)
{
static $gacl_class = NULL;

if ($gacl_class == NULL)
{
require_once(APPPATH.'vendors/phpgacl/gacl.class.php');
$gacl_class = new gacl();
}

return !empty($login) && $gacl_class->acl_check(
'freenetis', 'view_own', 'all',
$login, 'Phone_invoices_Controller', $axo_value
);
}

/**
* Index of controller
* Redirects to show_all
*/
public function index()
{
url::redirect(url_lang::base() . 'phone_invoices/show_all');
}

/**
* Imports invoice and save it to the database.
* Tries to figured out which services was private and which was not.
*/
public function import()
{
if (! $this->acl_check_new('Phone_invoices_Controller', 'invoices'))
{
Controller::error(ACCESS);
}

$form = new Forge(url::base().url::current(true), '', 'POST', array('id' => 'phone_invoices_form'));
$form->textarea('parse')->label(url_lang::lang('texts.Text to parse') . ':')->rules('required');
$form->checkbox('test_number_count_enabled')->checked(TRUE)->value('1')
->label(url_lang::lang('texts.Enable integrity test (all numbers in invoice has to be in extended statement)'));
$form->submit(url_lang::lang('texts.Parse'))->id('phone_invoices_sumit');

if ($form->validate())
{
try
{
$integrity_test = ($form->test_number_count_enabled->value == '1');
$data = Parser_Vodafone_Invoice::parse($form->parse->value, $integrity_test);

$phone_invoice = new Phone_invoice_Model();
$phone_invoice->date_of_issuance = $data->date_of_issuance->format('Y-m-d');
$phone_invoice->billing_period_from = $data->billing_period_from->format('Y-m-d');
$phone_invoice->billing_period_to = $data->billing_period_to->format('Y-m-d');
$phone_invoice->variable_symbol = $data->variable_symbol;
$phone_invoice->specific_symbol = $data->specific_symbol;
$phone_invoice->total_price = $data->total_price;
$phone_invoice->tax = $data->dph;
$phone_invoice->tax_rate = $data->dph_rate;

// search if invoice is already in database
$phone_invoice->is_unique();
if (!$phone_invoice->is_unique())
{
throw new Exception(url_lang::lang('texts.Invoice is already in database'));
}

self::_set_invoice_data($data, $phone_invoice);

// redirect to edit
url::redirect(url_lang::base() . '/phone_invoices/show/' . $phone_invoice->id . '/');
}
catch (Exception $e)
{
$form->parse->add_error('requied', nl2br($e->getMessage()));
}
}

$view = new View('main');
$view->title = url_lang::lang('texts.Import invoice');
$view->content = new View('phone_invoices/main');
$view->content->content = new View('phone_invoices/import');
$view->content->content->form = $form->html();
$view->render(TRUE);
}

/**
* Shows all invoices.
* Enable delete invoice.
*/
public function show_all()
{
if (! $this->acl_check_view('Phone_invoices_Controller', 'invoices'))
{
Controller::error(ACCESS);
}
$phone_invoice_model = new Phone_invoice_Model();

$query = $phone_invoice_model->get_all_phone_invoices();
$grid = new Grid(url::base().url::current(true), null, array(
'use_paginator' => false,
'use_selector' => false
));

$grid->field('id')->label(url_lang::lang('texts.ID'));
$grid->field('date_of_issuance')->label(url_lang::lang('texts.Date of issue'));
$grid->field('billing_period_from')->label(url_lang::lang('texts.Billing period from'));
$grid->field('billing_period_to')->label(url_lang::lang('texts.Billing period to'));
$grid->field('variable_symbol')->label(url_lang::lang('texts.Variable symbol'));
$grid->field('specific_symbol')->label(url_lang::lang('texts.Specific symbol'));
$grid->callback_field('price')->label(url_lang::lang('texts.Price vat'))
->callback('callback::phone_price_field');

$grid->callback_field('edit')->label(url_lang::lang('texts.Edit'))
->callback('callback::phone_invoice_edit_field');

$grid->callback_field('delete')->label(url_lang::lang('texts.Delete'))
->callback('callback::phone_invoice_delete_field');

$grid->datasource($query);

$this->app_view->title = url_lang::lang('texts.Show all invoices');
$this->app_view->content = new View('phone_invoices/main');
$this->app_view->content->content = new View('phone_invoices/show_all');
$this->app_view->content->content->grid = $grid;
}

/**
* Displays detail of invoice and list of phone numbers on invoice
* Enable assign user to each detail
* @param integer $phone_invoice_id
* @param integer $phone_invoice_user_id
*/
public function show($phone_invoice_id = -1, $phone_invoice_user_id = -1)
{
if (! $this->acl_check_view('Phone_invoices_Controller', 'details'))
{
Controller::error(ACCESS);
}

$phone_invoice = new Phone_invoice_Model($phone_invoice_id);
if (!$phone_invoice_id || !$phone_invoice->id)
{
url::redirect(url_lang::base().'phone_invoices');
}

$form = NULL;
if ($this->acl_check_edit('Phone_invoices_Controller', 'details'))
{
if (intval($phone_invoice_user_id) >= 0)
{
$phone_inv_user_model = new Phone_invoice_user_Model($phone_invoice_user_id);
$user = new User_Model();
$users = $user->get_all_user_names();
$users_data = array();

if (!$phone_inv_user_model->id)
{
Controller::error(RECORD);
}

foreach ($users as $u)
{
$users_data[$u->id] = $u->username;
}

$form = new Forge(url::base().url::current(true), '', 'POST', array('id' => 'phone_invoices_form'));
$form->dropdown('user_id')->label(url_lang::lang('texts.Phone') .' '. $phone_inv_user_model->phone_number)
->options($users_data)->selected($phone_inv_user_model->user_id)->rules('required');

if ($form->validate())
{
$phone_inv_user_model->user_id = $form->user_id->value;
$phone_inv_user_model->save();

$this->session->set_flash('message', 'User has been assigned');
url::redirect(url_lang::base().'phone_invoices/show/'.$phone_invoice_id);
}

$form->submit(url_lang::lang('texts.Save'));
}
}

$grid = new Grid(url_lang::base().'phone_invoices/show', NULL, array(
'use_paginator' => false,
'use_selector' => false
));

$phone_inv_user_model = new Phone_invoice_user_Model();
$query = $phone_inv_user_model->get_all_invoice_users($phone_invoice->id);

$grid->field('id')->label(url_lang::lang('texts.ID'));
$grid->field('phone_number')->label(url_lang::lang('texts.Phone number'));
$grid->callback_field('user')->label(url_lang::lang('texts.User'))
->callback('Phone_invoices_Controller::user_field');
$grid->callback_field('price')->label(url_lang::lang('texts.Price out of tax'))
->callback('callback::phone_price_field');
$grid->action_field('id')->label(url_lang::lang('texts.Show details'))
->url(url_lang::base().'phone_invoices/show_details')
->action(url_lang::lang('texts.Show'));

if ($this->acl_check_edit('Phone_invoices_Controller', 'details') &&
$phone_invoice->locked == 0)
{
$grid->action_field('id')->label(url_lang::lang('texts.Assign user'))
->url(url_lang::base().'phone_invoices/show/'.$phone_invoice->id)
->action(url_lang::lang('texts.Assign'));
}

if ($this->acl_check_delete('Phone_invoices_Controller', 'details') &&
$phone_invoice->locked == 0)
{
$grid->action_field('id')->label(url_lang::lang('texts.Delete'))
->url(url_lang::base().'phone_invoices/delete_user_invoice')
->action(url_lang::lang('texts.Delete'))->class('a_delete');
}

$grid->datasource($query);


$view = new View('main');
$view->title = url_lang::lang('texts.Detail of invoice');
$view->content = new View('phone_invoices/main');
$view->content->content = new View('phone_invoices/show');
$view->content->content->phone_invoice = $phone_invoice;
$view->content->content->total_price = $phone_invoice->total_price + $phone_invoice->tax;
$view->content->content->grid = $grid;

if ($form != NULL)
{
$view->content->content->form = $form->html();
}
$view->render(TRUE);
}

/**
* Deletes invoice
* @param integer $phone_invoice_id
*/
public function delete($phone_invoice_id = 0)
{
if (! $this->acl_check_delete('Phone_invoices_Controller', 'invoices'))
{
Controller::error(ACCESS);
}

if (intval($phone_invoice_id) <= 0)
{
Controller::warning(PARAMETER);
}
$phone_invoice = new Phone_invoice_Model($phone_invoice_id);

if (!$phone_invoice->id)
{
Controller::error(RECORD);
}

$phone_invoice->delete();
$this->session->set_flash('message', url_lang::lang('texts.Phone invoice has been deleted'));
url::redirect(url_lang::base().'phone_invoices');
}

/**
* Deletes user phone invoice
* @param integer $phone_invoice_id
* @param integer $phone_user_invoice_id
*/
public function delete_user_invoice($phone_user_invoice_id)
{
if (! $this->acl_check_delete('Phone_invoices_Controller', 'details'))
{
Controller::error(ACCESS);
}

if (intval($phone_user_invoice_id) <= 0)
{
Controller::warning(PARAMETER);
}

$phone_user_invoice = new Phone_invoice_user_Model($phone_user_invoice_id);

if (!$phone_user_invoice->id)
{
Controller::error(RECORD);
}
$phone_invoice_id = $phone_user_invoice->phone_invoice_id;
$phone_user_invoice->delete();
$this->session->set_flash('message', url_lang::lang('texts.Users phone invoice has been deleted'));
url::redirect(url_lang::base().'phone_invoices/show/'.$phone_invoice_id);
}

/**
* (Un)Lock invoice for editing
* @param integer $phone_invoice_id
*/
public function lock_set($phone_invoice_id = 0)
{
if (! $this->acl_check_new('Phone_invoices_Controller', 'lock'))
{
Controller::error(ACCESS);
}

if (intval($phone_invoice_id) <= 0)
{
Controller::warning(PARAMETER);
}

$phone_invoice = new Phone_invoice_Model($phone_invoice_id);

if (!$phone_invoice->id)
{
Controller::error(RECORD);
}

$phone_invoice->locked = ! $phone_invoice->locked;
$phone_invoice->save();
$this->session->set_flash('message', url_lang::lang('texts.Phone invoice has been') . ' ' .
url_lang::lang('texts.'. (! $phone_invoice->locked ? 'un' : '') . 'locked'));
url::redirect(url_lang::base().'phone_invoices/show/'.$phone_invoice_id);
}

/**
* Sends warning to users which numbers are on invoice.
* @see Mail_messages_Model
* @param integer $phone_invoice_id
*/
public function post_mail_warning($phone_invoice_id)
{
if (! $this->acl_check_new('Phone_invoices_Controller', 'mail_warning'))
{
Controller::error(ACCESS);
}

if (intval($phone_invoice_id) <= 0)
{
Controller::warning(PARAMETER);
}

$phone_invoice_model = new Phone_invoice_Model($phone_invoice_id);

if (!$phone_invoice_model->id)
{
Controller::error(RECORD);
}

$phone_invoice_user_model = new Phone_invoice_user_Model();
$phone_invoice_users = $phone_invoice_user_model->get_all_invoice_users($phone_invoice_model->id);

$mail_messsage_model = new Mail_message_Model();

foreach ($phone_invoice_users as $phone_invoice_user)
{
if ($phone_invoice_user->user_id == 0)
{
continue;
}

$mail_messsage_model->from_id = $this->session->get('user_id');
$mail_messsage_model->to_id = $phone_invoice_user->user_id;
$mail_messsage_model->time = date('Y-m-d H:i:s');
$mail_messsage_model->from_deleted = 1;// user to can delete it
$mail_messsage_model->subject = mail_message::format(
'phone_invoice_warning_subject', array(
$phone_invoice_user->phone_number,
$phone_invoice_model->billing_period_from,
$phone_invoice_model->billing_period_to
));
$mail_messsage_model->body = mail_message::format(
'phone_invoice_warning', array(
$phone_invoice_user->phone_number,
url_lang::base() . 'phone_invoices/show_by_user/' . $phone_invoice_user->user_id
));
$mail_messsage_model->save();
$mail_messsage_model->clear();
}

$this->session->set_flash('message', url_lang::lang('texts.Users has been warned about invoice.'));
url::redirect(url_lang::base().'phone_invoices/show/'.$phone_invoice_id);
}

/**
* Displays users phone invoices
* @param integer $user_id
*/
public function show_by_user($user_id = 0)
{
if (!is_numeric($user_id) || $user_id <= 0)
{
Controller::warning(PARAMETER);
}

$user = new User_Model($user_id);

if (!$user->id)
{
Controller::error(RECORD);
}

if (! $this->acl_check_view('Phone_invoices_Controller', 'user_invoices', $user->member_id))
{
Controller::error(ACCESS);
}

$phone_inv_user_model = new Phone_invoice_user_Model();
$users_inv = $phone_inv_user_model->get_phone_invoices_of_user($user_id);

$grid = new Grid(url::base().url::current(true), null, array(
'use_paginator' => false,
'use_selector' => false
));

$grid->field('id')->label(url_lang::lang('texts.ID'));
$grid->field('number')->label(url_lang::lang('texts.Number'));
$grid->field('billing_period_from')->label(url_lang::lang('texts.Billing period from'));
$grid->field('billing_period_to')->label(url_lang::lang('texts.Billing period to'));
$grid->callback_field('price_company')->label(url_lang::lang('texts.Company'))
->callback('callback::phone_price_field');
$grid->callback_field('price_private')->label(url_lang::lang('texts.Private'))
->callback('callback::phone_price_field');
if ($this->acl_check_view('Phone_invoices_Controller', 'dumps', $user->member_id))
{
$grid->action_field('id')->label(url_lang::lang('texts.Show'))
->url(url_lang::base().'phone_invoices/show_details')->action(url_lang::lang('texts.Show'));
}

if ($this->acl_check_edit('Phone_invoices_Controller', 'dumps', $user->member_id))
{
$grid->callback_field('edit')->label(url_lang::lang('texts.Edit'))
->callback('callback::phone_invoice_user_edit_field');
}

$grid->datasource($users_inv);

$view = new View('main');
$view->title = url_lang::lang('texts.Phone invoices of user');
$view->content = new View('phone_invoices/show_by_user');
$view->content->grid = $grid;
$view->content->total_prices = $phone_inv_user_model->get_total_prices($user_id);
$view->render(TRUE);
}

/**
* Show details of phone number on invoice.
* Show sum of price of each service.
* Show payment which has to be done by user.
* Show detail extract of services, enable to set or unset private services
* @param integer $phone_invoice_user_id
* @param string $detail_of
*/
public function show_details($phone_invoice_user_id = 0, $detail_of = 'calls')
{
$detail_of_arrgs = array(
'calls', 'fixed_calls', 'pays', 'connections', 'pays', 'vpn_calls',
'sms_messages', 'roaming_sms_messages'
);

$detail_of_arrgs_intelligent_search = array(
'calls', 'fixed_calls', 'sms_messages', 'roaming_sms_messages'
);

if (!$phone_invoice_user_id || !is_numeric($phone_invoice_user_id))
{
Controller::warning(PARAMETER);
}

if (array_search($detail_of, $detail_of_arrgs) === false)
{
url::redirect(url_lang::base().'phone_invoices/show_details/'.$phone_invoice_user_id.'/calls');
}

$phone_inv_user_model = new Phone_invoice_user_Model($phone_invoice_user_id);

if (!$phone_inv_user_model->id)
{
Controller::error(RECORD);
}

$user = new User_Model($phone_inv_user_model->user_id);

if (! $this->acl_check_view('Phone_invoices_Controller', 'dumps') &&
! $this->acl_check_view('Phone_invoices_Controller', 'dumps', $user->member_id))
{
Controller::error(ACCESS);
}

$phone_inv_model = new Phone_invoice_Model($phone_inv_user_model->phone_invoice_id);

$grid = new Grid(url_lang::base().'phone_invoices/show_details', NULL, array(
'use_paginator' => false,
'use_selector' => false
));

$grid->field('id')->label(url_lang::lang('texts.ID'));
$grid->field('datetime')->label(url_lang::lang('texts.Date'));

$heading = null;

switch ($detail_of)
{
case 'calls':
$call = new Phone_call_Model();

$grid->callback_field('number')->label(url_lang::lang('texts.Called number'))
->callback('callback::phone_number_field');

if ($this->acl_check_edit('Phone_invoices_Controller', 'dumps') ||
($phone_inv_model->locked == 0 &&
$this->acl_check_edit('Phone_invoices_Controller', 'dumps', $user->member_id)))
{
if ($_POST && count($_POST))
{
$call->set_calls_private($phone_inv_user_model->id, @$_POST['private']);
}

$grid->form_field('private')->label(url_lang::lang('texts.Private'))
->type('checkbox')->order(false)->callback('callback::phone_private_checkbox');
}
else
{
$grid->callback_field('private')->label(url_lang::lang('texts.Private'))
->callback('callback::phone_invoice_private_field_locked');
}
$grid->field('length')->label(url_lang::lang('texts.Length'));
$grid->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid->callback_field('period')->label(url_lang::lang('texts.Period'))
->callback('callback::phone_period_field');

$grid->datasource($call->get_calls_from($phone_inv_user_model->id));

$heading = url_lang::lang('texts.Calls');
break;
case 'fixed_calls':
$call = new Phone_fixed_call_Model();

$grid->callback_field('number')->label(url_lang::lang('texts.Called number'))
->callback('callback::phone_number_field');

if ($this->acl_check_edit('Phone_invoices_Controller', 'dumps') ||
($phone_inv_model->locked == 0 &&
$this->acl_check_edit('Phone_invoices_Controller', 'dumps', $user->member_id)))
{
if ($_POST && count($_POST))
{
$call->set_fixed_calls_private($phone_inv_user_model->id, @$_POST['private']);
}

$grid->form_field('private')->label(url_lang::lang('texts.Private'))
->type('checkbox')->order(false)->callback('callback::phone_private_checkbox');
}
else
{
$grid->callback_field('private')->label(url_lang::lang('texts.Private'))
->callback('callback::phone_invoice_private_field_locked');
}

$grid->field('length')->label(url_lang::lang('texts.Length'));
$grid->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid->callback_field('period')->label(url_lang::lang('texts.Period'))
->callback('callback::phone_period_field');
$grid->field('destiny')->label(url_lang::lang('texts.Destination'));

$grid->datasource($call->get_fixed_calls_from($phone_inv_user_model->id));

$heading = url_lang::lang('texts.Fixed calls');
break;
case 'vpn_calls':
$call = new Phone_vpn_call_Model();

$grid->callback_field('number')->label(url_lang::lang('texts.Called number'))
->callback('callback::phone_number_field');

if ($this->acl_check_edit('Phone_invoices_Controller', 'dumps') ||
($phone_inv_model->locked == 0 &&
$this->acl_check_edit('Phone_invoices_Controller', 'dumps', $user->member_id)))
{
if ($_POST && count($_POST))
{
$call->set_vpn_calls_private($phone_inv_user_model->id, @$_POST['private']);
}

$grid->form_field('private')->label(url_lang::lang('texts.Private'))
->type('checkbox')->order(false)->callback('callback::phone_private_checkbox');
}
else
{
$grid->callback_field('private')->label(url_lang::lang('texts.Private'))
->callback('callback::phone_invoice_private_field_locked');
}
$grid->field('length')->label(url_lang::lang('texts.Length'));
$grid->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid->callback_field('period')->label(url_lang::lang('texts.Period'))
->callback('callback::phone_period_field');
$grid->field('group')->label(url_lang::lang('texts.Group'));

$grid->datasource($call->get_vpn_calls_from($phone_inv_user_model->id));

$heading = url_lang::lang('texts.VPN calls');
break;
case 'sms_messages':
$sms = new Phone_sms_message_Model();

$grid->callback_field('number')->label(url_lang::lang('texts.Number'))
->callback('callback::phone_number_field');

if ($this->acl_check_edit('Phone_invoices_Controller', 'dumps') ||
($phone_inv_model->locked == 0 &&
$this->acl_check_edit('Phone_invoices_Controller', 'dumps', $user->member_id)))
{
if ($_POST && count($_POST))
{
$sms->set_sms_mesages_private($phone_inv_user_model->id, @$_POST['private']);
}

$grid->form_field('private')->label(url_lang::lang('texts.Private'))
->type('checkbox')->order(false)->callback('callback::phone_private_checkbox');
}
else
{
$grid->callback_field('private')->label(url_lang::lang('texts.Private'))
->callback('callback::phone_invoice_private_field_locked');
}

$grid->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid->callback_field('period')->label(url_lang::lang('texts.Period'))
->callback('callback::phone_period_field');
$grid->field('description')->label(url_lang::lang('texts.Description'));

$grid->datasource($sms->get_sms_mesages_from($phone_inv_user_model->id));

$heading = url_lang::lang('texts.SMS messages');
break;
case 'roaming_sms_messages':
$sms = new Phone_roaming_sms_message_Model();

$grid->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid->field('roaming_zone')->label(url_lang::lang('texts.Roaming zone'));

if ($this->acl_check_edit('Phone_invoices_Controller', 'dumps') ||
($phone_inv_model->locked == 0 &&
$this->acl_check_edit('Phone_invoices_Controller', 'dumps', $user->member_id)))
{
if ($_POST && count($_POST))
{
$sms->set_roaming_sms_messages_private($phone_inv_user_model->id, @$_POST['private']);
}

$grid->form_field('private')->label(url_lang::lang('texts.Private'))
->type('checkbox')->order(false);
}
else
{
$grid->callback_field('private')->label(url_lang::lang('texts.Private'))
->callback('callback::phone_invoice_private_field_locked');
}
$grid->datasource($sms->get_roaming_sms_messages_from($phone_inv_user_model->id));

$heading = url_lang::lang('texts.SMS messages');
break;
case 'pays':
$pay = new Phone_pay_Model();

$grid->callback_field('number')->label(url_lang::lang('texts.Number'))
->callback('callback::phone_number_field');
$grid->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid->field('description')->label(url_lang::lang('texts.Description'));

if ($this->acl_check_edit('Phone_invoices_Controller', 'dumps') ||
($phone_inv_model->locked == 0 &&
$this->acl_check_edit('Phone_invoices_Controller', 'dumps', $user->member_id)))
{
if ($_POST && count($_POST))
{
$pay->set_pays_private($phone_inv_user_model->id, @$_POST['private']);
}

$grid->form_field('private')->label(url_lang::lang('texts.Private'))
->type('checkbox')->order(false)->callback('callback::phone_private_checkbox');
}
else
{
$grid->callback_field('private')->label(url_lang::lang('texts.Private'))
->callback('callback::phone_invoice_private_field_locked');
}

$grid->datasource($pay->get_pays_from($phone_inv_user_model->id));

$heading = url_lang::lang('texts.Pays');
break;
case 'connections':
$conn = new Phone_connection_Model();

$grid->field('transfered')->label(url_lang::lang('texts.Transfered'));
$grid->callback_field('period')->label(url_lang::lang('texts.Period'))
->callback('callback::phone_period_field');
$grid->field('apn')->label(url_lang::lang('texts.APN'));
$grid->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');

if ($this->acl_check_edit('Phone_invoices_Controller', 'dumps') ||
($phone_inv_model->locked == 0 &&
$this->acl_check_edit('Phone_invoices_Controller', 'dumps', $user->member_id)))
{
if ($_POST && count($_POST))
{
$conn->set_connections_private($phone_inv_user_model->id, @$_POST['private']);
}

$grid->form_field('private')->label(url_lang::lang('texts.Private'))
->type('checkbox')->order(false);
}
else
{
$grid->callback_field('private')->label(url_lang::lang('texts.Private'))
->callback('callback::phone_invoice_private_field_locked');
}

$grid->datasource($conn->get_connections_from($phone_inv_user_model->id));

$heading = url_lang::lang('texts.Connections');
break;
}

$prices = $phone_inv_user_model->get_prices();

$price_private = $prices->phone_calls_private +
$prices->phone_fixed_calls_private +
$prices->phone_vpn_calls_private +
$prices->phone_connections_private +
$prices->phone_sms_messages_private +
$prices->phone_roaming_sms_messages_private +
$prices->phone_pays_private;

$price_company = $prices->phone_calls_company +
$prices->phone_fixed_calls_company +
$prices->phone_vpn_calls_company +
$prices->phone_connections_company +
$prices->phone_sms_messages_company +
$prices->phone_roaming_sms_messages_company +
$prices->phone_pays_company;

$phone_invoice = new Phone_invoice_Model($phone_inv_user_model->phone_invoice_id);
$user = new User_Model($phone_inv_user_model->user_id);
$price = round($price_private + ($price_private * $phone_invoice->tax_rate / 100), 2);
$view = new View('main');
$view->title = url_lang::lang('texts.Detail of invoice');

if (! $this->acl_check_view('Phone_invoices_Controller', 'dumps'))
{
$view->content = new View('phone_invoices/show_details');
$view->content->phone_invoice = $phone_inv_model;
$view->content->phone_invoice_user = $phone_inv_user_model;
$view->content->grid = $grid;
$view->content->heading = $heading;
$view->content->tax_rate = $phone_invoice->tax_rate;
$view->content->price = $price;
$view->content->prices = $prices;
$view->content->price_company = $price_company;
$view->content->price_private = $price_private;
$view->content->user = $user;
$view->content->detail_of = $detail_of;
$view->content->intelligent_select_on = array_search(
$detail_of, $detail_of_arrgs_intelligent_search
) !== false;
}
else
{
$view->content = new View('phone_invoices/main');
$view->content->content = new View('phone_invoices/show_details');
$view->content->content->phone_invoice = $phone_inv_model;
$view->content->content->phone_invoice_user = $phone_inv_user_model;
$view->content->content->grid = $grid;
$view->content->content->heading = $heading;
$view->content->content->tax_rate = $phone_invoice->tax_rate;
$view->content->content->price = $price;
$view->content->content->prices = $prices;
$view->content->content->price_company = $price_company;
$view->content->content->price_private = $price_private;
$view->content->content->user = $user;
$view->content->content->detail_of = $detail_of;
$view->content->content->intelligent_select_on = array_search(
$detail_of, $detail_of_arrgs_intelligent_search
) !== false;
}

$view->render(TRUE);
}

/**
* Show history between user and number.
* Shows SMS, Calls, Fixed calls
* @param integer $user_id
* @param string $number
* @param integer $phone_invoice_user_id
*/
public function show_history($user_id, $number, $phone_invoice_user_id)
{
if (!is_numeric($user_id) || empty($number) || !is_numeric($phone_invoice_user_id))
{
Controller::warning(PARAMETER);
}

$user = new User_Model($user_id);
$phone_invoice_user = new Phone_invoice_user_Model($phone_invoice_user_id);

if (!$user->id || !$phone_invoice_user->id)
{
Controller::error(RECORD);
}

if (! $this->acl_check_view('Phone_invoices_Controller', 'dumps') &&
! $this->acl_check_view('Phone_invoices_Controller', 'dumps', $user->member_id))
{
Controller::error(ACCESS);
}

// models for quering data
$calls_model = new Phone_call_Model();
$fixed_calls_model = new Phone_fixed_call_Model();
$sms_model = new Phone_sms_message_Model();

// call grid
$grid_calls = new Grid(url_lang::base().'phone_invoices/show_history', NULL, array(
'use_paginator' => false,
'use_selector' => false
));
$grid_calls->field('datetime')->label(url_lang::lang('texts.Date'));
$grid_calls->field('number')->label(url_lang::lang('texts.Called number'));
$grid_calls->field('length')->label(url_lang::lang('texts.Length'));
$grid_calls->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid_calls->callback_field('period')->label(url_lang::lang('texts.Period'))
->callback('callback::phone_period_field');
$grid_calls->datasource($calls_model->get_history($user_id, $number));

// fixed calls grid
$grid_fixed_calls = new Grid(url_lang::base().'phone_invoices/show_history', NULL, array(
'use_paginator' => false,
'use_selector' => false
));
$grid_fixed_calls->field('datetime')->label(url_lang::lang('texts.Date'));
$grid_fixed_calls->field('number')->label(url_lang::lang('texts.Called number'));
$grid_fixed_calls->field('length')->label(url_lang::lang('texts.Length'));
$grid_fixed_calls->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid_fixed_calls->callback_field('period')->label(url_lang::lang('texts.Period'))
->callback('callback::phone_period_field');
$grid_fixed_calls->field('destiny')->label(url_lang::lang('texts.Destination'));
$grid_fixed_calls->datasource($fixed_calls_model->get_history($user_id, $number));

// sms messages grid
$grid_sms_messages = new Grid(url_lang::base().'phone_invoices/show_history', NULL, array(
'use_paginator' => false,
'use_selector' => false
));
$grid_sms_messages->field('datetime')->label(url_lang::lang('texts.Date'));
$grid_sms_messages->field('number')->label(url_lang::lang('texts.Called number'));
$grid_sms_messages->callback_field('price')->label(url_lang::lang('texts.Price'))
->callback('callback::phone_price_field');
$grid_sms_messages->callback_field('period')->label(url_lang::lang('texts.Period'))
->callback('callback::phone_period_field');
$grid_sms_messages->field('description')->label(url_lang::lang('texts.Description'));
$grid_sms_messages->datasource($sms_model->get_history($user_id, $number));

// views
$view = new View('main');
$view->title = url_lang::lang('texts.History of phone services between user and phone');
$view->content = new View('phone_invoices/show_history');
$view->content->number = $number;
$view->content->user = $user;
$view->content->grid_calls = $grid_calls;
$view->content->grid_fixed_calls = $grid_fixed_calls;
$view->content->grid_sms_messages = $grid_sms_messages;
$view->content->phone_invoice_user_id = $phone_invoice_user->id;

$view->render(TRUE);
}

/**
* Ajax intelligent handler.
* Output: - 0 if there is any error
* - list of ids on success (id,id,id,)
* @param integer $phone_invoice_user_id
* @param string $detail_of
*/
public function intelligent_select_ajax($phone_invoice_user_id, $detail_of)
{

$detail_of_arrgs = array(
'calls', 'fixed_calls', 'pays', 'connections', 'pays', 'vpn_calls',
'sms_messages', 'roaming_sms_messages'
);

if (!$phone_invoice_user_id || !is_numeric($phone_invoice_user_id))
{
echo '0';
return;
}

if (array_search($detail_of, $detail_of_arrgs) === false)
{
echo '0';
return;
}

$phone_inv_user_model = new Phone_invoice_user_Model($phone_invoice_user_id);

if (!$phone_inv_user_model->id)
{
echo '0';
return;
}

$user = new User_Model($phone_inv_user_model->user_id);

if (! $this->acl_check_view('Phone_invoices_Controller', 'dumps') &&
! $this->acl_check_view('Phone_invoices_Controller', 'dumps', $user->member_id))
{
echo '0';
return;
}

$result = NULL;

switch ($detail_of)
{
case 'calls':
$model = new Phone_call_Model();
$result = $model->get_private_property_by_history($user->id, $phone_invoice_user_id);
break;
case 'fixed_calls':
$model = new Phone_fixed_call_Model();
$result = $model->get_private_property_by_history($user->id, $phone_invoice_user_id);
break;
case 'sms_messages':
$model = new Phone_sms_message_Model();
$result = $model->get_private_property_by_history($user->id, $phone_invoice_user_id);
break;
case 'roaming_sms_messages':
$model = new Phone_roaming_sms_message_Model();
$result = $model->get_private_property_by_history($user->id, $phone_invoice_user_id);
break;
default:
echo '0';
return;
}

foreach ($result as $r)
{
if ($r->private == '1')
{
echo $r->id . ',';
}
}
}

/**
* Ajax set handler
* Output: - 0 on any error
* - 1 on success
* @param integer $phone_invoice_user_id
* @param string $detail_of
*/
public function user_details_set_private_ajax($phone_invoice_user_id = 0, $detail_of = 'calls')
{
$detail_of_arrgs = array(
'calls', 'fixed_calls', 'pays', 'connections', 'pays', 'vpn_calls',
'sms_messages', 'roaming_sms_messages'
);

if (!$phone_invoice_user_id || !is_numeric($phone_invoice_user_id))
{
echo '0';
return;
}

if (array_search($detail_of, $detail_of_arrgs) === false)
{
echo '0';
return;
}

$phone_inv_user_model = new Phone_invoice_user_Model($phone_invoice_user_id);

if (!$phone_inv_user_model->id)
{
echo '0';
return;
}

$user = new User_Model($phone_inv_user_model->user_id);

if (! $this->acl_check_view('Phone_invoices_Controller', 'dumps') &&
! $this->acl_check_view('Phone_invoices_Controller', 'dumps', $user->member_id))
{
echo '0';
return;
}
switch ($detail_of)
{
case 'calls':
$model = new Phone_call_Model();
$model->set_calls_private($phone_inv_user_model->id, @$_POST['private']);
echo '1';
break;
case 'fixed_calls':
$model = new Phone_fixed_call_Model();
$model->set_fixed_calls_private($phone_inv_user_model->id, @$_POST['private']);
echo '1';
break;
case 'vpn_calls':
$model = new Phone_vpn_call_Model();
$model->set_vpn_calls_private($phone_inv_user_model->id, @$_POST['private']);
echo '1';
break;
case 'sms_messages':
$model = new Phone_sms_message_Model();
$model->set_sms_mesages_private($phone_inv_user_model->id, @$_POST['private']);
echo '1';
break;
case 'roaming_sms_messages':
$model = new Phone_roaming_sms_message_Model();
$model->set_roaming_sms_messages_private($phone_inv_user_model->id, @$_POST['private']);
echo '1';
break;
default:
echo '0';
}
}

/**
* Callback for user fields in phone invoices.
* Need Phone_invoices_Controller to work.
* @see Phone_invoices_Controller::_acl_check_view
* @param unknown_type $item
* @param unknown_type $name
*/
protected static function user_field($item, $name)
{
if (!empty($item->name))
{
echo html::anchor(
url_lang::base().'users/show/'.$item->user_id .'/'.$item->id,
$item->name
);
// is user in telephonists group
$user_model = new User_Model($item->user_id);
if (!self::_acl_check_view('user_invoices', $user_model->login))
{
echo ' <b style="color: red;">(' . url_lang::lang('texts.Is not telephonists') . '!)</b>';
}
}
else
{
echo '<span class="error">'.url_lang::lang('texts.Not assigned').'</span>';
}
}

/**
* Add data from object Bill_Data to database
* @param Bill_Data $data Data
* @param Phone_invoice_Model $phone_invoice
*/
private function _set_invoice_data(Bill_Data &$data, Phone_invoice_Model &$phone_invoice)
{
$phone_invoice->save();

/* @var $services Services */
foreach ($data->bill_numbers as $services)
{
$phone_inv_user = new Phone_invoice_user_Model();
$phone_inv_user->user_id = strval(self::user_number_cache($services->number));
$phone_inv_user->phone_invoice_id = $phone_invoice->id;
$phone_inv_user->phone_number = $services->number;
$phone_inv_user->save();

/* @var $item Call_Service */
foreach ($services->calls as $item)
{
$model = new Phone_call_Model();
$model->phone_invoice_user_id = $phone_inv_user->id;
$model->datetime = $item->date_time->format('Y-m-d H:i:s');
$model->price = $item->price;
$model->length = $item->length;
$model->number = $item->number;
$model->period = $item->period;

$ppcontact_id = ($phone_inv_user->user_id < 0) ? 0 :
Private_phone_contacts_Controller::private_contacts_cache(
$phone_inv_user->user_id, $item->number
);

$model->private = ($ppcontact_id <= 0) ? '0' : '1';

$model->save();
}

/* @var $item Fixed_Call_Service */
foreach ($services->fixed_calls as $item)
{
$model = new Phone_fixed_call_Model();
$model->phone_invoice_user_id = $phone_inv_user->id;
$model->datetime = $item->date_time->format('Y-m-d H:i:s');
$model->price = $item->price;
$model->length = $item->length;
$model->number = $item->number;
$model->period = $item->period;
$model->destiny = $item->destiny;

$ppcontact_id = ($phone_inv_user->user_id < 0) ? :
Private_phone_contacts_Controller::private_contacts_cache(
$phone_inv_user->user_id, $item->number
);

$model->private = (($ppcontact_id <= 0) &&
(self::user_number_cache($model->number) != 0)) ? '0' : '1';

$model->save();
}

/* @var $item Vpn_Call_Service */
foreach ($services->vpn_calls as $item)
{
$model = new Phone_vpn_call_Model();
$model->phone_invoice_user_id = $phone_inv_user->id;
$model->datetime = $item->date_time->format('Y-m-d H:i:s');
$model->price = $item->price;
$model->length = $item->length;
$model->number = $item->number;
$model->period = $item->period;
$model->group = $item->group;
// VPN calls are payed by org if its not in private numbers

$ppcontact_id = ($phone_inv_user->user_id < 0) ? 0 :
Private_phone_contacts_Controller::private_contacts_cache(
$phone_inv_user->user_id, $item->number
);

$model->private = ($ppcontact_id <= 0) ? '0' : '1';

$model->save();
}

/* @var $item Sms_Service */
foreach ($services->smss as $item)
{
$model = new Phone_sms_message_Model();
$model->phone_invoice_user_id = $phone_inv_user->id;
$model->datetime = $item->date_time->format('Y-m-d H:i:s');
$model->price = $item->price;
$model->number = $item->number;
$model->period = $item->period;
$model->description = $item->description;

$ppcontact_id = ($phone_inv_user->user_id < 0) ? 0 :
Private_phone_contacts_Controller::private_contacts_cache(
$phone_inv_user->user_id, $item->number
);

$model->private = ($ppcontact_id <= 0) ? '0' : '1';
$model->save();
}

/* @var $item RoamingSms_Service */
foreach ($services->roaming_smss as $item)
{
$model = new Phone_roaming_sms_message_Model();
$model->phone_invoice_user_id = $phone_inv_user->id;
$model->datetime = $item->date_time->format('Y-m-d H:i:s');
$model->price = $item->price;
$model->roaming_zone = $item->roaming_zone;
$model->private = '1';
$model->save();
}

/* @var $item Internet_Service */
foreach ($services->internet as $item)
{
$model = new Phone_connection_Model();
$model->phone_invoice_user_id = $phone_inv_user->id;
$model->datetime = $item->date_time->format('Y-m-d H:i:s');
$model->price = $item->price;
$model->period = $item->period;
$model->apn = $item->apn;
$model->transfered = $item->transfered;
$model->private = '1';
$model->save();
}

/* @var $item Pay_Service */
foreach ($services->pays as $item)
{
$model = new Phone_pay_Model();
$model->phone_invoice_user_id = $phone_inv_user->id;
$model->datetime = $item->date_time->format('Y-m-d H:i:s');
$model->price = $item->price;
$model->number = $item->number;
$model->description = $item->description;
$model->private = '1';

$model->save();
}
}

}

/**
* Cache for connection between user and number
* @param string $number Phone number to find
* @return integer User ID or zero
*/
public static function user_number_cache($number)
{
static $user_number_cache = array ();
static $model = null;

if ($model == null)
{
$model = new Phone_invoice_user_Model();
}

if (! array_key_exists($number, $user_number_cache))
{
$user_number_cache[$number] = $model->get_user_id($number);
}
return $user_number_cache[$number];
}

}
(41-41/68)