+ $data->{amounts}->{ $chart->id } ||= { taxkey => $taxkey->taxkey_id, tax_id => $taxkey->tax_id, amount => 0 };
+ $data->{amounts}->{ $chart->id }->{amount} += $linetotal;
+
+ push @{ $data->{assembly_items} }, [];
+ if ($item->part->is_assembly) {
+ _calculate_assembly_item($self, $data, $item->part, $item->base_qty, $item->unit_obj->convert_to(1, $item->part->unit_obj));
+ } elsif ($item->part->is_part) {
+ if ($data->{is_invoice}) {
+ $item->allocated(_calculate_part_item($self, $data, $item->part, $item->base_qty, $item->unit_obj->convert_to(1, $item->part->unit_obj)));
+ }
+ }
+
+ $data->{last_incex_chart_id} = $chart->id if $data->{is_sales};
+
+ _dbg("CALCULATE! ${idx} i.qty " . $item->qty . " i.sellprice " . $item->sellprice . " sellprice $sellprice num_dec $num_dec taxamount $tax_amount " .
+ "i.linetotal $linetotal netamount " . $self->netamount . " marge_total " . $item->marge_total . " marge_percent " . $item->marge_percent);
+}
+
+sub _calculate_amounts {
+ my ($self, $data, %params) = @_;
+
+ my $tax_diff = 0;
+ foreach my $chart_id (keys %{ $data->{taxes} }) {
+ my $rounded = _round($data->{taxes}->{$chart_id} * $data->{exchangerate}, 2);
+ $tax_diff += $data->{taxes}->{$chart_id} * $data->{exchangerate} - $rounded if $self->taxincluded;
+ $data->{taxes}->{$chart_id} = $rounded;
+ }
+
+ my $amount = _round(($self->netamount + $tax_diff) * $data->{exchangerate}, 2);
+ my $diff = $amount - ($self->netamount + $tax_diff) * $data->{exchangerate};
+ my $netamount = $amount;
+
+ if ($self->taxincluded) {
+ $data->{invoicediff} += $diff;
+ $data->{amounts}->{ $data->{last_incex_chart_id} }->{amount} += $data->{invoicediff} if $data->{last_incex_chart_id};
+ }
+
+ _dbg("Sna " . $self->netamount . " idiff " . $data->{invoicediff} . " tdiff ${tax_diff}");
+
+ my $tax = sum values %{ $data->{taxes} };
+ $data->{arap_amount} = $netamount + $tax;
+
+ $self->netamount( $netamount);
+ $self->amount( $netamount + $tax);
+ $self->marge_percent($self->netamount ? ($self->netamount - $data->{lastcost_total}) * 100 / $self->netamount : 0);
+}
+
+sub _calculate_assembly_item {
+ my ($self, $data, $part, $total_qty, $base_factor) = @_;