From: Moritz Bunkus Date: Wed, 10 Nov 2010 15:55:14 +0000 (+0100) Subject: Umwandeln von Order-Model in neue Invoice-Instanz X-Git-Tag: release-2.6.3~61^2~7^2~1^2~2^2~67 X-Git-Url: http://wagnertech.de/git?a=commitdiff_plain;h=73df5fb5a78b7fc8576c9b7e3da47e10fc551c85;p=kivitendo-erp.git Umwandeln von Order-Model in neue Invoice-Instanz --- diff --git a/SL/DB/Invoice.pm b/SL/DB/Invoice.pm index 851731126..b93956a67 100644 --- a/SL/DB/Invoice.pm +++ b/SL/DB/Invoice.pm @@ -5,12 +5,14 @@ package SL::DB::Invoice; use strict; +use Carp; use List::Util qw(first); use SL::DB::MetaSetup::Invoice; use SL::DB::Manager::Invoice; use SL::DB::Helper::LinkedRecords; use SL::DB::Helper::PriceTaxCalculator; +use SL::DB::Employee; __PACKAGE__->meta->add_relationship( invoiceitems => { @@ -21,6 +23,11 @@ __PACKAGE__->meta->add_relationship( with_objects => [ 'part' ] } }, + payment_term => { + type => 'one to one', + class => 'SL::DB::PaymentTerm', + column_map => { payment_id => 'id' }, + }, ); __PACKAGE__->meta->initialize; @@ -66,6 +73,49 @@ sub closed { return $self->paid >= $self->amount; } +sub new_from { + my ($class, $source, %params) = @_; + + croak("Unsupported source object type '" . ref($source) . "'") unless ref($source) =~ m/^ SL::DB:: (?: Order | DeliveryOrder ) $/x; + croak("Cannot create invoices for purchase records") unless $source->customer_id; + + my $terms = $source->can('payment_id') && $source->payment_id ? $source->payment_term->terms_netto : 0; + + my %args = ( map({ ( $_ => $source->$_ ) } qw(customer_id taxincluded shippingpoint shipvia notes intnotes curr salesman_id cusordnumber ordnumber quonumber + department_id cp_id language_id payment_id delivery_customer_id delivery_vendor_id taxzone_id shipto_id + globalproject_id transaction_description)), + transdate => DateTime->today_local, + gldate => DateTime->today_local, + duedate => DateTime->today_local->add(days => $terms * 1), + invoice => 1, + type => 'invoice', + storno => 0, + employee_id => (SL::DB::Manager::Employee->current || SL::DB::Employee->new(id => $source->employee_id))->id, + ); + + if ($source->type =~ /_order$/) { + $args{deliverydate} = $source->reqdate; + $args{orddate} = $source->transdate; + } else { + $args{quodate} = $source->transdate; + } + + my $invoice = $class->new(%args, %params); + + my @items = map { + my $source_item = $_; + SL::DB::InvoiceItem->new(map({ ( $_ => $source_item->$_ ) } + qw(parts_id description qty sellprice discount project_id + serialnumber pricegroup_id ordnumber transdate cusordnumber unit + base_qty subtotal longdescription lastcost price_factor_id)), + deliverydate => $source_item->reqdate); + } @{ $source->items }; + + $invoice->invoiceitems(\@items); + + return $invoice; +} + sub post { my ($self, %params) = @_;