summaryrefslogtreecommitdiff
path: root/httemplate/edit/cust_main
diff options
context:
space:
mode:
Diffstat (limited to 'httemplate/edit/cust_main')
-rw-r--r--httemplate/edit/cust_main/billing.html590
-rw-r--r--httemplate/edit/cust_main/birthdate.html16
-rw-r--r--httemplate/edit/cust_main/bottomfixup.html19
-rw-r--r--httemplate/edit/cust_main/bottomfixup.js156
-rw-r--r--httemplate/edit/cust_main/choose_tax_location.html87
-rw-r--r--httemplate/edit/cust_main/contact.html194
-rw-r--r--httemplate/edit/cust_main/first_pkg.html84
-rw-r--r--httemplate/edit/cust_main/first_pkg/select-part_pkg.html162
-rw-r--r--httemplate/edit/cust_main/first_pkg/svc_acct.html84
-rw-r--r--httemplate/edit/cust_main/first_pkg/svc_dsl.html75
-rw-r--r--httemplate/edit/cust_main/first_pkg/svc_phone.html82
-rw-r--r--httemplate/edit/cust_main/top_misc.html135
12 files changed, 1684 insertions, 0 deletions
diff --git a/httemplate/edit/cust_main/billing.html b/httemplate/edit/cust_main/billing.html
new file mode 100644
index 000000000..3266c16af
--- /dev/null
+++ b/httemplate/edit/cust_main/billing.html
@@ -0,0 +1,590 @@
+%if ( $payby_default eq 'HIDE' ) {
+% $cust_main->payby('BILL') unless $cust_main->payby;
+% my $payby = $cust_main->payby;
+
+ <INPUT TYPE="hidden" NAME="payby" VALUE="<% $payby %>">
+
+ <INPUT TYPE="hidden" NAME="<%$payby%>_payinfo" VALUE="<% $cust_main->paymask %>">
+
+% foreach my $field (qw( payname paycvv paystart_month paystart_year payissue payip paytype paystate )) {
+
+ <INPUT TYPE="hidden" NAME="<% $payby.'_'.$field %>" VALUE="<% $cust_main->get($field) %>">
+
+% }
+
+% #false laziness w/elements/select-month_year.html & view/cust_main/billing.html
+% my( $mon, $year );
+% my $date = $cust_main->paydate || '12-2037';
+% if ( $date =~ /^(\d{4})-(\d{1,2})-\d{1,2}$/ ) { #PostgreSQL date format
+% ( $mon, $year ) = ( $2, $1 );
+% } elsif ( $date =~ /^(\d{1,2})-(\d{1,2}-)?(\d{4}$)/ ) {
+% ( $mon, $year ) = ( $1, $3 );
+% } else {
+% die "unrecognized expiration date format: $date";
+% }
+
+ <INPUT TYPE="hidden" NAME="<%$payby%>_exp_month" VALUE="<% $mon %>">
+ <INPUT TYPE="hidden" NAME="<%$payby%>_exp_year" VALUE="<% $year %>">
+
+ <INPUT TYPE="hidden" NAME="tax" VALUE="<% $cust_main->tax %>">
+
+ <INPUT TYPE="hidden" NAME="invoicing_list" VALUE="<% join(', ', @invoicing_list) %>">
+
+% } else {
+%
+% my $r = qq!<font color="#ff0000">*</font>&nbsp;!;
+
+ <BR><FONT SIZE="+1"><B><% mt('Billing information') |h %></B></FONT>
+ <% &ntable("#cccccc") %>
+
+ <TR>
+ <TD ALIGN="right" WIDTH="200"><%$r%><% mt('Billing type') |h %></TD>
+
+ <SCRIPT>
+
+ var mywindow = -1;
+ function myopen(filename,windowname,properties) {
+ myclose();
+ mywindow = window.open(filename,windowname,properties);
+ }
+ function myclose() {
+ if ( mywindow != -1 )
+ mywindow.close();
+ mywindow = -1;
+ }
+
+ var achwindow = -1;
+ function achopen(filename,windowname,properties) {
+ achclose();
+ achwindow = window.open(filename,windowname,properties);
+ }
+ function achclose() {
+ if ( achwindow != -1 )
+ achwindow.close();
+ achwindow = -1;
+ }
+
+ function card_changed(what) {
+ if (
+ what.form.payinfo.value.substring(0, 4) == '4093'
+ || what.form.payinfo.value.substring(0, 4) == '4911'
+ || what.form.payinfo.value.substring(0, 4) == '4936'
+ || what.form.payinfo.value.substring(0, 6) == '564132'
+ || what.form.payinfo.value.substring(0, 2) == '63'
+ || what.form.payinfo.value.substring(0, 2) == '67'
+ )
+ {
+ what.form.paystart_month.disabled = false;
+ what.form.paystart_year.disabled = false;
+ what.form.payissue.disabled = false;
+ what.form.paystart_month.style.backgroundColor = '#ffffff';
+ what.form.paystart_year.style.backgroundColor = '#ffffff';
+ what.form.payissue.style.backgroundColor = '#ffffff';
+ document.getElementById('paystart_label').style.color = '#000000';
+ document.getElementById('payissue_label').style.color = '#000000';
+ } else {
+ what.form.paystart_month.disabled = true;
+ what.form.paystart_year.disabled = true;
+ what.form.payissue.disabled = true;
+ what.form.paystart_month.style.backgroundColor = '#dddddd';
+ what.form.paystart_year.style.backgroundColor = '#dddddd';
+ what.form.payissue.style.backgroundColor = '#dddddd';
+ document.getElementById('paystart_label').style.color = '#999999';
+ document.getElementById('payissue_label').style.color = '#999999';
+ }
+ return true;
+ }
+
+ function init_payauto_changed(){
+ var f = document.getElementById('CARD_payauto');
+ if(f != null) payauto_changed(f);
+ f = document.getElementById('CHEK_payauto');
+ if(f != null) payauto_changed(f);
+ }
+
+ function payauto_changed(payauto_field){
+ var span = (payauto_field.name == 'CARD_payauto') ? 'card_billday' : 'chek_billday';
+ var select = document.getElementById('select_'+span);
+ span = document.getElementById(span);
+ if (span == null || select == null) return;
+ if(payauto_field.checked) {
+ span.style.color = '#000000';
+ select.disabled = false;
+ }
+ else {
+ span.style.color = '#999999';
+ select.disabled = true;
+ select.selectedIndex = 0;
+ }
+ }
+
+ </SCRIPT>
+
+ <& /elements/init_overlib.html &>
+
+% my $payby = $cust_main->payby;
+% my $paytype = $cust_main->paytype;
+% my( $account, $aba ) = split('@', $payinfo);
+% my $branch = '';
+% ($branch,$aba) = split('\.',$aba) if $conf->exists('cust_main-require-bank-branch');
+%
+% my $disabled = 'DISABLED style="background-color: #dddddd"';
+% my $text_disabled = 'style="color: #999999"';
+%
+% if ( $payby =~ /^(CARD|DCRD)$/ && cardtype($payinfo) =~ /^(Switch|Solo)$/ ) {
+% $disabled = 'style="background-color: #ffffff"';
+% $text_disabled = 'style="color: #000000";'
+% }
+%
+% my $disable_payauto = $conf->exists('disable_payauto_default');
+% my $CARD_payauto_checked = $payby eq 'DCRD' ? ''
+% : $payby eq 'CARD' ? 'CHECKED'
+% : $disable_payauto ? '' : 'CHECKED';
+% my $CHEK_payauto_checked = $payby eq 'DCHK' ? ''
+% : $payby eq 'CHEK' ? 'CHECKED'
+% : $disable_payauto ? '' : 'CHECKED';
+%
+% sub billday_options {
+% my $curr_value = shift;
+% my $ret = '';
+% for my $billday ( 1 .. 28 ) {
+% my $sel = '';
+% $sel = "SELECTED='SELECTED'" if $curr_value == $billday;
+% $ret .= "<OPTION VALUE='$billday' $sel>$billday</OPTION>";
+% }
+% $ret;
+% }
+%
+% my $card_billday_style = $payby eq 'CARD' ? '' : 'style="color: #999999"';
+% my $chek_billday_style = $payby eq 'CHEK' ? '' : 'style="color: #999999"';
+% my $card_billday_select_disabled = $payby eq 'CARD' ? '' : 'DISABLED';
+% my $chek_billday_select_disabled = $payby eq 'CHEK' ? '' : 'DISABLED';
+%
+% my %payby = (
+%
+% 'CARD' =>
+%
+% '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Card number').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="CARD_payinfo" VALUE="!. ( $payby =~ /^(CARD|DCRD)$/ ? $payinfo : '' ). qq!" MAXLENGTH=19 onChange="card_changed(this)" onKeyUp="card_changed(this)"></TD></TR>!.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Expiration').qq! </TD>!.
+% '<TD WIDTH="408">'.
+%
+% include('/elements/select-month_year.html',
+% 'prefix' => 'CARD_exp',
+% 'selected_date' =>
+% ( $payby =~ /^(CARD|DCRD)$/ ? $cust_main->paydate : '' ),
+% ).
+%
+% '</TD></TR>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">!.emt('CVV2').qq!&nbsp;!.
+%
+% qq!(<A HREF="javascript:void(0);" onClick="overlib( OLiframeContent('../docs/cvv2.html', 480, 352, 'cvv2_popup' ), CAPTION, 'CVV2 Help', STICKY, AUTOSTATUSCAP, CLOSECLICK, DRAGGABLE ); return false;">!.emt('help').qq!</A>)!.
+% qq!</TD>!.
+% '<TD WIDTH="408"><INPUT TYPE="text" NAME="CARD_paycvv" VALUE="'. ( $payby =~ /^(CARD|DCRD)$/ && !$cust_main->is_encrypted($cust_main->paycvv) ? $cust_main->paycvv : '' ). '" SIZE=4 MAXLENGTH=4>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200"><SPAN ID="paystart_label" $text_disabled>!.emt('Start date').qq! </SPAN></TD>!.
+% '<TD WIDTH="408">'.
+%
+% include('/elements/select-month_year.html',
+% 'prefix' => 'CARD_paystart',
+% 'disabled' => $disabled,
+% 'empty_option' => 1,
+% 'start_year' => 2000,
+% 'end_year' => (localtime())[5] + 1900,
+% 'selected_date' => (
+% ( $payby =~ /^(CARD|DCRD)$/
+% && cardtype($payinfo) =~ /^(Switch|Solo)$/ )
+% ? $cust_main->paystart_month. '-'.
+% $cust_main->paystart_year
+% : ''
+% )
+% ).
+%
+% qq!<SPAN ID="payissue_label" $text_disabled>!.emt('or Issue number').qq! </SPAN>!.
+% '<INPUT TYPE="text" NAME="CARD_payissue" VALUE="'. ( $payby =~ /^(CARD|DCRD)$/ ? $cust_main->payissue : '' ). qq!" SIZE=3 MAXLENGTH=2 $disabled></TD></TR>!.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Exact name on card').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="CARD_payname" VALUE="!. ( $payby =~ /^(CARD|DCRD)$/ ? $cust_main->payname : '' ). qq!"></TD></TR>!.
+%
+% qq!<TR><TD COLSPAN=2 WIDTH="608">!.
+% qq!<INPUT TYPE="checkbox" onchange="payauto_changed(this);" ID="CARD_payauto" NAME="CARD_payauto" $CARD_payauto_checked> !.
+% emt('Charge future payments to this [_1] automatically','credit card').'</TD></TR>'.
+%
+% ( $conf->exists('cust_main-select-billday') ?
+% qq!<TR><TD ALIGN="RIGHT" id="card_billday" $card_billday_style>
+% Charge on this day of each month</TD><TD> &nbsp;
+% <SELECT id="select_card_billday" $card_billday_select_disabled NAME="billday">!
+% . billday_options($cust_main->billday) . qq!</SELECT> </TD></TR>!
+% : ''
+% ).
+%
+% '</TABLE>',
+%
+% 'CHEK' =>
+%
+% '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Account number').qq! </TD>!.
+% qq!<TD><INPUT TYPE="text" SIZE=12 NAME="CHEK_payinfo1" VALUE="!. ( $payby =~ /^(CHEK|DCHK)$/ ? $account : '' ). '"></TD>'.
+% qq!<TD ALIGN="right">!.emt('Type').qq!</TD><TD><SELECT NAME="CHEK_paytype">!.
+% join('', map { qq!<OPTION VALUE="$_" !.($paytype eq $_ ? 'SELECTED' : '').">$_</OPTION>" } @FS::cust_main::paytypes).
+% qq!</SELECT></TD></TR>!.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('ABA/Routing number').qq! </TD>!.
+% qq!<TD COLSPAN="3" WIDTH="408"><INPUT TYPE="text" SIZE=10 MAXLENGTH=9 NAME="CHEK_payinfo2" VALUE="!. ( $payby =~ /^(CHEK|DCHK)$/ ? $aba : '' ). qq!" SIZE=10 MAXLENGTH=9> !.
+% qq!(<A HREF="javascript:void(0);" onClick="overlib( OLiframeContent('../docs/ach.html', 380, 240, 'ach_popup' ), CAPTION, 'ACH Help', STICKY, AUTOSTATUSCAP, CLOSECLICK, DRAGGABLE ); return false;">!.emt('help').qq!</A>)!.
+% qq!</TD></TR>!.
+%
+% qq!<INPUT TYPE="hidden" NAME="CHEK_exp_month" VALUE="12">!.
+% qq!<INPUT TYPE="hidden" NAME="CHEK_exp_year" VALUE="2037">!.
+%
+% ( $conf->exists('cust_main-require-bank-branch') ?
+% qq!<TR><TD ALIGN="right">$r !.emt('Branch number').qq!</TD><TD COLSPAN="3">
+% <INPUT TYPE="text" name="CHEK_payinfo3" VALUE=$branch></TD></TR>! : '' ).
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Bank name').qq! </TD>!.
+% qq!<TD COLSPAN="3" WIDTH="408"><INPUT TYPE="text" NAME="CHEK_payname" VALUE="!. ( $payby =~ /^(CHEK|DCHK)$/ ? $cust_main->payname : '' ). qq!"></TD></TR>!.
+% ( $conf->exists('show_bankstate') ?
+% qq!<TR><TD ALIGN="right" WIDTH="200">$paystate_label</TD>!.
+% qq!<TD COLSPAN="3" WIDTH="408">!.
+% include('/elements/select-state.html',
+% 'empty' => emt('(choose)'),
+% 'state' => $cust_main->paystate,
+% 'country' => $cust_main->country,
+% 'prefix' => 'CHEK_pay',
+% ). "</TD></TR>"
+% : '<INPUT TYPE="hidden" NAME="CHEK_paystate" VALUE="'.
+% $cust_main->paystate. '">'
+% ).
+%
+%
+% qq!<TR><TD COLSPAN=4 WIDTH="608">!.
+% qq!<INPUT TYPE="checkbox" onchange="payauto_changed(this);" ID="CHEK_payauto" NAME="CHEK_payauto" $CHEK_payauto_checked> !.
+% emt('Charge future payments to this [_1] automatically','electronic check').'</TD></TR>'.
+%
+% ( $conf->exists('cust_main-select-billday') ?
+% qq!<TR><TD ALIGN="RIGHT" id="chek_billday" $chek_billday_style>
+% Charge on this day of each month</TD><TD> &nbsp;
+% <SELECT id="select_chek_billday" $chek_billday_select_disabled NAME="billday">!
+% . billday_options($cust_main->billday) . qq!</SELECT> </TD></TR>!
+% : ''
+% ).
+%
+% '</TABLE>',
+%
+% 'LECB' =>
+%
+% '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Phone number').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="LECB_payinfo" VALUE="!. ( $payby eq 'LECB' ? $cust_main->payinfo : '' ). qq!" MAXLENGTH=15 SIZE=16></TD></TR>!.
+%
+% qq!<INPUT TYPE="hidden" NAME="LECB_exp_month" VALUE="12">!.
+% qq!<INPUT TYPE="hidden" NAME="LECB_exp_year" VALUE="2037">!.
+% qq!<INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!.
+%
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+%
+% '</TABLE>',
+%
+% 'BILL' =>
+%
+% '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">!.emt('P.O.').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="BILL_payinfo" VALUE="!. ( $payby eq 'BILL' ? $cust_main->payinfo : '' ). qq!"></TD></TR>!.
+%
+% qq!<INPUT TYPE="hidden" NAME="BILL_exp_month" VALUE="12">!.
+% qq!<INPUT TYPE="hidden" NAME="BILL_exp_year" VALUE="2037">!.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">!.emt('Attention').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="BILL_payname" VALUE="!. encode_entities( $payby eq 'BILL' ? $cust_main->payname : '' ). qq!"></TD></TR>!.
+%
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+%
+% '</TABLE>',
+%
+% 'COMP' =>
+%
+% '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Approved by').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""></TD></TR>!.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Expiration').qq! </TD>!.
+% '<TD WIDTH="408">'.
+%
+% include('/elements/select-month_year.html',
+% 'prefix' => 'COMP_exp',
+% 'selected_date' =>
+% ( $payby eq 'COMP' ? $cust_main->paydate : '' ),
+% ).
+%
+% '</TD></TR>'.
+%
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+%
+% '</TABLE>',
+%
+% 'CASH' =>
+%
+% '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Amount').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="CASH_paid" VALUE="!. ( $payby eq 'CASH' ? $cust_main->paid : '' ). qq!"></TD></TR>!.
+%
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+%
+% '</TABLE>',
+%
+% 'WEST' =>
+%
+% '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Amount').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="WEST_paid" VALUE="!. ( $payby eq 'WEST' ? $cust_main->paid : '' ). qq!"></TD></TR>!.
+%
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+%
+% '</TABLE>',
+%
+% 'MCRD' =>
+%
+% '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+%
+% qq!<TR><TD ALIGN="right" WIDTH="200">${r}!.emt('Amount').qq! </TD>!.
+% qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="MCRD_paid" VALUE="!. ( $payby eq 'MCRD' ? $cust_main->paid : '' ). qq!"></TD></TR>!.
+%
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+% '<TR><TD>&nbsp;</TD></TR>'.
+%
+% '</TABLE>',
+%
+% );
+%
+% #this should use FS::payby
+% my @allopt = qw( CARD CHEK LECB BILL CASH WEST MCRD COMP );
+%
+% my %allopt = map { $_ => FS::payby->shortname($_) } @allopt;
+%
+% if ( $cust_main->custnum ) {
+% #don't offer CASH/WEST/MCRD initial payment types when editing customer
+% delete $allopt{$_} for qw(CASH WEST MCRD);
+% }
+%
+% my @options = grep exists( $allopt{$_} ), @payby;
+%
+% my %payby2option = (
+% ( map { $_ => $_ } @options ),
+% 'DCRD' => 'CARD',
+% 'DCHK' => 'CHEK',
+% );
+
+ <TD WIDTH="408">
+ <& /elements/selectlayers.html,
+ 'field' => 'payby',
+ 'curr_value' => $payby2option{$payby || $payby_default || $payby[0] },
+ 'options' => \@options,
+ 'labels' => \%allopt,
+ 'html_between' => '</TD></TR></TABLE>',
+ 'layer_callback' => sub { my $layer = shift; $payby{$layer}; },
+ 'onchange' => 'init_payauto_changed();',
+ &>
+
+ <% &ntable("#cccccc") %>
+
+ <TR><TD>&nbsp;</TD></TR>
+
+% my @exempt_groups = grep /\S/, $conf->config('tax-cust_exempt-groups');
+
+ <TR>
+ <TD WIDTH="608" COLSPAN="2"><INPUT TYPE="checkbox" NAME="tax" VALUE="Y" <% $cust_main->tax eq "Y" ? 'CHECKED' : '' %>> Tax Exempt<% @exempt_groups ? ' (all taxes)' : '' %></TD>
+ </TR>
+
+% foreach my $exempt_group ( @exempt_groups ) {
+% #escape $exempt_group for NAME
+ <TR>
+ <TD WIDTH="608" COLSPAN="2">&nbsp;&nbsp;<INPUT TYPE="checkbox" NAME="tax_<% $exempt_group %>" VALUE="Y" <% $cust_main->tax_exemption($exempt_group) ? 'CHECKED' : '' %>> Tax Exempt (<% $exempt_group %> taxes)<TD>
+ </TR>
+% }
+
+% unless ( $conf->exists('emailinvoiceonly') ) {
+
+ <TR>
+ <TD WIDTH="608" COLSPAN="2"><INPUT TYPE="checkbox" NAME="invoicing_list_POST" VALUE="POST" <%
+
+ ( grep { $_ eq 'POST' } @invoicing_list )
+
+ ? 'CHECKED'
+ : ''
+
+ %>> <% mt('Postal mail invoice') |h %>
+
+ </TD>
+ </TR>
+
+ <TR>
+ <TD WIDTH="608" COLSPAN="2"><INPUT TYPE="checkbox" NAME="invoicing_list_FAX" VALUE="FAX" <%
+
+ ( grep { $_ eq 'FAX' } @invoicing_list )
+ ? 'CHECKED'
+ : ''
+
+ %>> <% mt('Fax invoice') |h %>
+
+ </TD>
+ </TR>
+
+% }
+
+% unless ( $conf->exists('cust-email-high-visibility')) {
+ <TR>
+ <TD ALIGN="right" WIDTH="200">
+ <% $conf->exists('cust_main-require_invoicing_list_email') ? $r : '' %>Email address(es)
+ </TD>
+ <TD WIDTH="408"><INPUT TYPE="text" NAME="invoicing_list" VALUE="<% join(', ', grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list ) %>"></TD>
+ </TR>
+% }
+
+ <TR>
+ <TD ALIGN="right" WIDTH="200"><% mt('Invoice terms') |h %> </TD>
+ <TD WIDTH="408">
+ <& /elements/select-terms.html,
+ 'curr_value' => $cust_main->invoice_terms,
+ &>
+ </TD>
+ </TR>
+
+ <TR>
+ <TD ALIGN="right" WIDTH="200"><% mt('Credit limit') |h %> </TD>
+ <TD WIDTH="408">
+ <SCRIPT TYPE="text/javascript">
+function toggle(obj) {
+ obj.form.credit_limit.disabled = obj.checked;
+}
+ </SCRIPT>
+ <INPUT TYPE="text" NAME="credit_limit" VALUE=<% sprintf('"%.2f"', $cust_main->credit_limit) %><% length($cust_main->credit_limit) ? '' : ' DISABLED' %>>
+ <INPUT TYPE="checkbox" NAME="no_credit_limit" VALUE=1 onclick="toggle(this)"<% length($cust_main->credit_limit) ? '' : ' CHECKED'%>> <% mt('Unlimited') |h %>
+ </TD>
+ </TR>
+
+% if ( $conf->exists('voip-cust_cdr_spools') ) {
+ <TR>
+ <TD COLSPAN="2"><INPUT TYPE="checkbox" NAME="spool_cdr" VALUE="Y" <% $cust_main->spool_cdr eq "Y" ? 'CHECKED' : '' %>> <% mt('Spool CDRs') |h %></TD>
+ </TR>
+% } else {
+ <INPUT TYPE="hidden" NAME="spool_cdr" VALUE="<% $cust_main->spool_cdr %>">
+% }
+
+% if ( $conf->exists('voip-cust_cdr_squelch') ) {
+ <TR>
+ <TD COLSPAN="2"><INPUT TYPE="checkbox" NAME="squelch_cdr" VALUE="Y" <% $cust_main->squelch_cdr eq "Y" ? 'CHECKED' : '' %>> <% mt($conf->exists('voip-cdr_email') ? 'Omit CDRs from printed invoices' : 'Omit CDRs from invoices') |h %></TD>
+ </TR>
+% } else {
+ <INPUT TYPE="hidden" NAME="squelch_cdr" VALUE="<% $cust_main->squelch_cdr %>">
+% }
+
+% if ( $conf->exists('voip-cust_email_csv_cdr') ) {
+ <TR>
+ <TD COLSPAN="2"><INPUT TYPE="checkbox" NAME="email_csv_cdr" VALUE="Y" <% $cust_main->email_csv_cdr eq "Y" ? 'CHECKED' : '' %>> <% mt('Attach CDRs as CSV to emailed invoices') |h %></TD>
+ </TR>
+% } else {
+ <INPUT TYPE="hidden" NAME="email_csv_cdr" VALUE="<% $cust_main->email_csv_cdr %>">
+% }
+
+% if ( $conf->exists('voip-cust_accountcode_cdr') ) {
+ <TR>
+ <TD COLSPAN="2">
+ <INPUT TYPE="checkbox"
+ NAME="accountcode_cdr"
+ VALUE="Y"
+ <% $cust_main->accountcode_cdr eq "Y" ? 'CHECKED' : '' %>
+ > <% mt('Breakdown CDRs by accountcode') |h %></TD>
+ </TR>
+% } else {
+ <INPUT TYPE="hidden" NAME="accountcode_cdr" VALUE="<% $cust_main->accountcode_cdr %>">
+% }
+
+% if ( $show_term || $cust_main->cdr_termination_percentage ) {
+ <TR>
+ <TD ALIGN="right"><% mt('CDR termination settlement') |h %></TD>
+ <TD><INPUT TYPE = "text"
+ NAME = "cdr_termination_percentage"
+ SIZE = 6
+ VALUE = "<% $cust_main->cdr_termination_percentage %>"
+ STYLE = "text-align:right;"
+ ><B>%</B></TD>
+ </TR>
+% } else {
+ <INPUT TYPE="hidden" NAME="cdr_termination_percentage" VALUE="<% $cust_main->cdr_termination_percentage %>">
+% }
+
+ </TABLE>
+
+ <% $r %> <% mt('required fields') |h %>
+% }
+
+<script type="text/javascript">
+ init_payauto_changed();
+</script>
+
+<%once>
+
+my $paystate_label = FS::Msgcat::_gettext('paystate');
+$paystate_label = 'Bank state' if $paystate_label =~/^paystate$/;
+
+</%once>
+<%init>
+
+my( $cust_main, %options ) = @_;
+my @invoicing_list = @{ $options{'invoicing_list'} };
+my $payinfo = $options{'payinfo'};
+my $conf = new FS::Conf;
+my $payby_default = $conf->config('payby-default');
+
+my @payby = grep /\w/, $conf->config('payby');
+#@payby = (qw( CARD DCRD CHEK DCHK LECB BILL CASH WEST COMP ))
+@payby = (qw( CARD DCRD CHEK DCHK LECB BILL CASH COMP ))
+ unless @payby;
+
+my $show_term = '';
+if ( $cust_main->custnum ) {
+ #false laziness w/view/cust_main/billing.html
+ my $term_sql = "SELECT COUNT(*) FROM cust_pkg LEFT JOIN part_pkg USING ( pkgpart ) WHERE custnum = ? AND plan = 'cdr_termination' LIMIT 1";
+ my $term_sth = dbh->prepare($term_sql) or die dbh->errstr;
+ $term_sth->execute($cust_main->custnum) or die $term_sth->errstr;
+ $show_term = $term_sth->fetchrow_arrayref->[0];
+}
+
+</%init>
diff --git a/httemplate/edit/cust_main/birthdate.html b/httemplate/edit/cust_main/birthdate.html
new file mode 100644
index 000000000..b4e78e3b9
--- /dev/null
+++ b/httemplate/edit/cust_main/birthdate.html
@@ -0,0 +1,16 @@
+<% ntable("#cccccc", 2) %>
+ <% include( '/elements/tr-input-date-field.html',
+ 'birthdate',
+ $cust_main->birthdate,
+ 'Date of Birth',
+ ( $conf->config('date_format') || "%m/%d/%Y" ),
+ 1
+ )
+ %>
+</TABLE>
+<%init>
+
+my( $cust_main, %opt ) = @_;
+my $conf = new FS::Conf;
+
+</%init>
diff --git a/httemplate/edit/cust_main/bottomfixup.html b/httemplate/edit/cust_main/bottomfixup.html
new file mode 100644
index 000000000..1b29c671a
--- /dev/null
+++ b/httemplate/edit/cust_main/bottomfixup.html
@@ -0,0 +1,19 @@
+<% include('/elements/init_overlib.html') %>
+
+<% include( '/elements/xmlhttp.html',
+ 'url' => $p.'misc/xmlhttp-cust_main-address_standardize.html',
+ 'subs' => [ 'address_standardize' ],
+ #'method' => 'POST', #could get too long?
+ )
+%>
+
+<% include( '/elements/xmlhttp.html',
+ 'url' => $p.'misc/xmlhttp-cust_main-censustract.html',
+ 'subs' => [ 'censustract' ],
+ #'method' => 'POST', #could get too long?
+ )
+%>
+
+<SCRIPT TYPE="text/javascript">
+ <% include('bottomfixup.js') %>
+</SCRIPT>
diff --git a/httemplate/edit/cust_main/bottomfixup.js b/httemplate/edit/cust_main/bottomfixup.js
new file mode 100644
index 000000000..24156f792
--- /dev/null
+++ b/httemplate/edit/cust_main/bottomfixup.js
@@ -0,0 +1,156 @@
+function bottomfixup(what) {
+
+%# ../cust_main.cgi
+ var layervars = new Array(
+ 'payauto',
+ 'payinfo', 'payinfo1', 'payinfo2', 'payinfo3', 'paytype',
+ 'payname', 'paystate', 'exp_month', 'exp_year', 'paycvv',
+ 'paystart_month', 'paystart_year', 'payissue',
+ 'payip',
+ 'paid'
+ );
+
+ var cf = document.CustomerForm;
+ var payby = cf.payby.options[cf.payby.selectedIndex].value;
+ for ( f=0; f < layervars.length; f++ ) {
+ var field = layervars[f];
+ copyelement( cf.elements[payby + '_' + field],
+ cf.elements[field]
+ );
+ }
+
+ //this part does USPS address correction
+ standardize_locations();
+
+}
+
+<% include( '/elements/standardize_locations.js',
+ 'callback', 'post_geocode();'
+ )
+%>
+
+function post_geocode() {
+
+% if ( $conf->exists('cust_main-require_censustract') ) {
+
+ //alert('fetch census tract data');
+ var cf = document.CustomerForm;
+ var state_el = cf.elements['ship_state'];
+ var census_data = new Array(
+ 'year', <% $conf->config('census_year') || '2009' %>,
+ 'address', cf.elements['ship_address1'].value,
+ 'city', cf.elements['ship_city'].value,
+ 'state', state_el.options[ state_el.selectedIndex ].value,
+ 'zip', cf.elements['ship_zip'].value
+ );
+
+ censustract( census_data, update_censustract );
+
+% }else{
+
+ document.CustomerForm.submit();
+
+% }
+
+}
+
+var set_censustract;
+
+function update_censustract(arg) {
+
+ var argsHash = eval('(' + arg + ')');
+
+ var cf = document.CustomerForm;
+
+ var msacode = argsHash['msacode'];
+ var statecode = argsHash['statecode'];
+ var countycode = argsHash['countycode'];
+ var tractcode = argsHash['tractcode'];
+ var error = argsHash['error'];
+
+ var newcensus =
+ new String(statecode) +
+ new String(countycode) +
+ new String(tractcode).replace(/\s$/, ''); // JSON 1 workaround
+
+ set_censustract = function () {
+
+ cf.elements['censustract'].value = newcensus
+ cf.submit();
+
+ }
+
+ if (error || cf.elements['censustract'].value != newcensus) {
+ // popup an entry dialog
+
+ if (error) { newcensus = error; }
+ newcensus.replace(/.*ndefined.*/, 'Not found');
+
+ var choose_censustract =
+ '<CENTER><BR><B>Confirm censustract</B><BR>' +
+ '<A href="http://maps.ffiec.gov/FFIECMapper/TGMapSrv.aspx?' +
+ 'census_year=<% $conf->config('census_year') || '2008' %>' +
+ '&latitude=' + cf.elements['latitude'].value +
+ '&longitude=' + cf.elements['longitude'].value +
+ '" target="_blank">Map service module location</A><BR>' +
+ '<A href="http://maps.ffiec.gov/FFIECMapper/TGMapSrv.aspx?' +
+ 'census_year=<% $conf->config('census_year') || '2008' %>' +
+ '&zip_code=' + cf.elements['ship_zip'].value +
+ '" target="_blank">Map zip code center</A><BR><BR>' +
+ '<TABLE>';
+
+ choose_censustract = choose_censustract +
+ '<TR><TH style="width:50%">Entered census tract</TH>' +
+ '<TH style="width:50%">Calculated census tract</TH></TR>' +
+ '<TR><TD>' + cf.elements['censustract'].value +
+ '</TD><TD>' + newcensus + '</TD></TR>' +
+ '<TR><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
+
+ choose_censustract = choose_censustract +
+ '<TR><TD ALIGN="center">' +
+ '<BUTTON TYPE="button" onClick="document.CustomerForm.submit();"><IMG SRC="<%$p%>images/error.png" ALT=""> Use entered census tract </BUTTON>' +
+ '</TD><TD ALIGN="center">' +
+ '<BUTTON TYPE="button" onClick="set_censustract();"><IMG SRC="<%$p%>images/tick.png" ALT=""> Use calculated census tract </BUTTON>' +
+ '</TD></TR>' +
+ '<TR><TD COLSPAN=2 ALIGN="center">' +
+ '<BUTTON TYPE="button" onClick="document.CustomerForm.submitButton.disabled=false; parent.cClick();"><IMG SRC="<%$p%>images/cross.png" ALT=""> Cancel submission</BUTTON></TD></TR>' +
+
+ '</TABLE></CENTER>';
+
+ overlib( choose_censustract, CAPTION, 'Confirm censustract', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, DRAGGABLE, WIDTH, 576, HEIGHT, 268, BGCOLOR, '#333399', CGCOLOR, '#333399', TEXTSIZE, 3 );
+
+ } else {
+
+ cf.submit();
+
+ }
+
+}
+
+function copyelement(from, to) {
+ if ( from == undefined ) {
+ to.value = '';
+ } else if ( from.type == 'select-one' ) {
+ to.value = from.options[from.selectedIndex].value;
+ //alert(from + " (" + from.type + "): " + to.name + " => (" + from.selectedIndex + ") " + to.value);
+ } else if ( from.type == 'checkbox' ) {
+ if ( from.checked ) {
+ to.value = from.value;
+ } else {
+ to.value = '';
+ }
+ } else {
+ if ( from.value == undefined ) {
+ to.value = '';
+ } else {
+ to.value = from.value;
+ }
+ }
+ //alert(from + " (" + from.type + "): " + to.name + " => " + to.value);
+}
+
+<%init>
+
+my $conf = new FS::Conf;
+
+</%init>
diff --git a/httemplate/edit/cust_main/choose_tax_location.html b/httemplate/edit/cust_main/choose_tax_location.html
new file mode 100644
index 000000000..ac475c54b
--- /dev/null
+++ b/httemplate/edit/cust_main/choose_tax_location.html
@@ -0,0 +1,87 @@
+<FORM NAME="choosegeocodeform">
+<CENTER><BR><B>Choose tax location</B><BR><BR>
+<P>the geocode is:<% $header %></P>
+<P STYLE="<% $style %>"><% $header %></P>
+
+<SELECT NAME='geocodes' ID='geocodes' STYLE="<% $style %>">
+% foreach my $location (@cust_tax_location) {
+% my %value = ( zip => $zip5,
+% map { $_ => $location->$_ }
+% qw ( city state geocode )
+% );
+% map { $value{$_} = $location{$_} } qw ( city state )
+% if $location{country} eq 'CA';
+%
+% my $value = encode_entities(objToJson({ %value })
+% );
+% my $content = '';
+% $content .= $location->$_. '&nbsp;' x ( $max{$_} - length($location->$_) )
+% foreach qw( city county state );
+% $content .= $location->cityflag eq 'I' ? 'Y' : 'N' ;
+% my $selected = '' ;
+% if ($geocode && $location->geocode eq $geocode) {
+% $selected = 'SELECTED';
+% }
+ <OPTION VALUE="<% $value %>" STYLE="<% $style %>" <% $selected %>><% $content %>
+% }
+</SELECT><BR><BR>
+
+<TABLE><TR>
+ <TD> <BUTTON TYPE="button" onClick="set_geocode(document.getElementById('geocodes'));"><IMG SRC="<%$p%>images/tick.png" ALT=""> Set location </BUTTON></TD>
+ <TD><BUTTON TYPE="button" onClick="document.CustomerForm.submitButton.disabled=false; parent.cClick();"><IMG SRC="<%$p%>images/cross.png" ALT=""> Cancel submission </BUTTON></TD>
+</TR>
+</TABLE>
+
+</CENTER>
+</FORM>
+<%init>
+
+my $conf = new FS::Conf;
+
+my %location = ();
+
+($location{data_vendor}) = $cgi->param('data_vendor') =~ /^([-\w]+)$/;
+($location{city}) = $cgi->param('city') =~ /^([\w ]+)$/;
+($location{state}) = $cgi->param('state') =~ /^(\w+)$/;
+($location{zip}) = $cgi->param('zip') =~ /^([-\w ]+)$/;
+($location{country}) = $cgi->param('country') =~ /^([\w ]+)$/;
+
+my($geocode) = $cgi->param('geocode') =~ /^([\w]+)$/;
+
+my($zip5, $zip4) = split('-', $location{zip});
+
+#only support US & CA
+my $hashref = { 'data_vendor' => $location{data_vendor} };
+$hashref->{zip} = $location{country} eq 'CA' ? substr($zip5,0,1) : $zip5,
+
+my @keys = keys(%$hashref);
+my @cust_tax_location = ();
+until ( @cust_tax_location ) {
+ @cust_tax_location = qsearch({ table => 'cust_tax_location',
+ hashref => $hashref,
+ order_by => 'LIMIT 50',
+ });
+ last unless scalar(@keys);
+ delete $hashref->{ shift @keys };
+}
+
+my %max = ( city => 4, county => 6, state => 5);
+foreach my $location (@cust_tax_location) {
+ foreach ( qw( city county state ) ) {
+ my $length = length($location->$_);
+ $max{$_} = ($length > $max{$_}) ? $length : $max{$_};
+ }
+}
+foreach ( qw( city county state ) ) {
+ $max{$_} = $location{$_} if $location{$_} > $max{$_};
+ $max{$_}++;
+}
+
+my $header = '&nbsp;&nbsp;';
+$header .= $_. '&nbsp;' x ( $max{lc($_)} - length($_) )
+ foreach qw( City County State );
+$header .= "In city?";
+
+my $style = "font-family:monospace;";
+
+</%init>
diff --git a/httemplate/edit/cust_main/contact.html b/httemplate/edit/cust_main/contact.html
new file mode 100644
index 000000000..3dd24aae5
--- /dev/null
+++ b/httemplate/edit/cust_main/contact.html
@@ -0,0 +1,194 @@
+<% &ntable("#cccccc") %>
+
+<TR>
+ <TH ALIGN="right"><%$r%><% mt('Contact name (last, first)') |h %></TH>
+ <TD COLSPAN=7>
+ <INPUT TYPE="text" NAME="<%$pre%>last" VALUE="<% $cust_main->get($pre.'last') |h %>" onChange="<% $onchange %>" <%$disabled%> <%$style%>> ,
+ <INPUT TYPE="text" NAME="<%$pre%>first" VALUE="<% $cust_main->get($pre.'first') |h %>" onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+% if ( $conf->exists('show_ss') && !$pre ) {
+
+ <TD ALIGN="right"><% mt('SS#') |h %></TD>
+ <TD><INPUT TYPE="text" NAME="ss" VALUE="<% $opt{ss} %>" SIZE=11></TD>
+% } elsif ( !$pre ) {
+
+ <TD><INPUT TYPE="hidden" NAME="ss" VALUE="<% $opt{ss} %>"></TD>
+% }
+
+
+</TR>
+
+% if ( $conf->exists('cust-email-high-visibility') && !$pre ) {
+ <TR>
+ <TD ALIGN="right" WIDTH="200">
+ <% $conf->exists('cust_main-require_invoicing_list_email') ? $r : '' %>Email address(es)
+ </TD>
+ <TD bgcolor="#FFFF00">
+ <INPUT TYPE="text" NAME="invoicing_list" VALUE="<% join(', ', grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list ) %>">
+ </TD>
+ </TR>
+% }
+
+% unless ( $conf->exists('cust-edit-alt-field-order') ) {
+<TR>
+ <TD ALIGN="right"><% mt('Company') |h %></TD>
+ <TD COLSPAN=7>
+ <INPUT TYPE="text" NAME="<%$pre%>company" VALUE="<% $cust_main->get($pre.'company') |h %>" SIZE=70 onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+</TR>
+
+<& /elements/location.html,
+ 'prefix' => $pre,
+ 'object' => $cust_main,
+ 'onchange' => $onchange,
+ 'disabled' => $disabled,
+ 'style' => \@style,
+ 'same_checked' => $opt{'same_checked'},
+ 'geocode' => $opt{'geocode'},
+ 'censustract' => $opt{'censustract'},
+&>
+
+<TR>
+ <TD ALIGN="right"><% $daytime_label %></TD>
+ <TD COLSPAN=5>
+ <INPUT TYPE="text" NAME="<%$pre%>daytime" VALUE="<% $cust_main->get($pre.'daytime') %>" SIZE=18 onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+</TR>
+
+<TR>
+ <TD ALIGN="right"><% $night_label %></TD>
+ <TD COLSPAN=5>
+ <INPUT TYPE="text" NAME="<%$pre%>night" VALUE="<% $cust_main->get($pre.'night') %>" SIZE=18 onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+</TR>
+
+<TR>
+ <TD ALIGN="right"><% mt('Fax') |h %></TD>
+ <TD COLSPAN=5>
+ <INPUT TYPE="text" NAME="<%$pre%>fax" VALUE="<% $cust_main->get($pre.'fax') %>" SIZE=12 onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+</TR>
+
+% } else {
+
+<TR>
+ <TD ALIGN="right"><% $daytime_label %></TD>
+ <TD COLSPAN=5>
+ <INPUT TYPE="text" NAME="<%$pre%>daytime" VALUE="<% $cust_main->get($pre.'daytime') %>" SIZE=18 onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+</TR>
+
+<TR>
+ <TD ALIGN="right"><% $night_label %></TD>
+ <TD COLSPAN=5>
+ <INPUT TYPE="text" NAME="<%$pre%>night" VALUE="<% $cust_main->get($pre.'night') %>" SIZE=18 onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+</TR>
+
+<& /elements/location.html,
+ 'prefix' => $pre,
+ 'object' => $cust_main,
+ 'onchange' => $onchange,
+ 'disabled' => $disabled,
+ 'style' => \@style,
+ 'same_checked' => $opt{'same_checked'},
+ 'geocode' => $opt{'geocode'},
+ 'censustract' => $opt{'censustract'},
+&>
+
+<TR>
+ <TD ALIGN="right"><% mt('Fax') |h %></TD>
+ <TD COLSPAN=5>
+ <INPUT TYPE="text" NAME="<%$pre%>fax" VALUE="<% $cust_main->get($pre.'fax') %>" SIZE=12 onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+</TR>
+
+<TR>
+ <TD ALIGN="right"><% mt('Company') |h %></TD>
+ <TD COLSPAN=7>
+ <INPUT TYPE="text" NAME="<%$pre%>company" VALUE="<% $cust_main->get($pre.'company') |h %>" SIZE=70 onChange="<% $onchange %>" <%$disabled%> <%$style%>>
+ </TD>
+</TR>
+
+% }
+
+% if ( $conf->exists('show_stateid') && !$pre ) {
+
+<TR>
+ <TD ALIGN="right"><% $stateid_label %></TD>
+ <TD><INPUT TYPE="text" NAME="stateid" VALUE="<% $opt{stateid} %>" SIZE=12 onChange="<% $onchange %>" <%$disabled%> <%$style%>></TD>
+ <TD ALIGN="right"><% $stateid_state_label %></TD>
+ <TD><& /elements/select-state.html,
+ 'state' => $cust_main->stateid_state,
+ 'country' => $cust_main->country,
+ 'prefix' => 'stateid_',
+ 'onchange' => $onchange,
+ 'disabled' => $disabled,
+ 'style' => \@style,
+ &>
+ </TD>
+</TR>
+% } elsif ( !$pre ) {
+
+ <TD><INPUT TYPE="hidden" NAME="stateid" VALUE="<% $opt{stateid} %>"></TD>
+ <TD><INPUT TYPE="hidden" NAME="stateid_state" VALUE="<% $cust_main->stateid_state %>"></TD>
+% }
+
+</TABLE>
+<%$r%><% mt('required fields') |h %><BR>
+
+<%init>
+
+my %opt = @_;
+my $cust_main = $opt{'cust_main'};
+my $pre = $opt{'pre'};
+my $onchange = $opt{'onchange'};
+my $disabled = $opt{'disabled'};
+my @style = ( $opt{'style'} ? @{ $opt{'style'} } : () );
+
+my $style = scalar(@style) ? 'STYLE="'. join(';', @style). '"' : '';
+
+my $conf = new FS::Conf;
+
+foreach (qw(ss stateid)) {
+ $opt{$_} = $cust_main->masked($_) unless exists $opt{$_};
+}
+
+#false laziness with ship state
+my $countrydefault = $conf->config('countrydefault') || 'US';
+$cust_main->set($pre.'country', $countrydefault )
+ unless $cust_main->get($pre.'country');
+
+my $statedefault = $conf->config('statedefault')
+ || ($countrydefault eq 'US' ? 'CA' : '');
+$cust_main->set($pre.'state', $statedefault )
+ unless $cust_main->get($pre.'state')
+ || $cust_main->get($pre.'country') ne $countrydefault;
+
+$cust_main->set('stateid_state', $cust_main->state )
+ unless $pre || $cust_main->get('stateid_state');
+
+$opt{geocode} ||= $cust_main->get('geocode');
+
+if ( $conf->exists('cust_main-require_censustract') ) {
+ $opt{censustract} ||= $cust_main->censustract;
+}
+
+my $daytime_label = FS::Msgcat::_gettext('daytime') =~ /^(daytime)?$/
+ ? 'Day Phone'
+ : FS::Msgcat::_gettext('daytime');
+my $night_label = FS::Msgcat::_gettext('night') =~/^(night)?$/
+ ? 'Night Phone'
+ : FS::Msgcat::_gettext('night') || 'Night Phone';
+my $stateid_label = FS::Msgcat::_gettext('stateid') =~ /^(stateid)?$/
+ ? 'Driver&rsquo;s License'
+ : FS::Msgcat::_gettext('stateid') || 'Driver&rsquo;s License';
+my $stateid_state_label = FS::Msgcat::_gettext('stateid_state') =~ /^(stateid_state)?$/
+ ? 'Driver&rsquo;s License State'
+ : FS::Msgcat::_gettext('stateid_state') || 'Driver&rsquo;s License State';
+
+my $r = qq!<font color="#ff0000">*</font>&nbsp;!;
+
+my @invoicing_list = $cust_main->invoicing_list;
+
+</%init>
diff --git a/httemplate/edit/cust_main/first_pkg.html b/httemplate/edit/cust_main/first_pkg.html
new file mode 100644
index 000000000..2e9f36f99
--- /dev/null
+++ b/httemplate/edit/cust_main/first_pkg.html
@@ -0,0 +1,84 @@
+% if ( $cgi->param('lock_pkgpart') =~ /^([\d, ]+)$/ ) {
+
+ <INPUT TYPE="hidden" NAME="lock_pkgpart" VALUE="<% $1 %>">
+
+% }
+%
+% if ( @part_pkg ) {
+
+ <BR><BR>
+ <FONT SIZE="+1"><B><% mt('First package') |h %></B></FONT>
+ <% ntable("#cccccc") %>
+
+ <TR>
+ <TD COLSPAN=2>
+ <& first_pkg/select-part_pkg.html,
+ 'part_pkg' => \@part_pkg,
+ 'first_svc' => \@first_svc,
+ %opt,
+ &>
+
+% }
+<%init>
+
+my( $cust_main, %opt ) = @_;
+
+# pry the wrong place for this logic. also pretty expensive
+
+#false laziness, copied from FS::cust_pkg::order
+my $pkgpart;
+my $agentnum = '';
+my @agents = $FS::CurrentUser::CurrentUser->agents;
+if ( scalar(@agents) == 1 ) {
+ # $pkgpart->{PKGPART} is true iff $custnum may purchase PKGPART
+ $pkgpart = $agents[0]->pkgpart_hashref;
+ $agentnum = $agents[0]->agentnum;
+} elsif ( $cgi->param('lock_agentnum') =~ /^(\d+)$/
+ && $FS::CurrentUser::CurrentUser->agentnum($1) ) {
+ $agentnum = $1;
+ my $agent = (grep { $_->agentnum == $agentnum } @agents)[0];
+ $pkgpart = $agent->pkgpart_hashref;
+} else {
+ #can't know (agent not chosen), so, allow all
+ $agentnum = 'all';
+ my %typenum;
+ foreach my $agent ( @agents ) {
+ next if $typenum{$agent->typenum}++;
+ $pkgpart->{$_}++ foreach keys %{ $agent->pkgpart_hashref }
+ }
+}
+#eslaf
+
+my @part_pkg = ();
+if ( $cgi->param('lock_pkgpart') =~ /^([\d, ]+)$/ ) {
+
+ my $lock_pkgpart = $1;
+
+ @part_pkg = qsearch({
+ 'table' => 'part_pkg',
+ 'hashref' => { 'disabled' => '' },
+ 'extra_sql' => "AND pkgpart IN ($lock_pkgpart)",
+ 'order_by' => 'ORDER BY pkg', # case?
+ });
+
+} else {
+
+ @part_pkg =
+ qsearch( 'part_pkg', { 'disabled' => '' }, '', 'ORDER BY pkg' ); # case?
+
+}
+
+my @first_svc = ( 'svc_acct', 'svc_phone', 'svc_dsl' );
+
+@part_pkg =
+ grep { $_->svcpart(\@first_svc)
+ && ( $pkgpart->{ $_->pkgpart }
+ || $agentnum eq 'all'
+ || ( $agentnum ne 'all' && $agentnum && $_->agentnum
+ && $_->agentnum == $agentnum
+ )
+ )
+ }
+ @part_pkg;
+
+</%init>
diff --git a/httemplate/edit/cust_main/first_pkg/select-part_pkg.html b/httemplate/edit/cust_main/first_pkg/select-part_pkg.html
new file mode 100644
index 000000000..aa3e805a2
--- /dev/null
+++ b/httemplate/edit/cust_main/first_pkg/select-part_pkg.html
@@ -0,0 +1,162 @@
+<& /elements/xmlhttp.html,
+ 'url' => $url_prefix.'misc/svc_acct-domains.cgi',
+ 'subs' => [ $opt{'prefix'}. 'get_domains' ],
+&>
+
+<& /elements/xmlhttp.html,
+ 'url' => $url_prefix.'misc/part_svc-columns.cgi',
+ 'subs' => [ $opt{'prefix'}. 'get_part_svc' ],
+&>
+
+<INPUT TYPE="hidden" NAME="svcdb" VALUE="">
+
+<SCRIPT TYPE="text/javascript">
+
+ function selopt(what,value,text,selected) {
+ var optionName = new Option(text, value, false, selected);
+ var length = what.length;
+ what.options[length] = optionName;
+ }
+
+ var pkgpart_svcpart2svcdb = {
+% foreach my $pkgpart ( map $_->pkgpart, @part_pkg ) {
+ "<% $pkgpart_svcpart{$pkgpart} %>":"<% $svcdb{$pkgpart} %>",
+% }
+ '':''
+ };
+
+ function <% $opt{'prefix'} %>pkgpart_svcpart_changed_too(what,selected) {
+
+ <% $opt{'onchange'} %>;
+
+ pkgpart_svcpart = what.options[what.selectedIndex].value;
+
+ var svcdb = pkgpart_svcpart2svcdb[pkgpart_svcpart];
+
+ what.form.svcdb.value = svcdb;
+
+ if ( svcdb == 'svc_acct' ) {
+
+ // go get the new domains
+ function <% $opt{'prefix'} %>update_domains(domains) {
+
+ // blank the current domain list
+ for ( var i = what.form.<% $opt{'prefix'} %>domsvc.length; i >= 0; i-- )
+ what.form.<% $opt{'prefix'} %>domsvc.options[i] = null;
+
+ // add the new domains
+ var domainArray = eval('(' + domains + ')' );
+ for ( var s = 0; s < domainArray.length; s=s+2 ) {
+ var domainLabel = domainArray[s+1];
+ if ( domainLabel == "" )
+ domainLabel = '(n/a)';
+ selopt( what.form.<% $opt{'prefix'} %>domsvc,
+ domainArray[s],
+ domainLabel,
+ (domainArray[s] == selected) ? true : false
+ );
+ }
+
+ }
+
+ <% $opt{'prefix'} %>get_domains( pkgpart_svcpart,
+ <% $opt{'prefix'} %>update_domains
+ );
+
+ } else if ( svcdb == 'svc_phone' ) {
+
+ function <% $opt{'prefix'} %>update_svc_phone(part_svc_column) {
+ var colArray = eval('(' + part_svc_column + ')' );
+ for ( var s = 0; s < colArray.length; s=s+3 ) {
+ var name = colArray[s];
+ var flag = colArray[s+1];
+ var value = colArray[s+2];
+ var td_label = document.getElementById(name+'_label_td');
+ var td = document.getElementById(name+'_td');
+ var input = document.getElementById(name);
+ if ( flag == 'D' ) {
+ if ( ! input.value ) { input.value = value; }
+ td_label.style.display = ''
+ td.style.display = ''
+ } else if ( flag == 'F' ) {
+ input.value = value;
+ td_label.style.display = 'none'
+ td.style.display = 'none'
+ } else {
+ td_label.style.display = ''
+ td.style.display = ''
+ }
+ }
+ }
+
+ <% $opt{'prefix'} %>get_part_svc( pkgpart_svcpart,
+ <% $opt{'prefix'} %>update_svc_phone
+ );
+
+ }
+
+ }
+
+</SCRIPT>
+
+<& /elements/selectlayers.html,
+ 'field' => $opt{'prefix'}. 'pkgpart_svcpart',
+ 'curr_value' => $opt{pkgpart_svcpart},
+ 'options' => \@options,
+ 'labels' => \%labels,
+ 'html_between' => '</TD></TR></TABLE>',
+ 'onchange' => $opt{'prefix'}. 'pkgpart_svcpart_changed_too(what,0)',
+ 'layer_callback' => $layer_callback,
+ 'layermap' => \%layermap,
+&>
+
+<SCRIPT TYPE="text/javascript">
+ pkgpart_svcpart_changed_too( document.CustomerForm.pkgpart_svcpart,
+ <% $opt{saved_domsvc} %>
+ );
+</SCRIPT>
+
+<%init>
+
+my %opt = @_;
+
+foreach my $opt (qw( svc_part pkgparts saved_pkgpart saved_domsvc prefix)) {
+ $opt{$_} = '' unless exists($opt{$_}) && defined($opt{$_});
+}
+$opt{saved_domsvc} = 0 unless $opt{saved_domsvc};
+
+my $url_prefix = $opt{'relurls'} ? '' : $p;
+
+my @part_pkg = @{ $opt{'part_pkg'} };
+my @first_svc = @{ $opt{'first_svc'} };
+
+my %pkgpart_svcpart = ();
+my %svcdb = ();
+my %layermap = ();
+foreach my $part_pkg ( @part_pkg ) {
+ my $pkgpart = $part_pkg->pkgpart;
+ my $pkgpart_svcpart = $pkgpart. "_". $part_pkg->svcpart(\@first_svc);
+ $pkgpart_svcpart{$pkgpart} = $pkgpart_svcpart;
+ $svcdb{$pkgpart} = $part_pkg->part_svc(\@first_svc)->svcdb;
+ $layermap{$pkgpart_svcpart} = $svcdb{$pkgpart};
+}
+
+my @options = ();
+push @options, '' unless $opt{'disable_empty'};
+push @options, map $pkgpart_svcpart{ $_->pkgpart }, @part_pkg;
+my %labels = ( '' => ( $opt{'empty_label'} || '(none)' ),
+ map { $pkgpart_svcpart{ $_->pkgpart } => $_->pkg_comment }
+ @part_pkg
+ );
+
+my $layer_callback = sub {
+ my $layer = shift;
+ my $svcdb = $layer;
+
+ return '' unless $svcdb;
+
+ #full path cause we're being slung around as a coderef (mason closures?)
+ include("/edit/cust_main/first_pkg/$svcdb.html", %opt, );
+};
+
+</%init>
diff --git a/httemplate/edit/cust_main/first_pkg/svc_acct.html b/httemplate/edit/cust_main/first_pkg/svc_acct.html
new file mode 100644
index 000000000..b1ccc137c
--- /dev/null
+++ b/httemplate/edit/cust_main/first_pkg/svc_acct.html
@@ -0,0 +1,84 @@
+<% ntable("#cccccc") %>
+
+ <TR>
+ <TD ALIGN="right"><% mt('Username') |h %></TD>
+ <TD>
+ <INPUT TYPE = "text"
+ NAME = "username"
+ VALUE = "<% $opt{'username'} %>"
+ SIZE = <% $ulen2 %>
+ MAXLENGTH = <% $ulen %>
+ >
+ </TD>
+ </TR>
+
+ <TR>
+ <TD ALIGN="right"><% mt('Domain') |h %></TD>
+ <TD>
+ <SELECT NAME="domsvc">
+ <OPTION>(<% mt('none') |h %>)</OPTION>
+ </SELECT>
+ </TD>
+ </TR>
+
+ <TR>
+ <TD ALIGN="right"><% mt('Password') |h %></TD>
+ <TD>
+ <INPUT TYPE = "text"
+ NAME = "_password"
+ VALUE = "<% $opt{'password'} %>"
+ SIZE = <% $pmax2 %>
+ MAXLENGTH = <% $passwordmax %>>
+% unless ( $opt{'password_verify'} ) {
+ (blank to generate)
+% }
+ </TD>
+ </TR>
+
+% if ( $opt{'password_verify'} ) {
+ <TR>
+ <TD ALIGN="right"><% mt('Re-enter Password') |h %></TD>
+ <TD>
+ <INPUT TYPE = "text"
+ NAME = "_password2"
+ VALUE = "<% $opt{'password2'} %>"
+ SIZE = <% $pmax2 %>
+ MAXLENGTH = <% $passwordmax %>>
+ </TD>
+ </TR>
+% }
+
+% if ( $conf->exists('security_phrase') ) {
+ <TR>
+ <TD ALIGN="right"><% mt('Security Phrase') |h %></TD>
+ <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="<% $opt{'sec_phrase'} %>">
+ </TD>
+ </TR>
+% } else {
+ <INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">
+% }
+
+% if ( $conf->exists('svc_acct-disable_access_number') ) {
+ <INPUT TYPE="hidden" NAME="popnum" VALUE="">
+% } else {
+ <TR>
+ <TD ALIGN="right"><% mt('Access number') |h %></TD>
+%# XXX should gain "area code" selection and labels on the dropdowns
+ <TD><% FS::svc_acct_pop::popselector($opt{'popnum'}) %></TD>
+ </TR>
+% }
+
+</TABLE>
+
+<%init>
+
+my( %opt ) = @_;
+
+my $conf = new FS::Conf;
+
+my $ulen = dbdef->table('svc_acct')->column('username')->length;
+my $ulen2 = $ulen+2;
+my $passwordmax = $conf->config('passwordmax') || 8;
+my $pmax2 = $passwordmax + 2;
+
+</%init>
diff --git a/httemplate/edit/cust_main/first_pkg/svc_dsl.html b/httemplate/edit/cust_main/first_pkg/svc_dsl.html
new file mode 100644
index 000000000..971f4be33
--- /dev/null
+++ b/httemplate/edit/cust_main/first_pkg/svc_dsl.html
@@ -0,0 +1,75 @@
+<% ntable("#cccccc") %>
+
+% if ( $opt{'phonenum'} ) {
+
+ <INPUT TYPE="hidden" NAME="loop_type" VALUE="">
+ <INPUT TYPE="hidden" NAME="phonenum" VALUE="<% $opt{'phonenum'} %>">
+
+ <TR>
+ <TD ALIGN="right">Loop Type</TD>
+ <TD BGCOLOR="#eeeeee">Line-share</TD>
+ </TR>
+
+ <TR>
+ <TD ALIGN="right">Phone Number</TD>
+ <TD BGCOLOR="#eeeeee"><% $opt{'phonenum'} %></TD>
+ </TR>
+
+% } else {
+
+ <INPUT TYPE="hidden" NAME="loop_type" VALUE="0">
+ <INPUT TYPE="hidden" NAME="phonenum" VALUE="">
+
+ <TR>
+ <TD ALIGN="right">Loop Type</TD>
+ <TD BGCOLOR="#eeeeee">Standalone</TD>
+ </TR>
+
+% }
+
+<TR>
+ <TD ALIGN="right">PPPoE password</TD>
+ <TD>
+ <INPUT TYPE = "text"
+ NAME = "password"
+ VALUE = "<% $opt{'password'} %>"
+ >
+ </TD>
+</TR>
+
+<TR>
+ <TD ALIGN="right">ISP Changing?</TD>
+ <TD>
+ <INPUT TYPE = "checkbox"
+ NAME = "isp_chg"
+ VALUE = "Y"
+ <% $opt{'isp_chg'} eq 'Y' ? 'CHECKED' : '' %>
+ >
+ </TD>
+</TR>
+
+<TR>
+ <TD ALIGN="right">Current or Previous ISP</TD>
+ <TD>
+ <INPUT TYPE = "text"
+ NAME = "isp_prev"
+ VALUE = "<% $opt{'isp_prev'} %>"
+ >
+ </TD>
+</TR>
+
+<INPUT TYPE="hidden" NAME="vendor_qual_id" VALUE="<% $opt{'vendor_qual_id'} %>">
+<TR>
+ <TD ALIGN="right">Vendor Qualification ID</TD>
+ <TD BGCOLOR="#eeeeee"><% $opt{'vendor_qual_id'} %></TD>
+</TR>
+
+</TABLE>
+
+<%init>
+
+my %opt = @_;
+
+#my $conf = new FS::Conf;
+
+</%init>
diff --git a/httemplate/edit/cust_main/first_pkg/svc_phone.html b/httemplate/edit/cust_main/first_pkg/svc_phone.html
new file mode 100644
index 000000000..70e013ece
--- /dev/null
+++ b/httemplate/edit/cust_main/first_pkg/svc_phone.html
@@ -0,0 +1,82 @@
+<% ntable("#cccccc") %>
+
+%#XXX this should be hidden or something in most/all cases
+ <TR>
+ <TD ALIGN="right" ID="countrycode_label_td">Country code</TD>
+ <TD ID="countrycode_td">
+ <INPUT TYPE = "text"
+ NAME = "countrycode"
+ ID = "countrycode"
+ VALUE = "<% $opt{'countrycode'} %>"
+ SIZE = 4
+ MAXLENGTH = 3
+ >
+ </TD>
+ </TR>
+
+%#we don't know the svcpart until the dropdown is changed :/
+%#<% include('/elements/tr-select-did.html',
+%# 'label' => 'Phone number',
+%# 'curr_value' => $opt{'phonenum'},
+%# )
+%#%>
+ <TR>
+ <TD ALIGN="right" ID="phonenum_label_td">Phone Number</TD>
+ <TD ID="phonenum_td">
+ <INPUT TYPE = "text"
+ NAME = "phonenum"
+ ID = "phonenum"
+ VALUE = "<% $opt{'phonenum'} %>"
+ SIZE = 21
+ MAXLENGTH = 20
+ >
+ </TD>
+ </TR>
+
+ <TR>
+ <TD ALIGN="right" ID="sip_password_label_td">SIP password</TD>
+ <TD ID="sip_password_td">
+ <INPUT TYPE = "text"
+ NAME = "sip_password"
+ ID = "sip_password"
+ VALUE = "<% $opt{'sip_password'} %>"
+ MAXLENGTH = 80
+ >
+ </TD>
+ </TR>
+
+ <TR>
+ <TD ALIGN="right" ID="pin_label_td">Voicemail PIN</TD>
+ <TD ID="pin_td">
+ <INPUT TYPE = "text"
+ NAME = "pin"
+ ID = "pin"
+ VALUE = "<% $opt{'pin'} %>"
+ SIZE = 5
+ MAXLENGTH = 4
+ >
+ </TD>
+ </TR>
+
+%#XXX this should be hidden or something in most/all cases
+ <TR>
+ <TD ALIGN="right" ID="phone_name_label_td">Name</TD>
+ <TD ID="phone_name_td">
+ <INPUT TYPE = "text"
+ NAME = "phone_name"
+ ID = "phone_name"
+ VALUE = "<% $opt{'phone_name'} %>"
+ MAXLENGTH = 80
+ >
+ </TD>
+ </TR>
+
+</TABLE>
+
+<%init>
+
+my( %opt ) = @_;
+
+#my $conf = new FS::Conf;
+
+</%init>
diff --git a/httemplate/edit/cust_main/top_misc.html b/httemplate/edit/cust_main/top_misc.html
new file mode 100644
index 000000000..a7545a045
--- /dev/null
+++ b/httemplate/edit/cust_main/top_misc.html
@@ -0,0 +1,135 @@
+<% &ntable("#cccccc") %>
+
+%# tags
+<& /elements/tr-select-cust_tag.html,
+ 'custnum' => $custnum,
+ 'cgi' => $cgi,
+&>
+
+%# agent
+% if ( $cgi->param('lock_agentnum') =~ /^(\d+)$/ && $curuser->agentnum($1) ) {
+%
+% my $agentnum = $1;
+% $cust_main->agentnum($agentnum);
+
+ <INPUT TYPE="hidden" NAME="lock_agentnum" VALUE="<% $agentnum %>">
+ <INPUT TYPE="hidden" NAME="agentnum" VALUE="<% $agentnum %>">
+ <TR>
+ <TD ALIGN="right"><% mt('Agent') |h %></TD>
+ <TD CLASS="fsdisabled"><% $cust_main->agent->agent |h %></TD>
+ </TR>
+
+% } else {
+
+ <& /elements/tr-select-agent.html,
+ 'curr_value' => $cust_main->agentnum,
+ 'label' => "<B>${r}".emt('Agent')."</B>",
+ 'empty_label' => emt('Select agent'),
+ 'disable_empty' => ( $cust_main->agentnum ? 1 : 0 ),
+ 'viewall_right' => emt('None'),
+ &>
+
+% }
+
+%# agent_custid
+% if ( $conf->exists('cust_main-edit_agent_custid') ) {
+
+ <TR>
+ <TD ALIGN="right"><% mt('Customer identifier') |h %></TD>
+ <TD><INPUT TYPE="text" NAME="agent_custid" VALUE="<% $cust_main->agent_custid %>"></TD>
+ </TR>
+
+% } else {
+
+ <INPUT TYPE="hidden" NAME="agent_custid" VALUE="<% $cust_main->agent_custid %>">
+
+% }
+
+%# class
+<& /elements/tr-select-cust_class.html,
+ 'curr_value' => $cust_main->classnum,
+ 'label' => emt("Class"),
+&>
+
+%# referral (advertising source)
+%my $refnum = $cust_main->refnum || $conf->config('referraldefault') || 0;
+%if ( $custnum && ! $conf->exists('editreferrals') ) {
+
+ <INPUT TYPE="hidden" NAME="refnum" VALUE="<% $refnum %>">
+
+% } else {
+
+ <& /elements/tr-select-part_referral.html,
+ 'curr_value' => $refnum
+ &>
+% }
+
+
+%# referring customer
+%my $referring_cust_main = '';
+%if ( $cust_main->referral_custnum
+% and $referring_cust_main =
+% qsearchs('cust_main', { custnum => $cust_main->referral_custnum } )
+% and ! $curuser->access_right('Edit referring customer')
+%) {
+
+ <TR>
+ <TD ALIGN="right"><% mt('Referring customer') |h %></TD>
+ <TD>
+ <A HREF="<% popurl(1) %>/cust_main.cgi?<% $cust_main->referral_custnum %>"><% $cust_main->referral_custnum %>: <% $referring_cust_main->name %></A>
+ </TD>
+ </TR>
+ <INPUT TYPE="hidden" NAME="referral_custnum" VALUE="<% $cust_main->referral_custnum %>">
+
+% } elsif ( ! $conf->exists('disable_customer_referrals') ) {
+
+ <TR>
+ <TD ALIGN="right"><% mt('Referring customer') |h %></TD>
+ <TD>
+ <& /elements/search-cust_main.html,
+ 'field_name' => 'referral_custnum',
+ 'curr_value' => $cust_main->referral_custnum,
+ &>
+ </TD>
+ </TR>
+
+% } else {
+ <INPUT TYPE="hidden" NAME="referral_custnum" VALUE="">
+% }
+
+%# signup date
+% if ( $conf->exists('cust_main-edit_signupdate') ) {
+ <& /elements/tr-input-date-field.html, {
+ 'name' => 'signupdate',
+ 'value' => $cust_main->signupdate,
+ 'label' => emt('Signup date'),
+ 'format' => ( $conf->config('date_format') || "%m/%d/%Y" ),
+ }
+ &>
+% }
+
+% # permission to edit ticket subjects
+% if ( $conf->exists('ticket_system-selfservice_edit_subject') ) {
+ <TR>
+ <TD ALIGN="right">
+ <INPUT TYPE="checkbox" NAME="edit_subject" VALUE="Y" <%
+ $cust_main->edit_subject ? 'CHECKED' : '' %>></TD>
+ <TD ALIGN="left"><% mt('Can edit ticket subjects') |h %></TD>
+ </TR>
+% }
+
+</TABLE>
+
+<%init>
+
+my( $cust_main, %opt ) = @_;
+
+my $custnum = $opt{'custnum'};
+
+my $conf = new FS::Conf;
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+my $r = qq!<font color="#ff0000">*</font>&nbsp;!;
+
+</%init>