X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fmsg_template.pm;h=e38346a66d377386ceadfa39548e039fb685081a;hb=431c9ca4fab151862bd24322bf8a1f9252fb38fc;hp=cac7fe572efe441ef8720fa42e1144fb57087df5;hpb=8ca531ca72ddffcc3561813bdd2f12f07b5911ce;p=freeside.git diff --git a/FS/FS/msg_template.pm b/FS/FS/msg_template.pm index cac7fe572..e38346a66 100644 --- a/FS/FS/msg_template.pm +++ b/FS/FS/msg_template.pm @@ -16,6 +16,9 @@ use Date::Format qw( time2str ); use HTML::Entities qw( decode_entities encode_entities ) ; use HTML::FormatText; use HTML::TreeBuilder; + +use File::Temp; +use IPC::Run qw(run); use vars qw( $DEBUG $conf ); FS::UID->install_callback( sub { $conf = new FS::Conf; } ); @@ -273,8 +276,8 @@ A hash reference of additional substitutions sub prepare { my( $self, %opt ) = @_; - my $cust_main = $opt{'cust_main'}; - my $object = $opt{'object'}; + my $cust_main = $opt{'cust_main'} or die 'cust_main required'; + my $object = $opt{'object'} or die 'object required'; # localization my $locale = $cust_main->locale || ''; @@ -435,9 +438,65 @@ sub send { send_email(generate_email($self->prepare(@_))); } +=item render OPTION => VALUE ... + +Fills in the template and renders it to a PDF document. Returns the +name of the PDF file. + +Options are as for 'prepare', but 'from' and 'to' are meaningless. + +=cut + +# will also have options to set paper size, margins, etc. + +sub render { + my $self = shift; + eval "use PDF::WebKit"; + die $@ if $@; + my %opt = @_; + my %hash = $self->prepare(%opt); + my $html = $hash{'html_body'}; + + my $tmp = 'msg'.$self->msgnum.'-'.time2str('%Y%m%d', time).'-XXXXXXXX'; + my $dir = "$FS::UID::cache_dir/cache.$FS::UID::datasrc"; + + # Graphics/stylesheets should probably go in /var/www on the Freeside + # machine. + my $kit = PDF::WebKit->new(\$html); #%options + # hack to use our wrapper script + $kit->configure(sub { shift->wkhtmltopdf('freeside-wkhtmltopdf') }); + my $fh = File::Temp->new( + TEMPLATE => $tmp, + DIR => $dir, + UNLINK => 0, + SUFFIX => '.pdf' + ); + + print $fh $kit->to_pdf; + close $fh; + return $fh->filename; +} + +=item print OPTIONS + +Render a PDF and send it to the printer. OPTIONS are as for 'render'. + +=cut + +sub print { + my $file = render(@_); + my @lpr = $conf->config('lpr'); + run ([@lpr, '-r'], '<', $file) + or die "lpr error:\n$?\n"; +} + + # helper sub for package dates my $ymd = sub { $_[0] ? time2str('%Y-%m-%d', $_[0]) : '' }; +# helper sub for money amounts +my $money = sub { ($conf->money_char || '$') . sprintf('%.2f', $_[0] || 0) }; + # helper sub for usage-related messages my $usage_warning = sub { my $svc = shift; @@ -483,6 +542,7 @@ sub substitutions { signupdate dundate packages recurdates ), + [ invoicing_email => sub { shift->invoicing_list_emailonly_scalar } ], #compatibility: obsolete ship_ fields - use the non-ship versions map ( { my $field = $_; @@ -520,6 +580,8 @@ sub substitutions { labels_short ), [ pkg => sub { shift->part_pkg->pkg } ], + [ pkg_category => sub { shift->part_pkg->categoryname } ], + [ pkg_class => sub { shift->part_pkg->classname } ], [ cancel => sub { shift->getfield('cancel') } ], # grrr... [ start_ymd => sub { $ymd->(shift->getfield('start_date')) } ], [ setup_ymd => sub { $ymd->(shift->getfield('setup')) } ], @@ -529,6 +591,13 @@ sub substitutions { [ susp_ymd => sub { $ymd->(shift->getfield('susp')) } ], [ expire_ymd => sub { $ymd->(shift->getfield('expire')) } ], [ cancel_ymd => sub { $ymd->(shift->getfield('cancel')) } ], + + # not necessarily correct for non-flat packages + [ setup_fee => sub { shift->part_pkg->option('setup_fee') } ], + [ recur_fee => sub { shift->part_pkg->option('recur_fee') } ], + + [ freq_pretty => sub { shift->part_pkg->freq_pretty } ], + ], 'cust_bill' => [qw( invnum