mirror of https://github.com/sipwise/www_csc.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
881 lines
30 KiB
881 lines
30 KiB
package csc::Controller::callforward;
|
|
|
|
use strict;
|
|
use warnings;
|
|
use base 'Catalyst::Controller';
|
|
use csc::Utils;
|
|
use HTML::Entities;
|
|
use POSIX;
|
|
|
|
sub base :Chained('/') PathPrefix CaptureArgs(0) {
|
|
my ( $self, $c ) = @_;
|
|
return unless ( $c->stash->{subscriber} = $c->forward ('load_subscriber') );
|
|
return unless ( $c->stash->{cf_maps} = $c->forward ('load_maps') );
|
|
$c->stash->{subscriber}{active_number} = csc::Utils::get_active_number_string($c);
|
|
}
|
|
|
|
##############################################################################
|
|
### mapping ###
|
|
|
|
# 302 to old callforward-link
|
|
sub mapping_oldskool : Chained('base') PathPart('') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
$c->response->redirect($c->uri_for ('/callforward/mapping'), 301);
|
|
}
|
|
|
|
sub mapping : Chained('base') PathPart('mapping') CaptureArgs(0) {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{template} = 'tt/callforward_mapping.tt';
|
|
|
|
return unless ( $c->stash->{cf_types} = $c->forward ('load_cf_types') );
|
|
return unless ( $c->stash->{time_sets} = $c->forward ('load_time_sets') );
|
|
return unless ( $c->stash->{destination_sets} = $c->forward ('load_destination_sets') );
|
|
return unless ( $c->stash->{preferences} = $c->forward ('load_preferences') );
|
|
}
|
|
|
|
sub mapping_list : Chained('mapping') PathPart('') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
if (defined $c->session->{refill}) {
|
|
$c->stash->{preferences}->{ringtimeout} = $c->session->{refill}->{ringtimeout};
|
|
$c->session->{refill} = undef;
|
|
}
|
|
}
|
|
|
|
sub mapping_id : Chained('mapping') PathPart('') CaptureArgs(1) {
|
|
my ( $self, $c, $map_id ) = @_;
|
|
$c->stash->{map_id} = $map_id;
|
|
}
|
|
|
|
sub mapping_edit : Chained('mapping_id') PathPart('edit') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
}
|
|
|
|
sub mapping_save : Chained('mapping') PathPart('save') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $map = {
|
|
id => $c->request->params->{map_id},
|
|
type => $c->request->params->{type},
|
|
destination_set_id => ($c->request->params->{destset_id} != 0) ? $c->request->params->{destset_id}: undef,
|
|
time_set_id => ($c->request->params->{timeset_id} != 0) ? $c->request->params->{timeset_id} : undef,
|
|
};
|
|
|
|
unless (defined $map->{destination_set_id}) {
|
|
$c->session->{messages} = { toperr => 'Client.Syntax.MissingDestinationSet' };
|
|
$c->response->redirect($c->uri_for ('/callforward/mapping'));
|
|
$c->detach;
|
|
}
|
|
|
|
my $ret;
|
|
if ($map->{id}) {
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'update_subscriber_cf_map',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
data => $map,
|
|
},
|
|
undef,
|
|
);
|
|
}
|
|
else {
|
|
delete $map->{id};
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'create_subscriber_cf_map',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
data => $map,
|
|
},
|
|
undef,
|
|
);
|
|
}
|
|
|
|
if ($ret) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' };
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Client.Voip.InputErrorFound' };
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for ('/callforward/mapping'));
|
|
}
|
|
|
|
sub mapping_delete : Chained('mapping') PathPart('delete') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
if ($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_subscriber_cf_map',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
id => $c->request->params->{map_id},
|
|
},
|
|
undef,
|
|
)) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' } ;
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Client.Voip.InputErrorFound' } ;
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for ('/callforward/mapping'));
|
|
}
|
|
|
|
##############################################################################
|
|
### destination ###
|
|
|
|
sub destination : Chained('base') PathPart('destination') CaptureArgs(0) {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{template} = 'tt/callforward_destination.tt';
|
|
return unless ( $c->stash->{destination_sets} = $c->forward ('load_destination_sets') );
|
|
|
|
# collect data about different sets being mapped
|
|
my $mapped = {};
|
|
foreach my $set (@{$c->stash->{destination_sets}}) {
|
|
$mapped->{$set->{id}} = 0;
|
|
|
|
if ($c->stash->{cf_maps}) {
|
|
foreach my $map (values %{$c->stash->{cf_maps}}) {
|
|
foreach my $part (@$map) {
|
|
$mapped->{$set->{id}}++ if ($part->{destination_set_id} == $set->{id});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$c->stash->{mapped} = $mapped;
|
|
|
|
# refill/update datastructure presented to template. necessary if user
|
|
# edits, errs and form is redisplayed.
|
|
#
|
|
if (defined $c->session->{refill}) {
|
|
|
|
foreach my $set (@{$c->stash->{destination_sets}}) {
|
|
next if ($set->{id} != $c->session->{refill}->{set_id});
|
|
delete $c->session->{refill}->{set_id};
|
|
|
|
if (defined $c->session->{refill}->{item_id}) {
|
|
foreach my $item (@{$set->{destinations}}) {
|
|
next if ($item->{id} != $c->session->{refill}->{item_id});
|
|
delete $c->session->{refill}->{item_id};
|
|
|
|
$c->stash->{dtarget_id} = $item->{id};
|
|
foreach my $key (keys %{$c->session->{refill}}) {
|
|
$item->{$key} = $c->session->{refill}->{$key};
|
|
}
|
|
|
|
}
|
|
|
|
# all new item
|
|
if (exists $c->session->{refill}->{item_id}) {
|
|
delete $c->session->{refill}->{item_id};
|
|
|
|
# indicate that this is not yet in the database
|
|
my $item = { id => -1 };
|
|
$c->stash->{dtarget_id} = $item->{id};
|
|
|
|
foreach my $key (keys %{$c->session->{refill}}) {
|
|
$item->{$key} = $c->session->{refill}->{$key};
|
|
}
|
|
push @{$set->{destinations}}, $item;
|
|
}
|
|
}
|
|
|
|
foreach my $key (keys %{$c->session->{refill}}) {
|
|
$set->{$key} = $c->session->{refill}->{$key};
|
|
}
|
|
}
|
|
|
|
|
|
delete $c->session->{refill};
|
|
}
|
|
}
|
|
|
|
sub destination_list : Chained('destination') PathPart('') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
}
|
|
|
|
sub destination_set_get : Chained('destination') PathPart('set') CaptureArgs(1) {
|
|
my ( $self, $c, $dset_id ) = @_;
|
|
$c->stash->{dset_id} = $dset_id;
|
|
}
|
|
|
|
sub destination_set_post : Chained('destination') PathPart('set') CaptureArgs(0) {
|
|
my ( $self, $c, $dset_id ) = @_;
|
|
$c->stash->{dset_id} = $c->request->params->{dset_id};
|
|
}
|
|
|
|
### join with destination_set_get?
|
|
sub destination_set_edit : Chained('destination_set_get') PathPart('edit') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
}
|
|
|
|
sub destination_set_save : Chained('destination_set_post') PathPart('save') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $ret;
|
|
if ($c->stash->{dset_id}) {
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'update_subscriber_cf_destination_set',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
data => {
|
|
name => $c->request->params->{dsetname},
|
|
id => $c->stash->{dset_id},
|
|
},
|
|
},
|
|
undef,
|
|
);
|
|
|
|
# only if user fiddeled with priorities
|
|
if ($c->request->params->{priority_changed}) {
|
|
foreach my $s (@{$c->stash->{destination_sets}}) {
|
|
next if ($s->{id} != $c->stash->{dset_id});
|
|
|
|
foreach my $d (@{$s->{destinations}}) {
|
|
my $prio = $c->request->params->{'priority-' . $d->{id}};
|
|
my $id = $d->{id};
|
|
|
|
$c->model('Provisioning')->call_prov( $c, 'voip', 'update_subscriber_cf_destination_by_id',
|
|
{ id => $id,
|
|
data => { priority => $prio },
|
|
},
|
|
undef
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'create_subscriber_cf_destination_set',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
data => {
|
|
name => $c->request->params->{dsetname},
|
|
},
|
|
},
|
|
undef,
|
|
)
|
|
}
|
|
|
|
if ($ret) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings'};
|
|
$c->response->redirect($c->uri_for ('/callforward/destination'));
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Client.Voip.InputErrorFound'};
|
|
$c->response->redirect($c->uri_for('/callforward/destination/set/' . $c->stash->{dset_id} . '/edit'));
|
|
}
|
|
}
|
|
|
|
sub destination_set_delete : Chained('destination_set_post') PathPart('delete') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
if ($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_subscriber_cf_destination_set',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
id => $c->stash->{dset_id},
|
|
},
|
|
undef,
|
|
)) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' };
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Server.Voip.SavedSettings' };
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for('/callforward/destination'));
|
|
}
|
|
|
|
### destination target ###
|
|
|
|
sub destination_target_get : Chained('destination') PathPart('target') CaptureArgs(1) {
|
|
my ( $self, $c, $dtarget_id ) = @_;
|
|
$c->stash->{dtarget_id} = $dtarget_id;
|
|
}
|
|
|
|
sub destination_target_post : Chained('destination') PathPart('target') CaptureArgs(0) {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{dset_id} = $c->request->params->{dset_id};
|
|
$c->stash->{dtarget_id} = $c->request->params->{dtarget_id};
|
|
}
|
|
|
|
sub destination_target_edit : Chained('destination_target_get') PathPart('edit') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
}
|
|
|
|
# does save and create
|
|
sub destination_target_save : Chained('destination_target_post') PathPart('save') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $prio = $c->request->params->{priority};
|
|
my $fwtype = $c->request->params->{fwtype}; ###
|
|
$c->stash->{type} = $fwtype;
|
|
|
|
my %messages;
|
|
my %dest;
|
|
|
|
my $vbdom = $c->config->{voicebox_domain};
|
|
my $fmdom = $c->config->{fax2mail_domain};
|
|
my $confdom = $c->config->{conference_domain};
|
|
|
|
my $fw_timeout = $c->request->params->{'dest_timeout'} || 300;
|
|
my $fw_target_select = $c->request->params->{'dest_target'} || 'disable';
|
|
my $fw_target;
|
|
if ($fw_target_select eq 'sipuri') {
|
|
$dest{timeout} = $fw_timeout;
|
|
$fw_target = $c->request->params->{'dest_sipuri'};
|
|
|
|
# normalize, so we can do some checks.
|
|
$fw_target =~ s/^sip://i;
|
|
|
|
if($fw_target =~ /^\+?\d+$/) {
|
|
$fw_target = csc::Utils::get_qualified_number_for_subscriber($c, $fw_target);
|
|
my $checkresult;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'check_E164_number', $fw_target, \$checkresult);
|
|
unless($checkresult) {
|
|
$messages{toperr} = 'Client.Voip.MalformedNumber'
|
|
} else {
|
|
$fw_target = 'sip:'.$fw_target.'@'.$c->stash->{subscriber}->{domain};
|
|
}
|
|
} elsif($fw_target =~ /^[a-z0-9&=+\$,;?\/_.!~*'()-]+\@[a-z0-9.-]+(:\d{1,5})?$/i) {
|
|
$fw_target = 'sip:'. lc $fw_target;
|
|
} elsif($fw_target =~ /^[a-z0-9&=+\$,;?\/_.!~*'()-]+$/) {
|
|
$fw_target = 'sip:'. lc($fw_target) .'@'. $c->stash->{subscriber}->{domain};
|
|
} else {
|
|
$messages{err_target} = 'Client.Voip.MalformedTarget';
|
|
$fw_target = $c->request->params->{'dest_sipuri'};
|
|
}
|
|
|
|
if ($fw_timeout !~ /^\d+$/) {
|
|
$messages{err_timeout} = 'Client.Voip.MalformedTimeout';
|
|
$fw_timeout = $c->request->params->{'dest_timeout'};
|
|
}
|
|
}
|
|
elsif($fw_target_select eq 'voicebox') {
|
|
$fw_target = 'sip:vmu'.$c->stash->{subscriber}->{cc}.$c->stash->{subscriber}->{ac}.$c->stash->{subscriber}->{sn}."\@$vbdom";
|
|
}
|
|
elsif($fw_target_select eq 'fax2mail') {
|
|
$fw_target = 'sip:'.$c->stash->{subscriber}->{cc}.$c->stash->{subscriber}->{ac}.$c->stash->{subscriber}->{sn}."\@$fmdom";
|
|
}
|
|
elsif($fw_target_select eq 'conference') {
|
|
$fw_target = 'sip:conf='.$c->stash->{subscriber}->{cc}.$c->stash->{subscriber}->{ac}.$c->stash->{subscriber}->{sn}."\@$confdom";
|
|
}
|
|
|
|
if (keys %messages) {
|
|
$messages{topterr} = 'Client.Voip.InputErrorFound';
|
|
$c->session->{messages} = \%messages;
|
|
$c->session->{refill} = { set_id => $c->stash->{dset_id}, item_id => $c->stash->{dtarget_id}, destination => $fw_target, timeout => $fw_timeout };
|
|
|
|
if ($c->stash->{dtarget_id}) {
|
|
$c->response->redirect($c->uri_for('/callforward/destination/target/'.$c->stash->{dtarget_id}.'/edit#dest-'.$c->stash->{dtarget_id}));
|
|
} else { # XXX create a new target "inside" existing set
|
|
$c->session->{refill}->{item_id} = -1;
|
|
$c->response->redirect($c->uri_for('/callforward/destination#dset-'.$c->stash->{dset_id}));
|
|
}
|
|
|
|
$c->detach;
|
|
}
|
|
|
|
$dest{destination} = $fw_target;
|
|
$dest{priority} = $prio;
|
|
|
|
my $ret;
|
|
if ($c->stash->{dtarget_id})
|
|
{
|
|
$dest{id} = $c->stash->{dtarget_id};
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'update_subscriber_cf_destination',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
set_id => $c->stash->{dset_id},
|
|
data => \%dest,
|
|
},
|
|
undef,
|
|
)
|
|
}
|
|
else {
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'create_subscriber_cf_destination',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
set_id => $c->stash->{dset_id},
|
|
data => \%dest,
|
|
},
|
|
undef,
|
|
)
|
|
}
|
|
|
|
if ($ret) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' };
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Client.Voip.InputErrorFound' } ;
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for('/callforward/destination'));
|
|
}
|
|
|
|
sub destination_target_delete : Chained('destination_target_post') PathPart('delete') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
if ($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_subscriber_cf_destination',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
set_id => $c->stash->{dset_id},
|
|
id => $c->stash->{dtarget_id},
|
|
},
|
|
undef,
|
|
)) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' };
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Client.Voip.InputErrorFound' };
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for('/callforward/destination'));
|
|
}
|
|
|
|
##############################################################################
|
|
### period ###
|
|
|
|
sub time : Chained('base') PathPart('time') CaptureArgs(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
$c->stash->{template} = 'tt/callforward_time.tt';
|
|
return unless ( $c->stash->{time_sets} = $c->forward ('load_time_sets') );
|
|
|
|
foreach my $tset (@{$c->stash->{time_sets}}) {
|
|
foreach my $period (@{$tset->{periods}}) {
|
|
$self->period_expand($period);
|
|
}
|
|
}
|
|
|
|
my $year = strftime("%Y", localtime(time()));
|
|
$c->stash->{years} = [ $year .. $year + 10 ];
|
|
|
|
my $mapped = {};
|
|
foreach my $set (@{$c->stash->{time_sets}}) {
|
|
$mapped->{$set->{id}} = 0;
|
|
|
|
if ($c->stash->{cf_maps}) {
|
|
foreach my $map (values %{$c->stash->{cf_maps}}) {
|
|
foreach my $part (@$map) {
|
|
$mapped->{$set->{id}}++ if ($part->{time_set_id} == $set->{id});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
$c->stash->{mapped} = $mapped;
|
|
|
|
if (defined $c->session->{refill}) {
|
|
|
|
foreach my $set (@{$c->stash->{time_sets}}) {
|
|
next if ($set->{id} != $c->session->{refill}->{set_id});
|
|
delete $c->session->{refill}->{set_id};
|
|
|
|
if (defined $c->session->{refill}->{item_id}) {
|
|
foreach my $item (@{$set->{periods}}) {
|
|
next if ($item->{id} != $c->session->{refill}->{item_id});
|
|
delete $c->session->{refill}->{item_id};
|
|
|
|
foreach my $key (keys %{$c->session->{refill}}) {
|
|
$item->{$key} = $c->session->{refill}->{$key};
|
|
}
|
|
}
|
|
|
|
# all new item
|
|
if (exists $c->session->{refill}->{item_id}) {
|
|
delete $c->session->{refill}->{item_id};
|
|
|
|
my $item = { id => -1 }; # indicate that this is not yet in the database
|
|
$c->stash->{tperiod_id} = $item->{id};
|
|
|
|
foreach my $key (keys %{$c->session->{refill}}) {
|
|
$item->{$key} = $c->session->{refill}->{$key};
|
|
}
|
|
push @{$set->{periods}}, $item;
|
|
}
|
|
}
|
|
|
|
foreach my $key (keys %{$c->session->{refill}}) {
|
|
$set->{$key} = $c->session->{refill}->{$key};
|
|
}
|
|
}
|
|
|
|
delete $c->session->{refill};
|
|
}
|
|
}
|
|
|
|
# sub time_list : Chained('time') PathPart('list') Args(0) {
|
|
sub time_list : Chained('time') PathPart('') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
}
|
|
|
|
sub time_set_get : Chained('time') PathPart('set') CaptureArgs(1) {
|
|
my ( $self, $c, $tset_id ) = @_;
|
|
$c->stash->{tset_id} = $tset_id;
|
|
}
|
|
|
|
sub time_set_post : Chained('time') PathPart('set') CaptureArgs(0) {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{tset_id} = $c->request->params->{tset_id};
|
|
}
|
|
|
|
sub time_set_edit : Chained('time_set_get') PathPart('edit') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
}
|
|
|
|
sub time_set_save : Chained('time_set_post') PathPart('save') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
my $ret;
|
|
|
|
if (defined $c->stash->{tset_id}) {
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'update_subscriber_cf_time_set',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
data => {
|
|
name => $c->request->params->{tsetname},
|
|
id => $c->request->params->{tset_id},
|
|
}
|
|
},
|
|
undef,
|
|
)
|
|
}
|
|
else {
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'create_subscriber_cf_time_set',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
data => {
|
|
name => $c->request->params->{tsetname},
|
|
}
|
|
},
|
|
undef,
|
|
)
|
|
}
|
|
if ($ret) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' }
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Client.Voip.Client.Voip.InputErrorFound' }
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for('/callforward/time'));
|
|
}
|
|
|
|
sub time_set_delete : Chained('time_set_post') PathPart('delete') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
if ($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_subscriber_cf_time_set',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
id => $c->stash->{tset_id},
|
|
},
|
|
undef,
|
|
)) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' }
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Client.Voip.Client.Voip.InputErrorFound' }
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for('/callforward/time'));
|
|
}
|
|
|
|
sub time_period_get : Chained('time') PathPart('period') CaptureArgs(1) {
|
|
my ( $self, $c, $tperiod_id ) = @_;
|
|
$c->stash->{tperiod_id} = $tperiod_id;
|
|
}
|
|
|
|
sub time_period_post : Chained('time') PathPart('period') CaptureArgs(0) {
|
|
my ( $self, $c ) = @_;
|
|
$c->stash->{tset_id} = $c->request->params->{tset_id};
|
|
$c->stash->{tperiod_id} = $c->request->params->{tperiod_id};
|
|
}
|
|
|
|
sub time_period_edit : Chained('time_period_get') PathPart('edit') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
}
|
|
|
|
sub time_period_save : Chained('time_period_post') PathPart('save') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my %period;
|
|
$period{from_year} = $c->request->params->{from_year};
|
|
$period{to_year} = $c->request->params->{to_year};
|
|
$period{from_month} = $c->request->params->{from_month};
|
|
$period{to_month} = $c->request->params->{to_month};
|
|
$period{from_mday} = $c->request->params->{from_mday};
|
|
$period{to_mday} = $c->request->params->{to_mday};
|
|
$period{from_wday} = $c->request->params->{from_wday};
|
|
$period{to_wday} = $c->request->params->{to_wday};
|
|
$period{from_hour} = $c->request->params->{from_hour};
|
|
$period{to_hour} = $c->request->params->{to_hour};
|
|
$period{from_minute} = $c->request->params->{from_minute};
|
|
$period{to_minute} = $c->request->params->{to_minute};
|
|
|
|
$c->session->{messages} = $self->period_collapse(\%period);
|
|
|
|
if (keys %{$c->session->{messages}}) {
|
|
$c->session->{refill} = {
|
|
set_id => $c->stash->{tset_id},
|
|
item_id => $c->stash->{tperiod_id},
|
|
|
|
from_year => $c->request->params->{from_year},
|
|
to_year => $c->request->params->{to_year},
|
|
from_month => $c->request->params->{from_month},
|
|
to_month => $c->request->params->{to_month},
|
|
from_mday => $c->request->params->{from_mday},
|
|
to_mday => $c->request->params->{to_mday},
|
|
from_wday => $c->request->params->{from_wday},
|
|
to_wday => $c->request->params->{to_wday},
|
|
from_hour => $c->request->params->{from_hour},
|
|
to_hour => $c->request->params->{to_hour},
|
|
from_minute => $c->request->params->{from_minute},
|
|
to_minute => $c->request->params->{to_minute},
|
|
};
|
|
|
|
if ($c->stash->{tperiod_id}) {
|
|
$c->response->redirect($c->uri_for('/callforward/time/period/' . $c->stash->{tperiod_id} . '/edit#tperiod-'.$c->stash->{tperiod_id}));
|
|
} else {
|
|
$c->session->{refill}->{item_id} = -1;
|
|
$c->response->redirect($c->uri_for('/callforward/time#tset-'.$c->stash->{tset_id}));
|
|
}
|
|
|
|
$c->detach;
|
|
}
|
|
|
|
$period{id} = $c->stash->{tperiod_id} if ($c->stash->{tperiod_id});
|
|
|
|
my $ret;
|
|
if ($c->stash->{tperiod_id}) {
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'update_subscriber_cf_time_period',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
set_id => $c->stash->{tset_id},
|
|
data => \%period,
|
|
},
|
|
undef,
|
|
);
|
|
}
|
|
else {
|
|
$ret = $c->model('Provisioning')->call_prov( $c, 'voip', 'create_subscriber_cf_time_period',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
set_id => $c->stash->{tset_id},
|
|
data => \%period,
|
|
},
|
|
undef,
|
|
);
|
|
}
|
|
|
|
if ($ret) {
|
|
$c->session->{messages}{topmsg} = 'Server.Voip.SavedSettings';
|
|
}
|
|
else {
|
|
$c->session->{messages}{toperr} = 'Client.Voip.InputErrorFound';
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for('/callforward/time'));
|
|
}
|
|
|
|
sub time_period_delete : Chained('time_period_post') PathPart('delete') Args(0) {
|
|
my ( $self, $c ) = @_;
|
|
|
|
if ($c->model('Provisioning')->call_prov( $c, 'voip', 'delete_subscriber_cf_time_period',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
set_id => $c->stash->{tset_id},
|
|
id => $c->stash->{tperiod_id},
|
|
},
|
|
undef,
|
|
)) {
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' };
|
|
}
|
|
else {
|
|
$c->session->{messages} = { toperr => 'Client.Voip.InputErrorFound' };
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for('/callforward/time'));
|
|
}
|
|
|
|
sub set_ringtimeout : Chained('base') PathPart('set_ringtimeout') Args(0) {
|
|
my ($self, $c) = @_;
|
|
my %messages;
|
|
|
|
my $ringtimeout = $c->request->params->{ringtimeout} || 666;
|
|
|
|
if ($ringtimeout =~ /^\d+$/ and $ringtimeout ~~ [5..300]) {
|
|
if ($c->model('Provisioning')->call_prov( $c, 'voip',
|
|
'set_subscriber_preferences',
|
|
{ username => $c->session->{user}->{data}->{username},
|
|
domain => $c->session->{user}->{data}->{domain},
|
|
preferences => { ringtimeout => $ringtimeout }
|
|
}))
|
|
{
|
|
$c->session->{messages} = { topmsg => 'Server.Voip.SavedSettings' };
|
|
}
|
|
}
|
|
else {
|
|
$c->session->{messages} = {
|
|
toperr => 'Client.Voip.InputErrorFound',
|
|
ringtimeout_error => 'Client.Voip.MissingRingtimeout',
|
|
};
|
|
|
|
$c->session->{refill} = { ringtimeout => $ringtimeout };
|
|
}
|
|
|
|
$c->response->redirect($c->uri_for('/callforward/mapping'));
|
|
}
|
|
|
|
### helpers ###
|
|
|
|
sub load_destination_sets :Private {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $destination_sets;
|
|
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_cf_destination_sets',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
},
|
|
\$destination_sets,
|
|
);
|
|
|
|
my $vbdom = $c->config->{voicebox_domain};
|
|
my $fmdom = $c->config->{fax2mail_domain};
|
|
my $confdom = $c->config->{conference_domain};
|
|
|
|
foreach my $set (@{$destination_sets}) {
|
|
foreach my $dest (@{$set->{destinations}}) {
|
|
if($dest->{destination} =~ /\@$vbdom$/) {
|
|
$dest->{destination} = 'voicebox';
|
|
}
|
|
elsif ($dest->{destination} =~ /\@$fmdom$/) {
|
|
$dest->{destination} = 'fax2mail';
|
|
}
|
|
elsif ($dest->{destination} =~ /\@$confdom$/) {
|
|
$dest->{destination} = 'conference';
|
|
}
|
|
elsif ($dest->{destination} =~ /^sip:\+?[0-9]+\@/) {
|
|
$dest->{destination} =~ s/^sip:([^\@]+)\@.+$/$1/;
|
|
}
|
|
#else {
|
|
# die;
|
|
#}
|
|
}
|
|
}
|
|
|
|
return $destination_sets;
|
|
}
|
|
|
|
sub load_time_sets :Private {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $time_sets;
|
|
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_cf_time_sets',
|
|
{ username => $c->session->{user}->{data}->{username},
|
|
domain => $c->session->{user}->{data}->{domain},
|
|
},
|
|
\$time_sets,
|
|
);
|
|
|
|
return $time_sets;
|
|
}
|
|
|
|
sub load_subscriber :Private {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $subscriber;
|
|
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'billing', 'get_voip_account_subscriber_by_id',
|
|
{ subscriber_id => $c->session->{user}->{data}->{subscriber_id} },
|
|
\$subscriber,
|
|
);
|
|
|
|
$subscriber->{active_number} = csc::Utils::get_active_number_string($c);
|
|
return $subscriber;
|
|
}
|
|
|
|
sub load_maps :Private {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $maps;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_cf_maps',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
},
|
|
\$maps,
|
|
);
|
|
return $maps;
|
|
}
|
|
|
|
sub load_cf_types :Private {
|
|
my ( $self, $c ) = @_;
|
|
|
|
return [
|
|
{ name => 'cfu', description => 'Call Forward Unconditional' },
|
|
{ name => 'cfb', description => 'Call Forward Busy' },
|
|
{ name => 'cft', description => 'Call Forward Timeout' },
|
|
{ name => 'cfna', description => 'Call Forward Unavailable' },
|
|
];
|
|
}
|
|
|
|
sub period_expand : Private {
|
|
my ($self, $period) = @_;
|
|
|
|
foreach my $part ('year', 'month', 'mday', 'wday', 'hour', 'minute') {
|
|
|
|
if (defined $period->{$part} && $period->{$part} =~ /^(\d+)$/) {
|
|
$period->{'from_' . $part} = $1;
|
|
}
|
|
elsif(defined $period->{$part} && $period->{$part} =~ /^(\d+)\-(\d+)$/) {
|
|
$period->{'from_' . $part} = $1;
|
|
$period->{'to_' . $part} = $2;
|
|
}
|
|
|
|
delete $period->{$part};
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
sub period_collapse : Private {
|
|
my ($self, $period) = @_;
|
|
my %messages;
|
|
|
|
foreach my $part ('year', 'month', 'mday', 'wday', 'hour', 'minute') {
|
|
my $from = ( $period->{'from_' . $part} >= 0 ) ? $period->{'from_' . $part} : undef;
|
|
my $to = ( $period->{'to_' . $part} >= 0 ) ? $period->{'to_' . $part} : undef;
|
|
my $collapsed;
|
|
|
|
if (defined $from) {
|
|
$collapsed = $from;
|
|
if (defined $to) {
|
|
if ($part eq 'year' && $from > $to) {
|
|
$messages{err_year} = 'Client.Syntax.FromAfterTo';
|
|
}
|
|
$collapsed .= '-' . $to;
|
|
}
|
|
}
|
|
elsif (defined $to) {
|
|
$messages{'err_'.$part} = 'Client.Syntax.FromMissing';
|
|
}
|
|
|
|
|
|
delete $period->{'from_' . $part};
|
|
delete $period->{'to_' . $part};
|
|
$period->{$part} = $collapsed;
|
|
}
|
|
|
|
return \%messages;
|
|
}
|
|
|
|
sub load_preferences :Private {
|
|
my ( $self, $c ) = @_;
|
|
|
|
my $prefs;
|
|
return unless $c->model('Provisioning')->call_prov( $c, 'voip', 'get_subscriber_preferences',
|
|
{ username => $c->stash->{subscriber}->{username},
|
|
domain => $c->stash->{subscriber}->{domain},
|
|
},
|
|
\$prefs,
|
|
);
|
|
return $prefs;
|
|
}
|
|
|
|
1;
|