+ push @{ $data->{items} }, {
+ linetotal => $linetotal,
+ linetotal_cost => $linetotal_cost,
+ sellprice => $sellprice,
+ tax_amount => $tax_amount,
+ taxkey_id => $taxkey->id,
+ };
+
+ _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) = @_;
+
+ return 0 if $::instance_conf->get_inventory_system eq 'periodic' || !$data->{is_invoice};
+
+ foreach my $assembly_entry (@{ $part->assemblies }) {
+ push @{ $data->{assembly_items}->[-1] }, { part => $assembly_entry->part,
+ qty => $total_qty * $assembly_entry->qty,
+ allocated => 0 };
+
+ if ($assembly_entry->part->is_assembly) {
+ _calculate_assembly_item($self, $data, $assembly_entry->part, $total_qty * $assembly_entry->qty);
+ } elsif ($assembly_entry->part->is_part) {
+ my $allocated = _calculate_part_item($self, $data, $assembly_entry->part, $total_qty * $assembly_entry->qty);
+ $data->{assembly_items}->[-1]->[-1]->{allocated} = $allocated;