|
|
|
|
@ -643,6 +643,17 @@ sub preferences :Chained('base') :PathPart('preferences') :Args(0) {
|
|
|
|
|
$sset_name = $map->source_set->name;
|
|
|
|
|
$sset_mode = $map->source_set->mode;
|
|
|
|
|
}
|
|
|
|
|
my @bnumbers = ();
|
|
|
|
|
my $bset_name = undef;
|
|
|
|
|
my $bset_mode = undef;
|
|
|
|
|
if($map->bnumber_set) {
|
|
|
|
|
@bnumbers = map { { $_->get_columns } } $map->bnumber_set->voip_cf_bnumbers->all;
|
|
|
|
|
foreach my $s(@bnumbers) {
|
|
|
|
|
$s->{as_string} = $s->{bnumber};
|
|
|
|
|
}
|
|
|
|
|
$bset_name = $map->bnumber_set->name;
|
|
|
|
|
$bset_mode = $map->bnumber_set->mode;
|
|
|
|
|
}
|
|
|
|
|
push @{ $cfs->{$type} }, {
|
|
|
|
|
destinations => \@dset,
|
|
|
|
|
dset_name => $dset_name,
|
|
|
|
|
@ -650,7 +661,11 @@ sub preferences :Chained('base') :PathPart('preferences') :Args(0) {
|
|
|
|
|
tset_name => $tset_name,
|
|
|
|
|
sources => \@sources,
|
|
|
|
|
sset_name => $sset_name,
|
|
|
|
|
sset_mode => $sset_mode };
|
|
|
|
|
sset_mode => $sset_mode,
|
|
|
|
|
bset_name => $bset_name,
|
|
|
|
|
bset_mode => $bset_mode,
|
|
|
|
|
bnumbers => \@bnumbers,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
$c->stash(cf_destinations => $cfs);
|
|
|
|
|
@ -876,10 +891,12 @@ sub preferences_callforward :Chained('base') :PathPart('preferences/callforward'
|
|
|
|
|
} elsif($cf_mapping->first && $cf_mapping->first->destination_set &&
|
|
|
|
|
$cf_mapping->first->destination_set->voip_cf_destinations->first) {
|
|
|
|
|
|
|
|
|
|
# there are more than one destinations or a time set, so
|
|
|
|
|
# which can only be handled in advanced mode
|
|
|
|
|
# there are more than one destinations or a time set or a source set or a bnumber set
|
|
|
|
|
# => these can only be handled in advanced mode
|
|
|
|
|
if($cf_mapping->first->destination_set->voip_cf_destinations->count > 1 ||
|
|
|
|
|
$cf_mapping->first->time_set) {
|
|
|
|
|
$cf_mapping->first->time_set_id ||
|
|
|
|
|
$cf_mapping->first->source_set_id ||
|
|
|
|
|
$cf_mapping->first->bnumber_set_id) {
|
|
|
|
|
|
|
|
|
|
$c->response->redirect(
|
|
|
|
|
$c->uri_for_action('/subscriber/preferences_callforward_advanced',
|
|
|
|
|
@ -1094,6 +1111,7 @@ sub preferences_callforward_advanced :Chained('base') :PathPart('preferences/cal
|
|
|
|
|
->search_rs(undef,{order_by => 'name'});
|
|
|
|
|
$c->stash->{cf_time_sets} = $prov_subscriber->voip_cf_time_sets;
|
|
|
|
|
$c->stash->{cf_source_sets} = $prov_subscriber->voip_cf_source_sets;
|
|
|
|
|
$c->stash->{cf_bnumber_sets} = $prov_subscriber->voip_cf_bnumber_sets;
|
|
|
|
|
|
|
|
|
|
my $posted = ($c->request->method eq 'POST');
|
|
|
|
|
|
|
|
|
|
@ -1110,6 +1128,7 @@ sub preferences_callforward_advanced :Chained('base') :PathPart('preferences/cal
|
|
|
|
|
destination_set => $map->destination_set ? $map->destination_set->id : undef,
|
|
|
|
|
time_set => $map->time_set ? $map->time_set->id : undef,
|
|
|
|
|
source_set => $map->source_set ? $map->source_set->id : undef,
|
|
|
|
|
bnumber_set => $map->bnumber_set ? $map->bnumber_set->id : undef,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
my $params = {
|
|
|
|
|
@ -1143,6 +1162,10 @@ sub preferences_callforward_advanced :Chained('base') :PathPart('preferences/cal
|
|
|
|
|
$c->uri_for_action('/subscriber/preferences_callforward_sourceset',
|
|
|
|
|
[$c->req->captures->[0]], $cf_type,
|
|
|
|
|
),
|
|
|
|
|
'cf_actions.edit_bnumber_sets' =>
|
|
|
|
|
$c->uri_for_action('/subscriber/preferences_callforward_bnumberset',
|
|
|
|
|
[$c->req->captures->[0]], $cf_type,
|
|
|
|
|
),
|
|
|
|
|
},
|
|
|
|
|
back_uri => $c->req->uri,
|
|
|
|
|
);
|
|
|
|
|
@ -1180,6 +1203,7 @@ sub preferences_callforward_advanced :Chained('base') :PathPart('preferences/cal
|
|
|
|
|
destination_set_id => $map->field('destination_set')->value,
|
|
|
|
|
time_set_id => $map->field('time_set')->value,
|
|
|
|
|
source_set_id => $map->field('source_set')->value,
|
|
|
|
|
bnumber_set_id => $map->field('bnumber_set')->value,
|
|
|
|
|
});
|
|
|
|
|
$cf_preference->create({ value => $m->id });
|
|
|
|
|
$autoattendant_count -= NGCP::Panel::Utils::Subscriber::check_dset_autoattendant_status($m->destination_set);
|
|
|
|
|
@ -1818,6 +1842,277 @@ sub preferences_callforward_sourceset_delete :Chained('preferences_callforward_s
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub preferences_callforward_bnumberset :Chained('base') :PathPart('preferences/bnumberset') :Args(1) {
|
|
|
|
|
my ($self, $c, $cf_type) = @_;
|
|
|
|
|
|
|
|
|
|
$c->detach('/denied_page')
|
|
|
|
|
if(($c->user->roles eq "admin" || $c->user->roles eq "reseller") && $c->user->read_only);
|
|
|
|
|
|
|
|
|
|
my $prov_subscriber = $c->stash->{subscriber}->provisioning_voip_subscriber;
|
|
|
|
|
|
|
|
|
|
my @sets;
|
|
|
|
|
if($prov_subscriber->voip_cf_bnumber_sets) {
|
|
|
|
|
foreach my $set($prov_subscriber->voip_cf_bnumber_sets->all) {
|
|
|
|
|
if($set->voip_cf_bnumbers) {
|
|
|
|
|
my @bnumbers = map { { $_->get_columns } } $set->voip_cf_bnumbers->all;
|
|
|
|
|
foreach my $s(@bnumbers) {
|
|
|
|
|
$s->{as_string} = $s->{bnumber};
|
|
|
|
|
}
|
|
|
|
|
push @sets, { name => $set->name, mode => $set->mode, id => $set->id, bnumbers => \@bnumbers };
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$self->load_preference_list($c);
|
|
|
|
|
$c->stash(template => 'subscriber/preferences.tt');
|
|
|
|
|
$c->stash(
|
|
|
|
|
edit_bnumberset_flag => 1,
|
|
|
|
|
cf_form => undef,
|
|
|
|
|
cf_type => $cf_type,
|
|
|
|
|
cf_bnumber_sets => \@sets,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub preferences_callforward_bnumberset_create :Chained('base') :PathPart('preferences/bnumberset/create') :Args(1) {
|
|
|
|
|
my ($self, $c, $cf_type) = @_;
|
|
|
|
|
|
|
|
|
|
$c->detach('/denied_page')
|
|
|
|
|
if(($c->user->roles eq "admin" || $c->user->roles eq "reseller") && $c->user->read_only);
|
|
|
|
|
|
|
|
|
|
my $prov_subscriber = $c->stash->{subscriber}->provisioning_voip_subscriber;
|
|
|
|
|
|
|
|
|
|
my $form = NGCP::Panel::Form::get("NGCP::Panel::Form::CallforwardBnumberSet", $c);
|
|
|
|
|
|
|
|
|
|
my $posted = ($c->request->method eq 'POST');
|
|
|
|
|
|
|
|
|
|
$form->process(
|
|
|
|
|
posted => $posted,
|
|
|
|
|
params => $c->req->params,
|
|
|
|
|
);
|
|
|
|
|
NGCP::Panel::Utils::Navigation::check_form_buttons(
|
|
|
|
|
c => $c,
|
|
|
|
|
form => $form,
|
|
|
|
|
fields => {},
|
|
|
|
|
back_uri => $c->req->uri,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if($posted && $form->validated) {
|
|
|
|
|
try {
|
|
|
|
|
my $schema = $c->model('DB');
|
|
|
|
|
$schema->txn_do(sub {
|
|
|
|
|
my @fields = $form->field('bnumbers')->fields;
|
|
|
|
|
if(@fields) {
|
|
|
|
|
my $set = $prov_subscriber->voip_cf_bnumber_sets->create({
|
|
|
|
|
name => $form->field('name')->value,
|
|
|
|
|
mode => $form->field('mode')->value,
|
|
|
|
|
});
|
|
|
|
|
foreach my $bnum_row(@fields) {
|
|
|
|
|
my $s = $bnum_row->field('number')->value;
|
|
|
|
|
|
|
|
|
|
$set->voip_cf_bnumbers->create({
|
|
|
|
|
bnumber => $s,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
NGCP::Panel::Utils::Message::info(
|
|
|
|
|
c => $c,
|
|
|
|
|
type => 'internal',
|
|
|
|
|
desc => $c->loc('Successfully created new source set'),
|
|
|
|
|
);
|
|
|
|
|
} catch($e) {
|
|
|
|
|
NGCP::Panel::Utils::Message::error(
|
|
|
|
|
c => $c,
|
|
|
|
|
error => $e,
|
|
|
|
|
type => 'internal',
|
|
|
|
|
desc => $c->loc('Failed to create new source set'),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
NGCP::Panel::Utils::Navigation::back_or($c,
|
|
|
|
|
$c->uri_for_action('/subscriber/preferences_callforward_bnumberset',
|
|
|
|
|
[$c->req->captures->[0]], $cf_type)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$self->load_preference_list($c);
|
|
|
|
|
$c->stash(template => 'subscriber/preferences.tt');
|
|
|
|
|
$c->stash(
|
|
|
|
|
edit_cf_flag => 1,
|
|
|
|
|
cf_description => $c->loc('B-Number Set'),
|
|
|
|
|
cf_form => $form,
|
|
|
|
|
cf_type => $cf_type,
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub preferences_callforward_bnumberset_base :Chained('base') :PathPart('preferences/bnumberset') :CaptureArgs(1) {
|
|
|
|
|
my ($self, $c, $set_id) = @_;
|
|
|
|
|
|
|
|
|
|
$c->detach('/denied_page')
|
|
|
|
|
if(($c->user->roles eq "admin" || $c->user->roles eq "reseller") && $c->user->read_only);
|
|
|
|
|
|
|
|
|
|
$c->stash->{bnumber_set} = $c->stash->{subscriber}
|
|
|
|
|
->provisioning_voip_subscriber
|
|
|
|
|
->voip_cf_bnumber_sets
|
|
|
|
|
->find($set_id);
|
|
|
|
|
|
|
|
|
|
$self->load_preference_list($c);
|
|
|
|
|
$c->stash(template => 'subscriber/preferences.tt');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub preferences_callforward_bnumberset_edit :Chained('preferences_callforward_bnumberset_base') :PathPart('edit') :Args(1) {
|
|
|
|
|
my ($self, $c, $cf_type) = @_;
|
|
|
|
|
my $fallback = $c->uri_for_action('/subscriber/preferences_callforward_bnumberset',
|
|
|
|
|
[$c->req->captures->[0]], $cf_type);
|
|
|
|
|
|
|
|
|
|
my $posted = ($c->request->method eq 'POST');
|
|
|
|
|
|
|
|
|
|
my $cf_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
|
|
|
|
|
c => $c, prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber,
|
|
|
|
|
attribute => $cf_type,
|
|
|
|
|
);
|
|
|
|
|
my $ringtimeout_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
|
|
|
|
|
c => $c, prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber,
|
|
|
|
|
attribute => 'ringtimeout',
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
my $set = $c->stash->{bnumber_set};
|
|
|
|
|
my $params;
|
|
|
|
|
unless($posted) {
|
|
|
|
|
$params->{name} = $set->name;
|
|
|
|
|
$params->{mode} = $set->mode;
|
|
|
|
|
my @numbers;
|
|
|
|
|
for my $bnum_rows($set->voip_cf_bnumbers->all) {
|
|
|
|
|
push @numbers, {
|
|
|
|
|
number => $bnum_rows->bnumber,
|
|
|
|
|
id => $bnum_rows->id,
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
$params->{bnumbers} = \@numbers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
my $form = NGCP::Panel::Form::get("NGCP::Panel::Form::CallforwardBnumberSet", $c);
|
|
|
|
|
$form->process(
|
|
|
|
|
posted => $posted,
|
|
|
|
|
params => $c->req->params,
|
|
|
|
|
item => $params,
|
|
|
|
|
);
|
|
|
|
|
NGCP::Panel::Utils::Navigation::check_form_buttons(
|
|
|
|
|
c => $c,
|
|
|
|
|
form => $form,
|
|
|
|
|
fields => {},
|
|
|
|
|
back_uri => $c->req->uri,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if($posted && $form->validated) {
|
|
|
|
|
try {
|
|
|
|
|
my $schema = $c->model('DB');
|
|
|
|
|
$schema->txn_do(sub {
|
|
|
|
|
# delete whole set and mapping if empty
|
|
|
|
|
my @fields = $form->field('bnumbers')->fields;
|
|
|
|
|
unless(@fields) {
|
|
|
|
|
foreach my $mapping($set->voip_cf_mappings->all) {
|
|
|
|
|
# delete it here (this has been a design decicion from the beginning for all parts of cfs)
|
|
|
|
|
my $cf = $cf_preference->find({ value => $mapping->id });
|
|
|
|
|
$cf->delete if $cf;
|
|
|
|
|
$ringtimeout_preference->first->delete
|
|
|
|
|
if($cf_type eq "cft" && $ringtimeout_preference->first);
|
|
|
|
|
$mapping->delete;
|
|
|
|
|
}
|
|
|
|
|
$set->delete;
|
|
|
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $fallback, 1);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if($form->field('name')->value ne $set->name) {
|
|
|
|
|
$set->update({name => $form->field('name')->value});
|
|
|
|
|
}
|
|
|
|
|
if($form->field('mode')->value ne $set->mode) {
|
|
|
|
|
$set->update({mode => $form->field('mode')->value});
|
|
|
|
|
}
|
|
|
|
|
$set->voip_cf_bnumbers->delete_all;
|
|
|
|
|
|
|
|
|
|
foreach my $src(@fields) {
|
|
|
|
|
my $s = $src->field('number')->value;
|
|
|
|
|
|
|
|
|
|
$set->voip_cf_bnumbers->create({
|
|
|
|
|
bnumber => $s,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
$set->discard_changes; # reload (voip_cf_bnumbers may be cached)
|
|
|
|
|
});
|
|
|
|
|
NGCP::Panel::Utils::Message::info(
|
|
|
|
|
c => $c,
|
|
|
|
|
type => 'internal',
|
|
|
|
|
desc => $c->loc('Successfully updated bnumber set'),
|
|
|
|
|
);
|
|
|
|
|
} catch($e) {
|
|
|
|
|
NGCP::Panel::Utils::Message::error(
|
|
|
|
|
c => $c,
|
|
|
|
|
error => $e,
|
|
|
|
|
type => 'internal',
|
|
|
|
|
desc => $c->loc('Failed to update bnumber set'),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
NGCP::Panel::Utils::Navigation::back_or($c, $fallback);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$c->stash(
|
|
|
|
|
edit_cf_flag => 1,
|
|
|
|
|
cf_description => "B-Number Set",
|
|
|
|
|
cf_form => $form,
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub preferences_callforward_bnumberset_delete :Chained('preferences_callforward_bnumberset_base') :PathPart('delete') :Args(1) {
|
|
|
|
|
my ($self, $c, $cf_type) = @_;
|
|
|
|
|
|
|
|
|
|
my $cf_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
|
|
|
|
|
c => $c, prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber,
|
|
|
|
|
attribute => $cf_type,
|
|
|
|
|
);
|
|
|
|
|
my $ringtimeout_preference = NGCP::Panel::Utils::Preferences::get_usr_preference_rs(
|
|
|
|
|
c => $c, prov_subscriber => $c->stash->{subscriber}->provisioning_voip_subscriber,
|
|
|
|
|
attribute => 'ringtimeout',
|
|
|
|
|
);
|
|
|
|
|
my $set = $c->stash->{bnumber_set};
|
|
|
|
|
my $prov_subscriber = $c->stash->{subscriber}->provisioning_voip_subscriber;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
my $schema = $c->model('DB');
|
|
|
|
|
$schema->txn_do(sub {
|
|
|
|
|
foreach my $map($set->voip_cf_mappings->all) {
|
|
|
|
|
my $cf = $cf_preference->find({ value => $map->id });
|
|
|
|
|
$cf->delete if $cf;
|
|
|
|
|
$map->delete;
|
|
|
|
|
}
|
|
|
|
|
if($cf_type eq "cft" &&
|
|
|
|
|
$prov_subscriber->voip_cf_mappings->search_rs({ type => $cf_type})->count == 0) {
|
|
|
|
|
$ringtimeout_preference->first->delete;
|
|
|
|
|
}
|
|
|
|
|
$set->delete;
|
|
|
|
|
});
|
|
|
|
|
NGCP::Panel::Utils::Message::info(
|
|
|
|
|
c => $c,
|
|
|
|
|
data => { $set->get_inflated_columns },
|
|
|
|
|
type => 'internal',
|
|
|
|
|
desc => $c->loc('Successfully deleted bnumber set'),
|
|
|
|
|
);
|
|
|
|
|
} catch($e) {
|
|
|
|
|
NGCP::Panel::Utils::Message::error(
|
|
|
|
|
c => $c,
|
|
|
|
|
error => $e,
|
|
|
|
|
data => { $set->get_inflated_columns },
|
|
|
|
|
type => 'internal',
|
|
|
|
|
desc => $c->loc('Failed to delete bnumber set'),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NGCP::Panel::Utils::Navigation::back_or($c,
|
|
|
|
|
$c->uri_for_action('/subscriber/preferences_callforward_bnumberset',
|
|
|
|
|
[$c->req->captures->[0]], $cf_type)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub preferences_callforward_timeset :Chained('base') :PathPart('preferences/timeset') :Args(1) {
|
|
|
|
|
my ($self, $c, $cf_type) = @_;
|
|
|
|
|
|
|
|
|
|
|