Revize 473
Přidáno uživatelem Jiří Sviták před asi 15 roky(ů)
freenetis/trunk/kohana/application/i18n/cs_CZ/texts.php | ||
---|---|---|
'voip number interval must be in format xxxxxxxxx-xxxxxxxxx' => 'Rozsah VoIP čísel musí být ve formátu xxxxxxxxx-xxxxxxxxx',
|
||
'voip number must be 9 characters long' => 'VoIP číslo musí obsahovat 9 znaků',
|
||
'voip number must be a number' => 'VoIP číslo musí být číslo',
|
||
'warning' => 'Varování',
|
||
'website after redirection' => 'Webová stránka po přesměrování',
|
||
'work' => 'Práce',
|
||
'work confirmation' => 'Potvrzení práce',
|
freenetis/trunk/kohana/application/models/transfer.php | ||
---|---|---|
)->current();
|
||
}
|
||
|
||
/**
|
||
* Function gets dependent transfers of transfer that is member fee payment.
|
||
* @param $transfer_id
|
||
* @return unknown_type
|
||
*/
|
||
public function get_dependent_transfers($transfer_id)
|
||
{
|
||
return self::$db->query("SELECT dt.*
|
||
... | ... | |
");
|
||
}
|
||
|
||
/**
|
||
* Finding deducting fee.
|
||
* @param $year
|
||
* @param $origin_credit_account
|
||
* @return unknown_type
|
||
*/
|
||
public function get_deduct_transfer($year, $origin_credit_account)
|
||
{
|
||
return self::$db->query("SELECT * FROM transfers
|
||
WHERE type = ".Transfer_Model::$deduct_member_fee." AND datetime LIKE '%".$year."%'
|
||
AND origin_id = ".$origin_credit_account
|
||
)->current();
|
||
}
|
||
|
||
}
|
||
|
||
?>
|
freenetis/trunk/kohana/application/controllers/transfers.php | ||
---|---|---|
{
|
||
if (!$this->acl_check_view('Accounts_Controller', 'transfers'))
|
||
Controller::error(ACCESS);
|
||
if (isset($transfer_id))
|
||
if (!isset($transfer_id))
|
||
Controller::warning(PARAMETER);
|
||
$account_model = new Account_Model();
|
||
$transfer_model = new Transfer_Model();
|
||
$transfer = $transfer_model->get_transfer($transfer_id);
|
||
if (!is_object($transfer))
|
||
Controller::error(RECORD);
|
||
// transfers dependent on this transfer, if this transfer is member fee payment
|
||
$dependent_transfers = $transfer_model->get_dependent_transfers($transfer->id);
|
||
$bt = null;
|
||
// bank transfer is only assigned to transfer from member fees account to account of association
|
||
if ($transfer->oa_id == $account_model->get_member_fees_account()->id)
|
||
{
|
||
$account_model = new Account_Model();
|
||
$transfer_model = new Transfer_Model();
|
||
$transfer = $transfer_model->get_transfer($transfer_id);
|
||
//$previous = null;
|
||
// previous transfer is identified transfer from member fees account to account of association
|
||
/*
|
||
if (isset($transfer->previous_transfer_id))
|
||
{
|
||
$previous_transfer_model = new Transfer_Model();
|
||
$previous = $previous_transfer_model->get_transfer($transfer->previous_transfer_id);
|
||
}
|
||
*/
|
||
$dependent_transfers = $transfer_model->get_dependent_transfers($transfer->id);
|
||
$bt = null;
|
||
// bank transfer is only assigned to transfer from member fees account to account of association
|
||
if ($transfer->oa_id == $account_model->get_member_fees_account()->id)
|
||
{
|
||
$bt_model = new Bank_transfer_Model();
|
||
$bt = $bt_model->get_bank_transfer($transfer_id);
|
||
}
|
||
$headline = url_lang::lang('texts.Detail of transfer number').' '.$transfer->id;
|
||
$view = new View('main');
|
||
$view->title = $headline;
|
||
$view->content = new View('transfers/show');
|
||
$view->content->headline = $headline;
|
||
$view->content->transfer = $transfer;
|
||
//$view->content->previous = $previous;
|
||
$view->content->dependent_transfers = $dependent_transfers;
|
||
$view->content->bt = $bt;
|
||
$view->content->message = $this->session->get_once('message');
|
||
$view->render(TRUE);
|
||
$bt_model = new Bank_transfer_Model();
|
||
$bt = $bt_model->get_bank_transfer($transfer_id);
|
||
}
|
||
else
|
||
{
|
||
Controller::warning(PARAMETER);
|
||
}
|
||
$headline = url_lang::lang('texts.Detail of transfer number').' '.$transfer->id;
|
||
$view = new View('main');
|
||
$view->title = $headline;
|
||
$view->content = new View('transfers/show');
|
||
$view->content->headline = $headline;
|
||
$view->content->transfer = $transfer;
|
||
$view->content->dependent_transfers = $dependent_transfers;
|
||
$view->content->bt = $bt;
|
||
$view->content->message = $this->session->get_once('message');
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
/**
|
||
... | ... | |
// it goes through all credit accounts and it creates their outbound transfers to operating account
|
||
foreach($credit_accounts as $ca)
|
||
{
|
||
// clears transfer model
|
||
$transfer->clear();
|
||
// starting month
|
||
$start = $month;
|
||
// finishing month
|
||
... | ... | |
$total_months = $finish - $start + 1 - $interrupted;
|
||
// if deducting interval is between entrance and leaving date, transfer will be generated
|
||
if ($e_okay && $l_okay && $total_months > 0)
|
||
{
|
||
{
|
||
// trying to find existing transfer of given year
|
||
$existing = $transfer->get_deduct_transfer($year, $ca->id);
|
||
if (is_object($existing))
|
||
$transfer = new Transfer_Model($existing->id);
|
||
else
|
||
$transfer = new Transfer_Model();
|
||
$transfer->origin_id = $ca->id;
|
||
$transfer->destination_id = $oa->id;
|
||
$trasnfer->type = Transfer_Model::$deduct_member_fee;
|
||
$transfer->user_id = $this->session->get('user_id');
|
||
$transfer->type = Transfer_Model::$deduct_member_fee;
|
||
$transfer->datetime = $datetime;
|
||
$transfer->creation_datetime = $creation_datetime;
|
||
$transfer->text = $text;
|
||
... | ... | |
*/
|
||
function edit_deducted_fees()
|
||
{
|
||
|
||
// access rights
|
||
if (!$this->acl_check_new('Accounts_Controller', 'transfers'))
|
||
Controller::error(ACCESS);
|
||
// content of dropdown for months
|
||
for ($i = 1; $i <= 12; $i++)
|
||
$arr_months[$i] = $i;
|
||
// content of dropdown for years
|
||
$year_from = date('Y') - 20;
|
||
for ($i = 1; $i <= 20; $i++)
|
||
$arr_years[$i] = $year_from + $i;
|
||
$form = new Forge(url_lang::base().'transfers/deduct_fees', '', 'POST', array('id' => 'article_form'));
|
||
$form->set_attr('class', 'form_class')->set_attr('method', 'post');
|
||
$form->dropdown('year')->label(url_lang::lang('texts.Year').':')->rules('required')->options($arr_years)->selected(20);
|
||
$form->dropdown('month')->label(url_lang::lang('texts.Month from').':')->rules('required')->options($arr_months)->selected(1);
|
||
$form->dropdown('months')->label(url_lang::lang('texts.Number of months').':')->rules('required')->options($arr_months)->selected(1)->callback(array($this, 'valid_months'));
|
||
$form->input('fee')->label(url_lang::lang('texts.Monthly member fee').':')->rules('required|valid_numeric');
|
||
$form->input('text')->label(url_lang::lang('texts.Text').':');
|
||
$form->submit('submit')->value(url_lang::lang('texts.Deduct'));
|
||
special::required_forge_style($form, ' *', 'required');
|
||
// form validation
|
||
if ($form->validate())
|
||
{
|
||
$form_data = $form->as_array();
|
||
foreach($form_data as $key => $value)
|
||
{
|
||
$form_data[$key] = htmlspecialchars($value);
|
||
}
|
||
$year = $arr_years[$form_data['year']];
|
||
$month = $form_data['month'];
|
||
$months = $form_data['months'];
|
||
$fee = $form_data['fee'];
|
||
$text = $form_data['text'];
|
||
// all transfers should have the same date and time of creation
|
||
$creation_datetime = date('Y-m-d H:i:s');
|
||
// and all transfers should have the same date of deduct start
|
||
$datetime = date('Y-m-d H:i:s', mktime(0, 0, 0, $month, 1, $year));
|
||
// database models
|
||
$transfer = new Transfer_Model();
|
||
$member_model = new Member_Model();
|
||
$account_model = new Account_Model();
|
||
$mi_model = new Membership_interrupt_Model();
|
||
// it gets ids and member ids of all credit accounts
|
||
//$credit_accounts = $account_model->get_accounts_of_regular_members();
|
||
|
||
// finding transfer of given year
|
||
|
||
// it gets id of operating account, the only destination account
|
||
$oa = ORM::factory('account')->find_by_account_attribute_id(Account_attribute_Model::$operating);
|
||
// it supposes that everything will be ok, if a transfer couldn't be created, it sets to false
|
||
$save_successful = true;
|
||
// it is suppossed that thousands of transfers will be generated, transaction processing required
|
||
$db = new Database();
|
||
$db->query("BEGIN;");
|
||
// it goes through all credit accounts and it creates their outbound transfers to operating account
|
||
foreach($credit_accounts as $ca)
|
||
{
|
||
// clears transfer model
|
||
$transfer->clear();
|
||
// starting month
|
||
$start = $month;
|
||
// finishing month
|
||
$finish = $month + $months - 1;
|
||
// member fee info includes entrance date, leaving date and member type
|
||
$member_fee_info = $member_model->get_fee_information($ca->id);
|
||
// for every account it gets entrance year and month of its owning member
|
||
$entrance = date_parse($member_fee_info->entrance_date);
|
||
// entrance date is rounded
|
||
$entrance = date_parse(date::round_month($entrance['day'], $entrance['month'], $entrance['year']));
|
||
$e_year = $entrance['year'];
|
||
$e_month = $entrance['month'];
|
||
$e_day = $entrance['day'];
|
||
// fee is deducted only if membership exists before upper date of deducting interval
|
||
$e_okay = ($e_year < $year) || ($e_year == $year && $e_month <= $finish);
|
||
// if member entered association after start of deducting interval
|
||
if ($e_year == $year && $e_month > $start)
|
||
{
|
||
$start = $e_month;
|
||
}
|
||
// for every account it gets leaving year and month of its owning member
|
||
$leaving_date = date_parse($member_fee_info->leaving_date);
|
||
// if leaving date was set
|
||
if ($leaving_date['year'] != '0')
|
||
{
|
||
// leaving date is rounded
|
||
$leaving_date = date_parse(date::round_month($leaving_date['day'], $leaving_date['month'], $leaving_date['year']));
|
||
$l_year = $leaving_date['year'];
|
||
$l_month = $leaving_date['month'];
|
||
$l_day = $leaving_date['day'];
|
||
// fee is deducted only if membership exists before upper date of deducting interval
|
||
$l_okay = ($l_year > $year) || ($l_year == $year && $l_month > $start);
|
||
// if member left before end of deducting interval
|
||
if ($l_year == $year && $l_month <= $finish)
|
||
{
|
||
// leaving month is not included in deduction
|
||
$finish = $l_month - 1;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$l_okay = true;
|
||
}
|
||
// for every member it searches interrupts of membership
|
||
$mis = $mi_model->get_mi($ca->member_id);
|
||
// defualt number of months with interrupted membership
|
||
$interrupted = 0;
|
||
foreach ($mis as $mi)
|
||
{
|
||
$from = date_parse($mi->from);
|
||
$from = date_parse(date::round_month($from['day'], $from['month'], $from['year']));
|
||
$to = date_parse($mi->to);
|
||
$to = date_parse(date::round_month($to['day'], $to['month'], $to['year']));
|
||
// membership was interrupted before starting month and interrupt lasted after finishing one
|
||
if ((($from['year'] < $year) || ($from['year'] == $year && $from['month'] <= $start))
|
||
&& (($to['year'] > $year) || ($to['year'] == $year && $to['month'] >= $finish)))
|
||
{
|
||
// all months will be interrupted, no fee is deducted
|
||
$interrupted += $finish - $start;
|
||
}
|
||
// membership was interrupted before starting month,
|
||
// but interrupt ended after starting one and before finishing one
|
||
else if ((($from['year'] < $year) || ($from['year'] == $year && $from['month'] < $start))
|
||
&& ($to['year'] == $year && $to['month'] >= $start)
|
||
&& ($to['year'] == $year && $to['month'] < $finish))
|
||
{
|
||
$interrupted += $to['month'] - $start;
|
||
}
|
||
// membership was interrupted after starting month and before finishing month,
|
||
// and interrupt ended after finishing month
|
||
else if (($from['year'] == $year && $from['month'] > $start)
|
||
&& ($from['year'] == $year && $from['month'] <= $finish)
|
||
&& (($to['year'] > $year) || ($to['year'] == $year && $to['month'] > $finish)))
|
||
{
|
||
$interrupted += $finish - $from['month'];
|
||
}
|
||
// membership was interrupted after starting month and before finishing month
|
||
else if (($from['year'] == $year && $from['month'] >= $start)
|
||
&& ($to['year'] == $year && $to['month'] <= $finish))
|
||
{
|
||
$interrupted += $to['month'] - $from['month'];
|
||
}
|
||
}
|
||
// total months to deduct fees
|
||
$total_months = $finish - $start + 1 - $interrupted;
|
||
// if deducting interval is between entrance and leaving date, transfer will be generated
|
||
if ($e_okay && $l_okay && $total_months > 0)
|
||
{
|
||
$transfer->origin_id = $ca->id;
|
||
$transfer->destination_id = $oa->id;
|
||
$transfer->user_id = $this->session->get('user_id');
|
||
$transfer->type = Transfer_Model::$deduct_member_fee;
|
||
$transfer->datetime = $datetime;
|
||
$transfer->creation_datetime = $creation_datetime;
|
||
$transfer->text = $text;
|
||
$transfer->amount = $total_months * $fee;
|
||
// money transfer is saved and checked
|
||
if (!$transfer->save())
|
||
$save_successful = false;
|
||
}
|
||
}
|
||
// end of transaction processing
|
||
if ($save_successful)
|
||
{
|
||
$db->query("COMMIT;");
|
||
$this->session->set_flash('message', url_lang::lang('texts.Fees have been successfully deducted.'));
|
||
}
|
||
else
|
||
{
|
||
$db->query("ROLLBACK;");
|
||
$this->session->set_flash('message', url_lang::lang('texts.Error - some fees have not been deducted.'));
|
||
}
|
||
url::redirect(url_lang::base().'transfers/show_all');
|
||
}
|
||
else
|
||
{
|
||
$headline = url_lang::lang('texts.Deduction of member fees');
|
||
$view = new View('main');
|
||
$view->title = $headline;
|
||
$view->content = new View('form');
|
||
$view->content->headline = $headline;
|
||
$view->content->form = $form->html();
|
||
$view->content->link_back = html::anchor(url_lang::base().'transfers/show_all',url_lang::lang('texts.Back to day book'));
|
||
$view->render(TRUE);
|
||
}
|
||
}
|
||
|
||
/**
|
||
... | ... | |
{
|
||
if (!isset($member_id))
|
||
Controller::warning(PARAMETER);
|
||
$member = new Member_Model($member_id);
|
||
if ($member->id == 0)
|
||
Controller::error(RECORD);
|
||
if (!$this->acl_check_new('Accounts_Controller', 'transfers', $member_id))
|
||
Controller::error(ACCESS);
|
||
$credit = ORM::factory('account')->find_by_member_id_and_account_attribute_id(
|
freenetis/trunk/kohana/application/controllers/redirect.php | ||
---|---|---|
$view->render(TRUE);
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* IP address has not been found in database.
|
||
* @param $ip_address
|
||
* @return unknown_type
|
||
*/
|
||
function ip_unknown($ip_address = NULL)
|
||
{
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.Unknown IP address');
|
||
$view->content = new View('redirect/ip_unknown');
|
||
$view->content->ip_address = $ip_address;
|
||
$view->render(TRUE);
|
||
|
||
}
|
||
|
||
/**
|
||
* Function provides complete information about your IP address, if it is found in database.
|
||
* @param $ip_address
|
||
* @return unknown_type
|
||
*/
|
||
function ip_info($ip_address = NULL)
|
||
{
|
||
|
||
if (!$ip_address)
|
||
$ip_address = server::remote_addr();
|
||
|
||
$ip_address_model = new Ip_address_Model();
|
||
$this_ip = $ip_address_model->where('ip_address',$ip_address)->find();
|
||
|
||
$device_name = '';
|
||
$device_type = '';
|
||
$engineer_names = '';
|
||
$mac = '';
|
||
$user_name = '';
|
||
$count_engineers = 0;
|
||
|
||
if ($this_ip->id)
|
||
{
|
||
$mac = $this_ip->iface->mac;
|
||
$device_name = $this_ip->iface->device->name;
|
||
|
||
$enum_type_model = new Enum_type_Model();
|
||
$device_type = $enum_type_model->get_value($this_ip->iface->device->type);
|
||
|
||
$device_engineer_model = new Device_engineer_Model();
|
||
$engineers = $device_engineer_model->where('device_id',$this_ip->iface->device->id)->find_all();
|
||
$arr_engineers = array();
|
||
foreach ($engineers as $engineer) $arr_engineers[] = $engineer->user->name.' '.$engineer->user->surname;
|
||
$count_engineers = count($arr_engineers);
|
||
$engineer_names = implode(', ',$arr_engineers);
|
||
|
||
$user_name = $this_ip->iface->device->user->name.' '.$this_ip->iface->device->user->surname;
|
||
}
|
||
|
||
$ip = ip2long($ip_address);
|
||
|
||
$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")
|
||
->find_all();
|
||
$arr_subnets = Array();
|
||
foreach($subnets as $subnet)
|
||
{
|
||
$mask=0xffffffff<<(32-$subnet->mask) & 0xffffffff;
|
||
if(($ip & $mask)==$subnet->net) $arr_subnets[] = $subnet;
|
||
|
||
}
|
||
|
||
if (count($arr_subnets) == 0)
|
||
{
|
||
$this->session->set_flash('message', url_lang::lang('texts.Your IP address has not been found in database.'));
|
||
url::redirect(url_lang::base().'members/show/'.$this->session->get('member_id'));
|
||
}
|
||
|
||
$subnet = $arr_subnets[0];
|
||
|
||
$arr_ip = explode('.', $subnet->net_str);
|
||
$arr_ip[3]++;
|
||
$gateway_ip = implode('.',$arr_ip);
|
||
|
||
$ap = $ip_address_model->where('ip_address',$gateway_ip)->find();
|
||
|
||
if ($ap->iface_id!=NULL)
|
||
{
|
||
$segment_name = $ap->iface->segment->name;
|
||
$gateway_name = $ap->iface->device->name;
|
||
$device_id = $ap->iface->device->id;
|
||
$vlan_iface_name = '';
|
||
}
|
||
else if ($ap->vlan_iface_id!=NULL)
|
||
{
|
||
//$segment_name = $ap->vlan_iface->iface->segment->name;
|
||
$segment_name = '';
|
||
$gateway_name = $ap->vlan_iface->iface->device->name;
|
||
$device_id = $ap->vlan_iface->iface->device->id;
|
||
$vlan_iface_name = $ap->vlan_iface->name;
|
||
}
|
||
|
||
$device_admin_model = new Device_admin_Model();
|
||
$device_admins = $device_admin_model->where('device_id',$device_id)->find_all();
|
||
|
||
$admins = Array();
|
||
$contact_model = new Contact_Model();
|
||
$contacts = array();
|
||
foreach($device_admins as $device_admin)
|
||
{
|
||
$admins[] = $device_admin->user;
|
||
$contacts[$device_admin->user->id] = $contact_model->where('user_id',$device_admin->user->id)->find_all();
|
||
}
|
||
|
||
$contact_type_names = Array();
|
||
$enum_type_model = new Enum_type_Model();
|
||
$translation_model = new Translation_Model();
|
||
$contact_types = $enum_type_model->where('type_id',Enum_type_Model::$contact_type_id)->find_all();
|
||
foreach ($contact_types as $contact_type)
|
||
{
|
||
$contact_type_names[$contact_type->id] = $translation_model->get_translation($contact_type->value);
|
||
}
|
||
|
||
$view = new View('main');
|
||
$view->title = url_lang::lang('texts.Information');
|
||
$view->content = new View('redirect/ip_info');
|
||
$view->content->ip_address = $ip_address;
|
||
$view->content->mac = $mac;
|
||
$view->content->user_name = $user_name;
|
||
$view->content->count_engineers = $count_engineers;
|
||
$view->content->engineer_names = $engineer_names;
|
||
$view->content->device_name = $device_name;
|
||
$view->content->device_type = $device_type;
|
||
$view->content->subnet_name = $subnet->name;
|
||
$view->content->segment_name = $segment_name;
|
||
$view->content->gateway_name = $gateway_name;
|
||
$view->content->gateway_ip = $gateway_ip;
|
||
$view->content->vlan_iface_name = $vlan_iface_name;
|
||
$view->content->admins = $admins;
|
||
$view->content->contacts = $contacts;
|
||
$view->content->contact_types = $contact_type_names;
|
||
$view->render(TRUE);
|
||
}
|
||
|
||
|
||
|
||
}
|
||
?>
|
freenetis/trunk/kohana/application/libraries/MY_Controller.php | ||
---|---|---|
// database connection
|
||
if(!$this->test_db())
|
||
{
|
||
$this->error(DATABASE);
|
||
// this error message does not work
|
||
//$this->error(DATABASE);
|
||
echo url_lang::lang('states.Failed to connect to database');
|
||
die();
|
||
}
|
||
// database upgrade goes here
|
||
... | ... | |
switch ($type)
|
||
{
|
||
case $this->ICON_ERROR:
|
||
$view->title = 'Error';
|
||
$view->title = url_lang::lang('texts.Error');
|
||
$view->content->icon = html::image(array('src' => 'media/images/states/error.png', 'width' => '100', 'height' => '100', 'alt' => 'Image', 'class' => 'noborder'));
|
||
break;
|
||
case $this->ICON_GOOD:
|
||
$view->title = 'Good';
|
||
$view->title = url_lang::lang('texts.Good');
|
||
$view->content->icon = html::image(array('src' => 'media/images/states/good.png', 'width' => '100', 'height' => '100', 'alt' => 'Image', 'class' => 'noborder'));
|
||
break;
|
||
case $this->ICON_HELP:
|
||
$view->title = 'Help';
|
||
$view->title = url_lang::lang('texts.Help');
|
||
$view->content->icon = html::image(array('src' => 'media/images/states/help.png', 'width' => '100', 'height' => '100', 'alt' => 'Image', 'class' => 'noborder'));
|
||
break;
|
||
case $this->ICON_INFO:
|
||
$view->title = 'Info';
|
||
$view->title = url_lang::lang('texts.Info');
|
||
$view->content->icon = html::image(array('src' => 'media/images/states/info.png', 'width' => '100', 'height' => '100', 'alt' => 'Image', 'class' => 'noborder'));
|
||
break;
|
||
case $this->ICON_WARNING:
|
||
$view->title = 'Warning';
|
||
$view->title = url_lang::lang('texts.Warning');
|
||
$view->content->icon = html::image(array('src' => 'media/images/states/warning.png', 'width' => '100', 'height' => '100', 'alt' => 'Image', 'class' => 'noborder'));
|
||
break;
|
||
}
|
freenetis/trunk/kohana/application/views/devices_show.php | ||
---|---|---|
<?php
|
||
echo ($message = $this->session->get('message')) ? '<div class="message">'.$message.'</div>' : '';
|
||
|
||
if ($this->acl_check_view(get_class($this),'devices',$device->user->id))
|
||
$links = array();
|
||
if ($this->acl_check_view(get_class($this), 'devices', $device->user->member_id))
|
||
$links[] = html::anchor(url_lang::base().'devices/show_by_user/'.$device->user->id, url_lang::lang('texts.Back to devices of user'));
|
||
if($this->acl_check_edit(get_class($this),'devices'))
|
||
if($this->acl_check_edit(get_class($this), 'devices'))
|
||
$links[] = html::anchor(url_lang::base().'devices/edit/'.$device->id, url_lang::lang('texts.Edit'));
|
||
|
||
echo implode(' | ', $links)
|
||
?>
|
||
<br />
|
Také k dispozici: Unified diff
Upravy ve strhavani clenskych prispevku, je mozne strzenou castku pro dany rok prepocitat. To znamena, ze pro kazdy rok bude jeden strhavaci prevod.