<% 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
{disabled} eq 'Y' ? ' CHECKED' : '' %>> Disable new orders
{'preserve'} eq 'Y' ? ' CHECKED' : '' %>> Preserve this service on package cancellation

% #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, % }, % 'H' => { 'desc' => 'Select from hardware class', % 'condition' => sub { $_[0]->{type} ne 'select-hardware' }, % }, % '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', 'preserve' ], % 'layer_callback' => sub { % my $layer = shift; % % my $html = qq!!; % % $html .= $svcdb_info; % % 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 .= '

'. include('/elements/table.html') . % "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 .= '

'. $mod_info; % % $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' % or ( $layer eq 'svc_broadband' and % $conf->exists('svc_broadband-radius') ); # double kludge % # (but we do want to check the config, right?) % $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"'; % my $nodisplay = ' STYLE="display:none"'; % % if ( !$def->{type} || $def->{type} eq 'text' ) { % % 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} =~ /select-(.*?).html/ ) { % % $html .= include("/elements/".$def->{type}, % 'curr_value' => $value, % 'element_name' => "${layer}__${field}", % 'element_etc' => $disabled, % 'multiple' => ($def->{multiple} || % $flag eq 'S'), % # allow the table def to force 'multiple' % ); % % } 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 'select-hardware' ) { % % $html .= qq!!; % $html .= include('/elements/select-hardware_class.html', % 'curr_value' => $value, % 'element_name' => "${layer}__${field}_classnum", % 'element_etc' => $flag ne 'H' && $nodisplay, % 'empty_label' => 'Select hardware class', % ); % % } 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 preserve 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 $conf = FS::Conf->new; 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( ) }, ); my $svcdb_info = '
Generic Access Telephony
  • svc_acct: Accounts - anything with a username (mailbox, shell, RADIUS, etc.)
  • svc_hardware: Equipment supplied to customers
  • svc_external: Externally-tracked service
  • svc_dsl: DSL
  • svc_broadband: Wireless broadband
  • svc_dish: DISH Network
  • svc_phone: Customer phone number
  • svc_pbx: Customer PBX

Hosting Colocation
  • svc_domain: Domain
  • svc_cert: Certificate
  • svc_forward: Mail forwarding
  • svc_mailinglist: Mailing list
  • svc_www: Virtual domain website
  • svc_port: Customer router/switch port
'; my $mod_info = ' 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. ';