OrderController Einrückung/Formatierung
[kivitendo-erp.git] / SL / Controller / Order.pm
index 9c1d773..cf7ff1a 100644 (file)
@@ -22,6 +22,7 @@ use SL::DB::RecordLink;
 
 use SL::Helper::CreatePDF qw(:all);
 use SL::Helper::PrintOptions;
+use SL::Helper::ShippedQty;
 
 use SL::Controller::Helper::GetModels;
 
@@ -72,7 +73,23 @@ sub action_add {
 sub action_edit {
   my ($self) = @_;
 
-  $self->load_order;
+  if ($::form->{id}) {
+    $self->load_order;
+
+  } else {
+    # this is to edit an order from an unsaved order object
+
+    # set item ids to new fake id, to identify them as new items
+    foreach my $item (@{$self->order->items_sorted}) {
+      $item->{new_fake_id} = join('_', 'new', Time::HiRes::gettimeofday(), int rand 1000000000000);
+    }
+    # trigger rendering values for second row/longdescription as hidden,
+    # because they are loaded only on demand. So we need to keep the values
+    # from the source.
+    $_->{render_second_row}      = 1 for @{ $self->order->items_sorted };
+    $_->{render_longdescription} = 1 for @{ $self->order->items_sorted };
+  }
+
   $self->recalc();
   $self->pre_render();
   $self->render(
@@ -199,8 +216,8 @@ sub action_print {
   my $copies      = $::form->{print_options}->{copies};
   my $groupitems  = $::form->{print_options}->{groupitems};
 
-  # only pdf by now
-  if (none { $format eq $_ } qw(pdf)) {
+  # only pdf and opendocument by now
+  if (none { $format eq $_ } qw(pdf opendocument opendocument_pdf)) {
     return $self->js->flash('error', t8('Format \'#1\' is not supported yet/anymore.', $format))->render;
   }
 
@@ -370,11 +387,11 @@ sub action_send_email {
     $language = SL::DB::Language->new(id => $::form->{print_options}->{language_id})->load if $::form->{print_options}->{language_id};
 
     my $pdf;
-    my @errors = genereate_pdf($self->order, \$pdf, {media      => $::form->{media},
-                                                     format     => $::form->{print_options}->{format},
-                                                     formname   => $::form->{print_options}->{formname},
-                                                     language   => $language,
-                                                     groupitems => $::form->{print_options}->{groupitems}});
+    my @errors = generate_pdf($self->order, \$pdf, {media      => $::form->{media},
+                                                    format     => $::form->{print_options}->{format},
+                                                    formname   => $::form->{print_options}->{formname},
+                                                    language   => $language,
+                                                    groupitems => $::form->{print_options}->{groupitems}});
     if (scalar @errors) {
       return $self->js->flash('error', t8('Conversion to PDF failed: #1', $errors[0]))->render($self);
     }
@@ -1440,7 +1457,7 @@ sub pre_render {
                 show_headers       => 1,
                 no_queue           => 1,
                 no_postscript      => 1,
-                no_opendocument    => 1,
+                no_opendocument    => 0,
                 no_html            => 1},
   );
 
@@ -1450,6 +1467,11 @@ sub pre_render {
     $item->active_discount_source($price_source->discount_from_source($item->active_discount_source));
   }
 
+  if (any { $self->type eq $_ } (sales_order_type(), purchase_order_type())) {
+    # calculate shipped qtys here to prevent calling calculate for every item via the items method
+    SL::Helper::ShippedQty->new->calculate($self->order)->write_to_objects;
+  }
+
   if ($self->order->number && $::instance_conf->get_webdav) {
     my $webdav = SL::Webdav->new(
       type     => $self->type,
@@ -1569,9 +1591,17 @@ sub generate_pdf {
   $order->language($params->{language});
   $order->flatten_to_form($print_form, format_amounts => 1);
 
+  my $template_ext;
+  my $template_type;
+  if ($print_form->{format} =~ /(opendocument|oasis)/i) {
+    $template_ext  = 'odt';
+    $template_type = 'OpenDocument';
+  }
+
   # search for the template
   my ($template_file, @template_files) = SL::Helper::CreatePDF->find_template(
     name        => $print_form->{formname},
+    extension   => $template_ext,
     email       => $print_form->{media} eq 'email',
     language    => $params->{language},
     printer_id  => $print_form->{printer_id},  # todo
@@ -1588,8 +1618,10 @@ sub generate_pdf {
       $print_form->prepare_for_printing;
 
       $$pdf_ref = SL::Helper::CreatePDF->create_pdf(
-        template  => $template_file,
-        variables => $print_form,
+        format        => $print_form->{format},
+        template_type => $template_type,
+        template      => $template_file,
+        variables     => $print_form,
         variable_content_types => {
           longdescription => 'html',
           partnotes       => 'html',