- my $msg = t8('Number of delivery orders created:');
- $msg .= ' ';
- $msg .= scalar @donumbers;
- $msg .= ' (';
- $msg .= join ', ', @donumbers;
- $msg .= ').';
- # die if errors exists
- if (@{ $self->{job_errors} }) {
- $msg .= ' ' . t8('The following errors occurred:');
- $msg .= ' ';
- $msg .= join "\n", @{ $self->{job_errors} };
- die $msg . "\n";
+ return @donumbers;
+}
+
+sub convert_with_linking {
+ my ($self, $time_recordings_by_order_id, $orders_by_order_id) = @_;
+
+ my %convert_params = (
+ rounding => $self->params->{rounding},
+ override_part_id => $self->params->{override_part_id},
+ default_part_id => $self->params->{default_part_id},
+ );
+
+ my @donumbers;
+ foreach my $related_order_id (keys %$time_recordings_by_order_id) {
+ my $related_order = $orders_by_order_id->{$related_order_id};
+ my $do;
+ if (!eval {
+ $do = SL::DB::DeliveryOrder->new_from_time_recordings($time_recordings_by_order_id->{$related_order_id}, related_order => $related_order, %convert_params);
+ 1;
+ }) {
+ $self->log_error("creating delivery order failed ($@) for time recording ids " . join ', ', map { $_->id } @{$time_recordings_by_order_id->{$related_order_id}});
+ }
+
+ if ($do) {
+ if (!SL::DB->client->with_transaction(sub {
+ $do->save;
+ $_->update_attributes(booked => 1) for @{$time_recordings_by_order_id->{$related_order_id}};
+
+ $related_order->link_to_record($do);
+
+ # TODO extend link_to_record for items, otherwise long-term no d.r.y.
+ foreach my $item (@{ $do->items }) {
+ foreach (qw(orderitems)) {
+ if ($item->{"converted_from_${_}_id"}) {
+ die unless $item->{id};
+ RecordLinks->create_links('mode' => 'ids',
+ 'from_table' => $_,
+ 'from_ids' => $item->{"converted_from_${_}_id"},
+ 'to_table' => 'delivery_order_items',
+ 'to_id' => $item->{id},
+ ) || die;
+ delete $item->{"converted_from_${_}_id"};
+ }
+ }
+ }
+
+ # update delivered and item's ship for related order
+ my $helper = SL::Helper::ShippedQty->new->calculate($related_order)->write_to_objects;
+ $related_order->delivered($related_order->{delivered});
+ $_->ship($_->{shipped_qty}) for @{$related_order->items};
+ $related_order->save(cascade => 1);
+
+ 1;
+ })) {
+ $self->log_error('saving delivery order failed for time recording ids ' . join ', ', map { $_->id } @{$time_recordings_by_order_id->{$related_order_id}});
+
+ } else {
+ push @donumbers, $do->donumber;
+ }
+ }