More updates
[koha.git] / C4 / Breeding.pm
index ac97ca7..79f2e2f 100644 (file)
@@ -20,27 +20,35 @@ package C4::Breeding;
 use strict;
 use C4::Biblio;
 use C4::Koha;
 use strict;
 use C4::Biblio;
 use C4::Koha;
+use C4::Charset;
 use MARC::File::USMARC;
 use MARC::File::USMARC;
-require Exporter;
+use C4::ImportBatch;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 
-# set the version for version checking
-$VERSION = 0.01;
+BEGIN {
+       # set the version for version checking
+       $VERSION = 0.02;
+       require Exporter;
+       @ISA = qw(Exporter);
+       @EXPORT = qw(&ImportBreeding &BreedingSearch);
+}
 
 =head1 NAME
 
 
 =head1 NAME
 
-C4::Breeding : script to add a biblio in marc_breeding table.
+C4::Breeding : module to add biblios to import_records via
+               the breeding/reservoir API.
 
 =head1 SYNOPSIS
 
     use C4::Scan;
 
 =head1 SYNOPSIS
 
     use C4::Scan;
-    &ImportBreeding($marcrecords,$overwrite_biblio,$filename,$z3950random);
+    &ImportBreeding($marcrecords,$overwrite_biblio,$filename,$z3950random,$batch_type);
 
     C<$marcrecord> => the MARC::Record
     C<$overwrite_biblio> => if set to 1 a biblio with the same ISBN will be overwritted.
                                 if set to 0 a biblio with the same isbn will be ignored (the previous will be kept)
 
     C<$marcrecord> => the MARC::Record
     C<$overwrite_biblio> => if set to 1 a biblio with the same ISBN will be overwritted.
                                 if set to 0 a biblio with the same isbn will be ignored (the previous will be kept)
-                                if set to -1 the biblio will be added anyway (more than 1 biblio with the same ISBN possible in the breeding
+                                if set to -1 the biblio will be added anyway (more than 1 biblio with the same ISBN 
+                                possible in the breeding
     C<$encoding> => USMARC
                         or UNIMARC. used for char_decoding.
                         If not present, the parameter marcflavour is used instead
     C<$encoding> => USMARC
                         or UNIMARC. used for char_decoding.
                         If not present, the parameter marcflavour is used instead
@@ -48,36 +56,37 @@ C4::Breeding : script to add a biblio in marc_breeding table.
 
 =head1 DESCRIPTION
 
 
 =head1 DESCRIPTION
 
-    ImportBreeding import MARC records in the reservoir (marc_breeding table).
+    ImportBreeding import MARC records in the reservoir (import_records/import_batches tables).
     the records can be properly encoded or not, we try to reencode them in utf-8 if needed.
     works perfectly with BNF server, that sends UNIMARC latin1 records. Should work with other servers too.
     the records can be properly encoded or not, we try to reencode them in utf-8 if needed.
     works perfectly with BNF server, that sends UNIMARC latin1 records. Should work with other servers too.
-    the FixEncoding sub is in Koha.pm, as it's a general usage sub.
-
-=cut
-
-@ISA = qw(Exporter);
-@EXPORT = qw(&ImportBreeding &BreedingSearch);
 
 =head2 ImportBreeding
 
 
 =head2 ImportBreeding
 
-       ImportBreeding($marcrecords,$overwrite_biblio,$filename,$encoding,$z3950random);
+       ImportBreeding($marcrecords,$overwrite_biblio,$filename,$encoding,$z3950random,$batch_type);
 
        TODO description
 
 =cut
 
 sub ImportBreeding {
 
        TODO description
 
 =cut
 
 sub ImportBreeding {
-    my ($marcrecords,$overwrite_biblio,$filename,$encoding,$z3950random) = @_;
+    my ($marcrecords,$overwrite_biblio,$filename,$encoding,$z3950random,$batch_type) = @_;
     my @marcarray = split /\x1D/, $marcrecords;
     
     my $dbh = C4::Context->dbh;
     my @marcarray = split /\x1D/, $marcrecords;
     
     my $dbh = C4::Context->dbh;
+    
+    my $batch_id = 0;
+    if ($batch_type eq 'z3950') {
+        $batch_id = GetZ3950BatchId($filename);
+    } else {
+        # create a new one
+        $batch_id = AddImportBatch('create_new', 'staging', 'batch', $filename, '');
+    }
     my $searchisbn = $dbh->prepare("select biblioitemnumber from biblioitems where isbn=?");
     my $searchissn = $dbh->prepare("select biblioitemnumber from biblioitems where issn=?");
     my $searchisbn = $dbh->prepare("select biblioitemnumber from biblioitems where isbn=?");
     my $searchissn = $dbh->prepare("select biblioitemnumber from biblioitems where issn=?");
-    my $searchbreeding = $dbh->prepare("select id from marc_breeding where isbn=? and title=?");
-    my $insertsql = $dbh->prepare("insert into marc_breeding (file,isbn,title,author,marc,encoding,z3950random) values(?,?,?,?,?,?,?)");
-    my $replacesql = $dbh->prepare("update marc_breeding set file=?,isbn=?,title=?,author=?,marc=?,encoding=?,z3950random=? where id=?");
+    # FIXME -- not sure that this kind of checking is actually needed
+    my $searchbreeding = $dbh->prepare("select import_record_id from import_biblios where isbn=? and title=?");
     
     
-    $encoding = C4::Context->preference("marcflavour") unless $encoding;
+    $encoding = C4::Context->preference("marcflavour") unless $encoding;
     # fields used for import results
     my $imported=0;
     my $alreadyindb = 0;
     # fields used for import results
     my $imported=0;
     my $alreadyindb = 0;
@@ -85,24 +94,24 @@ sub ImportBreeding {
     my $notmarcrecord = 0;
     my $breedingid;
     for (my $i=0;$i<=$#marcarray;$i++) {
     my $notmarcrecord = 0;
     my $breedingid;
     for (my $i=0;$i<=$#marcarray;$i++) {
-        my $marcrecord = FixEncoding($marcarray[$i]."\x1D");
+        my ($marcrecord, $charset_result, $charset_errors);
+        ($marcrecord, $charset_result, $charset_errors) = 
+            MarcToUTF8Record($marcarray[$i]."\x1D", C4::Context->preference("marcflavour"), $encoding);
         
         
+#         warn "$i : $marcarray[$i]";
+        # FIXME - currently this does nothing 
         my @warnings = $marcrecord->warnings();
         
         if (scalar($marcrecord->fields()) == 0) {
             $notmarcrecord++;
         } else {
             my $oldbiblio = TransformMarcToKoha($dbh,$marcrecord,'');
         my @warnings = $marcrecord->warnings();
         
         if (scalar($marcrecord->fields()) == 0) {
             $notmarcrecord++;
         } else {
             my $oldbiblio = TransformMarcToKoha($dbh,$marcrecord,'');
-            my $isbnlength=10;
-            if($oldbiblio->{isbn}){
-                $isbnlength = length($oldbiblio->{isbn});
-            }
-            # if isbn found and biblio does not exist, add it. If isbn found and biblio exists, overwrite or ignore depending on user choice
+            # if isbn found and biblio does not exist, add it. If isbn found and biblio exists, 
+            # overwrite or ignore depending on user choice
             # drop every "special" char : spaces, - ...
             # drop every "special" char : spaces, - ...
-            $oldbiblio->{isbn} =~ s/ |-|\.//g,
-            $oldbiblio->{isbn} = substr($oldbiblio->{isbn},0,$isbnlength);
-            $oldbiblio->{issn} =~ s/ |-|\.//g,
-            $oldbiblio->{issn} = substr($oldbiblio->{issn},0,10);
+            $oldbiblio->{isbn} =~ s/\(.*$//;
+            $oldbiblio->{isbn} =~ tr/ -_//;
+            $oldbiblio->{isbn} = uc $oldbiblio->{isbn}; 
             # search if biblio exists
             my $biblioitemnumber;
             if ($oldbiblio->{isbn}) {
             # search if biblio exists
             my $biblioitemnumber;
             if ($oldbiblio->{isbn}) {
@@ -114,9 +123,12 @@ sub ImportBreeding {
                        ($biblioitemnumber) = $searchissn->fetchrow;
                 }
             }
                        ($biblioitemnumber) = $searchissn->fetchrow;
                 }
             }
-            if ($biblioitemnumber) {
+            if ($biblioitemnumber && $overwrite_biblio ne 2) {
                 $alreadyindb++;
             } else {
                 $alreadyindb++;
             } else {
+                # FIXME - in context of batch load,
+                # rejecting records because already present in the reservoir
+                # not correct in every case.
                 # search in breeding farm
                 if ($oldbiblio->{isbn}) {
                     $searchbreeding->execute($oldbiblio->{isbn},$oldbiblio->{title});
                 # search in breeding farm
                 if ($oldbiblio->{isbn}) {
                     $searchbreeding->execute($oldbiblio->{isbn},$oldbiblio->{title});
@@ -128,13 +140,11 @@ sub ImportBreeding {
                 if ($breedingid && $overwrite_biblio eq '0') {
                     $alreadyinfarm++;
                 } else {
                 if ($breedingid && $overwrite_biblio eq '0') {
                     $alreadyinfarm++;
                 } else {
-                    my $recoded;
-                    $recoded = $marcrecord->as_usmarc();
                     if ($breedingid && $overwrite_biblio eq '1') {
                     if ($breedingid && $overwrite_biblio eq '1') {
-                        $replacesql ->execute($filename,substr($oldbiblio->{isbn}.$oldbiblio->{issn},0,$isbnlength),$oldbiblio->{title},$oldbiblio->{author},$recoded,$encoding,$z3950random,$breedingid);
+                        ModBiblioInBatch($breedingid, $marcrecord);
                     } else {
                     } else {
-                        $insertsql ->execute($filename,substr($oldbiblio->{isbn}.$oldbiblio->{issn},0,$isbnlength),$oldbiblio->{title},$oldbiblio->{author},$recoded,$encoding,$z3950random);
-                       $breedingid=$dbh->{'mysql_insertid'};
+                        my $import_id = AddBiblioToBatch($batch_id, $imported, $marcrecord, $encoding, $z3950random);
+                        $breedingid = $import_id;
                     }
                     $imported++;
                 }
                     }
                     $imported++;
                 }
@@ -153,7 +163,8 @@ C<$isbn> contains isbn or issn,
 C<$random> contains the random seed from a z3950 search.
 
 C<$count> is the number of items in C<@results>. C<@results> is an
 C<$random> contains the random seed from a z3950 search.
 
 C<$count> is the number of items in C<@results>. C<@results> is an
-array of references-to-hash; the keys are the items from the C<marc_breeding> table of the Koha database.
+array of references-to-hash; the keys are the items from the C<import_records> and
+C<import_biblios> tables of the Koha database.
 
 =cut
 
 
 =cut
 
@@ -165,7 +176,11 @@ sub BreedingSearch {
     my $sth;
     my @results;
 
     my $sth;
     my @results;
 
-    $query = "Select id,file,isbn,title,author from marc_breeding where ";
+    $query = "SELECT import_record_id, file_name, isbn, title, author
+              FROM  import_biblios 
+              JOIN import_records USING (import_record_id)
+              JOIN import_batches USING (import_batch_id)
+              WHERE ";
     if ($z3950random) {
         $query .= "z3950random = ?";
         @bind=($z3950random);
     if ($z3950random) {
         $query .= "z3950random = ?";
         @bind=($z3950random);
@@ -187,6 +202,12 @@ sub BreedingSearch {
     $sth->execute(@bind);
     while (my $data = $sth->fetchrow_hashref) {
             $results[$count] = $data;
     $sth->execute(@bind);
     while (my $data = $sth->fetchrow_hashref) {
             $results[$count] = $data;
+            # FIXME - hack to reflect difference in name 
+            # of columns in old marc_breeding and import_records
+            # There needs to be more separation between column names and 
+            # field names used in the templates </soapbox>
+            $data->{'file'} = $data->{'file_name'};
+            $data->{'id'} = $data->{'import_record_id'};
             $count++;
     } # while
 
             $count++;
     } # while
 
@@ -194,5 +215,6 @@ sub BreedingSearch {
     return($count, @results);
 } # sub breedingsearch
 
     return($count, @results);
 } # sub breedingsearch
 
+1;
+__END__
 
 
-END { }       # module clean-up code here (global destructor)