$terms = $source->customer->payment_terms if !defined $terms && $source->customer;
my %args = ( map({ ( $_ => $source->$_ ) } qw(customer_id taxincluded shippingpoint shipvia notes intnotes salesman_id cusordnumber ordnumber department_id
+ shipto_id
cp_id language_id taxzone_id globalproject_id transaction_description currency_id delivery_term_id), @columns),
transdate => DateTime->today_local,
gldate => DateTime->today_local,
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;
}
- my $worker = sub {
+ if (!$self->db->with_transaction(sub {
my %data = $self->calculate_prices_and_taxes;
$self->_post_create_assemblyitem_entries($data{assembly_items});
$self->_post_update_allocated($data{allocated});
$self->_post_book_rounding($data{rounding});
- };
- if ($self->db->in_transaction) {
- $worker->();
- } elsif (!$self->db->do_transaction($worker)) {
+ 1;
+ })) {
$::lxdebug->message(LXDebug->WARN(), "convert_to_invoice failed: " . join("\n", (split(/\n/, $self->db->error))[0..2]));
return undef;
}
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