X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FDB%2FManager%2FPriceRuleItem.pm;h=28f4d6f514639610679cbb70a23e78162e872d53;hb=17f43ff5eed41ff4fe630fd874905cacf4f763d8;hp=ef6cc9cfdde7e775ef396d28619b3aea4a761bfe;hpb=9589ecd776677cdeb2fbaf8de211963d24cf5aa1;p=kivitendo-erp.git diff --git a/SL/DB/Manager/PriceRuleItem.pm b/SL/DB/Manager/PriceRuleItem.pm index ef6cc9cfd..28f4d6f51 100644 --- a/SL/DB/Manager/PriceRuleItem.pm +++ b/SL/DB/Manager/PriceRuleItem.pm @@ -15,21 +15,23 @@ __PACKAGE__->make_manager_methods; use SL::Locale::String qw(t8); my @types = qw( - customer vendor business partsgroup qty reqdate pricegroup + part customer vendor business partsgroup qty reqdate transdate pricegroup ); my %ops = ( - 'num' => { eq => '=', lt => '<', gt => '>' }, + 'num' => { eq => '=', le => '<=', ge => '>=' }, 'date' => { eq => '=', lt => '<', gt => '>' }, ); my %types = ( 'customer' => { description => t8('Customer'), customer => 1, vendor => 0, data_type => 'int', data => sub { $_[0]->customer->id }, }, 'vendor' => { description => t8('Vendor'), customer => 0, vendor => 1, data_type => 'int', data => sub { $_[0]->vendor->id }, }, - 'business' => { description => t8('Type of Business'), customer => 1, vendor => 1, data_type => 'int', data => sub { $_[0]->customervendor->business_id }, }, + 'business' => { description => t8('Type of Business'), customer => 1, vendor => 1, data_type => 'int', data => sub { $_[0]->customervendor->business_id }, exclude_nulls => 1 }, 'reqdate' => { description => t8('Reqdate'), customer => 1, vendor => 1, data_type => 'date', data => sub { $_[0]->reqdate }, ops => 'date' }, - 'pricegroup' => { description => t8('Pricegroup'), customer => 1, vendor => 1, data_type => 'int', data => sub { $_[1]->pricegroup_id }, }, - 'partsgroup' => { description => t8('Group'), customer => 1, vendor => 1, data_type => 'int', data => sub { $_[1]->part->partsgroup_id }, }, + 'transdate' => { description => t8('Transdate'), customer => 1, vendor => 1, data_type => 'date', data => sub { $_[0]->transdate }, ops => 'date' }, + 'part' => { description => t8('Part'), customer => 1, vendor => 1, data_type => 'int', data => sub { $_[1]->part->id }, }, + 'pricegroup' => { description => t8('Pricegroup'), customer => 1, vendor => 1, data_type => 'int', data => sub { $_[1]->pricegroup_id }, exclude_nulls => 1 }, + 'partsgroup' => { description => t8('Partsgroup'), customer => 1, vendor => 1, data_type => 'int', data => sub { $_[1]->part->partsgroup_id }, exclude_nulls => 1 }, 'qty' => { description => t8('Qty'), customer => 1, vendor => 1, data_type => 'num', data => sub { $_[1]->qty }, ops => 'num' }, ); @@ -37,6 +39,7 @@ sub not_matching_sql_and_values { my ($class, %params) = @_; die 'must be called with a customer/vendor type' unless $params{type}; + my @args = @params{'record', 'record_item'}; my (@tokens, @values); @@ -44,19 +47,25 @@ sub not_matching_sql_and_values { my $def = $types{$type}; next unless $def->{$params{type}}; - if ($def->{ops}) { - my $ops = $ops{$def->{ops}}; + my $value = $def->{data}->(@args); + if ($def->{exclude_nulls} && !defined $value) { + push @tokens, "type = '$type'"; + } else { my @sub_tokens; - for (keys %$ops) { - push @sub_tokens, "op = '$_' AND NOT value_$def->{data_type} $ops->{$_} ?"; - push @values, $def->{data}; + if ($def->{ops}) { + my $ops = $ops{$def->{ops}}; + + for (keys %$ops) { + push @sub_tokens, "op = '$_' AND NOT ? $ops->{$_} value_$def->{data_type}"; + push @values, $value; + } + } else { + push @sub_tokens, "NOT value_$def->{data_type} = ?"; + push @values, $value; } push @tokens, "type = '$type' AND " . join ' OR ', map "($_)", @sub_tokens; - } else { - push @tokens, "type = '$type' AND NOT value_$def->{data_type} = ?"; - push @values, $def->{data}; } } @@ -66,7 +75,39 @@ sub not_matching_sql_and_values { sub get_all_types { my ($class, $vc) = @_; - [ map { [ $_, $types{$_}{description} ] } grep { $types{$_}{$vc} } map { $_ } @types ]; + $vc + ? [ map { [ $_, $types{$_}{description} ] } grep { $types{$_}{$vc} } map { $_ } @types ] + : [ map { [ $_, $types{$_}{description} ] } map { $_ } @types ] +} + +sub get_type { + $types{$_[1]} } +sub filter_match { + my ($self, $type, $value) = @_; + + my $type_def = $types{$type}; + + if (!$type_def->{ops}) { + my $evalue = $::form->get_standard_dbh->quote($value); + return "value_$type_def->{data_type} = $evalue"; + } elsif ($type_def->{ops} eq 'date') { + my $date_value = $::form->get_standard_dbh->quote(DateTime->from_kivitendo($value)); + return " + (value_$type_def->{data_type} > $date_value AND op = 'lt') OR + (value_$type_def->{data_type} < $date_value AND op = 'gt') OR + (value_$type_def->{data_type} = $date_value AND op = 'eq') + "; + } elsif ($type_def->{ops} eq 'num') { + my $num_value = $::form->get_standard_dbh->quote($::form->parse_amount(\%::myconfig, $value)); + return " + (value_$type_def->{data_type} >= $num_value AND op = 'le') OR + (value_$type_def->{data_type} <= $num_value AND op = 'ge') OR + (value_$type_def->{data_type} = $num_value AND op = 'eq') + "; + } +} + + 1;