usability: don't offer 'Select agent' choice if the dropdown already has a value
[freeside.git] / httemplate / edit / cust_main.cgi
1 %
2 %
3 %  #for misplaced logic below
4 %  #use FS::part_pkg;
5 %
6 %  #for false laziness below (now more properly lazy)
7 %  #use FS::svc_acct_pop;
8 %
9 %  #for (other) false laziness below
10 %  #use FS::agent;
11 %  #use FS::type_pkgs;
12 %
13 %my $conf = new FS::Conf;
14 %
15 %#get record
16 %
17 %my $error = '';
18 %my($custnum, $username, $password, $popnum, $cust_main, $saved_pkgpart, $saved_domsvc);
19 %my(@invoicing_list);
20 %my ($ss,$stateid,$payinfo);
21 %my $same = '';
22 %if ( $cgi->param('error') ) {
23 %  $error = $cgi->param('error');
24 %  $cust_main = new FS::cust_main ( {
25 %    map { $_, scalar($cgi->param($_)) } fields('cust_main')
26 %  } );
27 %  $custnum = $cust_main->custnum;
28 %  $saved_domsvc = $cgi->param('domsvc') || '';
29 %  if ( $saved_domsvc =~ /^(\d+)$/ ) {
30 %    $saved_domsvc = $1;
31 %  } else {
32 %    $saved_domsvc = '';
33 %  }
34 %  $saved_pkgpart = $cgi->param('pkgpart_svcpart') || '';
35 %  if ( $saved_pkgpart =~ /^(\d+)_/ ) {
36 %    $saved_pkgpart = $1;
37 %  } else {
38 %    $saved_pkgpart = '';
39 %  }
40 %  $username = $cgi->param('username');
41 %  $password = $cgi->param('_password');
42 %  $popnum = $cgi->param('popnum');
43 %  @invoicing_list = split( /\s*,\s*/, $cgi->param('invoicing_list') );
44 %  $same = $cgi->param('same');
45 %  $cust_main->setfield('paid' => $cgi->param('paid')) if $cgi->param('paid');
46 %  $ss = $cust_main->ss;           # don't mask an entered value on errors
47 %  $stateid = $cust_main->stateid; # don't mask an entered value on errors
48 %  $payinfo = $cust_main->payinfo; # don't mask an entered value on errors
49 %} elsif ( $cgi->keywords ) { #editing
50 %  my( $query ) = $cgi->keywords;
51 %  $query =~ /^(\d+)$/;
52 %  $custnum=$1;
53 %  $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } );
54 %  if ( $cust_main->dbdef_table->column('paycvv')
55 %       && length($cust_main->paycvv)             ) {
56 %    my $paycvv = $cust_main->paycvv;
57 %    $paycvv =~ s/./*/g;
58 %    $cust_main->paycvv($paycvv);
59 %  }
60 %  $saved_pkgpart = 0;
61 %  $saved_domsvc = 0;
62 %  $username = '';
63 %  $password = '';
64 %  $popnum = 0;
65 %  @invoicing_list = $cust_main->invoicing_list;
66 %  $ss = $cust_main->masked('ss');
67 %  $stateid = $cust_main->masked('stateid');
68 %  $payinfo = $cust_main->paymask;
69 %} else {
70 %  $custnum='';
71 %  $cust_main = new FS::cust_main ( {} );
72 %  $cust_main->otaker( &getotaker );
73 %  $cust_main->referral_custnum( $cgi->param('referral_custnum') );
74 %  $saved_pkgpart = 0;
75 %  $saved_domsvc = 0;
76 %  $username = '';
77 %  $password = '';
78 %  $popnum = 0;
79 %  @invoicing_list = ();
80 %  push @invoicing_list, 'POST'
81 %    unless $conf->exists('disablepostalinvoicedefault');
82 %  $ss = '';
83 %  $stateid = '';
84 %  $payinfo = '';
85 %}
86 %$cgi->delete_all();
87 %
88 %my $action = $custnum ? 'Edit' : 'Add';
89 %$action .= ": ". $cust_main->name if $custnum;
90 %
91 %my $r = qq!<font color="#ff0000">*</font>&nbsp;!;
92 %
93 %
94
95
96 <!-- top -->
97
98 <% include('/elements/header.html',
99       "Customer $action",
100       '',
101       ' onUnload="myclose()"'
102 ) %>
103 % if ( $error ) { 
104
105 <FONT SIZE="+1" COLOR="#ff0000">Error: <% $error %></FONT><BR><BR>
106 % } 
107
108
109 <FORM NAME="topform" STYLE="margin-bottom: 0">
110 <INPUT TYPE="hidden" NAME="custnum" VALUE="<% $custnum %>">
111 % if ( $custnum ) { 
112
113   Customer #<B><% $custnum %></B> - 
114   <B><FONT COLOR="#<% $cust_main->statuscolor %>">
115     <% ucfirst($cust_main->status) %>
116   </FONT></B>
117   <BR><BR>
118 % } 
119
120
121 <% &ntable("#cccccc") %>
122
123 <!-- agent -->
124
125 <% include('/elements/tr-select-agent.html', 
126               'curr_value'    => $cust_main->agentnum,
127               'label'         => "<B>${r}Agent</B>",
128               'empty_label'   => 'Select agent',
129               'disable_empty' => ( $cust_main->agentnum ? 1 : 0 ),
130            )
131 %>
132
133 <!-- referral (advertising source) -->
134 %
135 %my $refnum = $cust_main->refnum || $conf->config('referraldefault') || 0;
136 %if ( $custnum && ! $conf->exists('editreferrals') ) {
137 %
138
139
140   <INPUT TYPE="hidden" NAME="refnum" VALUE="<% $refnum %>">
141 % } else { 
142
143
144    <% include('/elements/tr-select-part_referral.html',
145                 'curr_value' => $refnum
146              )
147    %>
148 % } 
149
150
151 <!-- referring customer -->
152 %
153 %my $referring_cust_main = '';
154 %if ( $cust_main->referral_custnum
155 %     and $referring_cust_main =
156 %           qsearchs('cust_main', { custnum => $cust_main->referral_custnum } )
157 %) {
158 %
159
160
161   <TR>
162     <TD ALIGN="right">Referring customer</TD>
163     <TD>
164       <A HREF="<% popurl(1) %>/cust_main.cgi?<% $cust_main->referral_custnum %>"><% $cust_main->referral_custnum %>: <% $referring_cust_main->name %></A>
165     </TD>
166   </TR>
167   <INPUT TYPE="hidden" NAME="referral_custnum" VALUE="<% $cust_main->referral_custnum %>">
168 % } elsif ( ! $conf->exists('disable_customer_referrals') ) { 
169
170
171   <TR>
172     <TD ALIGN="right">Referring customer</TD>
173     <TD>
174       <!-- <INPUT TYPE="text" NAME="referral_custnum" VALUE=""> -->
175       <% include('/elements/search-cust_main.html',
176                     'field_name' => 'referral_custnum',
177                  )
178       %>
179     </TD>
180   </TR>
181 % } else { 
182
183
184   <INPUT TYPE="hidden" NAME="referral_custnum" VALUE="">
185 % } 
186
187
188 </TABLE>
189
190 <!-- birthdate -->
191
192 % if ( $conf->exists('cust_main-enable_birthdate') ) {
193
194   <BR>
195   <% ntable("#cccccc", 2) %>
196   <% include ('/elements/tr-input-date-field.html',
197               'birthdate',
198               $cust_main->birthdate,
199               'Date of Birth',
200               $conf->config('date_format') || "%m/%d/%Y",
201               1)
202   %>
203
204   </TABLE>
205
206 % }
207
208 <!-- contact info -->
209
210 <BR><BR>
211 Billing address
212 <% include('cust_main/contact.html', $cust_main, '', 'bill_changed(this)', '', 'ss' => $ss, 'stateid' => $stateid ) %>
213
214 <!-- service address -->
215 % if ( defined $cust_main->dbdef_table->column('ship_last') ) { 
216
217
218 <SCRIPT>
219 function bill_changed(what) {
220   if ( what.form.same.checked ) {
221 % for (qw( last first company address1 address2 city zip daytime night fax )) { 
222
223     what.form.ship_<%$_%>.value = what.form.<%$_%>.value;
224 % } 
225
226     what.form.ship_country.selectedIndex = what.form.country.selectedIndex;
227
228     function fix_ship_county() {
229       what.form.ship_county.selectedIndex = what.form.county.selectedIndex;
230     }
231
232     function fix_ship_state() {
233       what.form.ship_state.selectedIndex = what.form.state.selectedIndex;
234       ship_state_changed(what.form.ship_state, fix_ship_county );
235     }
236
237     ship_country_changed(what.form.ship_country, fix_ship_state );
238
239   }
240 }
241 function samechanged(what) {
242   if ( what.checked ) {
243     bill_changed(what);
244 % for (qw( last first company address1 address2 city county state zip country daytime night fax )) { 
245
246     what.form.ship_<%$_%>.disabled = true;
247     what.form.ship_<%$_%>.style.backgroundColor = '#dddddd';
248 % } 
249
250   } else {
251 % for (qw( last first company address1 address2 city county state zip country daytime night fax )) { 
252
253     what.form.ship_<%$_%>.disabled = false;
254     what.form.ship_<%$_%>.style.backgroundColor = '#ffffff';
255 % } 
256
257   }
258 }
259 </SCRIPT>
260 %
261 %  my $checked = '';
262 %  my $disabled = '';
263 %  my $disabledselect = '';
264 %  unless ( $cust_main->ship_last && $same ne 'Y' ) {
265 %    $checked = 'CHECKED';
266 %    $disabled = 'DISABLED STYLE="background-color: #dddddd"';
267 %    foreach (
268 %      qw( last first company address1 address2 city county state zip country
269 %          daytime night fax )
270 %    ) {
271 %      $cust_main->set("ship_$_", $cust_main->get($_) );
272 %    }
273 %  }
274 %
275
276
277 <BR>
278 Service address 
279 (<INPUT TYPE="checkbox" NAME="same" VALUE="Y" onClick="samechanged(this)" <%$checked%>>same as billing address)
280 <% include('cust_main/contact.html', $cust_main, 'ship_', '', $disabled ) %>
281 % } 
282
283
284 <!-- billing info -->
285
286 <% include( 'cust_main/billing.html', $cust_main,
287                'payinfo'        => $payinfo,
288                'invoicing_list' => \@invoicing_list,
289            )
290 %>
291
292 <SCRIPT>
293 function bottomfixup(what) {
294
295   var topvars = new Array(
296     'birthdate',
297
298     'custnum', 'agentnum', 'refnum', 'referral_custnum',
299
300     'last', 'first', 'ss', 'company',
301     'address1', 'address2', 'city',
302     'county', 'state', 'zip', 'country',
303     'daytime', 'night', 'fax',
304     'stateid', 'stateid_state',
305
306     'same',
307
308     'ship_last', 'ship_first', 'ship_company',
309     'ship_address1', 'ship_address2', 'ship_city',
310     'ship_county', 'ship_state', 'ship_zip', 'ship_country',
311     'ship_daytime','ship_night', 'ship_fax',
312
313     'select' // XXX key
314   );
315
316   var layervars = new Array(
317     'payauto',
318     'payinfo', 'payinfo1', 'payinfo2', 'paytype',
319     'payname', 'paystate', 'exp_month', 'exp_year', 'paycvv',
320     'paystart_month', 'paystart_year', 'payissue',
321     'payip',
322     'paid'
323   );
324
325   var billing_bottomvars = new Array(
326     'tax',
327     'invoicing_list', 'invoicing_list_POST', 'invoicing_list_FAX',
328     'invoice_terms',
329     'spool_cdr'
330   );
331
332   for ( f=0; f < topvars.length; f++ ) {
333     var field = topvars[f];
334     copyelement( document.topform.elements[field],
335                  document.bottomform.elements[field]
336                );
337   }
338
339   var layerform = document.topform.select.options[document.topform.select.selectedIndex].value;
340   for ( f=0; f < layervars.length; f++ ) {
341     var field = layervars[f];
342     copyelement( document.forms[layerform].elements[field],
343                  document.bottomform.elements[field]
344                );
345   }
346
347   for ( f=0; f < billing_bottomvars.length; f++ ) {
348     var field = billing_bottomvars[f];
349     copyelement( document.billing_bottomform.elements[field],
350                  document.bottomform.elements[field]
351                );
352   }
353
354 }
355
356 function copyelement(from, to) {
357   if ( from == undefined ) {
358     to.value = '';
359   } else if ( from.type == 'select-one' ) {
360     to.value = from.options[from.selectedIndex].value;
361     //alert(from + " (" + from.type + "): " + to.name + " => (" + from.selectedIndex + ") " + to.value);
362   } else if ( from.type == 'checkbox' ) {
363     if ( from.checked ) {
364       to.value = from.value;
365     } else {
366       to.value = '';
367     }
368   } else {
369     if ( from.value == undefined ) {
370       to.value = '';
371     } else {
372       to.value = from.value;
373     }
374   }
375   //alert(from + " (" + from.type + "): " + to.name + " => " + to.value);
376 }
377
378 </SCRIPT>
379
380 <FORM ACTION="<% popurl(1) %>process/cust_main.cgi" METHOD=POST NAME="bottomform" onSubmit="document.bottomform.submit.disabled=true; bottomfixup(this.form);" STYLE="margin-top: 0; margin-bottom: 0">
381 % foreach my $hidden (
382 %     'birthdate',
383 %
384 %     'custnum', 'agentnum', 'refnum', 'referral_custnum',
385 %     'last', 'first', 'ss', 'company',
386 %     'address1', 'address2', 'city',
387 %     'county', 'state', 'zip', 'country',
388 %     'daytime', 'night', 'fax',
389 %     'stateid', 'stateid_state',
390 %     
391 %     'same',
392 %     
393 %     'ship_last', 'ship_first', 'ship_company',
394 %     'ship_address1', 'ship_address2', 'ship_city',
395 %     'ship_county', 'ship_state', 'ship_zip', 'ship_country',
396 %     'ship_daytime','ship_night', 'ship_fax',
397 %     
398 %     'select', #XXX key
399 %
400 %     'payauto',
401 %     'payinfo', 'payinfo1', 'payinfo2', 'paytype',
402 %     'payname', 'paystate', 'exp_month', 'exp_year', 'paycvv',
403 %     'paystart_month', 'paystart_year', 'payissue',
404 %     'payip',
405 %     'paid',
406 %     
407 %     'tax',
408 %     'invoicing_list', 'invoicing_list_POST', 'invoicing_list_FAX',
409 %     'invoice_terms',
410 %     'spool_cdr'
411 %   ) {
412 %
413
414   <INPUT TYPE="hidden" NAME="<% $hidden %>" VALUE="">
415 % } 
416 %
417 % my $ro_comments = $conf->exists('cust_main-use_comments')?'':'readonly';
418 % if (!$ro_comments || $cust_main->comments) {
419
420 <BR>Comments
421 <% &ntable("#cccccc") %>
422   <TR>
423     <TD>
424       <TEXTAREA COLS=80 ROWS=5 WRAP="HARD" NAME="comments" <%$ro_comments%>><% $cust_main->comments %></TEXTAREA>
425     </TD>
426   </TR>
427 </TABLE>
428 %
429 % }
430 %
431 %unless ( $custnum ) {
432 %  # pry the wrong place for this logic.  also pretty expensive
433 %  #use FS::part_pkg;
434 %
435 %  #false laziness, copied from FS::cust_pkg::order
436 %  my $pkgpart;
437 %  my @agents = $FS::CurrentUser::CurrentUser->agents;
438 %  if ( scalar(@agents) == 1 ) {
439 %    # $pkgpart->{PKGPART} is true iff $custnum may purchase PKGPART
440 %    $pkgpart = $agents[0]->pkgpart_hashref;
441 %  } else {
442 %    #can't know (agent not chosen), so, allow all
443 %    my %typenum;
444 %    foreach my $agent ( @agents ) {
445 %      next if $typenum{$agent->typenum}++;
446 %      #fixed in 5.004_05 #$pkgpart->{$_}++ foreach keys %{ $agent->pkgpart_hashref }
447 %      foreach ( keys %{ $agent->pkgpart_hashref } ) { $pkgpart->{$_}++; } #5.004_04 workaround
448 %    }
449 %  }
450 %  #eslaf
451 %
452 %  my @part_pkg = grep { $_->svcpart('svc_acct') && $pkgpart->{ $_->pkgpart } }
453 %    qsearch( 'part_pkg', { 'disabled' => '' }, '', 'ORDER BY pkg' ); # case?
454 %
455 %  if ( @part_pkg ) {
456 %
457 %    #    print "<BR><BR>First package", &itable("#cccccc", "0 ALIGN=LEFT"),
458 %    #apiabuse & undesirable wrapping
459 %
460 %    
461
462     <BR>First package
463     <% ntable("#cccccc") %>
464     
465       <TR>
466         <TD COLSPAN=2>
467           <% include('cust_main/select-domain.html',
468                        'pkgparts'      => \@part_pkg,
469                        'saved_pkgpart' => $saved_pkgpart,
470                        'saved_domsvc' => $saved_domsvc,
471                     )
472           %>
473         </TD>
474       </TR>
475
476 %        #false laziness: (mostly) copied from edit/svc_acct.cgi
477 %        #$ulen = $svc_acct->dbdef_table->column('username')->length;
478 %        my $ulen = dbdef->table('svc_acct')->column('username')->length;
479 %        my $ulen2 = $ulen+2;
480 %        my $passwordmax = $conf->config('passwordmax') || 8;
481 %        my $pmax2 = $passwordmax + 2;
482 %      
483
484     
485       <TR>
486         <TD ALIGN="right">Username</TD>
487         <TD>
488           <INPUT TYPE="text" NAME="username" VALUE="<% $username %>" SIZE=<% $ulen2 %> MAXLENGTH=<% $ulen %>>
489         </TD>
490       </TR>
491     
492       <TR>
493         <TD ALIGN="right">Domain</TD>
494         <TD>
495           <SELECT NAME="domsvc">
496             <OPTION>(none)</OPTION>
497           </SELECT>
498         </TD>
499       </TR>
500     
501       <TR>
502         <TD ALIGN="right">Password</TD>
503         <TD>
504           <INPUT TYPE="text" NAME="_password" VALUE="<% $password %>" SIZE=<% $pmax2 %> MAXLENGTH=<% $passwordmax %>>
505           (blank to generate)
506         </TD>
507       </TR>
508     
509       <TR>
510         <TD ALIGN="right">Access number</TD>
511         <TD><% FS::svc_acct_pop::popselector($popnum) %></TD>
512       </TR>
513     </TABLE>
514 % } 
515 % } 
516
517
518 <INPUT TYPE="hidden" NAME="otaker" VALUE="<% $cust_main->otaker %>">
519 <BR>
520 <INPUT TYPE="submit" NAME="submit" VALUE="<% $custnum ?  "Apply Changes" : "Add Customer" %>">
521 <BR>
522 </FORM>
523
524 <% include('/elements/footer.html') %>
525