Revision c1808a62
Von Tamino Steinert vor mehr als 2 Jahren hinzugefügt
SL/DB/Order.pm | ||
---|---|---|
return $delivery_order;
|
||
}
|
||
|
||
sub convert_to_reclamation {
|
||
my ($self, %params) = @_;
|
||
$params{destination_type} = $self->is_sales ? 'sales_reclamation'
|
||
: 'purchase_reclamation';
|
||
|
||
require SL::DB::Reclamation;
|
||
my $reclamation = SL::DB::Reclamation->new_from($self, %params);
|
||
|
||
return $reclamation;
|
||
}
|
||
|
||
sub _clone_orderitem_cvar {
|
||
my ($cvar) = @_;
|
||
|
||
... | ... | |
sub new_from {
|
||
my ($class, $source, %params) = @_;
|
||
|
||
croak("Unsupported source object type '" . ref($source) . "'") unless ref($source) eq 'SL::DB::Order';
|
||
unless (any {ref($source) eq $_} qw(
|
||
SL::DB::Order
|
||
SL::DB::Reclamation
|
||
)) {
|
||
croak("Unsupported source object type '" . ref($source) . "'");
|
||
}
|
||
croak("A destination type must be given as parameter") unless $params{destination_type};
|
||
|
||
my $destination_type = delete $params{destination_type};
|
||
... | ... | |
{ from => 'request_quotation', to => 'sales_order', abbr => 'rqso' },
|
||
{ from => 'sales_quotation', to => 'request_quotation', abbr => 'sqrq' },
|
||
{ from => 'sales_order', to => 'request_quotation', abbr => 'sorq' },
|
||
{ from => 'sales_reclamation', to => 'sales_order', abbr => 'srso' },
|
||
{ from => 'purchase_reclamation', to => 'purchase_order', abbr => 'prpo' },
|
||
);
|
||
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;
|
||
... | ... | |
if (ref($source) eq 'SL::DB::Order') {
|
||
$item_parent_id_column = 'trans_id';
|
||
$item_parent_column = 'order';
|
||
} elsif ( ref($source) eq 'SL::DB::Reclamation') {
|
||
$item_parent_id_column = 'reclamation_id';
|
||
$item_parent_column = 'reclamation';
|
||
}
|
||
|
||
my %args = ( map({ ( $_ => $source->$_ ) } qw(amount cp_id currency_id cusordnumber customer_id delivery_customer_id delivery_term_id delivery_vendor_id
|
||
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 billing_address_id
|
||
)),
|
||
quotation => !!($destination_type =~ m{quotation$}),
|
||
closed => 0,
|
||
delivered => 0,
|
||
transdate => DateTime->today_local,
|
||
employee => SL::DB::Manager::Employee->current,
|
||
);
|
||
# reqdate in quotation is 'offer is valid until reqdate'
|
||
# reqdate in order is 'will be delivered until reqdate'
|
||
# both dates are setable (on|off)
|
||
# and may have a additional interval in days (+ n days)
|
||
# dies if this convention will change
|
||
$args{reqdate} = $from_to->{to} =~ m/_quotation$/
|
||
? $::instance_conf->get_reqdate_on
|
||
? DateTime->today_local->next_workday(extra_days => $::instance_conf->get_reqdate_interval)->to_kivitendo
|
||
: undef
|
||
: $from_to->{to} =~ m/_order$/
|
||
? $::instance_conf->get_deliverydate_on
|
||
? DateTime->today_local->next_workday(extra_days => $::instance_conf->get_delivery_date_interval)->to_kivitendo
|
||
: undef
|
||
: die "Wrong state for reqdate";
|
||
my %args;
|
||
if (ref($source) eq 'SL::DB::Order') {
|
||
%args = ( map({ ( $_ => $source->$_ ) } qw(amount cp_id currency_id cusordnumber customer_id delivery_customer_id delivery_term_id delivery_vendor_id
|
||
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 billing_address_id
|
||
)),
|
||
quotation => !!($destination_type =~ m{quotation$}),
|
||
closed => 0,
|
||
delivered => 0,
|
||
transdate => DateTime->today_local,
|
||
employee => SL::DB::Manager::Employee->current,
|
||
);
|
||
# reqdate in quotation is 'offer is valid until reqdate'
|
||
# reqdate in order is 'will be delivered until reqdate'
|
||
# both dates are setable (on|off)
|
||
# and may have a additional interval in days (+ n days)
|
||
# dies if this convention will change
|
||
$args{reqdate} = $from_to->{to} =~ m/_quotation$/
|
||
? $::instance_conf->get_reqdate_on
|
||
? DateTime->today_local->next_workday(extra_days => $::instance_conf->get_reqdate_interval)->to_kivitendo
|
||
: undef
|
||
: $from_to->{to} =~ m/_order$/
|
||
? $::instance_conf->get_deliverydate_on
|
||
? DateTime->today_local->next_workday(extra_days => $::instance_conf->get_delivery_date_interval)->to_kivitendo
|
||
: undef
|
||
: die "Wrong state for reqdate";
|
||
} elsif ( ref($source) eq 'SL::DB::Reclamation') {
|
||
#TODO(Tamino): add billing_address_id to reclamation
|
||
%args = ( map({ ( $_ => $source->$_ ) } qw(
|
||
amount currency_id customer_id delivery_term_id department_id
|
||
exchangerate globalproject_id intnotes language_id netamount
|
||
notes payment_id reqdate salesman_id shippingpoint shipvia taxincluded
|
||
tax_point taxzone_id transaction_description vendor_id
|
||
)),
|
||
cp_id => $source->{contact_id},
|
||
closed => 0,
|
||
delivered => 0,
|
||
transdate => DateTime->today_local,
|
||
employee => SL::DB::Manager::Employee->current,
|
||
);
|
||
}
|
||
|
||
if ( $is_abbr_any->(qw(sopo poso rqso sosq porq rqsq sqrq sorq)) ) {
|
||
$args{ordnumber} = undef;
|
||
... | ... | |
$item_parents{$source_item_id} ||= $source_item->$item_parent_column;
|
||
my $item_parent = $item_parents{$source_item_id};
|
||
|
||
my $current_oe_item = SL::DB::OrderItem->new(map({ ( $_ => $source_item->$_ ) }
|
||
qw(active_discount_source active_price_source base_qty cusordnumber
|
||
description discount lastcost longdescription
|
||
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,
|
||
);
|
||
my $current_oe_item;
|
||
if (ref($source) eq 'SL::DB::Order') {
|
||
$current_oe_item = SL::DB::OrderItem->new(map({ ( $_ => $source_item->$_ ) }
|
||
qw(active_discount_source active_price_source base_qty cusordnumber
|
||
description discount lastcost longdescription
|
||
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,
|
||
);
|
||
} elsif (ref($source) eq 'SL::DB::Reclamation') {
|
||
$current_oe_item = SL::DB::OrderItem->new(
|
||
map({ ( $_ => $source_item->$_ ) } qw(
|
||
active_discount_source active_price_source base_qty description
|
||
discount lastcost longdescription parts_id price_factor
|
||
price_factor_id pricegroup_id project_id qty reqdate sellprice
|
||
serialnumber unit
|
||
)),
|
||
custom_variables => \@custom_variables,
|
||
);
|
||
}
|
||
if ( $is_abbr_any->(qw(sopo)) ) {
|
||
$current_oe_item->sellprice($source_item->lastcost);
|
||
$current_oe_item->discount(0);
|
||
... | ... | |
$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->{"converted_from_reclamation_item_id"} = $_->{id} if ref($item_parent) eq 'SL::DB::Reclamation';
|
||
$current_oe_item;
|
||
} @{ $items };
|
||
|
Auch abrufbar als: Unified diff
Workflow: order ↔ reclamation