Projekt

Allgemein

Profil

Herunterladen (25,1 KB) Statistiken
| Zweig: | Markierung: | Revision:
package CVar;

use strict;

use Carp;
use List::MoreUtils qw(any);
use List::Util qw(first);
use Scalar::Util qw(blessed);
use Data::Dumper;

use SL::DBUtils;
use SL::MoreCommon qw(listify);
use SL::Presenter::Text;
use SL::Util qw(trim);
use SL::DB;

sub get_configs {
$main::lxdebug->enter_sub();

my $self = shift;
my %params = @_;

my $myconfig = \%main::myconfig;
my $form = $main::form;

my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);

my ($where, @values);
if ($params{module}) {
$where = 'WHERE module = ?';
push @values, $params{module};
}

my $query = <<SQL;
SELECT *, date_trunc('seconds', localtimestamp) AS current_timestamp
FROM custom_variable_configs $where ORDER BY sortkey
SQL

$::form->{CVAR_CONFIGS} = {} unless 'HASH' eq ref $::form->{CVAR_CONFIGS};
if (!$::form->{CVAR_CONFIGS}->{$params{module}}) {
my $configs = selectall_hashref_query($form, $dbh, $query, @values);

foreach my $config (@{ $configs }) {
if ($config->{type} eq 'select') {
$config->{OPTIONS} = [ map { { 'value' => $_ } } split(m/\#\#/, $config->{options}) ];

} elsif ($config->{type} eq 'number') {
$config->{precision} = $1 if ($config->{options} =~ m/precision=(\d+)/i);

} elsif ($config->{type} =~ m{^(?:html|text)field$}) {
$config->{width} = 30;
$config->{height} = 5;
$config->{width} = $1 if ($config->{options} =~ m/width=(\d+)/i);
$config->{height} = $1 if ($config->{options} =~ m/height=(\d+)/i);

} elsif ($config->{type} eq 'text') {
$config->{maxlength} = $1 if ($config->{options} =~ m/maxlength=(\d+)/i);

}

$self->_unpack_flags($config);

my $cvar_config = SL::DB::CustomVariableConfig->new(id => $config->{id})->load;
@{$config->{'partsgroups'}} = map {$_->id} @{$cvar_config->partsgroups};

}
$::form->{CVAR_CONFIGS}->{$params{module}} = $configs;
}

$main::lxdebug->leave_sub();

return $::form->{CVAR_CONFIGS}->{$params{module}};
}

sub _unpack_flags {
$main::lxdebug->enter_sub();

my $self = shift;
my $config = shift;

foreach my $flag (split m/:/, $config->{flags}) {
if ($flag =~ m/(.*?)=(.*)/) {
$config->{"flag_${1}"} = $2;
} else {
$config->{"flag_${flag}"} = 1;
}
}

$main::lxdebug->leave_sub();
}

sub get_custom_variables {
$main::lxdebug->enter_sub();

my $self = shift;
my %params = @_;

Common::check_params(\%params, qw(module));

my $myconfig = \%main::myconfig;
my $form = $main::form;

my $dbh = $params{dbh} || $form->get_standard_dbh($myconfig);

my $sub_module = $params{sub_module} ? $params{sub_module} : '';

my $q_var =
qq|SELECT text_value, timestamp_value, timestamp_value::date AS date_value, number_value, bool_value
FROM custom_variables
WHERE (config_id = ?) AND (trans_id = ?) AND (sub_module = ?)|;
my $h_var = prepare_query($form, $dbh, $q_var);

my $custom_variables = $self->get_configs(module => $params{module});

foreach my $cvar (@{ $custom_variables }) {
if ($cvar->{type} =~ m{^(?:html|text)field}) {
$cvar->{width} = 30;
$cvar->{height} = 5;

$cvar->{width} = $1 if ($cvar->{options} =~ m/width=(\d+)/i);
$cvar->{height} = $1 if ($cvar->{options} =~ m/height=(\d+)/i);

} elsif ($cvar->{type} eq 'text') {
$cvar->{maxlength} = $1 if ($cvar->{options} =~ m/maxlength=(\d+)/i);

} elsif ($cvar->{type} eq 'number') {
$cvar->{precision} = $1 if ($cvar->{options} =~ m/precision=(\d+)/i);

} elsif ($cvar->{type} eq 'select') {
$cvar->{OPTIONS} = [ map { { 'value' => $_ } } split(m/\#\#/, $cvar->{options}) ];
}

my ($act_var, $valid);
if ($params{trans_id}) {
my @values = (conv_i($cvar->{id}), conv_i($params{trans_id}), $sub_module);

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}, sub_module => $params{sub_module});
} else {
$valid = !$cvar->{flag_defaults_to_invalid};
}

if ($act_var) {
$cvar->{value} = $cvar->{type} eq 'date' ? $act_var->{date_value}
: $cvar->{type} eq 'timestamp' ? $act_var->{timestamp_value}
: $cvar->{type} eq 'number' ? $act_var->{number_value}
: $cvar->{type} eq 'customer' ? $act_var->{number_value}
: $cvar->{type} eq 'vendor' ? $act_var->{number_value}
: $cvar->{type} eq 'part' ? $act_var->{number_value}
: $cvar->{type} eq 'bool' ? $act_var->{bool_value}
: $act_var->{text_value};
$cvar->{valid} = $valid;
} else {
$cvar->{valid} = $valid // 1;

if ($cvar->{type} eq 'date') {
if ($cvar->{default_value} eq 'NOW') {
$cvar->{value} = $cvar->{current_date};
} else {
$cvar->{value} = $cvar->{default_value};
}

} elsif ($cvar->{type} eq 'timestamp') {
if ($cvar->{default_value} eq 'NOW') {
$cvar->{value} = $cvar->{current_timestamp};
} else {
$cvar->{value} = $cvar->{default_value};
}

} elsif ($cvar->{type} eq 'bool') {
$cvar->{value} = $cvar->{default_value} * 1;

} elsif ($cvar->{type} eq 'number') {
$cvar->{value} = $cvar->{default_value} * 1 if ($cvar->{default_value} ne '');

} else {
$cvar->{value} = $cvar->{default_value};
}
}

if ($cvar->{type} eq 'number') {
$cvar->{value} = $form->format_amount($myconfig, $cvar->{value} * 1, $cvar->{precision});
} elsif ($cvar->{type} eq 'customer') {
require SL::DB::Customer;
$cvar->{value} = SL::DB::Manager::Customer->find_by(id => $cvar->{value} * 1);
} elsif ($cvar->{type} eq 'vendor') {
require SL::DB::Vendor;
$cvar->{value} = SL::DB::Manager::Vendor->find_by(id => $cvar->{value} * 1);
} elsif ($cvar->{type} eq 'part') {
require SL::DB::Part;
$cvar->{value} = SL::DB::Manager::Part->find_by(id => $cvar->{value} * 1);
}
}

$h_var->finish();

$main::lxdebug->leave_sub();

return $custom_variables;
}

sub save_custom_variables {
my ($self, %params) = @_;
$main::lxdebug->enter_sub();

my $rc = SL::DB->client->with_transaction(\&_save_custom_variables, $self, %params);

$::lxdebug->leave_sub;
return $rc;
}

sub _save_custom_variables {
my $self = shift;
my %params = @_;

Common::check_params(\%params, qw(module trans_id variables));

my $myconfig = \%main::myconfig;
my $form = $main::form;

my $dbh = $params{dbh} || SL::DB->client->dbh;

my @configs = $params{configs} ? @{ $params{configs} } : grep { $_->{module} eq $params{module} } @{ CVar->get_configs() };

my $query =
qq|DELETE FROM custom_variables
WHERE (trans_id = ?)
AND (config_id IN (SELECT DISTINCT id
FROM custom_variable_configs
WHERE module = ?))|;
my @values = (conv_i($params{trans_id}), $params{module});

if ($params{sub_module}) {
$query .= qq| AND (sub_module = ?)|;
push @values, $params{sub_module};
}

do_query($form, $dbh, $query, @values);

$query =
qq|INSERT INTO custom_variables (config_id, sub_module, trans_id, bool_value, timestamp_value, text_value, number_value)
VALUES (?, ?, ?, ?, ?, ?, ?)|;
my $sth = prepare_query($form, $dbh, $query);

foreach my $config (@configs) {
if ($params{save_validity}) {
my $valid_index = "$params{name_prefix}cvar_$config->{name}$params{name_postfix}_valid";
my $new_valid = $params{variables}{$valid_index} || $params{always_valid} ? 1 : 0;
my $old_valid = $self->get_custom_variables_validity(trans_id => $params{tran