Revision 988028c3
Von Moritz Bunkus vor mehr als 8 Jahren hinzugefügt
SL/CVar.pm | ||
---|---|---|
2 | 2 |
|
3 | 3 |
use strict; |
4 | 4 |
|
5 |
use Carp; |
|
5 | 6 |
use List::MoreUtils qw(any); |
6 | 7 |
use List::Util qw(first); |
7 | 8 |
use Scalar::Util qw(blessed); |
... | ... | |
134 | 135 |
do_statement($form, $h_var, $q_var, @values); |
135 | 136 |
$act_var = $h_var->fetchrow_hashref(); |
136 | 137 |
|
137 |
$valid = $self->get_custom_variables_validity(config_id => $cvar->{id}, trans_id => $params{trans_id}); |
|
138 |
$valid = $self->get_custom_variables_validity(config_id => $cvar->{id}, trans_id => $params{trans_id}, sub_module => $params{sub_module});
|
|
138 | 139 |
} else { |
139 | 140 |
$valid = !$cvar->{flag_defaults_to_invalid}; |
140 | 141 |
} |
... | ... | |
588 | 589 |
$main::lxdebug->leave_sub(); |
589 | 590 |
} |
590 | 591 |
|
591 |
sub get_custom_variables_validity { |
|
592 |
$main::lxdebug->enter_sub(2); |
|
592 |
my %_validity_sub_module_mapping = ( |
|
593 |
orderitems => { table => 'orderitems', result_column => 'parts_id', trans_id_column => 'id', }, |
|
594 |
delivery_order_items => { table => 'delivery_order_items', result_column => 'parts_id', trans_id_column => 'id', }, |
|
595 |
invoice => { table => 'invoice', result_column => 'parts_id', trans_id_column => 'id', }, |
|
596 |
); |
|
593 | 597 |
|
598 |
sub get_custom_variables_validity { |
|
594 | 599 |
my $self = shift; |
595 | 600 |
my %params = @_; |
596 | 601 |
|
... | ... | |
601 | 606 |
|
602 | 607 |
my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig); |
603 | 608 |
|
604 |
my $query = qq|SELECT id FROM custom_variables_validity WHERE config_id = ? AND trans_id = ? LIMIT 1|;
|
|
609 |
my $query; |
|
605 | 610 |
|
606 |
my ($invalid) = selectfirst_array_query($form, $dbh, $query, conv_i($params{config_id}), conv_i($params{trans_id})); |
|
611 |
if ($params{sub_module}) { |
|
612 |
my %mapping = %{ $_validity_sub_module_mapping{ $params{sub_module} } || croak("Invalid sub_module '" . $params{sub_module} . "'") }; |
|
613 |
$query = <<SQL; |
|
614 |
SELECT cvv.id |
|
615 |
FROM $mapping{table} mt |
|
616 |
LEFT JOIN custom_variables_validity cvv ON (cvv.trans_id = mt.$mapping{result_column}) |
|
617 |
WHERE (cvv.config_id = ?) |
|
618 |
AND (mt.$mapping{trans_id_column} = ?) |
|
619 |
LIMIT 1 |
|
620 |
SQL |
|
621 |
} else { |
|
622 |
$query = <<SQL; |
|
623 |
SELECT id |
|
624 |
FROM custom_variables_validity |
|
625 |
WHERE (config_id = ?) |
|
626 |
AND (trans_id = ?) |
|
627 |
LIMIT 1 |
|
628 |
SQL |
|
629 |
} |
|
607 | 630 |
|
608 |
$main::lxdebug->leave_sub(2);
|
|
631 |
my ($invalid) = selectfirst_array_query($form, $dbh, $query, conv_i($params{config_id}), conv_i($params{trans_id}));
|
|
609 | 632 |
|
610 | 633 |
return !$invalid; |
611 | 634 |
} |
Auch abrufbar als: Unified diff
CVars: beim Einlesen für Sub-Modules Gültigkeit richtig bestimmen
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.