Use MARC controlnumber as a unique identifier for MARC records, in addition
[koha.git] / acqui.simple / marcimport.pl
1 #!/usr/bin/perl
2
3
4 my $lc1='#dddddd';
5 my $lc2='#ddaaaa';
6
7
8 use C4::Database;
9 use CGI;
10 use DBI;
11 #use strict;
12 use C4::Acquisitions;
13 use C4::Output;
14 my $dbh=C4Connect;
15 my $userid=$ENV{'REMOTE_USER'};
16 %tagtext = (
17     '001' => 'Control number',
18     '003' => 'Control number identifier',
19     '005' => 'Date and time of latest transaction',
20     '006' => 'Fixed-length data elements -- additional material characteristics',
21     '007' => 'Physical description fixed field',
22     '008' => 'Fixed length data elements',
23     '010' => 'LCCN',
24     '015' => 'LCCN Cdn',
25     '020' => 'ISBN',
26     '022' => 'ISSN',
27     '037' => 'Source of acquisition',
28     '040' => 'Cataloging source',
29     '041' => 'Language code',
30     '043' => 'Geographic area code',
31     '050' => 'Library of Congress call number',
32     '060' => 'National Library of Medicine call number',
33     '082' => 'Dewey decimal call number',
34     '100' => 'Main entry -- Personal name',
35     '110' => 'Main entry -- Corporate name',
36     '130' => 'Main entry -- Uniform title',
37     '240' => 'Uniform title',
38     '245' => 'Title statement',
39     '246' => 'Varying form of title',
40     '250' => 'Edition statement',
41     '256' => 'Computer file characteristics',
42     '260' => 'Publication, distribution, etc.',
43     '263' => 'Projected publication date',
44     '300' => 'Physical description',
45     '306' => 'Playing time',
46     '440' => 'Series statement / Added entry -- Title',
47     '490' => 'Series statement',
48     '500' => 'General note',
49     '504' => 'Bibliography, etc. note',
50     '505' => 'Formatted contents note',
51     '508' => 'Creation/production credits note',
52     '510' => 'Citation/references note',
53     '511' => 'Participant or performer note',
54     '520' => 'Summary, etc. note',
55     '521' => 'Target audience note (ie age)',
56     '530' => 'Additional physical form available note',
57     '538' => 'System details note',
58     '586' => 'Awards note',
59     '600' => 'Subject added entry -- Personal name',
60     '610' => 'Subject added entry -- Corporate name',
61     '650' => 'Subject added entry -- Topical term',
62     '651' => 'Subject added entry -- Geographic name',
63     '656' => 'Index term -- Occupation',
64     '700' => 'Added entry -- Personal name',
65     '710' => 'Added entry -- Corporate name',
66     '730' => 'Added entry -- Uniform title',
67     '740' => 'Added entry -- Uncontrolled related/analytical title',
68     '800' => 'Series added entry -- Personal name',
69     '830' => 'Series added entry -- Uniform title',
70     '852' => 'Location',
71     '856' => 'Electronic location and access',
72 );
73
74
75 my $input = new CGI;
76 my $dbh=C4Connect;
77
78 print $input->header;
79 print startpage();
80 print startmenu('acquisitions');
81 my $file=$input->param('file');
82
83 if ($input->param('insertnewrecord')) {
84     my $isbn=$input->param('isbn');
85     my $issn=$input->param('issn');
86     my $lccn=$input->param('lccn');
87     my $q_origisbn=$dbh->quote($input->param('origisbn'));
88     my $q_origissn=$dbh->quote($input->param('origissn'));
89     my $q_origlccn=$dbh->quote($input->param('origlccn'));
90     my $q_origcontrolnumber=$dbh->quote($input->param('origcontrolnumber'));
91     my $q_isbn=$dbh->quote((($isbn) || ('NIL')));
92     my $q_issn=$dbh->quote((($issn) || ('NIL')));
93     my $q_lccn=$dbh->quote((($lccn) || ('NIL')));
94     $sth=$dbh->prepare("insert into marcrecorddone values ($q_origisbn, $q_origissn, $q_origlccn, $q_origcontrolnumber)");
95     $sth->execute;
96     my $sth=$dbh->prepare("select biblionumber,biblioitemnumber from biblioitems where issn=$q_issn or isbn=$q_isbn or lccn=$q_lccn");
97     $sth->execute;
98     my $biblionumber=0;
99     my $biblioitemnumber=0;
100     print "<center>\n";
101     print "<a href=marcimport.pl?file=$file>New Record</a> | <a href=marcimport.pl>New File</a><br>\n";
102     if ($sth->rows) {
103         ($biblionumber, $biblioitemnumber) = $sth->fetchrow;
104         my $title=$input->param('title');
105         print << "EOF";
106         <table border=0 width=50% cellpadding=10 cellspacing=0>
107         <tr><th bgcolor=black><font color=white>Record already in database</font></th></tr>
108         <tr><td bgcolor=#dddddd>$title is already in the database with biblionumber $biblionumber and biblioitemnumber $biblioitemnumber</td></tr>
109         </table>
110         <p>
111 EOF
112     } else {
113         my $q_title=$dbh->quote($input->param('title'));
114         my $q_subtitle=$dbh->quote($input->param('subtitle'));
115         my $q_author=$dbh->quote($input->param('author'));
116         my $q_copyrightdate=$dbh->quote($input->param('copyrightdate'));
117         my $q_seriestitle=$dbh->quote($input->param('seriestitle'));
118         $sth=$dbh->prepare("select biblionumber from biblio where title=$q_title and author=$q_author and copyrightdate=$q_copyrightdate and seriestitle=$q_seriestitle");
119         $sth->execute;
120         if ($sth->rows) {
121             ($biblionumber) = $sth->fetchrow;
122         } else {
123             $sth=$dbh->prepare("select max(biblionumber) from biblio");
124             $sth->execute;
125             ($biblionumber) = $sth->fetchrow;
126             $biblionumber++;
127             $sth=$dbh->prepare("insert into biblio (biblionumber, title, author, copyrightdate, seriestitle) values ($biblionumber, $q_title, $q_author, $q_copyrightdate, $q_seriestitle)");
128             $sth->execute;
129             $sth=$dbh->prepare("insert into bibliosubtitle (biblionumber,subtitle) values ($biblionumber, $q_subtitle)");
130             $sth->execute;
131         }
132         $sth=$dbh->prepare("select max(biblioitemnumber) from biblioitems");
133         $sth->execute;
134         ($biblioitemnumber) = $sth->fetchrow;
135         $biblioitemnumber++;
136         my $q_isbn=$dbh->quote($isbn);
137         my $q_issn=$dbh->quote($issn);
138         my $q_lccn=$dbh->quote($lccn);
139         my $q_volume=$dbh->quote($input->param('volume'));
140         my $q_number=$dbh->quote($input->param('number'));
141         my $q_itemtype=$dbh->quote($input->param('itemtype'));
142         my $q_dewey=$dbh->quote($input->param('dewey'));
143         my $q_subclass=$dbh->quote($input->param('subclass'));
144         my $q_publicationyear=$dbh->quote($input->param('publicationyear'));
145         my $q_publishercode=$dbh->quote($input->param('publishercode'));
146         my $q_volumedate=$dbh->quote($input->param('volumedate'));
147         my $q_volumeddesc=$dbh->quote($input->param('volumeddesc'));
148         my $q_illus=$dbh->quote($input->param('illustrator'));
149         my $q_pages=$dbh->quote($input->param('pages'));
150         my $q_notes=$dbh->quote($input->param('note'));
151         my $q_size=$dbh->quote($input->param('size'));
152         my $q_place=$dbh->quote($input->param('place'));
153         my $q_marc=$dbh->quote($input->param('marc'));
154
155         $sth=$dbh->prepare("insert into biblioitems (biblioitemnumber, biblionumber, volume, number, itemtype, isbn, issn, dewey, subclass, publicationyear, publishercode, volumedate, volumeddesc, illus, pages, notes, size, place, lccn, marc) values ($biblioitemnumber, $biblionumber, $q_volume, $q_number, $q_itemtype, $q_isbn, $q_issn, $q_dewey, $q_subclass, $q_publicationyear, $q_publishercode, $q_volumedate, $q_volumeddesc, $q_illus, $q_pages, $q_notes, $q_size, $q_place, $q_lccn, $q_marc)");
156         $sth->execute;
157         my $subjectheadings=$input->param('subject');
158         my $additionalauthors=$input->param('additionalauthors');
159         my @subjectheadings=split(/\n/,$subjectheadings);
160         my $subjectheading;
161         foreach $subjectheading (@subjectheadings) {
162             # remove any line ending characters (Ctrl-J or M)
163             $subjectheading=~s/\013//g;
164             $subjectheading=~s/\010//g;
165             # convert to upper case
166             $subjectheading=uc($subjectheading);
167             chomp ($subjectheading);
168             while (ord(substr($subjectheading, length($subjectheading)-1, 1))<14) {
169                 chop $subjectheading;
170             }
171             # quote value
172             my $q_subjectheading=$dbh->quote($subjectheading);
173             $sth=$dbh->prepare("insert into bibliosubject (biblionumber,subject)
174                 values ($biblionumber, $q_subjectheading)");
175             $sth->execute;
176         }
177         my @additionalauthors=split(/\n/,$additionalauthors);
178         my $additionalauthor;
179         foreach $additionalauthor (@additionalauthors) {
180             # remove any line ending characters (Ctrl-L or Ctrl-M)
181             $additionalauthor=~s/\013//g;
182             $additionalauthor=~s/\010//g;
183             # convert to upper case
184             $additionalauthor=uc($additionalauthor);
185             # quote value
186             my $q_additionalauthor=$dbh->quote($additionalauthor);
187             $sth=$dbh->prepare("insert into additionalauthors (biblionumber,author) values ($biblionumber, $q_additionalauthor)");
188             $sth->execute;
189         }
190
191         my $title=$input->param('title');
192         print << "EOF";
193         <table cellpadding=10 cellspacing=0 border=0 width=50%>
194         <tr><th bgcolor=black><font color=white>Record entered into database</font></th></tr>
195         <tr><td bgcolor=#dddddd>$title has been entered into the database with biblionumber
196         $biblionumber and biblioitemnumber $biblioitemnumber</td></tr>
197         </table>
198 EOF
199     }
200     my $title=$input->param('title');
201     $sth=$dbh->prepare("select max(barcode) from items");
202     $sth->execute;
203     my ($barcode) = $sth->fetchrow;
204     $barcode++;
205     print << "EOF";
206     <table border=0 cellpadding=10 cellspacing=0>
207     <tr><th bgcolor=black><font color=white>
208 Add a New Item for $title
209 </font>
210 </th></tr>
211 <tr><td bgcolor=#dddddd>
212 <form>
213 <input type=hidden name=newitem value=1>
214 <input type=hidden name=biblionumber value=$biblionumber>
215 <input type=hidden name=biblioitemnumber value=$biblioitemnumber>
216 <input type=hidden name=file value=$file>
217 <table border=0>
218 <tr><td>BARCODE</td><td><input name=barcode size=10 value=$barcode> Home Branch: <select name=homebranch><option value='STWE'>Stewart Elementary<option value='MEZ'>Meziadin Elementary</select></td></tr>
219 </tr><td>Replacement Price:</td><td><input name=replacementprice size=10></td></tr>
220 <tr><td>Notes</td><td><textarea name=notes rows=4 cols=40
221 wrap=physical></textarea></td></tr>
222 </table>
223 </td></tr>
224 </table>
225 <p>
226 <input type=submit value="Add Item">
227 </form>
228 EOF
229 print endmenu();
230 print endpage();
231
232 exit;
233 }
234
235 if ($input->param('newitem')) {
236     my $barcode=$input->param('barcode');
237     my $q_barcode=$dbh->quote($barcode);
238     my $q_notes=$dbh->quote($input->param('notes'));
239     my $q_homebranch=$dbh->quote($input->param('homebranch'));
240     my $biblionumber=$input->param('biblionumber');
241     my $biblioitemnumber=$input->param('biblioitemnumber');
242     my $replacementprice=($input->param('replacementprice') || 0);
243     my $sth=$dbh->prepare("select max(itemnumber) from items");
244     $sth->execute;
245     my ($itemnumber) = $sth->fetchrow;
246     $itemnumber++;
247     my @datearr=localtime(time);
248     my $date=(1900+$datearr[5])."-".($datearr[4]+1)."-".$datearr[3];
249     $sth=$dbh->prepare("insert into items (itemnumber, biblionumber, biblioitemnumber, barcode, itemnotes, homebranch, holdingbranch, dateaccessioned, replacementprice) values ($itemnumber, $biblionumber, $biblioitemnumber, $q_barcode, $q_notes, $q_homebranch, 'STWE', '$date', $replacementprice)");
250     $sth->execute;
251 }
252
253
254 if ($file) {
255     my $qisbn=$input->param('isbn');
256     my $qissn=$input->param('issn');
257     my $qlccn=$input->param('lccn');
258     my $qcontrolnumber=$input->param('controlnumber');
259     if ($qisbn || $qissn || $qlccn || $qcontrolnumber) {
260         print "<a href=marcimport.pl>New File</a><hr>\n";
261         open (F, "$file");
262         my $data=<F>;
263
264         $splitchar=chr(29);
265         my @records;
266         foreach $record (split(/$splitchar/, $data)) {
267             my $marctext="<table border=0 cellspacing=0>\n";
268             $marctext.="<tr><th colspan=3 bgcolor=black><font color=white>MARC RECORD</font></th></tr>\n";
269             $leader=substr($record,0,24);
270             $marctext.="<tr><td>Leader:</td><td colspan=2>$leader</td></tr>\n";
271             $record=substr($record,24);
272             $splitchar2=chr(30);
273             my $directory=0;
274             my $tagcounter=0;
275             my %tag;
276             my @record;
277             foreach $field (split(/$splitchar2/, $record)) {
278                 my %field;
279                 ($color eq $lc1) ? ($color=$lc2) : ($color=$lc1);
280                 unless ($directory) {
281                     $directory=$field;
282                     my $itemcounter=1;
283                     $counter=0;
284                     while ($item=substr($directory,0,12)) {
285                         $tag=substr($directory,0,3);
286                         $length=substr($directory,3,4);
287                         $start=substr($directory,7,6);
288                         $directory=substr($directory,12);
289                         $tag{$counter}=$tag;
290                         $counter++;
291                     }
292                     $directory=1;
293                     next;
294                 }
295                 $tag=$tag{$tagcounter};
296                 $tagcounter++;
297                 $field{'tag'}=$tag;
298                 $marctext.="<tr><td bgcolor=$color valign=top>$tagtext{$tag}</td><td bgcolor=$color valign=top>$tag</td>";
299                 $splitchar3=chr(31);
300                 my @subfields=split(/$splitchar3/, $field);
301                 $indicator=$subfields[0];
302                 $field{'indicator'}=$indicator;
303                 my $firstline=1;
304                 if ($#subfields==0) {
305                     $marctext.="<td bgcolor=$color valign=top>$indicator</td></tr>";
306                 } else {
307                     my %subfields;
308                     $marctext.="<td bgcolor=$color valign=top><table border=0 cellspacing=0>\n";
309                     my $color2=$color;
310                     for ($i=1; $i<=$#subfields; $i++) {
311                         ($color2 eq $lc1) ? ($color2=$lc2) : ($color2=$lc1);
312                         my $text=$subfields[$i];
313                         my $subfieldcode=substr($text,0,1);
314                         my $subfield=substr($text,1);
315                         $marctext.="<tr><td colour=$color2><table border=0 cellpadding=0 cellspacing=0><tr><td>$subfieldcode </td></tr></table></td><td colour=$color2>$subfield</td></tr>\n";
316                         if ($subfields{$subfieldcode}) {
317                             my $subfieldlist=$subfields{$subfieldcode};
318                             my @subfieldlist=@$subfieldlist;
319                             if ($#subfieldlist>=0) {
320                                 push (@subfieldlist, $subfield);
321                             } else {
322                                 @subfieldlist=($subfields{$subfieldcode}, $subfield);
323                             }
324                             $subfields{$subfieldcode}=\@subfieldlist;
325                         } else {
326                             $subfields{$subfieldcode}=$subfield;
327                         }
328                     }
329                     $marctext.="</table></td></tr>\n";
330                     $field{'subfields'}=\%subfields;
331                 }
332                 push (@record, \%field);
333             }
334             $marctext.="</table>\n";
335             $marctext{\@record}=$marctext;
336             $marc{\@record}=$record;
337             push (@records, \@record);
338             $counter++;
339         }
340 RECORD:
341         foreach $record (@records) {
342             my ($lccn, $isbn, $issn, $dewey, $author, $title, $place, $publisher, $publicationyear, $volume, $number, @subjects, $note, $additionalauthors, $illustrator, $copyrightdate, $seriestitle);
343             my $marctext=$marctext{$record};
344             my $marc=$marc{$record};
345             foreach $field (@$record) {
346                 if ($field->{'tag'} eq '001') {
347                     $controlnumber=$field->{'indicator'};
348                 }
349                 if ($field->{'tag'} eq '010') {
350                     $lccn=$field->{'subfields'}->{'a'};
351                     $lccn=~s/^\s*//;
352                     ($lccn) = (split(/\s+/, $lccn))[0];
353                 }
354                 if ($field->{'tag'} eq '015') {
355                     $lccn=$field->{'subfields'}->{'a'};
356                     $lccn=~s/^\s*//;
357                     $lccn=~s/^C//;
358                     ($lccn) = (split(/\s+/, $lccn))[0];
359                 }
360                 if ($field->{'tag'} eq '020') {
361                     $isbn=$field->{'subfields'}->{'a'};
362                     ($isbn=~/^ARRAY/) && ($isbn=$$isbn[0]);
363                     $isbn=~s/[^\d]*//g;
364                 }
365                 if ($field->{'tag'} eq '022') {
366                     $issn=$field->{'subfields'}->{'a'};
367                     $issn=~s/^\s*//;
368                     ($issn) = (split(/\s+/, $issn))[0];
369                 }
370                 if ($field->{'tag'} eq '082') {
371                     $dewey=$field->{'subfields'}->{'a'};
372                     $dewey=~s/\///g;
373                     if (@$dewey) {
374                         $dewey=$$dewey[0];
375                     }
376                     #$dewey=~s/\///g;
377                 }
378                 if ($field->{'tag'} eq '100') {
379                     $author=$field->{'subfields'}->{'a'};
380                 }
381                 if ($field->{'tag'} eq '245') {
382                     $title=$field->{'subfields'}->{'a'};
383                     $title=~s/ \/$//;
384                     $subtitle=$field->{'subfields'}->{'b'};
385                     $subtitle=~s/ \/$//;
386                 }
387                 if ($field->{'tag'} eq '260') {
388                     $place=$field->{'subfields'}->{'a'};
389                     if (@$place) {
390                         $place=$$place[0];
391                     }
392                     $place=~s/\s*:$//g;
393                     $publisher=$field->{'subfields'}->{'b'};
394                     if (@$publisher) {
395                         $publisher=$$publisher[0];
396                     }
397                     $publisher=~s/\s*:$//g;
398                     $publicationyear=$field->{'subfields'}->{'c'};
399                     if ($publicationyear=~/c(\d\d\d\d)/) {
400                         $copyrightdate=$1;
401                     }
402                     if ($publicationyear=~/[^c](\d\d\d\d)/) {
403                         $publicationyear=$1;
404                     } elsif ($copyrightdate) {
405                         $publicationyear=$copyrightdate;
406                     } else {
407                         $publicationyear=~/(\d\d\d\d)/;
408                         $publicationyear=$1;
409                     }
410                 }
411                 if ($field->{'tag'} eq '300') {
412                     $pages=$field->{'subfields'}->{'a'};
413                     $pages=~s/ \;$//;
414                     $size=$field->{'subfields'}->{'c'};
415                     $pages=~s/\s*:$//g;
416                     $size=~s/\s*:$//g;
417                 }
418                 if ($field->{'tag'} eq '362') {
419                     if ($field->{'subfields'}->{'a'}=~/(\d+).*(\d+)/) {
420                         $volume=$1;
421                         $number=$2;
422                     }
423                 }
424                 if ($field->{'tag'} eq '440') {
425                     $seriestitle=$field->{'subfields'}->{'a'};
426                     if ($field->{'subfields'}->{'v'}=~/(\d+).*(\d+)/) {
427                         $volume=$1;
428                         $number=$2;
429                     }
430                 }
431                 if ($field->{'tag'} eq '700') {
432                     my $name=$field->{'subfields'}->{'a'};
433                     if ($field->{'subfields'}->{'c'}=~/ill/) {
434                         $additionalauthors.="$name\n";
435                     } else {
436                         $illustrator=$name;
437                     }
438                 }
439                 if ($field->{'tag'} =~/^5/) {
440                     $note.="$field->{'subfields'}->{'a'}\n";
441                 }
442                 if ($field->{'tag'} =~/65\d/) {
443                     my $subject=$field->{'subfields'}->{'a'};
444                     $subject=~s/\.$//;
445                     if ($gensubdivision=$field->{'subfields'}->{'x'}) {
446                         my @sub=@$gensubdivision;
447                         if ($#sub>=0) {
448                             foreach $s (@sub) {
449                                 $s=~s/\.$//;
450                                 $subject.=" -- $s";
451                             }
452                         } else {
453                             $gensubdivision=~s/\.$//;
454                             $subject.=" -- $gensubdivision";
455                         }
456                     }
457                     if ($chronsubdivision=$field->{'subfields'}->{'y'}) {
458                         my @sub=@$chronsubdivision;
459                         if ($#sub>=0) {
460                             foreach $s (@sub) {
461                                 $s=~s/\.$//;
462                                 $subject.=" -- $s";
463                             }
464                         } else {
465                             $chronsubdivision=~s/\.$//;
466                             $subject.=" -- $chronsubdivision";
467                         }
468                     }
469                     if ($geosubdivision=$field->{'subfields'}->{'z'}) {
470                         my @sub=@$geosubdivision;
471                         if ($#sub>=0) {
472                             foreach $s (@sub) {
473                                 $s=~s/\.$//;
474                                 $subject.=" -- $s";
475                             }
476                         } else {
477                             $geosubdivision=~s/\.$//;
478                             $subject.=" -- $geosubdivision";
479                         }
480                     }
481                     push @subjects, $subject;
482                 }
483             }
484             $titleinput=$input->textfield(-name=>'title', -default=>$title, -size=>40);
485             $marcinput=$input->hidden(-name=>'marc', -default=>$marc);
486             $subtitleinput=$input->textfield(-name=>'subtitle', -default=>$subtitle, -size=>40);
487             $authorinput=$input->textfield(-name=>'author', -default=>$author);
488             $illustratorinput=$input->textfield(-name=>'illustrator', -default=>$illustrator);
489             $additionalauthorsinput=$input->textarea(-name=>'additionalauthors', -default=>$additionalauthors, -rows=>4, -cols=>20);
490             my $subject='';
491             foreach (@subjects) {
492                 $subject.="$_\n";
493             }
494             $subjectinput=$input->textarea(-name=>'subject', -default=>$subject, -rows=>4, -cols=>40);
495             $noteinput=$input->textarea(-name=>'note', -default=>$note, -rows=>4, -cols=>40, -wrap=>'physical');
496             $copyrightinput=$input->textfield(-name=>'copyrightdate', -default=>$copyrightdate);
497             $seriestitleinput=$input->textfield(-name=>'seriestitle', -default=>$seriestitle);
498             $volumeinput=$input->textfield(-name=>'volume', -default=>$volume);
499             $volumedateinput=$input->textfield(-name=>'volumedate', -default=>$volumedate);
500             $volumeddescinput=$input->textfield(-name=>'volumeddesc', -default=>$volumeddesc);
501             $numberinput=$input->textfield(-name=>'number', -default=>$number);
502             $isbninput=$input->textfield(-name=>'isbn', -default=>$isbn);
503             $issninput=$input->textfield(-name=>'issn', -default=>$issn);
504             $lccninput=$input->textfield(-name=>'lccn', -default=>$lccn);
505             $isbninput=$input->textfield(-name=>'isbn', -default=>$isbn);
506             $deweyinput=$input->textfield(-name=>'dewey', -default=>$dewey);
507             $cleanauthor=$author;
508             $cleanauthor=~s/[^A-Za-z]//g;
509             $subclassinput=$input->textfield(-name=>'subclass', -default=>uc(substr($cleanauthor,0,3)));
510             $publisherinput=$input->textfield(-name=>'publishercode', -default=>$publisher);
511             $pubyearinput=$input->textfield(-name=>'publicationyear', -default=>$publicationyear);
512             $placeinput=$input->textfield(-name=>'place', -default=>$place);
513             $pagesinput=$input->textfield(-name=>'pages', -default=>$pages);
514             $sizeinput=$input->textfield(-name=>'size', -default=>$size);
515             $fileinput=$input->hidden(-name=>'file', -default=>$file);
516             $origisbn=$input->hidden(-name=>'origisbn', -default=>$isbn);
517             $origissn=$input->hidden(-name=>'origissn', -default=>$issn);
518             $origlccn=$input->hidden(-name=>'origlccn', -default=>$lccn);
519             $origcontrolnumber=$input->hidden(-name=>'origcontrolnumber', -default=>$controlnumber);
520
521             my $itemtypeselect='';
522             $sth=$dbh->prepare("select itemtype,description from itemtypes");
523             $sth->execute;
524             while (my ($itemtype, $description) = $sth->fetchrow) {
525                 $itemtypeselect.="<option value=$itemtype>$itemtype - $description\n";
526             }
527             ($qissn) || ($qissn='NIL');
528             ($qlccn) || ($qlccn='NIL');
529             ($qisbn) || ($qisbn='NIL');
530             ($qcontrolnumber) || ($qcontrolnumber='NIL');
531             unless (($isbn eq $qisbn) || ($issn eq $qissn) || ($lccn eq $qlccn) || ($controlnumber eq $qcontrolnumber)) {
532                 next RECORD;
533             }
534
535             print << "EOF";
536             <center>
537             <h1>New Record</h1>
538             Full MARC Record available at bottom
539             <form method=post>
540             <table border=1>
541             <tr><td>Title</td><td>$titleinput</td></tr>
542             <tr><td>Subtitle</td><td>$subtitleinput</td></tr>
543             <tr><td>Author</td><td>$authorinput</td></tr>
544             <tr><td>Additional Authors</td><td>$additionalauthorsinput</td></tr>
545             <tr><td>Illustrator</td><td>$illustratorinput</td></tr>
546             <tr><td>Copyright</td><td>$copyrightinput</td></tr>
547             <tr><td>Series Title</td><td>$seriestitleinput</td></tr>
548             <tr><td>Volume</td><td>$volumeinput</td></tr>
549             <tr><td>Number</td><td>$numberinput</td></tr>
550             <tr><td>Volume Date</td><td>$volumedateinput</td></tr>
551             <tr><td>Volume Description</td><td>$volumeddescinput</td></tr>
552             <tr><td>Subject</td><td>$subjectinput</td></tr>
553             <tr><td>Notes</td><td>$noteinput</td></tr>
554             <tr><td>Item Type</td><td><select name=itemtype>$itemtypeselect</select></td></tr>
555             <tr><td>ISBN</td><td>$isbninput</td></tr>
556             <tr><td>ISSN</td><td>$issninput</td></tr>
557             <tr><td>LCCN</td><td>$lccninput</td></tr>
558             <tr><td>Dewey</td><td>$deweyinput</td></tr>
559             <tr><td>Subclass</td><td>$subclassinput</td></tr>
560             <tr><td>Publication Year</td><td>$pubyearinput</td></tr>
561             <tr><td>Publisher</td><td>$publisherinput</td></tr>
562             <tr><td>Place</td><td>$placeinput</td></tr>
563             <tr><td>Pages</td><td>$pagesinput</td></tr>
564             <tr><td>Size</td><td>$sizeinput</td></tr>
565             </table>
566             <input type=submit>
567             <input type=hidden name=insertnewrecord value=1>
568             $fileinput
569             $marcinput
570             $origisbn
571             $origissn
572             $origlccn
573             $origcontrolnumber
574             </form>
575             $marctext
576 EOF
577         }
578     } else {
579         open (F, "$file");
580         my $data=<F>;
581
582         $splitchar=chr(29);
583         my @records;
584         foreach $record (split(/$splitchar/, $data)) {
585             $leader=substr($record,0,24);
586             #print "<tr><td>Leader:</td><td>$leader</td></tr>\n";
587             $record=substr($record,24);
588             $splitchar2=chr(30);
589             my $directory=0;
590             my $tagcounter=0;
591             my %tag;
592             my @record;
593             foreach $field (split(/$splitchar2/, $record)) {
594                 my %field;
595                 ($color eq $lc1) ? ($color=$lc2) : ($color=$lc1);
596                 unless ($directory) {
597                     $directory=$field;
598                     my $itemcounter=1;
599                     $counter=0;
600                     while ($item=substr($directory,0,12)) {
601                         $tag=substr($directory,0,3);
602                         $length=substr($directory,3,4);
603                         $start=substr($directory,7,6);
604                         $directory=substr($directory,12);
605                         $tag{$counter}=$tag;
606                         $counter++;
607                     }
608                     $directory=1;
609                     next;
610                 }
611                 $tag=$tag{$tagcounter};
612                 $tagcounter++;
613                 $field{'tag'}=$tag;
614                 $splitchar3=chr(31);
615                 my @subfields=split(/$splitchar3/, $field);
616                 $indicator=$subfields[0];
617                 $field{'indicator'}=$indicator;
618                 my $firstline=1;
619                 unless ($#subfields==0) {
620                     my %subfields;
621                     for ($i=1; $i<=$#subfields; $i++) {
622                         my $text=$subfields[$i];
623                         my $subfieldcode=substr($text,0,1);
624                         my $subfield=substr($text,1);
625                         if ($subfields{$subfieldcode}) {
626                             my $subfieldlist=$subfields{$subfieldcode};
627                             my @subfieldlist=@$subfieldlist;
628                             if ($#subfieldlist>=0) {
629 #                       print "$tag Adding to array $subfieldcode -- $subfield<br>\n";
630                                 push (@subfieldlist, $subfield);
631                             } else {
632 #                       print "$tag Arraying $subfieldcode -- $subfield<br>\n";
633                                 @subfieldlist=($subfields{$subfieldcode}, $subfield);
634                             }
635                             $subfields{$subfieldcode}=\@subfieldlist;
636                         } else {
637                             $subfields{$subfieldcode}=$subfield;
638                         }
639                     }
640                     $field{'subfields'}=\%subfields;
641                 }
642                 push (@record, \%field);
643             }
644             push (@records, \@record);
645             $counter++;
646         }
647         print << "EOF";
648         <center>
649         <p>
650         <a href=marcimport.pl>Select a New File</a>
651         <p>
652         <table border=0 cellpadding=10 cellspacing=0>
653         <tr><th bgcolor=black><font color=white>Select a Record to Import</font></th></tr>
654         <tr><td bgcolor=#dddddd>
655 EOF
656         my $text='';
657         foreach $record (@records) {
658             my @subjects=();
659             my ($lccn, $isbn, $issn, $dewey, $author, $title, $place, $publisher, $publicationyear, $volume, $number, @subjects, $note, $controlnumber);
660             foreach $field (@$record) {
661                 $text.=$field->{'tag'}."\n";
662                 foreach (keys %{$field->{'subfields'}}) {
663                     my $value=$field->{'subfields'}->{$_};
664                     $text.="  $_: $value\n";
665                 }
666                 if ($field->{'tag'} eq '001') {
667                     $controlnumber=$field->{'indicator'};
668                 }
669                 if ($field->{'tag'} eq '010') {
670                     $lccn=$field->{'subfields'}->{'a'};
671                     $lccn=~s/^\s*//;
672                     ($lccn) = (split(/\s+/, $lccn))[0];
673                 }
674                 if ($field->{'tag'} eq '015') {
675                     $lccn=$field->{'subfields'}->{'a'};
676                     $lccn=~s/^\s*//;
677                     $lccn=~s/^C//;
678                     ($lccn) = (split(/\s+/, $lccn))[0];
679                 }
680                 if ($field->{'tag'} eq '020') {
681                     $isbn=$field->{'subfields'}->{'a'};
682                     ($isbn=~/ARRAY/) && ($isbn=$$isbn[0]);
683                     $isbn=~s/[^\d]*//g;
684                 }
685                 if ($field->{'tag'} eq '022') {
686                     $issn=$field->{'subfields'}->{'a'};
687                     $issn=~s/^\s*//;
688                     ($issn) = (split(/\s+/, $issn))[0];
689                 }
690                 if ($field->{'tag'} eq '082') {
691                     $dewey=$field->{'subfields'}->{'a'};
692                     $dewey=~s/\///g;
693                     if (@$dewey) {
694                         $dewey=$$dewey[0];
695                     }
696                     #$dewey=~s/\///g;
697                 }
698                 if ($field->{'tag'} eq '100') {
699                     $author=$field->{'subfields'}->{'a'};
700                 }
701                 if ($field->{'tag'} eq '245') {
702                     $title=$field->{'subfields'}->{'a'};
703                     $title=~s/ \/$//;
704                     $subtitle=$field->{'subfields'}->{'b'};
705                     $subtitle=~s/ \/$//;
706                 }
707                 if ($field->{'tag'} eq '260') {
708                     $place=$field->{'subfields'}->{'a'};
709                     if (@$place) {
710                         $place=$$place[0];
711                     }
712                     $place=~s/\s*:$//g;
713                     $publisher=$field->{'subfields'}->{'b'};
714                     if (@$publisher) {
715                         $publisher=$$publisher[0];
716                     }
717                     $publisher=~s/\s*:$//g;
718                     $publicationyear=$field->{'subfields'}->{'c'};
719                     if ($publicationyear=~/c(\d\d\d\d)/) {
720                         $copyrightdate=$1;
721                     }
722                     if ($publicationyear=~/[^c](\d\d\d\d)/) {
723                         $publicationyear=$1;
724                     } elsif ($copyrightdate) {
725                         $publicationyear=$copyrightdate;
726                     } else {
727                         $publicationyear=~/(\d\d\d\d)/;
728                         $publicationyear=$1;
729                     }
730                 }
731                 if ($field->{'tag'} eq '300') {
732                     $pages=$field->{'subfields'}->{'a'};
733                     $pages=~s/ \;$//;
734                     $size=$field->{'subfields'}->{'c'};
735                     $pages=~s/\s*:$//g;
736                     $size=~s/\s*:$//g;
737                 }
738                 if ($field->{'tag'} eq '362') {
739                     if ($field->{'subfields'}->{'a'}=~/(\d+).*(\d+)/) {
740                         $volume=$1;
741                         $number=$2;
742                     }
743                 }
744                 if ($field->{'tag'} eq '440') {
745                     $seriestitle=$field->{'subfields'}->{'a'};
746                     if ($field->{'subfields'}->{'v'}=~/(\d+).*(\d+)/) {
747                         $volume=$1;
748                         $number=$2;
749                     }
750                 }
751                 if ($field->{'tag'} =~/^5/) {
752                     $note.="$field->{'subfields'}->{'a'}\n";
753                 }
754                 if ($field->{'tag'} =~/65\d/) {
755                     my $subject=$field->{'subfields'}->{'a'};
756                     $subject=~s/\.$//;
757                     if ($gensubdivision=$field->{'subfields'}->{'x'}) {
758                         my @sub=@$gensubdivision;
759                         if ($#sub>=0) {
760                             foreach $s (@sub) {
761                                 $s=~s/\.$//;
762                                 $subject.=" -- $s";
763                             }
764                         } else {
765                             $gensubdivision=~s/\.$//;
766                             $subject.=" -- $gensubdivision";
767                         }
768                     }
769                     if ($chronsubdivision=$field->{'subfields'}->{'y'}) {
770                         my @sub=@$chronsubdivision;
771                         if ($#sub>=0) {
772                             foreach $s (@sub) {
773                                 $s=~s/\.$//;
774                                 $subject.=" -- $s";
775                             }
776                         } else {
777                             $chronsubdivision=~s/\.$//;
778                             $subject.=" -- $chronsubdivision";
779                         }
780                     }
781                     if ($geosubdivision=$field->{'subfields'}->{'z'}) {
782                         my @sub=@$geosubdivision;
783                         if ($#sub>=0) {
784                             foreach $s (@sub) {
785                                 $s=~s/\.$//;
786                                 $subject.=" -- $s";
787                             }
788                         } else {
789                             $geosubdivision=~s/\.$//;
790                             $subject.=" -- $geosubdivision";
791                         }
792                     }
793                     push @subjects, $subject;
794                 }
795             }
796             my $q_isbn=$dbh->quote((($isbn) || ('NIL')));
797             my $q_issn=$dbh->quote((($issn) || ('NIL')));
798             my $q_lccn=$dbh->quote((($lccn) || ('NIL')));
799             my $q_controlnumber=$dbh->quote((($controlnumber) || ('NIL')));
800             my $sth=$dbh->prepare("select * from marcrecorddone where isbn=$q_isbn or issn=$q_issn or lccn=$q_lccn or controlnumber=$q_controlnumber");
801             $sth->execute;
802             my $donetext='';
803             if ($sth->rows) {
804                 $donetext="DONE";
805             }
806             $sth=$dbh->prepare("select * from biblioitems where isbn=$q_isbn or issn=$q_issn or lccn=$q_lccn");
807             $sth->execute;
808             if ($sth->rows) {
809                 $donetext="DONE";
810             }
811             if ($isbn) {
812                 print "<a href=marcimport.pl?file=$file&isbn=$isbn>$title by $author</a> $donetext<br>\n";
813             } elsif ($lccn) {
814                 print "<a href=marcimport.pl?file=$file&lccn=$lccn>$title by $author</a> $donetext<br>\n";
815             } elsif ($issn) {
816                 print "<a href=marcimport.pl?file=$file&issn=$issn>$title by $author</a><br> $donetext\n";
817             } elsif ($controlnumber) {
818                 print "<a href=marcimport.pl?file=$file&controlnumber=$controlnumber>$title by $author</a><br> $donetext\n";
819             } else {
820                 print "Error: Contact steve regarding $title by $author<br>\n";
821             }
822         }
823         print "</td></tr></table>\n";
824     }
825 } else {
826     opendir(D, "/home/$userid/");
827     my @dirlist=readdir D;
828     foreach $file (@dirlist) {
829         (next) if ($file=~/^\./);
830         (next) if ($file=~/^nsmail$/);
831         (next) if ($file=~/^public_html$/);
832         ($file=~/\.mrc/) || ($filelist.="$file<br>\n");
833         (next) unless ($file=~/\.mrc$/);
834         $file=~s/ /\%20/g;
835         print "<a href=marcimport.pl?file=/home/$userid/$file>$file</a><br>\n";
836     }
837     print << "EOF";
838     <form method=get>
839     File to read MARC records from: <input name=file size=30>
840     <p>
841     Other files in home directory:<p>
842     $filelist
843     </form>
844 EOF
845 }
846 print endmenu();
847 print endpage();
848