Bug 17600: Standardize our EXPORT_OK
[srvgit] / misc / stage_file.pl
index 4ce16b5..f05be7a 100755 (executable)
@@ -6,67 +6,98 @@
 # Parts Copyright BSZ 2011
 # Parts Copyright C & P Bibliography Services 2012
 #
-# 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 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 3 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.
+# 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 this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
-use strict;
-use warnings;
+use Modern::Perl;
 BEGIN {
     # find Koha's Perl modules
     # test carefully before changing this
-    use FindBin;
+    use FindBin ();
     eval { require "$FindBin::Bin/kohalib.pl" };
 }
 
+use Koha::Script;
 use C4::Context;
-use C4::ImportBatch;
+use C4::ImportBatch qw( RecordsFromISO2709File RecordsFromMARCXMLFile BatchStageMarcRecords SetImportBatchMatcher SetImportBatchOverlayAction SetImportBatchNoMatchAction SetImportBatchItemAction BatchFindDuplicates );
 use C4::Matcher;
-use Getopt::Long;
+use C4::MarcModificationTemplates qw( GetModificationTemplates );
+use Getopt::Long qw( GetOptions );
 
 $| = 1;
 
 # command-line parameters
 my $record_type = "biblio";
-my $encoding = "";
+my $encoding = "UTF-8";
 my $authorities = 0;
 my $match = 0;
 my $add_items = 0;
 my $input_file = "";
 my $batch_comment = "";
 my $want_help = 0;
-my $no_replace ;
+my $no_replace;
+my $format = 'ISO2709';
+my $no_create;
+my $item_action = 'always_add';
+my $marc_mod_template = '';
+my $marc_mod_template_id = undef;
 
 my $result = GetOptions(
-    'encoding:s'    => \$encoding,
-    'file:s'        => \$input_file,
-    'match|match-bibs:s'  => \$match,
-    'add-items'     => \$add_items,
-    'no-replace'    => \$no_replace,
-    'comment:s'     => \$batch_comment,
-    'authorities'   => \$authorities,
-    'h|help'        => \$want_help
+    'encoding:s'         => \$encoding,
+    'file:s'             => \$input_file,
+    'format:s'           => \$format,
+    'match|match-bibs:s' => \$match,
+    'add-items'          => \$add_items,
+    'item-action:s'      => \$item_action,
+    'no-replace'         => \$no_replace,
+    'no-create'          => \$no_create,
+    'comment:s'          => \$batch_comment,
+    'authorities'        => \$authorities,
+    'marcmodtemplate:s'  => \$marc_mod_template,
+    'h|help'             => \$want_help
 );
 
-$record_type = 'auth' if ($authorities);
+if($marc_mod_template ne '') {
+   my @templates = GetModificationTemplates();
+   foreach my $this_template (@templates) {
+       if($this_template->{'name'} eq $marc_mod_template) {
+          if(!defined $marc_mod_template_id) {
+               $marc_mod_template_id = $this_template->{'template_id'};
+           } else {
+               print "WARNING: MARC modification template name " .
+                   "'$marc_mod_template' matches multiple templates. " .
+                   "Please fix this issue before proceeding.\n";
+               exit 1;
+           }
+       }
+   }
 
-if ($encoding eq "") {
-    $encoding = "utf8";
+   if(!defined $marc_mod_template_id ) {
+       die "Can't locate MARC modification template '$marc_mod_template'\n";
+   }
 }
 
+$record_type = 'auth' if ($authorities);
+
 if (not $result or $input_file eq "" or $want_help) {
     print_usage();
     exit 0;
 }
+if ( $format !~ /^(MARCXML|ISO2709)$/i ) {
+    print "\n --format must be MARCXML or ISO2709\n";
+    print_usage();
+    exit 0;
+}
 
 unless (-r $input_file) {
     die "$0: cannot open input file $input_file: $!\n";
@@ -74,40 +105,59 @@ unless (-r $input_file) {
 
 my $dbh = C4::Context->dbh;
 $dbh->{AutoCommit} = 0;
-process_batch($input_file, $record_type, $match, $add_items, $batch_comment);
+process_batch(
+    {
+        format               => $format,
+        input_file           => $input_file,
+        record_type          => $record_type,
+        match                => $match,
+        add_items            => $add_items,
+        batch_comment        => $batch_comment,
+        encoding             => $encoding,
+        no_replace           => $no_replace,
+        no_create            => $no_create,
+        item_action          => $item_action,
+        marc_mod_template_id => $marc_mod_template_id,
+    }
+);
 $dbh->commit();
 
 exit 0;
 
 sub process_batch {
-    my ($input_file, $record_type, $match, $add_items, $batch_comment) = @_;
-
-    open IN, "<$input_file" or die "$0: cannot open input file $input_file: $!\n";
-    my $marc_records = "";
-    $/ = "\035";
-    my $num_input_records = 0;
-    while (<IN>) {
-        s/^\s+//;
-        s/\s+$//;
-        next unless $_; # skip if record has only whitespace, as might occur
-                        # if file includes newlines between each MARC record
-        $marc_records .= $_; # FIXME - this sort of string concatenation
-                             # is probably rather inefficient
-        $num_input_records++;
+    my ( $params ) = @_;  #Possible params are: format input_file record_type match add_items batch_comment encoding no_replace no_create item_action
+    my $format = $params->{format} // '';
+    my $record_type = $params->{record_type} // 'biblio';
+
+    my ( $errors, $marc_records );
+    if( $format eq 'ISO2709' ) {
+        ( $errors, $marc_records ) = C4::ImportBatch::RecordsFromISO2709File(
+            $params->{input_file}, $record_type, $params->{encoding} );
+    } elsif( $format eq 'MARCXML' ) {
+        ( $errors, $marc_records ) = C4::ImportBatch::RecordsFromMARCXMLFile(
+            $params->{input_file}, $params->{encoding} );
     }
-    close IN;
+    warn ( join ',', @$errors ) if @$errors;
+    my $num_input_records = ($marc_records) ? scalar(@$marc_records) : 0;
 
     print "... staging MARC records -- please wait\n";
-    my ($batch_id, $num_valid_records, $num_items, @import_errors) =
-        BatchStageMarcRecords($record_type, $encoding, $marc_records, $input_file, $batch_comment, '', $add_items, 0,
-                              100, \&print_progress_and_commit);
+    #FIXME: We should really allow the use of marc modification frameworks and to_marc plugins here if possible
+    my ( $batch_id, $num_valid_records, $num_items, @import_errors ) =
+      BatchStageMarcRecords(
+        $record_type,                      $params->{encoding},
+        $marc_records,                     $params->{input_file},
+        $params->{'marc_mod_template_id'}, $params->{batch_comment},
+        '',                                $params->{add_items},
+        0,                                 100,
+        \&print_progress_and_commit
+      );
     print "... finished staging MARC records\n";
 
     my $num_with_matches = 0;
-    if ($match) {
-        my $matcher = C4::Matcher->fetch($match) ;
+    if ( $params->{match} ) {
+        my $matcher = C4::Matcher->fetch( $params->{match} );
         if (defined $matcher) {
-            SetImportBatchMatcher($batch_id, $match);
+            SetImportBatchMatcher( $batch_id, $params->{match} );
         } elsif ($record_type eq 'biblio')  {
             $matcher = C4::Matcher->new($record_type);
             $matcher->add_simple_matchpoint('isbn', 1000, '020', 'a', -1, 0, '');
@@ -115,9 +165,9 @@ sub process_batch {
                                             '245', 'a', -1, 0, '');
         }
         # set default record overlay behavior
-        SetImportBatchOverlayAction($batch_id, ($no_replace) ? 'ignore' : 'replace');
-        SetImportBatchNoMatchAction($batch_id, 'create_new');
-        SetImportBatchItemAction($batch_id, 'always_add');
+        SetImportBatchOverlayAction( $batch_id, $params->{no_replace} ? 'ignore' : 'replace' );
+        SetImportBatchNoMatchAction( $batch_id, $params->{no_create} ? 'ignore' : 'create_new' );
+        SetImportBatchItemAction( $batch_id, $params->{item_action} );
         print "... looking for matches with records already in database\n";
         $num_with_matches = BatchFindDuplicates($batch_id, $matcher, 10, 100, \&print_progress_and_commit);
         print "... finished looking for matches\n";
@@ -128,19 +178,19 @@ sub process_batch {
 
 MARC record staging report
 ------------------------------------
-Input file:                 $input_file
+Input file:                 $params->{input_file}
 Record type:                $record_type
 Number of input records:    $num_input_records
 Number of valid records:    $num_valid_records
 Number of invalid records:  $num_invalid_records
 _SUMMARY_
-    if ($match) {
+    if( $params->{match} ) {
         print "Number of records matched:  $num_with_matches\n";
     } else {
         print "Incoming records not matched against existing records (--match option not supplied)\n";
     }
     if ($record_type eq 'biblio') {
-        if ($add_items) {
+        if ( $params->{add_items} ) {
             print "Number of items parsed:  $num_items\n";
         } else {
             print "No items parsed (--add-items option not supplied)\n";
@@ -174,9 +224,12 @@ records into the main Koha database.
 Parameters:
     --file <file_name>      name of input MARC bib file
     --authorities           stage authority records instead of bibs
-    --encoding <encoding>   encoding of MARC records, default is utf8.
+    --encoding <encoding>   encoding of MARC records, default is UTF-8.
                             Other possible options are: MARC-8,
                             ISO_5426, ISO_6937, ISO_8859-1, EUC-KR
+    --format                The MARC transport format to use?
+                            Defaults to ISO2709.
+                            Available values, MARCXML, ISO2709.
     --match <match_id>      use this option to match records
                             in the file with records already in
                             the database for future overlay.
@@ -186,12 +239,26 @@ Parameters:
     --add-items             use this option to specify that
                             item data is embedded in the MARC
                             bibs and should be parsed.
+    --item-action           action to take if --add-items is specifed;
+                            choices are 'always_add',
+                            'add_only_for_matches', 'add_only_for_new',
+                            'ignore', or 'replace'
     --no-replace            overlay action for record: default is to
                             replace extant with the imported record.
+    --no-create             nomatch action for record: default is to
+                            create new record with imported record.
     --comment <comment>     optional comment to describe
                             the record batch; if the comment
                             has spaces in it, surround the
                             comment with quotation marks.
+    --marcmodtemplate <TEMPLATE>
+                            This parameter allows you to specify the
+                            name of an existing MARC modification
+                            template to apply as the MARC records are
+                            imported (these templates are created in
+                            the "MARC modification templates" tool in
+                            Koha). If not specified, no MARC modification
+                            templates are used (default).
     --help or -h            show this message.
 _USAGE_
 }