+sub action_create_pdf {
+  my ($self) = @_;
+
+  my $pdf;
+  my @errors = _create_pdf($self->order, \$pdf);
+  if (scalar @errors) {
+    return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render($self);
+  }
+
+  my $sfile = SL::SessionFile::Random->new(mode => "w");
+  $sfile->fh->print($pdf);
+  $sfile->fh->close;
+
+  my $tmp_filename = $sfile->file_name;
+  my $pdf_filename = t8('Sales Order') . '_' . $self->order->ordnumber . '.pdf';
+
+  $self->js
+    ->run('download_pdf', $tmp_filename, $pdf_filename)
+    ->flash('info', t8('The PDF has been created'))->render($self);
+}
+
+sub action_download_pdf {
+  my ($self) = @_;
+
+  return $self->send_file(
+    $::form->{tmp_filename},
+    type => 'application/pdf',
+    name => $::form->{pdf_filename},
+  );
+}
+
+sub action_show_email_dialog {
+  my ($self) = @_;
+
+  my $cv_method = $self->cv;
+
+  if (!$self->order->$cv_method) {
+    return $self->js->flash('error', t8('Cannot send E-mail without ' . $self->cv))
+                    ->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('show_email_dialog', $dialog_html)
+      ->reinit_widgets
+      ->render($self);
+}
+
+# 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);
+  }
+
+  my $sfile = SL::SessionFile::Random->new(mode => "w");
+  $sfile->fh->print($pdf);
+  $sfile->fh->close;
+
+  $mail->{attachments} = [{ "filename" => $sfile->file_name,
+                            "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('close_email_dialog')
+      ->render($self);
+}
+
+