[RT17143] Fixed pubdate scrub and authtoken error user/lwhalen/RT17143_Date1_Cleanup
authorLiam Whalen <liam.whalen@bc.libraries.coop>
Wed, 28 Oct 2015 21:41:18 +0000 (14:41 -0700)
committerLiam Whalen <liam.whalen@bc.libraries.coop>
Wed, 28 Oct 2015 21:41:18 +0000 (14:41 -0700)
The pubdate should not be exactly 4 digits form 260 or 264 $c.  If it is
not then it is set to 0011, so the record can be easily identified.

Signed-off-by: Liam Whalen <liam.whalen@bc.libraries.coop>
data_cleanup/date1/date1_cleanup.pl

index faab26f..eda2ad5 100644 (file)
@@ -91,16 +91,38 @@ sub clean_date1_records {
         my $field_260 = $marc->field('260');
         my $field_264 = $marc->field('264');
         my $pubdate = '';
+        my $four_digit_capture = qr/^\D*(\d{4}).*$/;
+        my $exactly_four_digits = qr/^\d{4}$/;
 
         if ($field_264) {
-            $pubdate = $field_260->subfield('c');
+            $pubdate = $field_264->subfield('c');
+        }
+
+        $pubdate =~ s/$four_digit_capture/$1/;
+
+        #There is a chance we have a bogus 264 and
+        #a valid 260, so reset pubdate if 264 does 
+        #not contain exactly 4 digit characters
+        #There is still a chance that a 5 digita
+        #date is in 264 $c, but this will be an
+        #outlier.
+        if ($pubdate !~ /$exactly_four_digits/) {
+            $pubdate = '';
         }
 
         if ($field_260 && !$pubdate) {
             $pubdate = $field_260->subfield('c');
         }
-            
-        $pubdate =~ s/.*(\d{4}).*/$1/;
+
+        $pubdate =~ s/$four_digit_capture/$1/;
+
+        #If there is not exactly four digits
+        #from 260 we reset pubdate to a bogus
+        #value that we can use to identify
+        #bad record data
+        if ($pubdate !~ /$exactly_four_digits/) {
+            $pubdate = '0011';
+        }
 
         if (length($pubdate) != 4) {
             #We will use this bogus pubdate
@@ -114,34 +136,38 @@ sub clean_date1_records {
 
         my $data_008 =  $field_008->data();
 
-        my $data_008_00_to_06 = substr($data_008, 0, 7);
+        my $data_008_00_to_05 = substr($data_008, 0, 6);
+
+        my $data_008_06 = substr($data_008, 6, 1);
+
+        $data_008_00_to_05 =~ s/[^0-9]//g;
 
         #If we have less than 6 characters at the start
         #then we have bad data.  Replace it with the
         #create_date from the BRE object.
-        if (length($data_008_00_to_06) < 6) {
-            $data_008_00_to_06 = $date_entered;
+        if (length($data_008_00_to_05) < 6) {
+            $data_008_00_to_05 = $date_entered;
         }
 
-        #If we have less than 7 characters at the start
-        #then we have bad data.  Add an n as the 7th character
+        #If we have invalid 008/06 characters
+        #then we have bad data.  Use n as the 008/06 
         #which indicates Dates unknown
-        if (length($data_008_00_to_06) < 7) {
-            $data_008_00_to_06 .= 'n';
+
+        if ($data_008_06 !~ /[bcdeikmnpqrstu|]/) {
+            $data_008_06 = 'n';
         }
-            
+
         my $data_008_after_10 = substr($data_008, 11);
 
-        my $data_008_with_pubdate =  "$data_008_00_to_06$pubdate$data_008_after_10";
+        my $data_008_with_pubdate =  "$data_008_00_to_05$data_008_06$pubdate$data_008_after_10";
 
         $field_008->update($data_008_with_pubdate);
 
         update_marc_by_id($authtoken, $record_id, $marc->as_xml());
 
-        clear_auth_token($authtoken);
-
-        exit;
     }
+
+    clear_auth_token($authtoken);
 }
 
 sub init_database_connections {