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