X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=httemplate%2Fedit%2Fpart_svc.cgi;h=97e2d9694c592271d6b77642f86c650a7d01eda3;hb=dd65ba99bb9281571f19744154a3b03bcd3f01ab;hp=918e6ab9c3952c7b40fe1639d10bd575d0600e59;hpb=412e2892a324cdd838f4a790102359adcc9b7400;p=freeside.git diff --git a/httemplate/edit/part_svc.cgi b/httemplate/edit/part_svc.cgi index 918e6ab9c..97e2d9694 100755 --- a/httemplate/edit/part_svc.cgi +++ b/httemplate/edit/part_svc.cgi @@ -1,273 +1,526 @@ - -<% - my $part_svc; - if ( $cgi->param('error') ) { #error - $part_svc = new FS::part_svc ( { - map { $_, scalar($cgi->param($_)) } fields('part_svc') - } ); - } 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'; - -%> - - - -<%= header("$action Service Definition", - menubar( 'Main Menu' => $p, - 'View all service definitions' => "${p}browse/part_svc.cgi" - ), - " onLoad=\"visualize()\"" - ) +<% include('/elements/header.html', "$action Service Definition", + menubar('View all service definitions' => "${p}browse/part_svc.cgi"), + #" onLoad=\"visualize()\"" + ) %> -<% if ( $cgi->param('error') ) { %> -Error: <%= $cgi->param('error') %> -<% } %> -
- Service Part #<%= $part_svc->svcpart ? $part_svc->svcpart : "(NEW)" %> + Service Part #<% $part_svc->svcpart ? $part_svc->svcpart : "(NEW)" %>

-Service
-Disable new orders {disabled} eq 'Y' ? ' CHECKED' : '' %>>
+Service
+{disabled} eq 'Y' ? ' CHECKED' : '' %>> Disable new orders
+{'preserve'} eq 'Y' ? ' CHECKED' : '' %>> Preserve this service on package cancellation
+ +
-Services are items you offer to your customers. - -For the selected table, you can give fields default or fixed (unchangable) -values. For example, a SLIP/PPP account may have a default (or perhaps fixed) -slipip of 0.0.0.0, while a POP mailbox will probably have a fixed -blank slipip as well as a fixed shell something like /bin/true or -/usr/bin/passwd. -

- -<% my @dbs = $hashref->{svcdb} - ? ( $hashref->{svcdb} ) - : qw( svc_acct svc_domain svc_acct_sm svc_forward svc_www ); %> -Table
-<% -#these might belong somewhere else for other user interfaces -#pry need to eventually create stuff that's shared amount UIs -my %defs = ( - 'svc_acct' => { - 'dir' => 'Home directory', - 'uid' => 'UID (set to fixed and blank for dial-only)', - 'slipip' => 'IP address (Set to fixed and blank to disable dialin, or, set a value to be exported to RADIUS Framed-IP-Address. Use the special value 0e0 [zero e zero] to enable export to RADIUS without a Framed-IP-Address.)', -# 'popnum' => qq!POP number!, - 'popnum' => { - desc => 'Access number', - type => 'select', - select_table => 'svc_acct_pop', - select_key => 'popnum', - select_label => 'city', - }, - 'username' => 'Username', - 'quota' => '', - '_password' => 'Password', - 'gid' => 'GID (when blank, defaults to UID)', - 'shell' => 'Shell (all service definitions should have a default or fixed shell that is present in the shells configuration file)', - 'finger' => 'GECOS', - 'domsvc' => { - desc =>'svcnum from svc_domain', - type =>'select', - select_table => 'svc_domain', - select_key => 'svcnum', - select_label => 'domain', - }, - }, - 'svc_domain' => { - 'domain' => 'Domain', - }, - 'svc_acct_sm' => { - 'domuser' => 'domuser@virtualdomain.com', - 'domuid' => 'UID where domuser@virtualdomain.com mail is forwarded', - 'domsvc' => 'svcnum from svc_domain for virtualdomain.com', - }, - 'svc_forward' => { - 'srcsvc' => 'service from which mail is to be forwarded', - 'dstsvc' => 'service to which mail is to be forwarded', - 'dst' => 'someone@another.domain.com to use when dstsvc is 0', - }, - 'svc_charge' => { - 'amount' => 'amount', - }, - 'svc_wo' => { - 'worker' => 'Worker', - '_date' => 'Date', - }, - 'svc_www' => { - #'recnum' => '', - #'usersvc' => '', - }, -); -# svc_acct svc_domain svc_acct_sm svc_charge svc_wo -foreach my $svcdb ( qw( - konq_kludge svc_acct svc_domain svc_acct_sm svc_forward svc_www -) ) { +% #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'; #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"'; +% 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} 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 'select-lnp_status.html' ) { +% +% $html .= include('/elements/select-lnp_status.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 '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"; -# my(@fields) = $svcdb eq 'konq_kludge' -# ? () -# : grep { $_ ne 'svcnum' } fields($svcdb); - #yucky kludge - my(@fields) = defined( $FS::Record::dbdef->table($svcdb) ) - ? grep { $_ ne 'svcnum' } fields($svcdb) - : (); - #my($rowspan)=scalar(@rows); +% $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; +% +% }, +% ); +% +% - #my($ptmp)="$svcdb"; -# $visibility = $svcdb eq $part_svc->svcdb ? "SHOW" : "HIDDEN"; -# $visibility = $svcdb eq $p_svcdb ? "visible" : "hidden"; - my $visibility = "hidden"; -%> - -
- - - - -<% - #print "$svcdb
" unless $svcdb eq 'konq_kludge'; - print table(). "FieldModifier" unless $svcdb eq 'konq_kludge'; +<% include('/elements/footer.html') %> - foreach my $field (@fields) { - my $part_svc_column = $part_svc->part_svc_column($field); - my $value = $cgi->param('error') - ? $cgi->param("${svcdb}__${field}") - : $part_svc_column->columnvalue; - my $flag = $cgi->param('error') - ? $cgi->param("${svcdb}__${field}_flag") - : $part_svc_column->columnflag; - #print "$ptmp$field"; - print "$field"; - my $def = $defs{$svcdb}{$field}; - my $desc = ref($def) ? $def->{desc} : $def; - - print "- $desc" if $desc; - print ""; - print qq!Off"; - print qq!Default "; - print qq!Fixed "; - print '
'; - if ( ref($def) ) { - if ( $def->{type} eq 'select' ) { - print qq!'; - } else { - print 'unknown type'. $def->{type}; - } - } else { - print qq!!; - } - print "\n"; - #$ptmp=''; - } - print "" unless $svcdb eq 'konq_kludge'; +<%init> -print qq!\n
! unless $svcdb eq 'konq_kludge'; +die "access denied" + unless $FS::CurrentUser::CurrentUser->access_right('Configuration'); - print ""; - print < - if (document.getElementById) { - document.write(""); - } else { - document.write(""); - } - -END +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 {}; } -#print ""; -%> - +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 = ' + + + + + + + + + + + + +
GenericAccessTelephony
+
    +
  • 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 +
+
+
+ + + + + + + + +
HostingColocation
+
    +
  • 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. +'; + + + - -