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