summaryrefslogtreecommitdiff
path: root/httemplate
diff options
context:
space:
mode:
Diffstat (limited to 'httemplate')
-rw-r--r--httemplate/autohandler21
-rw-r--r--httemplate/browse/addr_block.cgi76
-rw-r--r--httemplate/browse/generic.cgi46
-rwxr-xr-xhttemplate/browse/part_svc.cgi10
-rw-r--r--httemplate/browse/part_virtual_field.cgi39
-rw-r--r--httemplate/browse/router.cgi57
-rw-r--r--httemplate/docs/ach.html12
-rw-r--r--httemplate/docs/index.html4
-rw-r--r--httemplate/docs/install.html17
-rwxr-xr-xhttemplate/docs/legacy.html3
-rw-r--r--httemplate/docs/schema.diabin14438 -> 14414 bytes
-rw-r--r--httemplate/docs/schema.html33
-rw-r--r--httemplate/docs/session.html7
-rw-r--r--httemplate/docs/upgrade-1.4.2.html1
-rw-r--r--httemplate/docs/upgrade10.html222
-rw-r--r--httemplate/docs/upgrade4.html27
-rw-r--r--httemplate/docs/upgrade5.html34
-rw-r--r--httemplate/docs/upgrade6.html66
-rwxr-xr-xhttemplate/edit/REAL_cust_pkg.cgi2
-rwxr-xr-xhttemplate/edit/cust_main.cgi31
-rwxr-xr-xhttemplate/edit/part_bill_event.cgi8
-rwxr-xr-xhttemplate/edit/part_pkg.cgi32
-rwxr-xr-xhttemplate/edit/part_svc.cgi86
-rw-r--r--httemplate/edit/part_virtual_field.cgi92
-rwxr-xr-xhttemplate/edit/process/addr_block/add.cgi20
-rwxr-xr-xhttemplate/edit/process/addr_block/allocate.cgi25
-rwxr-xr-xhttemplate/edit/process/addr_block/deallocate.cgi24
-rwxr-xr-xhttemplate/edit/process/addr_block/split.cgi19
-rwxr-xr-xhttemplate/edit/process/cust_main.cgi4
-rw-r--r--httemplate/edit/process/generic.cgi70
-rwxr-xr-xhttemplate/edit/process/part_svc.cgi2
-rw-r--r--httemplate/edit/process/router.cgi67
-rwxr-xr-xhttemplate/edit/process/svc_acct_sm.cgi34
-rw-r--r--httemplate/edit/process/svc_broadband.cgi45
-rwxr-xr-xhttemplate/edit/process/svc_external.cgi29
-rwxr-xr-xhttemplate/edit/router.cgi77
-rwxr-xr-xhttemplate/edit/svc_acct.cgi12
-rwxr-xr-xhttemplate/edit/svc_acct_sm.cgi178
-rw-r--r--httemplate/edit/svc_broadband.cgi175
-rw-r--r--httemplate/edit/svc_external.cgi105
-rwxr-xr-xhttemplate/edit/svc_forward.cgi1
-rw-r--r--httemplate/edit/svc_www.cgi12
-rw-r--r--httemplate/elements/calendar-setup.js2
-rw-r--r--httemplate/elements/calendar.js2
-rw-r--r--httemplate/elements/header.html19
-rw-r--r--httemplate/elements/menubar.html8
-rw-r--r--httemplate/elements/pager.html42
-rw-r--r--httemplate/elements/small_custview.html2
-rw-r--r--httemplate/elements/table.html8
-rwxr-xr-xhttemplate/graph/money_time-graph.cgi66
-rw-r--r--httemplate/graph/money_time.cgi113
-rw-r--r--httemplate/images/ach.pngbin29759 -> 0 bytes
-rw-r--r--httemplate/index.html16
-rwxr-xr-xhttemplate/misc/catchall.cgi2
-rwxr-xr-xhttemplate/misc/link.cgi1
-rw-r--r--httemplate/misc/meta-import.cgi64
-rw-r--r--httemplate/misc/payment.cgi209
-rw-r--r--httemplate/misc/process/meta-import.cgi178
-rw-r--r--httemplate/misc/process/payment.cgi148
-rwxr-xr-xhttemplate/search/cust_main.cgi4
-rwxr-xr-xhttemplate/search/cust_pkg.cgi2
-rw-r--r--httemplate/search/elements/search.html59
-rwxr-xr-xhttemplate/search/report_cc.cgi3
-rwxr-xr-xhttemplate/search/report_credit.cgi3
-rwxr-xr-xhttemplate/search/report_tax.cgi3
-rwxr-xr-xhttemplate/search/sql.cgi76
-rw-r--r--httemplate/search/sql.html12
-rwxr-xr-xhttemplate/search/svc_acct.cgi25
-rwxr-xr-xhttemplate/search/svc_acct_sm.cgi84
-rwxr-xr-xhttemplate/search/svc_acct_sm.html23
-rwxr-xr-xhttemplate/search/svc_domain.cgi13
-rwxr-xr-xhttemplate/view/cust_main.cgi9
-rwxr-xr-xhttemplate/view/cust_pkg.cgi2
-rwxr-xr-xhttemplate/view/svc_acct.cgi25
-rwxr-xr-xhttemplate/view/svc_acct_sm.cgi58
-rw-r--r--httemplate/view/svc_broadband.cgi142
-rwxr-xr-xhttemplate/view/svc_domain.cgi2
-rw-r--r--httemplate/view/svc_external.cgi51
-rwxr-xr-xhttemplate/view/svc_forward.cgi9
-rw-r--r--httemplate/view/svc_www.cgi11
80 files changed, 722 insertions, 2599 deletions
diff --git a/httemplate/autohandler b/httemplate/autohandler
deleted file mode 100644
index 2bd3adffd..000000000
--- a/httemplate/autohandler
+++ /dev/null
@@ -1,21 +0,0 @@
-% $m->call_next;
-<%init>
- dbh->{'private_profile'} = {} if UNIVERSAL::can(dbh, 'sprintProfile');
-</%init>
-<%filter>
-
-my $profile = '';
-if ( UNIVERSAL::can(dbh, 'sprintProfile') ) {
-
- if ( lc($r->content_type) eq 'text/html' ) {
-
- $profile = '<PRE>'. ("\n"x4096). encode_entities(dbh->sprintProfile()).
- #"\n\n". &sprintAutoProfile(). '</PRE>';
- "\n\n". '</PRE>';
- }
-
- dbh->{'private_profile'} = {};
-}
-
-s/(<\/BODY>[\s\n]*<\/HTML>[\s\n]*)$/$profile$1/i;
-</%filter>
diff --git a/httemplate/browse/addr_block.cgi b/httemplate/browse/addr_block.cgi
deleted file mode 100644
index 06ac556cf..000000000
--- a/httemplate/browse/addr_block.cgi
+++ /dev/null
@@ -1,76 +0,0 @@
-<%= 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/generic.cgi b/httemplate/browse/generic.cgi
deleted file mode 100644
index 9ac0f2391..000000000
--- a/httemplate/browse/generic.cgi
+++ /dev/null
@@ -1,46 +0,0 @@
-<%
-
-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/part_svc.cgi b/httemplate/browse/part_svc.cgi
index ef0de13cc..fd9ef3cf3 100755
--- a/httemplate/browse/part_svc.cgi
+++ b/httemplate/browse/part_svc.cgi
@@ -70,13 +70,12 @@ function part_export_areyousure(href) {
<% foreach my $part_svc ( @part_svc ) {
my $hashref = $part_svc->hashref;
my $svcdb = $hashref->{svcdb};
- my $svc_x = "FS::$svcdb"->new( { svcpart => $part_svc->svcpart } );
- my @dfields = $svc_x->fields;
+ my @dfields = fields($svcdb);
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 ;
+ grep { $_ ne 'svcnum' && $part_svc->part_svc_column($_)->columnflag }
+ @dfields;
+
my $rowspan = scalar(@fields) || 1;
my $url = "${p}edit/part_svc.cgi?$hashref->{svcpart}";
%>
@@ -119,7 +118,6 @@ map { qsearchs('part_export', { exportnum => $_->exportnum } ) } qsearch('export
<% if ( $flag eq "D" ) { print "Default"; }
elsif ( $flag eq "F" ) { print "Fixed"; }
- elsif ( not $flag ) { }
else { print "(Unknown!)"; }
%>
</TD><TD><%= $part_svc->part_svc_column($field)->columnvalue%></TD>
diff --git a/httemplate/browse/part_virtual_field.cgi b/httemplate/browse/part_virtual_field.cgi
deleted file mode 100644
index a0009dabd..000000000
--- a/httemplate/browse/part_virtual_field.cgi
+++ /dev/null
@@ -1,39 +0,0 @@
-<%= 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/router.cgi b/httemplate/browse/router.cgi
deleted file mode 100644
index 149db4903..000000000
--- a/httemplate/browse/router.cgi
+++ /dev/null
@@ -1,57 +0,0 @@
-<%= 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>&nbsp;|&nbsp;<%=$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, '&nbsp;';
- }
-%>
- <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 : '&nbsp;'%></TD>
- </TR>
- <% } %>
- </TR>
-<% } %>
-</TABLE>
-</BODY>
-</HTML>
-
diff --git a/httemplate/docs/ach.html b/httemplate/docs/ach.html
deleted file mode 100644
index b79df78fe..000000000
--- a/httemplate/docs/ach.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<HTML>
- <HEAD>
- <TITLE>
- Electronic check (ACH) information
- </TITLE>
- </HEAD>
- <BODY BGCOLOR="#e8e8e8">
- <IMG BORDER=0 SRC="../images/ach.png">
- <BR>
- <CENTER><A HREF="javascript:close()">(close window)</A></CENTER>
- </BODY>
-</HTML>
diff --git a/httemplate/docs/index.html b/httemplate/docs/index.html
index 648cb985b..1ed02850a 100644
--- a/httemplate/docs/index.html
+++ b/httemplate/docs/index.html
@@ -6,11 +6,13 @@
<img src="overview.png">
<ul>
<li><a href="install.html">New Installation</a>
+ <li><a href="upgrade4.html">Upgrading from 1.2.x to 1.2.2</a>
+ <li><a href="upgrade5.html">Upgrading from 1.2.2 to 1.2.3</a>
+ <li><a href="upgrade6.html">Upgrading from 1.2.3 to 1.3.0</a>
<li><a href="upgrade7.html">Upgrading from 1.3.0 to 1.3.1</a>
<li><a href="upgrade8.html">Upgrading from 1.3.1 to 1.4.0</a>
<li><a href="upgrade9.html">Upgrading from 1.4.0 to 1.4.1</a>
<li><a href="upgrade-1.4.2.html">Upgrading from 1.4.1 to 1.4.2</a>
- <li><a href="upgrade10.html">Upgrading from 1.4.1 (or 1.4.2?) to 1.5.0</a>
<!--
<li><a href="config.html">Configuration files</a>
!-->
diff --git a/httemplate/docs/install.html b/httemplate/docs/install.html
index 41aacc51b..7fcc4a1a2 100644
--- a/httemplate/docs/install.html
+++ b/httemplate/docs/install.html
@@ -30,7 +30,7 @@ Before installing, you need:
<li><a href="http://search.cpan.org/search?dist=HTML-Parser">HTML-Parser</a>
<li><a href="http://search.cpan.org/search?dist=libnet">libnet</a>
<li><a href="http://search.cpan.org/search?dist=Locale-Codes">Locale-Codes</a>
- <li><a href="http://search.cpan.org/search?dist=Net-Whois-Raw">Net-Whois-Raw</a>
+ <li><a href="http://search.cpan.org/search?dist=Net-Whois">Net-Whois</a>
<li><a href="http://search.cpan.org/search?dist=libwww-perl">libwww-perl</a>
<li><a href="http://search.cpan.org/search?dist=Business-CreditCard">Business-CreditCard</a>
<!-- <li><a href="http://search.cpan.org/search?dist=Data-ShowTable">Data-ShowTable</a> -->
@@ -54,8 +54,6 @@ Before installing, you need:
<li><a href="http://search.cpan.org/search?dist=HTML-Widgets-SelectLayers">HTML-Widgets-SelectLayers</a>
<li><a href="http://search.cpan.org/search?dist=Storable">Storable</a>
<!-- MyAccounts, maybe only for dev <li><a href="http://search.cpan.org/search?dist=Cache-Cache">Cache::Cache</a> -->
- <li><a href="http://search.cpan.org/search?dist=NetAddr-IP">NetAddr-IP</a>
- <li><a href="http://search.cpan.org/search?dist=Chart">Chart</a>
<li><a href="http://search.cpan.org/search?dist=Crypt-PasswdMD5">Crypt::PasswdMD5</a>
<li><a href="http://search.cpan.org/search?dist=ApacheDBI">Apache::DBI</a> <i>(optional but recommended for better webinterface performance)</i>
</ul>
@@ -131,10 +129,9 @@ cp&nbsp;htetc/global.asa&nbsp;/usr/local/etc/freeside/asp-global/global.asa
<li>Configure Apache for the Global directory and to execute .cgi files using Apache::ASP. For example:
<font size="-1"><pre>
PerlModule Apache::ASP
-# your freeside document root
&lt;Directory&nbsp;/usr/local/apache/htdocs/freeside-asp&gt;
-&lt;Files ~ (\.cgi|\.html)&gt;
-SetHandler perl-script
+&lt;Files ~ (\.cgi)&gt;
+AddHandler perl-script .cgi
PerlHandler Apache::ASP
&lt;/Files&gt;
&lt;Perl&gt;
@@ -143,15 +140,13 @@ $MLDBM::RemoveTaint = 1;
PerlSetVar&nbsp;Global&nbsp;/usr/local/etc/freeside/asp-global/
PerlSetVar&nbsp;Debug&nbsp;2
PerlSetVar&nbsp;RequestBinaryRead&nbsp;Off
-# your freeside document root
-PerlSetVar&nbsp;IncludesDir&nbsp;/usr/local/apache/htdocs/freeside-asp
&lt;/Directory&gt;
</pre></font>
</ul></td>
<td><ul>
<li>Run <tt>make masondocs</tt>
<li>Copy <tt>masondocs/</tt> to your web server's document space. (For example: <tt>/usr/local/apache/htdocs/freeside-mason</tt>)
- <li>Copy <tt>htetc/handler.pl</tt> to <tt>/usr/local/etc/freeside</tt>
+ <li>Copy <tt>htetc/handler.pl</tt> to <tt>/usr/local/etc/freeside</tt> (use htetc/handler.pl-1.0x for Mason versions before 1.10).
<li>Edit <tt>handler.pl</tt> and:
<ul>
<li> set an appropriate <tt>comp_root</tt>, such as <tt>/usr/local/apache/htdocs/freeside-mason</tt>
@@ -162,8 +157,8 @@ PerlSetVar&nbsp;IncludesDir&nbsp;/usr/local/apache/htdocs/freeside-asp
<font size="-1"><pre>
PerlModule HTML::Mason
&lt;Directory&nbsp;/usr/local/apache/htdocs/freeside-mason&gt;
-&lt;Files ~ (\.cgi|.html)&gt;
-SetHandler perl-script
+&lt;Files ~ (\.cgi)&gt;
+AddHandler perl-script .cgi
PerlHandler HTML::Mason
&lt;/Files&gt;
&lt;Perl&gt;
diff --git a/httemplate/docs/legacy.html b/httemplate/docs/legacy.html
index 94efe53af..fb45ebb6f 100755
--- a/httemplate/docs/legacy.html
+++ b/httemplate/docs/legacy.html
@@ -17,12 +17,11 @@
<li>POP mail accounts have entries in passwd only, and have a particular shell.
<li>Everything else in passwd is a shell account.
</ul>
-<!-- <li><a name="svc_acct_sm">bin/svc_acct_sm.import</a> - Import qmail ( `virtualdomains' and `rcpthosts' ), or sendmail ( `virtusertable' and `sendmail.cw' ) files. Before running bin/svc_acct_sm.import, you need <a href="../browse/part_svc.cgi">services</a> as follows:
+ <li><a name="svc_acct_sm">bin/svc_acct_sm.import</a> - Import qmail ( `virtualdomains' and `rcpthosts' ), or sendmail ( `virtusertable' and `sendmail.cw' ) files. Before running bin/svc_acct_sm.import, you need <a href="../browse/part_svc.cgi">services</a> as follows:
<ul>
<li>Domain (table svc_acct)
<li>Mail alias (table svc_acct_sm)
</ul>
--->
<li><a name="cust_main">Importing customer data</a>
<ul>
<li>Manually
diff --git a/httemplate/docs/schema.dia b/httemplate/docs/schema.dia
index 746561550..092d2f88b 100644
--- a/httemplate/docs/schema.dia
+++ b/httemplate/docs/schema.dia
Binary files differ
diff --git a/httemplate/docs/schema.html b/httemplate/docs/schema.html
index b38031777..cec122f44 100644
--- a/httemplate/docs/schema.html
+++ b/httemplate/docs/schema.html
@@ -12,9 +12,6 @@
<li>typenum - <a href="#agent_type">agent type</a>
<li>prog - (unimplemented)
<li>freq - (unimplemented)
- <li>disabled - Disabled flag, empty or 'Y'
- <li>username - Username for the Agent interface
- <li>_password - Password for the Agent interface
</ul>
<li><a name="agent_type" href="man/FS/agent_type.html">agent_type</a> - Agent types define groups of packages that you can then assign to particular agents.
<ul>
@@ -42,7 +39,7 @@
<li><a name="part_bill_event" href="man/FS/part_bill_event.html">part_bill_event</a> - Invoice event definitions
<ul>
<li>eventpart - primary key
- <li>payby - CARD, DCRD, CHEK, DCHK, LECB, BILL, or COMP
+ <li>payby - CARD, CHEK, LECB, BILL, or COMP
<li>event - event name
<li>eventcode - event action
<li>seconds - how long after the invoice date (<a href="#cust_bill">cust_bill</a>._date) events of this type are triggered
@@ -60,14 +57,6 @@
<li>recur - recurring fee
<li>sdate - starting date
<li>edate - ending date
- <li>itemdesc - Line item description (currently used only when pkgnum is 0)
- </ul>
- <li><a name="cust_bill_pkg_detail" href="man/FS/cust_bill_pkg_detail.html">cust_bill_pkg_detail</a> - Invoice line items detail
- <ul>
- <li>detailnum - primary key
- <li>pkgnum -
- <li>invnum -
- <li>detail - Detail description
</ul>
<li><a name="cust_credit" href="man/FS/cust_credit.html">cust_credit</a> - Credits. The equivalent of a negative <a href="#cust_bill">cust_bill</a> record.
<ul>
@@ -119,9 +108,8 @@
<li><i>ship_daytime</i>
<li><i>ship_night</i>
<li><i>ship_fax</i>
- <li>payby - CARD, DCHK, CHEK, DCHK, LECB, BILL, or COMP
+ <li>payby - CARD, CHEK, LECB, BILL, or COMP
<li>payinfo - card number, P.O.#, or comp issuer
- <li>paycvv - Card Verification Value, "CVV2" (also known as CVC2 or CID), the 3 or 4 digit number on the back (or front, for American Express) of the credit card
<li>paydate - expiration date
<li>payname - billing name (name on card)
<li>tax - tax exempt, Y or null
@@ -145,9 +133,6 @@
<li>tax - % rate
<li>taxclass
<li>exempt_amount
- <li>taxname - if defined, printed on invoices instead of "Tax"
- <li>setuptax - if 'Y', this tax does not apply to setup fees
- <li>recurtax - if 'Y', this tax does not apply to recurring fees
</ul>
<li><a name="cust_tax_exempt" href="man/FS/cust_tax_exempt.html">cust_tax_exempt</a> - Tax exemption record
<ul>
@@ -201,7 +186,6 @@
<li>pkgpart - <a href="#part_pkg">Package definition</a>
<li>setup - date
<li>bill - next bill date
- <li>last_bill - last bill date
<li>susp - (past) suspension date
<li>expire - (future) cancellation date
<li>cancel - (past) cancellation date
@@ -264,7 +248,7 @@
<ul>
<li>svcpart - primary key
<li>svc - name of this service
- <li>svcdb - table used for this service: svc_acct, svc_forward, svc_domain, svc_charge or svc_wo
+ <li>svcdb - table used for this service: svc_acct, svc_acct_sm, svc_forward, svc_domain, svc_charge or svc_wo
<li>disabled - Disabled flag, empty or `Y'
<!-- <li><i>table</i>__<i>field</i> - Default or fixed value for <i>field</i> in <i>table</i>
<li><i>table</i>__<i>field</i>_flag - null, D or F
@@ -283,7 +267,6 @@
<li>pkgpart - <a href="#part_pkg">Package definition</a>
<li>svcpart - <a href="#part_svc">Service definition</a>
<li>quantity - quantity of this service that this package includes
- <li>primary_svc - blank or Y: primary service
</ul>
<li><a name="export_svc" href="man/FS/export_svc.html">export_svc</a>
<ul>
@@ -364,6 +347,13 @@
<li>npa - area code
<li>nxx - exchange
</ul>
+ <li><a name="svc_acct_sm" href="man/FS/svc_acct_sm.html">svc_acct_sm</a> - <b>DEPRECIATED</b> Domain mail aliases
+ <ul>
+ <li>svcnum - <a href="#cust_svc">primary key</a>
+ <li>domsvc - <a href="#svc_domain">Domain</a> (by svcnum)
+ <li>domuid - <a href="#svc_acct">Account</a> (by uid)
+ <li>domuser - domuser @ <a href="#svc_domain">Domain</a> forwards to <a href="#svc_acct">Account</a>
+ </ul>
<li><a name="svc_domain" href="man/FS/svc_domain.html">svc_domain</a> - Domains
<ul>
<li>svcnum - <a href="#cust_svc">primary key</a>
@@ -373,9 +363,8 @@
<ul>
<li>svcnum - <a href="#cust_svc">primary key</a>
<li>srcsvc - <a href="#svc_acct">svcnum of the source of this forward</a>
- <li>src - literal source (username or full email address)
<li>dstsvc - <a href="#svc_acct">svcnum of the destination of this forward</a>
- <li>dst - literal destination (username or full email address)
+ <li>dst - foreign destination (email address) - forward not local to freeside
</ul>
<li><a name="domain_record" href="man/FS/domain_record.html">domain_record</a> - Domain zone detail
<ul>
diff --git a/httemplate/docs/session.html b/httemplate/docs/session.html
index 72e16424e..7dac5fdf7 100644
--- a/httemplate/docs/session.html
+++ b/httemplate/docs/session.html
@@ -38,14 +38,9 @@ freeside-logout username ( portnum | ip | nasnum nasport )</pre>
<li><i>username</i> is a customer username from the svc_acct table
<li><i>portnum</i>, <i>ip</i> or <i>nasport</i> and <i>nasnum</i> uniquely identify a port in the <a href="schema.html#port">port</a> database table.
</ul>
- <li>RADIUS - One of:
+ <li>RADIUS
<ul>
- <li>Run the <b>freeside-sqlradius-radacctd</b> daemon to import radacct
- records from all configured sqlradius exports:
- <tt>freeside-sqlradius-radacctd username</tt>
<li>Configure your RADIUS server's login and logout callbacks to use the command-line <tt>freeside-login</tt> and <tt>freeside-logout</tt> utilites.
- <li> <i>(incomplete)</i>Use the <b>fs_radlog/fs_radlogd</b> tool to
- import records from a text radacct file.
</ul>
</ul>
<h2>Callbacks</h2>
diff --git a/httemplate/docs/upgrade-1.4.2.html b/httemplate/docs/upgrade-1.4.2.html
index eb40df8b3..b8c5fcf7e 100644
--- a/httemplate/docs/upgrade-1.4.2.html
+++ b/httemplate/docs/upgrade-1.4.2.html
@@ -14,7 +14,6 @@
<li>Install <a href="http://search.cpan.org/search?dist=Cache-Cache">Cache::Cache</a>.
<li>Install <a href="http://search.cpan.org/search?dist=Net-SSH">Net::SSH</a> 0.08.
<li>Install <a href="http://search.cpan.org/search?dist=Crypt-PasswdMD5">Crypt::PasswdMD5</a>
- <li>Install <a href="http://search.cpan.org/search?dist=Net-Whois-Raw">Net::Whois::Raw</a>
<li>CGI.pm minimum version 2.47 is required. You will probably need to install a current CGI.pm from CPAN if you are using Perl 5.005 or earlier.
<li>If using Apache::ASP, add <code>PerlSetVar RequestBinaryRead Off</code> to your Apache configuration and make sure you are using Apache::ASP minimum version 2.55.
<li>Run <code>make aspdocs</code> or <code>make masondocs</code>.
diff --git a/httemplate/docs/upgrade10.html b/httemplate/docs/upgrade10.html
deleted file mode 100644
index 205866e73..000000000
--- a/httemplate/docs/upgrade10.html
+++ /dev/null
@@ -1,222 +0,0 @@
-<pre>
-this is incomplete
-
-install DBD::Pg 1.32 (or, if you're using a Perl version before 5.6, you could try installing DBD::Pg 1.22 with <a href="http://420.am/~ivan/DBD-Pg-1.22-fixvercmp.patch">this patch</a> and commenting out the "use DBD::Pg 1.32" at the top of DBIx/DBSchema/DBD/Pg.pm)
-install DBIx::DBSchema 0.23
-install Net::SSH 0.08
-- If using Apache::ASP, add PerlSetVar RequestBinaryRead Off and PerlSetVar IncludesDir /your/freeside/document/root/ to your Apache configuration and make sure you are using Apache::ASP minimum version 2.55.
-
-install NetAddr::IP, Chart::Base, IPC::ShareLite and Locale::SubCountry
-
-CREATE TABLE cust_bill_pkg_detail (
- detailnum serial,
- pkgnum int NOT NULL,
- invnum int NOT NULL,
- detail varchar(80),
- PRIMARY KEY (detailnum)
-);
-CREATE INDEX cust_bill_pkg_detail1 ON cust_bill_pkg_detail ( pkgnum, invnum );
-
-CREATE TABLE part_virtual_field (
- vfieldpart int NOT NULL,
- dbtable varchar(32) NOT NULL,
- name varchar(32) NOT NULL,
- check_block text,
- list_source text,
- length integer,
- label varchar(80),
- PRIMARY KEY (vfieldpart)
-);
-
-CREATE TABLE virtual_field (
- recnum integer NOT NULL,
- vfieldpart integer NOT NULL,
- value varchar(128) NOT NULL,
- PRIMARY KEY (vfieldpart, recnum)
-);
-
-CREATE TABLE router (
- routernum serial,
- routername varchar(80),
- svcnum int,
- PRIMARY KEY (routernum)
-);
-
-CREATE TABLE part_svc_router (
- svcpart int NOT NULL,
- routernum int NOT NULL
-);
-
-CREATE TABLE addr_block (
- blocknum serial,
- routernum int NOT NULL,
- ip_gateway varchar(15) NOT NULL,
- ip_netmask int NOT NULL,
- PRIMARY KEY (blocknum)
-);
-CREATE UNIQUE INDEX addr_block1 ON addr_block ( blocknum, routernum );
-
-CREATE TABLE svc_broadband (
- svcnum int NOT NULL,
- blocknum int NOT NULL,
- speed_up int NOT NULL,
- speed_down int NOT NULL,
- ip_addr varchar(15),
- PRIMARY KEY (svcnum)
-);
-
-CREATE TABLE acct_snarf (
- snarfnum serial,
- svcnum int NOT NULL,
- machine varchar(255) NULL,
- protocol varchar(80) NULL,
- username varchar(80) NULL,
- _password varchar(80) NULL,
- PRIMARY KEY (snarfnum)
-);
-CREATE INDEX acct_snarf1 ON acct_snarf ( svcnum );
-
-CREATE TABLE svc_external (
- svcnum int NOT NULL,
- id int NOT NULL,
- title varchar(80),
- PRIMARY KEY (svcnum)
-);
-
-CREATE TABLE part_pkg_temp (
- pkgpart serial NOT NULL,
- pkg varchar(80) NOT NULL,
- "comment" varchar(80) NOT NULL,
- setup text NULL,
- freq varchar(80) NOT NULL,
- recur text NULL,
- setuptax char(1) NULL,
- recurtax char(1) NULL,
- plan varchar(80) NULL,
- plandata text NULL,
- disabled char(1) NULL,
- taxclass varchar(80) NULL,
- PRIMARY KEY (pkgpart)
-);
-INSERT INTO part_pkg_temp SELECT * from part_pkg;
-DROP TABLE part_pkg;
-ALTER TABLE part_pkg_temp RENAME TO part_pkg;
-CREATE INDEX part_pkg1 ON part_pkg(disabled);
-
-On modern Pg:
-ALTER TABLE part_pkg DROP CONSTRAINT part_pkg_temp_pkey;
-ALTER TABLE part_pkg ADD PRIMARY KEY (pkgpart);
-select setval('public.part_pkg_temp_pkgpart_seq', ( select max(pkgpart) from part_pkg) );
-
-Or on Pg versions that don't support DROP CONSTRAINT and ADD PRIMARY KEY (tested on 7.1 so far):
-DROP INDEX part_pkg_temp_pkey;
-CREATE UNIQUE INDEX part_pkg_pkey ON part_pkg (pkgpart);
-select setval('part_pkg_temp_pkgpart_seq', ( select max(pkgpart) from part_pkg) );
-
-CREATE TABLE h_part_pkg_temp (
- historynum serial NOT NULL,
- history_date int,
- history_user varchar(80) NOT NULL,
- history_action varchar(80) NOT NULL,
- pkgpart int NOT NULL,
- pkg varchar(80) NOT NULL,
- "comment" varchar(80) NOT NULL,
- setup text NULL,
- freq varchar(80) NOT NULL,
- recur text NULL,
- setuptax char(1) NULL,
- recurtax char(1) NULL,
- plan varchar(80) NULL,
- plandata text NULL,
- disabled char(1) NULL,
- taxclass varchar(80) NULL,
- PRIMARY KEY (historynum)
-);
-INSERT INTO h_part_pkg_temp SELECT * from h_part_pkg;
-DROP TABLE h_part_pkg;
-ALTER TABLE h_part_pkg_temp RENAME TO h_part_pkg;
-CREATE INDEX h_part_pkg1 ON h_part_pkg(disabled);
-
-On modern Pg:
-ALTER TABLE h_part_pkg DROP CONSTRAINT h_part_pkg_temp_pkey;
-ALTER TABLE h_part_pkg ADD PRIMARY KEY (historynum);
-select setval('public.h_part_pkg_temp_historynum_seq', ( select max(historynum) from h_part_pkg) );
-
-Or on Pg versions that don't support DROP CONSTRAINT and ADD PRIMARY KEY (tested on 7.1 so far):
-DROP INDEX h_part_pkg_temp_pkey;
-CREATE UNIQUE INDEX h_part_pkg_pkey ON h_part_pkg (historynum);
-select setval('h_part_pkg_temp_historynum_seq', ( select max(historynum) from h_part_pkg) );
-
-
-DROP INDEX cust_bill_pkg1;
-
-ALTER TABLE cust_bill_pkg ADD itemdesc varchar(80) NULL;
-ALTER TABLE h_cust_bill_pkg ADD itemdesc varchar(80) NULL;
-ALTER TABLE cust_main_county ADD taxname varchar(80) NULL;
-ALTER TABLE h_cust_main_county ADD taxname varchar(80) NULL;
-ALTER TABLE cust_main_county ADD setuptax char(1) NULL;
-ALTER TABLE h_cust_main_county ADD setuptax char(1) NULL;
-ALTER TABLE cust_main_county ADD recurtax char(1) NULL;
-ALTER TABLE h_cust_main_county ADD recurtax char(1) NULL;
-ALTER TABLE cust_pkg ADD last_bill int NULL;
-ALTER TABLE h_cust_pkg ADD last_bill int NULL;
-ALTER TABLE agent ADD disabled char(1) NULL;
-ALTER TABLE h_agent ADD disabled char(1) NULL;
-ALTER TABLE agent ADD username varchar(80) NULL;
-ALTER TABLE h_agent ADD username varchar(80) NULL;
-ALTER TABLE agent ADD _password varchar(80) NULL;
-ALTER TABLE h_agent ADD _password varchar(80) NULL;
-ALTER TABLE cust_main ADD paycvv varchar(4) NULL;
-ALTER TABLE h_cust_main ADD paycvv varchar(4) NULL;
-ALTER TABLE part_referral ADD disabled char(1) NULL;
-ALTER TABLE h_part_referral ADD disabled char(1) NULL;
-CREATE INDEX part_referral1 ON part_referral ( disabled );
-ALTER TABLE pkg_svc ADD primary_svc char(1) NULL;
-ALTER TABLE h_pkg_svc ADD primary_svc char(1) NULL;
-ALTER TABLE svc_forward ADD src varchar(255) NULL;
-ALTER TABLE h_svc_forward ADD src varchar(255) NULL;
-
-On recent Pg versions:
-
-ALTER TABLE svc_forward ALTER COLUMN srcsvc DROP NOT NULL;
-ALTER TABLE h_svc_forward ALTER COLUMN srcsvc DROP NOT NULL;
-ALTER TABLE svc_forward ALTER COLUMN dstsvc DROP NOT NULL;
-ALTER TABLE h_svc_forward ALTER COLUMN dstsvc DROP NOT NULL;
-
-Or on Pg versions that don't support DROP NOT NULL (tested on 7.1 and 7.2 so far):
-UPDATE pg_attribute SET attnotnull = FALSE WHERE ( attname = 'srcsvc' OR attname = 'dstsvc' ) AND ( attrelid = ( SELECT oid FROM pg_class WHERE relname = 'svc_forward' ) OR attrelid = ( SELECT oid FROM pg_class WHERE relname = 'h_svc_forward' ) );
-
-If you created your database with a version before 1.4.2, dump database, edit:
-- cust_main and h_cust_main: increase otaker from 8 to 32
-- cust_main and h_cust_main: change ss from char(11) to varchar(11) ( "character(11)" to "character varying(11)" )
-- cust_credit and h_cust_credit: increase otaker from 8 to 32
-- cust_pkg and h_cust_pkg: increase otaker from 8 to 32
-- cust_refund and h_cust_refund: increase otaker from 8 to 32
-- domain_record and h_domain_record: increase reczone from 80 to 255
-- domain_record and h_domain_record: change rectype from char to varchar ( "character(5)" to "character varying(5)" )
-- domain_record and h_domain_record: increase recdata from 80 to 255
-then reload
-
-optionally:
-
- CREATE INDEX cust_main6 ON cust_main ( daytime );
- CREATE INDEX cust_main7 ON cust_main ( night );
- CREATE INDEX cust_main8 ON cust_main ( fax );
- CREATE INDEX cust_main9 ON cust_main ( ship_daytime );
- CREATE INDEX cust_main10 ON cust_main ( ship_night );
- CREATE INDEX cust_main11 ON cust_main ( ship_fax );
- CREATE INDEX agent2 ON agent ( disabled );
- CREATE INDEX part_bill_event2 ON part_bill_event ( disabled );
- CREATE INDEX cust_pay4 ON cust_pay (_date);
-
- serial columns
-
-mandatory again:
-
-dbdef-create username
-create-history-tables username cust_bill_pkg_detail router part_svc_router addr_block svc_broadband acct_snarf svc_external
-dbdef-create username
-
-apache - fix <Files> sections to include .html also
-
-</pre>
diff --git a/httemplate/docs/upgrade4.html b/httemplate/docs/upgrade4.html
new file mode 100644
index 000000000..1d70f8b73
--- /dev/null
+++ b/httemplate/docs/upgrade4.html
@@ -0,0 +1,27 @@
+<head>
+ <title>Upgrading to 1.2.2</title>
+</head>
+<body>
+<h1>Upgrading to 1.2.2 from 1.2.x</h1>
+<ul>
+ <li>If migrating from 1.0.0, see these <a href="upgrade.html">instructions</a> first.
+ <li>If migrating from less than 1.1.4, see these <a href="upgrade2.html">instructions</a> first.
+ <li>If migrating from less than 1.2.0, see these <a href="upgrade3.html">instructions</a> first.
+ <li>Back up your data and current Freeside installation.
+ <li>Install the Perl modules <a href="http://www.perl.com/CPAN/modules/by-module/Locale/">Locale-Codes</a> and <a href="http://www.perl.com/CPAN/modules/by-module/Net/">Net-Whois</a>.
+ <li>Apply the following changes to your database:
+<pre>
+ALTER TABLE cust_pay_batch CHANGE exp exp VARCHAR(11);
+</pre>
+ <li>Copy or symlink htdocs to the new copy.
+ <li>Remove the symlink or directory <i>(your_site_perl_directory)</i>/FS.
+ <li>Change to the FS directory in the new tarball, and build and install the
+ Perl modules:
+ <pre>
+$ cd FS/
+$ perl Makefile.PL
+$ make
+$ su
+# make install</pre>
+ <li>Run bin/dbdef-create. This file uses MySQL-specific syntax. If you are running a different database engine you will need to modify it slightly.
+</body>
diff --git a/httemplate/docs/upgrade5.html b/httemplate/docs/upgrade5.html
new file mode 100644
index 000000000..3f3431653
--- /dev/null
+++ b/httemplate/docs/upgrade5.html
@@ -0,0 +1,34 @@
+<head>
+ <title>Upgrading to 1.3.0</title>
+</head>
+<body>
+<h1>Upgrading to 1.2.3 from 1.2.2</h1>
+<ul>
+ <li>If migrating from 1.0.0, see these <a href="upgrade.html">instructions</a> first.
+ <li>If migrating from less than 1.1.4, see these <a href="upgrade2.html">instructions</a> first.
+ <li>If migrating from less than 1.2.0, see these <a href="upgrade3.html">instructions</a> first.
+ <li>If migrating from less than 1.2.2, see these <a href="upgrade4.html">instructions</a> first.
+ <li>Back up your data and current Freeside installation.
+ <li>Apply the following changes to your database:
+<pre>
+ALTER TABLE svc_acct_pop ADD loc CHAR(4);
+CREATE TABLE prepay_credit (
+ prepaynum int NOT NULL,
+ identifier varchar(80) NOT NULL,
+ amount decimal(10,2) NOT NULL,
+ PRIMARY KEY (prepaynum),
+ INDEX (identifier)
+);
+</pre>
+ <li>Copy or symlink htdocs to the new copy.
+ <li>Remove the symlink or directory <i>(your_site_perl_directory)</i>/FS.
+ <li>Change to the FS directory in the new tarball, and build and install the
+ Perl modules:
+ <pre>
+$ cd FS/
+$ perl Makefile.PL
+$ make
+$ su
+# make install</pre>
+ <li>Run bin/dbdef-create. This file uses MySQL-specific syntax. If you are running a different database engine you will need to modify it slightly.
+</body>
diff --git a/httemplate/docs/upgrade6.html b/httemplate/docs/upgrade6.html
new file mode 100644
index 000000000..dc82975f3
--- /dev/null
+++ b/httemplate/docs/upgrade6.html
@@ -0,0 +1,66 @@
+<head>
+ <title>Upgrading to 1.3.0</title>
+</head>
+<body>
+<h1>Upgrading to 1.3.0 from 1.2.3</h1>
+<ul>
+ <li>If migrating from 1.0.0, see these <a href="upgrade.html">instructions</a> first.
+ <li>If migrating from less than 1.1.4, see these <a href="upgrade2.html">instructions</a> first.
+ <li>If migrating from less than 1.2.0, see these <a href="upgrade3.html">instructions</a> first.
+ <li>If migrating from less than 1.2.2, see these <a href="upgrade4.html">instructions</a> first.
+ <li>If migrating from less than 1.2.3, see these <a href="upgrade5.html">instructions</a> first.
+ <li>Back up your data and current Freeside installation.
+ <li>As 1.3.0 requires transactions, <b>MySQL's default <a href="http://www.mysql.com/doc/M/y/MyISAM.html">MyISAM</a> and <a href="http://www.mysql.com/doc/I/S/ISAM.html">ISAM</a> table types are no longer supported</b>. Converting to <a href="http://www.postgresql.org/">PostgreSQL</a> is recommended. If you really want to use MySQL, convert your tables to one of the <a href="http://www.mysql.com/doc/T/a/Table_types.html">transaction-safe table types</a> such as <a href="http://www.mysql.com/doc/B/D/BDB.html">BDB</a>.
+ <li>Copy the <i>invoice_template</i> file from the <i>conf/</i> directory in the distribution to your <a href="config.html">configuration directory</a>.
+ <li>Install the <a href="http://search.cpan.org/search?dist=Text-Template">Text-Template</a>, <a href="http://search.cpan.org/search?dist=DBIx-DBSchema">DBIx-DBSchema</a>, <a href="http://search.cpan.org/search?dist=Net-SSH">Net-SSH</a>, <a href="http://search.cpan.org/search?dist=String-ShellQuote">String-ShellQuote</a> and <a href="http://search.cpan.org/search?dist=Net-SCP">Net-SCP</a> Perl modules.
+ <li>Apply the following changes to your database:
+<pre>
+CREATE TABLE domain_record (
+ recnum int NOT NULL,
+ svcnum int NOT NULL,
+ reczone varchar(80) NOT NULL,
+ recaf char(2) NOT NULL,
+ rectype char(5) NOT NULL,
+ recdata varchar(80) NOT NULL,
+ PRIMARY KEY (recnum)
+);
+CREATE TABLE svc_www (
+ svcnum int NOT NULL,
+ recnum int NOT NULL,
+ usersvc int NOT NULL,
+ PRIMARY KEY (svcnum)
+);
+ALTER TABLE part_svc ADD svc_www__recnum varchar(80) NULL;
+ALTER TABLE part_svc ADD svc_www__recnum_flag char(1) NULL;
+ALTER TABLE part_svc ADD svc_www__usersvc varchar(80) NULL;
+ALTER TABLE part_svc ADD svc_www__uesrsvc_flag char(1) NULL;
+ALTER TABLE svc_acct CHANGE _password _password varchar(50) NULL;
+ALTER TABLE svc_acct ADD seconds integer NULL;
+ALTER TABLE part_svc ADD svc_acct__seconds integer NULL;
+ALTER TABLE part_svc ADD svc_acct__seconds_flag char(1) NULL;
+ALTER TABLE prepay_credit ADD seconds integer NULL;
+
+</pre>
+ <li>If your database supports dropping columns:
+<pre>
+ALTER TABLE cust_bill DROP owed;
+ALTER TABLE cust_credit DROP credited;
+</pre>
+ Or, if your database does not support dropping columns, you can do this:
+<pre>
+ALTER TABLE cust_bill CHANGE owed depriciated decimal(10,2);
+ALTER TABLE cust_credit CHANGE credited depriciated2 decimal(10,2);
+</pre>
+
+ <li>Copy or symlink htdocs to the new copy.
+ <li>Remove the symlink or directory <i>(your_site_perl_directory)</i>/FS.
+ <li>Change to the FS directory in the new tarball, and build and install the
+ Perl modules:
+ <pre>
+$ cd FS/
+$ perl Makefile.PL
+$ make
+$ su
+# make install</pre>
+ <li>Run bin/dbdef-create.
+</body>
diff --git a/httemplate/edit/REAL_cust_pkg.cgi b/httemplate/edit/REAL_cust_pkg.cgi
index d9b7579f6..ef5a6a1e9 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.7 2003-11-19 12:21:09 ivan Exp $ -->
+# <!-- $Id: REAL_cust_pkg.cgi,v 1.4.4.3 2003-11-19 12:21:10 ivan Exp $ -->
my $error ='';
my $pkgnum = '';
diff --git a/httemplate/edit/cust_main.cgi b/httemplate/edit/cust_main.cgi
index f9c80d82d..fc825af75 100755
--- a/httemplate/edit/cust_main.cgi
+++ b/httemplate/edit/cust_main.cgi
@@ -372,7 +372,7 @@ if ( $payby_default eq 'HIDE' ) {
print qq!<INPUT TYPE="hidden" NAME="invoicing_list" VALUE="!.
join(', ', $cust_main->invoicing_list). '">';
- foreach my $payby (qw( CARD DCRD CHEK DCHK LECB BILL COMP )) {
+ foreach my $payby (qw( CARD CHEK LECB BILL COMP )) {
foreach my $field (qw( payinfo payname )) {
print qq!<INPUT TYPE="hidden" NAME="${payby}_$field" VALUE="!.
$cust_main->getfield($field). '">';
@@ -411,7 +411,7 @@ 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>", '<SCRIPT>
+ "</TABLE>", '<script language="JavaScript"><!--
var mywindow = -1;
function myopen(filename,windowname,properties) {
myclose();
@@ -422,17 +422,8 @@ if ( $payby_default eq 'HIDE' ) {
mywindow.close();
mywindow = -1;
}
- var achwindow = -1;
- function achopen(filename,windowname,properties) {
- achclose();
- achwindow = window.open(filename,windowname,properties);
- }
- function achclose() {
- if ( achwindow != -1 )
- achwindow.close();
- achwindow = -1;
- }
- </SCRIPT>',
+
+ //--></script>',
&table("#cccccc"), "<TR>";
my($payinfo, $payname)=(
@@ -441,10 +432,8 @@ if ( $payby_default eq 'HIDE' ) {
);
my %payby = (
- 'CARD' => qq!Credit card (automatic)<BR>${r}<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR>${r}Exp !. expselect("CARD"). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!,
- 'DCRD' => qq!Credit card (on-demand)<BR>${r}<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR>${r}Exp !. expselect("DCRD"). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!,
- 'CHEK' => qq!Electronic check (automatic)<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE=""><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9> (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)<INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!,
- 'DCHK' => qq!Electronic check (on-demand)<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE=""><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9> (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)<INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!,
+ 'CARD' => qq!Credit card<BR>${r}<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR>${r}Exp !. expselect("CARD"). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!,
+ 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE=""><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!,
'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!,
'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR><INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"><INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037">Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="">!,
'COMP' => qq!Complimentary<BR>${r}Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR>${r}Exp !. expselect("COMP"),
@@ -459,10 +448,8 @@ if ( $payby_default eq 'HIDE' ) {
my( $account, $aba ) = split('@', $payinfo);
my %paybychecked = (
- 'CARD' => qq!Credit card (automatic)<BR>${r}<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR>${r}Exp !. expselect("CARD", $cust_main->paydate). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!,
- 'DCRD' => qq!Credit card (on-demand)<BR>${r}<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR>${r}Exp !. expselect("DCRD", $cust_main->paydate). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!,
- 'CHEK' => qq!Electronic check (automatic)<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account"><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9> (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)<INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!,
- 'DCHK' => qq!Electronic check (on-demand)<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account"><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9> (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)<INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="$payname">!,
+ 'CARD' => qq!Credit card<BR>${r}<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR>${r}Exp !. expselect("CARD", $cust_main->paydate). qq!<BR>${r}Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!,
+ 'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account"><BR>${r}ABA/Routing number <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!,
'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!,
'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR><INPUT TYPE="hidden" NAME="BILL_month" VALUE="12"><INPUT TYPE="hidden" NAME="BILL_year" VALUE="2037">Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!,
'COMP' => qq!Complimentary<BR>${r}Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR>${r}Exp !. expselect("COMP", $cust_main->paydate),
@@ -478,7 +465,7 @@ if ( $payby_default eq 'HIDE' ) {
$cust_main->payby($payby_default) unless $cust_main->payby;
- for (qw(CARD DCRD CHEK DCHK LECB BILL COMP)) {
+ for (qw(CARD CHEK LECB BILL COMP)) {
print qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!;
if ($cust_main->payby eq "$_") {
print qq! CHECKED> $paybychecked{$_}</TD>!;
diff --git a/httemplate/edit/part_bill_event.cgi b/httemplate/edit/part_bill_event.cgi
index 48ed7916b..34c8e7202 100755
--- a/httemplate/edit/part_bill_event.cgi
+++ b/httemplate/edit/part_bill_event.cgi
@@ -41,7 +41,7 @@ print ntable("#cccccc",2), <<END;
<TR><TD ALIGN="right">Payby</TD><TD><SELECT NAME="payby">
END
-for (qw(CARD DCRD CHEK DCHK LECB BILL COMP)) {
+for (qw(CARD CHEK LECB BILL COMP)) {
print qq!<OPTION VALUE="$_"!;
if ($part_bill_event->payby eq $_) {
print " SELECTED>$_</OPTION>";
@@ -114,6 +114,12 @@ tie my %events, 'Tie::IxHash',
'weight' => 30,
},
+ 'realtime-card-cybercash' => {
+ 'name' => '(<b>deprecated</b>) Run card with <a href="http://www.cybercash.com/cashregister">CyberCash CashRegister</a> realtime gateway',
+ 'code' => '$cust_bill->realtime_card_cybercash();',
+ 'weight' => 30,
+ },
+
'realtime-lec' => {
'name' => 'Run phone bill ("LEC") billing with a <a href="http://search.cpan.org/search?mode=module&query=Business%3A%3AOnlinePayment">Business::OnlinePayment</a> realtime gateway',
'code' => '$cust_bill->realtime_lec();',
diff --git a/httemplate/edit/part_pkg.cgi b/httemplate/edit/part_pkg.cgi
index 8416b3546..9271222ad 100755
--- a/httemplate/edit/part_pkg.cgi
+++ b/httemplate/edit/part_pkg.cgi
@@ -445,7 +445,7 @@ tie my %plans, 'Tie::IxHash',
},
'fieldorder' => [qw( setup_fee recur_flat recur_included_hours recur_hourly_charge recur_included_input recur_input_charge recur_included_output recur_output_charge recur_included_total recur_total_charge )],
'setup' => 'what.setup_fee.value',
- '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 ;\'',
+ '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; \' + what.recur_flat.value + \' + \' + what.recur_hourly_charge.value + \' * $hours + \' + what.recur_input_charge.value + \' * $input + \' + what.recur_output_charge.value + \' * $output + \' + what.recur_total_charge.value + \' * $total ;\'',
},
'sql_generic' => {
@@ -483,36 +483,6 @@ tie my %plans, 'Tie::IxHash',
#'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 ); }
diff --git a/httemplate/edit/part_svc.cgi b/httemplate/edit/part_svc.cgi
index 6868ffd65..683bf9ec5 100755
--- a/httemplate/edit/part_svc.cgi
+++ b/httemplate/edit/part_svc.cgi
@@ -50,10 +50,9 @@ Disable new orders <INPUT TYPE="checkbox" NAME="disabled" VALUE="Y"<%= $hashref-
Services are items you offer to your customers.
<UL><LI>svc_acct - Shell accounts, POP mailboxes, SLIP/PPP and ISDN accounts
<LI>svc_domain - Domains
+ <LI>svc_acct_sm - <B>deprecated</B> (use svc_forward for new installations) Virtual domain mail aliasing.
<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)
-->
@@ -66,9 +65,6 @@ blank <B>slipip</B> as well as a fixed shell something like <B>/bin/true</B> or
<BR><BR>
<%
-
-my %vfields;
-
#these might belong somewhere else for other user interfaces
#pry need to eventually create stuff that's shared amount UIs
my %defs = (
@@ -108,57 +104,34 @@ my %defs = (
'svc_domain' => {
'domain' => 'Domain',
},
+ 'svc_acct_sm' => {
+ 'domuser' => 'domuser@virtualdomain.com',
+ 'domuid' => 'UID where domuser@virtualdomain.com mail is forwarded',
+ 'domsvc' => 'svcnum from svc_domain for virtualdomain.com',
+ },
'svc_forward' => {
'srcsvc' => 'service from which mail is to be forwarded',
'dstsvc' => 'service to which mail is to be forwarded',
'dst' => 'someone@another.domain.com to use when dstsvc is 0',
},
-# 'svc_charge' => {
-# 'amount' => 'amount',
-# },
-# 'svc_wo' => {
-# 'worker' => 'Worker',
-# '_date' => 'Date',
-# },
+ 'svc_charge' => {
+ 'amount' => 'amount',
+ },
+ 'svc_wo' => {
+ 'worker' => 'Worker',
+ '_date' => 'Date',
+ },
'svc_www' => {
#'recnum' => '',
#'usersvc' => '',
},
- 'svc_broadband' => {
- 'speed_down' => 'Maximum download speed for this service in Kbps. 0 denotes unlimited.',
- 'speed_up' => 'Maximum upload speed for this service in Kbps. 0 denotes unlimited.',
- 'ip_addr' => 'IP address. Leave blank for automatic assignment.',
- 'blocknum' => 'Address block.',
- },
- 'svc_external' => {
- #'id' => '',
- #'title' => '',
- },
);
- 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
- my $pvf = $self->pvf($field);
- my @list = $pvf->list;
- if (scalar @list) {
- $defs{$svcdb}->{$field} = { desc => $pvf->label,
- type => 'select',
- select_list => \@list };
- } else {
- $defs{$svcdb}->{$field} = $pvf->label;
- } #endif
- $vfields{$svcdb}->{$field} = $pvf;
- warn "\$vfields{$svcdb}->{$field} = $pvf";
- } #next $field
- } #next $svcdb
-
my @dbs = $hashref->{svcdb}
? ( $hashref->{svcdb} )
- : qw( svc_acct svc_domain svc_forward svc_www svc_broadband svc_external );
+ : qw( svc_acct svc_domain svc_acct_sm svc_forward svc_www );
- tie my %svcdb, 'Tie::IxHash', map { $_=>$_ } grep dbdef->table($_), @dbs;
+ tie my %svcdb, 'Tie::IxHash', map { $_=>$_ } @dbs;
my $widget = new HTML::Widgets::SelectLayers(
#'selected_layer' => $p_svcdb,
'selected_layer' => $hashref->{svcdb} || 'svc_acct',
@@ -224,27 +197,19 @@ my %defs = (
qq!<INPUT TYPE="radio" NAME="${layer}__${field}_flag" VALUE="D"!.
' CHECKED'x($flag eq 'D'). ">Default ".
qq!<INPUT TYPE="radio" NAME="${layer}__${field}_flag" VALUE="F"!.
- ' CHECKED'x($flag eq 'F'). ">Fixed ";
- $html .= '<BR>';
+ ' CHECKED'x($flag eq 'F'). ">Fixed ".
+ '<BR>';
}
if ( ref($def) ) {
if ( $def->{type} eq 'select' ) {
$html .= qq!<SELECT NAME="${layer}__${field}">!;
$html .= '<OPTION> </OPTION>' unless $value;
- if ( $def->{select_table} ) {
- foreach my $record ( qsearch( $def->{select_table}, {} ) ) {
- my $rvalue = $record->getfield($def->{select_key});
- $html .= qq!<OPTION VALUE="$rvalue"!.
- ( $rvalue==$value ? ' SELECTED>' : '>' ).
- $record->getfield($def->{select_label}). '</OPTION>';
- } #next $record
- } else { # select_list
- foreach my $item ( @{$def->{select_list}} ) {
- $html .= qq!<OPTION VALUE="$item"!.
- ( $item eq $value ? ' SELECTED>' : '>' ).
- $item. '</OPTION>';
- } #next $item
- } #endif
+ foreach my $record ( qsearch( $def->{select_table}, {} ) ) {
+ my $rvalue = $record->getfield($def->{select_key});
+ $html .= qq!<OPTION VALUE="$rvalue"!.
+ ( $rvalue==$value ? ' SELECTED>' : '>' ).
+ $record->getfield($def->{select_label}). '</OPTION>';
+ }
$html .= '</SELECT>';
} elsif ( $def->{type} eq 'radius_usergroup_selector' ) {
$html .= FS::svc_acct::radius_usergroup_selector(
@@ -259,11 +224,6 @@ my %defs = (
$html .=
qq!<INPUT TYPE="text" NAME="${layer}__${field}" VALUE="$value">!;
}
-
- if($vfields{$layer}->{$field}) {
- $html .= qq!<BR><INPUT TYPE="radio" NAME="${layer}__${field}_flag" VALUE="X"!.
- ' CHECKED'x($flag eq 'X'). ">Excluded ";
- }
$html .= "</TD></TR>\n";
}
$part_svc->svcpart('') if $clone; #undone
diff --git a/httemplate/edit/part_virtual_field.cgi b/httemplate/edit/part_virtual_field.cgi
deleted file mode 100644
index fb10321e8..000000000
--- a/httemplate/edit/part_virtual_field.cgi
+++ /dev/null
@@ -1,92 +0,0 @@
-<!-- mason kludge -->
-<%
-my ($vfieldpart, $part_virtual_field);
-
-if ( $cgi->param('error') ) {
- $part_virtual_field = new FS::part_virtual_field ( {
- map { $_, scalar($cgi->param($_)) } fields('part_virtual_field')});
- $vfieldpart = $part_virtual_field->vfieldpart;
-} else {
- my($query) = $cgi->keywords;
- if ( $query =~ /^(\d+)$/ ) { #editing
- $vfieldpart=$1;
- $part_virtual_field=qsearchs('part_virtual_field',
- {'vfieldpart' => $vfieldpart})
- or die "Unknown vfieldpart!";
-
- } else { #adding
- $part_virtual_field = new FS::part_virtual_field({});
- }
-}
-my $action = $part_virtual_field->vfieldpart ? 'Edit' : 'Add';
-
-my $p1 = popurl(1);
-print header("$action Virtual Field Definition", '');
-
-print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $cgi->param('error'),
- "</FONT>"
- if $cgi->param('error');
-%>
-<FORM ACTION="<%=$p1%>process/generic.cgi" METHOD="POST">
-
-<INPUT TYPE="hidden" NAME="table" VALUE="part_virtual_field">
-<INPUT TYPE="hidden" NAME="redirect_ok"
- VALUE="<%=popurl(2)%>browse/part_virtual_field.cgi">
-<INPUT TYPE="hidden" NAME="vfieldpart" VALUE="<%=
- $vfieldpart%>">
-Field #<B><%=$vfieldpart or "(NEW)"%></B><BR><BR>
-
-<%=ntable("#cccccc",2)%>
- <TR>
- <TD ALIGN="right">Name</TD>
- <TD><INPUT TYPE="text" NAME="name" MAXLENGTH=15 VALUE="<%=
- $part_virtual_field->name%>"></TD>
- </TR>
- <TR>
- <TD ALIGN="right">Table</TD>
- <TD><% if ($action eq 'Add') { %>
- <SELECT SIZE=1 NAME="dbtable"><%
- my $dbdef = dbdef; # ick
- foreach my $dbtable (sort { $a cmp $b } $dbdef->tables) {
- if ($dbtable !~ /^h_/
- and $dbdef->table($dbtable)->primary_key) { %>
- <OPTION VALUE="<%=$dbtable%>"><%=$dbtable%></OPTION><%
- }
- }
- %></SELECT><%
- } else { # Edit
- %><%=$part_virtual_field->dbtable%>
- <INPUT TYPE="hidden" NAME="dbtable" VALUE="<%=$part_virtual_field->dbtable%>">
- <% } %>
- </TD>
- <TR>
- <TD ALIGN="right">Label</TD>
- <TD><INPUT TYPE="text" NAME="label" MAXLENGTH="20" VALUE="<%=
- $part_virtual_field->label%>"></TD>
- </TR>
- <TR>
- <TD ALIGN="right">Length</TD>
- <TD><INPUT TYPE="text" NAME="length" MAXLENGTH=4 VALUE="<%=
- $part_virtual_field->length%>"></TD>
- </TR>
- <TR>
- <TD ALIGN="right">Check</TD>
- <TD><TEXTAREA COLS="20" ROWS="4" NAME="check_block"><%=
- $part_virtual_field->check_block%></TEXTAREA></TD>
- </TR>
- <TR>
- <TD ALIGN="right">List source</TD>
- <TD><TEXTAREA COLS="20" ROWS="4" NAME="list_source"><%=
- $part_virtual_field->list_source%></TEXTAREA></TD>
- </TR>
-</TABLE><BR><INPUT TYPE="submit" VALUE="Submit">
-
-</FORM>
-
-<BR><BR>
-<FONT SIZE=-2>If you don't understand what <I>check_block</I> and
-<I>list_source</I> mean, <B>LEAVE THEM BLANK</B>. We mean it.</FONT>
-
-
-</BODY>
-</HTML>
diff --git a/httemplate/edit/process/addr_block/add.cgi b/httemplate/edit/process/addr_block/add.cgi
deleted file mode 100755
index 34d799ccd..000000000
--- a/httemplate/edit/process/addr_block/add.cgi
+++ /dev/null
@@ -1,20 +0,0 @@
-<%
-
-my $error = '';
-my $ip_gateway = $cgi->param('ip_gateway');
-my $ip_netmask = $cgi->param('ip_netmask');
-
-my $new = new FS::addr_block {
- ip_gateway => $ip_gateway,
- ip_netmask => $ip_netmask,
- routernum => 0 };
-
-$error = $new->insert;
-
-if ( $error ) {
- $cgi->param('error', $error);
- print $cgi->redirect(popurl(4). "browse/addr_block.cgi?". $cgi->query_string );
-} else {
- print $cgi->redirect(popurl(4). "browse/addr_block.cgi");
-}
-%>
diff --git a/httemplate/edit/process/addr_block/allocate.cgi b/httemplate/edit/process/addr_block/allocate.cgi
deleted file mode 100755
index 85b0d7a7a..000000000
--- a/httemplate/edit/process/addr_block/allocate.cgi
+++ /dev/null
@@ -1,25 +0,0 @@
-<%
-my $error = '';
-my $blocknum = $cgi->param('blocknum');
-my $routernum = $cgi->param('routernum');
-
-my $addr_block = qsearchs('addr_block', { blocknum => $blocknum });
-my $router = qsearchs('router', { routernum => $routernum });
-
-if($addr_block) {
- if ($router) {
- $error = $addr_block->allocate($router);
- } else {
- $error = "Cannot find router with routernum $routernum";
- }
-} else {
- $error = "Cannot find block with blocknum $blocknum";
-}
-
-if ( $error ) {
- $cgi->param('error', $error);
- print $cgi->redirect(popurl(4). "browse/addr_block.cgi?" . $cgi->query_string);
-} else {
- print $cgi->redirect(popurl(4). "browse/addr_block.cgi");
-}
-%>
diff --git a/httemplate/edit/process/addr_block/deallocate.cgi b/httemplate/edit/process/addr_block/deallocate.cgi
deleted file mode 100755
index cfb7ed04d..000000000
--- a/httemplate/edit/process/addr_block/deallocate.cgi
+++ /dev/null
@@ -1,24 +0,0 @@
-<%
-my $error = '';
-my $blocknum = $cgi->param('blocknum');
-
-my $addr_block = qsearchs('addr_block', { blocknum => $blocknum });
-
-if($addr_block) {
- my $router = $addr_block->router;
- if ($router) {
- $error = $addr_block->deallocate($router);
- } else {
- $error = "Block is not allocated to a router";
- }
-} else {
- $error = "Cannot find block with blocknum $blocknum";
-}
-
-if ( $error ) {
- $cgi->param('error', $error);
- print $cgi->redirect(popurl(4). "browse/addr_block.cgi?" . $cgi->query_string);
-} else {
- print $cgi->redirect(popurl(4). "browse/addr_block.cgi");
-}
-%>
diff --git a/httemplate/edit/process/addr_block/split.cgi b/httemplate/edit/process/addr_block/split.cgi
deleted file mode 100755
index bb6d4ba3e..000000000
--- a/httemplate/edit/process/addr_block/split.cgi
+++ /dev/null
@@ -1,19 +0,0 @@
-<%
-my $error = '';
-my $blocknum = $cgi->param('blocknum');
-my $addr_block = qsearchs('addr_block', { blocknum => $blocknum });
-
-if ( $addr_block) {
- $error = $addr_block->split_block;
-} else {
- $error = "Unknown blocknum: $blocknum";
-}
-
-
-if ( $error ) {
- $cgi->param('error', $error);
- print $cgi->redirect(popurl(4). "browse/addr_block.cgi?". $cgi->query_string );
-} else {
- print $cgi->redirect(popurl(4). "browse/addr_block.cgi");
-}
-%>
diff --git a/httemplate/edit/process/cust_main.cgi b/httemplate/edit/process/cust_main.cgi
index 25c346e46..718f0e501 100755
--- a/httemplate/edit/process/cust_main.cgi
+++ b/httemplate/edit/process/cust_main.cgi
@@ -10,9 +10,9 @@ $cgi->param('refnum', (split(/:/, ($cgi->param('refnum'))[0] ))[0] );
my $payby = $cgi->param('payby');
if ( $payby ) {
- if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) {
+ if ( $payby eq 'CHEK' ) {
$cgi->param('payinfo',
- $cgi->param($payby. '_payinfo1'). '@'. $cgi->param($payby. '_payinfo2') );
+ $cgi->param('CHEK_payinfo1'). '@'. $cgi->param('CHEK_payinfo2') );
} else {
$cgi->param('payinfo', $cgi->param( $payby. '_payinfo' ) );
}
diff --git a/httemplate/edit/process/generic.cgi b/httemplate/edit/process/generic.cgi
deleted file mode 100644
index 9c54feb1d..000000000
--- a/httemplate/edit/process/generic.cgi
+++ /dev/null
@@ -1,70 +0,0 @@
-<%
-
-# Welcome to generic.cgi.
-#
-# This script provides a generic edit/process/ backend for simple table
-# editing. All it knows how to do is take the values entered into
-# the script and insert them into the table specified by $cgi->param('table').
-# If there's an existing record with the same primary key, it will be
-# replaced. (Deletion will be added in the future.)
-#
-# Special cgi params for this script:
-# table: the name of the table to be edited. The script will die horribly
-# if it can't find the table.
-# redirect_ok: URL to be displayed after a successful edit. The value of
-# the record's primary key will be passed as a keyword.
-# Defaults to (freeside root)/view/$table.cgi.
-# redirect_error: URL to be displayed if there's an error. The original
-# query string, plus the error message, will be passed.
-# Defaults to $cgi->referer() (i.e. go back where you
-# came from).
-
-
-use FS::Record qw(qsearchs dbdef);
-use DBIx::DBSchema;
-use DBIx::DBSchema::Table;
-
-
-my $error;
-my $p2 = popurl(2);
-my $p3 = popurl(3);
-my $table = $cgi->param('table');
-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";
-my $pkey_val = $cgi->param($pkey);
-
-
-#warn "new FS::Record ( $table, (hashref) )";
-my $new = FS::Record::new ( "FS::$table", {
- map { $_, scalar($cgi->param($_)) } fields($table)
-} );
-
-#warn 'created $new of class '.ref($new);
-
-if($pkey_val and (my $old = qsearchs($table, { $pkey, $pkey_val} ))) {
- # edit
- $error = $new->replace($old);
-} else {
- #add
- $error = $new->insert;
- $pkey_val = $new->getfield($pkey);
- # New records usually don't have their primary keys set until after
- # they've been checked/inserted, so grab the new $pkey_val so we can
- # redirect to it.
-}
-
-my $redirect_ok = (($cgi->param('redirect_ok')) ?
- $cgi->param('redirect_ok') : $p3."browse/generic.cgi?$table");
-my $redirect_error = (($cgi->param('redirect_error')) ?
- $cgi->param('redirect_error') : $cgi->referer());
-
-if($error) {
- $cgi->param('error', $error);
- print $cgi->redirect($redirect_error . '?' . $cgi->query_string);
-} else {
- print $cgi->redirect($redirect_ok);
-}
-%>
diff --git a/httemplate/edit/process/part_svc.cgi b/httemplate/edit/process/part_svc.cgi
index 9633fabdf..859670b17 100755
--- a/httemplate/edit/process/part_svc.cgi
+++ b/httemplate/edit/process/part_svc.cgi
@@ -17,7 +17,7 @@ my $new = new FS::part_svc ( {
push @fields, 'usergroup' if $svcdb eq 'svc_acct'; #kludge
map { ( $svcdb.'__'.$_, $svcdb.'__'.$_.'_flag' ) } @fields;
} grep defined( $FS::Record::dbdef->table($_) ),
- qw( svc_acct svc_domain svc_forward svc_www svc_broadband )
+ qw( svc_acct svc_domain svc_acct_sm svc_forward svc_www )
)
} );
diff --git a/httemplate/edit/process/router.cgi b/httemplate/edit/process/router.cgi
deleted file mode 100644
index a2fa46dd9..000000000
--- a/httemplate/edit/process/router.cgi
+++ /dev/null
@@ -1,67 +0,0 @@
-<%
-
-local $FS::UID::AutoCommit=0;
-
-sub check {
- my $error = shift;
- if($error) {
- $cgi->param('error', $error);
- print $cgi->redirect(popurl(3) . "edit/router.cgi?". $cgi->query_string);
- dbh->rollback;
- exit;
- }
-}
-
-my $error = '';
-my $routernum = $cgi->param('routernum');
-my $routername = $cgi->param('routername');
-my $old = qsearchs('router', { routernum => $routernum });
-my @old_psr;
-
-my $new = new FS::router {
- map {
- ($_, scalar($cgi->param($_)));
- } fields('router')
-};
-
-if($old) {
- $error = $new->replace($old);
-} else {
- $error = $new->insert;
- $routernum = $new->routernum;
-}
-
-check($error);
-
-if ($old) {
- @old_psr = $old->part_svc_router;
- foreach my $psr (@old_psr) {
- if($cgi->param('svcpart_'.$psr->svcpart) eq 'ON') {
- # do nothing
- } else {
- $error = $psr->delete;
- }
- }
- check($error);
-}
-
-foreach($cgi->param) {
- if($cgi->param($_) eq 'ON' and /^svcpart_(\d+)$/) {
- my $svcpart = $1;
- if(grep {$_->svcpart == $svcpart} @old_psr) {
- # do nothing
- } else {
- my $new_psr = new FS::part_svc_router { svcpart => $svcpart,
- routernum => $routernum };
- $error = $new_psr->insert;
- }
- check($error);
- }
-}
-
-
-# Yay, everything worked!
-dbh->commit or die dbh->errstr;
-print $cgi->redirect(popurl(3). "browse/router.cgi");
-
-%>
diff --git a/httemplate/edit/process/svc_acct_sm.cgi b/httemplate/edit/process/svc_acct_sm.cgi
new file mode 100755
index 000000000..41d03fb92
--- /dev/null
+++ b/httemplate/edit/process/svc_acct_sm.cgi
@@ -0,0 +1,34 @@
+<%
+
+$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
+my $svcnum =$1;
+
+my $old = qsearchs('svc_acct_sm',{'svcnum'=>$svcnum}) if $svcnum;
+
+#unmunge domsvc and domuid
+#$cgi->param('domsvc',(split(/:/, $cgi->param('domsvc') ))[0] );
+#$cgi->param('domuid',(split(/:/, $cgi->param('domuid') ))[0] );
+
+my $new = new FS::svc_acct_sm ( {
+ map {
+ ($_, scalar($cgi->param($_)));
+ #} qw(svcnum pkgnum svcpart domuser domuid domsvc)
+ } ( fields('svc_acct_sm'), 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_acct_sm.cgi?". $cgi->query_string );
+} else {
+ print $cgi->redirect(popurl(3). "view/svc_acct_sm.cgi?$svcnum");
+}
+
+%>
diff --git a/httemplate/edit/process/svc_broadband.cgi b/httemplate/edit/process/svc_broadband.cgi
deleted file mode 100644
index 4912a3a9f..000000000
--- a/httemplate/edit/process/svc_broadband.cgi
+++ /dev/null
@@ -1,45 +0,0 @@
-<%
-
-# If it's stupid but it works, it's not stupid.
-# -- U.S. Army
-
-local $FS::UID::AutoCommit = 0;
-my $dbh = FS::UID::dbh;
-
-$cgi->param('svcnum') =~ /^(\d*)$/ or die "Illegal svcnum!";
-my $svcnum = $1;
-
-my $old;
-if ( $svcnum ) {
- $old = qsearchs('svc_broadband', { 'svcnum' => $svcnum } )
- or die "fatal: can't find broadband service (svcnum $svcnum)!";
-} else {
- $old = '';
-}
-
-my $new = new FS::svc_broadband ( {
- map {
- ($_, scalar($cgi->param($_)));
- } ( fields('svc_broadband'), qw( pkgnum svcpart ) )
-} );
-
-my $error;
-if ( $svcnum ) {
- $error = $new->replace($old);
-} else {
- $error = $new->insert;
- $svcnum = $new->svcnum;
-}
-
-
-if ( $error ) {
- $cgi->param('error', $error);
- $cgi->param('ip_addr', $new->ip_addr);
- $dbh->rollback;
- print $cgi->redirect(popurl(2). "svc_broadband.cgi?". $cgi->query_string );
-} else {
- $dbh->commit or die $dbh->errstr;
- print $cgi->redirect(popurl(3). "view/svc_broadband.cgi?" . $svcnum );
-}
-
-%>
diff --git a/httemplate/edit/process/svc_external.cgi b/httemplate/edit/process/svc_external.cgi
deleted file mode 100755
index 728cd2189..000000000
--- a/httemplate/edit/process/svc_external.cgi
+++ /dev/null
@@ -1,29 +0,0 @@
-<%
-
-$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
deleted file mode 100755
index a573c6504..000000000
--- a/httemplate/edit/router.cgi
+++ /dev/null
@@ -1,77 +0,0 @@
-<HTML><BODY>
-
-<%
-
-my $router;
-if ( $cgi->keywords ) {
- my($query) = $cgi->keywords;
- $query =~ /^(\d+)$/;
- $router = qsearchs('router', { routernum => $1 })
- or print $cgi->redirect(popurl(2)."browse/router.cgi") ;
-} else {
- $router = new FS::router ( {
- map { $_, scalar($cgi->param($_)) } fields('router')
- } );
-}
-
-my $routernum = $router->routernum;
-my $action = $routernum ? 'Edit' : 'Add';
-
-print header("$action Router", menubar(
- 'Main Menu' => "$p",
- '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>
-<% } %>
-
-<FORM ACTION="<%=popurl(1)%>process/router.cgi" METHOD=POST>
- <INPUT TYPE="hidden" NAME="table" VALUE="router">
- <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%>">
-
-<BR><BR>
-Custom fields:
-<BR>
-<%=table() %>
-
-<%
-foreach my $field ($router->virtual_fields) {
- print $router->pvf($field)->widget('HTML', 'edit',
- $router->getfield($field));
-}
-%>
-</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 => '' }) ) {
- %>
- <BR>
- <INPUT TYPE="checkbox" NAME="svcpart_<%=$part_svc->svcpart%>"<%=
- qsearchs('part_svc_router', { svcpart => $part_svc->svcpart,
- routernum => $routernum } ) ? ' CHECKED' : ''%> VALUE="ON">
- <A HREF="<%=${p}%>edit/part_svc.cgi?<%=$part_svc->svcpart%>">
- <%=$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 f1b8b800b..4420bb609 100755
--- a/httemplate/edit/svc_acct.cgi
+++ b/httemplate/edit/svc_acct.cgi
@@ -35,6 +35,8 @@ if ( $cgi->param('error') ) {
} else { #adding
+ $svc_acct = new FS::svc_acct({});
+
foreach $_ (split(/-/,$query)) {
$pkgnum=$1 if /^pkgnum(\d+)$/;
$svcpart=$1 if /^svcpart(\d+)$/;
@@ -42,8 +44,6 @@ if ( $cgi->param('error') ) {
$part_svc = qsearchs( 'part_svc', { 'svcpart' => $svcpart } );
die "No part_svc entry for svcpart $svcpart!" unless $part_svc;
- $svc_acct = new FS::svc_acct({svcpart => $svcpart});
-
$svcnum='';
#set gecos
@@ -281,14 +281,6 @@ if ( $part_svc->part_svc_column('usergroup')->columnflag eq "F" ) {
}
print '</TD></TR>';
-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',
- $svc_acct->getfield($field));
- }
-}
-
#submit
print qq!</TABLE><BR><INPUT TYPE="submit" VALUE="Submit">!;
diff --git a/httemplate/edit/svc_acct_sm.cgi b/httemplate/edit/svc_acct_sm.cgi
new file mode 100755
index 000000000..0fd5f7622
--- /dev/null
+++ b/httemplate/edit/svc_acct_sm.cgi
@@ -0,0 +1,178 @@
+<!-- mason kludge -->
+<%
+
+my $conf = new FS::Conf;
+my $mydomain = $conf->config('domain');
+
+my($svcnum, $pkgnum, $svcpart, $part_svc, $svc_acct_sm );
+if ( $cgi->param('error') ) {
+ $svc_acct_sm = new FS::svc_acct_sm ( {
+ map { $_, scalar($cgi->param($_)) } fields('svc_acct_sm')
+ } );
+ $svcnum = $svc_acct_sm->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_acct_sm=qsearchs('svc_acct_sm',{'svcnum'=>$svcnum})
+ or die "Unknown (svc_acct_sm) 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
+
+ $svc_acct_sm = new FS::svc_acct_sm({});
+
+ foreach $_ (split(/-/,$query)) { #get & untaint pkgnum & svcpart
+ $pkgnum=$1 if /^pkgnum(\d+)$/;
+ $svcpart=$1 if /^svcpart(\d+)$/;
+ }
+ my $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_acct_sm->setfield( $part_svc_column->columnname,
+ $part_svc_column->columnvalue,
+ );
+ }
+
+ }
+}
+my $action = $svc_acct_sm->svcnum ? 'Edit' : 'Add';
+
+my %username = ();
+my %domain = ();
+if ($pkgnum) {
+
+ #find all possible uids (and usernames)
+
+ my @u_acct_svcparts = ();
+ foreach my $u_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_acct'}) ) {
+ push @u_acct_svcparts,$u_part_svc->getfield('svcpart');
+ }
+
+ my($cust_pkg)=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum});
+ my($custnum)=$cust_pkg->getfield('custnum');
+ foreach my $i_cust_pkg ( qsearch('cust_pkg',{'custnum'=>$custnum}) ) {
+ my($cust_pkgnum)=$i_cust_pkg->getfield('pkgnum');
+ my($acct_svcpart);
+ foreach $acct_svcpart (@u_acct_svcparts) { #now find the corresponding
+ #record(s) in cust_svc ( for this
+ #pkgnum ! )
+ my($i_cust_svc);
+ foreach $i_cust_svc ( qsearch('cust_svc',{'pkgnum'=>$cust_pkgnum,'svcpart'=>$acct_svcpart}) ) {
+ my($svc_acct)=qsearchs('svc_acct',{'svcnum'=>$i_cust_svc->getfield('svcnum')});
+ $username{$svc_acct->getfield('uid')}=$svc_acct->getfield('username');
+ }
+ }
+ }
+
+ #find all possible domains (and domsvc's)
+
+ my @d_acct_svcparts = ();
+ foreach my $d_part_svc ( qsearch('part_svc',{'svcdb'=>'svc_domain'}) ) {
+ push @d_acct_svcparts,$d_part_svc->getfield('svcpart');
+ }
+
+ foreach $i_cust_pkg ( qsearch('cust_pkg',{'custnum'=>$custnum}) ) {
+ my($cust_pkgnum)=$i_cust_pkg->getfield('pkgnum');
+ my($acct_svcpart);
+ foreach $acct_svcpart (@d_acct_svcparts) {
+ my($i_cust_svc);
+ foreach $i_cust_svc ( qsearch('cust_svc',{'pkgnum'=>$cust_pkgnum,'svcpart'=>$acct_svcpart}) ) {
+ my($svc_domain)=qsearch('svc_domain',{'svcnum'=>$i_cust_svc->getfield('svcnum')});
+ $domain{$svc_domain->getfield('svcnum')}=$svc_domain->getfield('domain');
+ }
+ }
+ }
+
+} elsif ( $action eq 'Edit' ) {
+
+ my($svc_acct)=qsearchs('svc_acct',{'uid'=>$svc_acct_sm->domuid});
+ $username{$svc_acct_sm->uid} = $svc_acct->username;
+
+ my($svc_domain)=qsearchs('svc_domain',{'svcnum'=>$svc_acct_sm->domsvc});
+ $domain{$svc_acct_sm->domsvc} = $svc_domain->domain;
+
+} else {
+ die "\$action eq Add, but \$pkgnum is null!\n";
+}
+
+my $p1 = popurl(1);
+print header("Mail Alias $action", '');
+
+print qq!<FONT SIZE="+1" COLOR="#ff0000">Error: !, $cgi->param('error'),
+ "</FONT>"
+ if $cgi->param('error');
+
+print qq!<FORM ACTION="${p1}process/svc_acct_sm.cgi" METHOD=POST>!;
+
+#display
+
+ #formatting
+ print "<PRE>";
+
+#svcnum
+print qq!<INPUT TYPE="hidden" NAME="svcnum" VALUE="$svcnum">!;
+print qq!Service #<FONT SIZE=+1><B>!, $svcnum ? $svcnum : " (NEW)", "</B></FONT>";
+
+#pkgnum
+print qq!<INPUT TYPE="hidden" NAME="pkgnum" VALUE="$pkgnum">!;
+
+#svcpart
+print qq!<INPUT TYPE="hidden" NAME="svcpart" VALUE="$svcpart">!;
+
+my($domuser,$domsvc,$domuid)=(
+ $svc_acct_sm->domuser,
+ $svc_acct_sm->domsvc,
+ $svc_acct_sm->domuid,
+);
+
+#domuser
+print qq!\n\nMail to <INPUT TYPE="text" NAME="domuser" VALUE="$domuser"> <I>( * for anything )</I>!;
+
+#domsvc
+print qq! \@ <SELECT NAME="domsvc" SIZE=1>!;
+foreach $_ (keys %domain) {
+ print "<OPTION", $_ eq $domsvc ? " SELECTED" : "",
+ qq! VALUE="$_">$domain{$_}!;
+}
+print "</SELECT>";
+
+#uid
+print qq!\nforwards to <SELECT NAME="domuid" SIZE=1>!;
+foreach $_ (keys %username) {
+ print "<OPTION", ($_ eq $domuid) ? " SELECTED" : "",
+ qq! VALUE="$_">$username{$_}!;
+}
+print "</SELECT>\@$mydomain mailbox.";
+
+ #formatting
+ print "</PRE>\n";
+
+print qq!<CENTER><INPUT TYPE="submit" VALUE="Submit"></CENTER>!;
+
+print <<END;
+
+ </FORM>
+ </BODY>
+</HTML>
+END
+
+%>
diff --git a/httemplate/edit/svc_broadband.cgi b/httemplate/edit/svc_broadband.cgi
deleted file mode 100644
index 9e064c5c8..000000000
--- a/httemplate/edit/svc_broadband.cgi
+++ /dev/null
@@ -1,175 +0,0 @@
-<!-- mason kludge -->
-<%
-
-# If it's stupid but it works, it's still stupid.
-# -Kristian
-
-
-use HTML::Widgets::SelectLayers;
-use Tie::IxHash;
-
-my( $svcnum, $pkgnum, $svcpart, $part_svc, $svc_broadband );
-if ( $cgi->param('error') ) {
- $svc_broadband = new FS::svc_broadband ( {
- map { $_, scalar($cgi->param($_)) } fields('svc_broadband'), qw(svcpart)
- } );
- $svcnum = $svc_broadband->svcnum;
- $pkgnum = $cgi->param('pkgnum');
- $svcpart = $svc_broadband->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_broadband=qsearchs('svc_broadband',{'svcnum'=>$svcnum})
- or die "Unknown (svc_broadband) 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+)$/;
- }
- $part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart});
- die "No part_svc entry!" unless $part_svc;
-
- $svc_broadband = new FS::svc_broadband({ svcpart => $svcpart });
-
- $svcnum='';
-
- #set fixed and default fields from part_svc
- foreach my $part_svc_column (
- grep { $_->columnflag } $part_svc->all_part_svc_column
- ) {
- $svc_broadband->setfield( $part_svc_column->columnname,
- $part_svc_column->columnvalue,
- );
- }
-
- }
-}
-my $action = $svc_broadband->svcnum ? 'Edit' : 'Add';
-
-if ($pkgnum) {
-
- #Nothing?
-
-} elsif ( $action eq 'Edit' ) {
-
- #Nothing?
-
-} else {
- die "\$action eq Add, but \$pkgnum is null!\n";
-}
-
-my $p1 = popurl(1);
-
-my ($ip_addr, $speed_up, $speed_down, $blocknum) =
- ($svc_broadband->ip_addr,
- $svc_broadband->speed_up,
- $svc_broadband->speed_down,
- $svc_broadband->blocknum);
-
-%>
-
-<%=header("Broadband Service $action", '')%>
-
-<% if ($cgi->param('error')) { %>
-<FONT SIZE="+1" COLOR="#ff0000">Error: <%=$cgi->param('error')%></FONT><BR>
-<% } %>
-
-Service #<B><%=$svcnum ? $svcnum : "(NEW)"%></B><BR><BR>
-
-<FORM ACTION="<%=${p1}%>process/svc_broadband.cgi" METHOD=POST>
- <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%=$svcnum%>">
- <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%=$pkgnum%>">
- <INPUT TYPE="hidden" NAME="svcpart" VALUE="<%=$svcpart%>">
-
- <%=&ntable("#cccccc",2)%>
- <TR>
- <TD ALIGN="right">IP Address</TD>
- <TD BGCOLOR="#ffffff">
-<% if ( $part_svc->part_svc_column('ip_addr')->columnflag eq 'F' ) { %>
- <INPUT TYPE="hidden" NAME="ip_addr" VALUE="<%=$ip_addr%>"><%=$ip_addr%>
-<% } else { %>
- <INPUT TYPE="text" NAME="ip_addr" VALUE="<%=$ip_addr%>">
-<% } %>
- </TD>
- </TR>
- <TR>
- <TD ALIGN="right">Download speed</TD>
- <TD BGCOLOR="#ffffff">
-<% if ( $part_svc->part_svc_column('speed_down')->columnflag eq 'F' ) { %>
- <INPUT TYPE="hidden" NAME="speed_down" VALUE="<%=$speed_down%>"><%=$speed_down%>Kbps
-<% } else { %>
- <INPUT TYPE="text" NAME="speed_down" SIZE=5 VALUE="<%=$speed_down%>">Kbps
-<% } %>
- </TD>
- </TR>
- <TR>
- <TD ALIGN="right">Upload speed</TD>
- <TD BGCOLOR="#ffffff">
-<% if ( $part_svc->part_svc_column('speed_up')->columnflag eq 'F' ) { %>
- <INPUT TYPE="hidden" NAME="speed_up" VALUE="<%=$speed_up%>"><%=$speed_up%>Kbps
-<% } else { %>
- <INPUT TYPE="text" NAME="speed_up" SIZE=5 VALUE="<%=$speed_up%>">Kbps
-<% } %>
- </TD>
- </TR>
-<% if ($action eq 'Add') { %>
- <TR>
- <TD ALIGN="right">Router/Block</TD>
- <TD BGCOLOR="#ffffff">
- <SELECT NAME="blocknum">
-<%
- warn $svc_broadband->svcpart;
- foreach my $router ($svc_broadband->allowed_routers) {
- warn $router->routername;
- foreach my $addr_block ($router->addr_block) {
-%>
- <OPTION VALUE="<%=$addr_block->blocknum%>"<%=($addr_block->blocknum eq $blocknum) ? ' SELECTED' : ''%>>
- <%=$router->routername%>:<%=$addr_block->ip_gateway%>/<%=$addr_block->ip_netmask%></OPTION>
-<%
- }
- }
-%>
- </SELECT>
- </TD>
- </TR>
-<% } else { %>
-
- <TR>
- <TD ALIGN="right">Router/Block</TD>
- <TD BGCOLOR="#ffffff">
- <%=$svc_broadband->addr_block->router->routername%>:<%=$svc_broadband->addr_block->NetAddr%>
- <INPUT TYPE="hidden" NAME="blocknum" VALUE="<%=$svc_broadband->blocknum%>">
- </TD>
- </TR>
-
-<% } %>
-
-<%
-foreach my $field ($svc_broadband->virtual_fields) {
- if ( $part_svc->part_svc_column($field)->columnflag ne 'F' &&
- $part_svc->part_svc_column($field)->columnflag ne 'X') {
- print $svc_broadband->pvf($field)->widget('HTML', 'edit',
- $svc_broadband->getfield($field));
- }
-} %>
- </TABLE>
- <BR>
- <INPUT TYPE="submit" NAME="submit" VALUE="Submit">
-</FORM>
-</BODY>
-</HTML>
-
diff --git a/httemplate/edit/svc_external.cgi b/httemplate/edit/svc_external.cgi
deleted file mode 100644
index bcfc85e3f..000000000
--- a/httemplate/edit/svc_external.cgi
+++ /dev/null
@@ -1,105 +0,0 @@
-<!-- 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 2b9d35ad1..6ac6a928b 100755
--- a/httemplate/edit/svc_forward.cgi
+++ b/httemplate/edit/svc_forward.cgi
@@ -2,6 +2,7 @@
<%
my $conf = new FS::Conf;
+my $mydomain = $conf->config('domain');
my($svcnum, $pkgnum, $svcpart, $part_svc, $svc_forward);
if ( $cgi->param('error') ) {
diff --git a/httemplate/edit/svc_www.cgi b/httemplate/edit/svc_www.cgi
index ec5169e05..d2c9ade5c 100644
--- a/httemplate/edit/svc_www.cgi
+++ b/httemplate/edit/svc_www.cgi
@@ -29,12 +29,12 @@ if ( $cgi->param('error') ) {
} else { #adding
+ $svc_www = new FS::svc_www({});
+
foreach $_ (split(/-/,$query)) { #get & untaint pkgnum & svcpart
$pkgnum=$1 if /^pkgnum(\d+)$/;
$svcpart=$1 if /^svcpart(\d+)$/;
}
- $svc_www = new FS::svc_www { svcpart => $svcpart };
-
$part_svc=qsearchs('part_svc',{'svcpart'=>$svcpart});
die "No part_svc entry!" unless $part_svc;
@@ -167,14 +167,6 @@ foreach $_ (keys %username) {
}
print "</SELECT></TD></TR>";
-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',
- $svc_www->getfield($field));
- }
-}
-
print '</TABLE><BR><INPUT TYPE="submit" VALUE="Submit">';
print <<END;
diff --git a/httemplate/elements/calendar-setup.js b/httemplate/elements/calendar-setup.js
index 0dc3caa00..6f1d7a232 100644
--- a/httemplate/elements/calendar-setup.js
+++ b/httemplate/elements/calendar-setup.js
@@ -19,7 +19,7 @@
* than modifying calendar.js itself).
*/
-// $Id: calendar-setup.js,v 1.3 2003-11-07 10:53:35 ivan Exp $
+// $Id: calendar-setup.js,v 1.1.2.2 2003-11-07 10:53:36 ivan Exp $
/**
* This function "patches" an input field (or other element) to use a calendar
diff --git a/httemplate/elements/calendar.js b/httemplate/elements/calendar.js
index 3c028cc76..9503f3957 100644
--- a/httemplate/elements/calendar.js
+++ b/httemplate/elements/calendar.js
@@ -10,7 +10,7 @@
* Read the entire license text here: http://www.gnu.org/licenses/lgpl.html
*/
-// $Id: calendar.js,v 1.3 2003-11-07 10:53:35 ivan Exp $
+// $Id: calendar.js,v 1.1.2.2 2003-11-07 10:53:36 ivan Exp $
/** The Calendar object constructor. */
Calendar = function (mondayFirst, dateStr, onSelected, onClose) {
diff --git a/httemplate/elements/header.html b/httemplate/elements/header.html
deleted file mode 100644
index 1d7bf09ab..000000000
--- a/httemplate/elements/header.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<%
- my($title, $menubar) = @_;
- my $etc = @_ ? shift : ''; #$etc is for things like onLoad= etc.
-%>
- <HTML>
- <HEAD>
- <TITLE>
- <%= $title %>
- </TITLE>
- <META HTTP-Equiv="Cache-Control" Content="no-cache">
- <META HTTP-Equiv="Pragma" Content="no-cache">
- <META HTTP-Equiv="Expires" Content="0">
- </HEAD>
- <BODY BGCOLOR="#e8e8e8"<%= $etc %>>
- <FONT SIZE=6>
- <%= $title %>
- </FONT>
- <BR><BR>
- <%= $menubar ? "$menubar<BR><BR>" : '' %>
diff --git a/httemplate/elements/menubar.html b/httemplate/elements/menubar.html
deleted file mode 100644
index 87a50312c..000000000
--- a/httemplate/elements/menubar.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<%
- my($item, $url, @html);
- while (@_) {
- ($item, $url) = splice(@_,0,2);
- push @html, qq!<A HREF="$url">$item</A>!;
- }
-%>
-<%= join(' | ', @html) %>
diff --git a/httemplate/elements/pager.html b/httemplate/elements/pager.html
deleted file mode 100644
index db9ff83bf..000000000
--- a/httemplate/elements/pager.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<%
-
- my %opt = @_;
-
- my $pager = '';
- if ( $opt{'total'} != $opt{'num_rows'} && $opt{'maxrecords'} ) {
- unless ( $opt{'offset'} == 0 ) {
- $cgi->param('offset', $opt{'offset'} - $opt{'maxrecords'});
-%>
-
- <A HREF="<%= $cgi->self_url %>"><B><FONT SIZE="+1">Previous</FONT></B></A>
-
-<%
- }
- my $page = 0;
- for ( my $poff = 0; $poff < $opt{'total'}; $poff += $opt{'maxrecords'} ) {
- $page++;
- if ( $opt{'offset'} == $poff ) {
-%>
-
- <FONT SIZE="+2"><%= $page %></FONT>
-
-<%
- } else {
- $cgi->param('offset', $poff);
-%>
-
- <A HREF="<%= $cgi->self_url %>">$page</A>
-
-<%
- }
- }
- unless ( $opt{'offset'} + $opt{'maxrecords'} > $opt{'total'} ) {
- $cgi->param('offset', $opt{'offset'} + $opt{'maxrecords'});
-%>
-
- <A HREF="<%= $cgi->self_url %>"><B><FONT SIZE="+1">Next</FONT></B></A>
-
-<%
- }
- }
-%>
diff --git a/httemplate/elements/small_custview.html b/httemplate/elements/small_custview.html
deleted file mode 100644
index 1e8ae739a..000000000
--- a/httemplate/elements/small_custview.html
+++ /dev/null
@@ -1,2 +0,0 @@
-<% my $conf = new FS::Conf; %>
-<%= small_custview( shift, shift || $conf->config('countrydefault') ) %>
diff --git a/httemplate/elements/table.html b/httemplate/elements/table.html
deleted file mode 100644
index 3b6108719..000000000
--- a/httemplate/elements/table.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<%
- my $color = shift;
- if ( $color ) {
-%>
- <TABLE BGCOLOR="<%= $color %>" BORDER=1 WIDTH="100%" CELLSPACING=0 CELLPADDING=2 BORDERCOLOR="#999999">
-<% } else { %>
- <TABLE BORDER=1 CELLSPACING=0 CELLPADDING=2 BORDERCOLOR="#999999">
-<% } %>
diff --git a/httemplate/graph/money_time-graph.cgi b/httemplate/graph/money_time-graph.cgi
deleted file mode 100755
index 55e8982b4..000000000
--- a/httemplate/graph/money_time-graph.cgi
+++ /dev/null
@@ -1,66 +0,0 @@
-<%
-
-#my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
-my ($curmon,$curyear) = (localtime(time))[4,5];
-
-#find first month
-my $syear = $cgi->param('syear') || 1899+$curyear;
-my $smonth = $cgi->param('smonth') || $curmon+1;
-
-#find last month
-my $eyear = $cgi->param('eyear') || 1900+$curyear;
-my $emonth = $cgi->param('emonth') || $curmon+1;
-#if ( $emonth++>12 ) { $emonth-=12; $eyear++; }
-
-#my @labels;
-#my %data;
-
-my @items = qw( invoiced netsales credits receipts );
-my %label = (
- 'invoiced' => 'Gross Sales (invoiced)',
- 'netsales' => 'Net Sales (invoiced - applied credits)',
- 'credits' => 'Credits',
- 'receipts' => 'Receipts/Cashflow (payments - refunds)',
-);
-my %color = (
- 'invoiced' => [ 153, 153, 255 ], #light blue
- 'netsales' => [ 0, 0, 204 ], #blue
- 'credits' => [ 204, 0, 0 ], #red
- 'receipts' => [ 0, 204, 0 ], #green
-);
-
-my $report = new FS::Report::Table::Monthly (
- 'items' => \@items,
- 'start_month' => $smonth,
- 'start_year' => $syear,
- 'end_month' => $emonth,
- 'end_year' => $eyear,
-);
-my %data = %{$report->data};
-
-#my $chart = Chart::LinesPoints->new(1024,480);
-#my $chart = Chart::LinesPoints->new(768,480);
-my $chart = Chart::LinesPoints->new(976,384);
-
-my $d = 0;
-$chart->set(
- #'min_val' => 0,
- 'legend' => 'bottom',
- 'colors' => { ( map { 'dataset'.$d++ => $color{$_} } @items ),
- #'grey_background' => [ 211, 211, 211 ],
- 'grey_background' => 'white',
- 'background' => [ 0xe8, 0xe8, 0xe8 ], #grey
- },
- #'grey_background' => 'false',
- 'legend_labels' => [ map { $label{$_} } @items ],
- 'brush_size' => 4,
- #'pt_size' => 12,
-);
-
-my @data = map { $data{$_} } ( 'label', @items );
-
-http_header('Content-Type' => 'image/png' );
-
-$chart->_set_colors();
-
-%><%= $chart->scalar_png(\@data) %>
diff --git a/httemplate/graph/money_time.cgi b/httemplate/graph/money_time.cgi
deleted file mode 100644
index e5903168d..000000000
--- a/httemplate/graph/money_time.cgi
+++ /dev/null
@@ -1,113 +0,0 @@
-<!-- mason kludge -->
-<%
-
-#my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
-my ($curmon,$curyear) = (localtime(time))[4,5];
-
-#find first month
-my $syear = $cgi->param('syear') || 1899+$curyear;
-my $smonth = $cgi->param('smonth') || $curmon+1;
-
-#find last month
-my $eyear = $cgi->param('eyear') || 1900+$curyear;
-my $emonth = $cgi->param('emonth') || $curmon+1;
-
-%>
-
-<HTML>
- <HEAD>
- <TITLE>Sales, Credits and Receipts Summary</TITLE>
- </HEAD>
-<BODY BGCOLOR="#e8e8e8">
-<IMG SRC="money_time-graph.cgi?<%= $cgi->query_string %>" WIDTH="976" HEIGHT="384">
-<BR>
-
-<%= table('e8e8e8') %>
-<%
-
-my @items = qw( invoiced netsales credits receipts );
-my %label = (
- 'invoiced' => 'Gross Sales',
- 'netsales' => 'Net Sales',
- 'credits' => 'Credits',
- 'receipts' => 'Receipts',
-);
-my %color = (
- 'invoiced' => '9999ff', #light blue
- 'netsales' => '0000cc', #blue
- 'credits' => 'cc0000', #red
- 'receipts' => '00cc00', #green
-);
-
-my $report = new FS::Report::Table::Monthly (
- 'items' => \@items,
- 'start_month' => $smonth,
- 'start_year' => $syear,
- 'end_month' => $emonth,
- 'end_year' => $eyear,
-);
-my $data = $report->data;
-
-
-my @mon = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
-
-%>
-
-<TR><TD></TD>
-<% foreach my $column ( @{$data->{label}} ) {
- #$column =~ s/^(\d+)\//$mon[$1-1]<BR>/e;
- $column =~ s/^(\d+)\//$mon[$1-1]<BR>/;
- %>
- <TH><%= $column %></TH>
-<% } %>
-</TR>
-
-<% foreach my $row (@items) { %>
- <TR><TH><FONT COLOR="#<%= $color{$row} %>"><%= $label{$row} %></FONT></TH>
- <% foreach my $column ( @{$data->{$row}} ) { %>
- <TD ALIGN="right" BGCOLOR="#ffffff">
- <FONT COLOR="#<%= $color{$row} %>">$<%= sprintf("%.2f", $column) %></FONT>
- </TD>
- <% } %>
- </TR>
-<% } %>
-</TABLE>
-
-<BR>
-<FORM METHOD="POST">
-<!--
-<INPUT TYPE="checkbox" NAME="ar">
- Accounts receivable (invoices - applied credits)<BR>
-<INPUT TYPE="checkbox" NAME="charged">
- Just Invoices<BR>
-<INPUT TYPE="checkbox" NAME="defer">
- Accounts receivable, with deferred revenue (invoices - applied credits, with charges for annual/semi-annual/quarterly/etc. services deferred over applicable time period) (there has got to be a shorter description for this)<BR>
-<INPUT TYPE="checkbox" NAME="cash">
- Cashflow (payments - refunds)<BR>
-<BR>
--->
-From <SELECT NAME="smonth">
-<% foreach my $mon ( 1..12 ) { %>
-<OPTION VALUE="<%= $mon %>"<%= $mon == $smonth ? ' SELECTED' : '' %>><%= $mon[$mon-1] %>
-<% } %>
-</SELECT>
-<SELECT NAME="syear">
-<% foreach my $y ( 1999 .. 2010 ) { %>
-<OPTION VALUE="<%= $y %>"<%= $y == $syear ? ' SELECTED' : '' %>><%= $y %>
-<% } %>
-</SELECT>
- to <SELECT NAME="emonth">
-<% foreach my $mon ( 1..12 ) { %>
-<OPTION VALUE="<%= $mon %>"<%= $mon == $emonth ? ' SELECTED' : '' %>><%= $mon[$mon-1] %>
-<% } %>
-</SELECT>
-<SELECT NAME="eyear">
-<% foreach my $y ( 1999 .. 2010 ) { %>
-<OPTION VALUE="<%= $y %>"<%= $y == $eyear ? ' SELECTED' : '' %>><%= $y %>
-<% } %>
-</SELECT>
-
-<INPUT TYPE="submit" VALUE="Redisplay">
-</FORM>
-</BODY>
-</HTML>
diff --git a/httemplate/images/ach.png b/httemplate/images/ach.png
deleted file mode 100644
index fdcd5e6ed..000000000
--- a/httemplate/images/ach.png
+++ /dev/null
Binary files differ
diff --git a/httemplate/index.html b/httemplate/index.html
index d8879bfb8..6624a3f47 100644
--- a/httemplate/index.html
+++ b/httemplate/index.html
@@ -11,8 +11,8 @@
</td><td>
<font color="#ff0000" size=7>freeside main menu</font>
</td><td align=right valign=bottom>
- version %%%VERSION%%%
- <BR><A HREF="http://www.sisd.com/freeside">Freeside&nbsp;home&nbsp;page</A>
+ version %%%VERSION%%%
+ <BR><A HREF="http://www.sisd.com/freeside">Freeside home page</A>
<BR><A HREF="docs/">Documentation</A>
</td></tr>
</table>
@@ -35,7 +35,6 @@
<BR><FORM ACTION="search/svc_acct.cgi" METHOD="POST">Username <INPUT TYPE="text" NAME="username"><SELECT NAME="username_type"><OPTION VALUE="All">(all)</OPTION><OPTION>Fuzzy</OPTION><OPTION>Substring</OPTION><OPTION SELECTED>Exact</OPTION></SELECT><INPUT TYPE="submit" VALUE="Search"> or <A HREF="search/svc_acct.cgi?username">all accounts by username</A> or <A HREF="search/svc_acct.cgi?uid">uid</A></FORM>
<BR><FORM ACTION="search/svc_domain.cgi" METHOD="POST">Domain <INPUT TYPE="text" NAME="domain"><INPUT TYPE="submit" VALUE="Search"> or <A HREF="search/svc_domain.cgi?domain">all domains</A></FORM>
<BR><A HREF="search/svc_forward.cgi?svcnum">all mail forwards by svcnum</A><BR>
-
<BR>
</TD></TR>
</TABLE>
@@ -69,7 +68,6 @@
<LI>all invoices (<A HREF="search/cust_bill.cgi?invnum">by invoice number</A>) (<A HREF="search/cust_bill.cgi?date">by date</A>) (<A HREF="search/cust_bill.cgi?custnum">by customer number</A>)
</UL>
<A HREF="search/report_cust_pay.html">Payment report (by type and/or date range)</A>
- <BR><BR><A HREF="graph/money_time.cgi">Sales, Credits and Receipts Summary</A>
<BR><BR><A HREF="search/report_receivables.cgi">Accounts Receivable Aging Summary</A>
<BR><BR><A HREF="search/report_prepaid_income.html">Prepaid Income (Unearned Revenue) Report</A>
<BR><BR>(old) Financial reports (being rewritten)
@@ -134,7 +132,7 @@
<UL>
<LI><A HREF="search/cust_main-otaker.cgi">Search customers by order-taker</A>
</UL>
- <FORM ACTION="search/sql.html" METHOD="POST">SQL query: <TT>SELECT </TT><INPUT TYPE="text" NAME="sql" SIZE=32><INPUT TYPE="submit" VALUE="Query"></FORM>
+ <FORM ACTION="search/sql.cgi" METHOD="POST">SQL query: <TT>SELECT </TT><INPUT TYPE="text" NAME="sql" SIZE=32><INPUT TYPE="submit" VALUE="Query"></FORM>
<BR>
</TD></TR>
@@ -185,13 +183,7 @@
<LI><A HREF="browse/svc_acct_pop.cgi">View/Edit access numbers</A>
- Points of Presence
<LI><A HREF="browse/part_bill_event.cgi">View/Edit invoice events</A> - Actions for overdue invoices
- <LI><A HREF="browse/msgcat.cgi">View/Edit message catalog</A> - Change error messages and other customizable labels.
- <LI><A HREF="browse/part_virtual_field.cgi">View/Edit virtual fields</A>
- - Locally defined fields
- <LI><A HREF="browse/router.cgi">View/Edit routers</A>
- - Broadband access routers
- <LI><A HREF="browse/addr_block.cgi">View/Edit address blocks</A>
- - Manage address blocks and block assignments to broadband routers.
+ <LI><A HREF="browse/msgcat.cgi">View/Edit message catalog</A> - Change error messages and other customizable labels.
</ul>
<BR>
</TD></TR>
diff --git a/httemplate/misc/catchall.cgi b/httemplate/misc/catchall.cgi
index 3402b61e6..9aa84be18 100755
--- a/httemplate/misc/catchall.cgi
+++ b/httemplate/misc/catchall.cgi
@@ -77,7 +77,7 @@ if ($pkgnum) {
}
# add an absence of a catchall
-$email{''} = "(none)";
+$email{0} = "(none)";
my $p1 = popurl(1);
print header("Domain Catchall Edit", '');
diff --git a/httemplate/misc/link.cgi b/httemplate/misc/link.cgi
index 79adce88c..efc762cc5 100755
--- a/httemplate/misc/link.cgi
+++ b/httemplate/misc/link.cgi
@@ -4,6 +4,7 @@
my %link_field = (
'svc_acct' => 'username',
'svc_domain' => 'domain',
+ 'svc_acct_sm' => '',
'svc_charge' => '',
'svc_wo' => '',
);
diff --git a/httemplate/misc/meta-import.cgi b/httemplate/misc/meta-import.cgi
deleted file mode 100644
index 2f3b7380d..000000000
--- a/httemplate/misc/meta-import.cgi
+++ /dev/null
@@ -1,64 +0,0 @@
-<!-- mason kludge -->
-<%= header('Import') %>
-<FORM ACTION="process/meta-import.cgi" METHOD="post" ENCTYPE="multipart/form-data">
-Import data from a DBI data source<BR><BR>
-
-<%
- #false laziness with edit/cust_main.cgi
- my @agents = qsearch( 'agent', {} );
- die "No agents created!" unless @agents;
- my $agentnum = $agents[0]->agentnum; #default to first
-
- if ( scalar(@agents) == 1 ) {
-%>
- <INPUT TYPE="hidden" NAME="agentnum" VALUE="<%= $agentnum %>">
-<% } else { %>
- <BR><BR>Agent <SELECT NAME="agentnum" SIZE="1">
- <% foreach my $agent (sort { $a->agent cmp $b->agent } @agents) { %>
- <OPTION VALUE="<%= $agent->agentnum %>" <%= " SELECTED"x($agent->agentnum==$agentnum) %>><%= $agent->agent %></OPTION>
- <% } %>
- </SELECT><BR><BR>
-<% } %>
-
-<%
- my @referrals = qsearch('part_referral',{});
- die "No advertising sources created!" unless @referrals;
- my $refnum = $referrals[0]->refnum; #default to first
-
- if ( scalar(@referrals) == 1 ) {
-%>
- <INPUT TYPE="hidden" NAME="refnum" VALUE="<%= $refnum %>">
-<% } else { %>
- <BR><BR>Advertising source <SELECT NAME="refnum" SIZE="1">
- <% foreach my $referral ( sort { $a->referral <=> $b->referral } @referrals) { %>
- <OPTION VALUE="<%= $referral->refnum %>" <%= " SELECTED"x($referral->refnum==$refnum) %>><%= $referral->refnum %>: <%= $referral->referral %></OPTION>
- <% } %>
- </SELECT><BR><BR>
-<% } %>
-
- First package: <SELECT NAME="pkgpart"><OPTION VALUE="">(none)</OPTION>
-<% foreach my $part_pkg ( qsearch('part_pkg',{'disabled'=>'' }) ) { %>
- <OPTION VALUE="<%= $part_pkg->pkgpart %>"><%= $part_pkg->pkg. ' - '. $part_pkg->comment %></OPTION>
-<% } %>
-</SELECT><BR><BR>
-
- <table>
- <tr>
- <td align="right">DBI data source: </td>
- <td><INPUT TYPE="text" NAME="data_source"></td>
- </tr>
- <tr>
- <td align="right">DBI username: </td>
- <td><INPUT TYPE="text" NAME="username"></td>
- </tr>
- <tr>
- <td align="right">DBI password: </td>
- <td><INPUT TYPE="text" NAME="password"></td>
- </tr>
- </table>
- <INPUT TYPE="submit" VALUE="Import">
-
- </FORM>
- </BODY>
-<HTML>
-
diff --git a/httemplate/misc/payment.cgi b/httemplate/misc/payment.cgi
deleted file mode 100644
index bf89a3da7..000000000
--- a/httemplate/misc/payment.cgi
+++ /dev/null
@@ -1,209 +0,0 @@
-<%
- my %type = ( 'CARD' => 'credit card',
- 'CHEK' => 'electronic check (ACH)',
- );
-
- $cgi->param('payby') =~ /^(CARD|CHEK)$/
- or die "unknown payby ". $cgi->param('payby');
- my $payby = $1;
-
- $cgi->param('custnum') =~ /^(\d+)$/
- or die "illegal custnum ". $cgi->param('custnum');
- my $custnum = $1;
-
- my $cust_main = qsearchs( 'cust_main', { 'custnum'=>$custnum } );
- die "unknown custnum $custnum" unless $cust_main;
-
- my $balance = $cust_main->balance;
-
- my $payinfo = '';
-
- #false laziness w/selfservice make_payment.html shortcut for one-country
- my $conf = new FS::Conf;
- my %states = map { $_->state => 1 }
- qsearch('cust_main_county', {
- 'country' => $conf->config('defaultcountry') || 'US'
- } );
- my @states = sort { $a cmp $b } keys %states;
-
- my $paybatch = "webui-payment-". time. "-$$-". rand() * 2**32;
-
-%>
-<%= include( '/elements/header.html', "Process $type{$payby} payment" ) %>
-<%= include( '/elements/small_custview.html', $cust_main ) %>
-<FORM NAME="OneTrueForm" ACTION="process/payment.cgi" METHOD="POST" onSubmit="document.OneTrueForm.process.disabled=true">
-<INPUT TYPE="hidden" NAME="custnum" VALUE="<%= $custnum %>">
-<INPUT TYPE="hidden" NAME="payby" VALUE="<%= $payby %>">
-<INPUT TYPE="hidden" NAME="paybatch" VALUE="<%= $paybatch %>">
-<SCRIPT>
-var mywindow = -1;
-function myopen(filename,windowname,properties) {
- myclose();
- mywindow = window.open(filename,windowname,properties);
-}
-function myclose() {
- if ( mywindow != -1 )
- mywindow.close();
- mywindow = -1;
-}
-var achwindow = -1;
-function achopen(filename,windowname,properties) {
- achclose();
- achwindow = window.open(filename,windowname,properties);
-}
-function achclose() {
- if ( achwindow != -1 )
- achwindow.close();
- achwindow = -1;
-}
-</SCRIPT>
-<% #include( '/elements/table.html', '#cccccc' ) %>
-<%= ntable('#cccccc') %>
- <TR>
- <TD ALIGN="right">Payment amount</TD>
- <TD>
- <TABLE><TR><TD BGCOLOR="#ffffff">
- $<INPUT TYPE="text" NAME="amount" SIZE=8 VALUE="<%= $balance > 0 ? sprintf("%.2f", $balance) : '' %>">
- </TD></TR></TABLE>
- </TD>
- </TR>
-<% if ( $payby eq 'CARD' ) {
- my( $payinfo, $paycvv, $month, $year ) = ( '', '', '', '' );
- my $payname = $cust_main->first. ' '. $cust_main->getfield('last');
- my $address1 = $cust_main->address1;
- my $address2 = $cust_main->address2;
- my $city = $cust_main->city;
- my $state = $cust_main->state;
- my $zip = $cust_main->zip;
- if ( $cust_main->payby =~ /^(CARD|DCRD)$/ ) {
- $payinfo = $cust_main->payinfo;
- $paycvv = $cust_main->paycvv;
- ( $month, $year ) = $cust_main->paydate_monthyear;
- $payname = $cust_main->payname if $cust_main->payname;
- }
-%>
- <TR>
- <TD ALIGN="right">Card&nbsp;number</TD>
- <TD>
- <TABLE>
- <TR>
- <TD>
- <INPUT TYPE="text" NAME="payinfo" SIZE=20 MAXLENGTH=19 VALUE="<%=$payinfo%>"> </TD>
- <TD>Exp.</TD>
- <TD>
- <SELECT NAME="month">
- <% for ( ( map "0$_", 1 .. 9 ), 11, 12 ) { %>
- <OPTION<%= $_ eq $month ? ' SELECTED' : '' %>><%= $_ %>
- <% } %>
- </SELECT>
- </TD>
- <TD> / </TD>
- <TD>
- <SELECT NAME="year">
- <% my @a = localtime; for ( $a[5]+1900 .. $a[5]+1915 ) { %>
- <OPTION<%= $_ eq $year ? ' SELECTED' : '' %>><%= $_ %>
- <% } %>
- </SELECT>
- </TD>
- </TR>
- </TABLE>
- </TD>
- </TR>
- <TR>
- <TD ALIGN="right">CVV2</TD>
- <TD><INPUT TYPE="text" NAME="paycvv" VALUE="<%= $paycvv %>" SIZE=4 MAXLENGTH=4>
- (<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>)
- </TD>
- </TR>
- <TR>
- <TD ALIGN="right">Exact&nbsp;name&nbsp;on&nbsp;card</TD>
- <TD><INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="payname" VALUE="<%=$payname%>"></TD>
- </TR><TR>
- <TD ALIGN="right">Card&nbsp;billing&nbsp;address</TD>
- <TD>
- <INPUT TYPE="text" SIZE=40 MAXLENGTH=80 NAME="address1" VALUE="<%=$address1%>">
- </TD>
- </TR><TR>
- <TD ALIGN="right">Address&nbsp;line&nbsp;2</TD>
- <TD>
- <INPUT TYPE="text" SIZE=40 MAXLENGTH=80 NAME="address2" VALUE="<%=$address2%>">
- </TD>
- </TR><TR>
- <TD ALIGN="right">City</TD>
- <TD>
- <TABLE>
- <TR>
- <TD>
- <INPUT TYPE="text" NAME="city" SIZE="12" MAXLENGTH=80 VALUE="<%=$city%>">
- </TD>
- <TD>State</TD>
- <TD>
- <SELECT NAME="state">
- <% for ( @states ) { %>
- <OPTION<%= $_ eq $state ? ' SELECTED' : '' %>><%= $_ %>
- <% } %>
- </SELECT>
- </TD>
- <TD>Zip</TD>
- <TD>
- <INPUT TYPE="text" NAME="zip" SIZE=11 MAXLENGTH=10 VALUE="<%=$zip%>">
- </TD>
- </TR>
- </TABLE>
- </TD>
- </TR>
-
-<% } elsif ( $payby eq 'CHEK' ) {
- my( $payinfo1, $payinfo2, $payname, $ss ) = ( '', '', '', '' );
- if ( $cust_main->payby =~ /^(CHEK|DCHK)$/ ) {
- $cust_main->payinfo =~ /^(\d+)\@(\d+)$/
- or die "unparsable payinfo ". $cust_main->payinfo;
- ($payinfo1, $payinfo2) = ($1, $2);
- $payname = $cust_main->payname;
- $ss = $cust_main->ss;
- }
-%>
- <INPUT TYPE="hidden" NAME="month" VALUE="12">
- <INPUT TYPE="hidden" NAME="year" VALUE="2037">
- <TR>
- <TD ALIGN="right">Account&nbsp;number</TD>
- <TD><INPUT TYPE="text" SIZE=10 NAME="payinfo1" VALUE="<%=$payinfo1%>"></TD>
- </TR>
- <TR>
- <TD ALIGN="right">ABA/Routing&nbsp;number</TD>
- <TD>
- <INPUT TYPE="text" SIZE=10 MAXLENGTH=9 NAME="payinfo2" VALUE="<%=$payinfo2%>">
- (<A HREF="javascript:achopen('../docs/ach.html','ach','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=384,height=256')">help</A>)
- </TD>
- </TR>
- <TR>
- <TD ALIGN="right">Bank&nbsp;name</TD>
- <TD><INPUT TYPE="text" NAME="payname" VALUE="<%=$payname%>"></TD>
- </TR>
- <TR>
- <TD ALIGN="right">
- Account&nbsp;holder<BR>
- Social&nbsp;security&nbsp;or&nbsp;tax&nbspID&nbsp;#
- </TD>
- <TD><INPUT TYPE="text" NAME="ss" VALUE="<%=$ss%>"></TD>
- </TR>
-
-<% } %>
-
-<TR>
- <TD COLSPAN=2>
- <INPUT TYPE="checkbox" CHECKED NAME="save" VALUE="1">
- Remember this information
- </TD>
-</TR><TR>
- <TD COLSPAN=2>
- <INPUT TYPE="checkbox"<%= $payby eq 'CARD' ? ' CHECKED' : '' %> NAME="auto" VALUE="1" onClick="if (this.checked) { document.OneTrueForm.save.checked=true; }">
- Charge future payments to this <%= $type{$payby} %> automatically
- </TD>
-</TR>
-</TABLE>
-<BR>
-<INPUT TYPE="submit" NAME="process" VALUE="Process payment">
-</FORM>
-</BODY>
-</HTML>
diff --git a/httemplate/misc/process/meta-import.cgi b/httemplate/misc/process/meta-import.cgi
deleted file mode 100644
index 59d236f64..000000000
--- a/httemplate/misc/process/meta-import.cgi
+++ /dev/null
@@ -1,178 +0,0 @@
-<!-- mason kludge -->
-<%= header('Map tables') %>
-
-<SCRIPT>
-var gSafeOnload = new Array();
-var gSafeOnsubmit = new Array();
-window.onload = SafeOnload;
-function SafeAddOnLoad(f) {
- gSafeOnload[gSafeOnload.length] = f;
-}
-function SafeOnload() {
- for (var i=0;i<gSafeOnload.length;i++)
- gSafeOnload[i]();
-}
-function SafeAddOnSubmit(f) {
- gSafeOnsubmit[gSafeOnsubmit.length] = f;
-}
-function SafeOnsubmit() {
- for (var i=0;i<gSafeOnsubmit.length;i++)
- gSafeOnsubmit[i]();
-}
-</SCRIPT>
-
-<FORM NAME="OneTrueForm" METHOD="POST" ACTION="meta-import.cgi">
-
-<%
- #use DBIx::DBSchema;
- my $schema = new_native DBIx::DBSchema
- map { $cgi->param($_) } qw( data_source username password );
- foreach my $field (qw( data_source username password )) { %>
- <INPUT TYPE="hidden" NAME=<%= $field %> VALUE="<%= $cgi->param($field) %>">
- <% }
-
- my %schema;
- use Tie::DxHash;
- tie %schema, 'Tie::DxHash';
- if ( $cgi->param('schema') ) {
- my $schema_string = $cgi->param('schema');
- %> <INPUT TYPE="hidden" NAME="schema" VALUE="<%=$schema_string%>"> <%
- %schema = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
- or die "guru meditation #420: $_";
- ( $1 => $2 );
- }
- split( /\n/, $schema_string );
- }
-
- #first page
- unless ( $cgi->param('magic') ) { %>
-
- <INPUT TYPE="hidden" NAME="magic" VALUE="process">
- <%= hashmaker('schema', [ $schema->tables ],
- [ grep !/^h_/, dbdef->tables ], ) %>
- <br><INPUT TYPE="submit" VALUE="done">
- <%
-
- #second page
- } elsif ( $cgi->param('magic') eq 'process' ) { %>
-
- <INPUT TYPE="hidden" NAME="magic" VALUE="process2">
- <%
-
- my %unique;
- foreach my $table ( keys %schema ) {
-
- my @from_columns = $schema->table($table)->columns;
- my @fs_columns = dbdef->table($schema{$table})->columns;
-
- %>
- <%= hashmaker( $table.'__'.$unique{$table}++,
- \@from_columns => \@fs_columns,
- $table => $schema{$table}, ) %>
- <br><hr><br>
- <%
-
- }
-
- %>
- <br><INPUT TYPE="submit" VALUE="done">
- <%
-
- #third (results)
- } elsif ( $cgi->param('magic') eq 'process2' ) {
-
- print "<pre>\n";
-
- my %unique;
- foreach my $table ( keys %schema ) {
- ( my $spaces = $table ) =~ s/./ /g;
- print "'$table' => { 'table' => '$schema{$table}',\n".
- #(length($table) x ' '). " 'map' => {\n";
- "$spaces 'map' => {\n";
- my %map = map { /^\s*(\w+)\s*=>\s*(\w+)\s*$/
- or die "guru meditation #420: $_";
- ( $1 => $2 );
- }
- split( /\n/, $cgi->param($table.'__'.$unique{$table}++) );
- foreach ( keys %map ) {
- print "$spaces '$_' => '$map{$_}',\n";
- }
- print "$spaces },\n";
- print "$spaces },\n";
-
- }
- print "\n</pre>";
-
- } else {
- warn "unrecognized magic: ". $cgi->param('magic');
- }
-
- %>
-</FORM>
-</BODY>
-</HTML>
-
- <%
- #hashmaker widget
- sub hashmaker {
- my($name, $from, $to, $labelfrom, $labelto) = @_;
- my $fromsize = scalar(@$from);
- my $tosize = scalar(@$to);
- "<TABLE><TR><TH>$labelfrom</TH><TH>$labelto</TH></TR><TR><TD>".
- qq!<SELECT NAME="${name}_from" SIZE=$fromsize>\n!.
- join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$from ).
- "</SELECT>\n<BR>".
- qq!<INPUT TYPE="button" VALUE="refill" onClick="repack_${name}_from()">!.
- '</TD><TD>'.
- qq!<SELECT NAME="${name}_to" SIZE=$tosize>\n!.
- join("\n", map { qq!<OPTION VALUE="$_">$_</OPTION>! } sort { $a cmp $b } @$to ).
- "</SELECT>\n<BR>".
- qq!<INPUT TYPE="button" VALUE="refill" onClick="repack_${name}_to()">!.
- '</TD></TR>'.
- '<TR><TD COLSPAN=2>'.
- qq!<INPUT TYPE="button" VALUE="map" onClick="toke_$name(this.form)">!.
- '</TD></TR><TR><TD COLSPAN=2>'.
- qq!<TEXTAREA NAME="$name" COLS=80 ROWS=8></TEXTAREA>!.
- '</TD></TR></TABLE>'.
- "<script>
- function toke_$name() {
- fromObject = document.OneTrueForm.${name}_from;
- for (var i=fromObject.options.length-1;i>-1;i--) {
- if (fromObject.options[i].selected)
- fromname = deleteOption_$name(fromObject,i);
- }
- toObject = document.OneTrueForm.${name}_to;
- for (var i=toObject.options.length-1;i>-1;i--) {
- if (toObject.options[i].selected)
- toname = deleteOption_$name(toObject,i);
- }
- document.OneTrueForm.$name.value = document.OneTrueForm.$name.value + fromname + ' => ' + toname + '\\n';
- }
- function deleteOption_$name(object,index) {
- value = object.options[index].value;
- object.options[index] = null;
- return value;
- }
- function repack_${name}_from() {
- var object = document.OneTrueForm.${name}_from;
- object.options.length = 0;
- ". join("\n",
- map { "addOption_$name(object, '$_');\n" }
- ( sort { $a cmp $b } @$from ) ). "
- }
- function repack_${name}_to() {
- var object = document.OneTrueForm.${name}_to;
- object.options.length = 0;
- ". join("\n",
- map { "addOption_$name(object, '$_');\n" }
- ( sort { $a cmp $b } @$to ) ). "
- }
- function addOption_$name(object,value) {
- var length = object.length;
- object.options[length] = new Option(value, value, false, false);
- }
- </script>".
- '';
- }
-
-%>
diff --git a/httemplate/misc/process/payment.cgi b/httemplate/misc/process/payment.cgi
deleted file mode 100644
index fa0ede89c..000000000
--- a/httemplate/misc/process/payment.cgi
+++ /dev/null
@@ -1,148 +0,0 @@
-<%
-
-#some false laziness w/MyAccount::process_payment
-
-$cgi->param('custnum') =~ /^(\d+)$/
- or die "illegal custnum ". $cgi->param('custnum');
-my $custnum = $1;
-
-my $cust_main = qsearchs('cust_main', { 'custnum' => $custnum } );
-die "unknown custnum $custnum" unless $cust_main;
-
-$cgi->param('amount') =~ /^\s*(\d*(\.\d\d)?)\s*$/
- or eidiot "illegal amount ". $cgi->param('amount');
-my $amount = $1;
-eidiot "amount <= 0" unless $amount > 0;
-
-$cgi->param('year') =~ /^(\d+)$/
- or die "illegal year ". $cgi->param('year');
-my $year = $1;
-
-$cgi->param('month') =~ /^(\d+)$/
- or die "illegal month ". $cgi->param('month');
-my $month = $1;
-
-$cgi->param('payby') =~ /^(CARD|CHEK)$/
- or die "illegal payby ". $cgi->param('payby');
-my $payby = $1;
-my %payby2bop = (
- 'CARD' => 'CC',
- 'CHEK' => 'ECHECK',
-);
-my %payby2fields = (
- 'CARD' => [ qw( address1 address2 city state zip ) ],
- 'CHEK' => [ qw( ss ) ],
-);
-my %type = ( 'CARD' => 'credit card',
- 'CHEK' => 'electronic check (ACH)',
- );
-
-$cgi->param('payname') =~ /^([\w \,\.\-\']+)$/
- or eidiot gettext('illegal_name'). " payname: ". $cgi->param('payname');
-my $payname = $1;
-
-$cgi->param('paybatch') =~ /^([\w \!\@\#\$\%\&\(\)\-\+\;\:\'\"\,\.\?\/\=]*)$/
- or eidiot gettext('illegal_text'). " paybatch: ". $cgi->param('paybatch');
-my $paybatch = $1;
-
-my $payinfo;
-my $paycvv = '';
-if ( $payby eq 'CHEK' ) {
-
- $cgi->param('payinfo1') =~ /^(\d+)$/
- or eidiot "illegal account number ". $cgi->param('payinfo1');
- my $payinfo1 = $1;
- $cgi->param('payinfo2') =~ /^(\d+)$/
- or eidiot "illegal ABA/routing number ". $cgi->param('payinfo2');
- my $payinfo2 = $1;
- $payinfo = $payinfo1. '@'. $payinfo2;
-
-} elsif ( $payby eq 'CARD' ) {
-
- $payinfo = $cgi->param('payinfo');
- $payinfo =~ s/\D//g;
- $payinfo =~ /^(\d{13,16})$/
- or eidiot gettext('invalid_card'); # . ": ". $self->payinfo;
- $payinfo = $1;
- validate($payinfo)
- or eidiot gettext('invalid_card'); # . ": ". $self->payinfo;
- eidiot gettext('unknown_card_type')
- if cardtype($payinfo) eq "Unknown";
-
- if ( defined $cust_main->dbdef_table->column('paycvv') ) {
- if ( length($cgi->param('paycvv') ) ) {
- if ( cardtype($payinfo) eq 'American Express card' ) {
- $cgi->param('paycvv') =~ /^(\d{4})$/
- or eidiot "CVV2 (CID) for American Express cards is four digits.";
- $paycvv = $1;
- } else {
- $cgi->param('paycvv') =~ /^(\d{3})$/
- or eidiot "CVV2 (CVC2/CID) is three digits.";
- $paycvv = $1;
- }
- }
- }
-
-} else {
- die "unknown payby $payby";
-}
-
-my $error = $cust_main->realtime_bop( $payby2bop{$payby}, $amount,
- 'quiet' => 1,
- 'payinfo' => $payinfo,
- 'paydate' => "$year-$month-01",
- 'payname' => $payname,
- 'paybatch' => $paybatch,
- 'paycvv' => $paycvv,
- map { $_ => $cgi->param($_) } @{$payby2fields{$payby}}
-);
-eidiot($error) if $error;
-
-$cust_main->apply_payments;
-
-if ( $cgi->param('save') ) {
- my $new = new FS::cust_main { $cust_main->hash };
- if ( $payby eq 'CARD' ) {
- $new->set( 'payby' => ( $cgi->param('auto') ? 'CARD' : 'DCRD' ) );
- } elsif ( $payby eq 'CHEK' ) {
- $new->set( 'payby' => ( $cgi->param('auto') ? 'CHEK' : 'DCHK' ) );
- } else {
- die "unknown payby $payby";
- }
- $new->set( 'payinfo' => $payinfo );
- $new->set( 'paydate' => "$year-$month-01" );
- $new->set( 'payname' => $payname );
-
- #false laziness w/FS:;cust_main::realtime_bop - check both to make sure
- # working correctly
- my $conf = new FS::Conf;
- if ( $payby eq 'CARD' &&
- grep { $_ eq cardtype($payinfo) } $conf->config('cvv-save') ) {
- $new->set( 'paycvv' => $paycvv );
- } else {
- $new->set( 'paycvv' => '');
- }
-
- $new->set( $_ => $cgi->param($_) ) foreach @{$payby2fields{$payby}};
-
- my $error = $new->replace($cust_main);
- eidiot "payment processed sucessfully, but error saving info: $error"
- if $error;
- $cust_main = $new;
-}
-
-#success!
-
-%>
-<%= include( '/elements/header.html', ucfirst($type{$payby}). ' processing sucessful',
- include('/elements/menubar.html',
- 'Main menu' => popurl(3),
- "View this customer (#$custnum)" =>
- popurl(3). "view/cust_main.cgi?$custnum",
- ),
-
- )
-%>
-<%= include( '/elements/small_custview.html', $cust_main ) %>
-</BODY>
-</HTML>
diff --git a/httemplate/search/cust_main.cgi b/httemplate/search/cust_main.cgi
index 69a78d6fe..2b1ab83b1 100755
--- a/httemplate/search/cust_main.cgi
+++ b/httemplate/search/cust_main.cgi
@@ -498,9 +498,7 @@ sub cardsearch {
$card =~ /^(\d{13,16})$/ or eidiot "Illegal card number\n";
my($payinfo)=$1;
- [ qsearch('cust_main',{'payinfo'=>$payinfo, 'payby'=>'CARD'}),
- qsearch('cust_main',{'payinfo'=>$payinfo, 'payby'=>'DCRD'})
- ];
+ [ qsearch('cust_main',{'payinfo'=>$payinfo, 'payby'=>'CARD'}) ];
}
sub referralsearch {
diff --git a/httemplate/search/cust_pkg.cgi b/httemplate/search/cust_pkg.cgi
index 6d26317e0..9deaee591 100755
--- a/httemplate/search/cust_pkg.cgi
+++ b/httemplate/search/cust_pkg.cgi
@@ -223,7 +223,7 @@ if ( scalar(@cust_pkg) == 1 ) {
<TH><FONT SIZE=-1>Setup</FONT></TH>
END
- print '<TH><FONT SIZE=-1>Last<BR>bill</FONT></TH>'
+ print '<TH><FONT SIZE=-1>Next<BR>bill</FONT></TH>'
if defined dbdef->table('cust_pkg')->column('last_bill');
print <<END;
diff --git a/httemplate/search/elements/search.html b/httemplate/search/elements/search.html
deleted file mode 100644
index fbedcaa26..000000000
--- a/httemplate/search/elements/search.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<%
-
- my %opt = @_;
- unless (exists($opt{'count_query'}) && length($opt{'count_query'})) {
- ( $opt{'count_query'} = $opt{'query'} ) =~
- s/^\s*SELECT\s*(.*)\s+FROM\s/SELECT COUNT(*) FROM /i;
- }
-
- my $conf = new FS::Conf;
- my $maxrecords = $conf->config('maxsearchrecordsperpage');
-
- my $limit = $maxrecords ? "LIMIT $maxrecords" : '';
-
- my $offset = $cgi->param('offset') || 0;
- $limit .= " OFFSET $offset" if $offset;
-
- my $count_sth = dbh->prepare($opt{'count_query'})
- or die "Error preparing $opt{'count_query'}: ". dbh->errstr;
- $count_sth->execute
- or die "Error executing $opt{'count_query'}: ". $count_sth->errstr;
- my $total = $count_sth->fetchrow_arrayref->[0];
-
- my $sth = dbh->prepare("$opt{'query'} $limit")
- or die "Error preparing $opt{'query'}: ". dbh->errstr;
- $sth->execute
- or die "Error executing $opt{'query'}: ". $sth->errstr;
-
- #can get # of rows without fetching them all?
- my $rows = $sth->fetchall_arrayref;
-
-%>
-<!-- mason kludge -->
-<% my $pager = include ( '/elements/pager.html',
- 'offset' => $offset,
- 'num_rows' => scalar(@$rows),
- 'total' => $total,
- 'maxrecords' => $maxrecords,
- );
-%>
-
-<%= $total %> total <%= $opt{'name'} %><BR><BR><%= $pager %>
-<%= include( '/elements/table.html' ) %>
- <TR>
- <% foreach ( @{$sth->{NAME}} ) { %>
- <TH><%= $_ %></TH>
- <% } %>
- </TR>
- <% foreach my $row ( @$rows ) { %>
- <TR>
- <% foreach ( @$row ) { %>
- <TD><%= $_ %></TD>
- <% } %>
- </TR>
- <% } %>
-
-</TABLE>
-<%= $pager %>
-</BODY>
-</HTML>
diff --git a/httemplate/search/report_cc.cgi b/httemplate/search/report_cc.cgi
index c2ab726b6..ff8c1fb0b 100755
--- a/httemplate/search/report_cc.cgi
+++ b/httemplate/search/report_cc.cgi
@@ -1,7 +1,8 @@
<!-- mason kludge -->
<%
-my $user = getotaker;
+#my $user = getotaker;
+my $user = $FS::UID::user; #dumb 1.4 8-char workaround
$cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/;
my $beginning = $1;
diff --git a/httemplate/search/report_credit.cgi b/httemplate/search/report_credit.cgi
index 2adafc06e..05017f4a9 100755
--- a/httemplate/search/report_credit.cgi
+++ b/httemplate/search/report_credit.cgi
@@ -1,7 +1,8 @@
<!-- mason kludge -->
<%
-my $user = getotaker;
+#my $user = getotaker;
+my $user = $FS::UID::user; #dumb 1.4 8-char workaround
$cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/;
my $beginning = $1;
diff --git a/httemplate/search/report_tax.cgi b/httemplate/search/report_tax.cgi
index ac76fad6e..835554a2e 100755
--- a/httemplate/search/report_tax.cgi
+++ b/httemplate/search/report_tax.cgi
@@ -1,7 +1,8 @@
<!-- mason kludge -->
<%
-my $user = getotaker;
+#my $user = getotaker;
+my $user = $FS::UID::user; #dumb 1.4 8-char workaround
$cgi->param('beginning') =~ /^([ 0-9\-\/]{0,10})$/;
my $beginning = $1;
diff --git a/httemplate/search/sql.cgi b/httemplate/search/sql.cgi
new file mode 100755
index 000000000..b83ef039f
--- /dev/null
+++ b/httemplate/search/sql.cgi
@@ -0,0 +1,76 @@
+<%
+
+my $conf = new FS::Conf;
+my $maxrecords = $conf->config('maxsearchrecordsperpage');
+
+my $limit = '';
+$limit .= "LIMIT $maxrecords" if $maxrecords;
+
+my $offset = $cgi->param('offset') || 0;
+$limit .= " OFFSET $offset" if $offset;
+
+my $total;
+
+my $sql = $cgi->param('sql');
+$sql =~ s/^\s*SELECT//i;
+
+my $count_sql = $sql;
+$count_sql =~ s/^(.*)\s+FROM\s/COUNT(*) FROM /i;
+
+my $sth = dbh->prepare("SELECT $count_sql")
+ or eidiot dbh->errstr. " doing $count_sql\n";
+$sth->execute or eidiot "Error executing \"$count_sql\": ". $sth->errstr;
+
+$total = $sth->fetchrow_arrayref->[0];
+
+my $sth = dbh->prepare("SELECT $sql $limit")
+ or eidiot dbh->errstr. " doing $sql\n";
+$sth->execute or eidiot "Error executing \"$sql\": ". $sth->errstr;
+my $rows = $sth->fetchall_arrayref;
+
+%>
+<!-- mason kludge -->
+<%
+
+ #begin pager
+ my $pager = '';
+ if ( $total != scalar(@$rows) && $maxrecords ) {
+ unless ( $offset == 0 ) {
+ $cgi->param('offset', $offset - $maxrecords);
+ $pager .= '<A HREF="'. $cgi->self_url.
+ '"><B><FONT SIZE="+1">Previous</FONT></B></A> ';
+ }
+ my $poff;
+ my $page;
+ for ( $poff = 0; $poff < $total; $poff += $maxrecords ) {
+ $page++;
+ if ( $offset == $poff ) {
+ $pager .= qq!<FONT SIZE="+2">$page</FONT> !;
+ } else {
+ $cgi->param('offset', $poff);
+ $pager .= qq!<A HREF="!. $cgi->self_url. qq!">$page</A> !;
+ }
+ }
+ unless ( $offset + $maxrecords > $total ) {
+ $cgi->param('offset', $offset + $maxrecords);
+ $pager .= '<A HREF="'. $cgi->self_url.
+ '"><B><FONT SIZE="+1">Next</FONT></B></A> ';
+ }
+ }
+ #end pager
+
+ print header('Query Results', menubar('Main Menu'=>$p) ).
+ "$total total rows<BR><BR>$pager". table().
+ "<TR>";
+ print "<TH>$_</TH>" foreach @{$sth->{NAME}};
+ print "</TR>";
+
+ foreach $row ( @$rows ) {
+ print "<TR>";
+ print "<TD>$_</TD>" foreach @$row;
+ print "</TR>";
+ }
+
+ print "</TABLE>$pager</BODY></HTML>";
+
+%>
diff --git a/httemplate/search/sql.html b/httemplate/search/sql.html
deleted file mode 100644
index 7d7fc0890..000000000
--- a/httemplate/search/sql.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<%= include( '/elements/header.html', 'Query Results',
- include( '/elements/menubar.html', 'Main Menu' => $p )
- )
-%>
-
-<%= include( 'elements/search.html',
- 'name' => 'rows',
- 'query' => 'SELECT '. ( $cgi->param('sql')
- || eidiot('Empty query') ),
- )
-%>
-
diff --git a/httemplate/search/svc_acct.cgi b/httemplate/search/svc_acct.cgi
index 1e4a03d84..29e851d91 100755
--- a/httemplate/search/svc_acct.cgi
+++ b/httemplate/search/svc_acct.cgi
@@ -1,5 +1,7 @@
<%
+my $mydomain = '';
+
my $conf = new FS::Conf;
my $maxrecords = $conf->config('maxsearchrecordsperpage');
@@ -162,8 +164,14 @@ END
$domain = "<A HREF=\"${p}view/svc_domain.cgi?". $svc_domain->svcnum.
"\">". $svc_domain->domain. "</A>";
} else {
- die "No svc_domain.svcnum record for svc_acct.domsvc: ".
- $svc_acct->domsvc;
+ unless ( $mydomain ) {
+ my $conf = new FS::Conf;
+ unless ( $mydomain = $conf->config('domain') ) {
+ die "No legacy domain config file and no svc_domain.svcnum record ".
+ "for svc_acct.domsvc: ". $svc_acct->domsvc;
+ }
+ }
+ $domain = "<i>$mydomain</i><FONT COLOR=\"#FF0000\">*</FONT>";
}
my($cust_pkg,$cust_main);
if ( $cust_svc->pkgnum ) {
@@ -225,8 +233,17 @@ END
}
- print "</TABLE>$pager<BR>".
- '</BODY></HTML>';
+ print "</TABLE>$pager<BR>";
+
+ if ( $mydomain ) {
+ print "<BR><FONT COLOR=\"#FF0000\">*</FONT> The <I>$mydomain</I> domain ".
+ "is contained in your legacy <CODE>domain</CODE> ".
+ "<A HREF=\"${p}docs/config.html#domain\">configuration file</A>. ".
+ "You should run the <CODE>bin/fs-migrate-svc_acct_sm</CODE> script ".
+ "to create a proper svc_domain record for this domain.";
+ }
+
+ print '</BODY></HTML>';
}
diff --git a/httemplate/search/svc_acct_sm.cgi b/httemplate/search/svc_acct_sm.cgi
new file mode 100755
index 000000000..4ee300612
--- /dev/null
+++ b/httemplate/search/svc_acct_sm.cgi
@@ -0,0 +1,84 @@
+<%
+
+my $conf = new FS::Conf;
+my $mydomain = $conf->config('domain');
+
+$cgi->param('domuser') =~ /^([a-z0-9_\-]{0,32})$/;
+my $domuser = $1;
+
+$cgi->param('domain') =~ /^([\w\-\.]+)$/ or die "Illegal domain";
+my $svc_domain = qsearchs('svc_domain',{'domain'=>$1})
+ or die "Unknown domain";
+my $domsvc = $svc_domain->svcnum;
+
+my @svc_acct_sm;
+if ($domuser) {
+ @svc_acct_sm=qsearch('svc_acct_sm',{
+ 'domuser' => $domuser,
+ 'domsvc' => $domsvc,
+ });
+} else {
+ @svc_acct_sm=qsearch('svc_acct_sm',{'domsvc' => $domsvc});
+}
+
+if ( scalar(@svc_acct_sm) == 1 ) {
+ my($svcnum)=$svc_acct_sm[0]->svcnum;
+ print $cgi->redirect(popurl(2). "view/svc_acct_sm.cgi?$svcnum");
+} elsif ( scalar(@svc_acct_sm) > 1 ) {
+%>
+<!-- mason kludge -->
+<%
+ print header('Mail Alias Search Results'), &table(), <<END;
+ <TR>
+ <TH>Mail to<BR><FONT SIZE=-1>(click to view mail alias)</FONT></TH>
+ <TH>Forwards to<BR><FONT SIZE=-1>(click to view account)</FONT></TH>
+ </TR>
+END
+
+ my($svc_acct_sm);
+ foreach $svc_acct_sm (@svc_acct_sm) {
+ my($svcnum,$domuser,$domuid,$domsvc)=(
+ $svc_acct_sm->svcnum,
+ $svc_acct_sm->domuser,
+ $svc_acct_sm->domuid,
+ $svc_acct_sm->domsvc,
+ );
+
+ my $svc_domain = qsearchs( 'svc_domain', { 'svcnum' => $domsvc } );
+ if ( $svc_domain ) {
+ my $domain = $svc_domain->domain;
+
+ print qq!<TR><TD><A HREF="!. popurl(2). qq!view/svc_acct_sm.cgi?$svcnum">!,
+ #print '', ( ($domuser eq '*') ? "<I>(anything)</I>" : $domuser );
+ ( ($domuser eq '*') ? "<I>(anything)</I>" : $domuser ),
+ qq!\@$domain</A> </TD>!,
+ ;
+ } else {
+ my $warning = "couldn't find svc_domain.svcnum $svcnum ( svc_acct_sm.svcnum $svcnum";
+ warn $warning;
+ print "<TR><TD>WARNING: $warning</TD>";
+ }
+
+ my $svc_acct = qsearchs( 'svc_acct', { 'uid' => $domuid } );
+ if ( $svc_acct ) {
+ my $username = $svc_acct->username;
+ my $svc_acct_svcnum =$svc_acct->svcnum;
+ print qq!<TD><A HREF="!, popurl(2),
+ qq!view/svc_acct.cgi?$svc_acct_svcnum">$username\@$mydomain</A>!,
+ qq!</TD></TR>!
+ ;
+ } else {
+ my $warning = "couldn't find svc_acct.uid $domuid (svc_acct_sm.svcnum $svcnum)!";
+ warn $warning;
+ print "<TD>WARNING: $warning</TD></TR>";
+ }
+
+ }
+
+ print '</TABLE></BODY></HTML>';
+
+} else { #error
+ idiot("Mail Alias not found");
+}
+
+%>
diff --git a/httemplate/search/svc_acct_sm.html b/httemplate/search/svc_acct_sm.html
new file mode 100755
index 000000000..0719856db
--- /dev/null
+++ b/httemplate/search/svc_acct_sm.html
@@ -0,0 +1,23 @@
+<HTML>
+ <HEAD>
+ <TITLE>Mail Alias Search</TITLE>
+ </HEAD>
+ <BODY>
+ <CENTER>
+ <H1>Mail Alias Search</H1>
+ </CENTER>
+ <HR>
+ <FORM ACTION="svc_acct_sm.cgi" METHOD="post">
+ Search for <B>mail alias</B>:
+ <INPUT TYPE="text" NAME="domuser"><FONT SIZE=-1>(opt.)</FONT> @
+ <INPUT TYPE="text" NAME="domain"><FONT SIZE=-1>(req.)</FONT>
+
+ <P><INPUT TYPE="submit" VALUE="Search">
+
+ </FORM>
+
+ <HR>
+
+ </BODY>
+</HTML>
+
diff --git a/httemplate/search/svc_domain.cgi b/httemplate/search/svc_domain.cgi
index 948b1d9ae..cd78dc128 100755
--- a/httemplate/search/svc_domain.cgi
+++ b/httemplate/search/svc_domain.cgi
@@ -1,6 +1,7 @@
<%
my $conf = new FS::Conf;
+my $mydomain = $conf->config('domain');
my($query)=$cgi->keywords;
$query ||= ''; #to avoid use of unitialized value errors
@@ -74,6 +75,18 @@ END
$svc_domain->svcnum,
$svc_domain->domain,
);
+ #my($malias);
+ #if ( qsearch('svc_acct_sm',{'domsvc'=>$svcnum}) ) {
+ # $malias=(
+ # qq|<FORM ACTION="svc_acct_sm.cgi" METHOD="post">|.
+ # qq|<INPUT TYPE="hidden" NAME="domuser" VALUE="">|.
+ # qq|<INPUT TYPE="hidden" NAME="domain" VALUE="$domain">|.
+ # qq|<INPUT TYPE="submit" VALUE="(mail aliases)">|.
+ # qq|</FORM>|
+ # );
+ #} else {
+ # $malias='';
+ #}
#don't display all accounts here
my $rowspan = 1;
diff --git a/httemplate/view/cust_main.cgi b/httemplate/view/cust_main.cgi
index dd9cd3075..bb275a833 100755
--- a/httemplate/view/cust_main.cgi
+++ b/httemplate/view/cust_main.cgi
@@ -570,12 +570,9 @@ function cust_credit_areyousure(href) {
<% if ( $conf->config('payby-default') ne 'HIDE' ) { %>
- <BR><BR><A NAME="history"><FONT SIZE="+2">Payment History</FONT></A><BR>
- <A HREF="<%= $p %>edit/cust_pay.cgi?custnum=<%= $custnum %>">Post cash/check payment</A>
- | <A HREF="<%= $p %>misc/payment.cgi?payby=CARD;custnum=<%= $custnum %>">Process credit card payment</A>
- | <A HREF="<%= $p %>misc/payment.cgi?payby=CHEK;custnum=<%= $custnum %>">Process electronic check (ACH) payment</A>
- <BR><A HREF="<%= $p %>edit/cust_credit.cgi?<%= $custnum %>">Post credit</A>
- <BR>
+ <BR><BR><A NAME="history">Payment History</A>
+ (<A HREF="<%= $p %>edit/cust_pay.cgi?custnum=<%= $custnum %>">Post payment</A>
+ | <A HREF="<%= $p %>edit/cust_credit.cgi?<%= $custnum %>">Post credit</A>)
<%
#get payment history
diff --git a/httemplate/view/cust_pkg.cgi b/httemplate/view/cust_pkg.cgi
index 5f0e6bffc..c3880114c 100755
--- a/httemplate/view/cust_pkg.cgi
+++ b/httemplate/view/cust_pkg.cgi
@@ -71,7 +71,7 @@ print &ntable("#cccccc"), '<TR><TD>', &ntable("#cccccc",2),
( $setup ? time2str("%D",$setup) : "(Not setup)" ), '</TD></TR>';
print '<TR><TD ALIGN="right">Last bill date</TD><TD BGCOLOR="#ffffff">',
- ( $cust_pkg->get('last_bill') ? time2str("%D",$cust_pkg->get('last_bill')) : "&nbsp;" ),
+ ( $cust_pkg->last_bill ? time2str("%D",$cust_pkg->last_bill) : "&nbsp;" ),
'</TD></TR>'
if $cust_pkg->dbdef_table->column('last_bill');
diff --git a/httemplate/view/svc_acct.cgi b/httemplate/view/svc_acct.cgi
index 14d2745a2..8657f16ab 100755
--- a/httemplate/view/svc_acct.cgi
+++ b/httemplate/view/svc_acct.cgi
@@ -2,6 +2,7 @@
<%
my $conf = new FS::Conf;
+my $mydomain = $conf->config('domain');
my($query) = $cgi->keywords;
$query =~ /^(\d+)$/;
@@ -31,7 +32,11 @@ if ( $svc_acct->domsvc ) {
die "Unknown domain" unless $svc_domain;
$domain = $svc_domain->domain;
} else {
- die "No svc_domain.svcnum record for svc_acct.domsvc: ". $cust_svc->domsvc;
+ unless ( $mydomain ) {
+ die "No legacy domain config file and no svc_domain.svcnum record ".
+ "for svc_acct.domsvc: ". $cust_svc->domsvc;
+ }
+ $domain = $mydomain;
}
%>
@@ -173,7 +178,7 @@ if ($svc_acct->slipip) {
: $svc_acct->slipip
). "</TD>";
my($attribute);
- foreach $attribute ( grep /^radius_/, $svc_acct->fields ) {
+ foreach $attribute ( grep /^radius_/, fields('svc_acct') ) {
#warn $attribute;
$attribute =~ /^radius_(.*)$/;
my $pattribute = $FS::raddb::attrib{$1};
@@ -181,7 +186,7 @@ if ($svc_acct->slipip) {
"<TD BGCOLOR=\"#ffffff\">". $svc_acct->getfield($attribute).
"</TD></TR>";
}
- foreach $attribute ( grep /^rc_/, $svc_acct->fields ) {
+ foreach $attribute ( grep /^rc_/, fields('svc_acct') ) {
#warn $attribute;
$attribute =~ /^rc_(.*)$/;
my $pattribute = $FS::raddb::attrib{$1};
@@ -196,19 +201,7 @@ if ($svc_acct->slipip) {
print '<TR><TD ALIGN="right">RADIUS groups</TD><TD BGCOLOR="#ffffff">'.
join('<BR>', $svc_acct->radius_groups). '</TD></TR>';
-# Can this be abstracted further? Maybe a library function like
-# widget('HTML', 'view', $svc_acct) ? It would definitely make UI
-# style management easier.
-
-foreach (sort { $a cmp $b } $svc_acct->virtual_fields) {
- print $svc_acct->pvf($_)->widget('HTML', 'view', $svc_acct->getfield($_)),
- "\n";
-}
-%>
-</TABLE></TD></TR></TABLE>
-<%
-
-print '<BR><BR>';
+print '</TABLE></TD></TR></TABLE><BR><BR>';
print join("\n", $conf->config('svc_acct-notes') ). '<BR><BR>'.
joblisting({'svcnum'=>$svcnum}, 1). '</BODY></HTML>';
diff --git a/httemplate/view/svc_acct_sm.cgi b/httemplate/view/svc_acct_sm.cgi
new file mode 100755
index 000000000..4e5acc427
--- /dev/null
+++ b/httemplate/view/svc_acct_sm.cgi
@@ -0,0 +1,58 @@
+<!-- mason kludge -->
+<%
+
+my $conf = new FS::Conf;
+my $mydomain = $conf->config('domain');
+
+my($query) = $cgi->keywords;
+$query =~ /^(\d+)$/;
+my $svcnum = $1;
+my $svc_acct_sm = qsearchs('svc_acct_sm',{'svcnum'=>$svcnum});
+die "Unknown svcnum" unless $svc_acct_sm;
+
+my $cust_svc = qsearchs('cust_svc',{'svcnum'=>$svcnum});
+my $pkgnum = $cust_svc->getfield('pkgnum');
+my($cust_pkg, $custnum);
+if ($pkgnum) {
+ $cust_pkg=qsearchs('cust_pkg',{'pkgnum'=>$pkgnum});
+ $custnum=$cust_pkg->getfield('custnum');
+} else {
+ $cust_pkg = '';
+ $custnum = '';
+}
+
+my $part_svc = qsearchs('part_svc',{'svcpart'=> $cust_svc->svcpart } )
+ or die "Unkonwn svcpart";
+
+print header('Mail Alias View', menubar(
+ ( ( $pkgnum || $custnum )
+ ? ( "View this package (#$pkgnum)" => "${p}view/cust_pkg.cgi?$pkgnum",
+ "View this customer (#$custnum)" => "${p}view/cust_main.cgi?$custnum",
+ )
+ : ( "Cancel this (unaudited) account" =>
+ "${p}misc/cancel-unaudited.cgi?$svcnum" )
+ ),
+ "Main menu" => $p,
+));
+
+my($domsvc,$domuid,$domuser) = (
+ $svc_acct_sm->domsvc,
+ $svc_acct_sm->domuid,
+ $svc_acct_sm->domuser,
+);
+my $svc = $part_svc->svc;
+my $svc_domain = qsearchs('svc_domain',{'svcnum'=>$domsvc})
+ or die "Corrupted database: no svc_domain.svcnum matching domsvc $domsvc";
+my $domain = $svc_domain->domain;
+my $svc_acct = qsearchs('svc_acct',{'uid'=>$domuid})
+ or die "Corrupted database: no svc_acct.uid matching domuid $domuid";
+my $username = $svc_acct->username;
+
+print qq!<A HREF="${p}edit/svc_acct_sm.cgi?$svcnum">Edit this information</A>!,
+ "<BR>Service #$svcnum",
+ "<BR>Service: <B>$svc</B>",
+ qq!<BR>Mail to <B>!, ( ($domuser eq '*') ? "<I>(anything)</I>" : $domuser ) , qq!</B>\@<B>$domain</B> forwards to <B>$username</B>\@$mydomain mailbox.!,
+ '</BODY></HTML>'
+;
+
+%>
diff --git a/httemplate/view/svc_broadband.cgi b/httemplate/view/svc_broadband.cgi
deleted file mode 100644
index ae23386a1..000000000
--- a/httemplate/view/svc_broadband.cgi
+++ /dev/null
@@ -1,142 +0,0 @@
-<!-- mason kludge -->
-<%
-
-my($query) = $cgi->keywords;
-$query =~ /^(\d+)$/;
-my $svcnum = $1;
-my $svc_broadband = qsearchs( 'svc_broadband', { 'svcnum' => $svcnum } )
- or die "svc_broadband: Unknown svcnum $svcnum";
-
-#false laziness w/all svc_*.cgi
-my $cust_svc = qsearchs( 'cust_svc', { 'svcnum' => $svcnum } );
-my $pkgnum = $cust_svc->getfield('pkgnum');
-my($cust_pkg, $custnum);
-if ($pkgnum) {
- $cust_pkg = qsearchs( 'cust_pkg', { 'pkgnum' => $pkgnum } );
- $custnum = $cust_pkg->custnum;
-} else {
- $cust_pkg = '';
- $custnum = '';
-}
-#eofalse
-
-my $router = $svc_broadband->addr_block->router;
-
-if (not $router) { die "Could not lookup router for svc_broadband (svcnum $svcnum)" };
-
-my (
- $routername,
- $routernum,
- $speed_down,
- $speed_up,
- $ip_addr
- ) = (
- $router->getfield('routername'),
- $router->getfield('routernum'),
- $svc_broadband->getfield('speed_down'),
- $svc_broadband->getfield('speed_up'),
- $svc_broadband->getfield('ip_addr')
- );
-%>
-
-<%=header('Broadband Service View', menubar(
- ( ( $custnum )
- ? ( "View this customer (#$custnum)" => "${p}view/cust_main.cgi?$custnum",
- )
- : ( "Cancel this (unaudited) website" =>
- "${p}misc/cancel-unaudited.cgi?$svcnum" )
- ),
- "Main menu" => $p,
-))
-%>
-
-<A HREF="<%=${p}%>edit/svc_broadband.cgi?<%=$svcnum%>">Edit this information</A>
-<BR>
-<%=ntable("#cccccc")%>
- <TR>
- <TD>
- <%=ntable("#cccccc",2)%>
- <TR>
- <TD ALIGN="right">Service number</TD>
- <TD BGCOLOR="#ffffff"><%=$svcnum%></TD>
- </TR>
- <TR>
- <TD ALIGN="right">Router</TD>
- <TD BGCOLOR="#ffffff"><%=$routernum%>: <%=$routername%></TD>
- </TR>
- <TR>
- <TD ALIGN="right">Download Speed</TD>
- <TD BGCOLOR="#ffffff"><%=$speed_down%></TD>
- </TR>
- <TR>
- <TD ALIGN="right">Upload Speed</TD>
- <TD BGCOLOR="#ffffff"><%=$speed_up%></TD>
- </TR>
- <TR>
- <TD ALIGN="right">IP Address</TD>
- <TD BGCOLOR="#ffffff"><%=$ip_addr%></TD>
- </TR>
- <TR COLSPAN="2"><TD></TD></TR>
-
-<%
-foreach (sort { $a cmp $b } $svc_broadband->virtual_fields) {
- print $svc_broadband->pvf($_)->widget('HTML', 'view',
- $svc_broadband->getfield($_)), "\n";
-}
-
-%>
- </TABLE>
- </TD>
- </TR>
-</TABLE>
-
-<BR>
-<%=ntable("#cccccc", 2)%>
-<%
- my $sb_router = qsearchs('router', { svcnum => $svcnum });
- if ($sb_router) {
- %>
- <B>Router associated: <%=$sb_router->routername%> </B>
- <A HREF="<%=popurl(2)%>edit/router.cgi?<%=$sb_router->routernum%>">
- (details)
- </A>
- <BR>
- <% my @addr_block;
- if (@addr_block = $sb_router->addr_block) {
- %>
- <B>Address space </B>
- <A HREF="<%=popurl(2)%>browse/addr_block.cgi">
- (edit)
- </A>
- <BR>
- <% print ntable("#cccccc", 1);
- foreach (@addr_block) { %>
- <TR>
- <TD><%=$_->ip_gateway%>/<%=$_->ip_netmask%></TD>
- </TR>
- <% } %>
- </TABLE>
- <% } else { %>
- <B>No address space allocated.</B>
- <% } %>
- <BR>
- <%
- } else {
-%>
-
-<FORM METHOD="GET" ACTION="<%=popurl(2)%>edit/router.cgi">
- <INPUT TYPE="hidden" NAME="svcnum" VALUE="<%=$svcnum%>">
-Add router named
- <INPUT TYPE="text" NAME="routername" SIZE="32" VALUE="Broadband router (<%=$svcnum%>)">
- <INPUT TYPE="submit" VALUE="Add router">
-</FORM>
-
-<%
-}
-%>
-
-<BR>
-<%=joblisting({'svcnum'=>$svcnum}, 1)%>
- </BODY>
-</HTML>
-
diff --git a/httemplate/view/svc_domain.cgi b/httemplate/view/svc_domain.cgi
index 1dbe16d23..e4b16d998 100755
--- a/httemplate/view/svc_domain.cgi
+++ b/httemplate/view/svc_domain.cgi
@@ -47,7 +47,7 @@ Service #<%= $svcnum %>
<BR>Domain name: <B><%= $domain %></B>
<BR>Catch all email <A HREF="<%= ${p} %>misc/catchall.cgi?<%= $svcnum %>">(change)</A>:
<%= $email ? "<B>$email</B>" : "<I>(none)<I>" %>
-<BR><BR><A HREF="<%= ${p} %>misc/whois.cgi?custnum=<%=$custnum%>;svcnum=<%=$svcnum%>;domain=<%=$domain%>">View whois information.</A>
+<BR><BR><A HREF="http://www.geektools.com/cgi-bin/proxy.cgi?query=<%=$domain%>;targetnic=auto">View whois information.</A>
<BR><BR>
<SCRIPT>
function areyousure(href) {
diff --git a/httemplate/view/svc_external.cgi b/httemplate/view/svc_external.cgi
deleted file mode 100644
index 59cc357c7..000000000
--- a/httemplate/view/svc_external.cgi
+++ /dev/null
@@ -1,51 +0,0 @@
-<!-- mason kludge -->
-<%
-
-my($query) = $cgi->keywords;
-$query =~ /^(\d+)$/;
-my $svcnum = $1;
-my $svc_external = qsearchs( 'svc_external', { 'svcnum' => $svcnum } )
- or die "svc_external: Unknown svcnum $svcnum";
-
-#false laziness w/all svc_*.cgi
-my $cust_svc = qsearchs( 'cust_svc', { 'svcnum' => $svcnum } );
-my $pkgnum = $cust_svc->getfield('pkgnum');
-my($cust_pkg, $custnum);
-if ($pkgnum) {
- $cust_pkg = qsearchs( 'cust_pkg', { 'pkgnum' => $pkgnum } );
- $custnum = $cust_pkg->custnum;
-} else {
- $cust_pkg = '';
- $custnum = '';
-}
-#eofalse
-
-%>
-
-<%= header('External Service View', menubar(
- ( ( $custnum )
- ? ( "View this customer (#$custnum)" => "${p}view/cust_main.cgi?$custnum",
- )
- : ( "Cancel this (unaudited) external service" =>
- "${p}misc/cancel-unaudited.cgi?$svcnum" )
- ),
- "Main menu" => $p,
-)) %>
-
-<A HREF="<%=$p%>edit/svc_external.cgi?<%=$svcnum%>">Edit this information</A><BR>
-<%= ntable("#cccccc") %><TR><TD><%= ntable("#cccccc",2) %>
-
-<TR><TD ALIGN="right">Service number</TD>
- <TD BGCOLOR="#ffffff"><%= $svcnum %></TD></TR>
-<TR><TD ALIGN="right">External ID</TD>
- <TD BGCOLOR="#ffffff"><%= $svc_external->id %></TD></TR>
-<TR><TD ALIGN="right">Title</TD>
- <TD BGCOLOR="#ffffff"><%= $svc_external->title %></TD></TR>
-
-<% foreach (sort { $a cmp $b } $svc_external->virtual_fields) { %>
- <%= $svc_external->pvf($_)->widget('HTML', 'view', $svc_external->getfield($_)) %>
-<% } %>
-
-</TABLE></TD></TR></TABLE>
-<BR><%= joblisting({'svcnum'=>$svcnum}, 1) %>
-</BODY></HTML>
diff --git a/httemplate/view/svc_forward.cgi b/httemplate/view/svc_forward.cgi
index 52360bcc2..97bb45615 100755
--- a/httemplate/view/svc_forward.cgi
+++ b/httemplate/view/svc_forward.cgi
@@ -69,14 +69,7 @@ print qq!<A HREF="${p}edit/svc_forward.cgi?$svcnum">Edit this information</A>!.
qq!<TR><TD ALIGN="right">Email to</TD>!.
qq!<TD BGCOLOR="#ffffff">$source</TD></TR>!.
qq!<TR><TD ALIGN="right">Forwards to </TD>!.
- qq!<TD BGCOLOR="#ffffff">$destination</TD></TR>!;
-
-foreach (sort { $a cmp $b } $svc_forward->virtual_fields) {
- print $svc_forward->pvf($_)->widget('HTML', 'view', $svc_forward->getfield($_)),
- "\n";
-}
-
-print qq! </TABLE>!.
+ qq!<TD BGCOLOR="#ffffff">$destination</TD></TR></TABLE>!.
'<BR>'. joblisting({'svcnum'=>$svcnum}, 1).
'</BODY></HTML>'
;
diff --git a/httemplate/view/svc_www.cgi b/httemplate/view/svc_www.cgi
index 2980f846b..6697b44bc 100644
--- a/httemplate/view/svc_www.cgi
+++ b/httemplate/view/svc_www.cgi
@@ -46,15 +46,8 @@ print header('Website View', menubar(
qq!<TR><TD ALIGN="right">Website name</TD>!.
qq!<TD BGCOLOR="#ffffff"><A HREF="http://$www">$www<A></TD></TR>!.
qq!<TR><TD ALIGN="right">Account</TD>!.
- qq!<TD BGCOLOR="#ffffff"><A HREF="${p}view/svc_acct.cgi?$usersvc">$email</A></TD></TR>!;
-
-foreach (sort { $a cmp $b } $svc_www->virtual_fields) {
- print $svc_www->pvf($_)->widget('HTML', 'view', $svc_www->getfield($_)),
- "\n";
-}
-
-
-print '</TABLE></TD></TR></TABLE>'.
+ qq!<TD BGCOLOR="#ffffff"><A HREF="${p}view/svc_acct.cgi?$usersvc">$email</A></TD></TR>!.
+ '</TABLE></TD></TR></TABLE>'.
'<BR>'. joblisting({'svcnum'=>$svcnum}, 1).
'</BODY></HTML>'
;