limited domain select
[freeside.git] / httemplate / edit / svc_acct.cgi
1 %
2 %
3 %my $conf = new FS::Conf;
4 %my @shells = $conf->config('shells');
5 %
6 %my($svcnum, $pkgnum, $svcpart, $part_svc, $svc_acct, @groups);
7 %if ( $cgi->param('error') ) {
8 %
9 %  $svc_acct = new FS::svc_acct ( {
10 %    map { $_, scalar($cgi->param($_)) } fields('svc_acct')
11 %  } );
12 %  $svcnum = $svc_acct->svcnum;
13 %  $pkgnum = $cgi->param('pkgnum');
14 %  $svcpart = $cgi->param('svcpart');
15 %  $part_svc = qsearchs( 'part_svc', { 'svcpart' => $svcpart } );
16 %  die "No part_svc entry for svcpart $svcpart!" unless $part_svc;
17 %  @groups = $cgi->param('radius_usergroup');
18 %
19 %} else {
20 %
21 %  my($query) = $cgi->keywords;
22 %  if ( $query =~ /^(\d+)$/ ) { #editing
23 %    $svcnum=$1;
24 %    $svc_acct=qsearchs('svc_acct',{'svcnum'=>$svcnum})
25 %      or die "Unknown (svc_acct) svcnum!";
26 %
27 %    my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum})
28 %      or die "Unknown (cust_svc) svcnum!";
29 %
30 %    $pkgnum=$cust_svc->pkgnum;
31 %    $svcpart=$cust_svc->svcpart;
32 %
33 %    $part_svc = qsearchs( 'part_svc', { 'svcpart' => $svcpart } );
34 %    die "No part_svc entry for svcpart $svcpart!" unless $part_svc;
35 %
36 %    @groups = $svc_acct->radius_groups;
37 %
38 %  } else { #adding
39 %
40 %    foreach $_ (split(/-/,$query)) {
41 %      $pkgnum=$1 if /^pkgnum(\d+)$/;
42 %      $svcpart=$1 if /^svcpart(\d+)$/;
43 %    }
44 %    $part_svc = qsearchs( 'part_svc', { 'svcpart' => $svcpart } );
45 %    die "No part_svc entry for svcpart $svcpart!" unless $part_svc;
46 %
47 %    $svc_acct = new FS::svc_acct({svcpart => $svcpart}); 
48 %
49 %    $svcnum='';
50 %
51 %  }
52 %}
53 %
54 %my( $cust_pkg, $cust_main ) = ( '', '' );
55 %if ( $pkgnum ) {
56 %  $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $pkgnum } );
57 %  $cust_main = $cust_pkg->cust_main;
58 %}
59 %
60 %unless ( $svcnum || $cgi->param('error') ) { #adding
61 %
62 %  #set gecos
63 %  if ($cust_main) {
64 %    unless ( $part_svc->part_svc_column('uid')->columnflag eq 'F' ) {
65 %      $svc_acct->setfield('finger',
66 %        $cust_main->getfield('first') . " " . $cust_main->getfield('last')
67 %      );
68 %    }
69 %  }
70 %
71 %  $svc_acct->set_default_and_fixed( {
72 %    #false laziness w/svc-acct::_fieldhandlers
73 %    'usergroup' => sub { 
74 %                         my( $self, $groups ) = @_;
75 %                         if ( ref($groups) eq 'ARRAY' ) {
76 %                           @groups = @$groups;
77 %                           $groups;
78 %                         } elsif ( length($groups) ) {
79 %                           @groups = split(/\s*,\s*/, $groups);
80 %                           [ @groups ];
81 %                         } else {
82 %                           @groups = ();
83 %                           [];
84 %                         }
85 %                       }
86 %  } );
87 %
88 %}
89 %
90 %#fixed radius groups always override & display
91 %if ( $part_svc->part_svc_column('usergroup')->columnflag eq 'F' ) {
92 %  @groups = split(',', $part_svc->part_svc_column('usergroup')->columnvalue);
93 %}
94 %
95 %my $action = $svcnum ? 'Edit' : 'Add';
96 %
97 %my $svc = $part_svc->getfield('svc');
98 %
99 %my $otaker = getotaker;
100 %
101 %my $username = $svc_acct->username;
102 %my $password;
103 %if ( $svc_acct->_password ) {
104 %  if ( $conf->exists('showpasswords') || ! $svcnum ) {
105 %    $password = $svc_acct->_password;
106 %  } else {
107 %    $password = "*HIDDEN*";
108 %  }
109 %} else {
110 %  $password = '';
111 %}
112 %
113 %my $ulen = 
114 %  $conf->exists('usernamemax')
115 %  ? $conf->config('usernamemax')
116 %  : dbdef->table('svc_acct')->column('username')->length;
117 %my $ulen2 = $ulen+2;
118 %
119 %my $pmax = $conf->config('passwordmax') || 8;
120 %my $pmax2 = $pmax+2;
121 %
122 %my $p1 = popurl(1);
123 %
124 %
125
126
127 <% include("/elements/header.html","$action $svc account") %>
128 % if ( $cgi->param('error') ) { 
129
130   <FONT SIZE="+1" COLOR="#ff0000">Error: <% $cgi->param('error') %></FONT>
131   <BR><BR>
132 % } 
133 % if ( $cust_main ) { 
134
135   <% include( '/elements/small_custview.html', $cust_main, '', 1 ) %>
136   <BR>
137 % } 
138
139
140 <FORM NAME="OneTrueForm" ACTION="<% $p1 %>process/svc_acct.cgi" METHOD=POST>
141 <INPUT TYPE="hidden" NAME="svcnum" VALUE="<% $svcnum %>">
142 <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<% $pkgnum %>">
143 <INPUT TYPE="hidden" NAME="svcpart" VALUE="<% $svcpart %>">
144
145 Service # <% $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR>
146
147 <% ntable("#cccccc",2) %>
148
149 <TR>
150   <TD ALIGN="right">Service</TD>
151   <TD BGCOLOR="#eeeeee"><% $part_svc->svc %></TD>
152 </TR>
153
154 <TR>
155   <TD ALIGN="right">Username</TD>
156   <TD>
157     <INPUT TYPE="text" NAME="username" VALUE="<% $username %>" SIZE=<% $ulen2 %> MAXLENGTH=<% $ulen %>>
158   </TD>
159 </TR>
160
161 <TR>
162   <TD ALIGN="right">Password</TD>
163   <TD>
164     <INPUT TYPE="text" NAME="_password" VALUE="<% $password %>" SIZE=<% $pmax2 %> MAXLENGTH=<% $pmax %>>
165     (blank to generate)
166   </TD>
167 </TR>
168 %
169 %my $sec_phrase = $svc_acct->sec_phrase;
170 %if ( $conf->exists('security_phrase') ) {
171 %
172
173
174   <TR>
175     <TD ALIGN="right">Security phrase</TD>
176     <TD>
177       <INPUT TYPE="text" NAME="sec_phrase" VALUE="<% $sec_phrase %>" SIZE=32>
178       (for forgotten passwords)
179     </TD>
180   </TD>
181 % } else { 
182
183
184   <INPUT TYPE="hidden" NAME="sec_phrase" VALUE="<% $sec_phrase %>">
185 % } 
186 %
187 %#domain
188 %my $domsvc = $svc_acct->domsvc || 0;
189 %if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'F' ) {
190 %
191
192
193   <INPUT TYPE="hidden" NAME="domsvc" VALUE="<% $domsvc %>">
194 % } else { 
195 %
196 %  my %svc_domain = ();
197 %
198 %  if ( $domsvc ) {
199 %    my $svc_domain = qsearchs('svc_domain', { 'svcnum' => $domsvc, } );
200 %    if ( $svc_domain ) {
201 %      $svc_domain{$svc_domain->svcnum} = $svc_domain;
202 %    } else {
203 %      warn "unknown svc_domain.svcnum for svc_acct.domsvc: $domsvc";
204 %    }
205 %  }
206 %
207 %  if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'D' ) {
208 %    my $svc_domain = qsearchs('svc_domain', {
209 %      'svcnum' => $part_svc->part_svc_column('domsvc')->columnvalue,
210 %    } );
211 %    if ( $svc_domain ) {
212 %      $svc_domain{$svc_domain->svcnum} = $svc_domain;
213 %    } else {
214 %      warn "unknown svc_domain.svcnum for part_svc_column domsvc: ".
215 %           $part_svc->part_svc_column('domsvc')->columnvalue;
216 %    }
217 %  }
218 %
219 %  if ( $part_svc->part_svc_column('domsvc')->columnflag eq 'S' ) {
220 %    foreach my $domain
221 %              (split(',',$part_svc->part_svc_column('domsvc')->columnvalue)) {
222 %      my $svc_domain =
223 %        qsearchs('svc_domain', { 'svcnum' => $domain } );
224 %     $svc_domain{$svc_domain->svcnum} = $svc_domain if $svc_domain;
225 %    }
226 %  }elsif ($cust_pkg && !$conf->exists('svc_acct-alldomains') ) {
227 %    my @cust_svc =
228 %      map { qsearch('cust_svc', { 'pkgnum' => $_->pkgnum } ) }
229 %          qsearch('cust_pkg', { 'custnum' => $cust_pkg->custnum } );
230 %    foreach my $cust_svc ( @cust_svc ) {
231 %      my $svc_domain =
232 %        qsearchs('svc_domain', { 'svcnum' => $cust_svc->svcnum } );
233 %     $svc_domain{$svc_domain->svcnum} = $svc_domain if $svc_domain;
234 %    }
235 %  } else {
236 %    %svc_domain = map { $_->svcnum => $_ } qsearch('svc_domain', {} );
237 %  }
238 %
239 %
240
241
242   <TR>
243     <TD ALIGN="right">Domain</TD>
244     <TD>
245       <SELECT NAME="domsvc" SIZE=1>
246 % foreach my $svcnum (
247 %             sort { $svc_domain{$a}->domain cmp $svc_domain{$b}->domain }
248 %                  keys %svc_domain
249 %           ) {
250 %             my $svc_domain = $svc_domain{$svcnum};
251 %        
252
253
254              <OPTION VALUE="<% $svc_domain->svcnum %>" <% $svc_domain->svcnum == $domsvc ? ' SELECTED' : '' %>><% $svc_domain->domain %>
255 % } 
256
257       </SELECT>
258     </TD>
259   </TR>
260 % } 
261 %
262 %#pop
263 %my $popnum = $svc_acct->popnum || 0;
264 %if ( $part_svc->part_svc_column('popnum')->columnflag eq 'F' ) {
265 %
266
267
268   <INPUT TYPE="hidden" NAME="popnum" VALUE="<% $popnum %>">
269 % } else { 
270
271
272   <TR>
273     <TD ALIGN="right">Access number</TD>
274     <TD><% FS::svc_acct_pop::popselector($popnum) %></TD>
275   </TR>
276 % } 
277 % #uid/gid 
278 % foreach my $xid (qw( uid gid )) { 
279 %
280 %  if ( $part_svc->part_svc_column($xid)->columnflag =~ /^[FA]$/
281 %       || ! $conf->exists("svc_acct-edit_$xid")
282 %     ) {
283 %  
284 % if ( length($svc_acct->$xid()) ) { 
285
286   
287       <TR>
288         <TD ALIGN="right"><% uc($xid) %></TD>
289           <TD BGCOLOR="#eeeeee"><% $svc_acct->$xid() %></TD>
290         <TD>
291         </TD>
292       </TR>
293 % } 
294
295   
296     <INPUT TYPE="hidden" NAME="<% $xid %>" VALUE="<% $svc_acct->$xid() %>">
297 % } else { 
298
299   
300     <TR>
301       <TD ALIGN="right"><% uc($xid) %></TD>
302       <TD>
303         <INPUT TYPE="text" NAME="<% $xid %>" SIZE=8 MAXLENGTH=6 VALUE="<% $svc_acct->$xid() %>">
304       </TD>
305     </TR>
306 % } 
307 % } 
308 %
309 %#finger
310 %if ( $part_svc->part_svc_column('uid')->columnflag eq 'F'
311 %     && ! $svc_acct->finger ) { 
312 %
313
314
315   <INPUT TYPE="hidden" NAME="finger" VALUE="">
316 % } else { 
317
318
319   <TR>
320     <TD ALIGN="right">GECOS</TD>
321     <TD>
322       <INPUT TYPE="text" NAME="finger" VALUE="<% $svc_acct->finger %>">
323     </TD>
324   </TR>
325 % } 
326
327
328
329 <INPUT TYPE="hidden" NAME="dir" VALUE="<% $svc_acct->dir %>">
330 %
331 %#shell
332 %my $shell = $svc_acct->shell;
333 %if ( $part_svc->part_svc_column('shell')->columnflag eq 'F'
334 %     || ( !$shell && $part_svc->part_svc_column('uid')->columnflag eq 'F' )
335 %   ) {
336 %
337
338
339   <INPUT TYPE="hidden" NAME="shell" VALUE="<% $shell %>">
340 % } else { 
341
342
343   <TR>
344     <TD ALIGN="right">Shell</TD>
345     <TD>
346       <SELECT NAME="shell" SIZE=1>
347 %
348 %           my($etc_shell);
349 %           foreach $etc_shell (@shells) {
350 %        
351
352
353           <OPTION<% $etc_shell eq $shell ? ' SELECTED' : '' %>><% $etc_shell %>
354 % } 
355
356
357       </SELECT>
358     </TD>
359   </TR>
360 % } 
361 % if ( $part_svc->part_svc_column('quota')->columnflag eq 'F' ) { 
362
363
364   <INPUT TYPE="hidden" NAME="quota" VALUE="<% $svc_acct->quota %>">
365 % } else { 
366
367
368   <TR>
369     <TD ALIGN="right">Quota:</TD>
370     <TD><INPUT TYPE="text" NAME="quota" VALUE="<% $svc_acct->quota %>"></TD>
371   </TR>
372 % } 
373 % if ( $part_svc->part_svc_column('slipip')->columnflag =~ /^[FA]$/ ) { 
374
375
376   <INPUT TYPE="hidden" NAME="slipip" VALUE="<% $svc_acct->slipip %>">
377 % } else { 
378
379
380   <TR>
381     <TD ALIGN="right">IP</TD>
382     <TD><INPUT TYPE="text" NAME="slipip" VALUE="<% $svc_acct->slipip %>"></TD>
383   </TR>
384 % } 
385 %
386 %foreach my $r ( grep { /^r(adius|[cr])_/ } fields('svc_acct') ) {
387 %  $r =~ /^^r(adius|[cr])_(.+)$/ or next; #?
388 %  my $a = $2;
389 %
390 % if ( $part_svc->part_svc_column($r)->columnflag =~ /^[FA]$/ ) { 
391
392
393     <INPUT TYPE="hidden" NAME="<% $r %>" VALUE="<% $svc_acct->getfield($r) %>">
394 % } else { 
395
396
397     <TR>
398       <TD ALIGN="right"><% $FS::raddb::attrib{$a} %></TD>
399       <TD><INPUT TYPE="text" NAME="<% $r %>" VALUE="<% $svc_acct->getfield($r) %>"></TD>
400     </TR>
401 % } 
402 % } 
403
404
405
406 <TR>
407   <TD ALIGN="right">RADIUS groups</TD>
408 % if ( $part_svc->part_svc_column('usergroup')->columnflag eq 'F' ) { 
409
410
411     <TD BGCOLOR="#eeeeee"><% join('<BR>', @groups) %></TD>
412 % } else { 
413
414
415     <TD><% FS::svc_acct::radius_usergroup_selector( \@groups ) %></TD>
416 % } 
417
418
419 </TR>
420 % foreach my $field ($svc_acct->virtual_fields) { 
421 % # If the flag is X, it won't even show up in $svc_acct->virtual_fields. 
422 % if ( $part_svc->part_svc_column($field)->columnflag ne 'F' ) { 
423
424
425     <% $svc_acct->pvf($field)->widget('HTML', 'edit', $svc_acct->getfield($field)) %>
426 % } 
427 % } 
428
429   
430 </TABLE>
431 <BR>
432
433 <INPUT TYPE="submit" VALUE="Submit">
434
435 </FORM></BODY></HTML>