RT#37165: Print document when account is created [implemented as export]
[freeside.git] / FS / FS / part_export / print_template.pm
diff --git a/FS/FS/part_export/print_template.pm b/FS/FS/part_export/print_template.pm
new file mode 100644 (file)
index 0000000..21f0a15
--- /dev/null
@@ -0,0 +1,198 @@
+package FS::part_export::print_template;
+
+use strict;
+
+use base qw( FS::part_export );
+
+use FS::Record qw(qsearchs);
+use FS::Misc;
+use FS::queue;
+
+=pod
+
+=head1 NAME
+
+FS::part_export::print_template
+
+=head1 SYNOPSIS
+
+Print a document of a template.
+
+=head1 DESCRIPTION
+
+See the L<Text::Template> documentation and the billing documentation for details on the template substitution language.
+
+Currently does not support printing during replace.
+
+=cut
+
+use vars qw( %info );
+
+tie my %options, 'Tie::IxHash',
+  'phase'           => { label => 'Print during',
+                         type  => 'select',
+                         options => [qw(insert delete suspend unsuspend)] },
+  'template_text'   => { label => 'Template text',
+                         type => 'textarea' },
+;
+
+%info = (
+                       #unfortunately, FS::part_svc->svc_tables fails at this point, not sure why
+  'svc'             => [ map { 'svc_'.$_ } qw(
+                           acct domain cert forward mailinglist www broadband cable dsl 
+                           conferencing video dish hardware phone pbx circuit port alarm external)
+                       ],
+  'desc'            => 'Print document during service change, for all services',
+  'options'         => \%options,
+  'no_machine'      => 1,
+  'notes'           => <<'EOF',
+Will use the print command configured by the lpr setting.
+See the <a href="http://search.cpan.org/dist/Text-Template/lib/Text/Template.pm">Text::Template</a> documentation and the billing documentation for details on the template substitution language.
+Fields from the customer and service records are available for substitution, as well as the following fields:
+
+<ul>
+<li>$payby - a friendler represenation of the field</li>
+<li>$payinfo - the masked payment information</li>
+<li>$expdate - the time at which the payment method expires (a UNIX timestamp)</li>
+<li>$returnaddress - the invoice return address for this customer's agent</li>
+<li>$logo_file - the image stored in the logo.eps setting
+</ul>
+EOF
+);
+
+=head1 Hook Methods
+
+Each of these simply invoke this module's L<print_template> method,
+passing the appropriate phase.
+
+=cut
+
+=head2 _export_insert
+
+Hook that is called when service is initially provisioned.
+To avoid confusion, don't use for anything else.
+
+=cut
+
+sub _export_insert {
+  my $self = shift;
+  return $self->print_template('insert',@_);
+}
+
+=head2 _export_delete
+
+Hook that is called when service is unprovisioned.
+To avoid confusion, don't use for anything else.
+
+=cut
+
+sub _export_delete {
+  my $self = shift;
+  return $self->print_template('delete',@_);
+}
+
+=head2 _export_replace
+
+Hook that is called when provisioned service is edited.
+To avoid confusion, don't use for anything else.
+
+Currently not supported for this export.
+
+=cut
+
+sub _export_replace {
+  return '';
+}
+
+=head2 _export_suspend
+
+Hook that is called when service is suspended.
+To avoid confusion, don't use for anything else.
+
+=cut
+
+sub _export_suspend {
+  my $self = shift;
+  return $self->print_template('suspend',@_);
+}
+
+=head2 _export_unsuspend
+
+Hook that is called when service is unsuspended.
+To avoid confusion, don't use for anything else.
+
+=cut
+
+sub _export_unsuspend {
+  my $self = shift;
+  return $self->print_template('unsuspend',@_);
+}
+
+=head1 Core Methods
+
+=head2 print_template
+
+Accepts $phase and $svc_x.
+If phase matches the configured option, starts a L</process_print_template>
+job in the queue.
+
+=cut
+
+sub print_template {
+  my ($self, $phase, $svc_x) = @_;
+  if ($self->option('phase') eq $phase) {
+    my $queue = new FS::queue {
+      'job' => 'FS::part_export::print_template::process_print_template',
+    };
+    my $error = $queue->insert(
+      'svcnum'        => $svc_x->svcnum,
+      'table'         => $svc_x->table,
+      'template_text' => $self->option('template_text'),
+    );
+    return "can't start print job: $error" if $error;
+  }
+  return '';
+}
+
+=head2 process_print_template
+
+For use as an FS::queue job.  Requires opts svcnum, table and template_text.
+Constructs page from template and sends to printer.
+
+=cut
+
+sub process_print_template {
+  my %opt = @_;
+
+  my $svc_x = qsearchs($opt{'table'}, { 'svcnum' => $opt{'svcnum'} } )
+    or die "invalid " . $opt{'table'} . " svcnum " . $opt{'svcnum'};
+  my $cust_main = $svc_x->cust_svc->cust_pkg->cust_main
+    or die "could not find customer for service";
+
+  my $ps = $cust_main->print_ps(undef,
+    'template_text' => $opt{'template_text'},
+    'extra_fields' => {
+      map { $_ => $svc_x->$_ } $svc_x->fields,
+    },
+  );
+  my $error = FS::Misc::do_print(
+    [ $ps ],
+    'agentnum' => $cust_main->agentnum,
+  );
+  die $error if $error;
+}
+
+=head1 SEE ALSO
+
+L<FS::part_export>
+
+=head1 AUTHOR
+
+Jonathan Prykop 
+jonathan@freeside.biz
+
+=cut
+
+1;
+
+