Zeiterfassung: Konvertierung: von-bis-Filter benutzt Datum statt End-Zeit.
[kivitendo-erp.git] / SL / DB / DeliveryOrder.pm
index 039310b..6068b13 100644 (file)
@@ -185,19 +185,6 @@ sub new_from_time_recordings {
   croak("Unsupported object type in sources")                                      if any { ref($_) ne 'SL::DB::TimeRecording' }            @$sources;
   croak("Cannot create delivery order from source records of different customers") if any { $_->customer_id != $sources->[0]->customer_id } @$sources;
 
-  my %args = (
-    is_sales    => 1,
-    delivered   => 0,
-    customer_id => $sources->[0]->customer_id,
-    taxzone_id  => $sources->[0]->customer->taxzone_id,
-    currency_id => $sources->[0]->customer->currency_id,
-    employee_id => SL::DB::Manager::Employee->current->id,
-    salesman_id => SL::DB::Manager::Employee->current->id,
-    items       => [],
-  );
-  my $delivery_order = $class->new(%args);
-  $delivery_order->assign_attributes(%{ $params{attributes} }) if $params{attributes};
-
   # - one item per part (article)
   # - qty is sum of duration
   # - description goes to item longdescription
@@ -207,9 +194,9 @@ sub new_from_time_recordings {
   #  - merge same descriptions (todo)
   #
 
-  ### config
-  my $default_partnummer = 6;
-  my $default_part_id    = SL::DB::Manager::Part->find_by(partnumber => $default_partnummer)->id;
+  my $default_part_id = $params{default_part_id}    ? $params{default_part_id}
+                      : $params{default_partnumber} ? SL::DB::Manager::Part->find_by(partnumber => $params{default_partnumber})->id
+                      : undef;
 
   # check parts and collect entries
   my %part_by_part_id;
@@ -226,18 +213,21 @@ sub new_from_time_recordings {
       die 'article unit must be time based for entry "' . $source->displayable_times . '"' if !$part_by_part_id{$part_id}->unit_obj->is_time_based;
     }
 
-    my $date = $source->start_time->to_kivitendo;
-    $entries->{$part_id}->{$date}->{duration} += $source->{rounding}
+    my $date = $source->date->to_kivitendo;
+    $entries->{$part_id}->{$date}->{duration} += $params{rounding}
                                                ? nhimult(0.25, ($source->duration_in_hours))
                                                : _round_total($source->duration_in_hours);
     # add content if not already in description
-    my $new_description = $source->description_as_stripped_html;
+    my $new_description = '' . $source->description_as_stripped_html;
+    $entries->{$part_id}->{$date}->{content} ||= '';
     $entries->{$part_id}->{$date}->{content}  .= '<li>' . $new_description . '</li>'
       unless $entries->{$part_id}->{$date}->{content} =~ m/\Q$new_description/;
 
-    $entries->{$part_id}->{$date}->{date_obj}  = $source->start_time; # for sorting
+    $entries->{$part_id}->{$date}->{date_obj}  = $source->start_time || $source->date; # for sorting
   }
 
+  my @items;
+
   my $h_unit = SL::DB::Manager::Unit->find_h_unit;
 
   my @keys = sort { $part_by_part_id{$a}->partnumber cmp $part_by_part_id{$b}->partnumber } keys %$entries;
@@ -260,12 +250,45 @@ sub new_from_time_recordings {
       parts_id        => $part_by_part_id{$key}->id,
       description     => $part_by_part_id{$key}->description,
       qty             => $qty,
+      base_qty        => $qty,
       unit_obj        => $h_unit,
       sellprice       => $part_by_part_id{$key}->sellprice,
       longdescription => $longdescription,
     );
 
-    $delivery_order->add_items($item);
+    push @items, $item;
+  }
+
+  my $delivery_order;
+
+  if ($params{related_order}) {
+    # collect suitable items in related order
+    my @items_to_use;
+    foreach my $item (@items) {
+      my $item_to_use = first {$item->parts_id == $_->parts_id} @{ $params{related_order}->items_sorted };
+
+      die "no suitable item found in related order" if !$item_to_use;
+
+      my %new_attributes;
+      $new_attributes{$_} = $item->$_ for qw(qty unit_obj longdescription);
+      $item_to_use->assign_attributes(%new_attributes);
+      push @items_to_use, $item_to_use;
+    }
+    $delivery_order = SL::DB::DeliveryOrder->new_from($params{related_order}, items => \@items_to_use, %params);
+
+  } else {
+    my %args = (
+      is_sales    => 1,
+      delivered   => 0,
+      customer_id => $sources->[0]->customer_id,
+      taxzone_id  => $sources->[0]->customer->taxzone_id,
+      currency_id => $sources->[0]->customer->currency_id,
+      employee_id => SL::DB::Manager::Employee->current->id,
+      salesman_id => SL::DB::Manager::Employee->current->id,
+      items       => \@items,
+    );
+    $delivery_order = $class->new(%args);
+    $delivery_order->assign_attributes(%{ $params{attributes} }) if $params{attributes};
   }
 
   return $delivery_order;