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