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);
15 use SL::Helper::MassPrintCreatePDF qw(:all);
16 use SL::Helper::CreatePDF qw(:all);
17 use SL::Helper::File qw(store_pdf append_general_pdf_attachments doc_storage_enabled);
19 use constant WAITING_FOR_EXECUTION => 0;
20 use constant CONVERTING_DELIVERY_ORDERS => 1;
21 use constant PRINTING_INVOICES => 2;
22 use constant DONE => 3;
26 # record_ids => [ 123, 124, 127, ],
28 # copy_printer_id => 4711,
29 # transdate => $today || $custom_transdate,
32 # invoice_ids => [ 234, 235, ],
33 # conversion_errors => [ { id => 124, number => 'A981723', message => "Stuff went boom" }, ],
34 # print_errors => [ { id => 234, number => 'L87123123', message => "Printer is out of coffee" }, ],
35 # pdf_file_name => 'qweqwe.pdf',
36 # session_id => $::auth->get_session_id,
42 my $job_obj = $self->{job_obj};
43 my $db = $job_obj->db;
45 $job_obj->set_data(status => CONVERTING_DELIVERY_ORDERS())->save;
47 foreach my $delivery_order_id (@{ $job_obj->data_as_hash->{record_ids} }) {
48 my $number = $delivery_order_id;
49 my $data = $job_obj->data_as_hash;
52 my $sales_delivery_order = SL::DB::DeliveryOrder->new(id => $delivery_order_id)->load;
53 $number = $sales_delivery_order->donumber;
54 my %conversion_params = $data->{transdate} ? ('attributes' => { transdate => $data->{transdate} }) : ();
55 my $invoice = $sales_delivery_order->convert_to_invoice(%conversion_params);
57 die $db->error if !$invoice;
59 my @linked_shop_orders = $invoice->linked_records(
61 via => [ 'DeliveryOrder', 'Order' ],
63 #if (scalar @linked_shop_orders[0][0] >= 1){
65 my $shop_order = $linked_shop_orders[0][0];
68 my $shop_config = SL::DB::Manager::Shop->get_first( query => [ id => $shop_order->shop_id ] );
69 my $shop = SL::Shop->new( config => $shop_config );
70 $shop->connector->set_orderstatus($shop_order->shop_trans_id, "completed");
73 $data->{num_created}++;
74 push @{ $data->{invoice_ids} }, $invoice->id;
75 push @{ $self->{invoices} }, $invoice;
79 push @{ $data->{conversion_errors} }, { id => $delivery_order_id, number => $number, message => $@ };
82 $job_obj->update_attributes(data_as_hash => $data);
86 sub convert_invoices_to_pdf {
89 return if !@{ $self->{invoices} };
91 my $job_obj = $self->{job_obj};
92 my $db = $job_obj->db;
94 $job_obj->set_data(status => PRINTING_INVOICES())->save;
95 my $data = $job_obj->data_as_hash;
97 my $printer_id = $data->{printer_id};
98 if ( $data->{media} ne 'printer' ) {
100 $data->{media} = 'file';
104 formname => 'invoice',
106 media => $printer_id ? 'printer' : 'file',
107 printer_id => $printer_id,
112 foreach my $invoice (@{ $self->{invoices} }) {
117 variables => \%variables,
118 return => 'file_name',
119 document => $invoice,
122 push @pdf_file_names, $self->create_massprint_pdf(%params);
123 $data->{num_printed}++;
125 if (scalar @errors) {
126 push @{ $data->{print_errors} }, { id => $invoice->id, number => $invoice->invnumber, message => join(', ', @errors) };
132 push @{ $data->{print_errors} }, { id => $invoice->id, number => $invoice->invnumber, message => $@ };
135 $job_obj->update_attributes(data_as_hash => $data);
138 $self->merge_massprint_pdf(file_names => \@pdf_file_names, type => 'invoice' ) if scalar(@pdf_file_names) > 0;
142 my ($self, $job_obj) = @_;
144 $self->{job_obj} = $job_obj;
145 $self->{invoices} = [];
147 $self->create_invoices;
148 $self->convert_invoices_to_pdf;
151 $job_obj->set_data(status => DONE())->save;
166 SL::BackgroundJob::MassRecordCreationAndPrinting
172 use SL::BackgroundJob::MassRecordCreationAndPrinting
174 my $job = SL::DB::BackgroundJob->new(
177 package_name => 'MassRecordCreationAndPrinting',
180 record_ids => [ map { $_->id } @records[0..$num - 1] ],
181 printer_id => $::form->{printer_id},
182 copy_printer_id => $::form->{copy_printer_id},
183 transdate => $::form->{transdate} || undef,
184 status => SL::BackgroundJob::MassRecordCreationAndPrinting->WAITING_FOR_EXECUTION(),
188 conversion_errors => [ ],
191 )->update_next_run_at;
192 SL::System::TaskServer->new->wake_up;
196 This background job has 4 states which are described by the four constants above.
200 =item * WAITING_FOR_EXECUTION
201 Background has been initialised and needs to be picked up by the task_server
203 =item * CONVERTING_DELIVERY_ORDERS
206 =item * PRINTING_INVOICES
207 Printing, if done via print command
210 To release the process and for the user information
218 =item C<create_invoices>
220 Converts the source objects (DeliveryOrder) to destination objects (Invoice).
221 On success objects will be saved.
222 If param C<data->{transdate}> is set, this will be the transdate. No safety checks are done.
223 The original conversion from order to delivery order had a post_save_sanity_check
224 C<$delivery_order-E<gt>post_save_sanity_check; # just a hint at e8521eee (#90 od)>
225 The params of convert_to_invoice are created on the fly with a anonym sub, as a alternative check
226 perlsecret Enterprise ()x!!
228 =item C<convert_invoices_to_pdf>
230 Takes the new destination objects and merges them via print template in one pdf.
234 Sent the pdf to the printer command.
235 If param C<data->{copy_printer_id}> is set, the pdf will be sent to a second printer command.
241 Currently the calculation from the gui (form) differs from the calculation via convert (PTC).
242 Furthermore mass conversion with foreign currencies could lead to problems (daily rate check).
246 It would be great to extend this Job for general background printing. The original project
247 code converted sales order to delivery orders (84e7c540) this could be merged in unstable.
248 The states should be CONVERTING_SOURCE_RECORDS, PRINTING_DESTINATION_RECORDS etc
252 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
254 Jan Büren E<lt>jan@kivitendo-premium.deE<gt>