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