Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / DB / Manager / PriceRule.pm
index e94fd15..974011a 100644 (file)
@@ -7,6 +7,10 @@ use strict;
 
 use parent qw(SL::DB::Helper::Manager);
 
+use constant PRICE_NEW                 => 0;
+use constant PRICE_REDUCED_MASTER_DATA => 1;
+use constant PRICE_DISCOUNT            => 2;
+
 use SL::DB::Helper::Filtered;
 use SL::DB::Helper::Paginated;
 use SL::DB::Helper::Sorted;
@@ -17,6 +21,28 @@ use SL::Locale::String qw(t8);
 sub object_class { 'SL::DB::PriceRule' }
 
 __PACKAGE__->make_manager_methods;
+__PACKAGE__->add_filter_specs(
+  has_item_type => sub {
+    my ($key, $values, $prefix) = @_;
+    return unless @$values;
+
+    my $each_type = "SELECT DISTINCT price_rules_id FROM price_rule_items WHERE type = %s";
+    my $sub_query = join ' INTERSECT ', map { sprintf $each_type, $::form->get_standard_dbh->quote($_) } @$values;
+    return or => [ ${prefix} . 'id' => [ \$sub_query ] ];
+  },
+  item_type_matches => sub {
+    my ($key, $values, $prefix) = @_;
+    return unless @$values;
+    return unless 'HASH' eq ref $values->[0];
+    return unless grep $_, values %{ $values->[0] };
+
+    my $each_type = "SELECT DISTINCT price_rules_id FROM price_rule_items WHERE type = %s AND (%s)";
+    my $sub_query = join ' INTERSECT ', map {
+      sprintf $each_type, $::form->get_standard_dbh->quote($_), SL::DB::Manager::PriceRuleItem->filter_match($_, $values->[0]{$_})
+    } grep { $values->[0]{$_} } keys %{ $values->[0] };
+    return or => [ ${prefix} . 'id' => [ \$sub_query ] ];
+  },
+);
 
 sub get_matching_filter {
   my ($class, %params) = @_;
@@ -47,13 +73,18 @@ sub get_all_matching {
   my ($self, %params) = @_;
 
   my ($query, @values) = $self->get_matching_filter(%params);
-  my @ids = selectall_ids($::form, $::form->get_standard_dbh, $query, 0, @values);
-
+  my @ids = selectcol_array_query($::form, SL::DB->client->dbh, $query, @values);
   return [] unless @ids;
 
   $self->get_all(query => [ id => \@ids ]);
 }
 
+sub all_price_types {
+  [ PRICE_NEW,                 t8('Price')               ],
+  [ PRICE_REDUCED_MASTER_DATA, t8('Reduced Master Data') ],
+  [ PRICE_DISCOUNT,            t8('Discount')            ],
+}
+
 sub _sort_spec {
   return ( columns => { SIMPLE => 'ALL', },
            default => [ 'name', 1 ],