From: Jan Büren Date: Tue, 24 Feb 2015 13:12:34 +0000 (+0100) Subject: Verknüpfung von Einzelpositionen auch bei periodisch erzeugten Rechnungen (Auftrag... X-Git-Tag: release-3.2.0~14 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=34420ddb07d6ebea006aa96f131aaa050a7037bc;p=kivitendo-erp.git Verknüpfung von Einzelpositionen auch bei periodisch erzeugten Rechnungen (Auftrag -> Rechnung) Für InvoiceItem in Invoice ein converted_from_*_id hinzugefügt wie bei der Verknüpfung von Auftrag zu Rechnung, bzw. Lieferschein zu Rechnung. Letzterer Weg wird aktuell bei Objekten noch nicht benutzt. Ferner einen Rückgabewert von create_links (RecordLinks) etwas verbessert (undef bei nicht erfolgtem Anlegen). Offen: Implementierung der Verknüpfung von DeliveryOrderItem-Objekten mit InvoiceItem-Objekten. Diese werden aktuell nicht benutzt und betrifft auch nicht periodische Rechnungen. --- diff --git a/SL/BackgroundJob/CreatePeriodicInvoices.pm b/SL/BackgroundJob/CreatePeriodicInvoices.pm index ce8957770..5055083ac 100644 --- a/SL/BackgroundJob/CreatePeriodicInvoices.pm +++ b/SL/BackgroundJob/CreatePeriodicInvoices.pm @@ -143,6 +143,8 @@ sub _replace_vars { } sub _create_periodic_invoice { + $main::lxdebug->enter_sub(); + my $self = shift; my $config = shift; my $period_start_date = shift; @@ -188,6 +190,21 @@ sub _create_periodic_invoice { $order->link_to_record($invoice); + foreach my $item (@{ $invoice->items }) { + foreach (qw(orderitems)) { # expand if needed (delivery_order_items) + if ($item->{"converted_from_${_}_id"}) { + die unless $item->{id}; + RecordLinks->create_links('mode' => 'ids', + 'from_table' => $_, + 'from_ids' => $item->{"converted_from_${_}_id"}, + 'to_table' => 'invoice', + 'to_id' => $item->{id}, + ) || die; + delete $item->{"converted_from_${_}_id"}; + } + } + } + SL::DB::PeriodicInvoice->new(config_id => $config->id, ar_id => $invoice->id, period_start_date => $period_start_date) @@ -198,7 +215,7 @@ sub _create_periodic_invoice { $::lxdebug->message(LXDebug->WARN(), "_create_invoice failed: " . join("\n", (split(/\n/, $self->{db_obj}->db->error))[0..2])); return undef; } - + $main::lxdebug->leave_sub(); return $invoice; } diff --git a/SL/DB/Helper/LinkedRecords.pm b/SL/DB/Helper/LinkedRecords.pm index bb21ecf27..115198124 100644 --- a/SL/DB/Helper/LinkedRecords.pm +++ b/SL/DB/Helper/LinkedRecords.pm @@ -384,7 +384,7 @@ array reference. Examples: If you only need invoices created directly from an order C<$order> (no -delivery orders inbetween) then the call could look like this: +delivery orders in between) then the call could look like this: my $invoices = $order->linked_records( direction => 'to', diff --git a/SL/DB/Invoice.pm b/SL/DB/Invoice.pm index e8b49c46f..a64ef2fb3 100644 --- a/SL/DB/Invoice.pm +++ b/SL/DB/Invoice.pm @@ -193,17 +193,20 @@ sub new_from { $item_parents{$source_item_id} ||= $source_item->$item_parent_column; my $item_parent = $item_parents{$source_item_id}; - - SL::DB::InvoiceItem->new(map({ ( $_ => $source_item->$_ ) } - qw(parts_id description qty sellprice discount project_id serialnumber pricegroup_id transdate cusordnumber unit - base_qty longdescription lastcost price_factor_id active_discount_source active_price_source), @item_columns), - deliverydate => $source_item->reqdate, - fxsellprice => $source_item->sellprice, - custom_variables => \@custom_variables, - ordnumber => ref($item_parent) eq 'SL::DB::Order' ? $item_parent->ordnumber : $source_item->ordnumber, - donumber => ref($item_parent) eq 'SL::DB::DeliveryOrder' ? $item_parent->donumber : $source_item->can('donumber') ? $source_item->donumber : '', - ); - + my $current_invoice_item = + SL::DB::InvoiceItem->new(map({ ( $_ => $source_item->$_ ) } + qw(parts_id description qty sellprice discount project_id serialnumber pricegroup_id transdate cusordnumber unit + base_qty longdescription lastcost price_factor_id active_discount_source active_price_source), @item_columns), + deliverydate => $source_item->reqdate, + fxsellprice => $source_item->sellprice, + custom_variables => \@custom_variables, + ordnumber => ref($item_parent) eq 'SL::DB::Order' ? $item_parent->ordnumber : $source_item->ordnumber, + donumber => ref($item_parent) eq 'SL::DB::DeliveryOrder' ? $item_parent->donumber : $source_item->can('donumber') ? $source_item->donumber : '', + ); + + $current_invoice_item->{"converted_from_orderitems_id"} = $_->{id} if ref($item_parent) eq 'SL::DB::Order'; + $current_invoice_item->{"converted_from_delivery_order_items_id"} = $_->{id} if ref($item_parent) eq 'SL::DB::DeliveryOrder'; + $current_invoice_item; } @{ $items }; @items = grep { $_->qty * 1 } @items if $params{skip_items_zero_qty}; diff --git a/SL/RecordLinks.pm b/SL/RecordLinks.pm index 77086ba70..0bd62fa31 100644 --- a/SL/RecordLinks.pm +++ b/SL/RecordLinks.pm @@ -48,7 +48,7 @@ sub create_links { if (!scalar @links) { $main::lxdebug->leave_sub(); - return; + return undef; } my $myconfig = \%main::myconfig;