Bug #199 - Kundenrabatt in Einkaufsrechnungspositionen
[kivitendo-erp.git] / SL / DB / Invoice.pm
index 9aa17ad..121f765 100644 (file)
@@ -240,9 +240,14 @@ sub post {
 
   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];
+    my $chart;
+    if ($::instance_conf->get_ar_chart_id) {
+      $chart = SL::DB::Manager::Chart->find_by(id => $::instance_conf->get_ar_chart_id);
+    } else {
+      $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;
     $params{ar_id} = $chart->id;
   }
@@ -260,6 +265,8 @@ sub post {
     $self->_post_add_acctrans({ $params{ar_id} => $self->amount * -1 });
 
     $self->_post_update_allocated($data{allocated});
+
+    $self->_post_book_rounding($data{rounding});
   };
 
   if ($self->db->in_transaction) {
@@ -296,6 +303,26 @@ sub _post_add_acctrans {
   }
 }
 
+sub _post_book_rounding {
+  my ($self, $rounding) = @_;
+
+  my $tax_id = SL::DB::Manager::Tax->find_by(taxkey => 0)->id;
+  my $rnd_accno = $rounding == 0 ? 0
+                : $rounding > 0  ? SL::DB::Default->get->rndgain_accno_id
+                :                  SL::DB::Default->get->rndloss_accno_id
+  ;
+  if ($rnd_accno != 0) {
+    SL::DB::AccTransaction->new(trans_id   => $self->id,
+                                chart_id   => $rnd_accno,
+                                amount     => $rounding,
+                                tax_id     => $tax_id,
+                                taxkey     => 0,
+                                project_id => $self->globalproject_id,
+                                transdate  => $self->transdate,
+                                chart_link => $rnd_accno)->save;
+  }
+}
+
 sub add_ar_amount_row {
   my ($self, %params ) = @_;
 
@@ -303,7 +330,7 @@ sub add_ar_amount_row {
   die "not an ar invoice" if $self->invoice and not $self->customer_id;
 
   die "add_ar_amount_row needs a chart object as chart param" unless $params{chart} && $params{chart}->isa('SL::DB::Chart');
-  die unless $params{chart}->link =~ /AR_amount/;
+  die "chart must be an AR_amount chart" unless $params{chart}->link =~ /AR_amount/;
 
   my $acc_trans = [];
 
@@ -673,6 +700,11 @@ active.
 
 See L<SL::DB::Object::basic_info>.
 
+=item C<closed>
+
+Returns 1 or 0, depending on whether the invoice is closed or not. Currently
+invoices that are overpaid also count as closed.
+
 =item C<recalculate_amounts %params>
 
 Calculate and set amount and netamount from acc_trans objects by summing up the