summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/Conf.pm24
-rw-r--r--FS/FS/cust_bill.pm11
-rw-r--r--FS/FS/cust_credit.pm3
-rw-r--r--FS/FS/cust_pay.pm6
-rwxr-xr-xFS/bin/freeside-expiration-alerter87
-rw-r--r--conf/invoice_html2
-rw-r--r--conf/invoice_html_statement2
-rw-r--r--httemplate/config/config-image.cgi19
-rw-r--r--httemplate/config/config-process.cgi4
-rw-r--r--httemplate/config/config-view.cgi73
-rw-r--r--httemplate/config/config.cgi16
-rw-r--r--httemplate/elements/header.html57
-rwxr-xr-xhttemplate/view/REAL_logo.cgi14
-rwxr-xr-xhttemplate/view/cust_bill-logo.cgi18
14 files changed, 229 insertions, 107 deletions
diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index eb20590cf..4def46260 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -108,7 +108,11 @@ sub config {
my $self = shift;
return $self->_usecompat('config', @_) if use_confcompat;
- my($name,$agentnum)=@_;
+ my($name, $agentnum)=@_;
+
+ carp "FS::Conf->config($name, $agentnum) called"
+ if $DEBUG > 1;
+
my $cv = $self->_config($name, $agentnum) or return;
if ( wantarray ) {
@@ -146,7 +150,11 @@ sub exists {
my $self = shift;
return $self->_usecompat('exists', @_) if use_confcompat;
- my($name,$agentnum)=@_;
+ my($name, $agentnum)=@_;
+
+ carp "FS::Conf->exists($name, $agentnum) called"
+ if $DEBUG > 1;
+
defined($self->_config($name, $agentnum));
}
@@ -556,6 +564,7 @@ worry that config_items is freeside-specific and icky.
'section' => 'billing',
'description' => 'Template file for billing method expiration alerts. See the <a href="http://www.freeside.biz/mediawiki/index.php/Freeside:1.7:Documentation:Administration#Credit_cards_and_Electronic_checks">billing documentation</a> for details.',
'type' => 'textarea',
+ 'per-agent' => 1,
},
{
@@ -1823,7 +1832,7 @@ worry that config_items is freeside-specific and icky.
'section' => 'required',
'description' => 'Your company name',
'type' => 'text',
- 'per_agent' => 1,
+ 'per_agent' => 1, #XXX just FS/FS/ClientAPI/Signup.pm
},
{
@@ -2270,15 +2279,18 @@ worry that config_items is freeside-specific and icky.
{
'key' => 'logo.png',
'section' => 'billing', #?
- 'description' => 'An image to include in some types of invoices',
- 'type' => 'binary',
+ 'description' => 'Company logo for HTML invoices and the backoffice interface, in PNG format. Suggested size somewhere near 92x62.',
+ 'type' => 'image',
+ 'per_agent' => 1, #XXX just view/logo.cgi, which is for the global
+ #old-style editor anyway...?
},
{
'key' => 'logo.eps',
'section' => 'billing', #?
- 'description' => 'An image to include in some types of invoices',
+ 'description' => 'Company logo for printed and PDF invoices, in EPS format.',
'type' => 'binary',
+ 'per_agent' => 1, #XXX as above, kinda
},
{
diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm
index 34feb40f7..704b3504a 100644
--- a/FS/FS/cust_bill.pm
+++ b/FS/FS/cust_bill.pm
@@ -1637,7 +1637,6 @@ L<Time::Local> and L<Date::Parse> for conversion functions.
=cut
sub print_latex {
-
my( $self, $today, $template ) = @_;
my %params = ( 'format' => 'latex' );
@@ -1653,11 +1652,13 @@ sub print_latex {
UNLINK => 0,
) or die "can't open temp file: $!\n";
- if ($template && $conf->exists("logo_${template}.eps")) {
- print $lh $conf->config_binary("logo_${template}.eps")
+ my $agentnum = $self->cust_main->agentnum;
+
+ if ( $template && $conf->exists("logo_${template}.eps", $agentnum) ) {
+ print $lh $conf->config_binary("logo_${template}.eps", $agentnum)
or die "can't write temp file: $!\n";
- }else{
- print $lh $conf->config_binary('logo.eps')
+ } else {
+ print $lh $conf->config_binary('logo.eps', $agentnum)
or die "can't write temp file: $!\n";
}
close $lh;
diff --git a/FS/FS/cust_credit.pm b/FS/FS/cust_credit.pm
index 99c63cb7f..47a8119ee 100644
--- a/FS/FS/cust_credit.pm
+++ b/FS/FS/cust_credit.pm
@@ -229,7 +229,8 @@ sub delete {
my $cust_main = $self->cust_main;
my $error = send_email(
- 'from' => $conf->config('invoice_from'), #??? well as good as any
+ 'from' => $conf->config('invoice_from', $self->cust_main->agentnum),
+ #invoice_from??? well as good as any
'to' => $conf->config('deletecredits'),
'subject' => 'FREESIDE NOTIFICATION: Credit deleted',
'body' => [
diff --git a/FS/FS/cust_pay.pm b/FS/FS/cust_pay.pm
index 08699acd1..583a72410 100644
--- a/FS/FS/cust_pay.pm
+++ b/FS/FS/cust_pay.pm
@@ -220,7 +220,8 @@ sub insert {
$payby =~ s/^CHEK$/Electronic check/;
$error = send_email(
- 'from' => $conf->config('invoice_from'), #??? well as good as any
+ 'from' => $conf->config('invoice_from', $self->cust_main->agentnum),
+ #invoice_from??? well as good as any
'to' => \@invoicing_list,
'subject' => 'Payment receipt',
'body' => [ $receipt_template->fill_in( HASH => {
@@ -344,7 +345,8 @@ sub delete {
my $cust_main = $self->cust_main;
my $error = send_email(
- 'from' => $conf->config('invoice_from'), #??? well as good as any
+ 'from' => $conf->config('invoice_from', $self->cust_main->agentnum),
+ #invoice_from??? well as good as any
'to' => $conf->config('deletepayments'),
'subject' => 'FREESIDE NOTIFICATION: Payment deleted',
'body' => [
diff --git a/FS/bin/freeside-expiration-alerter b/FS/bin/freeside-expiration-alerter
index ffd75f9a5..0bb61db4a 100755
--- a/FS/bin/freeside-expiration-alerter
+++ b/FS/bin/freeside-expiration-alerter
@@ -13,7 +13,7 @@ use FS::UID qw(adminsuidsetup);
use FS::Record qw(qsearch);
use FS::cust_main;
-use vars qw($smtpmachine @body);
+use vars qw($smtpmachine %agent_failure_body);
#hush, perl!
$FS::alerter::_template::first = "";
@@ -47,11 +47,6 @@ adminsuidsetup $user;
# Get the needed configuration files
my $conf = new FS::Conf;
$smtpmachine = $conf->config('smtpmachine');
-$mail_sender = $conf->config('invoice_from')
- if $conf->exists('invoice_from');
-$failure_recipient = $conf->config('invoice_from')
- if $conf->exists('invoice_from');
-
my(@customers)=qsearch('cust_main',{});
if (scalar(@customers) == 0)
@@ -59,24 +54,6 @@ if (scalar(@customers) == 0)
exit 1;
}
-# Prepare for sending email
-
-$ENV{MAILADDRESS} = $mail_sender;
-my $header = new Mail::Header ( [
- "From: Account Processor",
- "To: $failure_recipient",
- "Sender: $mail_sender",
- "Reply-To: $mail_sender",
- "Subject: Unnotified Billing Arrangement Expirations",
-] );
-
-my @alerter_template = $conf->config('alerter_template')
- or die "cannot load config file alerter_template";
-
-my $alerter = new Text::Template (TYPE => 'ARRAY', SOURCE => [ map "$_\n", @alerter_template ])
- or die "can't create new Text::Template object: Text::Template::ERROR";
-$alerter->compile() or die "can't compile template: Text::Template::ERROR";
-
# Now I can start looping
foreach my $customer (@customers)
{
@@ -110,7 +87,26 @@ foreach my $customer (@customers)
($expire_time < $_date + $panic_time &&
$expire_time > $_date + $panic_time - $window_time)) {
+ # Prepare for sending email, now inside the customer loop so i can be agent
+ # virtualized
+
+ my $agentnum = $customer->agentnum;
+
+ $mail_sender = $conf->config('invoice_from', $agentnum )
+ if $conf->exists('invoice_from', $agentnum);
+ $failure_recipient = $conf->config('invoice_from', $agentnum)
+ if $conf->exists('invoice_from', $agentnum);
+ $ENV{MAILADDRESS} = $mail_sender;
+
+ my @alerter_template = $conf->config('alerter_template', $agentnum)
+ or die "cannot load config file alerter_template";
+
+ my $alerter = new Text::Template TYPE => 'ARRAY',
+ SOURCE => [ map "$_\n", @alerter_template ]
+ or die "can't create new Text::Template object: $Text::Template::ERROR";
+
+ $alerter->compile() or die "can't compile template: $Text::Template::ERROR";
my @packages = $customer->ncancelled_pkgs;
if (scalar(@packages) != 0) {
@@ -138,9 +134,10 @@ foreach my $customer (@customers)
}
$FS::alerter::_template::expdate = $expire_time;
- $FS::alerter::_template::company_name = $conf->config('company_name');
+ $FS::alerter::_template::company_name =
+ $conf->config('company_name', $agentnum);
$FS::alerter::_template::company_address =
- join("\n", $conf->config('company_address') ). "\n";
+ join("\n", $conf->config('company_address', $agentnum) ). "\n";
my $message = new Mail::Internet (
'Header' => $header,
@@ -152,23 +149,41 @@ foreach my $customer (@customers)
or die "Can't send expiration email: $!";
} elsif ( ! @invoicing_list || grep { $_ eq 'POST' } @invoicing_list ) {
- push @body, sprintf(qq{%5d %-32.32s %4s %10s %12s %12s},
- $custnum,
- $first . " " . $last . " " . $company,
- $payby,
- $paydate,
- $daytime,
- $night);
+ push @{$agent_failure_body{$customer->agentnum}},
+ sprintf(qq{%5d %-32.32s %4s %10s %12s %12s},
+ $custnum,
+ $first . " " . $last . " " . $company,
+ $payby,
+ $paydate,
+ $daytime,
+ $night
+ );
}
}
}
}
-# Now I need to send EMAIL
-if (scalar(@body)) {
+# Now I need to send failure EMAIL
+
+foreach my $agentnum ( keys %agent_failure_body ) {
+
+ $mail_sender = $conf->config('invoice_from', $agentnum )
+ if $conf->exists('invoice_from', $agentnum);
+ $failure_recipient = $conf->config('invoice_from', $agentnum)
+ if $conf->exists('invoice_from', $agentnum);
+
+ $ENV{MAILADDRESS} = $mail_sender;
+ my $header = new Mail::Header ( [
+ "From: Account Processor",
+ "To: $failure_recipient",
+ "Sender: $mail_sender",
+ "Reply-To: $mail_sender",
+ "Subject: Unnotified Billing Arrangement Expirations",
+ ] );
+
my $message = new Mail::Internet (
'Header' => $header,
- 'Body' => [ (@body) ],
+ 'Body' => [ @{$agent_failure_body{$agentnum}} ],
);
$!=0;
$message->smtpsend( Host => $smtpmachine )
diff --git a/conf/invoice_html b/conf/invoice_html
index 49c11877c..7a43aa6d5 100644
--- a/conf/invoice_html
+++ b/conf/invoice_html
@@ -15,7 +15,7 @@
<table class="invoice_header" width="100%">
<tr>
- <td><img src="<%= $cid ? "cid:$cid" : "cust_bill-logo.cgi?$template" %>"></td>
+ <td><img src="<%= $cid ? "cid:$cid" : "cust_bill-logo.cgi?invnum=$invnum;template=$template" %>"></td>
<td align="left"><%= $returnaddress %></td>
<td align="right">
<table CLASS="invoice_headerright" cellspacing=0>
diff --git a/conf/invoice_html_statement b/conf/invoice_html_statement
index 4e4d259af..0595602db 100644
--- a/conf/invoice_html_statement
+++ b/conf/invoice_html_statement
@@ -14,7 +14,7 @@
<table class="invoice_header" width="100%">
<tr>
- <td><img src="<%= $cid ? "cid:$cid" : "cust_bill-logo.cgi?$template" %>"></td>
+ <td><img src="<%= $cid ? "cid:$cid" : "cust_bill-logo.cgi?invnum=$invnum;template=$template" %>"></td>
<td align="left"><%= $returnaddress %></td>
<td align="right">
<table CLASS="invoice_headerright" cellspacing=0>
diff --git a/httemplate/config/config-image.cgi b/httemplate/config/config-image.cgi
new file mode 100644
index 000000000..892f7c65b
--- /dev/null
+++ b/httemplate/config/config-image.cgi
@@ -0,0 +1,19 @@
+<% $conf->config_binary($name, $agentnum) %>
+<%init>
+
+die "access denied"
+ unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
+
+my $conf = new FS::Conf;
+
+http_header( 'Content-Type' => 'image/png' ); #just png for now
+
+$cgi->param('key') =~ /^([-\w.]+)$/ or die "illegal config option";
+my $name = $1;
+
+my $agentnum = '';
+if ( $cgi->param('agentnum') =~ /^(\d+)$/ ) {
+ $agentnum = $1;
+}
+
+</%init>
diff --git a/httemplate/config/config-process.cgi b/httemplate/config/config-process.cgi
index e220fd8ec..84bfdefcb 100644
--- a/httemplate/config/config-process.cgi
+++ b/httemplate/config/config-process.cgi
@@ -25,7 +25,7 @@ foreach my $type ( ref($i->type) ? @{$i->type} : $i->type ) {
} else {
$conf->delete($i->key, $agentnum);
}
- } elsif ( $type eq 'binary' ) {
+ } elsif ( $type eq 'binary' || $type eq 'image' ) {
if ( defined($cgi->param($i->key.$n)) && $cgi->param($i->key.$n) ) {
my $fh = $cgi->upload($i->key.$n);
if (defined($fh)) {
@@ -94,7 +94,7 @@ $conf->delete($_, $agentnum) foreach @delete;
<% $conf->config($i->key, $agentnum) |js_string %> + ': ' +
<% &{ $i->option_sub }( $conf->config($i->key, $agentnum) ) |js_string %>;
% } else {
- alert('unknown type <% $type %>');
+ //alert('unknown type <% $type %>');
window.top.location.reload();
% }
diff --git a/httemplate/config/config-view.cgi b/httemplate/config/config-view.cgi
index b7e6f6797..0f5fd6213 100644
--- a/httemplate/config/config-view.cgi
+++ b/httemplate/config/config-view.cgi
@@ -1,10 +1,4 @@
-<% include("/elements/header.html",
- $title,
- menubar(
- 'View all agents' => $p.'browse/agent.cgi',
- )
- )
-%>
+<% include("/elements/header.html", $title, menubar(@menubar)) %>
Click on a configuration value to change it.
<BR><BR>
@@ -15,25 +9,20 @@ Click on a configuration value to change it.
<FONT SIZE="+1" COLOR="#ff0000">CONFIGURATION NOT STORED IN DATABASE -- USING COMPATIBILITY MODE</FONT><BR><BR>
%}
-% foreach my $section ( qw(required billing username password UI session
-% shell BIND
-% ),
-% '', 'deprecated') {
-
- <A NAME="<% $section || 'unclassified' %>"></A>
- <FONT SIZE="-2">
-% foreach my $nav_section ( qw(required billing username password UI session
-% shell BIND
-% ),
-% '', 'deprecated') {
-% if ( $section eq $nav_section ) {
+% foreach my $section (@sections) {
- [<A NAME="not<% $nav_section || 'unclassified' %>" style="background-color: #cccccc"><% ucfirst($nav_section || 'unclassified') %></A>]
-% } else {
+ <A NAME="<% $section || 'unclassified' %>"></A>
+ <FONT SIZE="-2">
- [<A HREF="#<% $nav_section || 'unclassified' %>"><% ucfirst($nav_section || 'unclassified') %></A>]
-% }
-% }
+% foreach my $nav_section (@sections) {
+%
+% if ( $section eq $nav_section ) {
+ [<A NAME="not<% $nav_section || 'unclassified' %>" style="background-color: #cccccc"><% ucfirst($nav_section || 'unclassified') %></A>]
+% } else {
+ [<A HREF="#<% $nav_section || 'unclassified' %>"><% ucfirst($nav_section || 'unclassified') %></A>]
+% }
+%
+% }
</FONT><BR>
<TABLE BGCOLOR="#cccccc" BORDER=1 CELLSPACING=0 CELLPADDING=0 BORDERCOLOR="#999999">
@@ -42,7 +31,7 @@ Click on a configuration value to change it.
<% ucfirst($section || 'unclassified') %> configuration options
</th>
</tr>
-% foreach my $i (grep $_->section eq $section, @config_items) {
+% foreach my $i (@{ $section_items{$section} }) {
% my @types = ref($i->type) ? @{$i->type} : ($i->type);
% my( $width, $height ) = ( 522, 336 );
% if ( grep $_ eq 'textarea', @types ) {
@@ -76,9 +65,22 @@ Click on a configuration value to change it.
<tr>
<td><font color="#ff0000">no type</font></td>
</tr>
+
+% } elsif ( $type eq 'image' ) {
+
+ <tr>
+
+ <% $conf->exists($i->key, $agentnum)
+ ? '<img src="config-image.cgi?key='. $i->key.
+ ';agentnum='. $agentnum. '">'
+ : 'empty'
+ %>
+ </tr>
+
% } elsif ( $type eq 'binary' ) {
<tr>
+
<% $conf->exists($i->key, $agentnum)
? qq!<a href="config-download.cgi?key=!. $i->key. ';agentnum='. $agentnum. qq!">download</a>!
: 'empty'
@@ -143,16 +145,15 @@ die "access denied"
unless $FS::CurrentUser::CurrentUser->access_right('Configuration');
my $agentnum = '';
+my $title;
+my @menubar = ();
if ($cgi->param('agentnum') =~ /^(\d+)$/) {
$agentnum = $1;
-}
-
-my $title;
-if ($agentnum) {
my $agent = qsearchs('agent', { 'agentnum' => $agentnum } );
die "Agent $agentnum not found!" unless $agent;
- $title = "Configuration for ". $agent->agent;
+ push @menubar, 'View all agents' => $p.'browse/agent.cgi';
+ $title = 'Agent Configuration for '. $agent->agent;
} else {
$title = 'Global Configuration';
}
@@ -162,5 +163,15 @@ my $conf = new FS::Conf;
my @config_items = grep { $agentnum ? $_->per_agent : 1 }
grep { $_->key != ~/^invoice_(html|latex|template)/ }
$conf->config_items;
-
+
+my @sections = qw(required billing username password UI session shell BIND );
+push @sections, '', 'deprecated';
+
+my %section_items = ();
+foreach my $section (@sections) {
+ $section_items{$section} = [ grep $_->section eq $section, @config_items ];
+}
+
+@sections = grep scalar( @{ $section_items{$_} } ), @sections;
+
</%init>
diff --git a/httemplate/config/config.cgi b/httemplate/config/config.cgi
index 4bcd8e414..f390c64a3 100644
--- a/httemplate/config/config.cgi
+++ b/httemplate/config/config.cgi
@@ -44,13 +44,25 @@ Setting <b><% $key %></b>
<font color="#ff0000">no type</font>
+% } elsif ( $type eq 'image' ) {
+
+ <% $conf->exists($key, $agentnum)
+ ? 'Current image<br>'.
+ '<img src="config-image.cgi?key='. $key.
+ ';agentnum='. $agentnum. '"><br>'
+ : ''
+ %>
+
+ <BR>
+ New image filename <input type="file" name="<% "$key$n" %>">
+
% } elsif ( $type eq 'binary' ) {
Filename <input type="file" name="<% "$key$n" %>">
% } elsif ( $type eq 'textarea' ) {
- <textarea name="<% "$key$n" %>" rows=12 cols=78 wrap="off"><% join("\n", $conf->config($key, $agentnum)) %></textarea>
+ <textarea name="<% "$key$n" %>" rows=12 cols=78 wrap="off"><% join("\n", $conf->config($key, $agentnum)) |h %></textarea>
% } elsif ( $type eq 'checkbox' ) {
@@ -259,7 +271,7 @@ Setting <b><% $key %></b>
% } else {
- <font color="#ff0000">unknown type $type</font>
+ <font color="#ff0000">unknown type <% $type %></font>
% }
% $n++;
diff --git a/httemplate/elements/header.html b/httemplate/elements/header.html
index 0a939aa9e..8e902f038 100644
--- a/httemplate/elements/header.html
+++ b/httemplate/elements/header.html
@@ -10,10 +10,10 @@
<% include('menu.html', 'freeside_baseurl' => $fsurl,
'position' => $menu_position,
- )
+ ) |n
%>
- <% include('init_overlib.html') %>
+ <% include('init_overlib.html') |n %>
<SCRIPT TYPE="text/javascript">
function clearhint_search_cust (what) {
@@ -37,20 +37,20 @@
}
function clearhint_search_ticket (what) {
- if ( what.value == '(ticket # or subject string)' )
+ if ( what.value == '(ticket #, subject, email or fulltext:text)' )
what.value = '';
}
</SCRIPT>
- <% $head %>
+ <% $head |n %>
</HEAD>
- <BODY <% $menu_position eq 'left' ? qq( BACKGROUND="${fsurl}images/background-cheat.png" ) : ' BGCOLOR="#e8e8e8" ' %> <% $etc %> STYLE="margin-top:0; margin-bottom:0; margin-left:0; margin-right:0">
+ <BODY <% $menu_position eq 'left' ? qq( BACKGROUND="${fsurl}images/background-cheat.png" ) : ' BGCOLOR="#e8e8e8" ' %> <% $etc |n %> STYLE="margin-top:0; margin-bottom:0; margin-left:0; margin-right:0">
<table width="100%" CELLPADDING=0 CELLSPACING=0 STYLE="padding-left:0; padding-right:4">
<tr>
- <td rowspan=2 BGCOLOR="#ffffff"><IMG BORDER=0 ALT="freeside" SRC="<%$fsurl%>images/small-logo.png"></td>
+ <td rowspan=2 BGCOLOR="#ffffff"><IMG BORDER=0 ALT="freeside" SRC="<%$fsurl%>view/REAL_logo.cgi"></td>
<td align=left rowspan=2 BGCOLOR="#ffffff"> <!-- valign="top" -->
- <font size=6><% $conf->config('company_name') || 'ExampleCo' %></font>
+ <font size=6><% $company_name || 'ExampleCo' %></font>
</td>
<td align=right valign=top BGCOLOR="#ffffff"><FONT SIZE="-1">Logged in as <b><% getotaker %>&nbsp;</b><br></FONT><FONT SIZE="-2"><a href="<%$fsurl%>pref/pref.html">Preferences</a>&nbsp;<BR></FONT>
</td>
@@ -70,7 +70,7 @@
'height' => 360,
'color' => '#7e0079',
'scrolling' => 'no',
- )
+ ) |n
%>&nbsp;v<% $FS::VERSION %><BR>
<A HREF="<% $conf->config('support-key') ? "http://www.freeside.biz/mediawiki/index.php/Supported:Documentation" : "http://www.freeside.biz/mediawiki/index.php/Freeside:1.9:Documentation" %>" TARGET="_blank">Documentation</A><BR>
</FONT>
@@ -165,7 +165,7 @@ input.fsblackbuttonselected {
</TD>
<TD COLSPAN=1 BGCOLOR="#000000" ALIGN="right">
-% if ( $FS::CurrentUser::CurrentUser->access_right('List customers') ) {
+% if ( $curuser->access_right('List customers') ) {
<FORM ACTION="<%$fsurl%>search/cust_main.cgi" METHOD="GET" STYLE="margin:0">
<INPUT NAME="search_cust" TYPE="text" VALUE="(cust #, name, company or phone)" SIZE="28" onFocus="clearhint_search_cust(this);" onClick="clearhint_search_cust(this);" STYLE="vertical-align:bottom;text-align:right"><BR>
<A HREF="<%$fsurl%>search/report_cust_main.html" STYLE="color: #ffffff; font-size: 70%">Advanced</A>
@@ -186,11 +186,11 @@ input.fsblackbuttonselected {
</TD>
<TD COLSPAN=1 BGCOLOR="#000000" ALIGN="right">
-% if ( $FS::CurrentUser::CurrentUser->access_right('View invoices') ) {
+% if ( $curuser->access_right('View invoices') ) {
<FORM ACTION="<%$fsurl%>search/cust_bill.html" METHOD="GET" STYLE="margin:0;display:inline">
<INPUT NAME="invnum" TYPE="text" VALUE="(inv #)" SIZE="4" onFocus="clearhint_search_invoice(this);" onClick="clearhint_search_invoice(this);" STYLE="vertical-align:bottom;text-align:right;margin-bottom:1px">
-% if ( $FS::CurrentUser::CurrentUser->access_right('List invoices') ) {
+% if ( $curuser->access_right('List invoices') ) {
<A HREF="<%$fsurl%>search/report_cust_bill.html" STYLE="color: #ffffff; font-size: 70%">Advanced</A>
% }
@@ -212,7 +212,7 @@ input.fsblackbuttonselected {
<TD COLSPAN=1 BGCOLOR="#000000" ALIGN="right" STYLE="padding-right:4px">
% if ( $conf->config("ticket_system") ) {
<FORM ACTION="<% FS::TicketSystem->baseurl %>index.html" METHOD="GET" STYLE="margin:0">
- <INPUT NAME="q" TYPE="text" VALUE="(ticket # or subject string)" onFocus="clearhint_search_ticket(this);" onClick="clearhint_search_ticket(this);" STYLE="vertical-align:bottom;text-align:right"><BR>
+ <INPUT NAME="q" TYPE="text" VALUE="(ticket #, subject, email or fulltext:text)" onFocus="clearhint_search_ticket(this);" onClick="clearhint_search_ticket(this);" STYLE="vertical-align:bottom;text-align:right"><BR>
<A HREF="<% FS::TicketSystem->baseurl %>Search/Build.html" STYLE="color: #ffffff; font-size: 70%">Advanced</A>
<INPUT TYPE="submit" VALUE="Search tickets" CLASS="fsblackbutton" onMouseOver="this.className='fsblackbuttonselected'; return true;" onMouseOut="this.className='fsblackbutton'; return true;" STYLE="font-size:70%;padding-left:2px;padding-right:2px">
</FORM>
@@ -259,16 +259,41 @@ input.fsblackbuttonselected {
<% $title %>
</FONT>
+% unless ( $nobr ) {
<BR><BR>
+% }
+
<% $menubar !~ /^\s*$/ ? "$menubar<BR><BR>" : '' %>
<%init>
-my($title, $menubar) = ( shift, shift );
-my $etc = @_ ? shift : ''; #$etc is for things like onLoad= etc.
-my $head = @_ ? shift : ''; #$head is for things that go in the <HEAD> section
+my( $title, $menubar, $etc, $head ) = ( '', '', '', '' );
+my( $nobr ) = ( 0 );
+if ( ref($_[0]) ) {
+ my $opt = shift;
+ $title = $opt->{title};
+ $menubar = $opt->{menubar};
+ $etc = $opt->{etc};
+ $head = $opt->{head};
+ $nobr = $opt->{nobr};
+} else {
+ ($title, $menubar) = ( shift, shift );
+ $etc = @_ ? shift : ''; #$etc is for things like onLoad= etc.
+ $head = @_ ? shift : ''; #$head is for things that go in the <HEAD> section
+}
+
my $conf = new FS::Conf;
-my $menu_position = $FS::CurrentUser::CurrentUser->option('menu_position')
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+my $menu_position = $curuser->option('menu_position')
|| 'top'; #new default for 1.9
+my $company_name;
+my @agentnums = $curuser->agentnums;
+if ( scalar(@agentnums) == 1 ) {
+ $company_name = $conf->config('company_name', $agentnums[0] );
+} else {
+ $company_name = $conf->config('company_name');
+}
+
</%init>
diff --git a/httemplate/view/REAL_logo.cgi b/httemplate/view/REAL_logo.cgi
new file mode 100755
index 000000000..c269c7d04
--- /dev/null
+++ b/httemplate/view/REAL_logo.cgi
@@ -0,0 +1,14 @@
+<% $conf->config_binary("logo.png", $agentnum) %>
+<%init>
+
+my $conf = new FS::Conf;
+
+my $agentnum = '';
+my @agentnums = $FS::CurrentUser::CurrentUser->agentnums;
+if ( scalar(@agentnums) == 1 ) {
+ $agentnum = $agentnums[0];
+}
+
+http_header('Content-Type' => 'image/png' );
+
+</%init>
diff --git a/httemplate/view/cust_bill-logo.cgi b/httemplate/view/cust_bill-logo.cgi
index 9c1c1d71d..09ac9a717 100755
--- a/httemplate/view/cust_bill-logo.cgi
+++ b/httemplate/view/cust_bill-logo.cgi
@@ -1,4 +1,4 @@
-<% $conf->config_binary("logo$templatename.png") %>
+<% $conf->config_binary("logo$templatename.png", $agentnum) %>
<%init>
die "access denied"
@@ -7,9 +7,19 @@ die "access denied"
my $conf = new FS::Conf;
-my($query) = $cgi->keywords;
-$query =~ /^([^\.\/]*)$/;
-my $templatename = $1;
+my $templatename;
+my $agentnum = '';
+if ( $cgi->param('invnum') ) {
+ $templatename = $cgi->param('templatename');
+ my $cust_bill = qsearchs('cust_bill', { 'invnum' => $cgi->param('invnum') } )
+ or die 'unknown invnum';
+ $agentnum = $cust_bill->cust_main->agentnum;
+} else {
+ my($query) = $cgi->keywords;
+ $query =~ /^([^\.\/]*)$/ or die 'illegal query';
+ $templatename = $1;
+}
+
if ( $templatename && $conf->exists("logo_$templatename.png") ) {
$templatename = "_$templatename";
} else {