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);
17 use constant WAITING_FOR_EXECUTION => 0;
18 use constant CONVERTING_DELIVERY_ORDERS => 1;
19 use constant PRINTING_INVOICES => 2;
20 use constant DONE => 3;
23 # record_ids => [ 123, 124, 127, ],
25 # copy_printer_id => 4711,
26 # transdate => $today || $custom_transdate,
29 # invoice_ids => [ 234, 235, ],
30 # conversion_errors => [ { id => 124, number => 'A981723', message => "Stuff went boom" }, ],
31 # print_errors => [ { id => 234, number => 'L87123123', message => "Printer is out of coffee" }, ],
32 # pdf_file_name => 'qweqwe.pdf',
33 # session_id => $::auth->get_session_id,
39 my $job_obj = $self->{job_obj};
40 my $db = $job_obj->db;
42 $job_obj->set_data(status => CONVERTING_DELIVERY_ORDERS())->save;
44 foreach my $delivery_order_id (@{ $job_obj->data_as_hash->{record_ids} }) {
45 my $number = $delivery_order_id;
46 my $data = $job_obj->data_as_hash;
49 my $sales_delivery_order = SL::DB::DeliveryOrder->new(id => $delivery_order_id)->load;
50 $number = $sales_delivery_order->donumber;
51 my %conversion_params = $data->{transdate} ? ('attributes' => { transdate => $data->{transdate} }) : ();
52 my $invoice = $sales_delivery_order->convert_to_invoice(%conversion_params);
54 die $db->error if !$invoice;
56 $data->{num_created}++;
57 push @{ $data->{invoice_ids} }, $invoice->id;
58 push @{ $self->{invoices} }, $invoice;
62 push @{ $data->{conversion_errors} }, { id => $delivery_order_id, number => $number, message => $@ };
65 $job_obj->update_attributes(data_as_hash => $data);
69 sub convert_invoices_to_pdf {
72 return if !@{ $self->{invoices} };
74 my $job_obj = $self->{job_obj};
75 my $db = $job_obj->db;
77 $job_obj->set_data(status => PRINTING_INVOICES())->save;
79 require SL::Controller::MassInvoiceCreatePrint;
81 my $printer_id = $job_obj->data_as_hash->{printer_id};
82 my $ctrl = SL::Controller::MassInvoiceCreatePrint->new;
85 formname => 'invoice',
87 media => $printer_id ? 'printer' : 'file',
92 foreach my $invoice (@{ $self->{invoices} }) {
93 my $data = $job_obj->data_as_hash;
97 template => $ctrl->find_template(name => 'invoice', printer_id => $printer_id),
98 variables => Form->new(''),
99 return => 'file_name',
100 variable_content_types => { longdescription => 'html',
107 $create_params{variables}->{$_} = $variables{$_} for keys %variables;
109 $invoice->flatten_to_form($create_params{variables}, format_amounts => 1);
110 $create_params{variables}->prepare_for_printing;
112 push @pdf_file_names, $ctrl->create_pdf(%create_params);
114 # copy file to webdav folder
115 if ($::instance_conf->get_webdav_documents) {
116 my $webdav = SL::Webdav->new(
118 number => $invoice->invnumber,
120 my $webdav_file = SL::Webdav::File->new(
122 filename => t8('Invoice') . '_' . $invoice->invnumber . '.pdf',
125 $webdav_file->store(file => $pdf_file_names[-1]);
128 push @{ $data->{print_errors} }, { id => $invoice->id, number => $invoice->invnumber, message => $@ };
132 $data->{num_printed}++;
137 push @{ $data->{print_errors} }, { id => $invoice->id, number => $invoice->invnumber, message => $@ };
140 $job_obj->update_attributes(data_as_hash => $data);
143 if (@pdf_file_names) {
144 my $data = $job_obj->data_as_hash;
147 $self->{merged_pdf} = $ctrl->merge_pdfs(file_names => \@pdf_file_names);
148 unlink @pdf_file_names;
151 my $file_name = 'mass_invoice' . $job_obj->id . '.pdf';
152 my $sfile = SL::SessionFile->new($file_name, mode => 'w', session_id => $data->{session_id});
153 $sfile->fh->print($self->{merged_pdf});
156 $data->{pdf_file_name} = $file_name;
162 push @{ $data->{print_errors} }, { message => $@ };
165 $job_obj->update_attributes(data_as_hash => $data);
172 my $job_obj = $self->{job_obj};
173 my $data = $job_obj->data_as_hash;
174 my $printer_id = $data->{printer_id};
175 my $copy_printer_id = $data->{copy_printer_id};
177 return if !$printer_id;
181 foreach my $local_printer_id ($printer_id, $copy_printer_id) {
182 next unless $local_printer_id;
184 ->new(id => $local_printer_id)
186 ->print_document(content => $self->{merged_pdf});
192 my ($self, $job_obj) = @_;
194 $self->{job_obj} = $job_obj;
195 $self->{invoices} = [];
197 $self->create_invoices;
198 $self->convert_invoices_to_pdf;
201 $job_obj->set_data(status => DONE())->save;
216 SL::BackgroundJob::MassRecordCreationAndPrinting
222 use SL::BackgroundJob::MassRecordCreationAndPrinting
224 my $job = SL::DB::BackgroundJob->new(
227 package_name => 'MassRecordCreationAndPrinting',
230 record_ids => [ map { $_->id } @records[0..$num - 1] ],
231 printer_id => $::form->{printer_id},
232 copy_printer_id => $::form->{copy_printer_id},
233 transdate => $::form->{transdate} || undef,
234 status => SL::BackgroundJob::MassRecordCreationAndPrinting->WAITING_FOR_EXECUTION(),
238 conversion_errors => [ ],
241 )->update_next_run_at;
242 SL::System::TaskServer->new->wake_up;
246 This background job has 4 states which are described by the four constants above.
250 =item * WAITING_FOR_EXECUTION
251 Background has been initialised and needs to be picked up by the task_server
253 =item * CONVERTING_DELIVERY_ORDERS
256 =item * PRINTING_INVOICES
257 Printing, if done via print command
260 To release the process and for the user information
268 =item C<create_invoices>
270 Converts the source objects (DeliveryOrder) to destination objects (Invoice).
271 On success objects will be saved.
272 If param C<data->{transdate}> is set, this will be the transdate. No safety checks are done.
273 The original conversion from order to delivery order had a post_save_sanity_check
274 C<$delivery_order-E<gt>post_save_sanity_check; # just a hint at e8521eee (#90 od)>
275 The params of convert_to_invoice are created on the fly with a anonym sub, as a alternative check
276 perlsecret Enterprise ()x!!
278 =item C<convert_invoices_to_pdf>
280 Takes the new destination objects and merges them via print template in one pdf.
284 Sent the pdf to the printer command.
285 If param C<data->{copy_printer_id}> is set, the pdf will be sent to a second printer command.
291 Currently the calculation from the gui (form) differs from the calculation via convert (PTC).
292 Furthermore mass conversion with foreign currencies could lead to problems (daily rate check).
296 It would be great to extend this Job for general background printing. The original project
297 code converted sales order to delivery orders (84e7c540) this could be merged in unstable.
298 The states should be CONVERTING_SOURCE_RECORDS, PRINTING_DESTINATION_RECORDS etc
302 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
304 Jan Büren E<lt>jan@kivitendo-premium.deE<gt>