X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/951ebae446824a101f4182da5b1f92a493dc7d2a..ed9b1bfb7:/SL/DB/Order.pm diff --git a/SL/DB/Order.pm b/SL/DB/Order.pm index 6baa0e20d..978d128bb 100644 --- a/SL/DB/Order.pm +++ b/SL/DB/Order.pm @@ -6,6 +6,7 @@ use strict; use Carp; use DateTime; use List::Util qw(max); +use List::MoreUtils qw(any); use SL::DB::MetaSetup::Order; use SL::DB::Manager::Order; @@ -202,16 +203,29 @@ sub new_from { my ($class, $source, %params) = @_; croak("Unsupported source object type '" . ref($source) . "'") unless ref($source) eq 'SL::DB::Order'; - croak("A destination type must be given parameter") unless $params{destination_type}; + croak("A destination type must be given as parameter") unless $params{destination_type}; my $destination_type = delete $params{destination_type}; - my $src_dst_allowed = ('sales_quotation' eq $source->type && 'sales_order' eq $destination_type) - || ('request_quotation' eq $source->type && 'purchase_order' eq $destination_type) - || ('sales_quotation' eq $source->type && 'sales_quotation' eq $destination_type) - || ('sales_order' eq $source->type && 'sales_order' eq $destination_type) - || ('request_quotation' eq $source->type && 'request_quotation' eq $destination_type) - || ('purchase_order' eq $source->type && 'purchase_order' eq $destination_type); - croak("Cannot convert from '" . $source->type . "' to '" . $destination_type . "'") unless $src_dst_allowed; + + my @from_tos = ( + { from => 'sales_quotation', to => 'sales_order', abbr => 'sqso' }, + { from => 'request_quotation', to => 'purchase_order', abbr => 'rqpo' }, + { from => 'sales_quotation', to => 'sales_quotation', abbr => 'sqsq' }, + { from => 'sales_order', to => 'sales_order', abbr => 'soso' }, + { from => 'request_quotation', to => 'request_quotation', abbr => 'rqrq' }, + { from => 'purchase_order', to => 'purchase_order', abbr => 'popo' }, + { from => 'sales_order', to => 'purchase_order', abbr => 'sopo' }, + { from => 'purchase_order', to => 'sales_order', abbr => 'poso' }, + ); + 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 $_ } @_; + }; my ($item_parent_id_column, $item_parent_column); @@ -231,6 +245,21 @@ sub new_from { transdate => DateTime->today_local, ); + if ( $is_abbr_any->(qw(sopo poso)) ) { + $args{ordnumber} = 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; + $args{salesman_id} = undef; + $args{payment_id} = undef; + $args{delivery_term_id} = undef; + } + if ( $is_abbr_any->(qw(poso)) ) { + $args{vendor_id} = undef; + } + # Custom shipto addresses (the ones specific to the sales/purchase # record and not to the customer/vendor) are only linked from # shipto → order. Meaning order.shipto_id @@ -264,6 +293,13 @@ sub new_from { )), custom_variables => \@custom_variables, ); + if ( $is_abbr_any->(qw(sopo)) ) { + $current_oe_item->sellprice($source_item->lastcost); + $current_oe_item->discount(0); + } + if ( $is_abbr_any->(qw(poso)) ) { + $current_oe_item->lastcost($source_item->sellprice); + } $current_oe_item->{"converted_from_orderitems_id"} = $_->{id} if ref($item_parent) eq 'SL::DB::Order'; $current_oe_item; } @{ $items };