1 package SL::BackgroundJob::MassRecordCreationAndPrinting;
 
   6 use parent qw(SL::BackgroundJob::Base);
 
   8 use SL::DB::DeliveryOrder;
 
   9 use SL::DB::Order;  # origin order to delivery_order
 
  14 use SL::Locale::String qw(t8);
 
  17 use constant WAITING_FOR_EXECUTION       => 0;
 
  18 use constant CONVERTING_DELIVERY_ORDERS  => 1;
 
  19 use constant PRINTING_INVOICES           => 2;
 
  20 use constant DONE                        => 3;
 
  23 #   record_ids          => [ 123, 124, 127, ],
 
  25 #   copy_printer_id    => 4711,
 
  26 #   transdate          => $today || $custom_transdate,
 
  29 #   invoice_ids        => [ 234, 235, ],
 
  30 #   conversion_errors  => [ { id => 124, number => 'A981723', message => "Stuff went boom" }, ],
 
  31 #   print_errors       => [ { id => 234, number => 'L87123123', message => "Printer is out of coffee" }, ],
 
  32 #   pdf_file_name      => 'qweqwe.pdf',
 
  33 #   session_id         => $::auth->get_session_id,
 
  39   my $job_obj = $self->{job_obj};
 
  40   my $db      = $job_obj->db;
 
  42   $job_obj->set_data(status => CONVERTING_DELIVERY_ORDERS())->save;
 
  44   foreach my $delivery_order_id (@{ $job_obj->data_as_hash->{record_ids} }) {
 
  45     my $number = $delivery_order_id;
 
  46     my $data   = $job_obj->data_as_hash;
 
  49       my $sales_delivery_order = SL::DB::DeliveryOrder->new(id => $delivery_order_id)->load;
 
  50       $number                  = $sales_delivery_order->donumber;
 
  51       my %conversion_params    = $data->{transdate} ? ('attributes' => { transdate => $data->{transdate} }) : ();
 
  52       my $invoice              = $sales_delivery_order->convert_to_invoice(%conversion_params);
 
  54       die $db->error if !$invoice;
 
  56       $data->{num_created}++;
 
  57       push @{ $data->{invoice_ids} }, $invoice->id;
 
  58       push @{ $self->{invoices}    }, $invoice;
 
  62       push @{ $data->{conversion_errors} }, { id => $delivery_order_id, number => $number, message => $@ };
 
  65     $job_obj->update_attributes(data_as_hash => $data);
 
  69 sub convert_invoices_to_pdf {
 
  72   return if !@{ $self->{invoices} };
 
  74   my $job_obj = $self->{job_obj};
 
  75   my $db      = $job_obj->db;
 
  77   $job_obj->set_data(status => PRINTING_INVOICES())->save;
 
  79   require SL::Controller::MassInvoiceCreatePrint;
 
  81   my $printer_id = $job_obj->data_as_hash->{printer_id};
 
  82   my $ctrl       = SL::Controller::MassInvoiceCreatePrint->new;
 
  85     formname     => 'invoice',
 
  87     media        => $printer_id ? 'printer' : 'file',
 
  92   foreach my $invoice (@{ $self->{invoices} }) {
 
  93     my $data = $job_obj->data_as_hash;
 
  97         template  => $ctrl->find_template(name => 'invoice', printer_id => $printer_id),
 
  98         variables => Form->new(''),
 
  99         return    => 'file_name',
 
 100         variable_content_types => { longdescription => 'html',
 
 107       $create_params{variables}->{$_} = $variables{$_} for keys %variables;
 
 109       $invoice->flatten_to_form($create_params{variables}, format_amounts => 1);
 
 110       $create_params{variables}->prepare_for_printing;
 
 112       push @pdf_file_names, $ctrl->create_pdf(%create_params);
 
 114       # copy file to webdav folder
 
 115       if ($::instance_conf->get_webdav_documents) {
 
 116         my $webdav = SL::Webdav->new(
 
 118           number   => $invoice->invnumber,
 
 120         my $webdav_file = SL::Webdav::File->new(
 
 122           filename => t8('Invoice') . '_' . $invoice->invnumber . '.pdf',
 
 125           $webdav_file->store(file => $pdf_file_names[-1]);
 
 128           push @{ $data->{print_errors} }, { id => $invoice->id, number => $invoice->invnumber, message => $@ };
 
 132       $data->{num_printed}++;
 
 137       push @{ $data->{print_errors} }, { id => $invoice->id, number => $invoice->invnumber, message => $@ };
 
 140     $job_obj->update_attributes(data_as_hash => $data);
 
 143   if (@pdf_file_names) {
 
 144     my $data = $job_obj->data_as_hash;
 
 147       $self->{merged_pdf} = $ctrl->merge_pdfs(file_names => \@pdf_file_names);
 
 148       unlink @pdf_file_names;
 
 151         my $file_name = 'mass_invoice' . $job_obj->id . '.pdf';
 
 152         my $sfile     = SL::SessionFile->new($file_name, mode => 'w', session_id => $data->{session_id});
 
 153         $sfile->fh->print($self->{merged_pdf});
 
 156         $data->{pdf_file_name} = $file_name;
 
 162       push @{ $data->{print_errors} }, { message => $@ };
 
 165     $job_obj->update_attributes(data_as_hash => $data);
 
 172   my $job_obj         = $self->{job_obj};
 
 173   my $data            = $job_obj->data_as_hash;
 
 174   my $printer_id      = $data->{printer_id};
 
 175   my $copy_printer_id = $data->{copy_printer_id};
 
 177   return if !$printer_id;
 
 181   foreach  my $local_printer_id ($printer_id, $copy_printer_id) {
 
 182     next unless $local_printer_id;
 
 184       ->new(id => $local_printer_id)
 
 186       ->print_document(content => $self->{merged_pdf});
 
 192   my ($self, $job_obj) = @_;
 
 194   $self->{job_obj}         = $job_obj;
 
 195   $self->{invoices} = [];
 
 197   $self->create_invoices;
 
 198   $self->convert_invoices_to_pdf;
 
 201   $job_obj->set_data(status => DONE())->save;
 
 216 SL::BackgroundJob::MassRecordCreationAndPrinting
 
 222 use SL::BackgroundJob::MassRecordCreationAndPrinting
 
 224 my $job              = SL::DB::BackgroundJob->new(
 
 227     package_name       => 'MassRecordCreationAndPrinting',
 
 230     record_ids         => [ map { $_->id } @records[0..$num - 1] ],
 
 231     printer_id         => $::form->{printer_id},
 
 232     copy_printer_id    => $::form->{copy_printer_id},
 
 233     transdate          => $::form->{transdate} || undef,
 
 234     status             => SL::BackgroundJob::MassRecordCreationAndPrinting->WAITING_FOR_EXECUTION(),
 
 238     conversion_errors  => [ ],
 
 241   )->update_next_run_at;
 
 242   SL::System::TaskServer->new->wake_up;
 
 246 This background job has 4 states which are described by the four constants above.
 
 250 =item * WAITING_FOR_EXECUTION
 
 251   Background has been initialised and needs to be picked up by the task_server
 
 253 =item * CONVERTING_DELIVERY_ORDERS
 
 256 =item * PRINTING_INVOICES
 
 257   Printing, if done via print command
 
 260   To release the process and for the user information
 
 268 =item C<create_invoices>
 
 270 Converts the source objects (DeliveryOrder) to destination objects (Invoice).
 
 271 On success objects will be saved.
 
 272 If param C<data->{transdate}> is set, this will be the transdate. No safety checks are done.
 
 273 The original conversion from order to delivery order had a post_save_sanity_check
 
 274 C<$delivery_order-E<gt>post_save_sanity_check; # just a hint at e8521eee (#90 od)>
 
 275 The params of convert_to_invoice are created on the fly with a anonym sub, as a alternative check
 
 276  perlsecret Enterprise ()x!!
 
 278 =item C<convert_invoices_to_pdf>
 
 280 Takes the new destination objects and merges them via print template in one pdf.
 
 284 Sent the pdf to the printer command.
 
 285 If param C<data->{copy_printer_id}> is set, the pdf will be sent to a second printer command.
 
 291 Currently the calculation from the gui (form) differs from the calculation via convert (PTC).
 
 292 Furthermore mass conversion with foreign currencies could lead to problems (daily rate check).
 
 296 It would be great to extend this Job for general background printing. The original project
 
 297 code converted sales order to delivery orders (84e7c540) this could be merged in unstable.
 
 298 The states should be CONVERTING_SOURCE_RECORDS, PRINTING_DESTINATION_RECORDS etc
 
 302 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
 
 304 Jan Büren E<lt>jan@kivitendo-premium.deE<gt>