Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / BackgroundJob / MassDeliveryOrderPrinting.pm
1 package SL::BackgroundJob::MassDeliveryOrderPrinting;
2
3 use strict;
4 use warnings;
5
6 use parent qw(SL::BackgroundJob::Base);
7
8 use SL::DB::DeliveryOrder;
9 use SL::DB::Order;  # origin order to delivery_order
10 use SL::DB::Printer;
11 use SL::SessionFile;
12 use SL::Template;
13 use SL::Helper::MassPrintCreatePDF qw(:all);
14 use SL::Helper::CreatePDF qw(:all);
15 use SL::Helper::File qw(store_pdf append_general_pdf_attachments doc_storage_enabled);
16
17 use constant WAITING_FOR_EXECUTION       => 0;
18 use constant PRINTING_DELIVERY_ORDERS    => 1;
19 use constant DONE                        => 2;
20
21 # Data format:
22 # my $data             = {
23 #   record_ids          => [ 123, 124, 127, ],
24 #   printer_id         => 4711,
25 #   num_created        => 0,
26 #   num_printed        => 0,
27 #   printed_ids        => [ 234, 235, ],
28 #   conversion_errors  => [ { id => 124, number => 'A981723', message => "Stuff went boom" }, ],
29 #   print_errors       => [ { id => 234, number => 'L87123123', message => "Printer is out of coffee" }, ],
30 #   pdf_file_name      => 'qweqwe.pdf',
31 #   session_id         => $::auth->get_session_id,
32 # };
33
34
35 sub convert_deliveryorders_to_pdf {
36   my ($self) = @_;
37
38   my $job_obj = $self->{job_obj};
39   my $db      = $job_obj->db;
40
41   $job_obj->set_data(status => PRINTING_DELIVERY_ORDERS())->save;
42   my $data   = $job_obj->data_as_hash;
43
44   my $printer_id = $data->{printer_id};
45   if ( $data->{media} ne 'printer' ) {
46       undef $printer_id;
47       $data->{media} = 'file';
48   }
49   my %variables  = (
50     type         => 'delivery_order',
51     formname     =>  $data->{formname},
52     format       =>  $data->{format},
53     media        =>  $data->{media},
54     printer_id   =>  $printer_id,
55     copies       =>  $data->{copies},
56   );
57
58   my @pdf_file_names;
59   foreach my $delivery_order_id (@{ $data->{record_ids} }) {
60     my $number = $delivery_order_id;
61     my $delivery_order = SL::DB::DeliveryOrder->new(id => $delivery_order_id)->load;
62
63     eval {
64       $number = $delivery_order->donumber;
65
66       my %params = (
67         variables  => \%variables,
68         document   => $delivery_order,
69         return     => 'file_name',
70        );
71
72       push @pdf_file_names, $self->create_massprint_pdf(%params);
73
74       $data->{num_created}++;
75
76       1;
77
78     } or do {
79       push @{ $data->{conversion_errors} }, { id => $delivery_order->id, number => $number, message => $@ };
80     };
81
82     $job_obj->update_attributes(data_as_hash => $data);
83   }
84
85   $self->merge_massprint_pdf(file_names => \@pdf_file_names, type => 'delivery_order' ) if scalar(@pdf_file_names) > 0;
86 }
87
88 sub run {
89   my ($self, $job_obj) = @_;
90
91   $self->{job_obj}         = $job_obj;
92
93   $self->convert_deliveryorders_to_pdf;
94   $self->print_pdfs;
95
96   my $data       = $job_obj->data_as_hash;
97   $data->{num_printed} =  $data->{num_created};
98   $job_obj->update_attributes(data_as_hash => $data);
99   $job_obj->set_data(status => DONE())->save;
100
101   return 1;
102 }
103
104 1;