- update install documentation for 1.5 HTML::Mason or Apache::ASP install
# - historical late notice viewing in web interface
- VoIP billing for CDRs from RADIUS
-# - promotional codes for signup
+- promotional codes for signup
+- lots of RT integration
use strict;
use vars qw($VERSION);
-$VERSION = '0.01';
+$VERSION = '%%%VERSION%%%';
#find missing entries in this file with:
# for a in `ls *pm | cut -d. -f1`; do grep 'L<FS::'$a'>' ../FS.pm >/dev/null || echo "missing $a" ; done
'select_enum' => [ 'generic', 'artera_turbo', ],
},
+ {
+ 'key' => 'ticket_system',
+ 'section' => '',
+ 'description' => 'Ticketing system integraiton. <b>RT_Internal</b> uses the built-in RT ticketing system (use <code>make create-rt</code> to create the necessary tables). <b>RT_Libs</b> uses the built-in RT libraries to access an RT installation in a separate database (local or remote). <b>RT_External</b> uses RT\'s XML interface and RTx::Atom to access an RT installation in a separate database (local or remote).',
+ 'type' => 'select',
+ 'select_enum' => [ '', qw(RT_Internal RT_Libs RT_External) ],
+ },
+
);
1;
--- /dev/null
+package FS::TicketSystem::RT_External;
+
+use strict;
+
+1;
+
--- /dev/null
+package FS::TicketSystem::RT_Internal;
+
+use strict;
+
+@ISA = qw( FS::TicketSystem::RT_Libs );
+
+1;
+
--- /dev/null
+package FS::TicketSystem::RT_Libs.pm
+
+use strict;
+
+@ISA = qw( FS::TicketSystem::RT_External );
+
+1;
+
aspdocs: htmlman httemplate/* httemplate/*/* httemplate/*/*/* httemplate/*/*/*/* httemplate/*/*/*/*/*
rm -rf aspdocs
cp -pr httemplate aspdocs
- perl -p -i -e "\
- s/%%%VERSION%%%/${VERSION}/g;\
- " aspdocs/index.html
touch aspdocs
( cd masondocs; \
../bin/masonize; \
)
- perl -p -i -e "\
- s/%%%VERSION%%%/${VERSION}/g;\
- " masondocs/index.html
touch masondocs
alldocs: aspdocs masondocs
perl-modules:
cd FS; \
[ -e Makefile ] || perl Makefile.PL; \
- make
+ make; \
+ perl -p -i -e "\
+ s/%%%VERSION%%%/${VERSION}/g;\
+ " blib/lib/FS.pm
install-perl-modules: perl-modules
cd FS; \
use String::Approx qw(amatch);
use Chart::LinesPoints;
use HTML::Widgets::SelectLayers 0.03;
+use FS;
use FS::UID qw(cgisuidsetup dbh getotaker datasrc driver_name);
use FS::Record qw(qsearch qsearchs fields dbdef);
use FS::Conf;
use String::Approx qw(amatch);
use Chart::LinesPoints;
use HTML::Widgets::SelectLayers 0.03;
+ use FS;
use FS::UID qw(cgisuidsetup dbh getotaker datasrc driver_name);
use FS::Record qw(qsearch qsearchs fields dbdef);
use FS::Conf;
+<!-- mason kludge -->
+<% my $conf = new FS::Conf; %>
<HTML>
<HEAD>
<TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<table width="100%">
- <tr><td>
+ <tr>
+ <td rowspan=2>
<IMG BORDER=0 ALT="freeside" SRC="images/small-logo.png">
- </td><td valign="top">
- <font color="#7f007b" size=7></font>
- </td><td align=right valign=bottom>
- version %%%VERSION%%%
- <BR><A HREF="http://www.sisd.com/freeside">Freeside home page</A>
- <BR><A HREF="docs/">Documentation</A>
- </td></tr>
+ </td>
+ <td align=left rowspan=2> <!-- valign="top" -->
+ <font size=7>Billing</font>
+ </td>
+ <td align=right valign=top>Logged in as <b><%= getotaker %></b>
+ </td>
+ </tr>
+ <tr>
+ <td align=right valign=bottom>
+
+ <table>
+ <tr>
+ <td align=right>
+ <FONT SIZE="-2">
+ Freeside <%= $FS::VERSION %><BR>
+ <A HREF="http://www.sisd.com/freeside">Freeside home page</A><BR>
+ <A HREF="docs/">Documentation</A><BR>
+ </FONT>
+ </td>
+ <% if ( $conf->config('ticket_system') eq 'RT_Internal' ) { %>
+ <% eval "use RT;"; %>
+ <td bgcolor=#000000></td>
+ <td align=left>
+ <FONT SIZE="-2">
+ RT <%= $RT::VERSION %><BR>
+ <A HREF="http://www.bestpractical.com/rt">RT home page</A><BR>
+ <A HREF="http://wiki.bestpractical.com/">Documentation</A><BR>
+ </FONT>
+ </td>
+ <% } %>
+
+ </tr>
+ </table>
+
+ </td>
+ </tr>
</table>
-<BR>
-[<A NAME="customer_service" style="background-color: #cccccc"> Sales / Customer service </A>]
-[ <A HREF="#bookkeeping">Bookkeeping / Collections</A> ]
-[ <A HREF="#reports">Reports</A> ]
-[ <A HREF="#sysadmin">Sysadmin</A> ]
+ <BR>
+
+
+[<A NAME="customer_service" style="background-color: #cccccc"> Sales / Customer service </A>]
+<% if ( $conf->config('ticket_system') ) { %>
+ [ <A HREF="#ticketing">Support / Ticketing</A> ]
+<% } %>
+[ <A HREF="#bookkeeping">Bookkeeping / Collections</A> ]
+[ <A HREF="#reports">Reports</A> ]
+[ <A HREF="#sysadmin">Sysadmin</A> ]
<TABLE CELLSPACING=2 CELLPADDING=0 BORDER=0" WIDTH="100%" BGCOLOR="#eeeeee">
<TR><TH BGCOLOR="#cccccc">Sales / Customer service</TH></TR>
<TR><TD>
</TD></TR>
</TABLE>
+ <BR><BR><BR>
+<% if ( $conf->config('ticket_system') ) { %>
+
+[ <A HREF="#customer_service">Sales / Customer service</A> ]
+[<A NAME="ticketing" style="background-color: #cccccc"> Support / Ticketing </A>]
+[ <A HREF="#bookkeeping">Bookkeeping / Collections</A> ]
+[ <A HREF="#reports">Reports</A> ]
+[ <A HREF="#sysadmin">Sysadmin</A> ]
+ <TABLE CELLSPACING=2 CELLPADDING=0 BORDER=0" WIDTH="100%" BGCOLOR="#eeeeee">
+ <TR><TH BGCOLOR="#cccccc">Support/Ticketing</TH></TR>
+ <TR><TD>
+ <BR><FONT SIZE="+1"><A HREF="rt/">Ticketing Main</A></FONT>
+ <BR>
+ </TD></TR>
+ </TABLE>
<BR><BR><BR>
+<% } %>
+
-[ <A HREF="#customer_service">Sales / Customer service</A> ]
-[<A NAME="bookkeeping" style="background-color: #cccccc"> Bookkeeping / Collections </A>]
-[ <A HREF="#reports">Reports</A> ]
-[ <A HREF="#sysadmin">Sysadmin</A> ]
+[ <A HREF="#customer_service">Sales / Customer service</A> ]
+<% if ( $conf->config('ticket_system') ) { %>
+ [ <A HREF="#ticketing">Support / Ticketing</A> ]
+<% } %>
+[<A NAME="bookkeeping" style="background-color: #cccccc"> Bookkeeping / Collections </A>]
+[ <A HREF="#reports">Reports</A> ]
+[ <A HREF="#sysadmin">Sysadmin</A> ]
<TABLE CELLSPACING=2 CELLPADDING=0 BORDER=0 WIDTH="100%" BGCOLOR="#eeeeee">
<TR><TH BGCOLOR="#cccccc">Bookkeeping / Collections</TH></TR>
<TR><TD>
-[ <A HREF="#customer_service">Sales / Customer service</A> ]
-[ <A HREF="#bookkeeping">Bookkeeping / Collections</A> ]
-[<A NAME="reports" style="background-color: #cccccc"> Reports </A>]
-[ <A HREF="#sysadmin">Sysadmin</A> ]
+[ <A HREF="#customer_service">Sales / Customer service</A> ]
+<% if ( $conf->config('ticket_system') ) { %>
+ [ <A HREF="#ticketing">Support / Ticketing</A> ]
+<% } %>
+[ <A HREF="#bookkeeping">Bookkeeping / Collections</A> ]
+[<A NAME="reports" style="background-color: #cccccc"> Reports </A>]
+[ <A HREF="#sysadmin">Sysadmin</A> ]
<TABLE CELLSPACING=2 CELLPADDING=0 BORDER=0 WIDTH="100%" BGCOLOR="#eeeeee">
<TR><TH BGCOLOR="#cccccc">Reports</TH></TR>
<TR><TD>
<BR><BR><BR>
-[ <A HREF="#customer_service">Sales / Customer service</A> ]
-[ <A HREF="#bookkeeping">Bookkeeping / Collections</A> ]
-[ <A HREF="#reports">Reports</A> ]
-[<A NAME="sysadmin" style="background-color: #cccccc"> Sysadmin </A>]
+[ <A HREF="#customer_service">Sales / Customer service</A> ]
+<% if ( $conf->config('ticket_system') ) { %>
+ [ <A HREF="#ticketing">Support / Ticketing</A> ]
+<% } %>
+[ <A HREF="#bookkeeping">Bookkeeping / Collections</A> ]
+[ <A HREF="#reports">Reports</A> ]
+[<A NAME="sysadmin" style="background-color: #cccccc"> Sysadmin </A>]
<TABLE CELLSPACING=2 CELLPADDING=0 BORDER=0 WIDTH="100%" BGCOLOR="#eeeeee">
<TR><TH BGCOLOR="#cccccc">Sysadmin</TH></TR>
<TR><TD>
config.layout.in
etc/RT_SiteConfig.pm
lib/RT/URI/freeside.pm
+html/Elements/Header
+html/Elements/PageLayout
+html/Elements/SimpleSearch
+html/Elements/Tabs
+html/Elements/Footer
+html/NoAuth/images/small-logo.png
+html/NoAuth/webrt.css
<td>
% }
<& /Elements/Callback, %ARGS &>
+<!--
<div class="bpscredits">
»|« <&|/l, $RT::VERSION &>RT [_1] from <a href="http://bestpractical.com">Best Practical Solutions, LLC</a>.</&>
</div>
+-->
% if ($Debug) {
<HR>
<b><&|/l&>Time to display</&>: <%Time::HiRes::tv_interval( $m->{'rt_base_time'} )%></b>
>
<table width="100%" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF">
<tr>
- <td colspan=2><a href="http://bestpractical.com"><img src="<%$RT::WebImagesURL%>/bplogo.gif" alt="" width="230" height="50"></a></td>
- <td> </td>
- <td> </td>
- <td width="50%" align="right">
+ <td rowspan=2><img border=0 alt="freeside" src="<%$RT::WebImagesURL%>/small-logo.png" width="92" height="62"></td>
+ <td align="left" rowspan=2><font size=7>Ticketing</font></td>
+ <td align="right" valign="top">
% if ($session{'CurrentUser'} && $session{'CurrentUser'}->Id && $LoggedIn) {
<SPAN STYLE="display: none"><A HREF="#skipnav"><&|/l&>Skip Menu</&></A> |</SPAN>
<A HREF="<%$RT::WebPath%><% $Prefs %>" ><&|/l&>Preferences</&></A>
<&|/l&>Not logged in.</&>
% }
</td>
+
+ </tr>
+ <tr>
+
+ <td align=right valign=bottom>
+ <table>
+ <tr>
+ <td align=right>
+ <FONT SIZE="-3">
+ Freeside <% $FS::VERSION %><BR>
+ <A HREF="http://www.sisd.com/freeside">Freeside home page</A><BR>
+ <A HREF="docs/">Documentation</A><BR>
+ </FONT>
+ </td>
+ <td bgcolor=#000000></td>
+ <td align=left>
+ <FONT SIZE="-3">
+ RT <% $RT::VERSION %><BR>
+ <A HREF="http://www.bestpractical.com/rt">RT home page</A><BR>
+ <A HREF="http://wiki.bestpractical.com/">Documentation</A><BR>
+ </FONT>
+ </td>
+
+ </tr>
+ </table>
+ </td>
+
</tr>
</table>
<%INIT>
%#
%#
%# END LICENSE BLOCK
-<table class="darkblue" border=0 cellspacing=0 cellpadding=0 width="100%">
- <th class="titlebox" align="left"><span class="rtname"><%$AppName%></span>
+<table class="lightgray" border=0 cellspacing=0 cellpadding=0 width="100%">
+ <th class="lightgray" align="left" width=50%><span class="rtname"><%$AppName%></span>
</th>
<span class="topactions">
% foreach my $action (sort keys %{$topactions}) {
- <td class="darkblueright">
+ <td class="lightgrayright">
<%$topactions->{"$action"}->{'html'} |n %>
</td>
% }
<table border=0 cellspacing=0 cellpadding=0 width="100%" height="100%">
%# Vertical menu
<TR height="100%">
-<TD valign="top" width="140" class="blue">
+<TD valign="top" width="140" class="lightgray">
<& /Elements/Menu, toptabs => $toptabs, current_toptab => $current_toptab &>
</TD>
<td valign="top">
<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
- <td class="blue" valign="top">
+ <td class="mediumgray" valign="top">
<span class="title"><%$title%></span>
</td>
</tr>
<tr>
-<td class="blueright" valign="top">
+<td class="whiteright" valign="top">
<span class="nav">
% if ($actions) {
% my @actions;
% push @actions, "<A class='nav' HREF=\"".$RT::WebPath."/".$actions->{$action}->{'path'}."\">".$actions->{$action}->{'title'}."</A>";
% }
% }
-<% join(" | ", @actions) | n %>
+%#<% join(" | ", @actions) | n %>
+<% '['. join("] [", @actions). ']' | n %>
% if ($subactions) {
% my @actions;
% foreach my $action (sort keys %{$subactions}) {
$actions => undef
$subactions => undef
$title => $m->callers(-1)->path
-$AppName => undef
+$AppName => ''
</%ARGS>
%# END LICENSE BLOCK
<form action="<% $RT::WebPath %>/index.html">
<input size="12" name="q" autocomplete="off" accesskey="0">
-<input type="submit" value="<&|/l&>Search</&>">
+<input type="submit" value="<&|/l&>Search tickets</&>">
</form>
B => { html => $m->scomp('/Elements/SimpleSearch')
}
};
-my $basetabs = { A => { title => loc('Homepage'),
+my $basetabs = {
+ ' A'=> { title => 'Billing Main',
+ path => '..',
+ },
+ A => { #title => loc('Homepage'),
+ title => 'Ticketing Main',
path => '',
},
B => { title => loc('Tickets'),
%# END LICENSE BLOCK
SPAN.nav { font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
- color: #FFFFFF;
+%# color: #FFFFFF;
+ color: #000000;
text-decoration: none;
white-space: nowrap}
.nav2 { font-size: 10px;
white-space: nowrap}
.nav { font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 13px;
- font-weight: normal;
- color: #FFFFFF;
+%# font-weight: normal;
+ font-weight: bold;
+%# color: #FFFFFF;
+ color: #000000;
text-decoration: none;
white-space: nowrap}
.currentnav { font-family: Verdana, Arial, Helvetica, sans-serif;
.topnav { font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 16px;
font-weight: normal;
- color: #FFFFFF;
+%# color: #FFFFFF;
+ color: #000000;
text-decoration: none;
white-space: nowrap}
.currenttopnav { font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 16px;
font-weight: bold;
- color: #FFFF66;
+%# color: #FFFF66;
+ color: #000000; background-color: #cccccc;
text-decoration: none;
white-space: nowrap}
.topactions { font-family: Verdana, Arial, Helvetica, sans-serif;
vertical-align: top;
text-align: left;
}
-.blue { background-color: #4682B4;
+.blue {
+ background-color: #4682B4;
+%# background-color: #eeeeee;
background-position: left top;
vertical-align: top;
text-align: left;
}
-.blueright { background-color: #4682B4;
+.blueright {
+ background-color: #4682B4;
+%# background-color: #eeeeee;
background-position: left top;
vertical-align: top;
text-align: right;
vertical-align: top;
text-align: left;
}
-.darkblue { background-color: #000080;
+.darkblue {
+ background-color: #000080;
+ background-position: left top;
+ vertical-align: top;
+ text-align: left;
+ }
+.darkblueright {
+ background-color: #000080;
+ background-position: left top;
+ vertical-align: top;
+ text-align: right;
+ }
+.lightgray {
+ background-color: #eeeeee;
+ background-position: left top;
+ vertical-align: top;
+ text-align: left;
+ }
+.lightgrayright {
+ background-color: #eeeeee;
+ background-position: left top;
+ vertical-align: top;
+ text-align: right;
+ }
+.mediumgray {
+ background-color: #cccccc;
+ background-position: left top;
+ vertical-align: top;
+ text-align: left;
+ }
+.mediumgrayright {
+ background-color: #cccccc;
+ background-position: left top;
+ vertical-align: top;
+ text-align: right;
+ }
+.white {
+ background-color: #ffffff;
background-position: left top;
vertical-align: top;
text-align: left;
}
-.darkblueright { background-color: #000080;
+.whiteright {
+ background-color: #ffffff;
background-position: left top;
vertical-align: top;
text-align: right;
span.title { font-size: 1.6em;
vertical-align: middle;
- color: #ffffff;}
+%# color: #ffffff;
+ color: #000000;
+ }
span.productname { font-size: 2em;
color: #0066cc;}
SPAN.titleboxtitle {