X-Git-Url: http://wagnertech.de/git?p=kivitendo-erp.git;a=blobdiff_plain;f=SL%2FDB%2FHelper%2FCustomVariables.pm;fp=SL%2FDB%2FHelper%2FCustomVariables.pm;h=a6ab5ae18859f8bf7e8035069c42ea8c38a06c3e;hp=6ebebda418e93db1c5f7943ee1d01610f5ee1121;hb=53593baa211863fbf66540cf1bcc36c8fb37257f;hpb=deb4d2dbb676d7d6f69dfe7815d6e0cb09bd4a44 diff --git a/SL/DB/Helper/CustomVariables.pm b/SL/DB/Helper/CustomVariables.pm index 6ebebda41..a6ab5ae18 100644 --- a/SL/DB/Helper/CustomVariables.pm +++ b/SL/DB/Helper/CustomVariables.pm @@ -4,6 +4,7 @@ use strict; use Carp; use Data::Dumper; use List::Util qw(first); +use List::UtilsBy qw(partition_by); use constant META_CVARS => 'cvars_config'; @@ -83,17 +84,22 @@ sub make_cvar_by_configs { my $configs = _all_configs(%params); my $cvars = $self->custom_variables; my %cvars_by_config = map { $_->config_id => $_ } @$cvars; + my $invalids = _all_invalids($self->${\ $self->meta->primary_key_columns->[0]->name }, $configs, %params); + my %invalids_by_config = map { $_->config_id => 1 } @$invalids; my @return = map( { + my $cvar; if ( $cvars_by_config{$_->id} ) { - $cvars_by_config{$_->id}; + $cvar = $cvars_by_config{$_->id}; } else { - my $cvar = _new_cvar($self, %params, config => $_); + $cvar = _new_cvar($self, %params, config => $_); $self->add_custom_variables($cvar); - $cvar; } + $cvar->{is_valid} = !$invalids_by_config{$_->id}; + $cvar->{config} = $_; + $cvar; } @$configs ); @@ -165,7 +171,17 @@ sub _all_configs { require SL::DB::CustomVariableConfig; - SL::DB::Manager::CustomVariableConfig->get_all_sorted($params{module} ? (query => [ module => $params{module} ]) : ()); + my $cache = $::request->cache("::SL::DB::Helper::CustomVariables::object_cache"); + + if (!$cache->{all}) { + my $configs = SL::DB::Manager::CustomVariableConfig->get_all_sorted; + $cache->{all} = $configs; + $cache->{module} = { partition_by { $_->module } @$configs }; + } + + return $params{module} && !ref $params{module} ? $cache->{module}{$params{module}} + : $params{module} && ref $params{module} ? [ map { @{ $cache->{module}{$_} // [] } } @{ $params{module} } ] + : $cache->{all}; } sub _overload_by_module { @@ -327,7 +343,7 @@ sub make_cvar_custom_filter { # remove rose aliases. query builder sadly is not reentrant, and will reuse the same aliases. :( $query{$key} =~ s{\bt\d+(?:\.)?\b}{}g; - # manually inline the values. again, rose doen't know how to handle bind params in subqueries :( + # manually inline the values. again, rose doesn't know how to handle bind params in subqueries :( $query{$key} =~ s{\?}{ $config->dbh->quote(shift @{ $bind_vals{$key} }) }xeg; $query{$key} =~ s{\n}{ }g; @@ -350,6 +366,32 @@ sub make_cvar_custom_filter { ); } + +sub _all_invalids { + my ($trans_id, $configs, %params) = @_; + + require SL::DB::CustomVariableValidity; + + # easy 1: no trans_id, all valid by default. + return [] unless $trans_id; + + # easy 2: no module in params? no validity + return [] unless $params{module}; + + my %wanted_modules = ref $params{module} ? map { $_ => 1 } @{ $params{module} } : ($params{module} => 1); + my @module_configs = grep { $wanted_modules{$_->module} } @$configs; + + return [] unless @module_configs; + + # nor find all entries for that and return + SL::DB::Manager::CustomVariableValidity->get_all( + query => [ + config_id => [ map { $_->id } @module_configs ], + trans_id => $trans_id, + ] + ); +} + 1; __END__ @@ -419,7 +461,7 @@ passed to import. =item C -Thi will return a list of CVars with the following changes over the standard accessor: +This will return a list of CVars with the following changes over the standard accessor: =over 4 @@ -510,6 +552,23 @@ If the Manager for the calling C has included the helper Ls.schoeling@linet-services.deE,