X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=catalogue%2Fitemsearch.pl;h=72074a8fdf843a21334c4da86eee99d0d933c7a5;hb=3bf31ae4d4dec818c48b4833e128d0a49c3419f3;hp=21ee163d4c703b37417a490e9edb7c2d23e46962;hpb=632c78c073cc7f658442252e9d69cd689bcb2730;p=koha-ffzg.git diff --git a/catalogue/itemsearch.pl b/catalogue/itemsearch.pl index 21ee163d4c..72074a8fdf 100755 --- a/catalogue/itemsearch.pl +++ b/catalogue/itemsearch.pl @@ -3,64 +3,72 @@ # # This file is part of Koha # -# 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 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. +# 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, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . use Modern::Perl; use CGI; -use JSON; +use JSON qw( to_json ); -use C4::Auth; -use C4::Output; -use C4::Items; -use C4::Biblio; -use C4::Koha; +use C4::Auth qw( get_template_and_user ); +use C4::Output qw( output_with_http_headers output_html_with_http_headers ); +use C4::Items qw( SearchItems ); +use C4::Koha qw( GetAuthorisedValues ); +use Koha::AuthorisedValues; +use Koha::Biblios; use Koha::Item::Search::Field qw(GetItemSearchFields); use Koha::ItemTypes; use Koha::Libraries; -my $cgi = new CGI; +my $cgi = CGI->new; my %params = $cgi->Vars; my $format = $cgi->param('format'); -my ($template_name, $content_type); +my $template_name = 'catalogue/itemsearch.tt'; + if (defined $format and $format eq 'json') { $template_name = 'catalogue/itemsearch_json.tt'; - $content_type = 'json'; # Map DataTables parameters with 'regular' parameters - $cgi->param('rows', $cgi->param('iDisplayLength')); - $cgi->param('page', ($cgi->param('iDisplayStart') / $cgi->param('iDisplayLength')) + 1); - my @columns = split /,/, $cgi->multi_param('sColumns'); - $cgi->param('sortby', $columns[ $cgi->param('iSortCol_0') ]); - $cgi->param('sortorder', $cgi->param('sSortDir_0')); + $cgi->param('rows', scalar $cgi->param('iDisplayLength')); + $cgi->param('page', (scalar $cgi->param('iDisplayStart') / scalar $cgi->param('iDisplayLength')) + 1); + my @columns = split /,/, scalar $cgi->param('sColumns'); + $cgi->param('sortby', $columns[ scalar $cgi->param('iSortCol_0') ]); + $cgi->param('sortorder', scalar $cgi->param('sSortDir_0')); my @f = $cgi->multi_param('f'); my @q = $cgi->multi_param('q'); push @q, '' if @q == 0; my @op = $cgi->multi_param('op'); my @c = $cgi->multi_param('c'); - foreach my $i (0 .. ($cgi->param('iColumns') - 1)) { + my $iColumns = $cgi->param('iColumns'); + foreach my $i (0 .. ($iColumns - 1)) { my $sSearch = $cgi->param("sSearch_$i"); if (defined $sSearch and $sSearch ne '') { my @words = split /\s+/, $sSearch; foreach my $word (@words) { push @f, $columns[$i]; - push @q, "%$word%"; - push @op, 'like'; push @c, 'and'; + + if ( grep { $_ eq $columns[$i] } qw( ccode homebranch holdingbranch location itype notforloan itemlost onloan ) ) { + push @q, "$word"; + push @op, '='; + } else { + push @q, "%$word%"; + push @op, 'like'; + } } } } @@ -73,27 +81,31 @@ if (defined $format and $format eq 'json') { # Retrieve all results $cgi->param('rows', 0); -} else { - $format = 'html'; - $template_name = 'catalogue/itemsearch.tt'; - $content_type = 'html'; +} elsif (defined $format and $format eq 'barcodes') { + # Retrieve all results + $cgi->param('rows', 0); +} elsif (defined $format) { + die "Unsupported format $format"; } my ($template, $borrowernumber, $cookie) = get_template_and_user({ template_name => $template_name, query => $cgi, type => 'intranet', - authnotrequired => 0, flagsrequired => { catalogue => 1 }, }); -my $notforloan_avcode = GetAuthValCode('items.notforloan'); -my $notforloan_values = GetAuthorisedValues($notforloan_avcode); +my $mss = Koha::MarcSubfieldStructures->search({ frameworkcode => '', kohafield => 'items.itemlost', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] }); +my $itemlost_values = $mss->count ? GetAuthorisedValues($mss->next->authorised_value) : []; + +$mss = Koha::MarcSubfieldStructures->search({ frameworkcode => '', kohafield => 'items.withdrawn', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] }); +my $withdrawn_values = $mss->count ? GetAuthorisedValues($mss->next->authorised_value) : []; -my $location_avcode = GetAuthValCode('items.location'); -my $location_values = GetAuthorisedValues($location_avcode); +if ( Koha::MarcSubfieldStructures->search( { frameworkcode => '', kohafield => 'items.new_status' } )->count ) { + $template->param( has_new_status => 1 ); +} -if (scalar keys %params > 0) { +if ( defined $format ) { # Parameters given, it's a search my $filter = { @@ -101,14 +113,14 @@ if (scalar keys %params > 0) { filters => [], }; - foreach my $p (qw(homebranch location itype ccode issues datelastborrowed notforloan)) { + foreach my $p (qw(homebranch holdingbranch location itype ccode issues datelastborrowed notforloan itemlost withdrawn)) { if (my @q = $cgi->multi_param($p)) { if ($q[0] ne '') { my $f = { field => $p, query => \@q, }; - if (my $op = $cgi->param($p . '_op')) { + if (my $op = scalar $cgi->param($p . '_op')) { $f->{operator} = $op; } push @{ $filter->{filters} }, $f; @@ -127,10 +139,11 @@ if (scalar keys %params > 0) { my $q = shift @q; my $op = shift @op; if (defined $q and $q ne '') { + if (C4::Context->preference("marcflavour") ne "UNIMARC" && $field eq 'publicationyear') { + $field = 'copyrightdate'; + } + if ($i == 0) { - if (C4::Context->preference("marcflavour") ne "UNIMARC" && $field eq 'publicationyear') { - $field = 'copyrightdate'; - } $f = { field => $field, query => $q, @@ -154,12 +167,15 @@ if (scalar keys %params > 0) { push @{ $filter->{filters} }, $f; # Yes/No parameters - foreach my $p (qw(damaged itemlost)) { + foreach my $p (qw( damaged new_status )) { my $v = $cgi->param($p) // ''; my $f = { field => $p, query => 0, }; + if ( $p eq 'new_status' ) { + $f->{ifnull} = 0; + } if ($v eq 'yes') { $f->{operator} = '!='; push @{ $filter->{filters} }, $f; @@ -169,14 +185,29 @@ if (scalar keys %params > 0) { } } - if (my $itemcallnumber_from = $cgi->param('itemcallnumber_from')) { + # null/is not null parameters + foreach my $p (qw( onloan )) { + my $v = $cgi->param($p) // ''; + my $f = { + field => $p, + operator => "is", + }; + if ( $v eq 'IS NOT NULL' ) { + $f->{query} = "not null"; + } elsif ( $v eq 'IS NULL' ) { + $f->{query} = "null"; + } + push @{ $filter->{filters} }, $f unless ( $v eq "" ); + } + + if (my $itemcallnumber_from = scalar $cgi->param('itemcallnumber_from')) { push @{ $filter->{filters} }, { field => 'itemcallnumber', query => $itemcallnumber_from, operator => '>=', }; } - if (my $itemcallnumber_to = $cgi->param('itemcallnumber_to')) { + if (my $itemcallnumber_to = scalar $cgi->param('itemcallnumber_to')) { push @{ $filter->{filters} }, { field => 'itemcallnumber', query => $itemcallnumber_to, @@ -196,119 +227,98 @@ if (scalar keys %params > 0) { }; my ($results, $total_rows) = SearchItems($filter, $search_params); - if ($results) { - # Get notforloan labels - my $notforloan_map = {}; - foreach my $nfl_value (@$notforloan_values) { - $notforloan_map->{$nfl_value->{authorised_value}} = $nfl_value->{lib}; - } - # Get location labels - my $location_map = {}; - foreach my $loc_value (@$location_values) { - $location_map->{$loc_value->{authorised_value}} = $loc_value->{lib}; + if ($format eq 'barcodes') { + print $cgi->header({ + type => 'text/plain', + attachment => 'barcodes.txt', + }); + + foreach my $item (@$results) { + print $item->{barcode} . "\n"; } + exit; + } + if ($results) { foreach my $item (@$results) { - $item->{biblio} = GetBiblio($item->{biblionumber}); - ($item->{biblioitem}) = GetBiblioItemByBiblioNumber($item->{biblionumber}); - $item->{status} = $notforloan_map->{$item->{notforloan}}; - if (defined $item->{location}) { - $item->{location} = $location_map->{$item->{location}}; - } + my $biblio = Koha::Biblios->find( $item->{biblionumber} ); + $item->{biblio} = $biblio; + $item->{biblioitem} = $biblio->biblioitem->unblessed; + my $checkout = Koha::Checkouts->find({ itemnumber => $item->{itemnumber} }); + $item->{checkout} = $checkout; } } $template->param( - filter => $filter, + filter => $filter, search_params => $search_params, - results => $results, - total_rows => $total_rows, - search_done => 1, + results => $results, + total_rows => $total_rows, + user => Koha::Patrons->find( $borrowernumber ), ); - if ($format eq 'html') { - # Build pagination bar - my $url = '/cgi-bin/koha/catalogue/itemsearch.pl'; - my @params; - foreach my $p (keys %params) { - my @v = $cgi->multi_param($p); - push @params, map { "$p=" . $_ } @v; - } - $url .= '?' . join ('&', @params); - my $nb_pages = 1 + int($total_rows / $search_params->{rows}); - my $current_page = $search_params->{page}; - my $pagination_bar = pagination_bar($url, $nb_pages, $current_page, 'page'); + if ($format eq 'csv') { + print $cgi->header({ + type => 'text/csv', + attachment => 'items.csv', + }); - $template->param(pagination_bar => $pagination_bar); + for my $line ( split '\n', $template->output ) { + print "$line\n" unless $line =~ m|^\s*$|; + } + } elsif ($format eq 'json') { + $template->param(sEcho => scalar $cgi->param('sEcho')); + output_with_http_headers $cgi, $cookie, $template->output, 'json'; } + + exit; } -if ($format eq 'html') { - # Retrieve data required for the form. +# Display the search form - my @branches = map { value => $_->branchcode, label => $_->branchname }, Koha::Libraries->search( {}, { order_by => 'branchname' } ); - my @locations; - foreach my $location (@$location_values) { - push @locations, { - value => $location->{authorised_value}, - label => $location->{lib} // $location->{authorised_value}, - }; - } - my @itemtypes; - foreach my $itemtype ( Koha::ItemTypes->search ) { - push @itemtypes, { - value => $itemtype->itemtype, - label => $itemtype->translated_description, - }; - } - my $ccode_avcode = GetAuthValCode('items.ccode') || 'CCODE'; - my $ccodes = GetAuthorisedValues($ccode_avcode); - my @ccodes; - foreach my $ccode (@$ccodes) { - push @ccodes, { - value => $ccode->{authorised_value}, - label => $ccode->{lib}, - }; - } +my @branches = map { value => $_->branchcode, label => $_->branchname }, Koha::Libraries->search( {}, { order_by => 'branchname' } )->as_list; +my @itemtypes = map { value => $_->itemtype, label => $_->translated_description }, Koha::ItemTypes->search_with_localization->as_list; - my @notforloans; - foreach my $value (@$notforloan_values) { - push @notforloans, { - value => $value->{authorised_value}, - label => $value->{lib}, - }; - } - - my @items_search_fields = GetItemSearchFields(); +my @ccodes = Koha::AuthorisedValues->get_descriptions_by_koha_field({ kohafield => 'items.ccode' }); +foreach my $ccode (@ccodes) { + $ccode->{value} = $ccode->{authorised_value}, + $ccode->{label} = $ccode->{lib}, +} - my $authorised_values = {}; - foreach my $field (@items_search_fields) { - if (my $category = ($field->{authorised_values_category})) { - $authorised_values->{$category} = GetAuthorisedValues($category); - } - } +my @itemlosts; +foreach my $value (@$itemlost_values) { + push @itemlosts, { + value => $value->{authorised_value}, + label => $value->{lib}, + }; +} - $template->param( - branches => \@branches, - locations => \@locations, - itemtypes => \@itemtypes, - ccodes => \@ccodes, - notforloans => \@notforloans, - items_search_fields => \@items_search_fields, - authorised_values_json => to_json($authorised_values), - ); +my @withdrawns; +foreach my $value (@$withdrawn_values) { + push @withdrawns, { + value => $value->{authorised_value}, + label => $value->{lib}, + }; } -if ($format eq 'csv') { - print $cgi->header({ - type => 'text/csv', - attachment => 'items.csv', - }); +my @items_search_fields = GetItemSearchFields(); - for my $line ( split '\n', $template->output ) { - print "$line\n" unless $line =~ m|^\s*$|; +my $authorised_values = {}; +foreach my $field (@items_search_fields) { + if (my $category = ($field->{authorised_values_category})) { + $authorised_values->{$category} = GetAuthorisedValues($category); } -} else { - output_with_http_headers $cgi, $cookie, $template->output, $content_type; } + +$template->param( + branches => \@branches, + itemtypes => \@itemtypes, + ccodes => \@ccodes, + itemlosts => \@itemlosts, + withdrawns => \@withdrawns, + items_search_fields => \@items_search_fields, + authorised_values_json => to_json($authorised_values), +); + +output_html_with_http_headers $cgi, $cookie, $template->output;