From 988028c38ea624e169b15ed3d0aeec1c5ef86ac9 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus <m.bunkus@linet-services.de> Date: Fri, 20 May 2016 13:21:39 +0200 Subject: [PATCH] =?utf8?q?CVars:=20beim=20Einlesen=20f=C3=BCr=20Sub-Module?= =?utf8?q?s=20G=C3=BCltigkeit=20richtig=20bestimmen?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Werden für CVars für Belege eingelesen (z.B. Aufträge), wo also »sub_module« gesetzt ist (hier: »orderitems«), so steht in der CVar-Spalte »trans_id« die Datenbank-ID des referenzierten Sub-Items (hier: »orderitems.id«) drin und nicht die ID des Items, auf das sich die Konfiguration selber bezieht. Die Gültigkeit einer CVar wird hingegen nicht am Beleg selber sondern eine Ebene darüber, am Warenstammdatum, festgemacht. Das bedeutet, dass in der Spalte »custom_variables_validity.trans_id« die Artikel-ID enthalten ist. Ãbergeben bekommt die Funktion zum Einlesen der CVars aber die ID des Orderitems. Also muss das Datenbankquery unterschiedliche Tabellen und Spalten abfragen, je nachdem, ob »sub_module« gesetzt ist oder nicht. --- SL/CVar.pm | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/SL/CVar.pm b/SL/CVar.pm index 3dba8b217..a2668c2d1 100644 --- a/SL/CVar.pm +++ b/SL/CVar.pm @@ -2,6 +2,7 @@ package CVar; use strict; +use Carp; use List::MoreUtils qw(any); use List::Util qw(first); use Scalar::Util qw(blessed); @@ -134,7 +135,7 @@ sub get_custom_variables { do_statement($form, $h_var, $q_var, @values); $act_var = $h_var->fetchrow_hashref(); - $valid = $self->get_custom_variables_validity(config_id => $cvar->{id}, trans_id => $params{trans_id}); + $valid = $self->get_custom_variables_validity(config_id => $cvar->{id}, trans_id => $params{trans_id}, sub_module => $params{sub_module}); } else { $valid = !$cvar->{flag_defaults_to_invalid}; } @@ -588,9 +589,13 @@ sub save_custom_variables_validity { $main::lxdebug->leave_sub(); } -sub get_custom_variables_validity { - $main::lxdebug->enter_sub(2); +my %_validity_sub_module_mapping = ( + orderitems => { table => 'orderitems', result_column => 'parts_id', trans_id_column => 'id', }, + delivery_order_items => { table => 'delivery_order_items', result_column => 'parts_id', trans_id_column => 'id', }, + invoice => { table => 'invoice', result_column => 'parts_id', trans_id_column => 'id', }, +); +sub get_custom_variables_validity { my $self = shift; my %params = @_; @@ -601,11 +606,29 @@ sub get_custom_variables_validity { my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); - my $query = qq|SELECT id FROM custom_variables_validity WHERE config_id = ? AND trans_id = ? LIMIT 1|; + my $query; - my ($invalid) = selectfirst_array_query($form, $dbh, $query, conv_i($params{config_id}), conv_i($params{trans_id})); + if ($params{sub_module}) { + my %mapping = %{ $_validity_sub_module_mapping{ $params{sub_module} } || croak("Invalid sub_module '" . $params{sub_module} . "'") }; + $query = <<SQL; + SELECT cvv.id + FROM $mapping{table} mt + LEFT JOIN custom_variables_validity cvv ON (cvv.trans_id = mt.$mapping{result_column}) + WHERE (cvv.config_id = ?) + AND (mt.$mapping{trans_id_column} = ?) + LIMIT 1 +SQL + } else { + $query = <<SQL; + SELECT id + FROM custom_variables_validity + WHERE (config_id = ?) + AND (trans_id = ?) + LIMIT 1 +SQL + } - $main::lxdebug->leave_sub(2); + my ($invalid) = selectfirst_array_query($form, $dbh, $query, conv_i($params{config_id}), conv_i($params{trans_id})); return !$invalid; } -- 2.20.1