ngcp-panel/lib/NGCP/Panel/Field/TimezoneSelect.pm

136 lines
5.0 KiB

package NGCP::Panel::Field::TimezoneSelect;
use HTML::FormHandler::Moose;
use NGCP::Panel::Utils::DateTime;
extends 'HTML::FormHandler::Field::Compound';
has_field 'name' => (
type => '+NGCP::Panel::Field::DataTable',
label => 'Timezone',
do_label => 0,
do_wrapper => 0,
required => 1,
template => 'helpers/datatables_field.tt',
ajax_src => '/contact/timezone_ajax',
table_titles => ['Name'],
table_fields => ['name'],
adjust_datatable_vars => \&adjust_datatable_vars,
inflate_default_method => \&inflate_timezone,#from db to form
deflate_value_method => \&deflate_timezone,#from form to db
);
sub validate {
my $self = shift;
my $form = $self->form;
my $c = $form->ctx;
return unless $c;
my $value = $self->value;
if (ref $value && exists $value->{name}) {
$value = $value->{name};
} else {
$self->add_error(
sprintf 'Invalid validation of unparsed input: %s', $value);
return;
}
#is_valid_timezone_name($tz, $all, $c, $allow_empty)
#unless(grep { /^\Q$value\E$/ } DateTime::TimeZone->all_names) {
unless (NGCP::Panel::Utils::DateTime::is_valid_timezone_name($value, 0, $c, 1)) {
$self->add_error(sprintf 'Invalid timezone name: %s', $value);
}
return;
}
sub adjust_datatable_vars {
my ($self, $vars) = @_;
my $form = $self->form;
my $ctx = $form->ctx;
return unless $ctx;
my ($tz_owner_parent_type, $tz_owner_parent_id) = get_parent_info($ctx);
$vars->{ajax_src} = (
$ctx->uri_for_action('/contact/timezone_ajax', $tz_owner_parent_type, $tz_owner_parent_id)->as_string
);
}
sub deflate_timezone { # deflate: default value: clean and return empty string
my ( $self, $value ) = @_;
my $c = $self->form->ctx;
$value = NGCP::Panel::Utils::DateTime::strip_empty_timezone_name($c, $value);
$value = NGCP::Panel::Utils::DateTime::get_timezone_link($c, $value);
return $value;
}
sub inflate_timezone { # inflate: name empty timezone properly so it could be checked by form
my ($self, $value) = @_;
if (!$value) {
my $c = $self->form->ctx;
my ($parent_owner_type, $parent_owner_id) = get_parent_info($c);
my $default_tz_data = NGCP::Panel::Utils::DateTime::get_default_timezone_name($c, $parent_owner_type, $parent_owner_id);
$value = $default_tz_data->{name};
}
return $value;
}
sub get_parent_info {
my ($c) = @_;
my ($tz_owner_parent_type,$tz_owner_parent_id) = ('', '');
my $schema = $c->model('DB');
if ($c->stash->{subscriber}) {
$tz_owner_parent_type = 'contract';
#billing subscriber
$tz_owner_parent_id = $c->stash->{subscriber}->contract_id;
} elsif ($c->stash->{contract}) {
$tz_owner_parent_type = 'reseller';
$tz_owner_parent_id = $c->stash->{contract}->contact->reseller_id // '';
} elsif ($c->stash->{contact}) {
#edit - we can rely on contact owner info
my $contact_id = $c->stash->{contact}->id;
my %timezones_spec = (
'subscriber' => 'voip_subscriber_timezone',
'contract' => 'contract_timezone');
while (my($type,$result_set) = each %timezones_spec ) {
if (my $owner_tz = $schema->resultset($result_set)->search_rs({contact_id => $contact_id})->first) {
if ($type eq 'subscriber') {
$tz_owner_parent_type = 'contract';
#billing subscriber
$tz_owner_parent_id = $owner_tz->voip_subscriber->contract->id;
} elsif ($type eq 'contract') {
$tz_owner_parent_type = 'reseller';
#billing subscriber
$tz_owner_parent_id = $owner_tz->contract->contact->reseller_id // '';
}
last;
}
}
} elsif ($c->stash->{close_target}) {
my $close_target = $c->stash->{close_target};
if ($close_target =~m!/(contract|customer)(?:/[^0-9]+)?/([0-9]+)/!) {
if ($close_target =~m!/subscriber/create/!) {
$tz_owner_parent_type = 'contract';
$tz_owner_parent_id = $2;
} else {
$tz_owner_parent_type = 'reseller';
#it may be reseller contract
$tz_owner_parent_id = $schema->resultset('contracts')->search_rs({id => $2})->first->contact->reseller_id;
if (!$tz_owner_parent_id) {
#it is reseller contract
$tz_owner_parent_type = 'top';
}
}
} elsif ($close_target =~m!/(subscriber)(?:/[^0-9]+)?/([0-9]+)/!) {
$tz_owner_parent_type = 'contract';
#billing subscriber
$tz_owner_parent_id = $schema->resultset('voip_subscribers')->search_rs({id => $2})->first->contract_id;
} elsif ($close_target =~m!/reseller/!) {
$tz_owner_parent_type = 'top';
}
} else {
$tz_owner_parent_type = 'noparentinfo';
}
return $tz_owner_parent_type, $tz_owner_parent_id;
}
no Moose;
1;