X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FOrder.pm;h=397b7fa5cf59907b107106e42ab7507d79712921;hb=844a541e0d8f59644540413f675e8f07cd154cf6;hp=f22c84d179de78027707bbc91e482a68d4199d93;hpb=a6485c5822e13b6d0bda4bff0a003bfc569f778c;p=kivitendo-erp.git diff --git a/SL/DB/Order.pm b/SL/DB/Order.pm index f22c84d17..397b7fa5c 100644 --- a/SL/DB/Order.pm +++ b/SL/DB/Order.pm @@ -238,8 +238,23 @@ sub convert_to_invoice { my $invoice; if (!$self->db->with_transaction(sub { require SL::DB::Invoice; - $invoice = SL::DB::Invoice->new_from($self)->post(%params) || die; + $invoice = SL::DB::Invoice->new_from($self, %params)->post || die; $self->link_to_record($invoice); + # TODO extend link_to_record for items, otherwise long-term no d.r.y. + foreach my $item (@{ $invoice->items }) { + foreach (qw(orderitems)) { + if ($item->{"converted_from_${_}_id"}) { + die unless $item->{id}; + RecordLinks->create_links('mode' => 'ids', + 'from_table' => $_, + 'from_ids' => $item->{"converted_from_${_}_id"}, + 'to_table' => 'invoice', + 'to_id' => $item->{id}, + ) || die; + delete $item->{"converted_from_${_}_id"}; + } + } + } $self->update_attributes(closed => 1); 1; })) { @@ -275,7 +290,7 @@ sub convert_to_delivery_order { } } - $self->update_attributes(delivered => 1); + $self->update_attributes(delivered => 1) unless $::instance_conf->get_shipped_qty_require_stock_out; 1; })) { return undef; @@ -310,14 +325,13 @@ sub new_from { { from => 'purchase_order', to => 'purchase_order', abbr => 'popo' }, { from => 'sales_order', to => 'purchase_order', abbr => 'sopo' }, { from => 'purchase_order', to => 'sales_order', abbr => 'poso' }, + { from => 'sales_order', to => 'sales_quotation', abbr => 'sosq' }, + { from => 'purchase_order', to => 'request_quotation', abbr => 'porq' }, ); my $from_to = (grep { $_->{from} eq $source->type && $_->{to} eq $destination_type} @from_tos)[0]; croak("Cannot convert from '" . $source->type . "' to '" . $destination_type . "'") if !$from_to; my $is_abbr_any = sub { - # foreach my $abbr (@_) { - # croak "no such abbreviation: '$abbr'" if !grep { $_->{abbr} eq $abbr } @from_tos; - # } any { $from_to->{abbr} eq $_ } @_; }; @@ -329,21 +343,21 @@ sub new_from { } my %args = ( map({ ( $_ => $source->$_ ) } qw(amount cp_id currency_id cusordnumber customer_id delivery_customer_id delivery_term_id delivery_vendor_id - department_id employee_id exchangerate globalproject_id intnotes marge_percent marge_total language_id netamount notes + department_id exchangerate globalproject_id intnotes marge_percent marge_total language_id netamount notes ordnumber payment_id quonumber reqdate salesman_id shippingpoint shipvia taxincluded tax_point taxzone_id - transaction_description vendor_id + transaction_description vendor_id billing_address_id )), quotation => !!($destination_type =~ m{quotation$}), closed => 0, delivered => 0, transdate => DateTime->today_local, + employee => SL::DB::Manager::Employee->current, ); if ( $is_abbr_any->(qw(sopo poso)) ) { $args{ordnumber} = undef; $args{quonumber} = undef; $args{reqdate} = DateTime->today_local->next_workday(); - $args{employee} = SL::DB::Manager::Employee->current; } if ( $is_abbr_any->(qw(sopo)) ) { $args{customer_id} = undef; @@ -357,6 +371,11 @@ sub new_from { if ( $is_abbr_any->(qw(soso)) ) { $args{periodic_invoices_config} = $source->periodic_invoices_config->clone_and_reset if $source->periodic_invoices_config; } + if ( $is_abbr_any->(qw(sosq porq)) ) { + $args{ordnumber} = undef; + $args{quonumber} = undef; + $args{reqdate} = DateTime->today_local->next_workday(); + } # Custom shipto addresses (the ones specific to the sales/purchase # record and not to the customer/vendor) are only linked from @@ -389,6 +408,7 @@ sub new_from { marge_percent marge_price_factor marge_total ordnumber parts_id price_factor price_factor_id pricegroup_id project_id qty reqdate sellprice serialnumber ship subtotal transdate unit + optional )), custom_variables => \@custom_variables, ); @@ -437,13 +457,13 @@ sub new_from_multi { # set this entries to undef that yield different information my %attributes; - foreach my $attr (qw(ordnumber transdate reqdate taxincluded shippingpoint + foreach my $attr (qw(ordnumber transdate reqdate tax_point taxincluded shippingpoint shipvia notes closed delivered reqdate quonumber cusordnumber proforma transaction_description order_probability expected_billing_date)) { $attributes{$attr} = undef if any { ($sources->[0]->$attr//'') ne ($_->$attr//'') } @$sources; } - foreach my $attr (qw(cp_id currency_id employee_id salesman_id department_id + foreach my $attr (qw(cp_id currency_id salesman_id department_id delivery_customer_id delivery_vendor_id shipto_id globalproject_id exchangerate)) { $attributes{$attr} = undef if any { ($sources->[0]->$attr||0) != ($_->$attr||0) } @$sources; @@ -458,6 +478,9 @@ sub new_from_multi { # no periodic invoice config for new order $attributes{periodic_invoices_config} = undef; + # set emplyee to the current one + $attributes{employee} = SL::DB::Manager::Employee->current; + # copy global ordnumber, transdate, cusordnumber into item scope # unless already present there foreach my $attr (qw(ordnumber transdate cusordnumber)) { @@ -593,7 +616,7 @@ L. That invoice is posted, and C<$self> is linked to the new invoice via L. C<$self>'s C attribute is set to C, and C<$self> is saved. -The arguments in C<%params> are passed to L. +The arguments in C<%params> are passed to L. Returns the new invoice instance on success and C on failure. The whole process is run inside a transaction. On failure