Bug 19620: Allow skipping of patrons with valid emails for Talking Tech
[koha.git] / misc / batchRebuildItemsTables.pl
index 2398bdb..0e611dd 100755 (executable)
@@ -1,14 +1,16 @@
 #!/usr/bin/perl
+
 use Modern::Perl;
+
 use Getopt::Long;
+use MARC::Field;
+use MARC::Record;
+use Pod::Usage;
+use Time::HiRes qw(gettimeofday);
+
 use C4::Context;
 use C4::Biblio;
 use C4::Items;
-use MARC::Record;
-use MARC::Field;
-use Data::Dumper;
-use Time::HiRes qw(gettimeofday);
-use Pod::Usage;
 
 =head1 NAME
 
@@ -28,80 +30,80 @@ batchRebuildItemsTables.pl [ -h ][ -c ][ -t ][ --where ]
 
 =cut
 
-
-my $count = 0;
+my $count      = 0;
 my $errorcount = 0;
-my $starttime = gettimeofday;
+my $starttime  = gettimeofday;
 my @errors;
-my %opt;
-my ($confirm, $help, $test_parameter, $where);
+my ( $confirm, $help, $test_parameter, $where );
 GetOptions(
-    'c' => \$confirm,
-    'help|h' => \$help,
-    't' => \$test_parameter,
+    'c'       => \$confirm,
+    'help|h'  => \$help,
+    't'       => \$test_parameter,
     'where:s' => \$where,
 ) or pod2usage(2);
 
-pod2usage(1) if ($help || (!$confirm));
+pod2usage(1) if $help || ( !$confirm && !$test_parameter );
 print "### Database will not be modified ###\n" if $test_parameter;
+
 #dbh
 my $dbh = C4::Context->dbh;
 $dbh->{AutoCommit} = 0;
+
 #sysprefs
 C4::Context->disable_syspref_cache() if ( defined( C4::Context->disable_syspref_cache() ) );
 my $CataloguingLog = C4::Context->preference('CataloguingLog');
-my $dontmerge = C4::Context->preference('dontmerge');
-$dontmerge="0" unless defnonull($dontmerge);
+my $mergelimit     = C4::Context->preference('AuthorityMergeLimit');
 $dbh->do("UPDATE systempreferences SET value=0 WHERE variable='CataloguingLog'");
-$dbh->do("UPDATE systempreferences SET value=1 where variable='dontmerge'");
+$dbh->do("UPDATE systempreferences SET value=0 where variable='AuthorityMergeLimit'");
 $dbh->commit() unless $test_parameter;
-my ($itemfield,$itemnumbersubfield) = &GetMarcFromKohaField("items.itemnumber",'');
+my ( $itemfield, $itemnumbersubfield ) = &GetMarcFromKohaField( "items.itemnumber", '' );
+
 #dbh query init
-my $query = qq{SELECT biblio.biblionumber AS biblionumber, biblioitems.biblioitemnumber AS biblioitemnumber, biblio.frameworkcode AS frameworkcode FROM biblio JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber};
-$query.=qq{ WHERE $where } if ($where);
+my $query =
+qq{SELECT biblio.biblionumber AS biblionumber, biblioitems.biblioitemnumber AS biblioitemnumber, biblio.frameworkcode AS frameworkcode FROM biblio JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber};
+$query .= qq{ WHERE $where } if ($where);
 
 my $sth = $dbh->prepare($query);
 $sth->execute();
-while ( my ( $biblionumber, $biblioitemnumber, $frameworkcode ) = $sth->fetchrow )
-{
+while ( my ( $biblionumber, $biblioitemnumber, $frameworkcode ) = $sth->fetchrow ) {
     $count++;
-    warn $count unless $count %1000;
-    my $extkey;
-    my $record = GetMarcBiblio($biblionumber,1);
-    unless ($record){ push @errors, "bad record biblionumber $biblionumber"; next; }
-    my ($tmptestfields,$tmptestdirectory,$reclen,$tmptestbaseaddress) = MARC::File::USMARC::_build_tag_directory($record);
-    if ($reclen > 99999) { push @errors,  "bad record length for biblionumber $biblionumber (length : $reclen) "; next; }
-    #print "\n################################ record before ##################################\n".$record->as_formatted;#!test
+    warn $count unless $count % 1000;
+    my $record = GetMarcBiblio({
+        biblionumber => $biblionumber,
+        embed_items   => 1 });
+    unless ($record) { push @errors, "bad record biblionumber $biblionumber"; next; }
+
     unless ($test_parameter) {
-        my $rqitemnumber=$dbh->prepare("SELECT itemnumber, biblionumber from items where itemnumber = ? and biblionumber = ?");
-        foreach my $itemfield ($record->field($itemfield)){
-            my $marcitem=MARC::Record->new();
+        my $rqitemnumber = $dbh->prepare("SELECT itemnumber, biblionumber from items where itemnumber = ? and biblionumber = ?");
+        foreach my $itemfield ( $record->field($itemfield) ) {
+            my $marcitem = MARC::Record->new();
             $marcitem->encoding('UTF-8');
             $marcitem->append_fields($itemfield);
-            my $itemnum; my @itemnumbers = $itemfield->subfield($itemnumbersubfield);
-            foreach my $itemnumber ( @itemnumbers ){
-                $rqitemnumber->execute($itemnumber, $biblionumber);
-                if( my $row = $rqitemnumber->fetchrow_hashref ){ $itemnum = $row->{itemnumber};}
+            my $itemnum;
+            my @itemnumbers = $itemfield->subfield($itemnumbersubfield);
+            foreach my $itemnumber (@itemnumbers) {
+                $rqitemnumber->execute( $itemnumber, $biblionumber );
+                if ( my $row = $rqitemnumber->fetchrow_hashref ) { $itemnum = $row->{itemnumber}; }
             }
-            eval{ if($itemnum){ ModItemFromMarc($marcitem,$biblionumber,$itemnum) }else{ die("$biblionumber"); } };
-            if ($@){ warn "Problem with : $biblionumber : $@"; warn $record->as_formatted; }
+            eval {
+                if ($itemnum) { ModItemFromMarc( $marcitem, $biblionumber, $itemnum ) }
+                else          { die("$biblionumber"); }
+            };
+            if ($@) { warn "Problem with : $biblionumber : $@"; warn $record->as_formatted; }
         }
     }
     unless ($test_parameter) {
-        $dbh->commit() unless $count %1000;
+        $dbh->commit() unless $count % 1000;
     }
 }
 
 my $sthCataloguingLog = $dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='CataloguingLog'");
 $sthCataloguingLog->execute($CataloguingLog);
-my $sthdontmerge = $dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='dontmerge'");
-$sthdontmerge->execute($dontmerge);
+my $sthmergelimit = $dbh->prepare("UPDATE systempreferences SET value=? WHERE variable='AuthorityMergeLimit'");
+$sthmergelimit->execute($mergelimit);
 $dbh->commit() unless $test_parameter;
 my $timeneeded = time() - $starttime;
 print "$count MARC record done in $timeneeded seconds\n";
-if (scalar(@errors) > 0) {
-    print "Some biblionumber could not be processed though: ", join(" ", @errors);
+if ( scalar(@errors) > 0 ) {
+    print "Some biblionumber could not be processed though: ", join( " ", @errors );
 }
-
-sub defnonull { my $var = shift; defined $var and $var ne "" }
-__END__