X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FOrder.pm;h=397b7fa5cf59907b107106e42ab7507d79712921;hb=844a541e0d8f59644540413f675e8f07cd154cf6;hp=415896919e53ecc31d3e84481fe05a8ef99dcd6d;hpb=f65440cb9d28d4862facc50858bd25fa138cb211;p=kivitendo-erp.git diff --git a/SL/DB/Order.pm b/SL/DB/Order.pm index 415896919..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; @@ -311,6 +326,7 @@ sub new_from { { 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; @@ -327,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; @@ -355,7 +371,7 @@ 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)) ) { + if ( $is_abbr_any->(qw(sosq porq)) ) { $args{ordnumber} = undef; $args{quonumber} = undef; $args{reqdate} = DateTime->today_local->next_workday(); @@ -392,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, ); @@ -446,7 +463,7 @@ sub new_from_multi { 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; @@ -461,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)) { @@ -596,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