!.
+% ( $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!
+
+ 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. 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.
-
+values, or select an inventory class to manually or automatically fill in
+that field.
+';
-<%
-#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',
- },
-);
+%init>
- 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(). "Field | Modifier | ";
- #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 .= '