<& elements/edit.html, 'name' => 'Billing event definition', 'table' => 'part_event', 'fields' => [ 'event', { field => 'eventtable', type => 'select', options => [ FS::part_event->eventtables ], labels => $eventtable_labels, onchange => 'eventtable_changed', }, { field => 'agentnum', type => 'select-agent', disable_empty => $disable_empty_agent, }, { field => 'check_freq', type => 'select', options => [ '1d', '1m' ], labels => $check_freq_labels, }, { field => 'disabled', type => 'checkbox', value => 'Y', }, { field => '_initialize', type => 'checkbox', onchange => '_initialize_changed', value => 'Y', }, { type => 'title', value => 'Event Conditions', }, { field => 'conditionname', type => 'selectlayersx', options => [ keys %all_conditions ], labels => \%condition_labels, onchange => 'condition_changed(what);', layer_fields => \%condition_fields, layer_values_callback => $condition_layer_values, html_between => n_a('action'), m2name_table => 'part_event_condition', m2name_namecol => 'conditionname', m2_label => 'Condition', m2_new_default => \@implicit_condition_objs, m2_error_callback => $condition_error_callback, m2_remove_warnings => \%condition_remove_warnings, m2_new_js => 'condition_repop', m2_remove_js => 'condition_add', }, { type => 'title', value => 'Event Action', }, { field => 'action', type => 'selectlayersx', options => [ keys %all_actions ], labels => \%action_labels, onchange => 'action_changed(what);', layer_fields => \%action_fields, layer_values_callback => $action_layer_values, html_between => n_a('action'), }, ], 'labels' => { 'eventpart' => 'Event', 'event' => 'Event name', 'eventtable' => 'Type', 'agentnum' => 'Agent', 'check_freq' => 'Check frequency', 'disabled' => 'Disable event', 'conditionname' => 'Add new condition', #'weight', 'action' => 'Action', '_initialize' => 'Initialize event', }, 'viewall_dir' => 'browse', 'new_callback' => sub { #start empty for new events only my( $cgi, $object, $fields_listref ) = @_; unshift @{ $fields_listref->[1]{'options'} }, ''; }, 'error_callback' => $error_callback, 'agent_virt' => 1, 'agent_null_right' => 'Edit global billing events', &> <%once> #misc (eventtable, check_freq) my $eventtable_labels = FS::part_event->eventtable_labels; $eventtable_labels->{''} = '** Select type **'; my $check_freq_labels = FS::part_event->check_freq_labels; #conditions tie my %all_conditions, 'Tie::IxHash', '' => { 'description' => '*** Select new condition ***', }, FS::part_event_condition->conditions(); # *** Select new condition *** sorts to the beginning anyway (tied %all_conditions)->SortByValue; my %condition_labels = map { $_ => $all_conditions{$_}->{'description'} } keys %all_conditions; #my %condition_fields = map { $_ => $all_conditions{$_}->{option_fields} } # keys %all_conditions; my %condition_fields = map { my $c = $_; tie my %opts, 'Tie::IxHash', @{ $all_conditions{$c}->{'option_fields'} || []}; %opts = ( map { ( "$c.$_" => $opts{$_} ); } keys %opts ); ( $c => [ %opts ] ); } keys %all_conditions; my @implicit_conditions = sort { $all_conditions{$a}->{'implicit_flag'} <=> $all_conditions{$b}->{'implicit_flag'} } grep { $all_conditions{$_}->{'implicit_flag'} } keys %all_conditions; my @implicit_condition_objs = map { new FS::part_event_condition { 'conditionname' => $_, }; } @implicit_conditions; my %condition_remove_warnings = map { ( $_ => $all_conditions{$_}->{'remove_warning'} ); } grep { $all_conditions{$_}->{'remove_warning'} } keys %all_conditions; #actions tie my %all_actions, 'Tie::IxHash', '' => { 'description' => '*** Select event action ***', }, FS::part_event->actions(); (tied %all_actions)->SortByValue; my %action_labels = map { $_ => $all_actions{$_}->{'description'} } keys %all_actions; #my %action_fields = map { $_ => $all_actions{$_}->{option_fields} } # keys %all_actions; my %action_fields = map { my $action = $_; tie my %opts, 'Tie::IxHash', @{ $all_actions{$action}->{option_fields} || [] }; %opts = ( map { ( "$action.$_" => $opts{$_} ); } keys %opts ); ( $action => [ %opts ] ); } keys %all_actions; #subs sub n_a { my $t = shift; return sub { my $field = shift; qq( '; }; } my $action_layer_values = sub { my( $cgi, $part_event ) = @_; my $action = $cgi->param('action') || $part_event->action; return {} unless $action; scalar( #force hashref { #map { $_ => { $part_event->options } } # keys %action_fields map { my $action = $_; my %fields = @{ $action_fields{$action} }; my %obj_opts = $part_event->options; %obj_opts = map { ( "$action.$_" => $obj_opts{$_} ); } keys %obj_opts; my %opts = map { #false laziness w/process/part_event.html my $option = $_; my $value = scalar($cgi->param($_)) || $obj_opts{$_}; if ( $option =~ /^(.*)\.reasonnum$/ && $value == -1 ) { $value = { 'typenum' => scalar( $cgi->param( "new${option}T" ) ), 'reason' => scalar( $cgi->param( "new${option}" ) ), }; } ( $option => $value ); } keys %fields; ( $action => \%opts ); } keys %action_fields } ); }; tie my %cgi_conditions, 'Tie::IxHash'; my $error_callback = sub { my( $cgi, $object, $fields_listref ) = @_; my @cond_params = grep /^conditionname\d+$/, $cgi->param; %cgi_conditions = map { my $param = $_; my $conditionname = $cgi->param($param); $conditionname => { map { my $cgi_key = $_; $cgi_key =~ /^$param\.$conditionname\.(.*)$/ or die 'wtf!'; my $key = $1; #my $value = $cgi->param($_); #my $info = $all_conditions->{$conditionname} my %cond_opts = @{ $all_conditions{$conditionname}->{'option_fields'} || []}; my $info = $cond_opts{$key}; my $value; #false laziness w/process/part_event.html if ( $info->{'type'} =~ /^(select|checkbox)-?multiple$/ or $info->{'type'} =~ /^select/ && $info->{'multiple'} ) { $value = { map { $_ => 1 } $cgi->param($cgi_key) }; } elsif ( $info->{'type'} eq 'freq' ) { $value = $cgi->param($cgi_key). $cgi->param($cgi_key.'_units'); } else { $value = $cgi->param($cgi_key); } $key => $value; } grep /^$param\.$conditionname\./, $cgi->param }; } grep $cgi->param($_), grep /^conditionname\d+$/, $cgi->param; }; my $condition_error_callback = sub { map { new FS::part_event_condition { 'conditionname' => $_, }; } keys %cgi_conditions; }; my $condition_layer_values = sub { #m2_table option causes this to be # part_event_condition instead of part_event my ( $cgi, $part_event_condition, $switches ) = @_; scalar( #force hashref { #map { $_ => { $part_event_condition->options } } # keys %condition_fields map { my $conditionname = $_; my %opts = $switches->{'mode'} eq 'error' ? %{ $cgi_conditions{$conditionname} || {} } : $part_event_condition->options; %opts = ( map { ( "$conditionname.$_" => $opts{$_} ); } keys %opts ); ( $conditionname => \%opts ); } keys %condition_fields } ); }; <%init> my $curuser = $FS::CurrentUser::CurrentUser; die "access denied" unless $curuser->access_right('Edit billing events') || $curuser->access_right('Edit global billing events'); my $disable_empty_agent= ! $curuser->access_right('Edit global billing events'); %cgi_conditions = (); my $use_cgi_conditions = 0; my $JS_DEBUG = 0;