+# print the order
+#
+# This is called if "print" is pressed in the print dialog.
+# If PDF creation was requested and succeeded, the pdf is stored in a session
+# file and the filename is stored as session value with an unique key. A
+# javascript function with this key is then called. This function calls the
+# download action below (action_download_pdf), which offers the file for
+# download.
+sub action_print {
+ my ($self) = @_;
+
+ my $format = $::form->{print_options}->{format};
+ my $media = $::form->{print_options}->{media};
+ my $formname = $::form->{print_options}->{formname};
+ my $copies = $::form->{print_options}->{copies};
+ my $groupitems = $::form->{print_options}->{groupitems};
+
+ # only pdf by now
+ if (none { $format eq $_ } qw(pdf)) {
+ return $self->js->flash('error', t8('Format \'#1\' is not supported yet/anymore.', $format))->render;
+ }
+
+ # only screen or printer by now
+ if (none { $media eq $_ } qw(screen printer)) {
+ return $self->js->flash('error', t8('Media \'#1\' is not supported yet/anymore.', $media))->render;
+ }
+
+ my $language;
+ $language = SL::DB::Language->new(id => $::form->{print_options}->{language_id})->load if $::form->{print_options}->{language_id};
+
+ my $form = Form->new;
+ $form->{ordnumber} = $self->order->ordnumber;
+ $form->{type} = $self->type;
+ $form->{format} = $format;
+ $form->{formname} = $formname;
+ $form->{language} = '_' . $language->template_code if $language;
+ my $pdf_filename = $form->generate_attachment_filename();
+
+ my $pdf;
+ my @errors = _create_pdf($self->order, \$pdf, { format => $format,
+ formname => $formname,
+ language => $language,
+ groupitems => $groupitems });
+ if (scalar @errors) {
+ return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render;
+ }
+
+ if ($media eq 'screen') {
+ # screen/download
+ my $sfile = SL::SessionFile::Random->new(mode => "w");
+ $sfile->fh->print($pdf);
+ $sfile->fh->close;
+
+ my $key = join('_', Time::HiRes::gettimeofday(), int rand 1000000000000);
+ $::auth->set_session_value("Order::create_pdf-${key}" => $sfile->file_name);
+
+ $self->js
+ ->run('kivi.Order.download_pdf', $pdf_filename, $key)
+ ->flash('info', t8('The PDF has been created'));
+
+ } elsif ($media eq 'printer') {
+ # printer
+ my $printer_id = $::form->{print_options}->{printer_id};
+ SL::DB::Printer->new(id => $printer_id)->load->print_document(
+ copies => $copies,
+ content => $pdf,
+ );
+
+ $self->js->flash('info', t8('The PDF has been printed'));
+ }
+
+ # copy file to webdav folder
+ if ($self->order->ordnumber && $::instance_conf->get_webdav_documents) {
+ my $webdav = SL::Webdav->new(
+ type => $self->type,
+ number => $self->order->ordnumber,
+ );
+ my $webdav_file = SL::Webdav::File->new(
+ webdav => $webdav,
+ filename => $pdf_filename,
+ );
+ eval {
+ $webdav_file->store(data => \$pdf);
+ 1;
+ } or do {
+ $self->js->flash('error', t8('Storing PDF to webdav folder failed: #1', $@));
+ }
+ }
+ if ($self->order->ordnumber && $::instance_conf->get_doc_storage) {
+ SL::File->store( object_id => $self->order->id,
+ object_type => $self->type,
+ mime_type => 'application/pdf',
+ source => 'created',
+ file_type => 'document',
+ file_name => $pdf_filename,
+ file_contents => $pdf);
+ }
+ $self->js->render;
+}
+
+# offer pdf for download
+#
+# It needs to get the key for the session value to get the pdf file.
+sub action_download_pdf {
+ my ($self) = @_;
+
+ my $key = $::form->{key};
+ my $tmp_filename = $::auth->get_session_value("Order::create_pdf-${key}");
+ return $self->send_file(
+ $tmp_filename,
+ type => 'application/pdf',
+ name => $::form->{pdf_filename},
+ );
+}
+
+# open the email dialog
+sub action_show_email_dialog {
+ my ($self) = @_;
+
+ my $cv_method = $self->cv;
+
+ if (!$self->order->$cv_method) {
+ return $self->js->flash('error', $self->cv eq 'customer' ? t8('Cannot send E-mail without customer given') : t8('Cannot send E-mail without vendor given'))
+ ->render($self);
+ }
+
+ $self->{email}->{to} = $self->order->contact->cp_email if $self->order->contact;
+ $self->{email}->{to} ||= $self->order->$cv_method->email;
+ $self->{email}->{cc} = $self->order->$cv_method->cc;
+ $self->{email}->{bcc} = join ', ', grep $_, $self->order->$cv_method->bcc, SL::DB::Default->get->global_bcc;
+ # Todo: get addresses from shipto, if any
+
+ my $form = Form->new;
+ $form->{ordnumber} = $self->order->ordnumber;
+ $form->{formname} = $self->type;
+ $form->{type} = $self->type;
+ $form->{language} = 'de';
+ $form->{format} = 'pdf';
+
+ $self->{email}->{subject} = $form->generate_email_subject();
+ $self->{email}->{attachment_filename} = $form->generate_attachment_filename();
+ $self->{email}->{message} = $form->create_email_signature();
+
+ my $dialog_html = $self->render('order/tabs/_email_dialog', { output => 0 });
+ $self->js
+ ->run('kivi.Order.show_email_dialog', $dialog_html)
+ ->reinit_widgets
+ ->render($self);
+}
+
+# send email
+#
+# Todo: handling error messages: flash is not displayed in dialog, but in the main form
+sub action_send_email {
+ my ($self) = @_;
+
+ my $mail = Mailer->new;
+ $mail->{from} = qq|"$::myconfig{name}" <$::myconfig{email}>|;
+ $mail->{$_} = $::form->{email}->{$_} for qw(to cc bcc subject message);
+
+ my $pdf;
+ my @errors = _create_pdf($self->order, \$pdf, {media => 'email'});
+ if (scalar @errors) {
+ return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render($self);
+ }
+
+ $mail->{attachments} = [{ "content" => $pdf,
+ "name" => $::form->{email}->{attachment_filename} }];
+
+ if (my $err = $mail->send) {
+ return $self->js->flash('error', t8('Sending E-mail: ') . $err)
+ ->render($self);
+ }
+
+ # internal notes
+ my $intnotes = $self->order->intnotes;
+ $intnotes .= "\n\n" if $self->order->intnotes;
+ $intnotes .= t8('[email]') . "\n";
+ $intnotes .= t8('Date') . ": " . $::locale->format_date_object(DateTime->now_local, precision => 'seconds') . "\n";
+ $intnotes .= t8('To (email)') . ": " . $mail->{to} . "\n";
+ $intnotes .= t8('Cc') . ": " . $mail->{cc} . "\n" if $mail->{cc};
+ $intnotes .= t8('Bcc') . ": " . $mail->{bcc} . "\n" if $mail->{bcc};
+ $intnotes .= t8('Subject') . ": " . $mail->{subject} . "\n\n";
+ $intnotes .= t8('Message') . ": " . $mail->{message};
+
+ $self->js
+ ->val('#order_intnotes', $intnotes)
+ ->run('kivi.Order.close_email_dialog')
+ ->render($self);
+}
+
+# save the order and redirect to the frontend subroutine for a new
+# delivery order
+sub action_save_and_delivery_order {
+ my ($self) = @_;
+
+ my $errors = $self->_save();
+
+ if (scalar @{ $errors }) {
+ $self->js->flash('error', $_) foreach @{ $errors };
+ return $self->js->render();
+ }
+ flash_later('info', $::locale->text('The order has been saved'));
+
+ my @redirect_params = (
+ controller => 'oe.pl',
+ action => 'oe_delivery_order_from_order',
+ id => $self->order->id,
+ );
+
+ $self->redirect_to(@redirect_params);
+}
+
+# set form elements in respect to a changed customer or vendor
+#
+# This action is called on an change of the customer/vendor picker.