1 % unless ( $opt{'js_only'} ) {
3 <INPUT TYPE="hidden" NAME="<%$name%>" ID="<%$id%>" VALUE="<% $curr_value %>">
5 <TABLE STYLE="display:inline">
13 <SELECT NAME="<%$name%>_payby"
15 onChange="payby_changed(this)"
17 % foreach my $payby (@payby) {
18 <OPTION VALUE="<% $payby %>"
19 <% ($sel_payby eq $payby) ? 'SELECTED' : '' %>
20 ><% FS::payby->shortname($payby) |h %>
23 <FONT SIZE="-1"><% mt('Type') |h %></FONT>
30 % my $card_display = $sel_payby eq 'CARD' ? '' : 'STYLE="display:none"';
32 <TD ID="<%$id%>_td_payinfo" <%$card_display%>>
34 NAME = "<%$name%>_payinfo"
35 ID = "<%$id%>_payinfo"
38 VALUE = "<% ( $cgi->param($name.'_payby')
39 || $cust_payby->payby ) =~ /^(CARD|DCRD)$/
40 ? ( $cgi->param($name.'_payinfo') || $cust_payby->paymask )
43 onChange = "<% $onchange %>"
45 <BR><FONT SIZE="-1"><% mt('Card number') |h %></FONT>
48 <TD ID="<%$id%>_td_paydate" <%$card_display%>>
49 <& /elements/select-month_year.html,
50 'prefix' => $name. '_paydate',
52 ( $cgi->param($name.'_payby') || $cust_payby->payby ) =~ /^(CARD|DCRD)$/
53 ? ( $cgi->param($name.'_paydate_month')
54 ? $cgi->param($name.'_paydate_month'). '-1-'.
55 $cgi->param($name.'_paydate_year')
56 : $cust_payby->paydate
60 'onhhange' => $onchange,
62 <BR><FONT SIZE="-1">Expiration date</FONT>
65 <TD ID="<%$id%>_td_paycvv" <%$card_display%>>
67 NAME = "<%$name%>_paycvv"
71 VALUE = "<% scalar($cgi->param($name.'_paycvv')) || ('*' x length($cust_payby->paycvv)) %>"
72 onChange = "<% $onchange %>"
74 <BR><FONT SIZE="-1"><% mt('CVV2') |h %> <& /elements/popup_link.html,
75 'action' => $p.'docs/cvv2.html',
76 'label' => mt('(help)'),
77 'actionlabel' => 'CVV2 Help',
81 #popup_name => 'cvv2_popup',
85 <TD ID="<%$id%>_td_payname" <%$card_display%>>
87 NAME = "<%$name%>_payname"
88 ID = "<%$id%>_payname"
89 onChange = "<% $onchange %>"
90 VALUE = "<% ( $cgi->param($name.'_payby')
91 || $cust_payby->payby ) =~ /^(CARD|DCRD)$/
92 ? ( $cgi->param($name.'_payname') || $cust_payby->payname )
96 <BR><FONT SIZE="-1"><% mt('Exact name on card') |h %></FONT>
103 % my $chek_display = $sel_payby eq 'CHEK' ? '' : 'STYLE="display:none"';
105 <TD ID="<%$id%>_td_paytype" <%$chek_display%>>
106 <SELECT NAME="<%$name%>_paytype">!.
107 % foreach my $paytype ( FS::cust_payby->paytypes ) {
108 <OPTION VALUE="<%$paytype%>"
109 <% $paytype eq ( $cgi->param($name.'_paytype')
110 || $cust_payby->paytype )
117 <BR><FONT SIZE="-1"><% mt('Account type') |h %></FONT>
120 % my ( $account, $aba, $branch ) = ( '', '', '' );
121 % if ( $cgi->param($name.'_payby') =~ /^(CHEK|DCHK)$/ ) {
122 % $account = $cgi->param($name.'_payinfo1');
123 % $aba = $cgi->param($name.'_payinfo2');
124 % $branch = $cgi->param($name.'_payinfo3');
125 % } elsif ( $cust_payby->payby =~ /^(CHEK|DCHK)$/ ) {
126 % ( $account, $aba ) = split('@', $cust_payby->payinfo);
127 % ( $branch, $aba ) = split('\.',$aba)
128 % if $echeck_country eq 'CA';
131 % #false laziness w/view/cust_main/billing.html and misc/payment.cgi
132 % my $routing_label = $echeck_country eq 'US' ? 'ABA/Routing #'
134 % my $routing_size = $echeck_country eq 'CA' ? 4 : 10;
135 % my $routing_maxlength = $echeck_country eq 'CA' ? 3 : 9;
136 % my $bankname_size = $echeck_country eq 'CA' ? 13 : 20;
138 <TD ID="<%$id%>_td_payinfo1" <%$chek_display%>>
140 NAME = "<%$name%>_payinfo1"
141 ID = "<%$id%>_payinfo1"
142 VALUE = "<% $account |h %>"
145 <BR><FONT SIZE="-1"><% mt('Account #') |h %> (<A HREF="javascript:void(0);" onClick="overlib( OLiframeContent('<%$p%>docs/ach.html', 380, 220, 'ach_popup' ), CAPTION, 'ACH Help', STICKY, AUTOSTATUSCAP, CLOSECLICK, DRAGGABLE ); return false;"><% mt('help') |h %></A>)</FONT>
148 <TD ID="<%$id%>_td_payinfo2" <%$chek_display%>>
150 NAME = "<%$name%>_payinfo2"
151 ID = "<%$id%>_payinfo2"
152 VALUE = "<% $aba |h %>"
153 SIZE = "<% $routing_size %>"
154 MAXLENGTH = "<% $routing_maxlength %>"
156 <BR><FONT SIZE="-1"><% mt($routing_label) |h %></FONT>
159 % if ( $echeck_country eq 'CA' ) {
160 <TD ID="<%$id%>_td_payinfo3" <%$chek_display%>>
162 NAME = "<%$name%>_payinfo3"
163 ID = "<%$id%>_payinfo3"
164 VALUE = "<% $branch |h %>"
168 <BR><FONT SIZE="-1"><% mt('Branch #') |h %></FONT>
172 <TD ID="<%$id%>_td_payname_CHEK" <%$chek_display%>>
174 NAME = "<%$name%>_payname_CHEK"
175 ID = "<%$id%>_payname_CHEK"
176 VALUE = "<% ( $cgi->param($name.'_payby')
177 || $cust_payby->payby ) =~ /^(CHEK|DCHK)$/
178 ? ( $cgi->param($name.'_payname_CHEK') || $cust_payby->payname )
181 SIZE = "<% $bankname_size %>"
183 <BR><FONT SIZE="-1"><% mt('Bank name') |h %></FONT>
186 % if ( $conf->exists('show_bankstate') ) {
187 <TD ID="<%$id%>_td_paystate" <%$chek_display%>>
188 <& /elements/select-state.html,
189 'prefix' => $name. '_pay',
190 'empty' => emt('(choose)'),
191 'state' => ( scalar($cgi->param($name.'_paystate'))
192 || $cust_payby->paystate ),
193 #was cust_main->country in 3.x, but this will do until/unlesss
194 # someone needs to track foreign bank states
195 'country' => ( scalar($conf->config('countrydefault')) || 'US' ),
197 <BR><FONT SIZE="-1"><% mt('Bank state') |h %></FONT>
202 % # auto (maybe this should be first...)
205 % #some fun javascript to enforce a single value for each weight
208 <SELECT NAME = "<%$name%>_weight">
209 <OPTION VALUE="">Do not auto-charge
210 % foreach my $weight ( 1 .. max(5,$cust_payby->weight) ) { #more than 5?
211 <OPTION VALUE="<%$weight%>"
212 <% $weight == $cust_payby->weight
216 ><% mt( $weight{$weight} ) |h %>
220 <FONT SIZE="-1"><% mt('Auto-charge') |h %></FONT>
227 % unless ( $opt{'html_only'} || $payby_changed_init ) {
228 <SCRIPT TYPE="text/javascript">
230 function payby_changed(what) {
231 var field_match = what.id.match(/(.*)_payby$/);
232 var field_id = field_match[1];
233 var payby = what.options[what.selectedIndex].value;
234 if ( payby == 'CARD' ) {
235 document.getElementById(field_id+'_td_payinfo').style.display = '';
236 document.getElementById(field_id+'_td_paydate').style.display = '';
237 document.getElementById(field_id+'_td_paycvv').style.display = '';
238 document.getElementById(field_id+'_td_payname').style.display = '';
239 document.getElementById(field_id+'_td_payinfo1').style.display = 'none';
240 document.getElementById(field_id+'_td_payinfo2').style.display = 'none';
241 document.getElementById(field_id+'_td_paytype').style.display = 'none';
242 document.getElementById(field_id+'_td_payname_CHEK').style.display = 'none';
243 var td_payinfo3 = document.getElementById(field_id+'_td_payinfo3');
245 td_payinfo3.style.display = 'none';
247 var td_paystate = document.getElementById(field_id+'_td_paystate');
249 td_paystate.style.display = 'none';
251 } else if ( payby == 'CHEK' ) {
252 document.getElementById(field_id+'_td_payinfo').style.display = 'none';
253 document.getElementById(field_id+'_td_paydate').style.display = 'none';
254 document.getElementById(field_id+'_td_paycvv').style.display = 'none';
255 document.getElementById(field_id+'_td_payname').style.display = 'none';
256 document.getElementById(field_id+'_td_payinfo1').style.display = '';
257 document.getElementById(field_id+'_td_payinfo2').style.display = '';
258 document.getElementById(field_id+'_td_paytype').style.display = '';
259 document.getElementById(field_id+'_td_payname_CHEK').style.display = '';
260 var td_payinfo3 = document.getElementById(field_id+'_td_payinfo3');
262 td_payinfo3.style.display = '';
264 var td_paystate = document.getElementById(field_id+'_td_paystate');
266 td_paystate.style.display = '';
269 alert( 'unknown payby ' + payby );
271 spawn_custpaybynum(what);
275 % $payby_changed_init = 1;
278 my $payby_changed_init = 0;
284 my $conf = new FS::Conf;
286 my $echeck_country = $conf->config('echeck-country');
288 my $name = $opt{'element_name'} || $opt{'field'} || 'custpaybynum';
289 my $id = $opt{'id'} || 'custpaybynum';
291 my $curr_value = $opt{'curr_value'} || $opt{'value'};
294 if ( $opt{'onchange'} ) {
295 $onchange = $opt{'onchange'};
296 $onchange .= '(this)' unless $onchange =~ /\(\w*\);?$/;
297 $onchange =~ s/\(what\);/\(this\);/g; #ugh, terrible hack. all onchange
298 #callbacks should act the same
299 #$onchange = 'onChange="'. $onchange. '"';
304 $cust_payby = qsearchs('cust_payby', { 'custpaybynum' => $curr_value } );
306 $cust_payby = new FS::cust_payby {};
308 my $sel_payby = $cgi->param($name.'_payby') || $cust_payby->payby;
309 # convert DCRD to CARD + no weight, and the same for DCHK/CHEK
310 if ($sel_payby eq 'DCRD') {
312 $cust_payby->weight('');
313 } elsif ($sel_payby eq 'DCHK') {
315 $cust_payby->weight('');
316 } elsif (!$sel_payby) {
321 my @payby = FS::payby->cust_payby;
322 my %conf_payby = map { $_=>1 } $conf->config('payby');
323 @payby = grep $conf_payby{$_}, @payby if keys %conf_payby;
324 @payby = grep $_ !~ /^(DCRD|DCHK)$/, @payby;