MT 1587 (Follow-up) : CSV export for cart and shelves (export_format table creation)
[koha.git] / C4 / Search.pm
index 7e72182..3f4ee15 100644 (file)
@@ -30,6 +30,7 @@ use C4::Branch;
 use C4::Debug;
 use YAML;
 use URI::Escape;
+use C4::Charset;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG);
 
@@ -60,6 +61,7 @@ This module provides searching functions for Koha's bibliographic databases
   &FindDuplicate
   &SimpleSearch
   &searchResults
+  &SearchAcquisitions
   &getRecords
   &buildQuery
   &NZgetRecords
@@ -445,6 +447,7 @@ sub getRecords {
                     # not an index scan
                     else {
                         $record = $results[ $i - 1 ]->record($j)->raw();
+                       warn $results[$i-1]->record($j)->render() ;
 
                         # warn "RECORD $j:".$record;
                         $results_hash->{'RECORDS'}[$j] = $record;
@@ -937,6 +940,7 @@ sub getIndexes{
                     'holdingbranch',
                     'homebranch',
                     'issues',
+                    'item',
                     'itemnumber',
                     'itype',
                     'Local-classification',
@@ -1337,7 +1341,6 @@ sub searchResults {
     my ( $searchdesc, $hits, $results_per_page, $offset, $scan, @marcresults ) = @_;
     my $dbh = C4::Context->dbh;
     my @newresults;
-
     #Build branchnames hash
     #find branchname
     #get branch information.....
@@ -1404,15 +1407,16 @@ sub searchResults {
     # loop through all of the records we've retrieved
     for ( my $i = $offset ; $i <= $times - 1 ; $i++ ) {
         my $marcrecord = MARC::File::USMARC::decode( $marcresults[$i] );
+           SetUTF8Flag($marcrecord);
                my $biblionumber;
-        
+
         if(not $scan){
             if ($bibliotag<10){
-                $biblionumber = $marcrecord->field($bibliotag)->data;
+                $biblionumber = $marcrecord->field($bibliotag) ? $marcrecord->field($bibliotag)->data : undef;
             }else{
                 $biblionumber = $marcrecord->subfield($bibliotag,$bibliosubf);
             } 
-            $fw = GetFrameworkCode($biblionumber);
+            $fw = (defined $biblionumber) ? GetFrameworkCode($biblionumber) : '';
         }
         
         my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, $fw );
@@ -1548,6 +1552,7 @@ sub searchResults {
                                $onloan_items->{$key}->{itemcallnumber} = $item->{itemcallnumber};
                                $onloan_items->{$key}->{imageurl} = getitemtypeimagelocation( 'opac', $itemtypes{ $item->{itype} }->{imageurl} );
                                $onloan_items->{$key}->{barcode} = $item->{barcode};
+                               $onloan_items->{$key}->{reserved} = $item->{reserved};
                 # if something's checked out and lost, mark it as 'long overdue'
                 if ( $item->{itemlost} ) {
                     $onloan_items->{$prefix}->{longoverdue}++;
@@ -1672,7 +1677,7 @@ sub searchResults {
         # XSLT processing of some stuff
         if (C4::Context->preference("XSLTResultsDisplay") && !$scan) {
             $oldbiblio->{XSLTResultsRecord} = XSLTParse4Display(
-                $oldbiblio->{biblionumber}, $marcrecord, 'Results' );
+                $oldbiblio->{biblionumber}, $marcrecord, C4::Context->preference("XSLTResultsDisplay") );
         }
 
         # last check for norequest : if itemtype is notforloan, it can't be reserved either, whatever the items
@@ -1703,6 +1708,95 @@ sub searchResults {
     return @newresults;
 }
 
+=head2 SearchAcquisitions
+    Search for acquisitions 
+=cut
+
+sub SearchAcquisitions{
+    my ($datebegin, $dateend, $itemtypes,$criteria, $orderby) = @_;
+    
+    my $dbh=C4::Context->dbh;
+    # Variable initialization
+    my $str=qq|
+    SELECT marcxml 
+    FROM biblio 
+    LEFT JOIN biblioitems ON biblioitems.biblionumber=biblio.biblionumber
+    LEFT JOIN items ON items.biblionumber=biblio.biblionumber
+    WHERE dateaccessioned BETWEEN ? AND ? 
+    |;
+    
+    my (@params,@loopcriteria);
+    
+    push @params, $datebegin->output("iso");
+    push @params, $dateend->output("iso");
+
+    if (scalar(@$itemtypes)>0 and $criteria ne "itemtype" ){
+        if(C4::Context->preference("item-level_itypes")){
+            $str .= "AND items.itype IN (?".( ',?' x scalar @$itemtypes - 1 ).") ";
+        }else{
+            $str .= "AND biblioitems.itemtype IN (?".( ',?' x scalar @$itemtypes - 1 ).") ";
+        }    
+        push @params, @$itemtypes;
+    }
+        
+    if ($criteria =~/itemtype/){
+        if(C4::Context->preference("item-level_itypes")){
+            $str .= "AND items.itype=? ";
+        }else{
+            $str .= "AND biblioitems.itemtype=? ";
+        }
+        
+        if(scalar(@$itemtypes) == 0){
+            my $itypes = GetItemTypes();
+            for my $key (keys %$itypes){
+                push @$itemtypes, $key;
+            }
+        }
+        
+        @loopcriteria= @$itemtypes;
+    }elsif ($criteria=~/itemcallnumber/){
+        $str .= "AND (items.itemcallnumber LIKE CONCAT(?,'%') 
+                 OR items.itemcallnumber is NULL
+                 OR items.itemcallnumber = '')";
+
+        @loopcriteria = ("AA".."ZZ", "") unless (scalar(@loopcriteria)>0);  
+    }else {
+        $str .= "AND biblio.title LIKE CONCAT(?,'%') ";
+        @loopcriteria = ("A".."z") unless (scalar(@loopcriteria)>0);  
+    }
+        
+    if ($orderby =~ /date_desc/){
+        $str.=" ORDER BY dateaccessioned DESC";
+    } else {
+        $str.=" ORDER BY title";
+    }
+    
+    my $qdataacquisitions=$dbh->prepare($str);
+        
+    my @loopacquisitions;
+    foreach my $value(@loopcriteria){
+        push @params,$value;
+        my %cell;
+        $cell{"title"}=$value;
+        $cell{"titlecode"}=$value;
+        
+        eval{$qdataacquisitions->execute(@params);};
+  
+        if ($@){ warn "recentacquisitions Error :$@";}
+        else {
+            my @loopdata;
+            while (my $data=$qdataacquisitions->fetchrow_hashref){
+                push @loopdata, {"summary"=>GetBiblioSummary( $data->{'marcxml'} ) };
+            }
+            $cell{"loopdata"}=\@loopdata;
+        }
+        push @loopacquisitions,\%cell if (scalar(@{$cell{loopdata}})>0);
+        pop @params;
+    }
+    $qdataacquisitions->finish;
+    return \@loopacquisitions;
+}
+
 #----------------------------------------------------------------------
 #
 # Non-Zebra GetRecords#
@@ -1932,7 +2026,7 @@ sub NZanalyse {
             );
 
             # split each word, query the DB and build the biblionumbers result
-            foreach ( split / /, $string ) {
+            foreach ( split (/ /, $string )) {
                 next if C4::Context->stopwords->{ uc($_) };   # skip if stopword
                 warn "search on all indexes on $_" if $DEBUG;
                 my $biblionumbers;
@@ -1961,7 +2055,7 @@ sub NZanalyse {
 sub NZoperatorAND{
     my ($rightresult, $leftresult)=@_;
     
-    my @leftresult = split /;/, $leftresult;
+    my @leftresult = split (/;/, $leftresult);
     warn " @leftresult / $rightresult \n" if $DEBUG;
     
     #             my @rightresult = split /;/,$leftresult;
@@ -2035,8 +2129,8 @@ sub NZorder {
         # popularity is not in MARC record, it's builded from a specific query
         my $sth =
           $dbh->prepare("select sum(issues) from items where biblionumber=?");
-        foreach ( split /;/, $biblionumbers ) {
-            my ( $biblionumber, $title ) = split /,/, $_;
+        foreach ( split (/;/, $biblionumbers )) {
+            my ( $biblionumber, $title ) = split (/,/, $_);
             $result{$biblionumber} = GetMarcBiblio($biblionumber);
             $sth->execute($biblionumber);
             my $popularity = $sth->fetchrow || 0;
@@ -2075,8 +2169,8 @@ sub NZorder {
     }
     elsif ( $ordering =~ /author/ ) {
         my %result;
-        foreach ( split /;/, $biblionumbers ) {
-            my ( $biblionumber, $title ) = split /,/, $_;
+        foreach ( split (/;/, $biblionumbers )) {
+            my ( $biblionumber, $title ) = split (/,/, $_);
             my $record = GetMarcBiblio($biblionumber);
             my $author;
             if ( C4::Context->preference('marcflavour') eq 'UNIMARC' ) {
@@ -2118,8 +2212,8 @@ sub NZorder {
     }
     elsif ( $ordering =~ /callnumber/ ) {
         my %result;
-        foreach ( split /;/, $biblionumbers ) {
-            my ( $biblionumber, $title ) = split /,/, $_;
+        foreach ( split (/;/, $biblionumbers )) {
+            my ( $biblionumber, $title ) = split (/,/, $_);
             my $record = GetMarcBiblio($biblionumber);
             my $callnumber;
             my ( $callnumber_tag, $callnumber_subfield ) =
@@ -2161,8 +2255,8 @@ sub NZorder {
     }
     elsif ( $ordering =~ /pubdate/ ) {             #pub year
         my %result;
-        foreach ( split /;/, $biblionumbers ) {
-            my ( $biblionumber, $title ) = split /,/, $_;
+        foreach ( split (/;/, $biblionumbers )) {
+            my ( $biblionumber, $title ) = split (/,/, $_);
             my $record = GetMarcBiblio($biblionumber);
             my ( $publicationyear_tag, $publicationyear_subfield ) =
               GetMarcFromKohaField( 'biblioitems.publicationyear', '' );
@@ -2203,8 +2297,8 @@ sub NZorder {
 
 # the title is in the biblionumbers string, so we just need to build a hash, sort it and return
         my %result;
-        foreach ( split /;/, $biblionumbers ) {
-            my ( $biblionumber, $title ) = split /,/, $_;
+        foreach ( split (/;/, $biblionumbers )) {
+            my ( $biblionumber, $title ) = split (/,/, $_);
 
 # hint : the result is sorted by title.biblionumber because we can have X biblios with the same title
 # and we don't want to get only 1 result for each of them !!!
@@ -2336,6 +2430,37 @@ sub enabled_staff_search_views
        );
 }
 
+=head2 enabled_opac_search_views
+
+%hash = enabled_opac_search_views()
+
+This function returns a hash that contains two flags obtained from the system
+preferences, used to determine whether a particular opac search results view
+is enabled.
+
+=over 2
+
+=item C<Output arg:>
+
+    * $hash{can_view_MARC} is true only if the MARC view is enabled
+    * $hash{can_view_ISBD} is true only if the ISBD view is enabled
+
+=item C<usage in the script:>
+
+=back
+
+$template->param ( C4::Search::enabled_opac_search_views );
+
+=cut
+
+sub enabled_opac_search_views
+{
+       return (
+               can_opac_view_MARC              => C4::Context->preference('OPACviewMARC'),             # 1 if the opac search allows the MARC view
+               can_opac_view_ISBD              => C4::Context->preference('OPACviewISBD'),             # 1 if the opac search allows the ISBD view
+       );
+}
+
 
 =head2 z3950_search_args