]> wagnertech.de Git - mfinanz.git/blobdiff - SL/DB/Invoice.pm
SL::DB::{DeliveryOrder,Invoice}->new_from: custom_variables der Items mit clonen
[mfinanz.git] / SL / DB / Invoice.pm
index 72844b4dbc0c25380160855d85d715a5f7bfec22..8c6965fc4a77e0d3b11d9bc31e364b55d81af485 100644 (file)
@@ -7,7 +7,8 @@ use strict;
 
 use Carp;
 use List::Util qw(first);
-use List::MoreUtils qw(pairwise);
+
+use Rose::DB::Object::Helpers ();
 
 use SL::DB::MetaSetup::Invoice;
 use SL::DB::Manager::Invoice;
@@ -16,7 +17,6 @@ use SL::DB::Helper::LinkedRecords;
 use SL::DB::Helper::PriceTaxCalculator;
 use SL::DB::Helper::PriceUpdater;
 use SL::DB::Helper::TransNumberGenerator;
-use SL::DB::CustomVariable;
 
 __PACKAGE__->meta->add_relationship(
   invoiceitems => {
@@ -38,6 +38,12 @@ __PACKAGE__->meta->add_relationship(
     column_map      => { id => 'ar_id' },
     manager_args    => { with_objects => [ 'sepa_export' ] }
   },
+  custom_shipto     => {
+    type            => 'one to one',
+    class           => 'SL::DB::Shipto',
+    column_map      => { id => 'trans_id' },
+    query_args      => [ module => 'AR' ],
+  },
 );
 
 __PACKAGE__->meta->initialize;
@@ -107,6 +113,15 @@ sub closed {
   return $self->paid >= $self->amount;
 }
 
+sub _clone_orderitem_delivery_order_item_cvar {
+  my ($cvar) = @_;
+
+  my $cloned = Rose::DB::Object::Helpers::clone_and_reset($_);
+  $cloned->sub_module('invoice');
+
+  return $cloned;
+}
+
 sub new_from {
   my ($class, $source, %params) = @_;
 
@@ -116,10 +131,18 @@ sub new_from {
   require SL::DB::Employee;
 
   my $terms = $source->can('payment_id') && $source->payment_id ? $source->payment_terms->terms_netto : 0;
+  my (@columns, @item_columns);
+
+  if (ref($source) eq 'SL::DB::Order') {
+    @columns      = qw(quonumber payment_id delivery_customer_id delivery_vendor_id);
+    @item_columns = qw(subtotal);
 
-  my %args = ( map({ ( $_ => $source->$_ ) } qw(customer_id taxincluded shippingpoint shipvia notes intnotes salesman_id cusordnumber ordnumber quonumber
-                                                department_id cp_id language_id payment_id delivery_customer_id delivery_vendor_id taxzone_id shipto_id
-                                                globalproject_id transaction_description currency_id delivery_term_id)),
+  } else {
+    @columns      = qw(donumber);
+  }
+
+  my %args = ( map({ ( $_ => $source->$_ ) } qw(customer_id taxincluded shippingpoint shipvia notes intnotes salesman_id cusordnumber ordnumber department_id
+                                                cp_id language_id taxzone_id shipto_id globalproject_id transaction_description currency_id delivery_term_id), @columns),
                transdate   => DateTime->today_local,
                gldate      => DateTime->today_local,
                duedate     => DateTime->today_local->add(days => $terms * 1),
@@ -140,22 +163,18 @@ sub new_from {
   my $invoice = $class->new(%args, %params);
 
   my @items = map {
-    my $source_item = $_;
+    my $source_item      = $_;
+    my @custom_variables = map { _clone_orderitem_delivery_order_item_cvar($_) } @{ $source_item->custom_variables };
+
     SL::DB::InvoiceItem->new(map({ ( $_ => $source_item->$_ ) }
-                                 qw(parts_id description qty sellprice discount project_id
-                                    serialnumber pricegroup_id ordnumber transdate cusordnumber unit
-                                    base_qty subtotal longdescription lastcost price_factor_id)),
-                            deliverydate => $source_item->reqdate,
-                            fxsellprice  => $source_item->sellprice,);
-  } @{ $source->items_sorted };
+                                 qw(parts_id description qty sellprice discount project_id serialnumber pricegroup_id ordnumber transdate cusordnumber unit
+                                    base_qty longdescription lastcost price_factor_id), @item_columns),
+                             deliverydate     => $source_item->reqdate,
+                             fxsellprice      => $source_item->sellprice,
+                             custom_variables => \@custom_variables,
+                           );
 
-  my $i = 0;
-  foreach my $item (@items) {
-    my $source_cvars = $source->items_sorted->[$i]->cvars_by_config;
-    my $target_cvars = $item->cvars_by_config;
-    pairwise { $a->value($b->value) } @{ $target_cvars }, @{ $source_cvars };
-    $i++;
-  }
+  } @{ $source->items_sorted };
 
   $invoice->invoiceitems(\@items);