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