Merge remote-tracking branch 'kc/new/enh/bug_5917' into kcmaster
[koha.git] / misc / stage_biblios_file.pl
1 #!/usr/bin/perl
2
3 use strict;
4 #use warnings; FIXME - Bug 2505
5 BEGIN {
6     # find Koha's Perl modules
7     # test carefully before changing this
8     use FindBin;
9     eval { require "$FindBin::Bin/kohalib.pl" };
10 }
11
12 use C4::Context;
13 use C4::ImportBatch;
14 use C4::Matcher;
15 use Getopt::Long;
16
17 $| = 1;
18
19 # command-line parameters
20 my $match_bibs = 0;
21 my $add_items = 0;
22 my $input_file = "";
23 my $batch_comment = "";
24 my $want_help = 0;
25 my $no_replace ;
26
27 my $result = GetOptions(
28     'file:s'        => \$input_file,
29     'match-bibs:s'    => \$match_bibs,
30     'add-items'     => \$add_items,
31     'no-replace'    => \$no_replace,
32     'comment:s'     => \$batch_comment,
33     'h|help'        => \$want_help
34 );
35
36 if (not $result or $input_file eq "" or $want_help) {
37     print_usage();
38     exit 0;
39 }
40
41 unless (-r $input_file) {
42     die "$0: cannot open input file $input_file: $!\n";
43 }
44
45 my $dbh = C4::Context->dbh;
46 $dbh->{AutoCommit} = 0;
47 process_batch($input_file, $match_bibs, $add_items, $batch_comment);
48 $dbh->commit();
49
50 exit 0;
51
52 sub process_batch {
53     my ($input_file, $match_bibs, $add_items, $batch_comment) = @_;
54
55     open IN, "<$input_file" or die "$0: cannot open input file $input_file: $!\n";
56     my $marc_records = "";
57     $/ = "\035";
58     my $num_input_records = 0;
59     while (<IN>) {
60         s/^\s+//;
61         s/\s+$//;
62         next unless $_; # skip if record has only whitespace, as might occur
63                         # if file includes newlines between each MARC record
64         $marc_records .= $_; # FIXME - this sort of string concatenation
65                              # is probably rather inefficient
66         $num_input_records++;
67     }
68     close IN;
69
70     my $marc_flavor = C4::Context->preference('marcflavour');
71
72     print "... staging MARC records -- please wait\n";
73     my ($batch_id, $num_valid, $num_items, @import_errors) = 
74         BatchStageMarcRecords($marc_flavor, $marc_records, $input_file, $batch_comment, '', $add_items, 0,
75                               100, \&print_progress_and_commit);
76     print "... finished staging MARC records\n";
77
78     my $num_with_matches = 0;
79     if ($match_bibs) {
80         my $matcher = C4::Matcher->fetch($match_bibs) ;
81         if (! defined $matcher) {
82             $matcher = C4::Matcher->new('biblio');
83             $matcher->add_simple_matchpoint('isbn', 1000, '020', 'a', -1, 0, '');
84             $matcher->add_simple_required_check('245', 'a', -1, 0, '', 
85                                             '245', 'a', -1, 0, '');
86         } else {
87             SetImportBatchMatcher($batch_id, $match_bibs);
88         }
89         # set default record overlay behavior
90         SetImportBatchOverlayAction($batch_id, ($no_replace) ? 'ignore' : 'replace');
91         SetImportBatchNoMatchAction($batch_id, 'create_new');
92         SetImportBatchItemAction($batch_id, 'always_add');
93         print "... looking for matches with records already in database\n";
94         $num_with_matches = BatchFindBibDuplicates($batch_id, $matcher, 10, 100, \&print_progress_and_commit);
95         print "... finished looking for matches\n";
96     }
97
98     my $num_invalid_bibs = scalar(@import_errors);
99     print <<_SUMMARY_;
100
101 MARC record staging report
102 ------------------------------------
103 Input file:              $input_file
104 Number of input bibs:    $num_input_records
105 Number of valid bibs:    $num_valid
106 Number of invalid bibs:  $num_invalid_bibs
107 _SUMMARY_
108     if ($match_bibs) {
109         print "Number of bibs matched:  $num_with_matches\n";
110     } else {
111         print "Incoming bibs not matched against existing bibs (--match-bibs option not supplied)\n";
112     }
113     if ($add_items) {
114         print "Number of items parsed:  $num_items\n";
115     } else {
116         print "No items parsed (--add-items option not supplied)\n";
117     }
118
119     print "\n";
120     print "Batch number assigned:  $batch_id\n";
121     print "\n";
122 }
123
124 sub print_progress_and_commit {
125     my $recs = shift;
126     $dbh->commit();
127     print "... processed $recs records\n";
128 }
129
130 sub print_usage {
131     print <<_USAGE_;
132 $0: stage MARC bib file into reservoir.
133
134 Use this batch job to load a file of MARC bibliographic records
135 (with optional item information) into the Koha reservoir.
136
137 After running this program to stage your file, you can use
138 either the batch job commit_biblios_file.pl or the Koha
139 Tools option "Manage Staged MARC Records" to load the
140 records into the main Koha database.
141
142 Parameters:
143     --file <file_name>      name of input MARC bib file
144     --match-bibs <match_id> use this option to match bibs
145                             in the file with bibs already in 
146                             the database for future overlay.
147                             If <match_id> isn't defined, a default 
148                             MARC21 ISBN & title match rule will be applied.
149     --add-items             use this option to specify that
150                             item data is embedded in the MARC
151                             bibs and should be parsed.
152     --no-replace            overlay action for bib record: default is to 
153                             replace extant bib with the imported record.
154     --comment <comment>     optional comment to describe
155                             the record batch; if the comment
156                             has spaces in it, surround the
157                             comment with quotation marks.
158     --help or -h            show this message.
159 _USAGE_
160 }