package FS::bill_batch; use base qw(FS::Record); use strict; use vars qw( $me $DEBUG ); use CAM::PDF; use FS::Conf; $me = '[ FS::bill_batch ]'; $DEBUG = 0; sub table { 'bill_batch' } sub nohistory_fields { 'pdf' } =head1 NAME FS::bill_batch - Object methods for bill_batch records =head1 SYNOPSIS use FS::bill_batch; $open_batch = FS::bill_batch->get_open_batch; my $pdf = $open_batch->print_pdf; $error = $open_batch->close; =head1 DESCRIPTION An FS::bill_batch object represents a batch of invoices. FS::bill_batch inherits from FS::Record. The following fields are currently supported: =over 4 =item batchnum - primary key =item agentnum - empty for global batches or agent (see L) =item status - either 'O' (open) or 'R' (resolved/closed). =item pdf - blob field for temporarily storing the invoice as a PDF. =back =head1 METHODS =over 4 =item print_pdf Typeset the entire batch as a PDF file. Returns the PDF as a string. =cut sub print_pdf { my $self = shift; my $job = shift; $job->update_statustext(0) if $job; my @cust_bill_batch = sort { $a->invnum <=> $b->invnum } $self->cust_bill_batch; return "No invoices in batch ".$self->batchnum.'.' if !@cust_bill_batch; my $conf = FS::Conf->new; my $duplex = $conf->exists('invoice_print_pdf-duplex'); my $pdf_out; my $num = 0; foreach my $cust_bill_batch (@cust_bill_batch) { my $part = $cust_bill_batch->cust_bill->print_pdf({$cust_bill_batch->options}); die 'Failed creating PDF from invoice '.$cust_bill_batch->invnum.'\n' if !$part; if($pdf_out) { $pdf_out->appendPDF(CAM::PDF->new($part)); } else { $pdf_out = CAM::PDF->new($part); } if ( $duplex ) { my $n = $pdf_out->numPages; if ( $n % 2 == 1 ) { # then insert a blank page so we end on an even number $pdf_out->duplicatePage($n, 1); } } if ($job) { # update progressbar $num++; my $error = $job->update_statustext(int(100 * $num/scalar(@cust_bill_batch))); die $error if $error; } } $job->update_statustext(100, 'Combining invoices') if $job; return $pdf_out->toPDF; } =item close Set the status of the batch to 'R' (resolved). =cut sub close { my $self = shift; $self->status('R'); return $self->replace; } sub check { my $self = shift; my $error = $self->ut_numbern('batchnum') || $self->ut_foreign_keyn('agentnum', 'agent', 'agentnum') || $self->ut_enum('status', [ 'O', 'R' ] ) ; return $error if $error; $self->SUPER::check; } =item agent Returns the agent (see L) for this invoice batch. =back =head1 SUBROUTINES =item process_print_pdf =cut use Data::Dumper; sub process_print_pdf { my $job = shift; my $param = shift; warn Dumper($param) if $DEBUG; die "no batchnum specified!\n" if ! exists($param->{batchnum}); my $batch = FS::bill_batch->by_key($param->{batchnum}); die "batch '$param->{batchnum}' not found!\n" if !$batch; if ( $param->{'close'} ) { my $error = $batch->close; die $error if $error; } my $pdf = $batch->print_pdf($job); $batch->pdf($pdf); my $error = $batch->replace; die $error if $error; } =back =head1 BUGS =head1 SEE ALSO L, schema.html from the base documentation. =cut 1;