Typos und in SL/DB/Invoice.pm
[kivitendo-erp.git] / SL / DB / Invoice.pm
index 065d2b3..70291ad 100644 (file)
@@ -39,6 +39,12 @@ __PACKAGE__->meta->add_relationship(
     column_map      => { id => 'ar_id' },
     manager_args    => { with_objects => [ 'sepa_export' ] }
   },
     column_map      => { id => 'ar_id' },
     manager_args    => { with_objects => [ 'sepa_export' ] }
   },
+  sepa_exports      => {
+    type            => 'many to many',
+    map_class       => 'SL::DB::SepaExportItem',
+    map_from        => 'ar',
+    map_to          => 'sepa_export',
+  },
   custom_shipto     => {
     type            => 'one to one',
     class           => 'SL::DB::Shipto',
   custom_shipto     => {
     type            => 'one to one',
     class           => 'SL::DB::Shipto',
@@ -77,6 +83,7 @@ sub _before_save_set_invnumber {
 
 sub items { goto &invoiceitems; }
 sub add_items { goto &add_invoiceitems; }
 
 sub items { goto &invoiceitems; }
 sub add_items { goto &add_invoiceitems; }
+sub record_number { goto &invnumber; };
 
 sub is_sales {
   # For compatibility with Order, DeliveryOrder
 
 sub is_sales {
   # For compatibility with Order, DeliveryOrder
@@ -138,14 +145,10 @@ sub new_from {
 
   require SL::DB::Employee;
 
 
   require SL::DB::Employee;
 
-  my $terms = $source->can('payment_id') && $source->payment_id ? $source->payment_terms
-            : $source->customer_id                              ? $source ->customer->payment_terms
-            :                                                     undef;
-
   my (@columns, @item_columns, $item_parent_id_column, $item_parent_column);
 
   if (ref($source) eq 'SL::DB::Order') {
   my (@columns, @item_columns, $item_parent_id_column, $item_parent_column);
 
   if (ref($source) eq 'SL::DB::Order') {
-    @columns      = qw(quonumber payment_id delivery_customer_id delivery_vendor_id);
+    @columns      = qw(quonumber delivery_customer_id delivery_vendor_id);
     @item_columns = qw(subtotal);
 
     $item_parent_id_column = 'trans_id';
     @item_columns = qw(subtotal);
 
     $item_parent_id_column = 'trans_id';
@@ -158,12 +161,13 @@ sub new_from {
     $item_parent_column    = 'delivery_order';
   }
 
     $item_parent_column    = 'delivery_order';
   }
 
+  my $terms = $source->can('payment_id') ? $source->payment_terms : undef;
+
   my %args = ( map({ ( $_ => $source->$_ ) } qw(customer_id taxincluded shippingpoint shipvia notes intnotes salesman_id cusordnumber ordnumber department_id
   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),
+                                                cp_id language_id taxzone_id shipto_id globalproject_id transaction_description currency_id delivery_term_id payment_id), @columns),
                transdate   => DateTime->today_local,
                gldate      => DateTime->today_local,
                transdate   => DateTime->today_local,
                gldate      => DateTime->today_local,
-               duedate     => DateTime->today_local->add(days => ($terms ? $terms->terms_netto * 1 : 1)),
-               payment_id  => $terms ? $terms->id : undef,
+               duedate     => $terms ? $terms->calc_date(reference_date => DateTime->today_local) : DateTime->today_local,
                invoice     => 1,
                type        => 'invoice',
                storno      => 0,
                invoice     => 1,
                type        => 'invoice',
                storno      => 0,
@@ -206,6 +210,7 @@ sub new_from {
     $current_invoice_item;
   } @{ $items };
 
     $current_invoice_item;
   } @{ $items };
 
+  @items = grep { $params{item_filter}->($_) } @items if $params{item_filter};
   @items = grep { $_->qty * 1 } @items if $params{skip_items_zero_qty};
   @items = grep { $_->qty >=0 } @items if $params{skip_items_negative_qty};
 
   @items = grep { $_->qty * 1 } @items if $params{skip_items_zero_qty};
   @items = grep { $_->qty >=0 } @items if $params{skip_items_negative_qty};
 
@@ -217,12 +222,14 @@ sub new_from {
 sub post {
   my ($self, %params) = @_;
 
 sub post {
   my ($self, %params) = @_;
 
+  die "not an invoice" unless $self->invoice;
+
   require SL::DB::Chart;
   if (!$params{ar_id}) {
     my $chart = SL::DB::Manager::Chart->get_all(query   => [ SL::DB::Manager::Chart->link_filter('AR') ],
                                                 sort_by => 'id ASC',
                                                 limit   => 1)->[0];
   require SL::DB::Chart;
   if (!$params{ar_id}) {
     my $chart = SL::DB::Manager::Chart->get_all(query   => [ SL::DB::Manager::Chart->link_filter('AR') ],
                                                 sort_by => 'id ASC',
                                                 limit   => 1)->[0];
-    croak("No AR chart found and no parameter `ar_id' given") unless $chart;
+    croak("No AR chart found and no parameter 'ar_id' given") unless $chart;
     $params{ar_id} = $chart->id;
   }
 
     $params{ar_id} = $chart->id;
   }
 
@@ -338,6 +345,10 @@ sub displayable_type {
   return t8('Invoice');
 }
 
   return t8('Invoice');
 }
 
+sub displayable_name {
+  join ' ', grep $_, map $_[0]->$_, qw(displayable_type record_number);
+};
+
 sub abbreviation {
   my ($self) = @_;
 
 sub abbreviation {
   my ($self) = @_;
 
@@ -376,6 +387,8 @@ __END__
 
 =pod
 
 
 =pod
 
+=encoding UTF-8
+
 =head1 NAME
 
 SL::DB::Invoice: Rose model for invoices (table "ar")
 =head1 NAME
 
 SL::DB::Invoice: Rose model for invoices (table "ar")
@@ -414,11 +427,22 @@ a quantity of 0 are not affected by this option.
 
 If trueish then items with a quantity of 0 are skipped.
 
 
 If trueish then items with a quantity of 0 are skipped.
 
+=item C<item_filter>
+
+An optional code reference that is called for each item with the item
+as its sole parameter. Items for which the code reference returns a
+falsish value will be skipped.
+
 =item C<attributes>
 
 An optional hash reference. If it exists then it is passed to C<new>
 =item C<attributes>
 
 An optional hash reference. If it exists then it is passed to C<new>
-allowing the caller to set certain attributes for the new delivery
-order.
+allowing the caller to set certain attributes for the new invoice.
+For example to set a different transdate (default is the current date),
+call the method like this:
+
+   my %params;
+   $params{attributes}{transdate} = '28.08.2015';
+   $invoice = SL::DB::Invoice->new_from($self, %params)->post || die;
 
 =back
 
 
 =back
 
@@ -436,7 +460,7 @@ Posts the invoice. Required parameters are:
 
 =item * C<ar_id>
 
 
 =item * C<ar_id>
 
-The ID of the accounds receivable chart the invoices amounts are
+The ID of the accounts receivable chart the invoice's amounts are
 posted to. If it is not set then the first chart configured for
 accounts receivables is used.
 
 posted to. If it is not set then the first chart configured for
 accounts receivables is used.
 
@@ -462,7 +486,7 @@ the part's buchungsgruppen.
 and recorded in C<acc_trans>.
 
 =item 6. Items in C<invoice> are updated according to their allocation
 and recorded in C<acc_trans>.
 
 =item 6. Items in C<invoice> are updated according to their allocation
-status (regarding for costs of goold sold). Will only be done if
+status (regarding costs of goods sold). Will only be done if
 kivitendo is not configured to use Einnahmenüberschussrechnungen.
 
 =item 7. The invoice and its items are saved.
 kivitendo is not configured to use Einnahmenüberschussrechnungen.
 
 =item 7. The invoice and its items are saved.
@@ -471,7 +495,7 @@ kivitendo is not configured to use Einnahmenüberschussrechnungen.
 
 Returns C<$self> on success and C<undef> on failure. The whole process
 is run inside a transaction. If it fails then nothing is saved to or
 
 Returns C<$self> on success and C<undef> on failure. The whole process
 is run inside a transaction. If it fails then nothing is saved to or
-changed in the database. A new transaction is only started if none is
+changed in the database. A new transaction is only started if none are
 active.
 
 =item C<basic_info $field>
 active.
 
 =item C<basic_info $field>
@@ -480,6 +504,17 @@ See L<SL::DB::Object::basic_info>.
 
 =back
 
 
 =back
 
+=head1 TODO
+
+ As explained in the new_from example, it is possible to set transdate to a new value.
+ From a user / programm point of view transdate is more than holy and there should be
+ some validity checker available for controller code. At least the same logic like in
+ Form.pm from ar.pl should be available:
+  # see old stuff ar.pl post
+  #$form->error($locale->text('Cannot post transaction above the maximum future booking date!'))
+  #  if ($form->date_max_future($transdate, \%myconfig));
+  #$form->error($locale->text('Cannot post transaction for a closed period!')) if ($form->date_closed($form->{"transdate"}, \%myconfig));
+
 =head1 AUTHOR
 
 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
 =head1 AUTHOR
 
 Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>