diff options
Diffstat (limited to 'httemplate/edit')
-rwxr-xr-x | httemplate/edit/REAL_cust_pkg.cgi | 58 | ||||
-rwxr-xr-x | httemplate/edit/agent.cgi | 65 | ||||
-rwxr-xr-x | httemplate/edit/cust_main.cgi | 58 | ||||
-rwxr-xr-x | httemplate/edit/cust_main_county.cgi | 43 | ||||
-rwxr-xr-x | httemplate/edit/part_bill_event.cgi | 2 | ||||
-rw-r--r-- | httemplate/edit/part_export.cgi | 5 | ||||
-rwxr-xr-x | httemplate/edit/part_pkg.cgi | 147 | ||||
-rwxr-xr-x | httemplate/edit/part_svc.cgi | 13 | ||||
-rwxr-xr-x | httemplate/edit/process/cust_main.cgi | 8 | ||||
-rwxr-xr-x | httemplate/edit/process/cust_main_county-collapse.cgi | 4 | ||||
-rwxr-xr-x | httemplate/edit/process/cust_main_county.cgi | 6 | ||||
-rwxr-xr-x | httemplate/edit/process/part_pkg.cgi | 16 | ||||
-rw-r--r-- | httemplate/edit/process/router.cgi | 9 | ||||
-rwxr-xr-x | httemplate/edit/process/svc_external.cgi | 29 | ||||
-rwxr-xr-x | httemplate/edit/router.cgi | 13 | ||||
-rwxr-xr-x | httemplate/edit/svc_acct.cgi | 2 | ||||
-rw-r--r-- | httemplate/edit/svc_broadband.cgi | 2 | ||||
-rw-r--r-- | httemplate/edit/svc_external.cgi | 105 | ||||
-rwxr-xr-x | httemplate/edit/svc_forward.cgi | 104 | ||||
-rw-r--r-- | httemplate/edit/svc_www.cgi | 2 |
20 files changed, 540 insertions, 151 deletions
diff --git a/httemplate/edit/REAL_cust_pkg.cgi b/httemplate/edit/REAL_cust_pkg.cgi index e44acba3c..d9b7579f6 100755 --- a/httemplate/edit/REAL_cust_pkg.cgi +++ b/httemplate/edit/REAL_cust_pkg.cgi @@ -1,6 +1,6 @@ <!-- mason kludge --> <% -# <!-- $Id: REAL_cust_pkg.cgi,v 1.5 2003-04-01 01:22:24 ivan Exp $ --> +# <!-- $Id: REAL_cust_pkg.cgi,v 1.7 2003-11-19 12:21:09 ivan Exp $ --> my $error =''; my $pkgnum = ''; @@ -30,6 +30,15 @@ print header('Package Edit'); #, menubar( # 'Main Menu' => popurl(2) #)); +%> + + <LINK REL="stylesheet" TYPE="text/css" HREF="../elements/calendar-win2k-2.css" TITLE="win2k-2"> + <SCRIPT TYPE="text/javascript" SRC="../elements/calendar_stripped.js"></SCRIPT> + <SCRIPT TYPE="text/javascript" SRC="../elements/calendar-en.js"></SCRIPT> + <SCRIPT TYPE="text/javascript" SRC="../elements/calendar-setup.js"></SCRIPT> + +<% + #print info my($susp,$cancel,$expire)=( $cust_pkg->getfield('susp'), @@ -45,6 +54,9 @@ print '<FORM NAME="formname" ACTION="process/REAL_cust_pkg.cgi" METHOD="POST">', print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: $error</FONT>! if $error; +#my $format = "%c %z (%Z)"; +my $format = "%m/%d/%Y %T %z (%Z)"; + print ntable("#cccccc",2), '<TR><TD ALIGN="right">Package number</TD><TD BGCOLOR="#ffffff">', $pkgnum, '</TD></TR>', @@ -55,23 +67,29 @@ print ntable("#cccccc",2), '<TR><TD ALIGN="right">Order taker</TD><TD BGCOLOR="#ffffff">', $otaker, '</TD></TR>', '<TR><TD ALIGN="right">Setup date</TD><TD>'. - '<INPUT TYPE="text" NAME="setup" SIZE=32 VALUE="', - ( $setup ? time2str("%c %z (%Z)",$setup) : "" ), '"></TD></TR>'; + '<INPUT TYPE="text" NAME="setup" SIZE=32 ID="setup_text" VALUE="', + ( $setup ? time2str($format, $setup) : "" ), '">'. + ' <IMG SRC="../images/calendar.png" ID="setup_button" STYLE="cursor: pointer" TITLE="Select date">'. + '</TD></TR>'; print '<TR><TD ALIGN="right">Last bill date</TD><TD>', - '<INPUT TYPE="text" NAME="last_bill" SIZE=32 VALUE="', + '<INPUT TYPE="text" NAME="last_bill" SIZE=32 ID="last_bill_text" VALUE="', ( $cust_pkg->last_bill - ? time2str("%c %z (%Z)", $cust_pkg->last_bill) + ? time2str($format, $cust_pkg->last_bill) : "" ), - '"></TD></TR>' + '">'. + ' <IMG SRC="../images/calendar.png" ID="last_bill_button" STYLE="cursor: pointer" TITLE="Select date">'. + '</TD></TR>' if $cust_pkg->dbdef_table->column('last_bill'); print '<TR><TD ALIGN="right">Next bill date</TD><TD>', - '<INPUT TYPE="text" NAME="bill" SIZE=32 VALUE="', - ( $bill ? time2str("%c %z (%Z)",$bill) : "" ), '"></TD></TR>'; + '<INPUT TYPE="text" NAME="bill" SIZE=32 ID="bill_text" VALUE="', + ( $bill ? time2str($format, $bill) : "" ), '">'. + ' <IMG SRC="../images/calendar.png" ID="bill_button" STYLE="cursor: pointer" TITLE="Select date">'. + '</TD></TR>'; print '<TR><TD ALIGN="right">Suspension date</TD><TD BGCOLOR="#ffffff">', - time2str("%D",$susp), '</TD></TR>' + time2str($format, $susp), '</TD></TR>' if $susp; #print '<TR><TD ALIGN="right">Expiration date</TD><TD BGCOLOR="#ffffff">', @@ -79,18 +97,34 @@ print '<TR><TD ALIGN="right">Suspension date</TD><TD BGCOLOR="#ffffff">', # if $expire; print '<TR><TD ALIGN="right">Expiration date'. '</TD><TD>', - '<INPUT TYPE="text" NAME="expire" SIZE=32 VALUE="', - ( $expire ? time2str("%c %z (%Z)",$expire) : "" ), '">'. + '<INPUT TYPE="text" NAME="expire" SIZE=32 ID="expire_text" VALUE="', + ( $expire ? time2str($format, $expire) : "" ), '">'. + ' <IMG SRC="../images/calendar.png" ID="expire_button" STYLE="cursor: pointer" TITLE="Select date">'. '<BR><FONT SIZE=-1>(will <b>cancel</b> this package'. ' when the date is reached)</FONT>'. '</TD></TR>'; print '<TR><TD ALIGN="right">Cancellation date</TD><TD BGCOLOR="#ffffff">', - time2str("%D",$cancel), '</TD></TR>' + time2str($format, $cancel), '</TD></TR>' if $cancel; %> </TABLE> +<SCRIPT TYPE="text/javascript"> +<% + my @cal = qw( setup bill expire ); + push @cal, 'last_bill' + if $cust_pkg->dbdef_table->column('last_bill'); + foreach my $cal (@cal) { +%> + Calendar.setup({ + inputField: "<%= $cal %>_text", + ifFormat: "%m/%d/%Y", + button: "<%= $cal %>_button", + align: "BR" + }); +<% } %> +</SCRIPT> <BR><INPUT TYPE="submit" VALUE="Apply Changes"> </FORM> </BODY> diff --git a/httemplate/edit/agent.cgi b/httemplate/edit/agent.cgi index 449456cdd..8a1cb2ae1 100755 --- a/httemplate/edit/agent.cgi +++ b/httemplate/edit/agent.cgi @@ -16,59 +16,64 @@ if ( $cgi->param('error') ) { my $action = $agent->agentnum ? 'Edit' : 'Add'; my $hashref = $agent->hashref; -print header("$action Agent", menubar( +%> + +<%= header("$action Agent", menubar( 'Main Menu' => $p, 'View all agents' => $p. 'browse/agent.cgi', -)); +)) %> -print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $cgi->param('error'), - "</FONT>" - if $cgi->param('error'); +<% if ( $cgi->param('error') ) { %> +<FONT SIZE="+1" COLOR="#ff0000">Error: <%= $cgi->param('error') %></FONT> +<% } %> -print '<FORM ACTION="', popurl(1), 'process/agent.cgi" METHOD=POST>', - qq!<INPUT TYPE="hidden" NAME="agentnum" VALUE="$hashref->{agentnum}">!, - "Agent #", $hashref->{agentnum} ? $hashref->{agentnum} : "(NEW)"; +<FORM ACTION="<%=popurl(1)%>process/agent.cgi" METHOD=POST> +<INPUT TYPE="hidden" NAME="agentnum" VALUE="<%= $hashref->{agentnum} %>"> +Agent #<%= $hashref->{agentnum} ? $hashref->{agentnum} : "(NEW)" %> -print &ntable("#cccccc", 2, ''), <<END; +<%= &ntable("#cccccc", 2, '') %> <TR> <TH ALIGN="right">Agent</TH> - <TD><INPUT TYPE="text" NAME="agent" SIZE=32 VALUE="$hashref->{agent}"></TD> + <TD><INPUT TYPE="text" NAME="agent" SIZE=32 VALUE="<%= $hashref->{agent} %>"></TD> </TR> <TR> <TH ALIGN="right">Agent type</TH> <TD><SELECT NAME="typenum" SIZE=1> -END -foreach my $agent_type (qsearch('agent_type',{})) { - print "<OPTION VALUE=". $agent_type->typenum; - print " SELECTED" - if $hashref->{typenum} && ( $hashref->{typenum} == $agent_type->typenum ); - print ">", $agent_type->getfield('typenum'), ": ", - $agent_type->getfield('atype'),"\n"; -} +<% foreach my $agent_type (qsearch('agent_type',{})) { %> + <OPTION VALUE="<%= $agent_type->typenum %>"<%= ( $hashref->{typenum} && ( $hashref->{typenum} == $agent_type->typenum ) ) ? ' SELECTED' : '' %>> + <%= $agent_type->getfield('typenum') %>: <%= $agent_type->getfield('atype') %> +<% } %> -print <<END; </SELECT></TD> </TR> +<% if ( dbdef->table('agent')->column('disabled') ) { %> + <TR> + <TD ALIGN="right">Disable</TD> + <TD><INPUT TYPE="checkbox" NAME="disabled" VALUE="Y"<%= $hashref->{disabled} eq 'Y' ? ' CHECKED' : '' %>></TD> + </TR> +<% } %> <TR> <TD ALIGN="right"><!--Frequency--></TD> - <TD><INPUT TYPE="hidden" NAME="freq" VALUE="$hashref->{freq}"></TD> + <TD><INPUT TYPE="hidden" NAME="freq" VALUE="<%= $hashref->{freq} %>"></TD> </TR> <TR> <TD ALIGN="right"><!--Program--></TD> - <TD><INPUT TYPE="hidden" NAME="prog" VALUE="$hashref->{prog}"></TD> + <TD><INPUT TYPE="hidden" NAME="prog" VALUE="<%= $hashref->{prog} %>"></TD> </TR> +<% if ( dbdef->table('agent')->column('username') ) { %> + <TR> + <TD ALIGN="right">Agent interface username</TD> + <TD><INPUT TYPE="text" NAME="username" VALUE="<%= $hashref->{username} %>"></TD> + </TR> + <TR> + <TD ALIGN="right">Agent interface password</TD> + <TD><INPUT TYPE="text" NAME="_password" VALUE="<%= $hashref->{_password} %>"></TD> + </TR> +<% } %> </TABLE> -END -print qq!<BR><INPUT TYPE="submit" VALUE="!, - $hashref->{agentnum} ? "Apply changes" : "Add agent", - qq!">!; - -print <<END; +<BR><INPUT TYPE="submit" VALUE="<%= $hashref->{agentnum} ? "Apply changes" : "Add agent" %>"> </FORM> </BODY> </HTML> -END - -%> diff --git a/httemplate/edit/cust_main.cgi b/httemplate/edit/cust_main.cgi index eeceed889..857e769a3 100755 --- a/httemplate/edit/cust_main.cgi +++ b/httemplate/edit/cust_main.cgi @@ -39,6 +39,12 @@ if ( $cgi->param('error') ) { $query =~ /^(\d+)$/; $custnum=$1; $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } ); + if ( $cust_main->dbdef_table->column('paycvv') + && length($cust_main->paycvv) ) { + my $paycvv = $cust_main->paycvv; + $paycvv =~ s/./*/g; + $cust_main->paycvv($paycvv); + } $saved_pkgpart = 0; $username = ''; $password = ''; @@ -61,7 +67,7 @@ my $action = $custnum ? 'Edit' : 'Add'; # top my $p1 = popurl(1); -print header("Customer $action", ''); +print header("Customer $action", '', ' onUnload="myclose()"'); print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $error, "</FONT>" if $error; @@ -75,9 +81,11 @@ print qq!<FORM ACTION="${p1}process/cust_main.cgi" METHOD=POST NAME="form1">!, my $r = qq!<font color="#ff0000">*</font> !; -my @agents = qsearch( 'agent', {} ); +my %agent_search = dbdef->table('agent')->column('disabled') + ? ( 'disabled' => '' ) : (); +my @agents = qsearch( 'agent', \%agent_search ); #die "No agents created!" unless @agents; -eidiot "You have not created any agents. You must create at least one agent before adding a customer. Go to ". popurl(2). "browse/agent.cgi and create one or more agents." unless @agents; +eidiot "You have not created any agents (or all agents are disabled). You must create at least one agent before adding a customer. Go to ". popurl(2). "browse/agent.cgi and create one or more agents." unless @agents; my $agentnum = $cust_main->agentnum || $agents[0]->agentnum; #default to first if ( scalar(@agents) == 1 ) { print qq!<INPUT TYPE="hidden" NAME="agentnum" VALUE="$agentnum">!; @@ -183,8 +191,10 @@ END my $countrydefault = $conf->config('countrydefault') || 'US'; $cust_main->country( $countrydefault ) unless $cust_main->country; -$cust_main->state( $conf->config('statedefault') || 'CA' ) - unless $cust_main->state || $cust_main->country ne 'US'; +my $statedefault = $conf->config('statedefault') + || ($countrydefault eq 'US' ? 'CA' : ''); +$cust_main->state( $statedefault ) + unless $cust_main->state || $cust_main->country ne $countrydefault; my($county_html, $state_html, $country_html) = FS::cust_main_county::regionselector( $cust_main->county, @@ -281,8 +291,9 @@ END #false laziness with regular state $cust_main->ship_country( $countrydefault ) unless $cust_main->ship_country; - $cust_main->ship_state( $conf->config('statedefault') || 'CA' ) - unless $cust_main->ship_state || $cust_main->ship_country ne 'US'; + $cust_main->ship_state( $statedefault ) + unless $cust_main->ship_state + || $cust_main->ship_country ne $countrydefault; my($ship_county_html, $ship_state_html, $ship_country_html) = FS::cust_main_county::regionselector( $cust_main->ship_county, @@ -335,7 +346,9 @@ sub expselect { $return .= ">$_"; } $return .= qq!</SELECT>/<SELECT NAME="$prefix!. qq!_year" SIZE="1">!; - for ( 2001 .. 2037 ) { + my @t = localtime; + my $thisYear = $t[5] + 1900; + for ( ($thisYear > $y && $y > 0 ? $y : $thisYear) .. 2037 ) { $return .= "<OPTION"; $return .= " SELECTED" if $_ == $y; $return .= ">$_"; @@ -398,7 +411,19 @@ if ( $payby_default eq 'HIDE' ) { print qq!<TR><TD>Email invoice <INPUT TYPE="text" NAME="invoicing_list" VALUE="$invoicing_list"></TD></TR>!; print "<TR><TD>Billing type</TD></TR>", - "</TABLE>", + "</TABLE>", '<script language="JavaScript"><!-- + var mywindow = -1; + function myopen(filename,windowname,properties) { + myclose(); + mywindow = window.open(filename,windowname,properties); + } + function myclose() { + if ( mywindow != -1 ) + mywindow.close(); + mywindow = -1; + } + + //--></script>', &table("#cccccc"), "<TR>"; my($payinfo, $payname)=( @@ -416,6 +441,12 @@ if ( $payby_default eq 'HIDE' ) { 'COMP' => qq!Complimentary<BR>${r}Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR>${r}Exp !. expselect("COMP"), ); + if ( $cust_main->dbdef_table->column('paycvv') ) { + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 bs + $payby{$payby} .= qq!<BR>CVV2 (<A HREF="javascript:myopen('../docs/cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>) <INPUT TYPE="text" NAME=${payby}_paycvv VALUE="" SIZE=4 MAXLENGTH=4>!; + } + } + my( $account, $aba ) = split('@', $payinfo); my %paybychecked = ( @@ -428,6 +459,15 @@ if ( $payby_default eq 'HIDE' ) { 'COMP' => qq!Complimentary<BR>${r}Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR>${r}Exp !. expselect("COMP", $cust_main->paydate), ); + if ( $cust_main->dbdef_table->column('paycvv') ) { + my $paycvv = $cust_main->paycvv; + + foreach my $payby ( grep { exists $payby{$_} } qw(CARD DCRD) ) { #1.4/1.5 bs + $paybychecked{$payby} .= qq!<BR>CVV2 (<A HREF="javascript:myopen('../docs/cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>) <INPUT TYPE="text" NAME=${payby}_paycvv VALUE="$paycvv" SIZE=4 MAXLENGTH=4>!; + } + } + + $cust_main->payby($payby_default) unless $cust_main->payby; for (qw(CARD DCRD CHEK DCHK LECB BILL COMP)) { print qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!; diff --git a/httemplate/edit/cust_main_county.cgi b/httemplate/edit/cust_main_county.cgi index f3d28825a..4bcfcbe9b 100755 --- a/httemplate/edit/cust_main_county.cgi +++ b/httemplate/edit/cust_main_county.cgi @@ -16,12 +16,26 @@ print qq!<FORM ACTION="!, popurl(1), <TH><FONT SIZE=-1>State</FONT></TH> <TH><FONT SIZE=-1>County</FONT></TH> <TH><FONT SIZE=-1>Taxclass</FONT><BR><FONT SIZE=-2>(per-package classification)</FONT></TH> - <TH><FONT SIZE=-1>Tax name</FONT><BR><FONT SIZE=-2>(printed on invoices)</FONT></TH> +END + +if ( dbdef->table('cust_main_county')->column('taxname') ) { + print '<TH><FONT SIZE=-1>Tax name</FONT><BR><FONT SIZE=-2>(printed on invoices)</FONT></TH>'; +} + +print <<END; <TH><FONT SIZE=-1>Tax</FONT></TH> <TH><FONT SIZE=-1>Exempt<BR>per<BR>month</TH> - </TR> END +if ( dbdef->table('cust_main_county')->column('setuptax') ) { + print '<TH><FONT SIZE=-1>Setup<BR>fee<BR>exempt</TH>'; +} +if ( dbdef->table('cust_main_county')->column('recurtax') ) { + print '<TH><FONT SIZE=-1>Recurring<BR>fee<BR>exempt</TH>'; +} + +print '</TR>'; + foreach my $cust_main_county ( sort { $a->country cmp $b->country or $a->state cmp $b->state or $a->county cmp $b->county @@ -48,11 +62,26 @@ END , "</TD>"; print qq!<TD><INPUT TYPE="text" NAME="taxname!, $hashref->{taxnum}, - qq!" VALUE="!, $hashref->{taxname}, qq!"></TD>!; - print qq!<TD><INPUT TYPE="text" NAME="tax!, $hashref->{taxnum}, - qq!" VALUE="!, $hashref->{tax}, qq!" SIZE=6 MAXLENGTH=6>%</TD>!; - print qq!<TD>\$<INPUT TYPE="text" NAME="exempt_amount!, $hashref->{taxnum}, - qq!" VALUE="!, $hashref->{exempt_amount}||0, qq!" SIZE=6></TD>!; + qq!" VALUE="!, $hashref->{taxname}, qq!"></TD>! + if dbdef->table('cust_main_county')->column('taxname'); + + print qq!<TD><TABLE><TR><TD><INPUT TYPE="text" NAME="tax!, $hashref->{taxnum}, + qq!" VALUE="!, $hashref->{tax}, qq!" SIZE=6 MAXLENGTH=6></TD><TD>%</TD></TR></TABLE></TD>!; + print qq!<TD><TABLE><TR><TD>\$</TD><TD><INPUT TYPE="text" NAME="exempt_amount!, $hashref->{taxnum}, + qq!" VALUE="!, $hashref->{exempt_amount}||0, qq!" SIZE=6></TD></TR></TABLE></TD>!; + + print qq!<TD><INPUT TYPE="checkbox" NAME="setuptax!. $hashref->{taxnum}. + '" VALUE="Y"'. + ( $hashref->{setuptax} =~ /^Y$/i ? ' CHECKED' : '' ). + '></TD>' + if dbdef->table('cust_main_county')->column('setuptax'); + + print qq!<TD><INPUT TYPE="checkbox" NAME="recurtax!. $hashref->{taxnum}. + '" VALUE="Y"'. + ( $hashref->{recurtax} =~ /^Y$/i ? ' CHECKED' : '' ). + '></TD>' + if dbdef->table('cust_main_county')->column('recurtax'); + print '</TR>'; } diff --git a/httemplate/edit/part_bill_event.cgi b/httemplate/edit/part_bill_event.cgi index 6426eed93..48ed7916b 100755 --- a/httemplate/edit/part_bill_event.cgi +++ b/httemplate/edit/part_bill_event.cgi @@ -20,7 +20,7 @@ if ( $query && $query =~ /^(\d+)$/ ) { } else { $part_bill_event ||= new FS::part_bill_event {}; } -$action ||= $part_bill_event->pkgpart ? 'Edit' : 'Add'; +$action ||= $part_bill_event->eventpart ? 'Edit' : 'Add'; my $hashref = $part_bill_event->hashref; print header("$action Invoice Event Definition", menubar( diff --git a/httemplate/edit/part_export.cgi b/httemplate/edit/part_export.cgi index cc60f1aeb..4d0c7391f 100644 --- a/httemplate/edit/part_export.cgi +++ b/httemplate/edit/part_export.cgi @@ -68,9 +68,10 @@ my $widget = new HTML::Widgets::SelectLayers( $html .= '</SELECT>'; } elsif ( $type eq 'textarea' ) { $html .= qq!<TEXTAREA NAME="$option" COLS=80 ROWS=8 WRAP="virtual">!. - qq!$value</TEXTAREA>!; + encode_entities($value). '</TEXTAREA>'; } elsif ( $type eq 'text' ) { - $html .= qq!<INPUT TYPE="text" NAME="$option" VALUE="$value" SIZE=64>!; + $html .= qq!<INPUT TYPE="text" NAME="$option" VALUE="!. + encode_entities($value). '" SIZE=64>'; } elsif ( $type eq 'checkbox' ) { $html .= qq!<INPUT TYPE="checkbox" NAME="$option" VALUE="1"!; $html .= ' CHECKED' if $value; diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi index dee356250..8416b3546 100755 --- a/httemplate/edit/part_pkg.cgi +++ b/httemplate/edit/part_pkg.cgi @@ -66,12 +66,52 @@ print '<FORM NAME="dummy">'; #print qq!<INPUT TYPE="hidden" NAME="pkgpart" VALUE="$hashref->{pkgpart}">!, print "Package Part #", $hashref->{pkgpart} ? $hashref->{pkgpart} : "(NEW)"; -print ntable("#cccccc",2), <<END; -<TR><TD ALIGN="right">Package (customer-visible)</TD><TD><INPUT TYPE="text" NAME="pkg" SIZE=32 VALUE="$hashref->{pkg}"></TD></TR> -<TR><TD ALIGN="right">Comment (customer-hidden)</TD><TD><INPUT TYPE="text" NAME="comment" SIZE=32 VALUE="$hashref->{comment}"></TD></TR> -<TR><TD ALIGN="right">Frequency (months) of recurring fee</TD><TD><INPUT TYPE="text" NAME="freq" VALUE="$hashref->{freq}" SIZE=3> <I>0=no recurring fee, 1=monthly, 3=quarterly, 12=yearly</TD></TR> -<TR><TD ALIGN="right">Setup fee tax exempt</TD><TD> -END +#false laziness w/view/cust_main.cgi +my %freq; +tie %freq, 'Tie::IxHash', + '0' => '(no recurring fee)', + '1d' => 'daily', + '1w' => 'weekly', + '2w' => 'biweekly (every 2 weeks)', + '1' => 'monthly', + '2' => 'bimonthly (every 2 months)', + '3' => 'quarterly (every 3 months)', + '6' => 'semiannually (every 6 months)', + '12' => 'annually', + '24' => 'biannually (every 2 years)', +; +if ( $part_pkg->dbdef_table->column('freq')->type =~ /(int)/i ) { + delete $freq{$_} foreach grep { ! /^\d+$/ } keys %freq; +} + +%> +<%= ntable("#cccccc",2) %> + <TR> + <TD ALIGN="right">Package (customer-visible)</TD> + <TD> + <INPUT TYPE="text" NAME="pkg" SIZE=32 VALUE="<%= $part_pkg->pkg %>"> + </TD> + </TR> + <TR> + <TD ALIGN="right">Comment (customer-hidden)</TD> + <TD> + <INPUT TYPE="text" NAME="comment" SIZE=32 VALUE="<%=$part_pkg->comment%>"> + </TD> + </TR> + <TR> + <TD ALIGN="right">Recurring fee frequency </TD> + <TD> + <SELECT NAME="freq"> + <% foreach my $freq ( keys %freq ) { %> + <OPTION VALUE="<%= $freq %>"<%= $freq eq $part_pkg->freq ? ' SELECTED' : '' %>><%= $freq{$freq} %> + <% } %> + </SELECT> + </TD> + </TR> + <TR> + <TD ALIGN="right">Setup fee tax exempt</TD> + <TD> +<% print '<INPUT TYPE="checkbox" NAME="setuptax" VALUE="Y"'; print ' CHECKED' if $hashref->{setuptax} eq "Y"; @@ -112,9 +152,11 @@ print ' CHECKED' if $hashref->{disabled} eq "Y"; print '>'; print '</TD></TR></TABLE>'; -my $thead = "\n\n". ntable('#cccccc', 2). <<END; -<TR><TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Quan.</FONT></TH><TH BGCOLOR="#dcdcdc">Service</TH></TR> -END +my $thead = "\n\n". ntable('#cccccc', 2). + '<TR><TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Quan.</FONT></TH>'; +$thead .= '<TH BGCOLOR="#dcdcdc"><FONT SIZE=-1>Primary</FONT></TH>' + if dbdef->table('pkg_svc')->column('primary_svc'); +$thead .= '<TH BGCOLOR="#dcdcdc">Service</TH></TR>'; #unless ( $cgi->param('clone') ) { #dunno why... @@ -136,9 +178,10 @@ foreach my $part_svc ( @part_svc ) { 'pkgpart' => $pkgpart, 'svcpart' => $svcpart, } ) || new FS::pkg_svc ( { - 'pkgpart' => $pkgpart, - 'svcpart' => $svcpart, - 'quantity' => 0, + 'pkgpart' => $pkgpart, + 'svcpart' => $svcpart, + 'quantity' => 0, + 'primary_svc' => '', }); #? #next unless $pkg_svc; @@ -150,7 +193,13 @@ foreach my $part_svc ( @part_svc ) { print '<TR>'; # if $count == 0 ; print qq!<TD><INPUT TYPE="text" NAME="pkg_svc$svcpart" SIZE=4 MAXLENGTH=3 VALUE="!, $cgi->param("pkg_svc$svcpart") || $pkg_svc->quantity || 0, - qq!"></TD><TD><A HREF="part_svc.cgi?!,$part_svc->svcpart, + qq!"></TD>!; + if ( dbdef->table('pkg_svc')->column('primary_svc') ) { + print qq!<TD><INPUT TYPE="radio" NAME="pkg_svc_primary" VALUE="$svcpart"!; + print ' CHECKED' if $pkg_svc->primary_svc =~ /^Y/i; + print '></TD>'; + } + print qq!<TD><A HREF="part_svc.cgi?!,$part_svc->svcpart, qq!">!, $part_svc->getfield('svc'), "</A></TD></TR>"; # print "</TABLE></TD><TD>$thead" if ++$count == int(scalar(@part_svc) / 2); $count+=1; @@ -399,6 +448,71 @@ tie my %plans, 'Tie::IxHash', 'recur' => '\'my $last_bill = $cust_pkg->last_bill; my $hours = $cust_pkg->seconds_since_sqlradacct($last_bill, $sdate ) / 3600 - \' + what.recur_included_hours.value + \'; $hours = 0 if $hours < 0; my $input = $cust_pkg->attribute_since_sqlradacct($last_bill, $sdate, \"AcctInputOctets\" ) / 1048576; my $output = $cust_pkg->attribute_since_sqlradacct($last_bill, $sdate, \"AcctOutputOctets\" ) / 1048576; my $total = $input + $output - \' + what.recur_included_total.value + \'; $total = 0 if $total < 0; my $input = $input - \' + what.recur_included_input.value + \'; $input = 0 if $input < 0; my $output = $output - \' + what.recur_included_output.value + \'; $output = 0 if $output < 0; my $totalcharge = sprintf(\"%.2f\", \' + what.recur_total_charge.value + \' * $total); my $hourscharge = sprintf(\"%.2f\", \' + what.recur_hourly_charge.value + \' * $hours); push @details, \"Last month\\\'s excess data \". sprintf(\"%.1f\", $total). \" megs: \\\$$totalcharge\", \"Last month\\\'s excess time \". sprintf(\"%.1f\", $hours). \" hours: \\\$$hourscharge\"; \' + what.recur_flat.value + \' + $hourscharge + \' + what.recur_input_charge.value + \' * $input + \' + what.recur_output_charge.value + \' * $output + $totalcharge ;\'', }, + 'sql_generic' => { + 'name' => 'Base charge plus a metered rate from a configurable SQL query', + 'fields' => { + 'setup_fee' => { 'name' => 'Setup fee for this package', + 'default' => 0, + }, + 'recur_flat' => { 'name' => 'Base monthly charge for this package', + 'default' => 0, + }, + 'recur_included' => { 'name' => 'Units included', + 'default' => 0, + }, + 'recur_unit_charge' => { 'name' => 'Additional charge per unit', + 'default' => 0, + }, + 'datasrc' => { 'name' => 'DBI data source', + 'default' => '', + }, + 'db_username' => { 'name' => 'Database username', + 'default' => '', + }, + 'db_password' => { 'name' => 'Database username', + 'default' => '', + }, + 'query' => { 'name' => 'SQL query', + 'default' => '', + }, + }, + 'fieldorder' => [qw( setup_fee recur_flat recur_included recur_unit_charge datasrc db_username db_password query )], + 'setup' => 'what.setup_fee.value', + # 'recur' => '\'my $dbh = DBI->connect(\"\' + what.datasrc.value + \'\", \"\' + what.db_username.value + \'\") or die $DBI::errstr; \'', + 'recur' => '\'my $dbh = DBI->connect(\"\' + what.datasrc.value + \'\", \"\' + what.db_username.value + \'\", \"\' + what.db_password.value + \'\" ) or die $DBI::errstr; my $sth = $dbh->prepare(\"\' + what.query.value + \'\") or die $dbh->errstr; my $units = 0; foreach my $cust_svc ( grep { $_->part_svc->svcdb eq \"svc_domain\" } $cust_pkg->cust_svc ) { my $domain = $cust_svc->svc_x->domain; $sth->execute($domain) or die $sth->errstr; $units += $sth->fetchrow_arrayref->[0]; } $units -= \' + what.recur_included.value + \'; $units = 0 if $units < 0; \' + what.recur_flat.value + \' + $units * \' + what.recur_unit_charge.value + \';\'', + #'recur' => '\'my $dbh = DBI->connect("\' + what.datasrc.value + \'", "\' + what.db_username.value + \'", "\' what.db_password.value + \'" ) or die $DBI::errstr; my $sth = $dbh->prepare("\' + what.query.value + \'") or die $dbh->errstr; my $units = 0; foreach my $cust_svc ( grep { $_->part_svc->svcdb eq "svc_domain" } $cust_pkg->cust_svc ) { my $domain = $cust_svc->svc_x->domain; $sth->execute($domain) or die $sth->errstr; $units += $sth->fetchrow_arrayref->[0]; } $units -= \' + what.recur_included.value + \'; $units = 0 if $units < 0; \' + what.recur_flat.value + \' + $units * \' + what.recur_unit_charge + \';\'', + }, + + + + 'sql_external' => { + 'name' => 'Base charge plus additional fees for external services from a configurable SQL query', + 'fields' => { + 'setup_fee' => { 'name' => 'Setup fee for this package', + 'default' => 0, + }, + 'recur_flat' => { 'name' => 'Base monthly charge for this package', + 'default' => 0, + }, + 'datasrc' => { 'name' => 'DBI data source', + 'default' => '', + }, + 'db_username' => { 'name' => 'Database username', + 'default' => '', + }, + 'db_password' => { 'name' => 'Database password', + 'default' => '', + }, + 'query' => { 'name' => 'SQL query', + 'default' => '', + }, + }, + 'fieldorder' => [qw( setup_fee recur_flat datasrc db_username db_password query )], + 'setup' => 'what.setup_fee.value', + 'recur' => q!'my $dbh = DBI->connect("' + what.datasrc.value + '", "' + what.db_username.value + '", "' + what.db_password.value + '" ) or die $DBI::errstr; my $sth = $dbh->prepare("' + what.query.value + '") or die $dbh->errstr; my $price = ' + what.recur_flat.value + '; foreach my $cust_svc ( grep { $_->part_svc->svcdb eq "svc_external" } $cust_pkg->cust_svc ){ my $id = $cust_svc->svc_x->id; $sth->execute($id) or die $sth->errstr; $price += $sth->fetchrow_arrayref->[0]; } $price;'!, + + }, + ; my %plandata = map { /^(\w+)=(.*)$/; ( $1 => $2 ); } @@ -413,6 +527,10 @@ if ( $conf->exists('enable_taxclasses') ) { push @fixups, 'taxclass'; #hidden } +my @form_radio = (); +if ( dbdef->table('pkg_svc')->column('primary_svc') ) { + push @form_radio, 'pkg_svc_primary'; +} my $widget = new HTML::Widgets::SelectLayers( 'selected_layer' => $part_pkg->plan, @@ -421,7 +539,8 @@ my $widget = new HTML::Widgets::SelectLayers( 'form_action' => 'process/part_pkg.cgi', 'form_text' => [ qw(pkg comment freq clone pkgnum pkgpart), @fixups ], 'form_checkbox' => [ qw(setuptax recurtax disabled) ], - 'form_select' => [ @form_select ], + 'form_radio' => \@form_radio, + 'form_select' => \@form_select, 'fixup_callback' => sub { #my $ = @_; my $html = ''; diff --git a/httemplate/edit/part_svc.cgi b/httemplate/edit/part_svc.cgi index 45e0b6ffe..6868ffd65 100755 --- a/httemplate/edit/part_svc.cgi +++ b/httemplate/edit/part_svc.cgi @@ -53,6 +53,7 @@ Services are items you offer to your customers. <LI>svc_forward - mail forwarding <LI>svc_www - Virtual domain website <LI>svc_broadband - Broadband/High-speed Internet service + <LI>svc_external - Externally-tracked service <!-- <LI>svc_charge - One-time charges (Partially unimplemented) <LI>svc_wo - Work orders (Partially unimplemented) --> @@ -129,9 +130,13 @@ my %defs = ( 'ip_addr' => 'IP address. Leave blank for automatic assignment.', 'blocknum' => 'Address block.', }, + 'svc_external' => { + #'id' => '', + #'title' => '', + }, ); - foreach $svcdb (keys(%defs)) { + foreach my $svcdb (grep dbdef->table($_), keys %defs ) { my $self = "FS::$svcdb"->new; $vfields{$svcdb} = {}; foreach my $field ($self->virtual_fields) { # svc_Common::virtual_fields with a null svcpart returns all of them @@ -151,9 +156,9 @@ my %defs = ( my @dbs = $hashref->{svcdb} ? ( $hashref->{svcdb} ) - : qw( svc_acct svc_domain svc_forward svc_www svc_broadband ); + : qw( svc_acct svc_domain svc_forward svc_www svc_broadband svc_external ); - tie my %svcdb, 'Tie::IxHash', map { $_=>$_ } @dbs; + tie my %svcdb, 'Tie::IxHash', map { $_=>$_ } grep dbdef->table($_), @dbs; my $widget = new HTML::Widgets::SelectLayers( #'selected_layer' => $p_svcdb, 'selected_layer' => $hashref->{svcdb} || 'svc_acct', @@ -174,7 +179,7 @@ my %defs = ( $html .= '<BR><BR>'. table(). table(). "<TR><TH COLSPAN=$columns>Exports</TH></TR><TR>"; foreach my $part_export ( @part_export ) { - $html .= '<TD><INPUT TYPE="checbox"'. + $html .= '<TD><INPUT TYPE="checkbox"'. ' NAME="exportnum'. $part_export->exportnum. '" VALUE="1" '; $html .= 'CHECKED' if ( $clone || $part_svc->svcpart ) #null svcpart search causing error diff --git a/httemplate/edit/process/cust_main.cgi b/httemplate/edit/process/cust_main.cgi index 818382856..25c346e46 100755 --- a/httemplate/edit/process/cust_main.cgi +++ b/httemplate/edit/process/cust_main.cgi @@ -19,6 +19,8 @@ if ( $payby ) { $cgi->param('paydate', $cgi->param( $payby. '_month' ). '-'. $cgi->param( $payby. '_year' ) ); $cgi->param('payname', $cgi->param( $payby. '_payname' ) ); + $cgi->param('paycvv', $cgi->param( $payby. '_paycvv' ) ) + if defined $cgi->param( $payby. '_paycvv' ); } $cgi->param('otaker', &getotaker ); @@ -27,6 +29,7 @@ my @invoicing_list = split( /\s*\,\s*/, $cgi->param('invoicing_list') ); push @invoicing_list, 'POST' if $cgi->param('invoicing_list_POST'); $cgi->param('invoicing_list', join(',', @invoicing_list) ); + #create new record object my $new = new FS::cust_main ( { @@ -113,6 +116,11 @@ if ( $new->custnum eq '' ) { } else { #create old record object my $old = qsearchs( 'cust_main', { 'custnum' => $new->custnum } ); $error ||= "Old record not found!" unless $old; + if ( defined dbdef->table('cust_main')->column('paycvv') + && length($old->paycvv) + && $new->paycvv =~ /^\s*\*+\s*$/ ) { + $new->paycvv($old->paycvv); + } $error ||= $new->replace($old, \@invoicing_list); } diff --git a/httemplate/edit/process/cust_main_county-collapse.cgi b/httemplate/edit/process/cust_main_county-collapse.cgi index 8e67140a8..5da9dea80 100755 --- a/httemplate/edit/process/cust_main_county-collapse.cgi +++ b/httemplate/edit/process/cust_main_county-collapse.cgi @@ -3,8 +3,8 @@ my($query) = $cgi->keywords; $query =~ /^(\d+)$/ or die "Illegal taxnum!"; my $taxnum = $1; -my $cust_main_county = qsearchs('cust_main_county',{'taxnum'=>$taxnum}) - or die ("Unknown taxnum!"); +my $cust_main_county = qsearchs('cust_main_county', { 'taxnum' => $taxnum } ) + or die "Unknown taxnum $taxnum"; #really should do this in a .pm & start transaction diff --git a/httemplate/edit/process/cust_main_county.cgi b/httemplate/edit/process/cust_main_county.cgi index 6d80ad512..9287ed150 100755 --- a/httemplate/edit/process/cust_main_county.cgi +++ b/httemplate/edit/process/cust_main_county.cgi @@ -7,11 +7,15 @@ foreach ( grep { /^tax\d+$/ } $cgi->param ) { or die "Couldn't find taxnum $taxnum!"; next unless $old->tax != $cgi->param("tax$taxnum") || $old->exempt_amount != $cgi->param("exempt_amount$taxnum") - || $old->taxname ne $cgi->param("taxname$taxnum"); + || $old->taxname ne $cgi->param("taxname$taxnum") + || $old->setuptax ne $cgi->param("setuptax$taxnum") + || $old->recurtax ne $cgi->param("recurtax$taxnum"); my %hash = $old->hash; $hash{tax} = $cgi->param("tax$taxnum"); $hash{exempt_amount} = $cgi->param("exempt_amount$taxnum"); $hash{taxname} = $cgi->param("taxname$taxnum"); + $hash{setuptax} = $cgi->param("setuptax$taxnum"); + $hash{recurtax} = $cgi->param("recurtax$taxnum"); my $new = new FS::cust_main_county \%hash; my $error = $new->replace($old); if ( $error ) { diff --git a/httemplate/edit/process/part_pkg.cgi b/httemplate/edit/process/part_pkg.cgi index d489426f9..7eada7bc8 100755 --- a/httemplate/edit/process/part_pkg.cgi +++ b/httemplate/edit/process/part_pkg.cgi @@ -62,16 +62,24 @@ if ( $error ) { foreach my $part_svc (qsearch('part_svc',{})) { my $quantity = $cgi->param('pkg_svc'. $part_svc->svcpart) || 0; + my $primary_svc = + $cgi->param('pkg_svc_primary') == $part_svc->svcpart ? 'Y' : ''; my $old_pkg_svc = qsearchs('pkg_svc', { 'pkgpart' => $pkgpart, 'svcpart' => $part_svc->svcpart, } ); my $old_quantity = $old_pkg_svc ? $old_pkg_svc->quantity : 0; - next unless $old_quantity != $quantity; #!here + my $old_primary_svc = + ( $old_pkg_svc && $old_pkg_svc->dbdef_table->column('primary_svc') ) + ? $old_pkg_svc->primary_svc + : ''; + next unless $old_quantity != $quantity || $old_primary_svc ne $primary_svc; + my $new_pkg_svc = new FS::pkg_svc( { - 'pkgpart' => $pkgpart, - 'svcpart' => $part_svc->svcpart, - 'quantity' => $quantity, + 'pkgpart' => $pkgpart, + 'svcpart' => $part_svc->svcpart, + 'quantity' => $quantity, + 'primary_svc' => $primary_svc, } ); if ( $old_pkg_svc ) { my $myerror = $new_pkg_svc->replace($old_pkg_svc); diff --git a/httemplate/edit/process/router.cgi b/httemplate/edit/process/router.cgi index 7e40c48a7..a2fa46dd9 100644 --- a/httemplate/edit/process/router.cgi +++ b/httemplate/edit/process/router.cgi @@ -1,8 +1,5 @@ <% -use FS::UID qw(dbh); - -my $dbh = dbh; local $FS::UID::AutoCommit=0; sub check { @@ -10,7 +7,7 @@ sub check { if($error) { $cgi->param('error', $error); print $cgi->redirect(popurl(3) . "edit/router.cgi?". $cgi->query_string); - $dbh->rollback; + dbh->rollback; exit; } } @@ -38,7 +35,7 @@ check($error); if ($old) { @old_psr = $old->part_svc_router; - foreach $psr (@old_psr) { + foreach my $psr (@old_psr) { if($cgi->param('svcpart_'.$psr->svcpart) eq 'ON') { # do nothing } else { @@ -64,7 +61,7 @@ foreach($cgi->param) { # Yay, everything worked! -$dbh->commit or die $dbh->errstr; +dbh->commit or die dbh->errstr; print $cgi->redirect(popurl(3). "browse/router.cgi"); %> diff --git a/httemplate/edit/process/svc_external.cgi b/httemplate/edit/process/svc_external.cgi new file mode 100755 index 000000000..728cd2189 --- /dev/null +++ b/httemplate/edit/process/svc_external.cgi @@ -0,0 +1,29 @@ +<% + +$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!"; +my $svcnum =$1; + +my $old = qsearchs('svc_external',{'svcnum'=>$svcnum}) if $svcnum; + +my $new = new FS::svc_external ( { + map { + ($_, scalar($cgi->param($_))); + } ( fields('svc_external'), qw( pkgnum svcpart ) ) +} ); + +my $error = ''; +if ( $svcnum ) { + $error = $new->replace($old); +} else { + $error = $new->insert; + $svcnum = $new->getfield('svcnum'); +} + +if ($error) { + $cgi->param('error', $error); + print $cgi->redirect(popurl(2). "svc_external.cgi?". $cgi->query_string ); +} else { + print $cgi->redirect(popurl(3). "view/svc_external.cgi?$svcnum"); +} + +%> diff --git a/httemplate/edit/router.cgi b/httemplate/edit/router.cgi index 5c365a21e..a573c6504 100755 --- a/httemplate/edit/router.cgi +++ b/httemplate/edit/router.cgi @@ -22,6 +22,8 @@ print header("$action Router", menubar( 'View all routers' => "${p}browse/router.cgi", )); +my $p3 = popurl(3); + if($cgi->param('error')) { %> <FONT SIZE="+1" COLOR="#ff0000">Error: <%=$cgi->param('error')%></FONT> <% } %> @@ -31,6 +33,7 @@ if($cgi->param('error')) { <INPUT TYPE="hidden" NAME="redirect_ok" VALUE="<%=$p3%>/browse/router.cgi"> <INPUT TYPE="hidden" NAME="redirect_error" VALUE="<%=$p3%>/edit/router.cgi"> <INPUT TYPE="hidden" NAME="routernum" VALUE="<%=$routernum%>"> + <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%=$router->svcnum%>"> Router #<%=$routernum or "(NEW)"%> <BR><BR>Name <INPUT TYPE="text" NAME="routername" SIZE=32 VALUE="<%=$router->routername%>"> @@ -49,12 +52,14 @@ foreach my $field ($router->virtual_fields) { </TABLE> - +<% +unless ($router->svcnum) { +%> <BR><BR>Select the service types available on this router<BR> <% -foreach my $part_svc ( qsearch('part_svc', { svcdb => 'svc_broadband', - disabled => '' }) ) { + foreach my $part_svc ( qsearch('part_svc', { svcdb => 'svc_broadband', + disabled => '' }) ) { %> <BR> <INPUT TYPE="checkbox" NAME="svcpart_<%=$part_svc->svcpart%>"<%= @@ -64,6 +69,8 @@ foreach my $part_svc ( qsearch('part_svc', { svcdb => 'svc_broadband', <%=$part_svc->svcpart%>: <%=$part_svc->svc%></A> <% } %> +<% } %> + <BR><BR><INPUT TYPE="submit" VALUE="Apply changes"> </FORM> </BODY></HTML> diff --git a/httemplate/edit/svc_acct.cgi b/httemplate/edit/svc_acct.cgi index 44606d9a0..f1b8b800b 100755 --- a/httemplate/edit/svc_acct.cgi +++ b/httemplate/edit/svc_acct.cgi @@ -281,7 +281,7 @@ if ( $part_svc->part_svc_column('usergroup')->columnflag eq "F" ) { } print '</TD></TR>'; -foreach $field ($svc_acct->virtual_fields) { +foreach my $field ($svc_acct->virtual_fields) { if ( $part_svc->part_svc_column($field)->columnflag ne 'F' ) { # If the flag is X, it won't even show up in $svc_acct->virtual_fields. print $svc_acct->pvf($field)->widget('HTML', 'edit', diff --git a/httemplate/edit/svc_broadband.cgi b/httemplate/edit/svc_broadband.cgi index 6828791c0..db27b3241 100644 --- a/httemplate/edit/svc_broadband.cgi +++ b/httemplate/edit/svc_broadband.cgi @@ -157,7 +157,7 @@ Service #<B><%=$svcnum ? $svcnum : "(NEW)"%></B><BR><BR> <% } %> <% -foreach $field ($svc_broadband->virtual_fields) { +foreach my $field ($svc_broadband->virtual_fields) { if ( $part_svc->part_svc_column($field)->columnflag ne 'F' ) { print $svc_broadband->pvf($field)->widget('HTML', 'edit', $svc_broadband->getfield($field)); diff --git a/httemplate/edit/svc_external.cgi b/httemplate/edit/svc_external.cgi new file mode 100644 index 000000000..bcfc85e3f --- /dev/null +++ b/httemplate/edit/svc_external.cgi @@ -0,0 +1,105 @@ +<!-- mason kludge --> +<% + +my( $svcnum, $pkgnum, $svcpart, $part_svc, $svc_external ); +if ( $cgi->param('error') ) { + $svc_external = new FS::svc_external ( { + map { $_, scalar($cgi->param($_)) } fields('svc_external') + } ); + $svcnum = $svc_external->svcnum; + $pkgnum = $cgi->param('pkgnum'); + $svcpart = $cgi->param('svcpart'); + $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); + die "No part_svc entry!" unless $part_svc; +} else { + my($query) = $cgi->keywords; + if ( $query =~ /^(\d+)$/ ) { #editing + $svcnum=$1; + $svc_external=qsearchs('svc_external',{'svcnum'=>$svcnum}) + or die "Unknown (svc_external) svcnum!"; + + my($cust_svc)=qsearchs('cust_svc',{'svcnum'=>$svcnum}) + or die "Unknown (cust_svc) svcnum!"; + + $pkgnum=$cust_svc->pkgnum; + $svcpart=$cust_svc->svcpart; + + $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); + die "No part_svc entry!" unless $part_svc; + + } else { #adding + + foreach $_ (split(/-/,$query)) { #get & untaint pkgnum & svcpart + $pkgnum=$1 if /^pkgnum(\d+)$/; + $svcpart=$1 if /^svcpart(\d+)$/; + } + $svc_external = new FS::svc_external { svcpart => $svcpart }; + + $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart}); + die "No part_svc entry!" unless $part_svc; + + $svcnum=''; + + #set fixed and default fields from part_svc + foreach my $part_svc_column ( + grep { $_->columnflag } $part_svc->all_part_svc_column + ) { + $svc_external->setfield( $part_svc_column->columnname, + $part_svc_column->columnvalue, + ); + } + + } +} +my $action = $svc_external->svcnum ? 'Edit' : 'Add'; + +my $p1 = popurl(1); +print header("External service $action", ''); + +print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $cgi->param('error'), + "</FONT>" + if $cgi->param('error'); + +print qq!<FORM ACTION="${p1}process/svc_external.cgi" METHOD=POST>!; + +#display + + +#svcnum +print qq!<INPUT TYPE="hidden" NAME="svcnum" VALUE="$svcnum">!; +print qq!Service #<B>!, $svcnum ? $svcnum : "(NEW)", "</B><BR><BR>"; + +#pkgnum +print qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="$pkgnum">!; + +#svcpart +print qq!<INPUT TYPE="hidden" NAME="svcpart" VALUE="$svcpart">!; + +my($id,$title)=( + $svc_external->id, + $svc_external->title, +); + +print &ntable("#cccccc",2), + '<TR><TD ALIGN="right">External ID</TD><TD>'. + qq!<INPUT TYPE="text" NAME="id" VALUE="$id">!. + '</TD></TR>'. + '<TR><TD ALIGN="right">Title</TD><TD>'. + qq!<INPUT TYPE="text" NAME="title" VALUE="$title">!. + '</TD></TR>'; + +foreach my $field ($svc_external->virtual_fields) { + if ( $part_svc->part_svc_column($field)->columnflag ne 'F' ) { + # If the flag is X, it won't even show up in $svc_acct->virtual_fields. + print $svc_external->pvf($field)->widget('HTML', 'edit', + $svc_external->getfield($field)); + } +} + +%> + +</TABLE><BR><INPUT TYPE="submit" VALUE="Submit"> + </FORM> + </BODY> +</HTML> + diff --git a/httemplate/edit/svc_forward.cgi b/httemplate/edit/svc_forward.cgi index 0d815b9e5..2e6c5f1a0 100755 --- a/httemplate/edit/svc_forward.cgi +++ b/httemplate/edit/svc_forward.cgi @@ -58,20 +58,17 @@ if ( $cgi->param('error') ) { my $action = $svc_forward->svcnum ? 'Edit' : 'Add'; my %email; + +#starting with those currently attached +foreach my $method (qw( srcsvc_acct dstsvc_acct )) { + my $svc_acct = $svc_forward->$method(); + $email{$svc_acct->svcnum} = $svc_acct->email if $svc_acct; +} + if ($pkgnum) { #find all possible user svcnums (and emails) - #starting with those currently attached - if ( $svc_forward->srcsvc ) { - my $svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $svc_forward->srcsvc } ); - $email{$svc_forward->srcsvc} = $svc_acct->email; - } - if ( $svc_forward->dstsvc ) { - my $svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $svc_forward->dstsvc } ); - $email{$svc_forward->dstsvc} = $svc_acct->email; - } - #and including the rest for this customer my($u_part_svc,@u_acct_svcparts); foreach $u_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_acct'}) ) { @@ -98,15 +95,7 @@ if ($pkgnum) { } } -} elsif ( $action eq 'Edit' ) { - - my($svc_acct)=qsearchs('svc_acct',{'svcnum'=>$svc_forward->srcsvc}); - $email{$svc_forward->srcsvc} = $svc_acct->email; - - $svc_acct=qsearchs('svc_acct',{'svcnum'=>$svc_forward->dstsvc}); - $email{$svc_forward->dstsvc} = $svc_acct->email; - -} else { +} elsif ( $action eq 'Add' ) { die "\$action eq Add, but \$pkgnum is null!\n"; } @@ -115,6 +104,7 @@ my($srcsvc,$dstsvc,$dst)=( $svc_forward->dstsvc, $svc_forward->dst, ); +my $src = $svc_forward->dbdef_table->column('src') ? $svc_forward->src : ''; #display @@ -130,46 +120,54 @@ my($srcsvc,$dstsvc,$dst)=( Service #<%= $svcnum ? "<B>$svcnum</B>" : " (NEW)" %><BR> Service: <B><%= $part_svc->svc %></B><BR><BR> -<FORM NAME="dummy"> +<FORM ACTION="process/svc_forward.cgi" METHOD="POST"> +<INPUT TYPE="hidden" NAME="svcnum" VALUE="<%= $svcnum %>"> +<INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%= $pkgnum %>"> +<INPUT TYPE="hidden" NAME="svcpart" VALUE="<%= $svcpart %>"> + +<SCRIPT TYPE="text/javascript"> +function srcchanged(what) { + if ( what.options[what.selectedIndex].value == 0 ) { + what.form.src.disabled = false; + } else { + what.form.src.disabled = true; + } +} +function dstchanged(what) { + if ( what.options[what.selectedIndex].value == 0 ) { + what.form.dst.disabled = false; + } else { + what.form.dst.disabled = true; + } +} +</SCRIPT> <%= ntable("#cccccc",2) %> -<TR><TD ALIGN="right">Email to</TD><TD><SELECT NAME="srcsvc" SIZE=1> +<TR><TD ALIGN="right">Email to</TD> +<TD><SELECT NAME="srcsvc" SIZE=1 onChange="srcchanged(this)"> <% foreach $_ (keys %email) { %> <OPTION<%= $_ eq $srcsvc ? " SELECTED" : "" %> VALUE="<%= $_ %>"><%= $email{$_} %></OPTION> <% } %> -</SELECT></TD></TR> - -<% - tie my %tied_email, 'Tie::IxHash', - '' => 'SELECT DESTINATION', - %email, - '0' => '(other email address)'; - my $widget = new HTML::Widgets::SelectLayers( - 'selected_layer' => $dstsvc, - 'options' => \%tied_email, - 'form_name' => 'dummy', - 'form_action' => 'process/svc_forward.cgi', - 'form_select' => ['srcsvc'], - 'html_between' => '</TD></TR></TABLE>', - 'layer_callback' => sub { - my $layer = shift; - my $html = qq!<INPUT TYPE="hidden" NAME="svcnum" VALUE="$svcnum">!. - qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="$pkgnum">!. - qq!<INPUT TYPE="hidden" NAME="svcpart" VALUE="$svcpart">!. - qq!<INPUT TYPE="hidden" NAME="dstsvc" VALUE="$layer">!; - if ( $layer eq '0' ) { - $html .= ntable("#cccccc",2). - '<TR><TD ALIGN="right">Destination email</TD>'. - qq!<TD><INPUT TYPE="text" NAME="dst" VALUE="$dst"></TD>!. - '</TR></TABLE>'; - } - $html .= '<BR><INPUT TYPE="submit" VALUE="Submit">'; - $html; - }, - ); -%> +<% if ( $svc_forward->dbdef_table->column('src') ) { %> + <OPTION <%= $src ? 'SELECTED' : '' %> VALUE="0">(other email address)</OPTION> +<% } %> +</SELECT> +<% if ( $svc_forward->dbdef_table->column('src') ) { %> +<INPUT TYPE="text" NAME="src" VALUE="<%= $src %>" <%= ( $src || !scalar(%email) ) ? '' : 'DISABLED' %>> +<% } %> +</TD></TR> <TR><TD ALIGN="right">Forwards to</TD> -<TD><%= $widget->html %> +<TD><SELECT NAME="dstsvc" SIZE=1 onChange="dstchanged(this)"> +<% foreach $_ (keys %email) { %> + <OPTION<%= $_ eq $dstsvc ? " SELECTED" : "" %> VALUE="<%= $_ %>"><%= $email{$_} %></OPTION> +<% } %> +<OPTION <%= $dst ? 'SELECTED' : '' %> VALUE="0">(other email address)</OPTION> +</SELECT> +<INPUT TYPE="text" NAME="dst" VALUE="<%= $dst %>" <%= ( $dst || !scalar(%email) ) ? '' : 'DISABLED' %>> +</TD></TR> + </TABLE> +<BR><INPUT TYPE="submit" VALUE="Submit"> +</FORM> </BODY> </HTML> diff --git a/httemplate/edit/svc_www.cgi b/httemplate/edit/svc_www.cgi index 043af610b..ec5169e05 100644 --- a/httemplate/edit/svc_www.cgi +++ b/httemplate/edit/svc_www.cgi @@ -167,7 +167,7 @@ foreach $_ (keys %username) { } print "</SELECT></TD></TR>"; -foreach $field ($svc_www->virtual_fields) { +foreach my $field ($svc_www->virtual_fields) { if ( $part_svc->part_svc_column($field)->columnflag ne 'F' ) { # If the flag is X, it won't even show up in $svc_acct->virtual_fields. print $svc_www->pvf($field)->widget('HTML', 'edit', |