be80a69d4d62cc23ed71c1938ebd74372ce9aac2
[kivitendo-erp.git] / SL / Helper / MassPrintCreatePDF.pm
1 package SL::Helper::MassPrintCreatePDF;
2
3 use strict;
4
5 use SL::Webdav;
6
7 use Exporter 'import';
8 our @EXPORT_OK = qw(create_massprint_pdf merge_massprint_pdf create_pdfs print_pdfs);
9 our %EXPORT_TAGS = (
10   all => \@EXPORT_OK,
11 );
12
13 sub create_pdfs {
14   my ($self, %params) = @_;
15   my @pdf_file_names;
16   foreach my $document (@{ $params{documents} }) {
17     $params{document} = $document;
18     push @pdf_file_names, $self->create_massprint_pdf(%params);
19   }
20
21   return @pdf_file_names;
22 }
23
24 sub create_massprint_pdf {
25   my ($self, %params) = @_;
26   my $form = Form->new('');
27   my %create_params = (
28     variables => $form,
29     record    => $params{document},
30     return    => 'file_name',
31   );
32   ## find_template may return a list !
33   $create_params{template} = $self->find_template(name => $params{variables}->{formname}, printer_id => $params{printer_id});
34   $form->{cwd}= POSIX::getcwd();
35
36   $form->{$_} = $params{variables}->{$_} for keys %{ $params{variables} };
37
38   $create_params{variable_content_types} = $form->get_variable_content_types();
39   $params{document}->flatten_to_form($form, format_amounts => 1);
40   # flatten_to_form sets payment_terms from customer/vendor - we do not want that here
41   # really ??
42   delete $form->{payment_terms} if !$form->{payment_id};
43   for my $i (1 .. $form->{rowcount}) {
44     $form->{"sellprice_$i"} = $form->{"fxsellprice_$i"};
45   }
46
47   $form->prepare_for_printing;
48
49   $form->{language}            = '_' . $form->{language};
50   $form->{attachment_filename} = $form->generate_attachment_filename;
51
52   my $pdf_filename = $self->create_pdf(%create_params);
53
54   if ($::instance_conf->get_webdav_documents && !$form->{preview}) {
55     my $webdav = SL::Webdav->new(
56       type     => $params{document}->type,
57       number   => $params{document}->record_number,
58     );
59     my $webdav_file = SL::Webdav::File->new(
60       webdav   => $webdav,
61       filename => $form->{attachment_filename},
62     );
63     eval {
64       $webdav_file->store(file => $pdf_filename);
65       1;
66     } or do {
67       push @{ $params{errors} }, $@ if exists $params{errors};
68     }
69   }
70
71   if ( $::instance_conf->get_doc_storage && ! $form->{preview}) {
72     $self->append_general_pdf_attachments(filepath => $pdf_filename, type => $form->{type} );
73     $form->{tmpfile} = $pdf_filename;
74     $form->{id}      = $params{document}->id;
75     $self->store_pdf($form);
76   }
77   $form->{id} = $params{document}->id;
78   if ( ! $form->{preview} ) {
79     if ( ref($params{document}) eq 'SL::DB::DeliveryOrder' ) {
80       $form->{snumbers} = "ordnumber_" . $params{document}->donumber;
81     }
82     else {
83       $form->{snumbers} = "unknown";
84     }
85     $form->{addition} = "PRINTED";
86     $form->{what_done} = $::form->{type};
87     $form->save_history;
88   }
89   return $pdf_filename;
90 }
91
92 sub merge_massprint_pdf {
93   my ($self, %params)     = @_;
94   return unless $params{file_names} && $params{type};
95
96   my $job_obj = $self->{job_obj};
97   my $data    = $job_obj->data_as_hash;
98   my @pdf_file_names = @{$params{file_names}};
99
100   eval {
101     my $file_name = 'mass_'.$params{type}.'_'.$job_obj->id . '.pdf';
102     my $sfile     = SL::SessionFile->new($file_name, mode => 'w', session_id => $data->{session_id});
103     $sfile->fh->close;
104     $data->{pdf_file_name} = $sfile->file_name;
105
106     $self->merge_pdfs(file_names => \@pdf_file_names, bothsided => $data->{bothsided}, out_path => $data->{pdf_file_name});
107     unlink @pdf_file_names;
108
109     1;
110
111   } or do {
112     push @{ $data->{print_errors} }, { message => $@ };
113   };
114
115   $job_obj->update_attributes(data_as_hash => $data);
116 }
117
118 sub print_pdfs {
119   my ($self)     = @_;
120
121   my $job_obj         = $self->{job_obj};
122   my $data            = $job_obj->data_as_hash;
123   my $printer_id      = $data->{printer_id};
124   my $copy_printer_id = $data->{copy_printer_id};
125
126   return if !$printer_id;
127
128   my $out;
129
130   foreach  my $local_printer_id ($printer_id, $copy_printer_id) {
131     next unless $local_printer_id;
132     SL::DB::Printer
133       ->new(id => $local_printer_id)
134       ->load
135       ->print_document(file_name => $data->{pdf_file_name});
136   }
137
138 }
139
140 1;
141
142 __END__
143
144 =encoding utf-8
145
146 =head1 NAME
147
148 SL::Helper::MassPrint_CreatePDF
149
150
151 =head1 DESCRIPTION
152
153 This Helper used bei Background Processing for Mass Printing.
154 The redundant way to fill data for createPDF is concentrated into this helper.
155 There are some additional settings for printing which are missed in CreatePDF Helper
156 and also the appending of generic PDF-Documents.
157
158 (This extension may be included in the CreatePDF Helper).
159
160
161 =head1 REQUIRES
162
163 L<SL::Helper::CreatePDF>
164
165 =head1 METHODS
166
167 =head2 C<create_massprint_pdf PARAMS>
168
169 a tempory $form is used to set
170
171 =over 2
172
173 =item 1. content types
174
175 =item 2. flatten_to_form
176
177 =item 3. prepare_for_printing
178
179 =item 4. set history
180
181 =back
182
183 before printing is done
184
185 Recognized parameters are (not a complete list):
186
187 =over 2
188
189 =item * C<errors> – optional. If given, it must be an array ref. This will be
190 filled with potential errors.
191
192 =back
193
194
195 =head1 AUTHOR
196
197 Martin Helmling E<lt>martin.helmling@opendynamic.deE<gt>
198
199
200 =cut