Merge remote-tracking branch 'origin/new/bug_7751'
[koha.git] / misc / stage_file.pl
1 #!/usr/bin/perl
2
3 # This file is part of Koha.
4 #
5 # Copyright (C) 2007 LibLime
6 # Parts Copyright BSZ 2011
7 # Parts Copyright C & P Bibliography Services 2012
8 #
9 # Koha is free software; you can redistribute it and/or modify it under the
10 # terms of the GNU General Public License as published by the Free Software
11 # Foundation; either version 2 of the License, or (at your option) any later
12 # version.
13 #
14 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
15 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License along
19 # with this program; if not, write to the Free Software Foundation, Inc.,
20 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
22 use strict;
23 use warnings;
24 BEGIN {
25     # find Koha's Perl modules
26     # test carefully before changing this
27     use FindBin;
28     eval { require "$FindBin::Bin/kohalib.pl" };
29 }
30
31 use C4::Context;
32 use C4::ImportBatch;
33 use C4::Matcher;
34 use Getopt::Long;
35
36 $| = 1;
37
38 # command-line parameters
39 my $record_type = "biblio";
40 my $encoding = "";
41 my $authorities = 0;
42 my $match = 0;
43 my $add_items = 0;
44 my $input_file = "";
45 my $batch_comment = "";
46 my $want_help = 0;
47 my $no_replace ;
48
49 my $result = GetOptions(
50     'encoding:s'    => \$encoding,
51     'file:s'        => \$input_file,
52     'match|match-bibs:s'  => \$match,
53     'add-items'     => \$add_items,
54     'no-replace'    => \$no_replace,
55     'comment:s'     => \$batch_comment,
56     'authorities'   => \$authorities,
57     'h|help'        => \$want_help
58 );
59
60 $record_type = 'auth' if ($authorities);
61
62 if ($encoding eq "") {
63     $encoding = "utf8";
64 }
65
66 if (not $result or $input_file eq "" or $want_help) {
67     print_usage();
68     exit 0;
69 }
70
71 unless (-r $input_file) {
72     die "$0: cannot open input file $input_file: $!\n";
73 }
74
75 my $dbh = C4::Context->dbh;
76 $dbh->{AutoCommit} = 0;
77 process_batch($input_file, $record_type, $match, $add_items, $batch_comment);
78 $dbh->commit();
79
80 exit 0;
81
82 sub process_batch {
83     my ($input_file, $record_type, $match, $add_items, $batch_comment) = @_;
84
85     open IN, "<$input_file" or die "$0: cannot open input file $input_file: $!\n";
86     my $marc_records = "";
87     $/ = "\035";
88     my $num_input_records = 0;
89     while (<IN>) {
90         s/^\s+//;
91         s/\s+$//;
92         next unless $_; # skip if record has only whitespace, as might occur
93                         # if file includes newlines between each MARC record
94         $marc_records .= $_; # FIXME - this sort of string concatenation
95                              # is probably rather inefficient
96         $num_input_records++;
97     }
98     close IN;
99
100     print "... staging MARC records -- please wait\n";
101     my ($batch_id, $num_valid_records, $num_items, @import_errors) =
102         BatchStageMarcRecords($record_type, $encoding, $marc_records, $input_file, $batch_comment, '', $add_items, 0,
103                               100, \&print_progress_and_commit);
104     print "... finished staging MARC records\n";
105
106     my $num_with_matches = 0;
107     if ($match) {
108         my $matcher = C4::Matcher->fetch($match) ;
109         if (defined $matcher) {
110             SetImportBatchMatcher($batch_id, $match);
111         } elsif ($record_type eq 'biblio')  {
112             $matcher = C4::Matcher->new($record_type);
113             $matcher->add_simple_matchpoint('isbn', 1000, '020', 'a', -1, 0, '');
114             $matcher->add_simple_required_check('245', 'a', -1, 0, '',
115                                             '245', 'a', -1, 0, '');
116         }
117         # set default record overlay behavior
118         SetImportBatchOverlayAction($batch_id, ($no_replace) ? 'ignore' : 'replace');
119         SetImportBatchNoMatchAction($batch_id, 'create_new');
120         SetImportBatchItemAction($batch_id, 'always_add');
121         print "... looking for matches with records already in database\n";
122         $num_with_matches = BatchFindDuplicates($batch_id, $matcher, 10, 100, \&print_progress_and_commit);
123         print "... finished looking for matches\n";
124     }
125
126     my $num_invalid_records = scalar(@import_errors);
127     print <<_SUMMARY_;
128
129 MARC record staging report
130 ------------------------------------
131 Input file:                 $input_file
132 Record type:                $record_type
133 Number of input records:    $num_input_records
134 Number of valid records:    $num_valid_records
135 Number of invalid records:  $num_invalid_records
136 _SUMMARY_
137     if ($match) {
138         print "Number of records matched:  $num_with_matches\n";
139     } else {
140         print "Incoming records not matched against existing records (--match option not supplied)\n";
141     }
142     if ($record_type eq 'biblio') {
143         if ($add_items) {
144             print "Number of items parsed:  $num_items\n";
145         } else {
146             print "No items parsed (--add-items option not supplied)\n";
147         }
148     }
149
150     print "\n";
151     print "Batch number assigned:  $batch_id\n";
152     print "\n";
153 }
154
155 sub print_progress_and_commit {
156     my $recs = shift;
157     $dbh->commit();
158     print "... processed $recs records\n";
159 }
160
161 sub print_usage {
162     print <<_USAGE_;
163 $0: stage MARC file into reservoir.
164
165 Use this batch job to load a file of MARC bibliographic
166 (with optional item information) or authority records into
167 the Koha reservoir.
168
169 After running this program to stage your file, you can use
170 either the batch job commit_file.pl or the Koha
171 Tools option "Manage Staged MARC Records" to load the
172 records into the main Koha database.
173
174 Parameters:
175     --file <file_name>      name of input MARC bib file
176     --authorities           stage authority records instead of bibs
177     --encoding <encoding>   encoding of MARC records, default is utf8.
178                             Other possible options are: MARC-8,
179                             ISO_5426, ISO_6937, ISO_8859-1, EUC-KR
180     --match <match_id>      use this option to match records
181                             in the file with records already in
182                             the database for future overlay.
183                             If <match_id> isn't defined, a default
184                             MARC21 ISBN & title match rule will be applied
185                             for bib imports.
186     --add-items             use this option to specify that
187                             item data is embedded in the MARC
188                             bibs and should be parsed.
189     --no-replace            overlay action for record: default is to
190                             replace extant with the imported record.
191     --comment <comment>     optional comment to describe
192                             the record batch; if the comment
193                             has spaces in it, surround the
194                             comment with quotation marks.
195     --help or -h            show this message.
196 _USAGE_
197 }