Bug 7470: Babeltheque integration
[koha.git] / C4 / SocialData.pm
diff --git a/C4/SocialData.pm b/C4/SocialData.pm
new file mode 100644 (file)
index 0000000..9e97115
--- /dev/null
@@ -0,0 +1,129 @@
+package C4::SocialData;
+
+# 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place,
+# Suite 330, Boston, MA  02111-1307 USA
+
+use Modern::Perl;
+
+use C4::Context;
+use Business::ISBN;
+use C4::Koha;
+
+=head2 get_data
+
+Get social data from a biblio
+
+params:
+  $isbn = isbn of the biblio (it must be the same in your database, isbn given to babelio)
+
+returns:
+  this function returns an hashref with keys
+
+  isbn = isbn
+  num_critics = number of critics
+  num_critics_pro = number of profesionnal critics
+  num_quotations = number of quotations
+  num_videos = number of videos
+  score_avg = average score
+  num_scores = number of score
+=cut
+sub get_data {
+    my ( $isbn ) = @_;
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare( qq{SELECT * FROM social_data WHERE isbn = ? LIMIT 1} );
+    $sth->execute( $isbn );
+    my $results = $sth->fetchrow_hashref;
+
+    return $results;
+}
+
+=head 2
+
+Update Social data
+
+params:
+  $url = url containing csv file with data
+
+data separator : ; (semicolon)
+data order : isbn ; active ; critics number , critics pro number ; quotations number ; videos number ; average score ; scores number
+
+=cut
+sub update_data {
+    my ( $output_filepath ) = @_;
+
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare( qq{INSERT INTO social_data (
+            `isbn`, `num_critics`, `num_critics_pro`, `num_quotations`, `num_videos`, `score_avg`, `num_scores`
+        ) VALUES ( ?, ?, ?, ?, ?, ?, ? )
+        ON DUPLICATE KEY UPDATE `num_critics`=?, `num_critics_pro`=?, `num_quotations`=?, `num_videos`=?, `score_avg`=?, `num_scores`=?
+    } );
+
+    open my $file, '<', $output_filepath or die "File $output_filepath can not be read";
+    my $sep = qq{;};
+    my $i = 0;
+    my $unknown = 0;
+    while ( my $line = <$file> ) {
+        my ( $isbn, $active, $num_critics, $num_critics_pro, $num_quotations, $num_videos, $score_avg, $num_scores ) = split $sep, $line;
+        next if not $active;
+        eval {
+            $sth->execute( $isbn, $num_critics, $num_critics_pro, $num_quotations, $num_videos, $score_avg, $num_scores,
+                $num_critics, $num_critics_pro, $num_quotations, $num_videos, $score_avg, $num_scores
+            );
+        };
+        if ( $@ ) {
+            warn "Can't insert $isbn ($@)";
+        } else {
+            $i++;
+        }
+    }
+    say "$i data insered or updated";
+}
+
+=head 2
+
+Get social data report
+
+=cut
+sub get_report {
+    my $dbh = C4::Context->dbh;
+
+    my $sth = $dbh->prepare( qq{
+        SELECT biblionumber, isbn FROM biblioitems
+    } );
+    $sth->execute;
+    my %results;
+    while ( my ( $biblionumber, $isbn ) = $sth->fetchrow() ) {
+        push @{ $results{no_isbn} }, { biblionumber => $biblionumber } and next if not $isbn;
+        my $original_isbn = $isbn;
+        $isbn =~ s/^\s*(\S*)\s*$/$1/;
+        $isbn = GetNormalizedISBN( $isbn, undef, undef );
+        $isbn = Business::ISBN->new( $isbn );
+        next if not $isbn;
+        eval{
+            $isbn = $isbn->as_isbn13->as_string;
+        };
+        next if $@;
+        $isbn =~ s/-//g;
+        my $social_datas = C4::SocialData::get_data( $isbn );
+        if ( $social_datas ) {
+            push @{ $results{with} }, { biblionumber => $biblionumber, isbn => $isbn, original => $original_isbn };
+        } else {
+            push @{ $results{without} }, { biblionumber => $biblionumber, isbn => $isbn, original => $original_isbn };
+        }
+    }
+    return \%results;
+}
+
+1;