X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_bill.pm;h=367e1bc5ec5d00ca855117347a7da6a2ca8b1006;hp=a5602a7086cc752059f6d4e848ddd4458c239aaa;hb=e975ed0585280f4cbb90b02f57114dedc43f58be;hpb=0fd894c50eaa84169115ccbb682a53f5148a8c9c diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index a5602a708..367e1bc5e 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -316,15 +316,23 @@ sub owed { $balance; } -=item send +=item send [ TEMPLATENAME [ , AGENTNUM ] ] Sends this invoice to the destinations configured for this customer: send emails or print. See L. +TEMPLATENAME, if specified, is the name of a suffix for alternate invoices. + +AGENTNUM, if specified, means that this invoice will only be sent for customers +of the specified agent. + =cut sub send { - my($self,$template) = @_; + my $self = shift; + my $template = scalar(@_) ? shift : ''; + return '' if scalar(@_) && $_[0] && $self->cust_main->agentnum ne shift; + my @print_text = $self->print_text('', $template); my @invoicing_list = $self->cust_main->invoicing_list; @@ -339,7 +347,7 @@ sub send { 'subject' => 'Invoice', 'body' => \@print_text, ); - return "can't send invoice: $error" if $error; + die "can't email invoice: $error\n" if $error; } @@ -350,11 +358,11 @@ sub send { if ( grep { $_ eq 'POST' } @invoicing_list ) { #postal my $lpr = $conf->config('lpr'); open(LPR, "|$lpr") - or return "Can't open pipe to $lpr: $!"; + or die "Can't open pipe to $lpr: $!\n"; print LPR @print_text; close LPR - or return $! ? "Error closing $lpr: $!" - : "Exit status $? from $lpr"; + or die $! ? "Error closing $lpr: $!\n" + : "Exit status $? from $lpr\n"; } ''; @@ -654,6 +662,31 @@ sub batch_card { ''; } +sub _agent_template { + my $self = shift; + + my $cust_bill_event = qsearchs( 'part_bill_event', + { + 'payby' => $self->cust_main->payby, + 'plan' => 'send_agent', + 'eventcode' => { 'op' => 'LIKE', + 'value' => '_%, '. $self->cust_main->agentnum. ');' }, + }, + '', + 'ORDER BY seconds LIMIT 1' + ); + + return '' unless $cust_bill_event; + + if ( $cust_bill_event->eventcode =~ /\(\s*'(.*)'\s*,\s*(\d+)\s*\)\;$/ ) { + return $1; + } else { + warn "can't parse eventcode for agent-specific invoice template"; + return ''; + } + +} + =item print_text [ TIME [ , TEMPLATE ] ] Returns an text invoice, as a list of lines. @@ -798,10 +831,11 @@ sub print_text { sprintf("%10.2f", $balance_due ) ]; #create the template + $template ||= $self->_agent_template; my $templatefile = 'invoice_template'; - $templatefile .= "_$template" if $template; + $templatefile .= "_$template" if length($template); my @invoice_template = $conf->config($templatefile) - or die "cannot load config file $templatefile"; + or die "cannot load config file $templatefile"; $invoice_lines = 0; my $wasfunc = 0; foreach ( grep /invoice_lines\(\d*\)/, @invoice_template ) { #kludgy @@ -923,8 +957,10 @@ sub print_latex { @buf = (); #create the template + $template ||= $self->_agent_template; my $templatefile = 'invoice_latex'; - $templatefile .= "_$template" if $template; + my $suffix = length($template) ? "_$template" : ''; + $templatefile .= $suffix; my @invoice_template = $conf->config($templatefile) or die "cannot load config file $templatefile"; @@ -941,17 +977,26 @@ sub print_latex { 'zip' => _latex_escape($cust_main->zip), 'country' => _latex_escape($cust_main->country), 'footer' => join("\n", $conf->config('invoice_latexfooter') ), + 'smallfooter' => join("\n", $conf->config('invoice_latexsmallfooter') ), 'quantity' => 1, 'terms' => $conf->config('invoice_default_terms') || 'Payable upon receipt', - 'notes' => join("\n", $conf->config('invoice_latexnotes') ), + #'notes' => join("\n", $conf->config('invoice_latexnotes') ), ); - $invoice_data{'footer'} =~ s/\n+$//; - $invoice_data{'notes'} =~ s/\n+$//; - my $countrydefault = $conf->config('countrydefault') || 'US'; $invoice_data{'country'} = '' if $invoice_data{'country'} eq $countrydefault; + #do variable substitutions in notes + $invoice_data{'notes'} = + join("\n", + map { my $b=$_; $b =~ s/\$(\w+)/$invoice_data{$1}/eg; $b } + $conf->config_orbase('invoice_latexnotes', $suffix) + ); + + $invoice_data{'footer'} =~ s/\n+$//; + $invoice_data{'smallfooter'} =~ s/\n+$//; + $invoice_data{'notes'} =~ s/\n+$//; + $invoice_data{'po_line'} = ( $cust_main->payby eq 'BILL' && $cust_main->payinfo ) ? _latex_escape("Purchase Order #". $cust_main->payinfo) @@ -1101,9 +1146,7 @@ sub print_ps { open(POSTSCRIPT, "<$file.ps") or die "can't open $file.ps (probable error in LaTeX template): $!\n"; - #rm $file.dvi $file.log $file.aux - unlink("$file.dvi", "$file.log", "$file.aux", "$file.ps"); - #unlink("$file.dvi", "$file.log", "$file.aux"); + unlink("$file.dvi", "$file.log", "$file.aux", "$file.ps", "$file.tex"); my $ps = ''; while () { @@ -1146,7 +1189,7 @@ sub print_pdf { open(PDF, "<$file.pdf") or die "can't open $file.pdf (probably error in LaTeX tempalte: $!\n"; - unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf"); + unlink("$file.dvi", "$file.log", "$file.aux", "$file.pdf", "$file.tex"); my $pdf = ''; while () { @@ -1257,20 +1300,31 @@ sub _items_cust_bill_pkg { my $part_pkg = qsearchs('part_pkg', { pkgpart=>$cust_pkg->pkgpart } ); my $pkg = $part_pkg->pkg; + my %labels; + #tie %labels, 'Tie::IxHash'; + push @{ $labels{$_->[0]} }, $_->[1] foreach $cust_pkg->labels; + my @ext_description; + foreach my $label ( keys %labels ) { + my @values = @{ $labels{$label} }; + my $num = scalar(@values); + if ( $num > 5 ) { + push @ext_description, "$label ($num)"; + } else { + push @ext_description, map { "$label: $_" } @values; + } + } + if ( $cust_bill_pkg->setup != 0 ) { my $description = $pkg; $description .= ' Setup' if $cust_bill_pkg->recur != 0; - my @d = (); - @d = $cust_bill_pkg->details if $cust_bill_pkg->recur == 0; + my @d = @ext_description; + push @d, $cust_bill_pkg->details if $cust_bill_pkg->recur == 0; push @b, { 'description' => $description, #'pkgpart' => $part_pkg->pkgpart, 'pkgnum' => $cust_pkg->pkgnum, 'amount' => sprintf("%10.2f", $cust_bill_pkg->setup), - 'ext_description' => [ ( map { $_->[0]. ": ". $_->[1] } - $cust_pkg->labels ), - @d, - ], + 'ext_description' => \@d, }; } @@ -1282,8 +1336,7 @@ sub _items_cust_bill_pkg { #'pkgpart' => $part_pkg->pkgpart, 'pkgnum' => $cust_pkg->pkgnum, 'amount' => sprintf("%10.2f", $cust_bill_pkg->recur), - 'ext_description' => [ ( map { $_->[0]. ": ". $_->[1] } - $cust_pkg->labels ), + 'ext_description' => [ @ext_description, $cust_bill_pkg->details, ], }; @@ -1379,9 +1432,6 @@ The delete method. print_text formatting (and some logic :/) is in source, but needs to be slurped in from a file. Also number of lines ($=). -missing print_ps for a nice postscript copy (maybe HylaFAX-cover-page-style -or something similar so the look can be completely customized?) - =head1 SEE ALSO L, L, L, L,