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;
}
$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) {
}
}
+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 ) = @_;
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 = [];
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