Revision b14755d0
Von Bernd Bleßmann vor mehr als 7 Jahren hinzugefügt
SL/DB/Order.pm | ||
---|---|---|
return $delivery_order;
|
||
}
|
||
|
||
sub _clone_orderitem_cvar {
|
||
my ($cvar) = @_;
|
||
|
||
my $cloned = $_->clone_and_reset;
|
||
$cloned->sub_module('orderitems');
|
||
|
||
return $cloned;
|
||
}
|
||
|
||
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};
|
||
|
||
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);
|
||
croak("Cannot convert from '" . $source->type . "' to '" . $destination_type . "'") unless $src_dst_allowed;
|
||
|
||
my ($item_parent_id_column, $item_parent_column);
|
||
|
||
if (ref($source) eq 'SL::DB::Order') {
|
||
$item_parent_id_column = 'trans_id';
|
||
$item_parent_column = 'order';
|
||
}
|
||
|
||
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 globalproject_id intnotes marge_percent marge_total language_id netamount notes
|
||
ordnumber payment_id quonumber reqdate salesman_id shippingpoint shipvia taxincluded taxzone_id
|
||
transaction_description vendor_id
|
||
)),
|
||
quotation => 0,
|
||
closed => 0,
|
||
delivered => 0,
|
||
transdate => DateTime->today_local,
|
||
);
|
||
|
||
# Custom shipto addresses (the ones specific to the sales/purchase
|
||
# record and not to the customer/vendor) are only linked from
|
||
# shipto → delivery_orders. Meaning delivery_orders.shipto_id
|
||
# will not be filled in that case.
|
||
if (!$source->shipto_id && $source->id) {
|
||
$args{custom_shipto} = $source->custom_shipto->clone($class) if $source->can('custom_shipto') && $source->custom_shipto;
|
||
|
||
} else {
|
||
$args{shipto_id} = $source->shipto_id;
|
||
}
|
||
|
||
my $order = $class->new(%args);
|
||
$order->assign_attributes(%{ $params{attributes} }) if $params{attributes};
|
||
my $items = delete($params{items}) || $source->items_sorted;
|
||
my %item_parents;
|
||
|
||
my @items = map {
|
||
my $source_item = $_;
|
||
my $source_item_id = $_->$item_parent_id_column;
|
||
my @custom_variables = map { _clone_orderitem_cvar($_) } @{ $source_item->custom_variables };
|
||
|
||
$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
|
||
)),
|
||
custom_variables => \@custom_variables,
|
||
);
|
||
$current_oe_item->{"converted_from_orderitems_id"} = $_->{id} if ref($item_parent) eq 'SL::DB::Order';
|
||
$current_oe_item;
|
||
} @{ $items };
|
||
|
||
@items = grep { $params{item_filter}->($_) } @items if $params{item_filter};
|
||
@items = grep { $_->qty * 1 } @items if $params{skip_items_zero_qty};
|
||
@items = grep { $_->qty >=0 } @items if $params{skip_items_negative_qty};
|
||
|
||
$order->items(\@items);
|
||
|
||
return $order;
|
||
}
|
||
|
||
sub number {
|
||
my $self = shift;
|
||
|
||
... | ... | |
|
||
At the moment only sales quotations and sales orders can be converted.
|
||
|
||
=head2 C<new_from $source, %params>
|
||
|
||
Creates a new C<SL::DB::Order> instance and copies as much
|
||
information from C<$source> as possible. At the moment only sales orders from
|
||
sales quotations and purchase orders from requests for quotations can be
|
||
created.
|
||
|
||
The C<transdate> field will be set to the current date.
|
||
|
||
The conversion copies the order items as well.
|
||
|
||
Returns the new order instance. The object returned is not
|
||
saved.
|
||
|
||
C<%params> can include the following options
|
||
(C<destination_type> is mandatory):
|
||
|
||
=over 4
|
||
|
||
=item C<destination_type>
|
||
|
||
(mandatory)
|
||
The type of the newly created object. Can be C<sales_order> or
|
||
C<purchase_order> for now.
|
||
|
||
=item C<items>
|
||
|
||
An optional array reference of RDBO instances for the items to use. If
|
||
missing then the method C<items_sorted> will be called on
|
||
C<$source>. This option can be used to override the sorting, to
|
||
exclude certain positions or to add additional ones.
|
||
|
||
=item C<skip_items_negative_qty>
|
||
|
||
If trueish then items with a negative quantity are skipped. Items with
|
||
a quantity of 0 are not affected by this option.
|
||
|
||
=item C<skip_items_zero_qty>
|
||
|
||
If trueish then items with a quantity of 0 are skipped.
|
||
|
||
=item C<item_filter>
|
||
|
||
An optional code reference that is called for each item with the item
|
||
as its sole parameter. Items for which the code reference returns a
|
||
falsish value will be skipped.
|
||
|
||
=item C<attributes>
|
||
|
||
An optional hash reference. If it exists then it is passed to C<new>
|
||
allowing the caller to set certain attributes for the new delivery
|
||
order.
|
||
|
||
=back
|
||
|
||
=head2 C<create_sales_process>
|
||
|
||
Creates and saves a new sales process. Can only be called for sales
|
Auch abrufbar als: Unified diff
SL::DB::Order->new_from implementiert.
Im Moment nur von Angeboten zu Aufträgen (Ein- und Verkauf).