rest of per-agent config for company_name, company_address, logo, etc.. RT#3989
authorivan <ivan>
Mon, 9 Feb 2009 14:05:31 +0000 (14:05 +0000)
committerivan <ivan>
Mon, 9 Feb 2009 14:05:31 +0000 (14:05 +0000)
14 files changed:
FS/FS/Conf.pm
FS/FS/cust_bill.pm
FS/FS/cust_credit.pm
FS/FS/cust_pay.pm
FS/bin/freeside-expiration-alerter
conf/invoice_html
conf/invoice_html_statement
httemplate/config/config-image.cgi [new file with mode: 0644]
httemplate/config/config-process.cgi
httemplate/config/config-view.cgi
httemplate/config/config.cgi
httemplate/elements/header.html
httemplate/view/REAL_logo.cgi [new file with mode: 0755]
httemplate/view/cust_bill-logo.cgi

index eb20590..4def462 100644 (file)
@@ -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
   },
 
   {
index 34feb40..704b350 100644 (file)
@@ -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;
index 99c63cb..47a8119 100644 (file)
@@ -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'    => [
index 08699ac..583a724 100644 (file)
@@ -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'    => [
index ffd75f9..0bb61db 100755 (executable)
@@ -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 )
index 49c1187..7a43aa6 100644 (file)
@@ -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>
index 4e4d259..0595602 100644 (file)
@@ -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 (file)
index 0000000..892f7c6
--- /dev/null
@@ -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>
index e220fd8..84bfdef 100644 (file)
@@ -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();
 %     }
 
index b7e6f67..0f5fd62 100644 (file)
@@ -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>
index 4bcd8e4..f390c64 100644 (file)
@@ -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++;
index 0a939aa..8e902f0 100644 (file)
 
     <% 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) {
       }
 
       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 (executable)
index 0000000..c269c7d
--- /dev/null
@@ -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>
index 9c1c1d7..09ac9a7 100755 (executable)
@@ -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 {