X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FCsvImport%2FOrder.pm;h=21273347b95064e3279b7c99e94fa69a2bdc34b4;hb=aa63ebae1c0a758ec438c594acb328b1f0e5e001;hp=923e54bc43115620006940fcee66758643dc36f4;hpb=946ea368141749dbf654bb8bdfef8ad39ba048df;p=kivitendo-erp.git diff --git a/SL/Controller/CsvImport/Order.pm b/SL/Controller/CsvImport/Order.pm index 923e54bc4..21273347b 100644 --- a/SL/Controller/CsvImport/Order.pm +++ b/SL/Controller/CsvImport/Order.pm @@ -3,7 +3,7 @@ package SL::Controller::CsvImport::Order; use strict; -use List::MoreUtils qw(any); +use List::MoreUtils qw(any none); use SL::Helper::Csv; use SL::Controller::CsvImport::Helper::Consistency; @@ -18,6 +18,7 @@ use SL::DB::Pricegroup; use SL::DB::Project; use SL::DB::Shipto; use SL::DB::TaxZone; +use SL::DB::Unit; use SL::TransNumber; use parent qw(SL::Controller::CsvImport::BaseMulti); @@ -25,7 +26,7 @@ use parent qw(SL::Controller::CsvImport::BaseMulti); use Rose::Object::MakeMethods::Generic ( - 'scalar --get_set_init' => [ qw(settings languages_by parts_by contacts_by ct_shiptos_by price_factors_by pricegroups_by) ], + 'scalar --get_set_init' => [ qw(settings languages_by parts_by contacts_by ct_shiptos_by price_factors_by pricegroups_by units_by) ], ); @@ -237,6 +238,13 @@ sub init_pricegroups_by { return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $all_pricegroups } } ) } qw(id pricegroup) }; } +sub init_units_by { + my ($self) = @_; + + my $all_units = SL::DB::Manager::Unit->get_all; + return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $all_units } } ) } qw(name) }; +} + sub check_objects { my ($self) = @_; @@ -277,21 +285,6 @@ sub check_objects { $self->add_items_to_order(); $self->handle_prices_and_taxes(); - - - # If order has errors set error for orderitems as well - my $order_entry; - foreach my $entry (@{ $self->controller->data }) { - # Search first order - if ($entry->{raw_data}->{datatype} eq $self->_order_column) { - $order_entry = $entry; - } elsif ( defined $order_entry - && $entry->{raw_data}->{datatype} eq $self->_item_column - && scalar @{ $order_entry->{errors} } > 0 ) { - push @{ $entry->{errors} }, $::locale->text('Error: Invalid order for this order item'); - } - } - } sub handle_order { @@ -370,11 +363,12 @@ sub handle_item { my $part_obj = SL::DB::Part->new(id => $object->parts_id)->load; + $self->handle_unit($entry); + $self->handle_sellprice($entry); + # copy from part if not given $object->description($part_obj->description) unless $object->description; $object->longdescription($part_obj->notes) unless $object->longdescription; - $object->unit($part_obj->unit) unless $object->unit; - $object->sellprice($part_obj->sellprice) unless defined $object->sellprice; $object->lastcost($part_obj->lastcost) unless defined $object->lastcost; # set to 0 if not given @@ -386,6 +380,48 @@ sub handle_item { $self->check_pricegroup($entry); } +sub handle_unit { + my ($self, $entry) = @_; + + my $object = $entry->{object}; + + # Set unit from part if not given. + if (!$object->unit) { + $object->unit($object->part->unit); + return 1; + } + + # Check whether or not unit is valid. + if ($object->unit && !$self->units_by->{name}->{ $object->unit }) { + push @{ $entry->{errors} }, $::locale->text('Error: Invalid unit'); + return 0; + } + + # Check whether unit is convertible to parts unit + if (none { $object->unit eq $_ } map { $_->name } @{ $object->part->unit_obj->convertible_units }) { + push @{ $entry->{errors} }, $::locale->text('Error: Invalid unit'); + return 0; + } + + return 1; +} + +sub handle_sellprice { + my ($self, $entry) = @_; + + my $object = $entry->{object}; + + # Set sellprice from part if not given. Convert with respect to unit. + if (!defined $object->sellprice) { + my $sellprice = $object->part->sellprice; + + if ($object->unit ne $object->part->unit) { + $sellprice = $object->unit_obj->convert_to($sellprice, $object->part->unit_obj); + } + $object->sellprice($sellprice); + } +} + sub check_part { my ($self, $entry) = @_; @@ -426,6 +462,11 @@ sub check_part { return 0; } + if ($self->parts_by->{id}->{ $object->parts_id }->obsolete) { + push @{ $entry->{errors} }, $::locale->text('Error: Part is obsolete'); + return 0; + } + return 1; } @@ -615,22 +656,16 @@ sub handle_prices_and_taxes() { sub save_objects { my ($self, %params) = @_; - # set order number and collect to save - my $objects_to_save; + # Collect orders without errors to save. + my $entries_to_save = []; foreach my $entry (@{ $self->controller->data }) { next if $entry->{raw_data}->{datatype} ne $self->_order_column; next if @{ $entry->{errors} }; - if (!$entry->{object}->ordnumber) { - my $number = SL::TransNumber->new(type => 'sales_order', - save => 1); - $entry->{object}->ordnumber($number->create_unique()); - } - - push @{ $objects_to_save }, $entry; + push @{ $entries_to_save }, $entry; } - $self->SUPER::save_objects(data => $objects_to_save); + $self->SUPER::save_objects(data => $entries_to_save); } sub _order_column {