# - ordered and summed by date
# - each description goes to an ordered list
# - (as time recording descriptions are formatted text by now, use stripped text)
- # - merge same descriptions (todo)
+ # - merge same descriptions
#
- 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;
+ 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;
+ my $override_part_id = $params{override_part_id} ? $params{override_part_id}
+ : $params{override_partnumber} ? SL::DB::Manager::Part->find_by(partnumber => $params{override_partnumber})->id
+ : undef;
# check parts and collect entries
my %part_by_part_id;
foreach my $source (@$sources) {
next if !$source->duration;
- my $part_id = $source->part_id ? $source->part_id
- : $default_part_id ? $default_part_id
- : undef;
+ my $part_id = $override_part_id;
+ $part_id ||= $source->part_id;
+ $part_id ||= $default_part_id;
die 'article not found for entry "' . $source->displayable_times . '"' if !$part_id;
given as C<$sources>. All time recording entries must belong to the same
customer. Time recordings are sorted by article and date. For each article
a new delivery order item is created. If no article is associated with an
-entry, a default article will be used (hard coded).
+entry, a default article will be used. The article given in the time
+recording entry can be overriden.
Entries of the same date (for each article) are summed together and form a
list entry in the long description of the item.
An optional hash reference. If it exists then it is used to set
attributes of the newly created delivery order object.
+=item C<default_part_id>
+
+An optional part id which is used as default value if no part is set
+in the time recording entry.
+
+=item C<default_partnumber>
+
+Like C<default_part_id> but given as partnumber, not as id.
+
+=item C<override_part_id>
+
+An optional part id which is used instead of a value set in the time
+recording entry.
+
+=item C<override_partnumber>
+
+Like C<overrride_part_id> but given as partnumber, not as id.
+
+=item C<related_order>
+
+An optional C<SL::DB::Order> object. If it exists then it is used to
+generate the delivery order from that via C<new_from>.
+The generated items are created from a suitable item of the related
+order. If no suitable item is found, an exception is thrown.
+
+=item C<rounding>
+
+An optional boolean value. If truish, then the durations of the time entries
+are rounded up to the full quarters of an hour.
+
=back
=item C<sales_order>