<% my $part_svc; my $clone = ''; if ( $cgi->param('error') ) { #error $part_svc = new FS::part_svc ( { map { $_, scalar($cgi->param($_)) } fields('part_svc') } ); } elsif ( $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'; #" onLoad=\"visualize()\"" %> <%= header("$action Service Definition", menubar( 'Main Menu' => $p, 'View all service definitions' => "${p}browse/part_svc.cgi" ), ) %> <% if ( $cgi->param('error') ) { %> Error: <%= $cgi->param('error') %> <% } %>
Service Part #<%= $part_svc->svcpart ? $part_svc->svcpart : "(NEW)" %>

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

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.

<% #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' => { desc => 'Username', type => 'disabled', }, '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', }, 'usergroup' => { desc =>'ICRADIUS/FreeRADIUS groups', type =>'radius_usergroup_selector', }, }, 'svc_domain' => { 'domain' => 'Domain', }, '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_broadband' => { 'actypenum' => 'This is the actypenum that refers to the type of AC that can be provisioned for this service. This field must be set fixed.', 'speed_down' => 'Maximum download speed for this service in Kbps. 0 denotes unlimited.', 'speed_up' => 'Maximum upload speed for this service in Kbps. 0 denotes unlimited.', 'acnum' => 'acnum of a specific AC that this service is restricted to. Not required', 'ip_addr' => 'IP address. Leave blank for automatic assignment.', 'ip_netmask' => 'Mask length, aka. netmask bits. (Eg. 255.255.255.0 == 24)', 'mac_addr' => 'MAC address which is used by some ACs for access control. Specified by 6 colon seperated hex octets. (Eg. 00:00:0a:bc:1a:2b)', 'location' => 'Defines the physically location at which this service was installed. This is not necessarily the billing address', }, ); my @dbs = $hashref->{svcdb} ? ( $hashref->{svcdb} ) : qw( svc_acct svc_domain svc_forward svc_www svc_broadband ); tie my %svcdb, 'Tie::IxHash', map { $_=>$_ } @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_text' => [ qw( svc svcpart ) ], 'form_checkbox' => [ 'disabled' ], 'layer_callback' => sub { my $layer = shift; my $html = qq!!; my $columns = 3; my $count = 0; my @part_export = map { qsearch( 'part_export', {exporttype => $_ } ) } keys %{FS::part_export::export_info($layer)}; $html .= '

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

'; $html .= table(). "FieldModifier"; #yucky kludge my @fields = defined( $FS::Record::dbdef->table($layer) ) ? grep { $_ ne 'svcnum' } fields($layer) : (); push @fields, 'usergroup' if $layer eq 'svc_acct'; #kludge $part_svc->svcpart($clone) if $clone; #haha, undone below foreach my $field (@fields) { my $part_svc_column = $part_svc->part_svc_column($field); my $value = $cgi->param('error') ? $cgi->param("${layer}__${field}") : $part_svc_column->columnvalue; my $flag = $cgi->param('error') ? $cgi->param("${layer}__${field}_flag") : $part_svc_column->columnflag; my $def = $defs{$layer}{$field}; my $desc = ref($def) ? $def->{desc} : $def; $html .= "$field"; $html .= "- $desc" if $desc; $html .= ""; $flag = '' if ref($def) && $def->{type} eq 'disabled'; $html .= qq!Off". ''; unless ( ref($def) && $def->{type} eq 'disabled' ) { $html .= qq!Default ". qq!Fixed ". '
'; } if ( ref($def) ) { if ( $def->{type} eq 'select' ) { $html .= qq!'; } elsif ( $def->{type} eq 'radius_usergroup_selector' ) { $html .= FS::svc_acct::radius_usergroup_selector( [ split(',', $value) ], "${layer}__${field}" ); } elsif ( $def->{type} eq 'disabled' ) { $html .= qq!!; } else { $html .= 'unknown type'. $def->{type}; } } else { $html .= qq!!; } $html .= "\n"; } $part_svc->svcpart('') if $clone; #undone $html .= ""; $html .= '
'; $html; }, ); %> Table <%= $widget->html %>