Koha/C4/Utils/DataTables/VirtualShelves.pm
Jonathan Druart 0c96e57b0c
Bug 34913: Fix perlcritic for VirtualShelves.pm
C4/Utils/DataTables/VirtualShelves.pm: "@order_by" is declared but not used at line 86, column 9.  Unused variables clutter code and make it harder to read.  (Severity: 3)

Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
2024-01-29 12:24:54 +01:00

199 lines
5.7 KiB
Perl

package C4::Utils::DataTables::VirtualShelves;
use Modern::Perl;
use C4::Context;
use Koha::Virtualshelves;
sub search {
my ( $params ) = @_;
my $shelfname = $params->{shelfname};
my $count = $params->{count};
my $owner = $params->{owner};
my $sortby = $params->{sortby};
my $public = $params->{public} // 1;
$public = $public ? 1 : 0;
my $order_by = $params->{order_by};
my $start = $params->{start};
my $length = $params->{length};
# If not logged in user, be carreful and set the borrowernumber to 0
# to prevent private lists lack
my $loggedinuser = C4::Context->userenv->{'number'} || 0;
my ($recordsTotal, $recordsFiltered);
my $dbh = C4::Context->dbh;
# FIXME refactore the following queries
# We should call Koha::Virtualshelves
my $select = q|
SELECT vs.shelfnumber, vs.shelfname, vs.owner, vs.public AS public,
vs.created_on, vs.lastmodified as modification_time,
bo.surname, bo.firstname, vs.sortfield as sortby,
count(vc.biblionumber) as count
|;
my $from_total = q|
FROM virtualshelves vs
LEFT JOIN borrowers bo ON vs.owner=bo.borrowernumber
|;
my $from = $from_total . q|
LEFT JOIN virtualshelfcontents vc USING( shelfnumber )
|;
my @args;
# private
if ( !$public ) {
my $join_vs = q|
LEFT JOIN virtualshelfshares sh ON sh.shelfnumber = vs.shelfnumber
AND sh.borrowernumber = ?
|;
$from .= $join_vs;
$from_total .= $join_vs;
push @args, $loggedinuser;
}
my @where_strs;
if ( defined $shelfname and $shelfname ne '' ) {
push @where_strs, 'shelfname LIKE ?';
push @args, "%$shelfname%";
}
if ( defined $owner and $owner ne '' ) {
push @where_strs, '( bo.firstname LIKE ? OR bo.surname LIKE ? )';
push @args, "%$owner%", "%$owner%";
}
if ( defined $sortby and $sortby ne '' ) {
push @where_strs, 'sortfield = ?';
push @args, $sortby;
}
push @where_strs, 'public = ?';
push @args, $public;
if ( !$public ) {
push @where_strs, '(vs.owner = ? OR sh.borrowernumber = ?)';
push @args, $loggedinuser, $loggedinuser;
}
my $where;
$where = " WHERE " . join (" AND ", @where_strs) if @where_strs;
if ($order_by) {
$order_by =~ s|shelfnumber|vs.shelfnumber|;
my @sanitized_orderbys;
for my $order ( split ',', $order_by ) {
my ( $identifier, $direction ) = split / /, $order, 2;
my ( $table, $column ) = split /\./, $identifier, 2;
my $sanitized_identifier = $dbh->quote_identifier( undef, $table, $column );
my $sanitized_direction = $direction eq 'asc' ? 'ASC' : 'DESC';
push @sanitized_orderbys, "$sanitized_identifier $sanitized_direction";
}
$order_by = ' ORDER BY ' . join( ',', @sanitized_orderbys );
}
my $limit;
# If length == -1, we want to display all shelves
if ( $length > -1 ) {
# In order to avoid sql injection
$start =~ s/\D//g;
$length =~ s/\D//g;
$start //= 0;
$length //= 20;
$limit = sprintf "LIMIT %s,%s", $start, $length;
}
my $group_by = " GROUP BY vs.shelfnumber, vs.shelfname, vs.owner, vs.public,
vs.created_on, vs.lastmodified, bo.surname, bo.firstname, vs.sortfield ";
my $query = join(
" ",
$select,
$from,
($where ? $where : ""),
$group_by,
($order_by ? $order_by : ""),
($limit ? $limit : "")
);
my $shelves = $dbh->selectall_arrayref( $query, { Slice => {} }, @args );
# Get the recordsFiltered DataTable variable
$query = "SELECT COUNT(vs.shelfnumber) " . $from_total . ($where ? $where : "");
($recordsFiltered) = $dbh->selectrow_array( $query, undef, @args );
# Get the recordsTotal DataTable variable
$query = q|SELECT COUNT(vs.shelfnumber)| . $from_total . q| WHERE public = ?|;
$query .= q| AND (vs.owner = ? OR sh.borrowernumber = ?)| if !$public;
@args = !$public ? ( $loggedinuser, $public, $loggedinuser, $loggedinuser ) : ( $public );
( $recordsTotal ) = $dbh->selectrow_array( $query, undef, @args );
for my $shelf ( @$shelves ) {
my $s = Koha::Virtualshelves->find( $shelf->{shelfnumber} );
$shelf->{can_manage_shelf} = $s->can_be_managed( $loggedinuser );
$shelf->{can_delete_shelf} = $s->can_be_deleted( $loggedinuser );
$shelf->{is_shared} = $s->is_shared;
}
return {
recordsTotal => $recordsTotal,
recordsFiltered => $recordsFiltered,
shelves => $shelves,
}
}
1;
__END__
=head1 NAME
C4::Utils::DataTables::VirtualShelves - module for using DataTables with virtual shelves
=head1 SYNOPSIS
This module provides routines used by the virtual shelves search
=head2 FUNCTIONS
=head3 search
my $dt_infos = C4::Utils::DataTables::VirtualShelves->search($params);
$params is a hashref with some keys:
=over 4
=item shelfname
=item count
=item sortby
=item type
=item dt_params
=cut
=back
=head1 LICENSE
This file is part of Koha.
Copyright 2014 BibLibre
Koha is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
Koha is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Koha; if not, see <http://www.gnu.org/licenses>.