X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FOrder.pm;h=e709336ab9b75b2ef9ebc0126a513b8005d28fd2;hb=824735fcfa7c7bb9a5e76ceb2214c6a7cb42e60a;hp=37ba87cfa13fce29353403741b005aac6abf0f75;hpb=844a541e0d8f59644540413f675e8f07cd154cf6;p=kivitendo-erp.git diff --git a/SL/Controller/Order.pm b/SL/Controller/Order.pm index 37ba87cfa..e709336ab 100644 --- a/SL/Controller/Order.pm +++ b/SL/Controller/Order.pm @@ -4,6 +4,7 @@ use strict; use parent qw(SL::Controller::Base); use SL::Helper::Flash qw(flash_later); +use SL::HTML::Util; use SL::Presenter::Tag qw(select_tag hidden_tag div_tag); use SL::Locale::String qw(t8); use SL::SessionFile::Random; @@ -14,6 +15,7 @@ use SL::MIME; use SL::Util qw(trim); use SL::YAML; use SL::DB::AdditionalBillingAddress; +use SL::DB::AuthUser; use SL::DB::History; use SL::DB::Order; use SL::DB::Default; @@ -279,8 +281,8 @@ sub action_print { my $groupitems = $::form->{print_options}->{groupitems}; my $printer_id = $::form->{print_options}->{printer_id}; - # only pdf and opendocument by now - if (none { $format eq $_ } qw(pdf opendocument opendocument_pdf)) { + # only PDF, OpenDocument & HTML for now + if (none { $format eq $_ } qw(pdf opendocument opendocument_pdf html)) { return $self->js->flash('error', t8('Format \'#1\' is not supported yet/anymore.', $format))->render; } @@ -296,25 +298,25 @@ sub action_print { $form->{format} = $format; $form->{formname} = $formname; $form->{language} = '_' . $self->order->language->template_code if $self->order->language; - my $pdf_filename = $form->generate_attachment_filename(); - - my $pdf; - my @errors = generate_pdf($self->order, \$pdf, { format => $format, - formname => $formname, - language => $self->order->language, - printer_id => $printer_id, - groupitems => $groupitems }); + my $doc_filename = $form->generate_attachment_filename(); + + my $doc; + my @errors = $self->generate_doc(\$doc, { format => $format, + formname => $formname, + language => $self->order->language, + printer_id => $printer_id, + groupitems => $groupitems }); if (scalar @errors) { - return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render; + return $self->js->flash('error', t8('Generating the document failed: #1', $errors[0]))->render; } if ($media eq 'screen') { # screen/download - $self->js->flash('info', t8('The PDF has been created')); + $self->js->flash('info', t8('The document has been created.')); $self->send_file( - \$pdf, - type => SL::MIME->mime_type_from_ext($pdf_filename), - name => $pdf_filename, + \$doc, + type => SL::MIME->mime_type_from_ext($doc_filename), + name => $doc_filename, js_no_render => 1, ); @@ -323,13 +325,13 @@ sub action_print { my $printer_id = $::form->{print_options}->{printer_id}; SL::DB::Printer->new(id => $printer_id)->load->print_document( copies => $copies, - content => $pdf, + content => $doc, ); - $self->js->flash('info', t8('The PDF has been printed')); + $self->js->flash('info', t8('The document has been printed.')); } - my @warnings = store_pdf_to_webdav_and_filemanagement($self->order, $pdf, $pdf_filename); + my @warnings = $self->store_doc_to_webdav_and_filemanagement($doc, $doc_filename, $formname); if (scalar @warnings) { $self->js->flash('warning', $_) for @warnings; } @@ -366,10 +368,10 @@ sub action_preview_pdf { my $pdf_filename = $form->generate_attachment_filename(); my $pdf; - my @errors = generate_pdf($self->order, \$pdf, { format => $format, - formname => $formname, - language => $self->order->language, - }); + my @errors = $self->generate_doc(\$pdf, { format => $format, + formname => $formname, + language => $self->order->language, + }); if (scalar @errors) { return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render; } @@ -425,13 +427,18 @@ sub action_save_and_show_email_dialog { $email_form->{js_send_function} = 'kivi.Order.send_email()'; my %files = $self->get_files_for_email_dialog(); - $self->{all_employees} = SL::DB::Manager::Employee->get_all(query => [ deleted => 0 ]); + + my @employees_with_email = grep { + my $user = SL::DB::Manager::AuthUser->find_by(login => $_->login); + $user && !!trim($user->get_config_value('email')); + } @{ SL::DB::Manager::Employee->get_all_sorted(query => [ deleted => 0 ]) }; + my $dialog_html = $self->render('common/_send_email_dialog', { output => 0 }, - email_form => $email_form, - show_bcc => $::auth->assert('email_bcc', 'may fail'), - FILES => \%files, - is_customer => $self->cv eq 'customer', - ALL_EMPLOYEES => $self->{all_employees}, + email_form => $email_form, + show_bcc => $::auth->assert('email_bcc', 'may fail'), + FILES => \%files, + is_customer => $self->cv eq 'customer', + ALL_EMPLOYEES => \@employees_with_email, ); $self->js @@ -468,25 +475,36 @@ sub action_send_email { $::form->{$_} = $::form->{print_options}->{$_} for keys %{ $::form->{print_options} }; $::form->{media} = 'email'; - if (($::form->{attachment_policy} // '') !~ m{^(?:old_file|no_file)$}) { - my $pdf; - my @errors = generate_pdf($self->order, \$pdf, {media => $::form->{media}, - format => $::form->{print_options}->{format}, - formname => $::form->{print_options}->{formname}, - language => $self->order->language, - printer_id => $::form->{print_options}->{printer_id}, - groupitems => $::form->{print_options}->{groupitems}}); + $::form->{attachment_policy} //= ''; + + # Is an old file version available? + my $attfile; + if ($::form->{attachment_policy} eq 'old_file') { + $attfile = SL::File->get_all(object_id => $self->order->id, + object_type => $self->type, + file_type => 'document', + print_variant => $::form->{formname}); + } + + if ($::form->{attachment_policy} ne 'no_file' && !($::form->{attachment_policy} eq 'old_file' && $attfile)) { + my $doc; + my @errors = $self->generate_doc(\$doc, {media => $::form->{media}, + format => $::form->{print_options}->{format}, + formname => $::form->{print_options}->{formname}, + language => $self->order->language, + printer_id => $::form->{print_options}->{printer_id}, + groupitems => $::form->{print_options}->{groupitems}}); if (scalar @errors) { - return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render($self); + return $self->js->flash('error', t8('Generating the document failed: #1', $errors[0]))->render($self); } - my @warnings = store_pdf_to_webdav_and_filemanagement($self->order, $pdf, $::form->{attachment_filename}); + my @warnings = $self->store_doc_to_webdav_and_filemanagement($doc, $::form->{attachment_filename}, $::form->{formname}); if (scalar @warnings) { flash_later('warning', $_) for @warnings; } my $sfile = SL::SessionFile::Random->new(mode => "w"); - $sfile->fh->print($pdf); + $sfile->fh->print($doc); $sfile->fh->close; $::form->{tmpfile} = $sfile->file_name; @@ -494,7 +512,7 @@ sub action_send_email { } $::form->{id} = $self->order->id; # this is used in SL::Mailer to create a linked record to the mail - $::form->send_email(\%::myconfig, 'pdf'); + $::form->send_email(\%::myconfig, $::form->{print_options}->{format}); # internal notes my $intnotes = $self->order->intnotes; @@ -505,7 +523,7 @@ sub action_send_email { $intnotes .= t8('Cc') . ": " . $::form->{cc} . "\n" if $::form->{cc}; $intnotes .= t8('Bcc') . ": " . $::form->{bcc} . "\n" if $::form->{bcc}; $intnotes .= t8('Subject') . ": " . $::form->{subject} . "\n\n"; - $intnotes .= t8('Message') . ": " . $::form->{message}; + $intnotes .= t8('Message') . ": " . SL::HTML::Util->strip($::form->{message}); $self->order->update_attributes(intnotes => $intnotes); @@ -749,8 +767,10 @@ sub action_show_customer_vendor_details_dialog { $details{payment_terms} = $cv->payment->description if $cv->payment; $details{pricegroup} = $cv->pricegroup->pricegroup if $is_customer && $cv->pricegroup; - foreach my $entry (@{ $cv->additional_billing_addresses }) { - push @{ $details{ADDITIONAL_BILLING_ADDRESSES} }, { map { $_ => $entry->$_ } @{$entry->meta->columns} }; + if ($is_customer) { + foreach my $entry (@{ $cv->additional_billing_addresses }) { + push @{ $details{ADDITIONAL_BILLING_ADDRESSES} }, { map { $_ => $entry->$_ } @{$entry->meta->columns} }; + } } foreach my $entry (@{ $cv->shipto }) { push @{ $details{SHIPTO} }, { map { $_ => $entry->$_ } @{$entry->meta->columns} }; @@ -1324,6 +1344,8 @@ sub build_contact_select { sub build_billing_address_select { my ($self) = @_; + return '' if $self->cv ne 'customer'; + select_tag('order.billing_address_id', [ {displayable_id => '', id => ''}, $self->order->{$self->cv}->additional_billing_addresses ], value_key => 'id', @@ -1879,7 +1901,7 @@ sub pre_render { no_queue => 1, no_postscript => 1, no_opendocument => 0, - no_html => 1}, + no_html => 0}, ); foreach my $item (@{$self->order->orderitems}) { @@ -1914,8 +1936,8 @@ sub pre_render { $self->get_item_cvpartnumber($_) for @{$self->order->items_sorted}; - $::request->{layout}->use_javascript("${_}.js") for qw(kivi.SalesPurchase kivi.Order kivi.File ckeditor/ckeditor ckeditor/adapters/jquery - edit_periodic_invoices_config calculate_qty kivi.Validator follow_up show_history); + $::request->{layout}->use_javascript("${_}.js") for qw(kivi.Validator kivi.SalesPurchase kivi.Order kivi.File ckeditor/ckeditor ckeditor/adapters/jquery + edit_periodic_invoices_config calculate_qty follow_up show_history); $self->setup_edit_action_bar; } @@ -2065,9 +2087,10 @@ sub setup_edit_action_bar { } } -sub generate_pdf { - my ($order, $pdf_ref, $params) = @_; +sub generate_doc { + my ($self, $doc_ref, $params) = @_; + my $order = $self->order; my @errors = (); my $print_form = Form->new(''); @@ -2087,6 +2110,9 @@ sub generate_pdf { if ($print_form->{format} =~ /(opendocument|oasis)/i) { $template_ext = 'odt'; $template_type = 'OpenDocument'; + } elsif ($print_form->{format} =~ m{html}i) { + $template_ext = 'html'; + $template_type = 'HTML'; } # search for the template @@ -2108,7 +2134,7 @@ sub generate_pdf { eval { $print_form->prepare_for_printing; - $$pdf_ref = SL::Helper::CreatePDF->create_pdf( + $$doc_ref = SL::Helper::CreatePDF->create_pdf( format => $print_form->{format}, template_type => $template_type, template => $template_file, @@ -2117,6 +2143,7 @@ sub generate_pdf { longdescription => 'html', partnotes => 'html', notes => 'html', + $::form->get_variable_content_types_for_cvars, }, ); 1; @@ -2303,9 +2330,10 @@ sub save_history { )->save; } -sub store_pdf_to_webdav_and_filemanagement { - my($order, $content, $filename) = @_; +sub store_doc_to_webdav_and_filemanagement { + my ($self, $content, $filename, $variant) = @_; + my $order = $self->order; my @errors; # copy file to webdav folder @@ -2322,21 +2350,22 @@ sub store_pdf_to_webdav_and_filemanagement { $webdav_file->store(data => \$content); 1; } or do { - push @errors, t8('Storing PDF to webdav folder failed: #1', $@); + push @errors, t8('Storing the document to the WebDAV folder failed: #1', $@); }; } if ($order->id && $::instance_conf->get_doc_storage) { eval { SL::File->save(object_id => $order->id, object_type => $order->type, - mime_type => 'application/pdf', + mime_type => SL::MIME->mime_type_from_ext($filename), source => 'created', file_type => 'document', file_name => $filename, - file_contents => $content); + file_contents => $content, + print_variant => $variant); 1; } or do { - push @errors, t8('Storing PDF in storage backend failed: #1', $@); + push @errors, t8('Storing the document in the storage backend failed: #1', $@); }; }