X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_bill.pm;h=7d104117f209a743f3ddf94cd1085aa4237dd2cd;hb=0452430dac4d639796581be77e8674207653f42b;hp=bd7b8cadbcb19fd3956d2a0d6539a032d24cb306;hpb=be4a44a20eb0e90208f1024ea4aed70082db3d8d;p=freeside.git diff --git a/FS/FS/cust_bill.pm b/FS/FS/cust_bill.pm index bd7b8cadb..7d104117f 100644 --- a/FS/FS/cust_bill.pm +++ b/FS/FS/cust_bill.pm @@ -20,6 +20,9 @@ use FS::cust_pkg; use FS::cust_credit_bill; use FS::cust_pay_batch; use FS::cust_bill_event; +use FS::part_pkg; +use FS::cust_bill_pay; +use FS::part_bill_event; @ISA = qw( FS::Record ); @@ -411,10 +414,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>", ; @@ -547,7 +558,8 @@ 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. +of the specified agent or agent(s). AGENTNUM can be a scalar agentnum (for a +single agent) or an arrayref of agentnums. INVOICE_FROM, if specified, overrides the default email invoice From: address. @@ -556,64 +568,125 @@ INVOICE_FROM, if specified, overrides the default email invoice From: address. sub send { my $self = shift; my $template = scalar(@_) ? shift : ''; - return 'N/A' if scalar(@_) && $_[0] && $self->cust_main->agentnum != shift; + if ( scalar(@_) && $_[0] ) { + my $agentnums = ref($_[0]) ? shift : [ shift ]; + return 'N/A' unless grep { $_ == $self->cust_main->agentnum } @$agentnums; + } + my $invoice_from = scalar(@_) ? shift : ( $self->_agent_invoice_from || $conf->config('invoice_from') ); - #my @print_text = $self->print_text('', $template); my @invoicing_list = $self->cust_main->invoicing_list; - if ( grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list or !@invoicing_list ) { - #email + $self->email($template, $invoice_from) + if grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list or !@invoicing_list; - #better to notify this person than silence - @invoicing_list = ($invoice_from) unless @invoicing_list; + $self->print($template) + if grep { $_ eq 'POST' } @invoicing_list; #postal - my $error = send_email( - $self->generate_email( - 'from' => $invoice_from, - 'to' => [ grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list ], - #'print_text' => [ @print_text ], - 'template' => $template, - ) - ); - die "can't email invoice: $error\n" if $error; - #die "$error\n" if $error; + $self->fax($template) + if grep { $_ eq 'FAX' } @invoicing_list; #fax - } + ''; - if ( grep { $_ =~ /^(POST|FAX)$/ } @invoicing_list ) { - my $lpr_data; - if ($conf->config('invoice_latex')) { - $lpr_data = [ $self->print_ps('', $template) ]; - } else { - $lpr_data = [ $self->print_text('', $template) ]; - } +} - if ( grep { $_ eq 'POST' } @invoicing_list ) { #postal - my $lpr = $conf->config('lpr'); - open(LPR, "|$lpr") - or die "Can't open pipe to $lpr: $!\n"; - print LPR @{$lpr_data}; - close LPR - or die $! ? "Error closing $lpr: $!\n" - : "Exit status $? from $lpr\n"; - } +=item email [ TEMPLATENAME [ , INVOICE_FROM ] ] - if ( grep { $_ eq 'FAX' } @invoicing_list ) { #fax - die 'FAX invoice destination not supported with plain text invoices.' - unless $conf->exists('invoice_latex'); - my $dialstring = $self->cust_main->getfield('fax'); - #Check $dialstring? - my $error = send_fax(docdata => $lpr_data, dialstring => $dialstring); - die $error if $error; - } +Emails this invoice. - } +TEMPLATENAME, if specified, is the name of a suffix for alternate invoices. - ''; +INVOICE_FROM, if specified, overrides the default email invoice From: address. + +=cut + +sub email { + my $self = shift; + my $template = scalar(@_) ? shift : ''; + my $invoice_from = + scalar(@_) + ? shift + : ( $self->_agent_invoice_from || $conf->config('invoice_from') ); + + my @invoicing_list = grep { $_ !~ /^(POST|FAX)$/ } + $self->cust_main->invoicing_list; + + #better to notify this person than silence + @invoicing_list = ($invoice_from) unless @invoicing_list; + + my $error = send_email( + $self->generate_email( + 'from' => $invoice_from, + 'to' => [ grep { $_ !~ /^(POST|FAX)$/ } @invoicing_list ], + 'template' => $template, + ) + ); + die "can't email invoice: $error\n" if $error; + #die "$error\n" if $error; + +} + +=item lpr_data [ TEMPLATENAME ] + +Returns the postscript or plaintext for this invoice. + +TEMPLATENAME, if specified, is the name of a suffix for alternate invoices. + +=cut + +sub lpr_data { + my( $self, $template) = @_; + $conf->exists('invoice_latex') + ? [ $self->print_ps('', $template) ] + : [ $self->print_text('', $template) ]; +} + +=item print [ TEMPLATENAME ] + +Prints this invoice. + +TEMPLATENAME, if specified, is the name of a suffix for alternate invoices. + +=cut + +sub print { + my $self = shift; + 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"; +} + +=item fax [ TEMPLATENAME ] + +Faxes this invoice. + +TEMPLATENAME, if specified, is the name of a suffix for alternate invoices. + +=cut + +sub fax { + my $self = shift; + my $template = scalar(@_) ? shift : ''; + + die 'FAX invoice destination not (yet?) supported with plain text invoices.' + unless $conf->exists('invoice_latex'); + + my $dialstring = $self->cust_main->getfield('fax'); + #Check $dialstring? + + my $error = send_fax( 'docdata' => $self->lpr_data($template), + 'dialstring' => $dialstring, + ); + die $error if $error; } @@ -952,7 +1025,9 @@ sub _agent_plandata { 'plan' => 'send_agent', 'plandata' => { 'op' => '~', 'value' => "(^|\n)agentnum ". + '([0-9]*, )*'. $self->cust_main->agentnum. + '(, [0-9]*)*'. "(\n|\$)", }, }, @@ -1024,7 +1099,7 @@ sub print_text { ( grep { ! $_->pkgnum } $self->cust_bill_pkg ), #then taxes ) { - if ( $cust_bill_pkg->pkgnum ) { + if ( $cust_bill_pkg->pkgnum > 0 ) { my $cust_pkg = qsearchs('cust_pkg', { pkgnum =>$cust_bill_pkg->pkgnum } ); my $part_pkg = qsearchs('part_pkg', { pkgpart=>$cust_pkg->pkgpart } ); @@ -1271,11 +1346,10 @@ sub print_latex { } my $returnaddress; - if ( $conf->exists('invoice_latexreturnaddress') - && length($conf->exists('invoice_latexreturnaddress')) - ) - { - $returnaddress = join("\n", $conf->config('invoice_latexreturnaddress') ); + if ( length($conf->config_orbase('invoice_latexreturnaddress', $template)) ) { + $returnaddress = join("\n", + $conf->config_orbase('invoice_latexreturnaddress', $template) + ); } else { $returnaddress = '~'; } @@ -1292,8 +1366,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', @@ -1308,14 +1382,14 @@ sub print_latex { $invoice_data{'country'} = _latex_escape(code2country($cust_main->country)); } + $invoice_data{'notes'} = + join("\n", # #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', $template) -# ); -# warn "invoice notes: ". $invoice_data{'notes'}. "\n" -# if $DEBUG; + $conf->config_orbase('invoice_latexnotes', $template) + ); + warn "invoice notes: ". $invoice_data{'notes'}. "\n" + if $DEBUG; $invoice_data{'footer'} =~ s/\n+$//; $invoice_data{'smallfooter'} =~ s/\n+$//; @@ -1694,19 +1768,21 @@ 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", ); - $invoice_data{'returnaddress'} = $conf->exists('invoice_htmlreturnaddress') - ? join("\n", $conf->config('invoice_htmlreturnaddress') ) - : join("\n", map { - s/~/ /g; - s/\\\\\*?\s*$/
/; - s/\\hyphenation\{[\w\s\-]+\}//; - $_; - } - $conf->config('invoice_latexreturnaddress') - ); + $invoice_data{'returnaddress'} = + length( $conf->config_orbase('invoice_htmlreturnaddress', $template) ) + ? join("\n", $conf->config('invoice_htmlreturnaddress', $template) ) + : join("\n", map { + s/~/ /g; + s/\\\\\*?\s*$/
/; + s/\\hyphenation\{[\w\s\-]+\}//; + $_; + } + $conf->config_orbase('invoice_latexreturnaddress', $template) + ); my $countrydefault = $conf->config('countrydefault') || 'US'; if ( $cust_main->country eq $countrydefault ) { @@ -1738,11 +1814,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 ) @@ -1919,7 +1996,7 @@ sub _items_cust_bill_pkg { my @b = (); foreach my $cust_bill_pkg ( @$cust_bill_pkg ) { - if ( $cust_bill_pkg->pkgnum ) { + if ( $cust_bill_pkg->pkgnum > 0 ) { my $cust_pkg = qsearchs('cust_pkg', { pkgnum =>$cust_bill_pkg->pkgnum } ); my $part_pkg = qsearchs('part_pkg', { pkgpart=>$cust_pkg->pkgpart } );