X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=catalogue%2Fitemsearch.pl;h=2c68bfe35f30d669a08ff2ca778d4bb9db061d75;hb=7d8b96803f664d86762a6afb966051f7d565c40e;hp=27c899a5e4c6ecda2e704d9e9770432f234bf54c;hpb=df97814f3034a3d5015546c4eca21f08ae951e37;p=srvgit diff --git a/catalogue/itemsearch.pl b/catalogue/itemsearch.pl index 27c899a5e4..2c68bfe35f 100755 --- a/catalogue/itemsearch.pl +++ b/catalogue/itemsearch.pl @@ -3,18 +3,18 @@ # # 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; @@ -27,6 +27,8 @@ use C4::Items; use C4::Biblio; use C4::Koha; +use Koha::AuthorisedValues; +use Koha::Biblios; use Koha::Item::Search::Field qw(GetItemSearchFields); use Koha::ItemTypes; use Koha::Libraries; @@ -35,32 +37,39 @@ my $cgi = new CGI; 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 ) ) { + push @q, "$word"; + push @op, '='; + } else { + push @q, "%$word%"; + push @op, 'like'; + } } } } @@ -73,10 +82,11 @@ 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({ @@ -87,11 +97,11 @@ my ($template, $borrowernumber, $cookie) = get_template_and_user({ 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) : []; -my $location_avcode = GetAuthValCode('items.location'); -my $location_values = GetAuthorisedValues($location_avcode); +$mss = Koha::MarcSubfieldStructures->search({ frameworkcode => '', kohafield => 'items.withdrawn', authorised_value => [ -and => {'!=' => undef }, {'!=' => ''}] }); +my $withdrawn_values = $mss->count ? GetAuthorisedValues($mss->next->authorised_value) : []; if (scalar keys %params > 0) { # Parameters given, it's a search @@ -101,14 +111,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 +137,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,7 +165,7 @@ if (scalar keys %params > 0) { push @{ $filter->{filters} }, $f; # Yes/No parameters - foreach my $p (qw(damaged itemlost)) { + foreach my $p (qw( damaged )) { my $v = $cgi->param($p) // ''; my $f = { field => $p, @@ -169,14 +180,14 @@ if (scalar keys %params > 0) { } } - if (my $itemcallnumber_from = $cgi->param('itemcallnumber_from')) { + 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,26 +207,24 @@ 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; } } @@ -224,91 +233,75 @@ if (scalar keys %params > 0) { search_params => $search_params, results => $results, total_rows => $total_rows, - search_done => 1, ); - 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'; } -} -if ($format eq 'html') { - # Retrieve data required for the form. + exit; +} - 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}, - }; - } +# Display the search form - my @notforloans; - foreach my $value (@$notforloan_values) { - push @notforloans, { - value => $value->{authorised_value}, - label => $value->{lib}, - }; - } +my @branches = map { value => $_->branchcode, label => $_->branchname }, Koha::Libraries->search( {}, { order_by => 'branchname' } ); +my @itemtypes; +foreach my $itemtype ( Koha::ItemTypes->search ) { + push @itemtypes, { + value => $itemtype->itemtype, + label => $itemtype->translated_description, + }; +} - 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;