X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FPE.pm;h=4d7176dd22f20a70792c5ce610c7fef431662607;hb=a8b18c65bfd47c845e641fb0fff9587f4122bf9d;hp=1532e79cee9d4041f3cbaab362c8716ecdb19822;hpb=07d71c33315605fcfc450d3b9abf0fd10e92bed5;p=kivitendo-erp.git diff --git a/SL/PE.pm b/SL/PE.pm index 1532e79ce..4d7176dd2 100644 --- a/SL/PE.pm +++ b/SL/PE.pm @@ -28,8 +28,7 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #====================================================================== # -# Project module -# also used for partsgroups +# Partsgroups and pricegroups # #====================================================================== @@ -37,177 +36,52 @@ package PE; use Data::Dumper; -sub projects { - $main::lxdebug->enter_sub(); - - my ($self, $myconfig, $form) = @_; - - # connect to database - my $dbh = $form->dbconnect($myconfig); - - my $sortorder = ($form->{sort}) ? $form->{sort} : "projectnumber"; - - my $query = qq|SELECT p.id, p.projectnumber, p.description - FROM project p - WHERE 1 = 1|; - - if ($form->{projectnumber}) { - my $projectnumber = $form->like(lc $form->{projectnumber}); - $query .= " AND lower(projectnumber) LIKE '$projectnumber'"; - } - if ($form->{projectdescription}) { - my $description = $form->like(lc $form->{projectdescription}); - $query .= " AND lower(description) LIKE '$description'"; - } - if ($form->{status} eq 'orphaned') { - $query .= " AND id NOT IN (SELECT p.id - FROM project p, acc_trans a - WHERE p.id = a.project_id) - AND id NOT IN (SELECT p.id - FROM project p, invoice i - WHERE p.id = i.project_id) - AND id NOT IN (SELECT p.id - FROM project p, orderitems o - WHERE p.id = o.project_id)"; - } - - $query .= qq| - ORDER BY $sortorder|; - - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); - - my $i = 0; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - push @{ $form->{project_list} }, $ref; - $i++; - } - - $sth->finish; - $dbh->disconnect; - - $main::lxdebug->leave_sub(); - - return $i; -} - -sub get_project { - $main::lxdebug->enter_sub(); - - my ($self, $myconfig, $form) = @_; - - # connect to database - my $dbh = $form->dbconnect($myconfig); - - my $query = qq|SELECT p.* - FROM project p - WHERE p.id = $form->{id}|; - my $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); +use SL::DBUtils; - my $ref = $sth->fetchrow_hashref(NAME_lc); - - map { $form->{$_} = $ref->{$_} } keys %$ref; - - $sth->finish; - - # check if it is orphaned - $query = qq|SELECT count(*) - FROM acc_trans a - WHERE a.project_id = $form->{id}|; - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); - - ($form->{orphaned}) = $sth->fetchrow_array; - $form->{orphaned} = !$form->{orphaned}; - - $sth->finish; - - $dbh->disconnect; - - $main::lxdebug->leave_sub(); -} - -sub save_project { - $main::lxdebug->enter_sub(); - - my ($self, $myconfig, $form) = @_; - - # connect to database - my $dbh = $form->dbconnect($myconfig); - - map { $form->{$_} =~ s/\'/\'\'/g } (projectnumber, description); - - if ($form->{id}) { - $query = qq|UPDATE project SET - projectnumber = '$form->{projectnumber}', - description = '$form->{description}' - WHERE id = $form->{id}|; - } else { - $query = qq|INSERT INTO project - (projectnumber, description) - VALUES ('$form->{projectnumber}', '$form->{description}')|; - } - $dbh->do($query) || $form->dberror($query); - - $dbh->disconnect; - - $main::lxdebug->leave_sub(); -} +use strict; sub partsgroups { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; - my $var; - # connect to database my $dbh = $form->dbconnect($myconfig); - my $sortorder = ($form->{sort}) ? $form->{sort} : "partsgroup"; - - my $query = qq|SELECT g.* - FROM partsgroup g|; - - my $where = "1 = 1"; + my ($where, @values); if ($form->{partsgroup}) { - $var = $form->like(lc $form->{partsgroup}); - $where .= " AND lower(g.partsgroup) LIKE '$var'"; + $where .= qq| AND partsgroup ILIKE ?|; + push(@values, '%' . $form->{partsgroup} . '%'); } - $query .= qq| - WHERE $where - ORDER BY $sortorder|; if ($form->{status} eq 'orphaned') { - $query = qq|SELECT g.* - FROM partsgroup g - LEFT JOIN parts p ON (p.partsgroup_id = g.id) - WHERE $where - EXCEPT - SELECT g.* - FROM partsgroup g - JOIN parts p ON (p.partsgroup_id = g.id) - WHERE $where - ORDER BY $sortorder|; + $where .= + qq| AND id NOT IN | . + qq| (SELECT DISTINCT partsgroup_id FROM parts | . + qq| WHERE NOT partsgroup_id ISNULL | . + qq| UNION | . + qq| SELECT DISTINCT partsgroup_id FROM custom_variable_config_partsgroups | . + qq| WHERE NOT partsgroup_id ISNULL) |; } - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); + substr($where, 0, 4) = "WHERE " if ($where); - my $i = 0; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - push @{ $form->{item_list} }, $ref; - $i++; - } + my $sortorder = $form->{sort} ? $form->{sort} : "partsgroup"; + $sortorder =~ s/[^a-z_]//g; + + my $query = + qq|SELECT id, partsgroup FROM partsgroup | . + $where . + qq|ORDER BY $sortorder|; + + $form->{item_list} = selectall_hashref_query($form, $dbh, $query, @values); - $sth->finish; $dbh->disconnect; $main::lxdebug->leave_sub(); - return $i; + return scalar(@{ $form->{item_list} }); } sub save_partsgroup { @@ -218,20 +92,18 @@ sub save_partsgroup { # connect to database my $dbh = $form->dbconnect($myconfig); - map { $form->{$_} =~ s/\'/\'\'/g } (partsgroup); - $form->{discount} /= 100; + my @values = ($form->{partsgroup}); + my $query; + if ($form->{id}) { - $query = qq|UPDATE partsgroup SET - partsgroup = '$form->{partsgroup}' - WHERE id = $form->{id}|; + $query = qq|UPDATE partsgroup SET partsgroup = ? WHERE id = ?|; + push(@values, $form->{id}); } else { - $query = qq|INSERT INTO partsgroup - (partsgroup) - VALUES ('$form->{partsgroup}')|; + $query = qq|INSERT INTO partsgroup (partsgroup) VALUES (?)|; } - $dbh->do($query) || $form->dberror($query); + do_query($form, $dbh, $query, @values); $dbh->disconnect; @@ -246,32 +118,26 @@ sub get_partsgroup { # connect to database my $dbh = $form->dbconnect($myconfig); - my $query = qq|SELECT p.* - FROM partsgroup p - WHERE p.id = $form->{id}|; - my $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); - - my $ref = $sth->fetchrow_hashref(NAME_lc); - - map { $form->{$_} = $ref->{$_} } keys %$ref; - - $sth->finish; - - # check if it is orphaned - $query = qq|SELECT count(*) - FROM parts p - WHERE p.partsgroup_id = $form->{id}|; - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); - - ($form->{orphaned}) = $sth->fetchrow_array; - $form->{orphaned} = !$form->{orphaned}; + my $query = + qq|SELECT pg.*, | . + qq|(SELECT COUNT(*) FROM parts WHERE partsgroup_id = ?) = 0 AS orphaned | . + qq|FROM partsgroup pg | . + qq|WHERE pg.id = ?|; + my $sth = prepare_execute_query($form, $dbh, $query, $form->{id}, + $form->{id}); + my $ref = $sth->fetchrow_hashref("NAME_lc"); + map({ $form->{$_} = $ref->{$_} } keys(%{$ref})); $sth->finish; $dbh->disconnect; + # also not orphaned if partsgroup is selected for a cvar filter + if ($form->{orphaned}) { + my $cvar_count = scalar( @{ SL::DB::PartsGroup->new(id => $form->{id})->custom_variable_configs } ); + $form->{orphaned} = !$cvar_count; + } + $main::lxdebug->leave_sub(); } @@ -283,9 +149,10 @@ sub delete_tuple { # connect to database my $dbh = $form->dbconnect($myconfig); - $query = qq|DELETE FROM $form->{type} - WHERE id = $form->{id}|; - $dbh->do($query) || $form->dberror($query); + my $table = $form->{type} eq "pricegroup" ? "pricegroup" : "partsgroup"; + + my $query = qq|DELETE FROM $table WHERE id = ?|; + do_query($form, $dbh, $query, $form->{id}); $dbh->disconnect; @@ -300,56 +167,49 @@ sub pricegroups { my ($self, $myconfig, $form) = @_; - my $var; - # connect to database my $dbh = $form->dbconnect($myconfig); - my $sortorder = ($form->{sort}) ? $form->{sort} : "pricegroup"; - - my $query = qq|SELECT g.id, g.pricegroup - FROM pricegroup g|; - - my $where = "1 = 1"; + my ($where, @values); if ($form->{pricegroup}) { - $var = $form->like(lc $form->{pricegroup}); - $where .= " AND lower(g.pricegroup) LIKE '$var'"; + $where .= qq| AND pricegroup ILIKE ?|; + push(@values, '%' . $form->{pricegroup} . '%'); } - $query .= qq| - WHERE $where - ORDER BY $sortorder|; if ($form->{status} eq 'orphaned') { - $query = qq|SELECT pg.* - FROM pricegroup pg - LEFT JOIN prices p ON (p.pricegroup_id = pg.id) - WHERE $where - EXCEPT - SELECT pg.* - FROM pricegroup pg - JOIN prices p ON (p.pricegroup_id = pg.id) - WHERE $where - ORDER BY $sortorder|; + my $first = 1; + + $where .= qq| AND id NOT IN (|; + foreach my $table (qw(invoice orderitems prices)) { + $where .= "UNION " unless ($first); + $first = 0; + $where .= + qq|SELECT DISTINCT pricegroup_id FROM $table | . + qq|WHERE NOT pricegroup_id ISNULL |; + } + $where .= qq|) |; } -print STDERR "asdfasdf-$query\n"; - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); + substr($where, 0, 4) = "WHERE " if ($where); - my $i = 0; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - push @{ $form->{item_list} }, $ref; - $i++; - } + my $sortorder = $form->{sort} ? $form->{sort} : "pricegroup"; + $sortorder =~ s/[^a-z_]//g; + + my $query = + qq|SELECT id, pricegroup FROM pricegroup | . + $where . + qq|ORDER BY $sortorder|; + + $form->{item_list} = selectall_hashref_query($form, $dbh, $query, @values); - $sth->finish; $dbh->disconnect; $main::lxdebug->leave_sub(); - return $i; + return scalar(@{ $form->{item_list} }); } + ######################## # save pricegruop to database # @@ -360,63 +220,60 @@ sub save_pricegroup { # connect to database my $dbh = $form->dbconnect($myconfig); - - map { $form->{$_} =~ s/\'/\'\'/g } (pricegroup); + my $query; $form->{discount} /= 100; + my @values = ($form->{pricegroup}); + if ($form->{id}) { - $query = qq|UPDATE pricegroup SET - pricegroup = '$form->{pricegroup}' - WHERE id = $form->{id}|; + $query = qq|UPDATE pricegroup SET pricegroup = ? WHERE id = ? |; + push(@values, $form->{id}); } else { - $query = qq|INSERT INTO pricegroup - (pricegroup) - VALUES ('$form->{pricegroup}')|; + $query = qq|INSERT INTO pricegroup (pricegroup) VALUES (?)|; } - $dbh->do($query) || $form->dberror($query); + do_query($form, $dbh, $query, @values); $dbh->disconnect; $main::lxdebug->leave_sub(); } + ############################ # get one pricegroup from database # sub get_pricegroup { $main::lxdebug->enter_sub(); -print STDERR "PE.pm-get_pricegroup\n"; + my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); - my $query = qq|SELECT p.id, p.pricegroup - FROM pricegroup p - WHERE p.id = $form->{id}|; - my $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); + my $query = qq|SELECT id, pricegroup FROM pricegroup WHERE id = ?|; + my $sth = prepare_execute_query($form, $dbh, $query, $form->{id}); + my $ref = $sth->fetchrow_hashref("NAME_lc"); - my $ref = $sth->fetchrow_hashref(NAME_lc); - - map { $form->{$_} = $ref->{$_} } keys %$ref; + map({ $form->{$_} = $ref->{$_} } keys(%{$ref})); $sth->finish; - # check if it is orphaned - $query = qq|SELECT count(*) - FROM prices p - WHERE p.pricegroup_id = $form->{id}|; - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); + my $first = 1; - ($form->{orphaned}) = $sth->fetchrow_array; - $form->{orphaned} = !$form->{orphaned}; + my @values = (); + $query = qq|SELECT |; + foreach my $table (qw(invoice orderitems prices)) { + $query .= " + " unless ($first); + $first = 0; + $query .= qq|(SELECT COUNT(*) FROM $table WHERE pricegroup_id = ?) |; + push(@values, $form->{id}); + } - $sth->finish; + ($form->{orphaned}) = selectrow_query($form, $dbh, $query, @values); + $form->{orphaned} = !$form->{orphaned}; $dbh->disconnect; -#print (STDERR " ", Dumper($form)); + $main::lxdebug->leave_sub(); }