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);
 
  15 use SL::Helper::MassPrintCreatePDF qw(:all);
 
  16 use SL::Helper::CreatePDF qw(:all);
 
  17 use SL::Helper::File qw(store_pdf append_general_pdf_attachments);
 
  20 use constant WAITING_FOR_EXECUTION       => 0;
 
  21 use constant CONVERTING_DELIVERY_ORDERS  => 1;
 
  22 use constant PRINTING_INVOICES           => 2;
 
  23 use constant DONE                        => 3;
 
  27 #   record_ids          => [ 123, 124, 127, ],
 
  29 #   copy_printer_id    => 4711,
 
  30 #   transdate          => $today || $custom_transdate,
 
  33 #   invoice_ids        => [ 234, 235, ],
 
  34 #   conversion_errors  => [ { id => 124, number => 'A981723', message => "Stuff went boom" }, ],
 
  35 #   print_errors       => [ { id => 234, number => 'L87123123', message => "Printer is out of coffee" }, ],
 
  36 #   pdf_file_name      => 'qweqwe.pdf',
 
  37 #   session_id         => $::auth->get_session_id,
 
  43   my $job_obj = $self->{job_obj};
 
  44   my $db      = $job_obj->db;
 
  46   $job_obj->set_data(status => CONVERTING_DELIVERY_ORDERS())->save;
 
  48   foreach my $delivery_order_id (@{ $job_obj->data_as_hash->{record_ids} }) {
 
  49     my $number = $delivery_order_id;
 
  50     my $data   = $job_obj->data_as_hash;
 
  54       my $sales_delivery_order = SL::DB::DeliveryOrder->new(id => $delivery_order_id)->load;
 
  55       $number                  = $sales_delivery_order->donumber;
 
  57       if (!$db->with_transaction(sub {
 
  58         $invoice = $sales_delivery_order->convert_to_invoice(sub { $data->{transdate} ? ('attributes' => { transdate => $data->{transdate} }) :
 
  59                                                                          undef }->() ) || die $db->error;
 
  65       $data->{num_created}++;
 
  66       push @{ $data->{invoice_ids} }, $invoice->id;
 
  67       push @{ $self->{invoices}    }, $invoice;
 
  71       push @{ $data->{conversion_errors} }, { id => $delivery_order_id, number => $number, message => $@ };
 
  74     $job_obj->update_attributes(data_as_hash => $data);
 
  78 sub convert_invoices_to_pdf {
 
  81   return if !@{ $self->{invoices} };
 
  83   my $job_obj = $self->{job_obj};
 
  84   my $db      = $job_obj->db;
 
  86   $job_obj->set_data(status => PRINTING_INVOICES())->save;
 
  87   my $data = $job_obj->data_as_hash;
 
  89   my $printer_id = $data->{printer_id};
 
  90   if ( $data->{media} ne 'printer' ) {
 
  92       $data->{media} = 'file';
 
  96     formname     => 'invoice',
 
  98     media        => $printer_id ? 'printer' : 'file',
 
  99     printer_id   => $printer_id,
 
 104   foreach my $invoice (@{ $self->{invoices} }) {
 
 108         variables => \%variables,
 
 109         return    => 'file_name',
 
 110         document  => $invoice,
 
 112       push @pdf_file_names, $self->create_massprint_pdf(%params);
 
 114       $data->{num_printed}++;
 
 116       # OLD WebDAV Code, may be deleted:
 
 117       # copy file to webdav folder
 
 118       if ($::instance_conf->get_webdav_documents) {
 
 119         my $webdav = SL::Webdav->new(
 
 121           number   => $invoice->invnumber,
 
 123         my $webdav_file = SL::Webdav::File->new(
 
 125           filename => t8('Invoice') . '_' . $invoice->invnumber . '.pdf',
 
 128           $webdav_file->store(file => $pdf_file_names[-1]);
 
 131           push @{ $data->{print_errors} }, { id => $invoice->id, number => $invoice->invnumber, message => $@ };
 
 138       push @{ $data->{print_errors} }, { id => $invoice->id, number => $invoice->invnumber, message => $@ };
 
 141     $job_obj->update_attributes(data_as_hash => $data);
 
 144   $self->merge_massprint_pdf(file_names => \@pdf_file_names, type => 'invoice' ) if scalar(@pdf_file_names) > 0;
 
 148   my ($self, $job_obj) = @_;
 
 150   $self->{job_obj}         = $job_obj;
 
 151   $self->{invoices} = [];
 
 153   $self->create_invoices;
 
 154   $self->convert_invoices_to_pdf;
 
 157   $job_obj->set_data(status => DONE())->save;
 
 172 SL::BackgroundJob::MassRecordCreationAndPrinting
 
 178 use SL::BackgroundJob::MassRecordCreationAndPrinting
 
 180 my $job              = SL::DB::BackgroundJob->new(
 
 183     package_name       => 'MassRecordCreationAndPrinting',
 
 186     record_ids         => [ map { $_->id } @records[0..$num - 1] ],
 
 187     printer_id         => $::form->{printer_id},
 
 188     copy_printer_id    => $::form->{copy_printer_id},
 
 189     transdate          => $::form->{transdate} || undef,
 
 190     status             => SL::BackgroundJob::MassRecordCreationAndPrinting->WAITING_FOR_EXECUTION(),
 
 194     conversion_errors  => [ ],
 
 197   )->update_next_run_at;
 
 198   SL::System::TaskServer->new->wake_up;
 
 202 This background job has 4 states which are described by the four constants above.
 
 206 =item * WAITING_FOR_EXECUTION
 
 207   Background has been initialised and needs to be picked up by the task_server
 
 209 =item * CONVERTING_DELIVERY_ORDERS
 
 212 =item * PRINTING_INVOICES
 
 213   Printing, if done via print command
 
 216   To release the process and for the user information
 
 224 =item C<create_invoices>
 
 226 Converts the source objects (DeliveryOrder) to destination objects (Invoice).
 
 227 On success objects will be saved.
 
 228 If param C<data->{transdate}> is set, this will be the transdate. No safety checks are done.
 
 229 The original conversion from order to delivery order had a post_save_sanity_check
 
 230 C<$delivery_order-E<gt>post_save_sanity_check; # just a hint at e8521eee (#90 od)>
 
 231 The params of convert_to_invoice are created on the fly with a anonym sub, as a alternative check
 
 232  perlsecret Enterprise ()x!!
 
 234 =item C<convert_invoices_to_pdf>
 
 236 Takes the new destination objects and merges them via print template in one pdf.
 
 240 Sent the pdf to the printer command.
 
 241 If param C<data->{copy_printer_id}> is set, the pdf will be sent to a second printer command.
 
 247 Currently the calculation from the gui (form) differs from the calculation via convert (PTC).
 
 248 Furthermore mass conversion with foreign currencies could lead to problems (daily rate check).
 
 252 It would be great to extend this Job for general background printing. The original project
 
 253 code converted sales order to delivery orders (84e7c540) this could be merged in unstable.
 
 254 The states should be CONVERTING_SOURCE_RECORDS, PRINTING_DESTINATION_RECORDS etc
 
 258 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
 
 260 Jan Büren E<lt>jan@kivitendo-premium.deE<gt>