Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Helper / MassPrintCreatePDF.pm
diff --git a/SL/Helper/MassPrintCreatePDF.pm b/SL/Helper/MassPrintCreatePDF.pm
new file mode 100644 (file)
index 0000000..be80a69
--- /dev/null
@@ -0,0 +1,200 @@
+package SL::Helper::MassPrintCreatePDF;
+
+use strict;
+
+use SL::Webdav;
+
+use Exporter 'import';
+our @EXPORT_OK = qw(create_massprint_pdf merge_massprint_pdf create_pdfs print_pdfs);
+our %EXPORT_TAGS = (
+  all => \@EXPORT_OK,
+);
+
+sub create_pdfs {
+  my ($self, %params) = @_;
+  my @pdf_file_names;
+  foreach my $document (@{ $params{documents} }) {
+    $params{document} = $document;
+    push @pdf_file_names, $self->create_massprint_pdf(%params);
+  }
+
+  return @pdf_file_names;
+}
+
+sub create_massprint_pdf {
+  my ($self, %params) = @_;
+  my $form = Form->new('');
+  my %create_params = (
+    variables => $form,
+    record    => $params{document},
+    return    => 'file_name',
+  );
+  ## find_template may return a list !
+  $create_params{template} = $self->find_template(name => $params{variables}->{formname}, printer_id => $params{printer_id});
+  $form->{cwd}= POSIX::getcwd();
+
+  $form->{$_} = $params{variables}->{$_} for keys %{ $params{variables} };
+
+  $create_params{variable_content_types} = $form->get_variable_content_types();
+  $params{document}->flatten_to_form($form, format_amounts => 1);
+  # flatten_to_form sets payment_terms from customer/vendor - we do not want that here
+  # really ??
+  delete $form->{payment_terms} if !$form->{payment_id};
+  for my $i (1 .. $form->{rowcount}) {
+    $form->{"sellprice_$i"} = $form->{"fxsellprice_$i"};
+  }
+
+  $form->prepare_for_printing;
+
+  $form->{language}            = '_' . $form->{language};
+  $form->{attachment_filename} = $form->generate_attachment_filename;
+
+  my $pdf_filename = $self->create_pdf(%create_params);
+
+  if ($::instance_conf->get_webdav_documents && !$form->{preview}) {
+    my $webdav = SL::Webdav->new(
+      type     => $params{document}->type,
+      number   => $params{document}->record_number,
+    );
+    my $webdav_file = SL::Webdav::File->new(
+      webdav   => $webdav,
+      filename => $form->{attachment_filename},
+    );
+    eval {
+      $webdav_file->store(file => $pdf_filename);
+      1;
+    } or do {
+      push @{ $params{errors} }, $@ if exists $params{errors};
+    }
+  }
+
+  if ( $::instance_conf->get_doc_storage && ! $form->{preview}) {
+    $self->append_general_pdf_attachments(filepath => $pdf_filename, type => $form->{type} );
+    $form->{tmpfile} = $pdf_filename;
+    $form->{id}      = $params{document}->id;
+    $self->store_pdf($form);
+  }
+  $form->{id} = $params{document}->id;
+  if ( ! $form->{preview} ) {
+    if ( ref($params{document}) eq 'SL::DB::DeliveryOrder' ) {
+      $form->{snumbers} = "ordnumber_" . $params{document}->donumber;
+    }
+    else {
+      $form->{snumbers} = "unknown";
+    }
+    $form->{addition} = "PRINTED";
+    $form->{what_done} = $::form->{type};
+    $form->save_history;
+  }
+  return $pdf_filename;
+}
+
+sub merge_massprint_pdf {
+  my ($self, %params)     = @_;
+  return unless $params{file_names} && $params{type};
+
+  my $job_obj = $self->{job_obj};
+  my $data    = $job_obj->data_as_hash;
+  my @pdf_file_names = @{$params{file_names}};
+
+  eval {
+    my $file_name = 'mass_'.$params{type}.'_'.$job_obj->id . '.pdf';
+    my $sfile     = SL::SessionFile->new($file_name, mode => 'w', session_id => $data->{session_id});
+    $sfile->fh->close;
+    $data->{pdf_file_name} = $sfile->file_name;
+
+    $self->merge_pdfs(file_names => \@pdf_file_names, bothsided => $data->{bothsided}, out_path => $data->{pdf_file_name});
+    unlink @pdf_file_names;
+
+    1;
+
+  } or do {
+    push @{ $data->{print_errors} }, { message => $@ };
+  };
+
+  $job_obj->update_attributes(data_as_hash => $data);
+}
+
+sub print_pdfs {
+  my ($self)     = @_;
+
+  my $job_obj         = $self->{job_obj};
+  my $data            = $job_obj->data_as_hash;
+  my $printer_id      = $data->{printer_id};
+  my $copy_printer_id = $data->{copy_printer_id};
+
+  return if !$printer_id;
+
+  my $out;
+
+  foreach  my $local_printer_id ($printer_id, $copy_printer_id) {
+    next unless $local_printer_id;
+    SL::DB::Printer
+      ->new(id => $local_printer_id)
+      ->load
+      ->print_document(file_name => $data->{pdf_file_name});
+  }
+
+}
+
+1;
+
+__END__
+
+=encoding utf-8
+
+=head1 NAME
+
+SL::Helper::MassPrint_CreatePDF
+
+
+=head1 DESCRIPTION
+
+This Helper used bei Background Processing for Mass Printing.
+The redundant way to fill data for createPDF is concentrated into this helper.
+There are some additional settings for printing which are missed in CreatePDF Helper
+and also the appending of generic PDF-Documents.
+
+(This extension may be included in the CreatePDF Helper).
+
+
+=head1 REQUIRES
+
+L<SL::Helper::CreatePDF>
+
+=head1 METHODS
+
+=head2 C<create_massprint_pdf PARAMS>
+
+a tempory $form is used to set
+
+=over 2
+
+=item 1. content types
+
+=item 2. flatten_to_form
+
+=item 3. prepare_for_printing
+
+=item 4. set history
+
+=back
+
+before printing is done
+
+Recognized parameters are (not a complete list):
+
+=over 2
+
+=item * C<errors> – optional. If given, it must be an array ref. This will be
+filled with potential errors.
+
+=back
+
+
+=head1 AUTHOR
+
+Martin Helmling E<lt>martin.helmling@opendynamic.deE<gt>
+
+
+=cut