diff options
Diffstat (limited to 'httemplate/browse')
-rw-r--r-- | httemplate/browse/addr_block.cgi | 76 | ||||
-rwxr-xr-x | httemplate/browse/agent.cgi | 226 | ||||
-rwxr-xr-x | httemplate/browse/agent_type.cgi | 60 | ||||
-rwxr-xr-x | httemplate/browse/cust_main_county.cgi | 142 | ||||
-rwxr-xr-x | httemplate/browse/cust_pay_batch.cgi | 76 | ||||
-rw-r--r-- | httemplate/browse/generic.cgi | 46 | ||||
-rwxr-xr-x | httemplate/browse/msgcat.cgi | 50 | ||||
-rwxr-xr-x | httemplate/browse/nas.cgi | 80 | ||||
-rwxr-xr-x | httemplate/browse/part_bill_event.cgi | 71 | ||||
-rwxr-xr-x | httemplate/browse/part_export.cgi | 39 | ||||
-rwxr-xr-x | httemplate/browse/part_pkg.cgi | 169 | ||||
-rwxr-xr-x | httemplate/browse/part_referral.cgi | 97 | ||||
-rwxr-xr-x | httemplate/browse/part_svc.cgi | 137 | ||||
-rw-r--r-- | httemplate/browse/part_virtual_field.cgi | 39 | ||||
-rw-r--r-- | httemplate/browse/payment_gateway.html | 70 | ||||
-rwxr-xr-x | httemplate/browse/queue.cgi | 5 | ||||
-rw-r--r-- | httemplate/browse/rate.cgi | 34 | ||||
-rw-r--r-- | httemplate/browse/router.cgi | 57 | ||||
-rwxr-xr-x | httemplate/browse/svc_acct_pop.cgi | 63 |
19 files changed, 1537 insertions, 0 deletions
diff --git a/httemplate/browse/addr_block.cgi b/httemplate/browse/addr_block.cgi new file mode 100644 index 000000000..06ac556cf --- /dev/null +++ b/httemplate/browse/addr_block.cgi @@ -0,0 +1,76 @@ +<%= header('Address Blocks', menubar('Main Menu' => $p)) %> +<% + +use NetAddr::IP; + +my @addr_block = qsearch('addr_block', {}); +my @router = qsearch('router', {}); +my $block; +my $p2 = popurl(2); +my $path = $p2 . "edit/process/addr_block"; + +%> + +<% if ($cgi->param('error')) { %> + <FONT SIZE="+1" COLOR="#ff0000">Error: <%=$cgi->param('error')%></FONT> + <BR><BR> +<% } %> + +<%=table()%> + +<% foreach $block (sort {$a->NetAddr cmp $b->NetAddr} @addr_block) { %> + <TR> + <TD><%=$block->NetAddr%></TD> + <% if (my $router = $block->router) { %> + <% if (scalar($block->svc_broadband) == 0) { %> + <TD> + <%=$router->routername%> + </TD> + <TD> + <FORM ACTION="<%=$path%>/deallocate.cgi" METHOD="POST"> + <INPUT TYPE="hidden" NAME="blocknum" VALUE="<%=$block->blocknum%>"> + <INPUT TYPE="submit" NAME="submit" VALUE="Deallocate"> + </FORM> + </TD> + <% } else { %> + <TD COLSPAN="2"> + <%=$router->routername%> + </TD> + <% } %> + <% } else { %> + <TD> + <FORM ACTION="<%=$path%>/allocate.cgi" METHOD="POST"> + <INPUT TYPE="hidden" NAME="blocknum" VALUE="<%=$block->blocknum%>"> + <SELECT NAME="routernum" SIZE="1"> + <% foreach (@router) { %> + <OPTION VALUE="<%=$_->routernum %>"><%=$_->routername%></OPTION> + <% } %> + </SELECT> + <INPUT TYPE="submit" NAME="submit" VALUE="Allocate"> + </FORM> + </TD> + <TD> + <FORM ACTION="<%=$path%>/split.cgi" METHOD="POST"> + <INPUT TYPE="hidden" NAME="blocknum" VALUE="<%=$block->blocknum%>"> + <INPUT TYPE="submit" NAME="submit" VALUE="Split"> + </FORM> + </TD> + </TR> +<% } + } %> + <TR><TD COLSPAN="3"><BR></TD></TR> + <TR> + <FORM ACTION="<%=$path%>/add.cgi" METHOD="POST"> + <TD>Gateway/Netmask</TD> + <TD> + <INPUT TYPE="text" NAME="ip_gateway" SIZE="15">/<INPUT TYPE="text" NAME="ip_netmask" SIZE="2"> + </TD> + <TD> + <INPUT TYPE="submit" NAME="submit" VALUE="Add"> + </TD> + </FORM> + </TR> +</TABLE> +</BODY> +</HTML> + diff --git a/httemplate/browse/agent.cgi b/httemplate/browse/agent.cgi new file mode 100755 index 000000000..05300d0bd --- /dev/null +++ b/httemplate/browse/agent.cgi @@ -0,0 +1,226 @@ +<% + + my %search; + if ( $cgi->param('showdisabled') + || !dbdef->table('agent')->column('disabled') ) { + %search = (); + } else { + %search = ( 'disabled' => '' ); + } + + my $conf = new FS::Conf; + +%> +<%= header('Agent Listing', menubar( + 'Main Menu' => $p, + 'Agent Types' => $p. 'browse/agent_type.cgi', +# 'Add new agent' => '../edit/agent.cgi' +)) %> +Agents are resellers of your service. Agents may be limited to a subset of your +full offerings (via their type).<BR><BR> +<A HREF="<%= $p %>edit/agent.cgi"><I>Add a new agent</I></A><BR><BR> + +<% if ( dbdef->table('agent')->column('disabled') ) { %> + <%= $cgi->param('showdisabled') + ? do { $cgi->param('showdisabled', 0); + '( <a href="'. $cgi->self_url. '">hide disabled agents</a> )'; } + : do { $cgi->param('showdisabled', 1); + '( <a href="'. $cgi->self_url. '">show disabled agents</a> )'; } + %> +<% } %> + +<%= table() %> +<TR> + <TH COLSPAN=<%= ( $cgi->param('showdisabled') || !dbdef->table('agent')->column('disabled') ) ? 2 : 3 %>>Agent</TH> + <TH>Type</TH> + <TH>Customers</TH> + <TH><FONT SIZE=-1>Customer<BR>packages</FONT></TH> + <TH>Reports</TH> + <TH>Registration codes</TH> + <TH>Prepaid cards</TH> + <% if ( $conf->config('ticket_system') ) { %> + <TH>Ticketing</TH> + <% } %> + <TH><FONT SIZE=-1>Payment Gateway Overrides</FONT></TH> + <TH><FONT SIZE=-1>Freq.</FONT></TH> + <TH><FONT SIZE=-1>Prog.</FONT></TH> +</TR> +<% +# <TH><FONT SIZE=-1>Agent #</FONT></TH> +# <TH>Agent</TH> + +foreach my $agent ( sort { + #$a->getfield('agentnum') <=> $b->getfield('agentnum') + $a->getfield('agent') cmp $b->getfield('agent') +} qsearch('agent', \%search ) ) { + + my $cust_main_link = $p. 'search/cust_main.cgi?agentnum_on=1&'. + 'agentnum='. $agent->agentnum; + + my $cust_pkg_link = $p. 'search/cust_pkg.cgi?agentnum='. $agent->agentnum; + +%> + + <TR> + <TD><A HREF="<%=$p%>edit/agent.cgi?<%= $agent->agentnum %>"> + <%= $agent->agentnum %></A></TD> +<% if ( dbdef->table('agent')->column('disabled') + && !$cgi->param('showdisabled') ) { %> + <TD><%= $agent->disabled ? 'DISABLED' : '' %></TD> +<% } %> + + <TD><A HREF="<%=$p%>edit/agent.cgi?<%= $agent->agentnum %>"> + <%= $agent->agent %></A></TD> + <TD><A HREF="<%=$p%>edit/agent_type.cgi?<%= $agent->typenum %>"><%= $agent->agent_type->atype %></A></TD> + + <TD> + <TABLE CELLSPACING=0 CELLPADDING=0> + <TR> + <TH ALIGN="right" WIDTH="40%"> + <%= my $num_prospect = $agent->num_prospect_cust_main %> + </TH> + <TD> + <% if ( $num_prospect ) { %> + <A HREF="<%= $cust_main_link %>&prospect=1"><% } %>prospects<% if ($num_prospect ) { %></A><% } %> + <TD> + </TR> + <TR> + <TH ALIGN="right" WIDTH="40%"> + <FONT COLOR="#00CC00"> + <%= my $num_active = $agent->num_active_cust_main %> + </FONT> + </TH> + <TD> + <% if ( $num_active ) { %> + <A HREF="<%= $cust_main_link %>&active=1"><% } %>active<% if ( $num_active ) { %></A><% } %> + </TD> + </TR> + <TR> + <TH ALIGN="right" WIDTH="40%"> + <FONT COLOR="#FF9900"> + <%= my $num_susp = $agent->num_susp_cust_main %> + </FONT> + </TH> + <TD> + <% if ( $num_susp ) { %> + <A HREF="<%= $cust_main_link %>&suspended=1"><% } %>suspended<% if ( $num_susp ) { %></A><% } %> + </TD> + </TR> + <TR> + <TH ALIGN="right" WIDTH="40%"> + <FONT COLOR="#FF0000"> + <%= my $num_cancel = $agent->num_cancel_cust_main %> + </FONT> + </TH> + <TD> + <% if ( $num_cancel ) { %> + <A HREF="<%= $cust_main_link %>&showcancelledcustomers=1&cancelled=1"><% } %>cancelled<% if ( $num_cancel ) { %></A><% } %> + </TD> + </TR> + </TABLE> + </TD> + + <TD> + <TABLE CELLSPACING=0 CELLPADDING=0> + <TR> + <TH ALIGN="right" WIDTH="40%"> + <FONT COLOR="#00CC00"> + <%= my $num_active_pkg = $agent->num_active_cust_pkg %> + </FONT> + </TH> + <TD> + <% if ( $num_active_pkg ) { %> + <A HREF="<%= $cust_pkg_link %>&magic=active"><% } %>active<% if ( $num_active_pkg ) { %></A><% } %> + </TD> + </TR> + <TR> + <TH ALIGN="right" WIDTH="40%"> + <FONT COLOR="#FF9900"> + <%= my $num_susp_pkg = $agent->num_susp_cust_pkg %> + </FONT> + </TH> + <TD> + <% if ( $num_susp_pkg ) { %> + <A HREF="<%= $cust_pkg_link %>&magic=suspended"><% } %>suspended<% if ( $num_susp_pkg ) { %></A><% } %> + </TD> + </TR> + <TR> + <TH ALIGN="right" WIDTH="40%"> + <FONT COLOR="#FF0000"> + <%= my $num_cancel_pkg = $agent->num_cancel_cust_pkg %> + </FONT> + </TH> + <TD> + <% if ( $num_cancel_pkg ) { %> + <A HREF="<%= $cust_pkg_link %>&magic=cancelled"><% } %>cancelled<% if ( $num_cancel_pkg ) { %></A><% } %> + </TD> + </TR> + </TABLE> + </TD> + + <TD> + <A HREF="<%= $p %>search/report_cust_pay.html?agentnum=<%= $agent->agentnum %>">Payments</A> + <BR><A HREF="<%= $p %>search/report_cust_credit.html?agentnum=<%= $agent->agentnum %>">Credits</A> + <BR><A HREF="<%= $p %>search/report_receivables.cgi?agentnum=<%= $agent->agentnum %>">A/R Aging</A> + <!--<BR><A HREF="<%= $p %>search/money_time.cgi?agentnum=<%= $agent->agentnum %>">Sales/Credits/Receipts</A>--> + + </TD> + + <TD> + <%= my $num_reg_code = $agent->num_reg_code %> + <% if ( $num_reg_code ) { %> + <A HREF="<%=$p%>search/reg_code.html?agentnum=<%= $agent->agentnum %>"><% } %>Unused<% if ( $num_reg_code ) { %></A><% } %> + <BR><A HREF="<%=$p%>edit/reg_code.cgi?agentnum=<%= $agent->agentnum %>">Generate codes</A> + </TD> + + <TD> + <%= my $num_prepay_credit = $agent->num_prepay_credit %> + <% if ( $num_prepay_credit ) { %> + <A HREF="<%=$p%>search/prepay_credit.html?agentnum=<%= $agent->agentnum %>"><% } %>Unused<% if ( $num_prepay_credit ) { %></A><% } %> + <BR><A HREF="<%=$p%>edit/prepay_credit.cgi?agentnum=<%= $agent->agentnum %>">Generate cards</A> + </TD> + + <% if ( $conf->config('ticket_system') ) { %> + + <TD> + <% if ( $agent->ticketing_queueid ) { %> + Queue: <%= $agent->ticketing_queueid %>: <%= $agent->ticketing_queue %><BR> + <% } %> + </TD> + + <% } %> + + <TD> + <TABLE CELLSPACING=0 CELLPADDING=0> + <% foreach my $override ( + # sort { } want taxclass-full stuff first? and default cards (empty cardtype) + qsearch('agent_payment_gateway', { 'agentnum' => $agent->agentnum } ) + ) { + %> + <TR> + <TD> + <%= $override->cardtype || 'Default' %> to <%= $override->payment_gateway->gateway_module %> (<%= $override->payment_gateway->gateway_username %>) + <%= $override->taxclass + ? ' for '. $override->taxclass. ' only' + : '' + %> + <FONT SIZE=-1><A HREF="<%=$p%>misc/delete-agent_payment_gateway.cgi?<%= 'XXXoverridenum' %>">(delete)</A></FONT> + </TD> + </TR> + <% } %> + <TR> + <TD><FONT SIZE=-1><A HREF="<%=$p%>edit/agent_payment_gateway.html?agentnum=<%= $agent->agentnum %>">(add override)</A></FONT></TD> + </TR> + </TABLE> + </TD> + + <TD><%= $agent->freq %></TD> + <TD><%= $agent->prog %></TD> + + </TR> + +<% } %> + + </TABLE> + </BODY> +</HTML> diff --git a/httemplate/browse/agent_type.cgi b/httemplate/browse/agent_type.cgi new file mode 100755 index 000000000..5473804e8 --- /dev/null +++ b/httemplate/browse/agent_type.cgi @@ -0,0 +1,60 @@ +<!-- mason kludge --> +<%= header("Agent Type Listing", menubar( + 'Main Menu' => $p, + 'Agents' => $p. 'browse/agent.cgi', +)) %> +Agent types define groups of packages that you can then assign to particular +agents.<BR><BR> +<A HREF="<%= $p %>edit/agent_type.cgi"><I>Add a new agent type</I></A><BR><BR> + +<%= table() %> +<TR> + <TH COLSPAN=2>Agent Type</TH> + <TH COLSPAN=2>Packages</TH> +</TR> + +<% +foreach my $agent_type ( sort { + $a->getfield('typenum') <=> $b->getfield('typenum') +} qsearch('agent_type',{}) ) { + my $hashref = $agent_type->hashref; + #more efficient to do this with SQL... + my @type_pkgs = grep { $_->part_pkg and ! $_->part_pkg->disabled } + qsearch('type_pkgs',{'typenum'=> $hashref->{typenum} }); + my $rowspan = scalar(@type_pkgs); + $rowspan = int($rowspan/2+0.5) ; + print <<END; + <TR> + <TD ROWSPAN=$rowspan><A HREF="${p}edit/agent_type.cgi?$hashref->{typenum}"> + $hashref->{typenum} + </A></TD> + <TD ROWSPAN=$rowspan><A HREF="${p}edit/agent_type.cgi?$hashref->{typenum}">$hashref->{atype}</A></TD> +END + + my($type_pkgs); + my($tdcount) = -1 ; + foreach $type_pkgs ( @type_pkgs ) { + my($pkgpart)=$type_pkgs->getfield('pkgpart'); + my($part_pkg) = qsearchs('part_pkg',{'pkgpart'=> $pkgpart }); + print qq!<TR>! if ($tdcount == 0) ; + $tdcount = 0 if ($tdcount == -1) ; + print qq!<TD><A HREF="${p}edit/part_pkg.cgi?$pkgpart">!, + $part_pkg->getfield('pkg'),"</A></TD>"; + $tdcount ++ ; + if ($tdcount == 2) + { + print qq!</TR>\n! ; + $tdcount = 0 ; + } + } + + print "</TR>"; +} + +print <<END; + </TABLE> + </BODY> +</HTML> +END + +%> diff --git a/httemplate/browse/cust_main_county.cgi b/httemplate/browse/cust_main_county.cgi new file mode 100755 index 000000000..1e0e0880c --- /dev/null +++ b/httemplate/browse/cust_main_county.cgi @@ -0,0 +1,142 @@ +<!-- mason kludge --> +<% + +my $conf = new FS::Conf; +my $enable_taxclasses = $conf->exists('enable_taxclasses'); + +print header("Tax Rate Listing", menubar( + 'Main Menu' => $p, + 'Edit tax rates' => $p. "edit/cust_main_county.cgi", +)),<<END; + Click on <u>expand country</u> to specify a country's tax rates by state. + <BR>Click on <u>expand state</u> to specify a state's tax rates by county. +END + +if ( $enable_taxclasses ) { + print '<BR>Click on <u>expand taxclasses</u> to specify tax classes'; +} + +print '<BR><BR>'. &table(). <<END; + <TR> + <TH><FONT SIZE=-1>Country</FONT></TH> + <TH><FONT SIZE=-1>State</FONT></TH> + <TH>County</TH> + <TH>Taxclass<BR><FONT SIZE=-1>(per-package classification)</FONT></TH> + <TH>Tax name<BR><FONT SIZE=-1>(printed on invoices)</FONT></TH> + <TH><FONT SIZE=-1>Tax</FONT></TH> + <TH><FONT SIZE=-1>Exemption</TH> + </TR> +END + +my @regions = sort { $a->country cmp $b->country + or $a->state cmp $b->state + or $a->county cmp $b->county + or $a->taxclass cmp $b->taxclass + } qsearch('cust_main_county',{}); + +my $sup=0; +#foreach $cust_main_county ( @regions ) { +for ( my $i=0; $i<@regions; $i++ ) { + my $cust_main_county = $regions[$i]; + my $hashref = $cust_main_county->hashref; + print <<END; + <TR> + <TD BGCOLOR="#ffffff">$hashref->{country}</TD> +END + + my $j; + if ( $sup ) { + $sup--; + } else { + + #lookahead + for ( $j=1; $i+$j<@regions; $j++ ) { + last if $hashref->{country} ne $regions[$i+$j]->country + || $hashref->{state} ne $regions[$i+$j]->state + || $hashref->{tax} != $regions[$i+$j]->tax + || $hashref->{exempt_amount} != $regions[$i+$j]->exempt_amount + || $hashref->{setuptax} ne $regions[$i+$j]->setuptax + || $hashref->{recurtax} ne $regions[$i+$j]->recurtax; + } + + my $newsup=0; + if ( $j>1 && $i+$j+1 < @regions + && ( $hashref->{state} ne $regions[$i+$j+1]->state + || $hashref->{country} ne $regions[$i+$j+1]->country + ) + && ( ! $i + || $hashref->{state} ne $regions[$i-1]->state + || $hashref->{country} ne $regions[$i-1]->country + ) + ) { + $sup = $j-1; + } else { + $j = 1; + } + + print "<TD ROWSPAN=$j", $hashref->{state} + ? ' BGCOLOR="#ffffff">'. $hashref->{state} + : qq! BGCOLOR="#cccccc">(ALL) <FONT SIZE=-1>!. + qq!<A HREF="${p}edit/cust_main_county-expand.cgi?!. $hashref->{taxnum}. + qq!">expand country</A></FONT>!; + + print qq! <FONT SIZE=-1><A HREF="${p}edit/process/cust_main_county-collapse.cgi?!. $hashref->{taxnum}. qq!">collapse state</A></FONT>! if $j>1; + + print "</TD>"; + } + +# $sup=$newsup; + + print "<TD"; + if ( $hashref->{county} ) { + print ' BGCOLOR="#ffffff">'. $hashref->{county}; + } else { + print ' BGCOLOR="#cccccc">(ALL)'; + if ( $hashref->{state} ) { + print qq!<FONT SIZE=-1>!. + qq!<A HREF="${p}edit/cust_main_county-expand.cgi?!. $hashref->{taxnum}. + qq!">expand state</A></FONT>!; + } + } + print "</TD>"; + + print "<TD"; + if ( $hashref->{taxclass} ) { + print ' BGCOLOR="#ffffff">'. $hashref->{taxclass}; + } else { + print ' BGCOLOR="#cccccc">(ALL)'; + if ( $enable_taxclasses ) { + print qq!<FONT SIZE=-1>!. + qq!<A HREF="${p}edit/cust_main_county-expand.cgi?taxclass!. + $hashref->{taxnum}. qq!">expand taxclasses</A></FONT>!; + } + + } + print "</TD>"; + + print "<TD"; + if ( $hashref->{taxname} ) { + print ' BGCOLOR="#ffffff">'. $hashref->{taxname}; + } else { + print ' BGCOLOR="#cccccc">Tax'; + } + print "</TD>"; + + print "<TD BGCOLOR=\"#ffffff\">$hashref->{tax}%</TD>". + '<TD BGCOLOR="#ffffff">'; + print '$'. sprintf("%.2f", $hashref->{exempt_amount} ). + ' per month<BR>' + if $hashref->{exempt_amount} > 0; + print 'Setup fee<BR>' if $hashref->{setuptax} =~ /^Y$/i; + print 'Recurring fee<BR>' if $hashref->{recurtax} =~ /^Y$/i; + print '</TD></TR>'; + +} + +print <<END; + </TABLE> + </BODY> +</HTML> +END + +%> diff --git a/httemplate/browse/cust_pay_batch.cgi b/httemplate/browse/cust_pay_batch.cgi new file mode 100755 index 000000000..3420e97b6 --- /dev/null +++ b/httemplate/browse/cust_pay_batch.cgi @@ -0,0 +1,76 @@ +<!-- mason kludge --> +<%= header("Pending credit card batch", menubar( 'Main Menu' => $p,)) %> + +<FORM ACTION="<%=$p%>misc/download-batch.cgi" METHOD="POST"> +Download batch in format <SELECT NAME="format"> +<OPTION VALUE="csv-td_canada_trust-merchant_pc_batch">CSV file for TD Canada Trust Merchant PC Batch</OPTION> +</SELECT><INPUT TYPE="submit" VALUE="Download"></FORM> +<BR><BR> + +<FORM ACTION="<%=$p%>misc/upload-batch.cgi" METHOD="POST" ENCTYPE="multipart/form-data"> +Upload results<BR> +Filename <INPUT TYPE="file" NAME="batch_results"><BR> +Format <SELECT NAME="format"> +<OPTION VALUE="csv-td_canada_trust-merchant_pc_batch">CSV results from TD Canada Trust Merchant PC Batch</OPTION> +</SELECT><BR> +<INPUT TYPE="submit" VALUE="Upload"></FORM> +<BR> + +<% + my $statement = "SELECT SUM(amount) from cust_pay_batch"; + my $sth = dbh->prepare($statement) or die dbh->errstr. "doing $statement"; + $sth->execute or die "Error executing \"$statement\": ". $sth->errstr; + my $total = $sth->fetchrow_arrayref->[0]; + + my $c_statement = "SELECT COUNT(*) from cust_pay_batch"; + my $c_sth = dbh->prepare($c_statement) + or die dbh->errstr. "doing $c_statement"; + $c_sth->execute or die "Error executing \"$c_statement\": ". $c_sth->errstr; + my $cards = $c_sth->fetchrow_arrayref->[0]; +%> +<%= $cards %> credit card payments batched<BR> +$<%= sprintf("%.2f", $total) %> total in pending batch<BR> + +<BR> +<%= &table() %> + <TR> + <TH>#</TH> + <TH><font size=-1>inv#</font></TH> + <TH COLSPAN=2>Customer</TH> + <TH>Card name</TH> + <TH>Card</TH> + <TH>Exp</TH> + <TH>Amount</TH> + </TR> + +<% +foreach my $cust_pay_batch ( sort { $a->paybatchnum <=> $b->paybatchnum } + qsearch('cust_pay_batch', {} ) +) { + my $cardnum = $cust_pay_batch->cardnum; + #$cardnum =~ s/.{4}$/xxxx/; + $cardnum = 'x'x(length($cardnum)-4). substr($cardnum,(length($cardnum)-4)); + + $cust_pay_batch->exp =~ /^\d{2}(\d{2})[\/\-](\d+)[\/\-]\d+$/; + my( $mon, $year ) = ( $2, $1 ); + $mon = "0$mon" if $mon < 10; + my $exp = "$mon/$year"; + +%> + + <TR> + <TD><%= $cust_pay_batch->paybatchnum %></TD> + <TD><A HREF="../view/cust_bill.cgi?<%= $cust_pay_batch->invnum %>"><%= $cust_pay_batch->invnum %></TD> + <TD><A HREF="../view/cust_main.cgi?<%= $cust_pay_batch->custnum %>"><%= $cust_pay_batch->custnum %></TD> + <TD><%= $cust_pay_batch->get('last'). ', '. $cust_pay_batch->first %></TD> + <TD><%= $cust_pay_batch->payname %></TD> + <TD><%= $cardnum %></TD> + <TD><%= $exp %></TD> + <TD align="right">$<%= $cust_pay_batch->amount %></TD> + </TR> + +<% } %> + + </TABLE> + </BODY> +</HTML> diff --git a/httemplate/browse/generic.cgi b/httemplate/browse/generic.cgi new file mode 100644 index 000000000..9ac0f2391 --- /dev/null +++ b/httemplate/browse/generic.cgi @@ -0,0 +1,46 @@ +<% + +use FS::Record qw(qsearch dbdef); +use DBIx::DBSchema; +use DBIx::DBSchema::Table; + +my $error; +my $p2 = popurl(2); +my ($table) = $cgi->keywords; +my $dbdef = dbdef or die "Cannot fetch dbdef!"; +my $dbdef_table = $dbdef->table($table) or die "Cannot fetch schema for $table"; + +my $pkey = $dbdef_table->primary_key or die "Cannot fetch pkey for $table"; +print header("Browse $table", menubar('Main Menu' => $p)); + +my @rec = qsearch($table, {}); +my @col = $dbdef_table->columns; + +if ($cgi->param('error')) { %> + <FONT SIZE="+1" COLOR="#ff0000">Error: <%=$cgi->param('error')%></FONT> + <BR><BR> +<% } +%> +<A HREF="<%=$p2%>edit/<%=$table%>.cgi"><I>Add a new <%=$table%></I></A><BR><BR> + +<%=table()%> +<TH> +<% foreach (grep { $_ ne $pkey } @col) { + %><TD><%=$_%></TD> + <% } %> +</TH> +<% foreach $rec (sort {$a->getfield($pkey) cmp $b->getfield($pkey) } @rec) { + %> + <TR> + <TD> + <A HREF="<%=$p2%>edit/<%=$table%>.cgi?<%=$rec->getfield($pkey)%>"> + <%=$rec->getfield($pkey)%></A> </TD> <% + foreach $col (grep { $_ ne $pkey } @col) { %> + <TD><%=$rec->getfield($col)%></TD> <% } %> + </A> + </TR> +<% } %> +</TABLE> +</BODY> +</HTML> + diff --git a/httemplate/browse/msgcat.cgi b/httemplate/browse/msgcat.cgi new file mode 100755 index 000000000..d4adf9f1a --- /dev/null +++ b/httemplate/browse/msgcat.cgi @@ -0,0 +1,50 @@ +<!-- mason kludge --> +<% + +print header("View Message catalog", menubar( + 'Main Menu' => $p, + 'Edit message catalog' => $p. "edit/msgcat.cgi", +)), '<BR>'; + +my $widget = new HTML::Widgets::SelectLayers( + 'selected_layer' => 'en_US', + 'options' => { 'en_US'=>'en_US' }, + 'layer_callback' => sub { + my $layer = shift; + my $html = "<BR>Messages for locale $layer<BR>". table(). + "<TR><TH COLSPAN=2>Code</TH>". + "<TH>Message</TH>"; + $html .= "<TH>en_US Message</TH>" unless $layer eq 'en_US'; + $html .= '</TR>'; + + #foreach my $msgcat ( sort { $a->msgcode cmp $b->msgcode } + # qsearch('msgcat', { 'locale' => $layer } ) ) { + foreach my $msgcat ( qsearch('msgcat', { 'locale' => $layer } ) ) { + $html .= '<TR><TD>'. $msgcat->msgnum. '</TD>'. + '<TD>'. $msgcat->msgcode. '</TD>'. + '<TD>'. $msgcat->msg. '</TD>'; + unless ( $layer eq 'en_US' ) { + my $en_msgcat = qsearchs('msgcat', { + 'locale' => 'en_US', + 'msgcode' => $msgcat->msgcode, + } ); + $html .= '<TD>'. $en_msgcat->msg. '</TD>'; + } + $html .= '</TR>'; + } + + $html .= '</TABLE>'; + $html; + }, + +); + +print $widget->html; + +print <<END; + </TABLE> + </BODY> +</HTML> +END + +%> diff --git a/httemplate/browse/nas.cgi b/httemplate/browse/nas.cgi new file mode 100755 index 000000000..9ccbfe632 --- /dev/null +++ b/httemplate/browse/nas.cgi @@ -0,0 +1,80 @@ +<!-- mason kludge --> +<% + +print header('NAS ports', menubar( + 'Main Menu' => $p, +)); + +my $now = time; + +foreach my $nas ( sort { $a->nasnum <=> $b->nasnum } qsearch( 'nas', {} ) ) { + print $nas->nasnum. ": ". $nas->nas. " ". + $nas->nasfqdn. " (". $nas->nasip. ") ". + "as of ". time2str("%c",$nas->last). + " (". &pretty_interval($now - $nas->last). " ago)<br>". + &table(). "<TR><TH>Nas<BR>Port #</TH><TH>Global<BR>Port #</BR></TH>". + "<TH>IP address</TH><TH>User</TH><TH>Since</TH><TH>Duration</TH><TR>", + ; + foreach my $port ( sort { + $a->nasport <=> $b->nasport || $a->portnum <=> $b->portnum + } qsearch( 'port', { 'nasnum' => $nas->nasnum } ) ) { + my $session = $port->session; + my($user, $since, $pretty_since, $duration); + if ( ! $session ) { + $user = "(empty)"; + $since = 0; + $pretty_since = "(never)"; + $duration = ''; + } elsif ( $session->logout ) { + $user = "(empty)"; + $since = $session->logout; + } else { + my $svc_acct = $session->svc_acct; + $user = "<A HREF=\"$p/view/svc_acct.cgi?". $svc_acct->svcnum. "\">". + $svc_acct->username. "</A>"; + $since = $session->login; + } + $pretty_since = time2str("%c", $since) if $since; + $duration = pretty_interval( $now - $since ). " ago" + unless defined($duration); + print "<TR><TD>". $port->nasport. "</TD><TD>". $port->portnum. "</TD><TD>". + $port->ip. "</TD><TD>$user</TD><TD>$pretty_since". + "</TD><TD>$duration</TD></TR>" + ; + } + print "</TABLE><BR>"; +} + +#Time::Duration?? +sub pretty_interval { + my $interval = shift; + my %howlong = ( + '604800' => 'week', + '86400' => 'day', + '3600' => 'hour', + '60' => 'minute', + '1' => 'second', + ); + + my $pretty = ""; + foreach my $key ( sort { $b <=> $a } keys %howlong ) { + my $value = int( $interval / $key ); + if ( $value ) { + if ( $value == 1 ) { + $pretty .= + ( $howlong{$key} eq 'hour' ? 'an ' : 'a ' ). $howlong{$key}. " " + } else { + $pretty .= $value. ' '. $howlong{$key}. 's '; + } + } + $interval -= $value * $key; + } + $pretty =~ /^\s*(\S.*\S)\s*$/; + $1; +} + +#print &table(), <<END; +#<TR> +# <TH>#</TH> +# <TH>NAS</ +%> diff --git a/httemplate/browse/part_bill_event.cgi b/httemplate/browse/part_bill_event.cgi new file mode 100755 index 000000000..670474d48 --- /dev/null +++ b/httemplate/browse/part_bill_event.cgi @@ -0,0 +1,71 @@ +<!-- mason kludge --> +<% + +my %search; +if ( $cgi->param('showdisabled') ) { + %search = (); +} else { + %search = ( 'disabled' => '' ); +} + +my @part_bill_event = qsearch('part_bill_event', \%search ); +my $total = scalar(@part_bill_event); + +%> +<%= header('Invoice Event Listing', menubar( 'Main Menu' => $p) ) %> + + Invoice events are actions taken on overdue invoices.<BR><BR> +<A HREF="<%= $p %>edit/part_bill_event.cgi"><I>Add a new invoice event</I></A> +<BR><BR> +<%= $total %> events +<%= $cgi->param('showdisabled') + ? do { $cgi->param('showdisabled', 0); + '( <a href="'. $cgi->self_url. '">hide disabled events</a> )'; } + : do { $cgi->param('showdisabled', 1); + '( <a href="'. $cgi->self_url. '">show disabled events</a> )'; } +%> +<%= table() %> + <TR> + <TH COLSPAN=<%= $cgi->param('showdisabled') ? 2 : 3 %>>Event</TH> + <TH>Payby</TH> + <TH>After</TH> + <TH>Action</TH> + <TH>Options</TH> + <TH>Code</TH> + </TR> + +<% foreach my $part_bill_event ( sort { $a->payby cmp $b->payby + || $a->seconds <=> $b->seconds + || $a->weight <=> $b->weight + || $a->eventpart <=> $b->eventpart + } @part_bill_event ) { + my $url = "${p}edit/part_bill_event.cgi?". $part_bill_event->eventpart; + use Time::Duration; + my $delay = duration_exact($part_bill_event->seconds); + my $plandata = $part_bill_event->plandata; + $plandata =~ s/\n/<BR>/go; +%> + <TR> + <TD><A HREF="<%= $url %>"> + <%= $part_bill_event->eventpart %></A></TD> +<% unless ( $cgi->param('showdisabled') ) { %> + <TD> + <%= $part_bill_event->disabled ? 'DISABLED' : '' %></TD> +<% } %> + <TD><A HREF="<%= $url %>"> + <%= $part_bill_event->event %></A></TD> + <TD> + <%= $part_bill_event->payby %></TD> + <TD> + <%= $delay %></TD> + <TD> + <%= $part_bill_event->plan %></TD> + <TD> + <%= $plandata %></TD> + <TD><FONT SIZE="-1"> + <%= $part_bill_event->eventcode %></FONT></TD> + </TR> +<% } %> +</TABLE> +</BODY> +</HTML> diff --git a/httemplate/browse/part_export.cgi b/httemplate/browse/part_export.cgi new file mode 100755 index 000000000..79c57aefc --- /dev/null +++ b/httemplate/browse/part_export.cgi @@ -0,0 +1,39 @@ +<!-- mason kludge --> +<%= header("Export Listing", menubar( 'Main Menu' => "$p#sysadmin" )) %> +Provisioning services to external machines, databases and APIs.<BR><BR> +<A HREF="<%= $p %>edit/part_export.cgi"><I>Add a new export</I></A><BR><BR> +<SCRIPT> +function part_export_areyousure(href) { + if (confirm("Are you sure you want to delete this export?") == true) + window.location.href = href; +} +</SCRIPT> + +<%= table() %> + <TR> + <TH COLSPAN=2>Export</TH> + <TH>Options</TH> + </TR> + +<% foreach my $part_export ( sort { + $a->getfield('exportnum') <=> $b->getfield('exportnum') + } qsearch('part_export',{}) ) { +%> + <TR> + <TD><A HREF="<%= $p %>edit/part_export.cgi?<%= $part_export->exportnum %>"><%= $part_export->exportnum %></A></TD> + <TD><%= $part_export->exporttype %> to <%= $part_export->machine %> (<A HREF="<%= $p %>edit/part_export.cgi?<%= $part_export->exportnum %>">edit</A> | <A HREF="javascript:part_export_areyousure('<%= $p %>misc/delete-part_export.cgi?<%= $part_export->exportnum %>')">delete</A>)</TD> + <TD> + <%= itable() %> + <% my %opt = $part_export->options; + foreach my $opt ( keys %opt ) { %> + <TR><TD><%= $opt %></TD><TD><%= encode_entities($opt{$opt}) %></TD></TR> + <% } %> + </TABLE> + </TD> + </TR> + +<% } %> + +</TABLE> +</BODY> +</HTML> diff --git a/httemplate/browse/part_pkg.cgi b/httemplate/browse/part_pkg.cgi new file mode 100755 index 000000000..8d5b55451 --- /dev/null +++ b/httemplate/browse/part_pkg.cgi @@ -0,0 +1,169 @@ +<!-- mason kludge --> +<% + +my %search; +if ( $cgi->param('showdisabled') ) { + %search = (); +} else { + %search = ( 'disabled' => '' ); +} + +my @part_pkg = qsearch('part_pkg', \%search ); +my $total = scalar(@part_pkg); + +my $sortby; +my %num_active_cust_pkg = (); +my( $suspended_sth, $canceled_sth ) = ( '', '' ); +if ( $cgi->param('active') ) { + my $active_sth = dbh->prepare( + 'SELECT COUNT(*) FROM cust_pkg WHERE pkgpart = ?'. + ' AND ( cancel IS NULL OR cancel = 0 )'. + ' AND ( susp IS NULL OR susp = 0 )' + ) or die dbh->errstr; + foreach my $part_pkg ( @part_pkg ) { + $active_sth->execute($part_pkg->pkgpart) or die $active_sth->errstr; + $num_active_cust_pkg{$part_pkg->pkgpart} = + $active_sth->fetchrow_arrayref->[0]; + } + $sortby = sub { + $num_active_cust_pkg{$b->pkgpart} <=> $num_active_cust_pkg{$a->pkgpart}; + }; + + $suspended_sth = dbh->prepare( + 'SELECT COUNT(*) FROM cust_pkg WHERE pkgpart = ?'. + ' AND ( cancel IS NULL OR cancel = 0 )'. + ' AND susp IS NOT NULL AND susp != 0' + ) or die dbh->errstr; + + $canceled_sth = dbh->prepare( + 'SELECT COUNT(*) FROM cust_pkg WHERE pkgpart = ?'. + ' AND cancel IS NOT NULL AND cancel != 0' + ) or die dbh->errstr; + +} else { + $sortby = sub { $a->pkgpart <=> $b->pkgpart; }; +} + +my $conf = new FS::Conf; +my $taxclasses = $conf->exists('enable_taxclasses'); + +%> +<%= header("Package Definition Listing",menubar( 'Main Menu' => $p )) %> +<% unless ( $cgi->param('active') ) { %> + One or more service definitions are grouped together into a package + definition and given pricing information. Customers purchase packages + rather than purchase services directly.<BR><BR> + <A HREF="<%= $p %>edit/part_pkg.cgi"><I>Add a new package definition</I></A> + <BR><BR> +<% } %> + +<%= $total %> package definitions +<% if ( $cgi->param('showdisabled') ) { $cgi->param('showdisabled', 0); %> + ( <a href="<%= $cgi->self_url %>">hide disabled packages</a> ) +<% } else { $cgi->param('showdisabled', 1); %> + ( <a href="<%= $cgi->self_url %>">show disabled packages</a> ) +<% } %> + +<% my $colspan = $cgi->param('showdisabled') ? 2 : 3; %> + +<%= &table() %> + <TR> + <TH COLSPAN=<%= $colspan %>>Package</TH> + <TH>Comment</TH> +<% if ( $cgi->param('active') ) { %> + <TH><FONT SIZE=-1>Customer<BR>packages</FONT></TH> +<% } %> + <TH><FONT SIZE=-1>Freq.</FONT></TH> +<% if ( $taxclasses ) { %> + <TH><FONT SIZE=-1>Taxclass</FONT></TH> +<% } %> + <TH><FONT SIZE=-1>Plan</FONT></TH> + <TH><FONT SIZE=-1>Data</FONT></TH> + <TH>Service</TH> + <TH><FONT SIZE=-1>Quan.</FONT></TH> +<% if ( dbdef->table('pkg_svc')->column('primary_svc') ) { %> + <TH><FONT SIZE=-1>Primary</FONT></TH> +<% } %> + + </TR> + +<% +foreach my $part_pkg ( sort $sortby @part_pkg ) { + my @pkg_svc = $part_pkg->pkg_svc; + my($rowspan)=scalar(@pkg_svc); + my $plandata; + if ( $part_pkg->plan ) { + $plandata = $part_pkg->plandata; + $plandata =~ s/^(\w+)=/$1 /mg; + $plandata =~ s/\n/<BR>/g; + } else { + $part_pkg->plan('(legacy)'); + $plandata = "Setup ". $part_pkg->setup. + "<BR>Recur ". $part_pkg->recur; + } +%> + <TR> + <TD ROWSPAN=<%= $rowspan %>><A HREF="<%=$p%>edit/part_pkg.cgi?<%= $part_pkg->pkgpart %>"><%= $part_pkg->pkgpart %></A></TD> + +<% unless ( $cgi->param('showdisabled') ) { %> + <TD ROWSPAN=<%= $rowspan %>> + <% if ( $part_pkg->disabled ) { %> + DISABLED + <% } %> + </TD> +<% } %> + + <TD ROWSPAN=<%= $rowspan %>><A HREF="<%=$p%>edit/part_pkg.cgi?<%= $part_pkg->pkgpart %>"><%= $part_pkg->pkg %></A></TD> + <TD ROWSPAN=<%= $rowspan %>><%= $part_pkg->comment %></TD> + +<% if ( $cgi->param('active') ) { %> + <TD ROWSPAN=<%= $rowspan %>> + <FONT COLOR="#00CC00"><B><%= $num_active_cust_pkg{$part_pkg->pkgpart} %></B></FONT> <A HREF="<%=$p%>search/cust_pkg.cgi?magic=active;pkgpart=<%= $part_pkg->pkgpart %>">active</A><BR> + + <% $suspended_sth->execute( $part_pkg->pkgpart ) + or die $suspended_sth->errstr; + my $num_suspended = $suspended_sth->fetchrow_arrayref->[0]; + %> + <FONT COLOR="#FF9900"><B><%= $num_suspended %></B></FONT> <A HREF="<%=$p%>search/cust_pkg.cgi?magic=suspended;pkgpart=<%= $part_pkg->pkgpart %>">suspended</A><BR> + + <% $canceled_sth->execute( $part_pkg->pkgpart ) + or die $canceled_sth->errstr; + my $num_canceled = $canceled_sth->fetchrow_arrayref->[0]; + %> + <FONT COLOR="#FF0000"><B><%= $num_canceled %></B></FONT> <A HREF="<%=$p%>search/cust_pkg.cgi?magic=canceled;pkgpart=<%= $part_pkg->pkgpart %>">canceled</A> + </TD> +<% } %> + + <TD ROWSPAN=<%= $rowspan %>><%= $part_pkg->freq_pretty %></TD> + +<% if ( $taxclasses ) { %> + <TD ROWSPAN=<%= $rowspan %>><%= $part_pkg->taxclass || ' ' %></TD> +<% } %> + + <TD ROWSPAN=<%= $rowspan %>><%= $part_pkg->plan %></TD> + <TD ROWSPAN=<%= $rowspan %>><%= $plandata %></TD> + +<% + my($n)=""; + foreach my $pkg_svc ( @pkg_svc ) { + my($svcpart)=$pkg_svc->getfield('svcpart'); + my($part_svc) = qsearchs('part_svc',{'svcpart'=> $svcpart }); + print $n,qq!<TD><A HREF="${p}edit/part_svc.cgi?$svcpart">!, + $part_svc->getfield('svc'),"</A></TD><TD>", + $pkg_svc->getfield('quantity'),"</TD>"; + if ( dbdef->table('pkg_svc')->column('primary_svc') ) { + print '<TD>'; + print 'PRIMARY' if $pkg_svc->primary_svc =~ /^Y/i; + print '</TD>'; + } + print "</TR>\n"; + $n="<TR>"; + } +%> + + </TR> +<% } %> + + </TABLE> + </BODY> +</HTML> diff --git a/httemplate/browse/part_referral.cgi b/httemplate/browse/part_referral.cgi new file mode 100755 index 000000000..581e01bb6 --- /dev/null +++ b/httemplate/browse/part_referral.cgi @@ -0,0 +1,97 @@ +<!-- mason kludge --> +<%= header("Advertising source Listing", menubar( + 'Main Menu' => $p, +# 'Add new referral' => "../edit/part_referral.cgi", +)) %> +Where a customer heard about your service. Tracked for informational purposes. +<BR><BR> +<A HREF="<%= $p %>edit/part_referral.cgi"><I>Add a new advertising source</I></A> +<BR><BR> + +<% + my $today = timelocal(0, 0, 0, (localtime(time))[3..5] ); + my %after; + tie %after, 'Tie::IxHash', + 'Today' => 0, + 'Yesterday' => 86400, # 60sec * 60min * 24hrs + 'Past week' => 518400, # 60sec * 60min * 24hrs * 6days + 'Past 30 days' => 2505600, # 60sec * 60min * 24hrs * 29days + 'Past 60 days' => 5097600, # 60sec * 60min * 24hrs * 59days + 'Past 90 days' => 7689600, # 60sec * 60min * 24hrs * 89days + 'Past 6 months' => 15724800, # 60sec * 60min * 24hrs * 182days + 'Past year' => 31486000, # 60sec * 60min * 24hrs * 364days + 'Total' => $today, + ; + my %before = ( + 'Today' => 86400, # 60sec * 60min * 24hrs + 'Yesterday' => 0, + 'Past week' => 86400, # 60sec * 60min * 24hrs + 'Past 30 days' => 86400, # 60sec * 60min * 24hrs + 'Past 60 days' => 86400, # 60sec * 60min * 24hrs + 'Past 90 days' => 86400, # 60sec * 60min * 24hrs + 'Past 6 months' => 86400, # 60sec * 60min * 24hrs + 'Past year' => 86400, # 60sec * 60min * 24hrs + 'Total' => 86400, # 60sec * 60min * 24hrs + ); + + my $statement = "SELECT COUNT(*) FROM h_cust_main + WHERE history_action = 'insert' + AND refnum = ? + AND history_date >= ? + AND history_date < ? + "; + my $sth = dbh->prepare($statement) + or die dbh->errstr; +%> + +<%= table() %> +<TR> + <TH COLSPAN=2 ROWSPAN=2>Advertising source</TH> + <TH COLSPAN=<%= scalar(keys %after) %>>Customers</TH> +</TR> +<% for my $period ( keys %after ) { %> + <TH><FONT SIZE=-1><%= $period %></FONT></TH> +<% } %> +</TR> + +<% +foreach my $part_referral ( sort { + $a->getfield('refnum') <=> $b->getfield('refnum') +} qsearch('part_referral',{}) ) { +%> + <TR> + <TD><A HREF="<%= $p %>edit/part_referral.cgi?<%= $part_referral->refnum %>"> + <%= $part_referral->refnum %></A></TD> + <TD><A HREF="<%= $p %>edit/part_referral.cgi?<%= $part_referral->refnum %>"> + <%= $part_referral->referral %></A></TD> + <% for my $period ( keys %after ) { + $sth->execute( $part_referral->refnum, + $today-$after{$period}, + $today+$before{$period}, + ) or die $sth->errstr; + my $number = $sth->fetchrow_arrayref->[0]; + %> + <TD ALIGN="right"><%= $number %></TD> + <% } %> + </TR> +<% } %> + +<% + $statement =~ s/AND refnum = \?//; + $sth = dbh->prepare($statement) + or die dbh->errstr; +%> + <TR> + <TH COLSPAN=2>Total</TH> + <% for my $period ( keys %after ) { + $sth->execute( $today-$after{$period}, + $today+$before{$period}, + ) or die $sth->errstr; + my $number = $sth->fetchrow_arrayref->[0]; + %> + <TD ALIGN="right"><%= $number %></TD> + <% } %> + </TR> + </TABLE> + </BODY> +</HTML> diff --git a/httemplate/browse/part_svc.cgi b/httemplate/browse/part_svc.cgi new file mode 100755 index 000000000..a725dc051 --- /dev/null +++ b/httemplate/browse/part_svc.cgi @@ -0,0 +1,137 @@ +<% + +my %flag = ( + 'D' => 'Default', + 'F' => 'Fixed', + '' => '', +); + +my %search; +if ( $cgi->param('showdisabled') ) { + %search = (); +} else { + %search = ( 'disabled' => '' ); +} + +my @part_svc = + sort { $a->getfield('svcpart') <=> $b->getfield('svcpart') } + qsearch('part_svc', \%search ); +my $total = scalar(@part_svc); + +my %num_active_cust_svc = map { $_->svcpart => $_->num_cust_svc } @part_svc; + +if ( $cgi->param('orderby') eq 'active' ) { + @part_svc = sort { $num_active_cust_svc{$b->svcpart} <=> + $num_active_cust_svc{$a->svcpart} } @part_svc; +} elsif ( $cgi->param('orderby') eq 'svc' ) { + @part_svc = sort { lc($a->svc) cmp lc($b->svc) } @part_svc; +} + +%> +<%= header('Service Definition Listing', menubar( 'Main Menu' => $p) ) %> + +<SCRIPT> +function part_export_areyousure(href) { + if (confirm("Are you sure you want to delete this export?") == true) + window.location.href = href; +} +</SCRIPT> + + Service definitions are the templates for items you offer to your customers.<BR><BR> + +<FORM METHOD="POST" ACTION="<%= $p %>edit/part_svc.cgi"> +<A HREF="<%= $p %>edit/part_svc.cgi"><I>Add a new service definition</I></A><% if ( @part_svc ) { %> or <SELECT NAME="clone"><OPTION></OPTION> +<% foreach my $part_svc ( @part_svc ) { %> + <OPTION VALUE="<%= $part_svc->svcpart %>"><%= $part_svc->svc %></OPTION> +<% } %> +</SELECT><INPUT TYPE="submit" VALUE="Clone existing service"> +<% } %> +</FORM><BR> + +<%= $total %> service definitions +<%= $cgi->param('showdisabled') + ? do { $cgi->param('showdisabled', 0); + '( <a href="'. $cgi->self_url. '">hide disabled services</a> )'; } + : do { $cgi->param('showdisabled', 1); + '( <a href="'. $cgi->self_url. '">show disabled services</a> )'; } +%> +<% $cgi->param('showdisabled', ( 1 ^ $cgi->param('showdisabled') ) ); %> +<%= table() %> + <TR> + <TH><A HREF="<%= do { $cgi->param('orderby', 'svcpart'); $cgi->self_url } %>">#</A></TH> + <% if ( $cgi->param('showdisabled') ) { %> + <TH>Status</TH> + <% } %> + <TH><A HREF="<%= do { $cgi->param('orderby', 'svc'); $cgi->self_url; } %>">Service</A></TH> + <TH>Table</TH> + <TH><A HREF="<%= do { $cgi->param('orderby', 'active'); $cgi->self_url; } %>"><FONT SIZE=-1>Customer<BR>Services</FONT></A></TH> + <TH>Export</TH> + <TH>Field</TH> + <TH COLSPAN=2>Modifier</TH> + </TR> + +<% foreach my $part_svc ( @part_svc ) { + my $svcdb = $part_svc->svcdb; + my $svc_x = "FS::$svcdb"->new( { svcpart => $part_svc->svcpart } ); + my @dfields = $svc_x->fields; + push @dfields, 'usergroup' if $svcdb eq 'svc_acct'; #kludge + my @fields = + grep { $svc_x->pvf($_) + or $_ ne 'svcnum' && $part_svc->part_svc_column($_)->columnflag } + @dfields ; + my $rowspan = scalar(@fields) || 1; + my $url = "${p}edit/part_svc.cgi?". $part_svc->svcpart; +%> + + <TR> + <TD ROWSPAN=<%= $rowspan %>><A HREF="<%= $url %>"> + <%= $part_svc->svcpart %></A></TD> +<% if ( $cgi->param('showdisabled') ) { %> + <TD ROWSPAN=<%= $rowspan %>> + <%= $part_svc->disabled + ? '<FONT COLOR="#FF0000"><B>Disabled</B></FONT>' + : '<FONT COLOR="#00CC00"><B>Enabled</B></FONT>' + %> + </TD> +<% } %> + <TD ROWSPAN=<%= $rowspan %>><A HREF="<%= $url %>"> + <%= $part_svc->svc %></A></TD> + <TD ROWSPAN=<%= $rowspan %>> + <%= $svcdb %></TD> + <TD ROWSPAN=<%= $rowspan %>> + <FONT COLOR="#00CC00"><B><%= $num_active_cust_svc{$part_svc->svcpart} %></B></FONT> <A HREF="<%=$p%>search/<%= $svcdb %>.cgi?svcpart=<%= $part_svc->svcpart %>">active</A> + <% if ( $num_active_cust_svc{$part_svc->svcpart} ) { %> + <BR><FONT SIZE="-1">[ <A HREF="<%=$p%>edit/bulk-cust_svc.html?svcpart=<%= $part_svc->svcpart %>">change</A> ]</FONT> + <% } %> + </TD> + <TD ROWSPAN=<%= $rowspan %>><%= itable() %> +<% +# my @part_export = +map { qsearchs('part_export', { exportnum => $_->exportnum } ) } qsearch('export_svc', { svcpart => $part_svc->svcpart } ) ; + foreach my $part_export ( + map { qsearchs('part_export', { exportnum => $_->exportnum } ) } + qsearch('export_svc', { svcpart => $part_svc->svcpart } ) + ) { +%> + <TR> + <TD><A HREF="<%= $p %>edit/part_export.cgi?<%= $part_export->exportnum %>"><%= $part_export->exportnum %>: <%= $part_export->exporttype %> to <%= $part_export->machine %></A></TD></TR> +<% } %> + </TABLE></TD> + +<% my($n1)=''; + foreach my $field ( @fields ) { + my $flag = $part_svc->part_svc_column($field)->columnflag; +%> + <%= $n1 %> + <TD><%= $field %></TD> + <TD><%= $flag{$flag} %></TD> + <TD><%= $part_svc->part_svc_column($field)->columnvalue%></TD> + +<% $n1="</TR><TR>"; + } +%> + </TR> +<% } %> +</TABLE> +</BODY> +</HTML> diff --git a/httemplate/browse/part_virtual_field.cgi b/httemplate/browse/part_virtual_field.cgi new file mode 100644 index 000000000..a0009dabd --- /dev/null +++ b/httemplate/browse/part_virtual_field.cgi @@ -0,0 +1,39 @@ +<%= header('Virtual field definitions', menubar('Main Menu' => $p)) %> +<% + +my %pvfs; +my $block; +my $p2 = popurl(2); +my $dbtable; + +foreach (qsearch('part_virtual_field', {})) { + push @{ $pvfs{$_->dbtable} }, $_; +} +%> + +<% if ($cgi->param('error')) { %> + <FONT SIZE="+1" COLOR="#ff0000">Error: <%=$cgi->param('error')%></FONT> + <BR><BR> +<% } %> + +<A HREF="<%=$p2%>edit/part_virtual_field.cgi"><I>Add a new field</I></A><BR><BR> + +<% foreach $dbtable (sort { $a cmp $b } keys (%pvfs)) { %> +<H3><%=$dbtable%></H3> + +<%=table()%> +<TH><TD>Field name</TD><TD>Description</TD></TH> +<% foreach my $pvf (sort {$a->name cmp $b->name} @{ $pvfs{$dbtable} }) { %> + <TR> + <TD></TD> + <TD> + <A HREF="<%=$p2%>edit/part_virtual_field.cgi?<%=$pvf->vfieldpart%>"> + <%=$pvf->name%></A></TD> + <TD><%=$pvf->label%></TD> + </TR> +<% } %> +</TABLE> +<% } %> +</BODY> +</HTML> + diff --git a/httemplate/browse/payment_gateway.html b/httemplate/browse/payment_gateway.html new file mode 100644 index 000000000..bb7f31514 --- /dev/null +++ b/httemplate/browse/payment_gateway.html @@ -0,0 +1,70 @@ +<% + + my %search; + if ( $cgi->param('showdisabled') ) { + %search = (); + } else { + %search = ( 'disabled' => '' ); + } + +%> +<%= header('Payment gateways', menubar( + 'Main Menu' => $p, + 'Agents' => $p. 'browse/agent.cgi', +)) %> + +<A HREF="<%= $p %>edit/payment_gateway.html"><I>Add a new payment gateway</I></A><BR><BR> + +<%= $cgi->param('showdisabled') + ? do { $cgi->param('showdisabled', 0); + '( <a href="'. $cgi->self_url. '">hide disabled gateways</a> )'; } + : do { $cgi->param('showdisabled', 1); + '( <a href="'. $cgi->self_url. '">show disabled gateways</a> )'; } +%> + +<%= table() %> +<TR> + <TH COLSPAN=<%= $cgi->param('showdisabled') ? 1 : 2 %>>#</TH> + <TH>Gateway</TH> + <TH>Username</TH> + <TH>Password</TH> + <TH>Action</TH> + <TH>Options</TH> +</TR> + +<% foreach my $payment_gateway ( qsearch( 'payment_gateway', \%search ) ) { %> + + <TR> + <TD><%= $payment_gateway->gatewaynum %></TD> + <% if ( !$cgi->param('showdisabled') ) { %> + <TD><%= $payment_gateway->disabled ? 'DISABLED' : '' %></TD> + <% } %> + <TD><%= $payment_gateway->gateway_module %> + <%= !$payment_gateway->disabled + ? '<FONT SIZE="-1"> <A HREF="misc/disable-payment_gateway.cgi?'. $payment_gateway->gatewaynum.'">(disable)</A></FONT>' + : '' + %> + </TD> + <TD><%= $payment_gateway->gateway_username %></TD> + <TD> - </TD> + <TD><%= $payment_gateway->gateway_action %></TD> + <TD> + <TABLE CELLSPACING=0 CELLPADDING=0> + <% my %options = $payment_gateway->options; + foreach my $option ( keys %options ) { + %> + <TR> + <TH><%= $option %>:</TH> + <TD><%= $options{$option} %></TD> + </TR> + <% } %> + </TABLE> + </TD> + </TR> + +<% } %> + +</TABLE> +</BODY> +</HTML> + diff --git a/httemplate/browse/queue.cgi b/httemplate/browse/queue.cgi new file mode 100755 index 000000000..0afdd48d7 --- /dev/null +++ b/httemplate/browse/queue.cgi @@ -0,0 +1,5 @@ +<!-- mason kludge --> +<%= header("Job Queue", menubar( 'Main Menu' => $p, )) %> +<%= joblisting({}) %> +</BODY> +</HTML> diff --git a/httemplate/browse/rate.cgi b/httemplate/browse/rate.cgi new file mode 100644 index 000000000..c31260166 --- /dev/null +++ b/httemplate/browse/rate.cgi @@ -0,0 +1,34 @@ +<!-- mason kludge --> +<%= header("Rate plan listing", menubar( 'Main Menu' => "$p#sysadmin" )) %> +Rate plans, regions and prefixes for VoIP and call billing.<BR><BR> +<A HREF="<%=$p%>edit/rate.cgi"><I>Add a rate plan</I></A> +| <A HREF="<%=$p%>edit/rate_region.cgi"><I>Add a region</I></A> +<BR><BR> +<SCRIPT> +function rate_areyousure(href) { + if (confirm("Are you sure you want to delete this rate plan?") == true) + window.location.href = href; +} +</SCRIPT> + +<%= table() %> + <TR> + <TH COLSPAN=2>Rate plan</TH> + </TR> + +<% foreach my $rate ( sort { + $a->getfield('ratenum') <=> $b->getfield('ratenum') + } qsearch('rate',{}) ) { +%> + <TR> + <TD><A HREF="<%= $p %>edit/rate.cgi?<%= $rate->ratenum %>"><%= $rate->ratenum %></A></TD> + <TD><A HREF="<%= $p %>edit/rate.cgi?<%= $rate->ratenum %>"><%= $rate->ratename %></A></TD> + </TR> + +<% } %> + +</TABLE> +</BODY> +</HTML> + + diff --git a/httemplate/browse/router.cgi b/httemplate/browse/router.cgi new file mode 100644 index 000000000..149db4903 --- /dev/null +++ b/httemplate/browse/router.cgi @@ -0,0 +1,57 @@ +<%= header('Routers', menubar('Main Menu' => $p)) %> +<% + +my @router = qsearch('router', {}); +my $p2 = popurl(2); + +%> + +<% if ($cgi->param('error')) { %> + <FONT SIZE="+1" COLOR="#ff0000">Error: <%=$cgi->param('error')%></FONT> + <BR><BR> +<% } %> + +<% +my $hidecustomerrouters = 0; +my $hideurl = ''; +if ($cgi->param('hidecustomerrouters') eq '1') { + $hidecustomerrouters = 1; + $cgi->param('hidecustomerrouters', 0); + $hideurl = '<A HREF="' . $cgi->self_url() . '">Show customer routers</A>'; +} else { + $hidecustomerrouters = 0; + $cgi->param('hidecustomerrouters', 1); + $hideurl = '<A HREF="' . $cgi->self_url() . '">Hide customer routers</A>'; +} +%> + +<A HREF="<%=$p2%>edit/router.cgi">Add a new router</A> | <%=$hideurl%> + +<%=table()%> + <TR> + <TD><B>Router name</B></TD> + <TD><B>Address block(s)</B></TD> + </TR> +<% foreach my $router (sort {$a->routernum <=> $b->routernum} @router) { + next if $hidecustomerrouters && $router->svcnum; + my @addr_block = $router->addr_block; + if (scalar(@addr_block) == 0) { + push @addr_block, ' '; + } +%> + <TR> + <TD ROWSPAN="<%=scalar(@addr_block)+1%>"> + <A HREF="<%=$p2%>edit/router.cgi?<%=$router->routernum%>"><%=$router->routername%></A> + </TD> + </TR> + <% foreach my $block ( @addr_block ) { %> + <TR> + <TD><%=UNIVERSAL::isa($block, 'FS::addr_block') ? $block->NetAddr : ' '%></TD> + </TR> + <% } %> + </TR> +<% } %> +</TABLE> +</BODY> +</HTML> + diff --git a/httemplate/browse/svc_acct_pop.cgi b/httemplate/browse/svc_acct_pop.cgi new file mode 100755 index 000000000..44cda81ad --- /dev/null +++ b/httemplate/browse/svc_acct_pop.cgi @@ -0,0 +1,63 @@ +<!-- mason kludge --> +<% + my $accounts_sth = dbh->prepare("SELECT COUNT(*) FROM svc_acct + WHERE popnum = ? ") + or die dbh->errstr; +%> +<%= header('Access Number Listing', menubar( 'Main Menu' => $p )) %> +Points of Presence<BR><BR> +<A HREF="<%= $p %>edit/svc_acct_pop.cgi"><I>Add new Access Number</I></A><BR><BR> +<%= table() %> + <TR> + <TH></TH> + <TH>City</TH> + <TH>State</TH> + <TH>Area code</TH> + <TH>Exchange</TH> + <TH>Local</TH> + <TH>Accounts</TH> + </TR> + +<% +foreach my $svc_acct_pop ( sort { + #$a->getfield('popnum') <=> $b->getfield('popnum') + $a->state cmp $b->state || $a->city cmp $b->city + || $a->ac <=> $b->ac || $a->exch <=> $b->exch || $a->loc <=> $b->loc +} qsearch('svc_acct_pop',{}) ) { + + my $svc_acct_pop_link = $p . 'edit/svc_acct_pop.cgi?'. $svc_acct_pop->popnum; + + $accounts_sth->execute($svc_acct_pop->popnum) or die $accounts_sth->errstr; + my $num_accounts = $accounts_sth->fetchrow_arrayref->[0]; + + my $svc_acct_link = $p. 'search/svc_acct.cgi?popnum='. $svc_acct_pop->popnum; + +%> + <TR> + <TD><A HREF="<%= $svc_acct_pop_link %>"> + <%= $svc_acct_pop->popnum %></A></TD> + <TD><A HREF="<%= $svc_acct_pop_link %>"> + <%= $svc_acct_pop->city %></A></TD> + <TD><A HREF="<%= $svc_acct_pop_link %>"> + <%= $svc_acct_pop->state %></A></TD> + <TD><A HREF="<%= $svc_acct_pop_link %>"> + <%= $svc_acct_pop->ac %></A></TD> + <TD><A HREF="<%= $svc_acct_pop_link %>"> + <%= $svc_acct_pop->exch %></A></TD> + <TD><A HREF="<%= $svc_acct_pop_link %>"> + <%= $svc_acct_pop->loc %></A></TD> + <TD> + <FONT COLOR="#00CC00"><B><%= $num_accounts %></B></FONT> + <% if ( $num_accounts ) { %><A HREF="<%= $svc_acct_link %>"><% } %> + active + <% if ( $num_accounts ) { %></A><% } %> + </TD> + </TR> +<% } %> + + <TR> + </TR> + </TABLE> + </BODY> +</HTML> + |