X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FPE.pm;h=4d7176dd22f20a70792c5ce610c7fef431662607;hb=b29878cbc8a4fa1e0959fca593a91242894315fd;hp=9c17b524fb9ca8f65d31061be1bcfb37d71bef8a;hpb=ee072e4f077213bf6f8792ca8f0a1afebbb6282f;p=kivitendo-erp.git diff --git a/SL/PE.pm b/SL/PE.pm index 9c17b524f..4d7176dd2 100644 --- a/SL/PE.pm +++ b/SL/PE.pm @@ -28,14 +28,19 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #====================================================================== # -# Project module -# also used for partsgroups +# Partsgroups and pricegroups # #====================================================================== package PE; -sub projects { +use Data::Dumper; + +use SL::DBUtils; + +use strict; + +sub partsgroups { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; @@ -43,53 +48,43 @@ sub projects { # 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|; + my ($where, @values); - 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->{partsgroup}) { + $where .= qq| AND partsgroup ILIKE ?|; + push(@values, '%' . $form->{partsgroup} . '%'); } + 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)"; + $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) |; } - $query .= qq| - ORDER BY $sortorder|; + substr($where, 0, 4) = "WHERE " if ($where); - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); + my $sortorder = $form->{sort} ? $form->{sort} : "partsgroup"; + $sortorder =~ s/[^a-z_]//g; - my $i = 0; - while (my $ref = $sth->fetchrow_hashref(NAME_lc)) { - push @{ $form->{project_list} }, $ref; - $i++; - } + 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 get_project { +sub save_partsgroup { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; @@ -97,36 +92,56 @@ sub get_project { # 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); + $form->{discount} /= 100; - my $ref = $sth->fetchrow_hashref(NAME_lc); + my @values = ($form->{partsgroup}); + my $query; - map { $form->{$_} = $ref->{$_} } keys %$ref; + if ($form->{id}) { + $query = qq|UPDATE partsgroup SET partsgroup = ? WHERE id = ?|; + push(@values, $form->{id}); + } else { + $query = qq|INSERT INTO partsgroup (partsgroup) VALUES (?)|; + } + do_query($form, $dbh, $query, @values); - $sth->finish; + $dbh->disconnect; - # 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); + $main::lxdebug->leave_sub(); +} - ($form->{orphaned}) = $sth->fetchrow_array; - $form->{orphaned} = !$form->{orphaned}; +sub get_partsgroup { + $main::lxdebug->enter_sub(); + my ($self, $myconfig, $form) = @_; + + # connect to database + my $dbh = $form->dbconnect($myconfig); + + 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(); } -sub save_project { +sub delete_tuple { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; @@ -134,109 +149,100 @@ sub save_project { # connect to database my $dbh = $form->dbconnect($myconfig); - map { $form->{$_} =~ s/\'/\'\'/g } (projectnumber, description); + my $table = $form->{type} eq "pricegroup" ? "pricegroup" : "partsgroup"; - 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); + my $query = qq|DELETE FROM $table WHERE id = ?|; + do_query($form, $dbh, $query, $form->{id}); $dbh->disconnect; $main::lxdebug->leave_sub(); } -sub partsgroups { +########################## +# get pricegroups from database +# +sub pricegroups { $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'"; + if ($form->{pricegroup}) { + $where .= qq| AND pricegroup ILIKE ?|; + push(@values, '%' . $form->{pricegroup} . '%'); } - $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|; + 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|) |; } - $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} }); } -sub save_partsgroup { +######################## +# save pricegruop to database +# +sub save_pricegroup { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; # connect to database my $dbh = $form->dbconnect($myconfig); - - map { $form->{$_} =~ s/\'/\'\'/g } (partsgroup); + my $query; $form->{discount} /= 100; + my @values = ($form->{pricegroup}); + if ($form->{id}) { - $query = qq|UPDATE partsgroup SET - partsgroup = '$form->{partsgroup}' - WHERE id = $form->{id}|; + $query = qq|UPDATE pricegroup SET pricegroup = ? WHERE id = ? |; + push(@values, $form->{id}); } else { - $query = qq|INSERT INTO partsgroup - (partsgroup) - VALUES ('$form->{partsgroup}')|; + $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(); } -sub get_partsgroup { +############################ +# get one pricegroup from database +# +sub get_pricegroup { $main::lxdebug->enter_sub(); my ($self, $myconfig, $form) = @_; @@ -244,46 +250,27 @@ 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 $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 parts p - WHERE p.partsgroup_id = $form->{id}|; - $sth = $dbh->prepare($query); - $sth->execute || $form->dberror($query); + my $first = 1; - ($form->{orphaned}) = $sth->fetchrow_array; - $form->{orphaned} = !$form->{orphaned}; - - $sth->finish; - - $dbh->disconnect; - - $main::lxdebug->leave_sub(); -} - -sub delete_tuple { - $main::lxdebug->enter_sub(); - - my ($self, $myconfig, $form) = @_; - - # connect to database - my $dbh = $form->dbconnect($myconfig); + 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}); + } - $query = qq|DELETE FROM $form->{type} - WHERE id = $form->{id}|; - $dbh->do($query) || $form->dberror($query); + ($form->{orphaned}) = selectrow_query($form, $dbh, $query, @values); + $form->{orphaned} = !$form->{orphaned}; $dbh->disconnect;