X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_bill.pm;h=26c3d4bc4bd5f8af4163bfee2c78878ed888a5d1;hb=beb9cc8ec5bc9ec114763d5ecb48cf674ff4de72;hp=ed08ae79ad0b414b68d750def72f58ca9ac27d9a;hpb=bd37cef4d8a2930a7550efe857d354a790ffc65f;p=freeside.git diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index ed08ae79a..26c3d4bc4 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -3,6 +3,7 @@ package FS::cust_bill; use strict; use vars qw( @ISA $DEBUG $conf $money_char ); use vars qw( $invoice_lines @buf ); #yuck +use IPC::Run3; use Date::Format; use Text::Template 1.20; use File::Temp 0.14; @@ -414,10 +415,18 @@ sub generate_email { $args{'from'} =~ /\@([\w\.\-]+)/ or $1 = 'example.com'; my $content_id = join('.', rand()*(2**32), $$, time). "\@$1"; + my $path = "$FS::UID::conf_dir/conf.$FS::UID::datasrc"; + my $file; + if ( [ -e "$path/logo_". $args{'_template'}. ".png" ] ) { + $file = "$path/logo_". $args{'_template'}. ".png"; + } else { + $file = "$path/logo.png"; + } + my $image = build MIME::Entity 'Type' => 'image/png', 'Encoding' => 'base64', - 'Path' => "$FS::UID::conf_dir/conf.$FS::UID::datasrc/logo.png", + 'Path' => $file, 'Filename' => 'logo.png', 'Content-ID' => "<$content_id>", ; @@ -623,7 +632,7 @@ sub email { =item lpr_data [ TEMPLATENAME ] -Returns the postscript or plaintext for this invoice. +Returns the postscript or plaintext for this invoice as an arrayref. TEMPLATENAME, if specified, is the name of a suffix for alternate invoices. @@ -649,12 +658,14 @@ sub print { my $template = scalar(@_) ? shift : ''; my $lpr = $conf->config('lpr'); - open(LPR, "|$lpr") - or die "Can't open pipe to $lpr: $!\n"; - print LPR @{ $self->lpr_data($template) }; - close LPR - or die $! ? "Error closing $lpr: $!\n" - : "Exit status $? from $lpr\n"; + + my $outerr = ''; + run3 $lpr, $self->lpr_data($template), \$outerr, \$outerr; + if ( $? ) { + $outerr = ": $outerr" if length($outerr); + die "Error from $lpr (exit status ". ($?>>8). ")$outerr\n"; + } + } =item fax [ TEMPLATENAME ] @@ -1017,7 +1028,9 @@ sub _agent_plandata { 'plan' => 'send_agent', 'plandata' => { 'op' => '~', 'value' => "(^|\n)agentnum ". + '([0-9]*, )*'. $self->cust_main->agentnum. + '(, [0-9]*)*'. "(\n|\$)", }, }, @@ -1336,7 +1349,7 @@ sub print_latex { } my $returnaddress; - if ( length($conf->config_orbase('invoice_latexreturnaddress', $template) ) { + if ( length($conf->config_orbase('invoice_latexreturnaddress', $template)) ) { $returnaddress = join("\n", $conf->config_orbase('invoice_latexreturnaddress', $template) ); @@ -1356,8 +1369,8 @@ sub print_latex { 'city' => _latex_escape($cust_main->city), 'state' => _latex_escape($cust_main->state), 'zip' => _latex_escape($cust_main->zip), - 'footer' => join("\n", $conf->config('invoice_latexfooter') ), - 'smallfooter' => join("\n", $conf->config('invoice_latexsmallfooter') ), + 'footer' => join("\n", $conf->config_orbase('invoice_latexfooter', $template) ), + 'smallfooter' => join("\n", $conf->config_orbase('invoice_latexsmallfooter', $template) ), 'returnaddress' => $returnaddress, 'quantity' => 1, 'terms' => $conf->config('invoice_default_terms') || 'Payable upon receipt', @@ -1758,6 +1771,7 @@ sub print_html { 'terms' => $conf->config('invoice_default_terms') || 'Payable upon receipt', 'cid' => $cid, + 'template' => $template, # 'conf_dir' => "$FS::UID::conf_dir/conf.$FS::UID::datasrc", ); @@ -1803,11 +1817,12 @@ sub print_html { # $conf->config_orbase('invoice_latexnotes', $suffix) # ); - $invoice_data{'footer'} = $conf->exists('invoice_htmlfooter') - ? join("\n", $conf->config('invoice_htmlfooter') ) - : join("\n", map { s/~/ /g; s/\\\\\*?\s*$/
/; $_; } - $conf->config('invoice_latexfooter') - ); + $invoice_data{'footer'} = + length($conf->config_orbase('invoice_htmlfooter', $template)) + ? join("\n", $conf->config_orbase('invoice_htmlfooter', $template) ) + : join("\n", map { s/~/ /g; s/\\\\\*?\s*$/
/; $_; } + $conf->config_orbase('invoice_latexfooter', $template) + ); $invoice_data{'po_line'} = ( $cust_main->payby eq 'BILL' && $cust_main->payinfo ) @@ -2102,6 +2117,122 @@ sub _items_payments { =back +=head1 SUBROUTINES + +=over 4 + +=item reprint + +=cut + +sub process_reprint { + process_re_X('print', @_); +} + +=item reemail + +=cut + +sub process_reemail { + process_re_X('email', @_); +} + +=item refax + +=cut + +sub process_refax { + process_re_X('fax', @_); +} + +use Storable qw(thaw); +use Data::Dumper; +use MIME::Base64; +sub process_re_X { + my( $method, $job ) = ( shift, shift ); + + my $param = thaw(decode_base64(shift)); + warn Dumper($param) if $DEBUG; + + re_X( + $method, + $job, + %$param, + ); + +} + +sub re_X { + my($method, $job, %param ) = @_; +# [ 'begin', 'end', 'agentnum', 'open', 'days', 'newest_percust' ], + + #some false laziness w/search/cust_bill.html + my $distinct = ''; + my $orderby = 'ORDER BY cust_bill._date'; + + my @where; + + if ( $param{'begin'} =~ /^(\d+)$/ ) { + push @where, "cust_bill._date >= $1"; + } + if ( $param{'end'} =~ /^(\d+)$/ ) { + push @where, "cust_bill._date < $1"; + } + if ( $param{'agentnum'} =~ /^(\d+)$/ ) { + push @where, "cust_main.agentnum = $1"; + } + + my $owed = + "charged - ( SELECT COALESCE(SUM(amount),0) FROM cust_bill_pay + WHERE cust_bill_pay.invnum = cust_bill.invnum ) + - ( SELECT COALESCE(SUM(amount),0) FROM cust_credit_bill + WHERE cust_credit_bill.invnum = cust_bill.invnum )"; + + push @where, "0 != $owed" + if $param{'open'}; + + push @where, "cust_bill._date < ". (time-86400*$param{'days'}) + if $param{'days'}; + + my $extra_sql = scalar(@where) ? 'WHERE '. join(' AND ', @where) : ''; + + my $addl_from = 'left join cust_main using ( custnum )'; + + if ( $param{'newest_percust'} ) { + $distinct = 'DISTINCT ON ( cust_bill.custnum )'; + $orderby = 'ORDER BY cust_bill.custnum ASC, cust_bill._date DESC'; + #$count_query = "SELECT COUNT(DISTINCT cust_bill.custnum), 'N/A', 'N/A'"; + } + + my @cust_bill = qsearch( 'cust_bill', + {}, + "$distinct cust_bill.*", + $extra_sql, + '', + $addl_from + ); + + my( $num, $last, $min_sec ) = (0, time, 5); #progresbar foo + foreach my $cust_bill ( @cust_bill ) { + $cust_bill->$method(); + + if ( $job ) { #progressbar foo + $num++; + if ( time - $min_sec > $last ) { + my $error = $job->update_statustext( + int( 100 * $num / scalar(@cust_bill) ) + ); + die $error if $error; + $last = time; + } + } + + } + +} + +=back + =head1 BUGS The delete method.