__PACKAGE__->meta->make_attr_helpers(taxamount => 'numeric(15,5)');
+sub closed {
+ my ($self) = @_;
+ return $self->paid >= $self->amount;
+}
+
+sub post {
+ my ($self, %params) = @_;
+
+ $self->db->do_transaction(sub {
+ 1; # dummy instruction for Emacs ;)
+
+ my %data = $self->calculate_prices_and_taxes;
+
+ $self->_post_create_assemblyitem_entries($data{assembly_items});
+
+ $self->save;
+
+ $self->_post_add_acctrans($data{amounts_cogs});
+ $self->_post_add_acctrans($data{amounts});
+ $self->_post_add_acctrans($data{taxes});
+
+ $self->_post_update_allocated($data{allocated});
+
+ die;
+ });
+}
+
+sub _post_add_acctrans {
+ my ($self, $entries) = @_;
+
+ while (my ($chart_id, $spec) = each %{ $entries }) {
+ $spec = { taxkey => 0, amount => $spec } unless ref $spec;
+ SL::DB::AccTrans->new(trans_id => $self->id,
+ chart_id => $chart_id,
+ amount => $spec->{amount},
+ taxkey => $spec->{taxkey},
+ project_id => $self->project_id,
+ transdate => $self->transdate)->save;
+ }
+}
+
+sub _post_create_assemblyitem_entries {
+ my ($self, $assembly_entries) = @_;
+
+ my $items = $self->invoiceitems;
+ my @new_items;
+
+ my $item_idx = 0;
+ foreach my $item (@{ $items }) {
+ next if $item->assemblyitem;
+
+ push @new_items, $item;
+ $item_idx++;
+
+ foreach my $assembly_item (@{ $assembly_entries->[$item_idx] || [ ] }) {
+ push @new_items, SL::DB::InvoiceItem->new(parts_id => $assembly_item->{part},
+ description => $assembly_item->{part}->description,
+ unit => $assembly_item->{part}->unit,
+ qty => $assembly_item->{qty},
+ allocated => $assembly_item->{allocated},
+ sellprice => 0,
+ fxsellprice => 0,
+ assemblyitem => 't');
+ }
+ }
+
+ $self->invoiceitems(\@new_items);
+}
+
+sub _post_update_allocated {
+ my ($self, $allocated) = @_;
+
+ while (my ($invoice_id, $diff) = each %{ $allocated }) {
+ SL::DB::Manager::InvoiceItem->update_all(set => { allocated => { sql => [ 'allocated + ?', $diff ] } },
+ where => [ id => $invoice_id ]);
+ }
+}
+
+>>>>>>> b6be290... Prototypisiertes Buchen von Rechnungen
1;