X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FManager%2FPart.pm;h=088d4c838c63789ee373890675aa03498f3dc832;hb=17f43ff5eed41ff4fe630fd874905cacf4f763d8;hp=e6aca1f712d061be27634f866a30a7476322f1dd;hpb=10150f2fb96a248c46b65cea5859d7f1dd11340e;p=kivitendo-erp.git diff --git a/SL/DB/Manager/Part.pm b/SL/DB/Manager/Part.pm index e6aca1f71..088d4c838 100644 --- a/SL/DB/Manager/Part.pm +++ b/SL/DB/Manager/Part.pm @@ -3,36 +3,57 @@ package SL::DB::Manager::Part; use strict; use SL::DB::Helper::Manager; +use SL::DB::Helper::Sorted; +use SL::DB::Helper::Paginated; +use SL::DB::Helper::Filtered; use base qw(SL::DB::Helper::Manager); use Carp; use SL::DBUtils; +use SL::MoreCommon qw(listify); sub object_class { 'SL::DB::Part' } __PACKAGE__->make_manager_methods; +__PACKAGE__->add_filter_specs( + part_type => sub { + my ($key, $value, $prefix) = @_; + return __PACKAGE__->type_filter($value, $prefix); + }, + all => sub { + my ($key, $value, $prefix) = @_; + return or => [ map { $prefix . $_ => $value } qw(partnumber description) ] + } +); sub type_filter { - my $class = shift; - my $type = lc(shift || ''); + my ($class, $type, $prefix) = @_; - if ($type =~ m/^part/) { - return (and => [ or => [ assembly => 0, assembly => undef ], - '!inventory_accno_id' => 0, - '!inventory_accno_id' => undef, - ]); + return () unless $type; - } elsif ($type =~ m/^service/) { - return (and => [ or => [ assembly => 0, assembly => undef ], - or => [ inventory_accno_id => 0, inventory_accno_id => undef ], - ]); + $prefix //= ''; - } elsif ($type =~ m/^assembl/) { - return (assembly => 1); + # this is to make selections like part_type => { part => 1, service => 1 } work + if ('HASH' eq ref $type) { + $type = [ grep { $type->{$_} } keys %$type ]; + } + my @types = grep { $_ } listify($type); + my @filter; + + for my $type (@types) { + if ($type =~ m/^part/) { + push @filter, ($prefix . part_type => 'part'); + } elsif ($type =~ m/^service/) { + push @filter, ($prefix . part_type => 'service'); + } elsif ($type =~ m/^assembly/) { + push @filter, ($prefix . part_type => 'assembly'); + } elsif ($type =~ m/^assortment/) { + push @filter, ($prefix . part_type => 'assortment'); + } } - return (); + return @filter > 2 ? (or => \@filter) : @filter; } sub get_ordered_qty { @@ -60,4 +81,58 @@ SQL return %qty_by_id; } +sub _sort_spec { + ( + default => [ 'partnumber', 1 ], + columns => { + SIMPLE => 'ALL', + }, + nulls => {}, + ); +} + 1; +__END__ + +=pod + +=encoding utf8 + +=head1 NAME + +SL::DB::Manager::Part - RDBO manager for the C table + +=head1 FUNCTIONS + +=over 4 + +=item C + +For each of the given part IDs the ordered quantity is +calculated. This is done by summing over all open purchase orders. + +Returns a hash with the part IDs being the keys and the ordered +quantities being the values. + +=item C + +Constructs a partial filter for matching any of the article types +given with C<@types>. The returned partial filter is suitable for a +Rose manager query. + +Each type can be either 'C', 'C' or 'C' +(their plurals are recognized as well). If multiple types are given +then they're combined with C. + +=back + +=head1 BUGS + +Nothing here yet. + +=head1 AUTHOR + +Sven Schöling Es.schoeling@linet-services.deE, +Moritz Bunkus Em.bunkus@linet-services.deE + +=cut