<% include('/elements/header.html', "$action Service Definition", menubar('View all service definitions' => "${p}browse/part_svc.cgi"), #" onLoad=\"visualize()\"" ) %>
Service Part #<% $part_svc->svcpart ? $part_svc->svcpart : "(NEW)" %>

Service
Disable new orders {disabled} eq 'Y' ? ' CHECKED' : '' %>>

Service definitions are the templates for items you offer to your customers. For the selected table, you can give fields default or fixed (unchangable) values, or select an inventory class to manually or automatically fill in that field.

% #YUCK. false laziness w/part_svc.pm. go away virtual fields, please % my %vfields; % foreach my $svcdb ( FS::part_svc->svc_tables() ) { % eval "use FS::$svcdb;"; % my $self = "FS::$svcdb"->new; % $vfields{$svcdb} = {}; % foreach my $field ($self->virtual_fields) { # svc_Common::virtual_fields with a null svcpart returns all of them % my $pvf = $self->pvf($field); % $vfields{$svcdb}->{$field} = $pvf; % #warn "\$vfields{$svcdb}->{$field} = $pvf"; % } #next $field % } #next $svcdb % % #code duplication w/ edit/part_svc.cgi, should move this hash to part_svc.pm % # and generalize the subs % # condition sub is tested to see whether to disable display of this choice % # params: ( $def, $layer, $field ) (see SUB below) % my $inv_sub = sub { % $_[0]->{disable_inventory} % || $_[0]->{'type'} ne 'text' % }; % tie my %flag, 'Tie::IxHash', % '' => { 'desc' => 'No default', }, % 'D' => { 'desc' => 'Default', % 'condition' => % sub { $_[0]->{disable_default} }, % }, % 'F' => { 'desc' => 'Fixed (unchangeable)', % 'condition' => % sub { $_[0]->{disable_fixed} }, % }, % 'S' => { 'desc' => 'Selectable Choice', % 'condition' => % sub { !ref($_[0]) || $_[0]->{disable_select} }, % }, % 'M' => { 'desc' => 'Manual selection from inventory', % 'condition' => $inv_sub, % }, % 'A' => { 'desc' => 'Automatically fill in from inventory', % 'condition' => $inv_sub, % }, % 'X' => { 'desc' => 'Excluded', % 'condition' => % sub { ! $vfields{$_[1]}->{$_[2]} }, % % }, % ; % % my @dbs = $hashref->{svcdb} % ? ( $hashref->{svcdb} ) % : FS::part_svc->svc_tables(); % % tie my %svcdb, 'Tie::IxHash', map { $_=>$_ } grep dbdef->table($_), @dbs; % my $widget = new HTML::Widgets::SelectLayers( % #'selected_layer' => $p_svcdb, % 'selected_layer' => $hashref->{svcdb} || 'svc_acct', % 'options' => \%svcdb, % 'form_name' => 'dummy', % #'form_action' => 'process/part_svc.cgi', % 'form_action' => 'part_svc.cgi', #self % 'form_text' => [ qw( svc svcpart ) ], % 'form_checkbox' => [ 'disabled' ], % 'layer_callback' => sub { % my $layer = shift; % % my $html = qq!!; % % my $columns = 3; % my $count = 0; % my $communigate = 0; % my @part_export = % map { qsearch( 'part_export', {exporttype => $_ } ) } % keys %{FS::part_export::export_info($layer)}; % $html .= '

'. table(). % "Exports"; % foreach my $part_export ( @part_export ) { % $communigate++ if $part_export->exporttype =~ /^communigate/; % $html .= 'svcpart ) #null svcpart search causing error % && qsearchs( 'export_svc', { % exportnum => $part_export->exportnum, % svcpart => $clone || $part_svc->svcpart }); % $html .= '>'.$part_export->exportnum. ': '; % $html .= $part_export->exportname . '
' % if ( $part_export->exportname ); % $html .= $part_export->exporttype. ' to '. $part_export->machine; % $html .= '
' if ( $part_export->exportname ); % $html .= ''; % $count++; % $html .= '' unless $count % $columns; % } % $html .= '

'; % % $html .= include('/elements/table-grid.html', 'cellpadding' => 4 ). % ''. % 'Field'. % 'Label'. % 'Modifier'. % ''; % % my $bgcolor1 = '#eeeeee'; % my $bgcolor2 = '#ffffff'; % my $bgcolor; % % #yucky kludge % my @fields = (); % if ( defined( dbdef->table($layer) ) ) { % @fields = grep { % $_ ne 'svcnum' % && ( $communigate || !$communigate_fields{$layer}->{$_} ) % && ( !FS::part_svc->svc_table_fields($layer) % ->{$_}->{disable_part_svc_column} % || $part_svc->part_svc_column($_)->columnflag % ) % } fields($layer); % } % push @fields, 'usergroup' if $layer eq 'svc_acct'; #kludge % $part_svc->svcpart($clone) if $clone; #haha, undone below % % % foreach my $field (@fields) { % % #a few lines of false laziness w/browse/part_svc.cgi % my $def = FS::part_svc->svc_table_fields($layer)->{$field}; % my $def_info = $def->{'def_info'}; % my $formatter = $def->{'format'} || sub { shift }; % % my $part_svc_column = $part_svc->part_svc_column($field); % my $label = $part_svc_column->columnlabel || $def->{'label'}; % my $value = &$formatter($part_svc_column->columnvalue); % my $flag = $part_svc_column->columnflag; % % if ( $bgcolor eq $bgcolor1 ) { % $bgcolor = $bgcolor2; % } else { % $bgcolor = $bgcolor1; % } % % $html .= qq!!. % ( $def->{'label'} || $field ). % ""; % % $html .= qq!'; % % $flag = '' if $def->{type} eq 'disabled'; % % $html .= qq!!; % % if ( $def->{type} eq 'disabled' ) { % % $html .= 'No default'; % % } else { % % $html .= qq!'; % % $html .= join("\n", % '', % ); % % } % % $html .= qq!!; % % my $disabled = $flag ? '' % : 'DISABLED STYLE="background-color: #dddddd"'; % % if ( !$def->{type} || $def->{type} eq 'text' ) { % % my $nodisplay = ' STYLE="display:none"'; % my $is_inv = ( $flag =~ /^[MA]$/ ); % % $html .= % qq!'; % % $html .= include('/elements/select-table.html', % 'element_name' => "${layer}__${field}_classnum", % 'element_etc' => ( $is_inv % ? $disabled % : $nodisplay % ), % 'table' => 'inventory_class', % 'name_col' => 'classname', % 'value' => $value, % 'empty_label' => 'Select inventory class', % ); % % } elsif ( $def->{type} eq 'checkbox' ) { % % $html .= include('/elements/checkbox.html', % 'field' => $layer.'__'.$field, % 'curr_value' => $value, % 'value' => 'Y', % ); % % } elsif ( $def->{type} eq 'select' ) { % % $html .= qq!'; % % } elsif ( $def->{type} eq 'textarea' ) { % % $html .= % qq!'; % % } elsif ( $def->{type} eq 'select-svc_pbx.html' ) { % % $html .= include('/elements/select-svc_pbx.html', % 'curr_value' => $value, % 'element_name' => "${layer}__${field}", % 'element_etc' => $disabled, % 'multiple' => ($flag eq 'S'), % ); % % } elsif ( $def->{type} eq 'radius_usergroup_selector' ) { % % #XXX disable the RADIUS usergroup selector? ugh it sure does need % #an overhaul, people have dum group problems because of it % % $html .= FS::svc_acct::radius_usergroup_selector( % [ split(',', $value) ], "${layer}__${field}" ); % % } elsif ( $def->{type} eq 'communigate_pro-accessmodes' ) { % % $html .= include('/elements/communigate_pro-accessmodes.html', % 'element_name_prefix' => "${layer}__${field}_", % 'curr_value' => $value, % #doesn't work#'element_etc' => $disabled, % ); % % } elsif ( $def->{type} eq 'disabled' ) { % % $html .= % qq!!; % % } else { % % $html .= 'unknown type '. $def->{type}; % % } % % $html .= "\n"; % $def_info = "($def_info)" if $def_info; % $html .= % qq!!. % qq! !. % qq! $def_info!. % qq! !. % qq!\n!; % % } #foreach my $field (@fields) { % % $part_svc->svcpart('') if $clone; #undone % $html .= ""; % % $html .= include('/elements/progress-init.html', % $layer, #form name % [ qw(svc svcpart disabled exportnum), @fields ], % 'process/part_svc.cgi', % $p.'browse/part_svc.cgi', % $layer, % ); % $html .= '
'; % % #$html .= '
'; % % $html; % % }, % ); % % Table <% $widget->html %> <% include('/elements/footer.html') %> <%init> die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('Configuration'); my $part_svc; my $clone = ''; if ( $cgi->param('clone') && $cgi->param('clone') =~ /^(\d+)$/ ) {#clone #$cgi->param('clone') =~ /^(\d+)$/ or die "malformed query: $query"; $part_svc = qsearchs('part_svc', { 'svcpart'=>$1 } ) or die "unknown svcpart: $1"; $clone = $part_svc->svcpart; $part_svc->svcpart(''); } elsif ( $cgi->keywords ) { #edit my($query) = $cgi->keywords; $query =~ /^(\d+)$/ or die "malformed query: $query"; $part_svc=qsearchs('part_svc', { 'svcpart'=>$1 } ) or die "unknown svcpart: $1"; } else { #adding $part_svc = new FS::part_svc {}; } my $action = $part_svc->svcpart ? 'Edit' : 'Add'; my $hashref = $part_svc->hashref; # my $p_svcdb = $part_svc->svcdb || 'svc_acct'; my %communigate_fields = ( 'svc_acct' => { map { $_=>1 } qw( file_quota file_maxnum file_maxsize password_selfchange password_recover ), grep /^cgp_/, fields('svc_acct') }, 'svc_domain' => { map { $_=>1 } qw( max_accounts trailer parent_svcnum ), grep /^(cgp|acct_def)_/, fields('svc_domain') }, #'svc_forward' => { map { $_=>1 } qw( ) }, #'svc_mailinglist' => { map { $_=>1 } qw( ) }, #'svc_cert' => { map { $_=>1 } qw( ) }, );