Revision dce860e3
Von Moritz Bunkus vor etwa 14 Jahren hinzugefügt
SL/DB/Invoice.pm | ||
---|---|---|
|
||
__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;
|
Auch abrufbar als: Unified diff
Prototypisiertes Buchen von Rechnungen
Conflicts: