Now, the API...
[koha.git] / C4 / Biblio.pm
1 package C4::Biblio; 
2 # $Id$
3 # $Log$
4 # Revision 1.5  2002/07/24 16:11:37  tipaul
5 # Now, the API...
6 # Database.pm and Output.pm are almost not modified (var test...)
7 #
8 # Biblio.pm is almost completly rewritten.
9 #
10 # WHAT DOES IT ??? ==> END of Hitchcock suspens
11 #
12 # 1st, it does... nothing...
13 # Every old API should be there. So if MARC-stuff is not done, the behaviour is EXACTLY the same (if there is no added bug, of course). So, if you use normal acquisition, you won't find anything new neither on screen or old-DB tables ...
14 #
15 # All old-API functions have been cloned. for example, the "newbiblio" sub, now has become :
16 # * a "newbiblio" sub, with the same parameters. It just call a sub named OLDnewbiblio
17 # * a "OLDnewbiblio" sub, which is a copy/paste of the previous newbiblio sub. Then, when you want to add the MARC-DB stuff, you can modify the newbiblio sub without modifying the OLDnewbiblio one. If we correct a bug in 1.2 in newbiblio, we can do the same in main branch by correcting OLDnewbiblio.
18 # * The MARC stuff is usually done through a sub named MARCxxx where xxx is the same as OLDxxx. For example, newbiblio calls MARCnewbiblio. the MARCxxx subs use a MARC::Record as parameter.
19 # The last thing to solve was to manage biblios through real MARC import : they must populate the old-db, but must populate the MARC-DB too, without loosing information (if we go from MARC::Record to old-data then back to MARC::Record, we loose A LOT OF ROWS). To do this, there are subs beginning by "ALLxxx" : they manage datas with MARC::Record datas. they call OLDxxx sub too (to populate old-DB), but MARCxxx subs too, with a complete MARC::Record ;-)
20 #
21 # In Biblio.pm, there are some subs that permits to build a old-style record from a MARC::Record, and the opposite. There is also a sub finding a MARC-bibid from a old-biblionumber and the opposite too.
22 # Note we have decided with steve that a old-biblio <=> a MARC-Biblio.
23 #
24
25 # Contains all sub used for biblio management. tables :
26 # biblio, biblioitems, items
27 # bibliosubject, bibliosubtitle
28
29 # move from 1.2 to 1.4 version : 
30 # 1.2 and previous version uses a specific API to manage biblios. This API uses old-DB style parameters.
31 # In the 1.4 version, we want to do 2 differents things :
32 #  - keep populating the old-DB, that has a LOT less datas than MARC
33 #  - populate the MARC-DB
34 # To populate the DBs we have 2 differents sources :
35 #  - the standard acquisition system (through book sellers), that does'nt use MARC data
36 #  - the MARC acquisition system, that uses MARC data.
37 #
38 # thus, we have 2 differents cases :
39 #   - with the standard acquisition system, we have non MARC data and want to populate old-DB and MARC-DB, knowing it's an incomplete MARC-record
40 #   - with the MARC acquisition system, we have MARC datas, and want to loose nothing in MARC-DB. So, we can't store datas in old-DB, then copy in MARC-DB.
41 #       we MUST have an API for true MARC data, that populate MARC-DB then old-DB
42 #
43 # That's why we need 4 subs :
44 # all subs beginning by MARC manage only MARC tables. They manage MARC-DB with MARC::Record parameters
45 # all subs beginning by OLD manage only OLD-DB tables. They manage old-DB with old-DB parameters
46 # all subs beginning by ALL manage both OLD-DB and MARC tables. They use MARC::Record as parameters. it's the API that MUST be used in MARC acquisition system
47 # all subs beginning by seomething else are the old-style API. They use old-DB as parameter, then call internally the OLD and MARC subs.
48 #
49 # only ALL and old-style API should be used in koha. MARC and OLD is used internally only
50 #
51 # Thus, we assume a nice translation to future versions : if we want in a 1.6 release completly forget old-DB, we can do it easily.
52 # in 1.4 version, the translations will be nicer, as we have NOTHING to do in code. Everything has to be done in Biblio.pm ;-)
53
54
55 use strict;
56 require Exporter;
57 use C4::Database;
58 use MARC::Record;
59
60 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
61
62 # set the version for version checking
63 $VERSION = 0.01;
64
65 @ISA = qw(Exporter);
66 #
67 # don't forget MARCxxx subs are here only for testing purposes. Should not be used
68 # as the old-style API and the ALL one are the only public functions.
69 #
70 @EXPORT = qw(
71              &updateBiblio &updateBiblioItem &updateItem 
72              &itemcount &newbiblio &newbiblioitem 
73              &modnote &newsubject &newsubtitle
74              &modbiblio &checkitems
75              &newitems &modbibitem
76              &modsubtitle &modsubject &modaddauthor &moditem &countitems 
77              &delitem &deletebiblioitem &delbiblio  
78              &getitemtypes &getbiblio
79              &getbiblioitembybiblionumber
80              &getbiblioitem &getitemsbybiblioitem &isbnsearch
81              &skip
82              &newcompletebiblioitem
83
84              &ALLnewbiblio &ALLnewitem
85
86              &MARCgettagslib
87              &MARCaddbiblio &MARCmodsubfield &MARCaddsubfield 
88              &MARCmodbiblio
89              &MARCfindsubfield 
90              &MARCkoha2marcBiblio &MARCmarc2koha
91              &MARCgetbiblio
92              &MARCaddword &MARCdelword
93  );
94 %EXPORT_TAGS = ( );     # eg: TAG => [ qw!name1 name2! ],
95
96 # your exported package globals go here,
97 # as well as any optionally exported functions
98
99 @EXPORT_OK   = qw($Var1 %Hashit);
100
101
102 # non-exported package globals go here
103 use vars qw(@more $stuff);
104
105 # initalize package globals, first exported ones
106
107 my $Var1   = '';
108 my %Hashit = ();
109
110
111 # then the others (which are still accessible as $Some::Module::stuff)
112 my $stuff  = '';
113 my @more   = ();
114
115 # all file-scoped lexicals must be created before
116 # the functions below that use them.
117
118 # file-private lexicals go here
119 my $priv_var    = '';
120 my %secret_hash = ();
121
122 # here's a file-private function as a closure,
123 # callable as &$priv_func;  it cannot be prototyped.
124 my $priv_func = sub {
125   # stuff goes here.
126   };
127   
128 # make all your functions, whether exported or not;
129
130 #
131 #
132 # MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC MARC
133 #
134 #
135 # all the following subs takes a MARC::Record as parameter and manage
136 # the MARC-DB. They are called by the 1.0/1.2 xxx subs, and by the 
137 # ALLxxx subs (xxx deals with old-DB parameters, the ALLxxx deals with MARC-DB parameter)
138
139 =head1 SYNOPSIS
140
141   use Biblio.pm;
142   $dbh=&C4Connect;
143   taglibs = &MARCgettagslib($dbh,1|0);
144   last param is 1 for liblibrarian and 0 for libopac
145
146 =head1 DESCRIPTION
147
148   returns a hash with tag/subfield meaning
149
150 =head1 AUTHOR
151
152 Paul POULAIN paul.poulain@free.fr
153
154 =cut
155
156 sub MARCgettagslib {
157     my ($dbh,$forlibrarian)= @_;
158     my $sth;
159     if ($forlibrarian eq 1) {
160         $sth=$dbh->prepare("select tagfield,tagsubfield,liblibrarian as lib from marc_subfield_structure");
161     } else {
162         $sth=$dbh->prepare("select tagfield,tagsubfield,libopac as lib from marc_subfield_structure");
163     }
164     $sth->execute;
165     my $lib;
166     my $tag;
167     my $subfield;
168     my $res;
169     while ( ($tag,$subfield,$lib) = $sth->fetchrow) {
170         $res->{$tag}->{$subfield}=$lib;
171     }
172     return $res;
173 }
174
175 =head1 SYNOPSIS
176
177   use Biblio.pm;
178   $dbh=&C4Connect;
179   $biblio= MARC::Record->new();
180   fill $biblio
181   $bibid = &MARCfindmarcfromkohafield($dbh,$kohafield);
182
183 =head1 DESCRIPTION
184
185 finds tag and subfield for a given kohafield
186
187 =head1 AUTHOR
188     paul.poulain@free.fr
189 =cut
190
191 sub MARCfind_marc_from_kohafield {
192     my ($dbh,$kohafield) = @_;
193     my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
194     $sth->execute($kohafield);
195     my ($tagfield,$tagsubfield) = $sth->fetchrow;
196     return ($tagfield,$tagsubfield);
197 }
198
199 sub MARCfind_oldbiblionumber_from_MARCbibid {
200     my ($dbh,$MARCbibid) = @_;
201     my $sth=$dbh->prepare("select biblionumber from marc_biblio where bibid=?");
202     $sth->execute($MARCbibid);
203     my ($biblionumber) = $sth->fetchrow;
204     return $biblionumber;
205 }
206
207 sub MARCfind_MARCbibid_from_oldbiblionumber {
208     my ($dbh,$oldbiblionumber) = @_;
209     my $sth=$dbh->prepare("select bibid from marc_biblio where biblionumber=?");
210     $sth->execute($oldbiblionumber);
211     my ($bibid) = $sth->fetchrow;
212     return $bibid;
213 }
214
215 =head1 SYNOPSIS
216
217   use Biblio.pm;
218   $dbh=&C4Connect;
219   $biblio= MARC::Record->new();
220   fill $biblio
221   $bibid = &MARCaddbiblio($dbh,$biblio,$oldbiblionumber);
222
223 =head1 DESCRIPTION
224
225   Creates a biblio (in the MARC tables only).
226
227 =head1 AUTHOR
228
229 Paul POULAIN paul.poulain@free.fr
230
231 =cut
232
233 sub MARCaddbiblio {
234 # pass the MARC::Record to this function, and it will create the records in the marc tables
235     my ($dbh,$record,$biblionumber) = @_;
236     my @fields=$record->fields();
237     my $bibid;
238     # adding main table, and retrieving bibid
239     $dbh->do("lock tables marc_biblio WRITE");
240     my $sth=$dbh->prepare("insert into marc_biblio (datecreated,biblionumber) values (now(),?)");
241     $sth->execute($biblionumber);
242     $sth=$dbh->prepare("select max(bibid) from marc_biblio");
243     $sth->execute;
244     ($bibid)=$sth->fetchrow;
245     $sth->finish;
246     $dbh->do("unlock tables");
247     my $fieldcount=0;
248     # now, add subfields...
249     foreach my $field (@fields) {
250         my @subfields=$field->subfields();
251         $fieldcount++;
252         foreach my $subfieldcount (0..$#subfields) {
253 #           print $field->tag().":".$field->indicator(1).$field->indicator(2).":".$subfields[$subfieldcount][0].":".$subfields[$subfieldcount][1]."\n";
254                     &MARCaddsubfield($dbh,$bibid,
255                                  $field->tag(),
256                                  $field->indicator(1).$field->indicator(2),
257                                  $fieldcount,
258                                  $subfields[$subfieldcount][0],
259                                  $subfieldcount,
260                                  $subfields[$subfieldcount][1]
261                                  );
262         }
263     }
264     return $bibid;
265 }
266
267 =head1 SYNOPSIS
268
269   use Biblio.pm;
270   &MARCaddsubfield($dbh,$bibid,$tagid,$indicator,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
271
272 =head1 DESCRIPTION
273
274   Adds a subfield in a biblio (in the MARC tables only).
275
276 =head1 AUTHOR
277
278 Paul POULAIN paul.poulain@free.fr
279
280 =cut
281
282 sub MARCaddsubfield {
283 # Add a new subfield to a tag into the DB.
284     my $dbh=shift;
285     my $bibid=shift;
286     my $tagid=shift;
287     my $indicator=shift;
288     my $tagorder=shift;
289     my $subfieldcode=shift;
290     my $subfieldorder=shift;
291     my $subfieldvalue=shift;
292
293     # if not value, end of job, we do nothing
294     if (not($subfieldvalue)) {
295         return;
296     }
297     if (not($subfieldcode)) {
298         $subfieldcode=' ';
299     }
300     unless ($subfieldorder) {
301         my $sth=$dbh->prepare("select max(subfieldorder) from marc_subfield_table where tag=$tagid");
302         $sth->execute;
303         if ($sth->rows) {
304             ($subfieldorder) = $sth->fetchrow;
305             $subfieldorder++;
306         } else {
307             $subfieldorder=1;
308         }
309     }
310     if (length($subfieldvalue)>255) {
311         $dbh->do("lock tables marc_blob_subfield WRITE, marc_subfield_table WRITE");
312         my $sth=$dbh->prepare("insert into marc_blob_subfield (subfieldvalue) values (?)");
313         $sth->execute($subfieldvalue);
314         $sth=$dbh->prepare("select max(blobidlink)from marc_blob_subfield");
315         $sth->execute;
316         my ($res)=$sth->fetchrow;
317         $sth=$dbh->prepare("insert into marc_subfield_table (bibid,tag,tagorder,subfieldcode,subfieldorder,valuebloblink) values (?,?,?,?,?,?)");
318         if ($tagid<100) {
319             $sth->execute($bibid,'0'.$tagid,$tagorder,$subfieldcode,$subfieldorder,$res);
320         } else {
321             $sth->execute($bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$res);
322         }
323         if ($sth->errstr) {
324             print STDERR "ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
325         }
326         $dbh->do("unlock tables");
327     } else {
328         my $sth=$dbh->prepare("insert into marc_subfield_table (bibid,tag,tagorder,subfieldcode,subfieldorder,subfieldvalue) values (?,?,?,?,?,?)");
329         $sth->execute($bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
330         if ($sth->errstr) {
331             print STDERR "ERROR ==> insert into marc_subfield_table (bibid,tag,tagorder,subfieldcode,subfieldorder,subfieldvalue) values ($bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue)\n";
332         }
333     }
334     &MARCaddword($dbh,$bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
335 }
336
337 =head1 SYNOPSIS
338
339   use Biblio.pm;
340   $MARCRecord = &MARCgetbiblio($dbh,$bibid);
341
342 =head1 DESCRIPTION
343
344   Returns a MARC::Record for the biblio $bibid.
345
346 =head1 AUTHOR
347
348 Paul POULAIN paul.poulain@free.fr
349
350 =cut
351
352 sub MARCgetbiblio {
353 # Returns MARC::Record of the biblio passed in parameter.
354     my ($dbh,$bibid)=@_;
355     my $record = MARC::Record->new();
356 #---- TODO : the leader is missing
357     my $sth=$dbh->prepare("select bibid,subfieldid,tag,tagorder,tag_indicator,subfieldcode,subfieldorder,subfieldvalue,valuebloblink 
358                                  from marc_subfield_table 
359                                  where bibid=? order by tagorder,subfieldorder
360                          ");
361     my $sth2=$dbh->prepare("select subfieldvalue from marc_blob_subfield where blobidlink=?");
362     $sth->execute($bibid);
363     while (my $row=$sth->fetchrow_hashref) {
364         if ($row->{'valuebloblink'}) { #---- search blob if there is one
365             $sth2->execute($row->{'valuebloblink'});
366             my $row2=$sth2->fetchrow_hashref;
367             $sth2->finish;
368             $row->{'subfieldvalue'}=$row2->{'subfieldvalue'};
369         }
370         if ($record->field($row->{'tag'})) {
371             my $field;
372 #--- this test must stay as this, because of strange behaviour of mySQL/Perl DBI with char var containing a number...
373 #--- sometimes, eliminates 0 at beginning, sometimes no ;-\\\
374             if (length($row->{'tag'}) <3) {
375                 $row->{'tag'} = "0".$row->{'tag'};
376             }
377             $field =$record->field($row->{'tag'});
378             if ($field) {
379                 my $x = $field->add_subfields($row->{'subfieldcode'},$row->{'subfieldvalue'});
380                 $record->delete_field($field);
381                 $record->add_fields($field);
382             }
383         } else {
384             if (length($row->{'tag'}) < 3) {
385                 $row->{'tag'} = "0".$row->{'tag'};
386             }
387             my $temp = MARC::Field->new($row->{'tag'}," "," ", $row->{'subfieldcode'} => $row->{'subfieldvalue'});
388             $record->add_fields($temp);
389         }
390
391     }
392 #    print "----------------------\n".$record->as_formatted()."\n-----------------";
393     return $record;
394 }
395
396 =head1 SYNOPSIS
397
398   use Biblio.pm;
399   $MARCRecord = &MARCmodbiblio($dbh,$bibid,$delete,$record);
400
401 =head1 DESCRIPTION
402
403   MARCmodbiblio changes a biblio for a biblio,MARC::Record passed as parameter
404   if $delete == 1, every field/subfield not found is deleted in the biblio
405   otherwise, only data passed to MARCmodbiblio is managed.
406   thus, you can change only a small part of a biblio (like an item, or a subtitle, or a additionalauthor...)
407
408 =head1 AUTHOR
409
410 Paul POULAIN paul.poulain@free.fr
411
412 =cut
413
414 sub MARCmodbiblio {
415     my ($dbh,$bibid,$delete,$record)=@_;
416     my $oldrecord=&MARCgetbiblio($dbh,$bibid);
417 # if nothing to change, don't waste time...
418     if ($oldrecord eq $record) {
419 #       print "nothing to do \n";
420         return;
421     }
422 # otherwise, skip through each subfield...
423     my @fields = $record->fields();
424     my $tagorder=0;
425     foreach my $field (@fields) {
426 #print "tag : ".$field->tag()."\n";
427         my $oldfield = $oldrecord->field($field->tag());
428         my @subfields=$field->subfields();
429         my $subfieldorder=0;
430         $tagorder++;
431         foreach my $subfield (@subfields) {
432             $subfieldorder++;
433             if ($oldfield eq 0) {
434 # just adding datas...
435                 &MARCaddsubfield($dbh,$bibid,$field->tag(),$field->indicator(1).$field->indicator(2),
436                                  1,@$subfield[0],$subfieldorder,@$subfield[1]);
437             } else {
438 # modify he subfield if it's a different string
439                 if ($oldfield->subfield(@$subfield[0]) ne @$subfield[1] ) {
440                     my $subfieldid=&MARCfindsubfieldid($dbh,$bibid,$field->tag(),$tagorder,@$subfield[0],$subfieldorder);
441                     &MARCmodsubfield($dbh,$subfieldid,@$subfield[1]);
442                 } else {
443 #                   print "nothing to change\n";
444                 }
445             }
446         }
447     }
448 }
449
450 =head1 SYNOPSIS
451
452   use Biblio.pm;
453   ($subfieldid,$subfieldvalue) = &MARCmodsubfield($dbh,$subfieldid,$subfieldvalue);
454
455 =head1 DESCRIPTION
456
457   MARCmodsubfield changes the value of a given subfield
458
459 =head1 AUTHOR
460
461 Paul POULAIN paul.poulain@free.fr
462
463 =cut
464
465 sub MARCmodsubfield {
466 # Subroutine changes a subfield value given a subfieldid.
467     my ($dbh, $subfieldid, $subfieldvalue )=@_;
468
469     $dbh->do("lock tables marc_blob_subfield WRITE,marc_subfield_table WRITE");
470     my $sth1=$dbh->prepare("select valuebloblink from marc_subfield_table where subfieldid=?");
471     $sth1->execute($subfieldid);
472     my ($oldvaluebloblink)=$sth1->fetchrow;
473     $sth1->finish;
474     my $sth;
475     # if too long, use a bloblink
476     if (length($subfieldvalue)>255 ) {
477         # if already a bloblink, update it, otherwise, insert a new one.
478         if ($oldvaluebloblink) {
479             $sth=$dbh->prepare("update marc_blob_subfield set subfieldvalue=? where blobidlink=?");
480             $sth->execute($subfieldvalue,$oldvaluebloblink);
481         } else {
482             $sth=$dbh->prepare("insert into marc_blob_subfield (subfieldvalue) values (?)");
483             $sth->execute($subfieldvalue);
484             $sth=$dbh->prepare("select max(blobidlink) from marc_blob_subfield");
485             $sth->execute;
486             my ($res)=$sth->fetchrow;
487             $sth=$dbh->prepare("update marc_subfield_table set subfieldvalue=null, valuebloblink=$res where subfieldid=?");
488             $sth->execute($subfieldid);
489         }
490     } else {
491         # note this can leave orphan bloblink. Not a big problem, but we should build somewhere a orphan deleting script...
492         $sth=$dbh->prepare("update marc_subfield_table set subfieldvalue=?,valuebloblink=null where subfieldid=?");
493         $sth->execute($subfieldvalue, $subfieldid);
494     }
495     $dbh->do("unlock tables");
496     $sth->finish;
497     $sth=$dbh->prepare("select bibid,tag,tagorder,subfieldcode,subfieldid,subfieldorder from marc_subfield_table where subfieldid=?");
498     $sth->execute($subfieldid);
499     my ($bibid,$tagid,$tagorder,$subfieldcode,$x,$subfieldorder) = $sth->fetchrow;
500     $subfieldid=$x;
501     &MARCdelword($dbh,$bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder);
502     &MARCaddword($dbh,$bibid,$tagid,$tagorder,$subfieldcode,$subfieldorder,$subfieldvalue);
503     return($subfieldid, $subfieldvalue);
504 }
505
506 =head1 SYNOPSIS
507
508   use Biblio.pm;
509   $subfieldid = &MARCfindsubfield($dbh,$bibid,$tag,$subfieldcode,$subfieldorder,$subfieldvalue);
510
511 =head1 DESCRIPTION
512
513   MARCfindsubfield returns a subfield number given a bibid/tag/subfield values.
514   Returns -1 if more than 1 answer
515
516 =head1 AUTHOR
517
518 Paul POULAIN paul.poulain@free.fr
519
520 =cut
521
522 sub MARCfindsubfield {
523     my ($dbh,$bibid,$tag,$subfieldcode,$subfieldorder,$subfieldvalue) = @_;
524     my $resultcounter=0;
525     my $subfieldid;
526     my $lastsubfieldid;
527     my $query="select subfieldid from marc_subfield_table where bibid=? and tag=? and subfieldcode=?";
528     if ($subfieldvalue) {
529         $query .= " and subfieldvalue=".$dbh->quote($subfieldvalue);
530     } else {
531         if ($subfieldorder<1) {
532             $subfieldorder=1;
533         }
534         $query .= " and subfieldorder=$subfieldorder";
535     }
536     my $sti=$dbh->prepare($query);
537     $sti->execute($bibid,$tag, $subfieldcode);
538     while (($subfieldid) = $sti->fetchrow) {
539         $resultcounter++;
540         $lastsubfieldid=$subfieldid;
541     }
542     if ($resultcounter>1) {
543         # Error condition.  Values given did not resolve into a unique record.  Don't know what to edit
544         # should rarely occur (only if we use subfieldvalue with a value that exists twice, which is strange)
545         return -1;
546     } else {
547         return $lastsubfieldid;
548     }
549 }
550
551 =head1 SYNOPSIS
552
553   use Biblio.pm;
554   $subfieldid = &MARCfindsubfieldid($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder);
555
556 =head1 DESCRIPTION
557
558   MARCfindsubfieldid find a subfieldid for a bibid/tag/tagorder/subfield/subfieldorder
559
560 =head1 AUTHOR
561
562 Paul POULAIN paul.poulain@free.fr
563
564 =cut
565
566 sub MARCfindsubfieldid {
567     my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
568     my $sth=$dbh->prepare("select subfieldid from marc_subfield_table
569                         where bibid=? and tag=? and tagorder=? 
570                                 and subfieldcode=? and subfieldorder=?");
571     $sth->execute($bibid,$tag,$tagorder,$subfield,$subfieldorder);
572     my ($res) = $sth->fetchrow;
573     return $res;
574 }
575
576 =head1 SYNOPSIS
577
578   use Biblio.pm;
579   &MARCdelsubfield($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder);
580
581 =head1 DESCRIPTION
582
583   MARCdelsubfield delete a subfield for a bibid/tag/tagorder/subfield/subfieldorder
584
585 =head1 AUTHOR
586
587 Paul POULAIN paul.poulain@free.fr
588
589 =cut
590
591 sub MARCdelsubfield {
592 # delete a subfield for $bibid / tag / tagorder / subfield / subfieldorder
593     my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
594 #    my $dbh=&C4Connect;
595     $dbh->do("delete from marc_subfield_table where bibid='$bibid' and
596                         tag='$tag' and tagorder='$tagorder' 
597                         and subfieldcode='$subfield' and subfieldorder='$subfieldorder
598                         ");
599 }
600
601 =head1 SYNOPSIS
602
603   use Biblio.pm;
604   &MARCdelbiblio($dbh,$bibid);
605
606 =head1 DESCRIPTION
607
608   MARCdelbiblio delete biblio $bibid
609
610 =head1 AUTHOR
611
612 Paul POULAIN paul.poulain@free.fr
613
614 =cut
615
616 sub MARCdelbiblio {
617 # delete a biblio for a $bibid
618     my ($dbh,$bibid) = @_;
619 #    my $dbh=&C4Connect;
620     $dbh->do("delete from marc_subfield_table where bibid='$bibid'");
621     $dbh->do("delete from marc_biblio where bibid='$bibid'");
622 }
623
624 =head1 SYNOPSIS
625
626   use Biblio.pm;
627   $MARCRecord = &MARCkoha2marcBiblio($dbh,$biblionumber,biblioitemnumber);
628
629 =head1 DESCRIPTION
630
631   MARCkoha2marcBiblio is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB biblio/biblioitem
632
633 =head1 AUTHOR
634
635 Paul POULAIN paul.poulain@free.fr
636
637 =cut
638
639 sub MARCkoha2marcBiblio {
640 # this function builds partial MARC::Record from the old koha-DB fields
641     my ($dbh,$biblionumber,$biblioitemnumber) = @_;
642 #    my $dbh=&C4Connect;
643     my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
644     my $record = MARC::Record->new();
645 #--- if bibid, then retrieve old-style koha data
646     if ($biblionumber>0) {
647         my $sth2=$dbh->prepare("select biblionumber,author,title,unititle,notes,abstract,serial,seriestitle,copyrightdate,timestamp 
648                 from biblio where biblionumber=?");             
649         $sth2->execute($biblionumber);
650         my $row=$sth2->fetchrow_hashref;
651         my $code;
652         foreach $code (keys %$row) {
653             if ($row->{$code}) {
654                 &MARCkoha2marcOnefield($sth,$record,"biblio.".$code,$row->{$code});
655             }
656         }
657     }
658 #--- if biblioitem, then retrieve old-style koha data
659     if ($biblioitemnumber>0) {
660         my $sth2=$dbh->prepare(" SELECT biblioitemnumber,biblionumber,volume,number,classification,
661                                                 itemtype,url,isbn,issn,dewey,subclass,publicationyear,publishercode,
662                                                 volumedate,volumeddesc,timestamp,illus,pages,notes,size,place 
663                                         FROM biblioitems
664                                         WHERE biblionumber=? and biblioitemnumber=?
665                                         ");             
666         $sth2->execute($biblionumber,$biblioitemnumber);
667         my $row=$sth2->fetchrow_hashref;
668         my $code;
669         foreach $code (keys %$row) {
670             if ($row->{$code}) {
671                 &MARCkoha2marcOnefield($sth,$record,"biblioitems.".$code,$row->{$code});
672             }
673         }
674     }
675     return $record;
676 # TODO : retrieve notes, additionalauthors
677 }
678
679 =head1 SYNOPSIS
680
681   use Biblio.pm;
682   $MARCRecord = &MARCkoha2marcItem($dbh,$biblionumber,itemnumber);
683
684 =head1 DESCRIPTION
685
686   MARCkoha2marcItem is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB item
687
688 =head1 AUTHOR
689
690 Paul POULAIN paul.poulain@free.fr
691
692 =cut
693
694 sub MARCkoha2marcItem {
695 # this function builds partial MARC::Record from the old koha-DB fields
696     my ($dbh,$biblionumber,$itemnumber) = @_;
697 #    my $dbh=&C4Connect;
698     my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
699     my $record = MARC::Record->new();
700 #--- if item, then retrieve old-style koha data
701     if ($itemnumber>0) {
702         my $sth2=$dbh->prepare("SELECT itemnumber,biblionumber,multivolumepart,biblioitemnumber,barcode,dateaccessioned,
703                                                 booksellerid,homebranch,price,replacementprice,replacementpricedate,datelastborrowed,
704                                                 datelastseen,multivolume,stack,notforloan,itemlost,wthdrawn,bulk,issues,renewals,
705                                         reserves,restricted,binding,itemnotes,holdingbranch,interim,timestamp 
706                                         FROM items
707                                         WHERE biblionumber=? and itemnumber=?");
708         $sth2->execute($biblionumber,$itemnumber);
709         my $row=$sth2->fetchrow_hashref;
710         my $code;
711         foreach $code (keys %$row) {
712             if ($row->{$code}) {
713                 &MARCkoha2marcOnefield($sth,$record,"items.".$code,$row->{$code});
714             }
715         }
716     }
717     return $record;
718 # TODO : retrieve notes, additionalauthors
719 }
720
721 =head1 SYNOPSIS
722
723   use Biblio.pm;
724   $MARCRecord = &MARCkoha2marcSubtitle($dbh,$biblionumber,$subtitle);
725
726 =head1 DESCRIPTION
727
728   MARCkoha2marcSubtitle is a wrapper between old-DB and MARC-DB. It returns a MARC::Record builded with old-DB subtitle
729
730 =head1 AUTHOR
731
732 Paul POULAIN paul.poulain@free.fr
733
734 =cut
735
736 sub MARCkoha2marcSubtitle {
737 # this function builds partial MARC::Record from the old koha-DB fields
738     my ($dbh,$bibnum,$subtitle) = @_;
739 #    my $dbh=&C4Connect;
740     my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
741     my $record = MARC::Record->new();
742     &MARCkoha2marcOnefield($sth,$record,"bibliosubtitle.subtitle",$subtitle);
743     return $record;
744 }
745
746
747 =head1 DESCRIPTION
748
749   MARCkoha2marcOnefield is used by MARCkoha2marc and is not exported
750
751 =head1 AUTHOR
752
753 Paul POULAIN paul.poulain@free.fr
754
755 =cut
756 sub MARCkoha2marcOnefield {
757     my ($sth,$record,$kohafieldname,$value)=@_;
758     my $tagfield;
759     my $tagsubfield;
760     $sth->execute($kohafieldname);
761     if (($tagfield,$tagsubfield)=$sth->fetchrow) {
762         if ($record->field($tagfield)) {
763             my $tag =$record->field($tagfield);
764             if ($tag) {
765                 $tag->add_subfields($tagsubfield,$value);
766                 $record->delete_field($tag);
767                 $record->add_fields($tag);
768             }
769         } else {
770             $record->add_fields($tagfield," "," ",$tagsubfield => $value);
771         }
772     }
773     return $record;
774 }
775
776 =head1 DESCRIPTION
777
778   MARCmarc2koha recieves a MARC::Record as parameter and returns a hash with old-DB datas
779
780 =head1 AUTHOR
781
782 Paul POULAIN paul.poulain@free.fr
783
784 =cut
785
786 sub MARCmarc2koha {
787     my ($dbh,$record) = @_;
788     my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
789     my $result;
790     my $sth2=$dbh->prepare("SHOW COLUMNS from biblio");
791     $sth2->execute;
792     my $field;
793 #    print STDERR $record->as_formatted;
794     while (($field)=$sth2->fetchrow) {
795         $result=&MARCmarc2kohaOneField($sth,"biblio",$field,$record,$result);
796     }
797     my $sth2=$dbh->prepare("SHOW COLUMNS from biblioitems");
798     $sth2->execute;
799     my $field;
800     while (($field)=$sth2->fetchrow) {
801         $result=&MARCmarc2kohaOneField($sth,"biblioitems",$field,$record,$result);
802     }
803     my $sth2=$dbh->prepare("SHOW COLUMNS from items");
804     $sth2->execute;
805     my $field;
806     while (($field)=$sth2->fetchrow) {
807         $result = &MARCmarc2kohaOneField($sth,"items",$field,$record,$result);
808     }
809 # additional authors : specific 
810     $result = &MARCmarc2kohaOneField($sth,"additionalauthors","additionalauthors",$record,$result);
811 #    print STDERR $result."XXXX\n";
812 #    foreach my $tmp (key $result) {
813 #       print STDERR $result->{$tmp}."\n";
814 #    }
815     return $result;
816 }
817
818 sub MARCmarc2kohaOneField {
819 # to check : if a field has a repeatable subfield that is used in old-db, only the 1st will be retrieved...
820     my ($sth,$kohatable,$kohafield,$record,$result)= @_;
821     my $res="";
822     my $tagfield;
823     my $subfield;
824     $sth->execute($kohatable.".".$kohafield);
825     ($tagfield,$subfield) = $sth->fetchrow;
826     foreach my $field ($record->field($tagfield)) {
827         if ($field->subfield($subfield)) {
828             if ($result->{$kohafield}) {
829                 $result->{$kohafield} .= " | ".$field->subfield($subfield);
830             } else {
831                 $result->{$kohafield}=$field->subfield($subfield);
832             }
833         }
834     }
835     return $result;
836 }
837
838 =head1 DESCRIPTION
839
840   MARCaddword is used to manage MARC_word table and is not exported
841
842 =head1 AUTHOR
843
844 Paul POULAIN paul.poulain@free.fr
845
846 =cut
847
848 sub MARCaddword {
849 # split a subfield string and adds it into the word table.
850 # removes stopwords
851     my ($dbh,$bibid,$tag,$tagorder,$subfieldid,$subfieldorder,$sentence) =@_;
852     $sentence =~ s/(\.|\?|\:|\!|\'|,|\-)/ /g;
853 # TODO : remove stopwords
854     my @words = split / /,$sentence;
855     my $sth=$dbh->prepare("insert into marc_word (bibid, tag, tagorder, subfieldid, subfieldorder, word, sndx_word)
856                         values (?,?,?,?,?,?,soundex(?))");
857     foreach my $word (@words) {
858 # we record only words longer than 2 car
859         if (length($word)>1) {
860             $sth->execute($bibid,$tag,$tagorder,$subfieldid,$subfieldorder,$word,$word);
861 #       print "($bibid,$tag,$tagorder,$subfieldid,$subfieldorder,$word,$word)\n";
862         }
863     }
864 }
865
866 =head1 DESCRIPTION
867
868   MARCdelword is used to manage MARC_word table and is not exported
869
870 =head1 AUTHOR
871
872 Paul POULAIN paul.poulain@free.fr
873
874 =cut
875
876 sub MARCdelword {
877 # delete words. this sub deletes all the words from a sentence. a subfield modif is done by a delete then a add
878     my ($dbh,$bibid,$tag,$tagorder,$subfield,$subfieldorder) = @_;
879     my $sth=$dbh->prepare("delete from marc_word where bibid=? and tag=? and tagorder=? and subfieldid=? and subfieldorder=?");
880     $sth->execute($bibid,$tag,$tagorder,$subfield,$subfieldorder);
881 }
882
883 #
884 #
885 # ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL 
886 #
887 #
888 # all the following subs are useful to manage MARC-DB with complete MARC records.
889 # it's used with marcimport, and marc management tools
890 #
891
892 sub ALLnewbiblio {
893     my ($dbh, $record, $oldbiblio, $oldbiblioitem) = @_;
894 # note $oldbiblio and $oldbiblioitem are not mandatory.
895 # if not present, they will be builded from $record with MARCmarc2koha function
896     if (($oldbiblio) and not($oldbiblioitem)) {
897         print STDERR "ALLnewbiblio : missing parameter\n";
898         print "ALLnewbiblio : missing parameter : contact koha development  team\n";
899         die;
900     }
901     my $oldbibnum;
902     my $oldbibitemnum;
903     if ($oldbiblio) {
904         $oldbibnum = OLDnewbiblio($dbh,$oldbiblio);
905         $oldbiblioitem->{'biblionumber'} = $oldbibnum;
906         $oldbibitemnum = OLDnewbiblioitem($dbh,$oldbiblioitem);
907     } else {
908         my $olddata = MARCmarc2koha($dbh,$record);
909         $oldbibnum = OLDnewbiblio($dbh,$olddata);
910         $oldbibitemnum = OLDnewbiblioitem($dbh,$olddata);
911     }
912 # we must add bibnum and bibitemnum in MARC::Record...
913 # we build the new field with biblionumber and biblioitemnumber
914 # we drop the original field
915 # we add the new builded field.
916 # NOTE : Works only if the field is ONLY for biblionumber and biblioitemnumber
917 # (steve and paul : thinks 090 is a good choice)
918     my $sth=$dbh->prepare("select tagfield,tagsubfield from marc_subfield_structure where kohafield=?");
919     $sth->execute("biblio.biblionumber");
920     (my $tagfield1, my $tagsubfield1) = $sth->fetchrow;
921     $sth->execute("biblioitems.biblioitemnumber");
922     (my $tagfield2, my $tagsubfield2) = $sth->fetchrow;
923     print STDERR "tag1 : $tagfield1 / $tagsubfield1\n tag2 : $tagfield2 / $tagsubfield2\n";
924     if ($tagsubfield1 != $tagsubfield2) {
925         print STDERR "Error in ALLnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
926         print "Error in ALLnewbiblio : biblio.biblionumber and biblioitems.biblioitemnumber MUST have the same field number";
927         die;
928     }
929     my $newfield = MARC::Field->new( $tagfield1,'','', 
930                                      "$tagsubfield1" => $oldbibnum,
931                                      "$tagsubfield2" => $oldbibitemnum);
932 # drop old field and create new one...
933     my $old_field = $record->field($tagfield1);
934     $record->delete_field($old_field);
935     $record->add_fields($newfield);
936     my $bibid = MARCaddbiblio($dbh,$record,$oldbibnum);
937     return ( $oldbibnum,$oldbibitemnum );
938 }
939
940 sub ALLnewitem {
941     my ($dbh, $item) = @_;
942     my $itemnumber;
943     my $error;
944     ($itemnumber,$error) = &OLDnewitems($dbh,$item,$item->{'barcode'});
945 # search MARC biblionumber 
946     my $bibid=&MARCfind_MARCbibid_from_oldbiblionumber($dbh,$item->{'biblionumber'});
947 # calculate tagorder
948     my $sth = $dbh->prepare("select max(tagorder) from marc_subfield_table where bibid=?");
949     $sth->execute($bibid);
950     my ($tagorder) = $sth->fetchrow;
951     $tagorder++;
952     my $subfieldorder=0;
953 # for each field, find MARC tag and subfield, and call the proper MARC sub
954     foreach my $itemkey (keys %$item) {
955         my $tagfield;
956         my $tagsubfield;
957         print STDERR "=============> $itemkey : ".$item->{$itemkey}."\n";
958         if ($itemkey eq "biblionumber" || $itemkey eq "biblioitemnumber") {
959             ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"biblio.".$itemkey);
960         } else {
961             ($tagfield,$tagsubfield) = MARCfind_marc_from_kohafield($dbh,"items.".$itemkey);
962         }
963         if ($tagfield && $item->{$itemkey} ne 'NULL') {
964             $subfieldorder++;
965             &MARCaddsubfield($dbh,
966                              $bibid,
967                              $tagfield,
968                              "  ",
969                              $tagorder,
970                              $tagsubfield,
971                              $subfieldorder,
972                              $item->{$itemkey}
973                              );
974         }
975     }
976 } # ALLnewitems
977
978
979 #
980 #
981 # OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD OLD
982 #
983 #
984 # all the following subs are the exact copy of 1.0/1.2 version of the sub
985 # without the OLD. The OLDxxx is called by the original xxx sub.
986 # the 1.4 xxx sub also builds MARC::Record an calls the MARCxxx
987 # WARNING : there is 1 difference between initialxxx and OLDxxx :
988 # the db header $dbh is always passed as parameter
989 # to avoid over-DB connexion
990
991 sub OLDnewbiblio {
992   my ($dbh,$biblio) = @_;
993 #  my $dbh    = &C4Connect;
994   my $query  = "Select max(biblionumber) from biblio";
995   my $sth    = $dbh->prepare($query);
996   $sth->execute;
997   my $data   = $sth->fetchrow_arrayref;
998   my $bibnum = $$data[0] + 1;
999   my $series = 0;
1000
1001   $biblio->{'title'}       = $dbh->quote($biblio->{'title'});
1002   $biblio->{'author'}      = $dbh->quote($biblio->{'author'});
1003   $biblio->{'copyright'}   = $dbh->quote($biblio->{'copyright'});
1004   $biblio->{'seriestitle'} = $dbh->quote($biblio->{'seriestitle'});
1005   $biblio->{'notes'}       = $dbh->quote($biblio->{'notes'});
1006   $biblio->{'abstract'}    = $dbh->quote($biblio->{'abstract'});
1007   if ($biblio->{'seriestitle'}) { $series = 1 };
1008
1009   $sth->finish;
1010   $query = "insert into biblio set
1011 biblionumber  = $bibnum,
1012 title         = $biblio->{'title'},
1013 author        = $biblio->{'author'},
1014 copyrightdate = $biblio->{'copyright'},
1015 serial        = $series,
1016 seriestitle   = $biblio->{'seriestitle'},
1017 notes         = $biblio->{'notes'},
1018 abstract      = $biblio->{'abstract'}";
1019
1020   $sth = $dbh->prepare($query);
1021   $sth->execute;
1022
1023   $sth->finish;
1024 #  $dbh->disconnect;
1025   return($bibnum);
1026 }
1027
1028 sub OLDmodbiblio {
1029     my ($dbh,$biblio) = @_;
1030 #  my $dbh   = C4Connect;
1031     my $query;
1032     my $sth;
1033     
1034     $biblio->{'title'}         = $dbh->quote($biblio->{'title'});
1035     $biblio->{'author'}        = $dbh->quote($biblio->{'author'});
1036     $biblio->{'abstract'}      = $dbh->quote($biblio->{'abstract'});
1037     $biblio->{'copyrightdate'} = $dbh->quote($biblio->{'copyrightdate'});
1038     $biblio->{'seriestitle'}   = $dbh->quote($biblio->{'serirestitle'});
1039     $biblio->{'serial'}        = $dbh->quote($biblio->{'serial'});
1040     $biblio->{'unititle'}      = $dbh->quote($biblio->{'unititle'});
1041     $biblio->{'notes'}         = $dbh->quote($biblio->{'notes'});
1042     
1043     $query = "Update biblio set
1044 title         = $biblio->{'title'},
1045 author        = $biblio->{'author'},
1046 abstract      = $biblio->{'abstract'},
1047 copyrightdate = $biblio->{'copyrightdate'},
1048 seriestitle   = $biblio->{'seriestitle'},
1049 serial        = $biblio->{'serial'},
1050 unititle      = $biblio->{'unititle'},
1051 notes         = $biblio->{'notes'}
1052 where biblionumber = $biblio->{'biblionumber'}";
1053     $sth   = $dbh->prepare($query);
1054     
1055     $sth->execute;
1056     
1057     $sth->finish;
1058     $dbh->disconnect;
1059     return($biblio->{'biblionumber'});
1060 } # sub modbiblio
1061
1062 sub OLDmodsubtitle {
1063   my ($dbh,$bibnum, $subtitle) = @_;
1064 #  my $dbh   = C4Connect;
1065   my $query = "update bibliosubtitle set
1066 subtitle = '$subtitle'
1067 where biblionumber = $bibnum";
1068   my $sth   = $dbh->prepare($query);
1069
1070   $sth->execute;
1071   $sth->finish;
1072 #  $dbh->disconnect;
1073 } # sub modsubtitle
1074
1075
1076 sub OLDmodaddauthor {
1077     my ($dbh,$bibnum, $author) = @_;
1078 #    my $dbh   = C4Connect;
1079     my $query = "Delete from additionalauthors where biblionumber = $bibnum";
1080     my $sth = $dbh->prepare($query);
1081
1082     $sth->execute;
1083     $sth->finish;
1084
1085     if ($author ne '') {
1086         $query = "Insert into additionalauthors set
1087                         author       = '$author',
1088                         biblionumber = '$bibnum'";
1089         $sth   = $dbh->prepare($query);
1090
1091         $sth->execute;
1092
1093         $sth->finish;
1094     } # if
1095
1096   $dbh->disconnect;
1097 } # sub modaddauthor
1098
1099
1100 sub OLDmodsubject {
1101     my ($dbh,$bibnum, $force, @subject) = @_;
1102 #  my $dbh   = C4Connect;
1103     my $count = @subject;
1104     my $error;
1105     for (my $i = 0; $i < $count; $i++) {
1106         $subject[$i] =~ s/^ //g;
1107         $subject[$i] =~ s/ $//g;
1108         my $query = "select * from catalogueentry
1109                         where entrytype = 's'
1110                                 and catalogueentry = '$subject[$i]'";
1111         my $sth   = $dbh->prepare($query);
1112         $sth->execute;
1113         
1114         if (my $data = $sth->fetchrow_hashref) {
1115         } else {
1116             if ($force eq $subject[$i]) {
1117                 # subject not in aut, chosen to force anway
1118                 # so insert into cataloguentry so its in auth file
1119                 $query = "Insert into catalogueentry
1120                                 (entrytype,catalogueentry)
1121                             values ('s','$subject[$i]')";
1122          my $sth2 = $dbh->prepare($query);
1123
1124          $sth2->execute;
1125          $sth2->finish;
1126       } else {
1127         $error = "$subject[$i]\n does not exist in the subject authority file";
1128         $query = "Select * from catalogueentry
1129                             where entrytype = 's'
1130                             and (catalogueentry like '$subject[$i] %'
1131                                  or catalogueentry like '% $subject[$i] %'
1132                                  or catalogueentry like '% $subject[$i]')";
1133         my $sth2 = $dbh->prepare($query);
1134
1135         $sth2->execute;
1136         while (my $data = $sth2->fetchrow_hashref) {
1137           $error = $error."<br>$data->{'catalogueentry'}";
1138         } # while
1139         $sth2->finish;
1140       } # else
1141     } # else
1142     $sth->finish;
1143   } # else
1144   if ($error eq '') {
1145     my $query = "Delete from bibliosubject where biblionumber = $bibnum";
1146     my $sth   = $dbh->prepare($query);
1147     $sth->execute;
1148     $sth->finish;
1149     for (my $i = 0; $i < $count; $i++) {
1150       $sth = $dbh->prepare("Insert into bibliosubject
1151                             values ('$subject[$i]', $bibnum)");
1152
1153       $sth->execute;
1154       $sth->finish;
1155     } # for
1156   } # if
1157
1158 #  $dbh->disconnect;
1159   return($error);
1160 } # sub modsubject
1161
1162 sub OLDmodbibitem {
1163     my ($dbh,$biblioitem) = @_;
1164 #    my $dbh   = C4Connect;
1165     my $query;
1166
1167     $biblioitem->{'itemtype'}        = $dbh->quote($biblioitem->{'itemtype'});
1168     $biblioitem->{'url'}             = $dbh->quote($biblioitem->{'url'});
1169     $biblioitem->{'isbn'}            = $dbh->quote($biblioitem->{'isbn'});
1170     $biblioitem->{'publishercode'}   = $dbh->quote($biblioitem->{'publishercode'});
1171     $biblioitem->{'publicationyear'} = $dbh->quote($biblioitem->{'publicationyear'});
1172     $biblioitem->{'classification'}  = $dbh->quote($biblioitem->{'classification'});
1173     $biblioitem->{'dewey'}           = $dbh->quote($biblioitem->{'dewey'});
1174     $biblioitem->{'subclass'}        = $dbh->quote($biblioitem->{'subclass'});
1175     $biblioitem->{'illus'}           = $dbh->quote($biblioitem->{'illus'});
1176     $biblioitem->{'pages'}           = $dbh->quote($biblioitem->{'pages'});
1177     $biblioitem->{'volumeddesc'}     = $dbh->quote($biblioitem->{'volumeddesc'});
1178     $biblioitem->{'notes'}           = $dbh->quote($biblioitem->{'notes'});
1179     $biblioitem->{'size'}            = $dbh->quote($biblioitem->{'size'});
1180     $biblioitem->{'place'}           = $dbh->quote($biblioitem->{'place'});
1181
1182     $query = "Update biblioitems set
1183 itemtype        = $biblioitem->{'itemtype'},
1184 url             = $biblioitem->{'url'},
1185 isbn            = $biblioitem->{'isbn'},
1186 publishercode   = $biblioitem->{'publishercode'},
1187 publicationyear = $biblioitem->{'publicationyear'},
1188 classification  = $biblioitem->{'classification'},
1189 dewey           = $biblioitem->{'dewey'},
1190 subclass        = $biblioitem->{'subclass'},
1191 illus           = $biblioitem->{'illus'},
1192 pages           = $biblioitem->{'pages'},
1193 volumeddesc     = $biblioitem->{'volumeddesc'},
1194 notes           = $biblioitem->{'notes'},
1195 size            = $biblioitem->{'size'},
1196 place           = $biblioitem->{'place'}
1197 where biblioitemnumber = $biblioitem->{'biblioitemnumber'}";
1198
1199     $dbh->do($query);
1200
1201 #    $dbh->disconnect;
1202 } # sub modbibitem
1203
1204 sub OLDmodnote {
1205   my ($dbh,$bibitemnum,$note)=@_;
1206 #  my $dbh=C4Connect;
1207   my $query="update biblioitems set notes='$note' where
1208   biblioitemnumber='$bibitemnum'";
1209   my $sth=$dbh->prepare($query);
1210   $sth->execute;
1211   $sth->finish;
1212 #  $dbh->disconnect;
1213 }
1214
1215 sub OLDnewbiblioitem {
1216     my ($dbh,$biblioitem) = @_;
1217 #  my $dbh   = C4Connect;
1218     my $query = "Select max(biblioitemnumber) from biblioitems";
1219     my $sth   = $dbh->prepare($query);
1220     my $data;
1221     my $bibitemnum;
1222     
1223     $biblioitem->{'volume'}          = $dbh->quote($biblioitem->{'volume'});
1224     $biblioitem->{'number'}        = $dbh->quote($biblioitem->{'number'});
1225     $biblioitem->{'classification'}  = $dbh->quote($biblioitem->{'classification'});
1226     $biblioitem->{'itemtype'}        = $dbh->quote($biblioitem->{'itemtype'});
1227     $biblioitem->{'url'}             = $dbh->quote($biblioitem->{'url'});
1228     $biblioitem->{'isbn'}            = $dbh->quote($biblioitem->{'isbn'});
1229     $biblioitem->{'issn'}            = $dbh->quote($biblioitem->{'issn'});
1230     $biblioitem->{'dewey'}           = $dbh->quote($biblioitem->{'dewey'});
1231     $biblioitem->{'subclass'}        = $dbh->quote($biblioitem->{'subclass'});
1232     $biblioitem->{'publicationyear'} = $dbh->quote($biblioitem->{'publicationyear'});
1233     $biblioitem->{'publishercode'}   = $dbh->quote($biblioitem->{'publishercode'});
1234     $biblioitem->{'volumedate'}      = $dbh->quote($biblioitem->{'volumedate'});
1235     $biblioitem->{'volumeddesc'}     = $dbh->quote($biblioitem->{'volumeddesc'});  $biblioitem->{'illus'}            = $dbh->quote($biblioitem->{'illus'});
1236     $biblioitem->{'illus'}         = $dbh->quote($biblioitem->{'illus'});
1237     $biblioitem->{'pages'}           = $dbh->quote($biblioitem->{'pages'});
1238     $biblioitem->{'notes'}           = $dbh->quote($biblioitem->{'notes'});
1239     $biblioitem->{'size'}            = $dbh->quote($biblioitem->{'size'});
1240     $biblioitem->{'place'}           = $dbh->quote($biblioitem->{'place'});
1241     $biblioitem->{'lccn'}            = $dbh->quote($biblioitem->{'lccn'});
1242     $biblioitem->{'marc'}            = $dbh->quote($biblioitem->{'marc'});
1243   
1244     $sth->execute;
1245     $data       = $sth->fetchrow_arrayref;
1246     $bibitemnum = $$data[0] + 1;
1247
1248     $sth->finish;
1249
1250     $query = "insert into biblioitems set
1251                         biblioitemnumber = $bibitemnum,
1252                         biblionumber     = $biblioitem->{'biblionumber'},
1253                         volume           = $biblioitem->{'volume'},
1254                         number           = $biblioitem->{'number'},
1255                         classification   = $biblioitem->{'classification'},
1256                         itemtype         = $biblioitem->{'itemtype'},
1257                         url              = $biblioitem->{'url'},
1258                         isbn             = $biblioitem->{'isbn'},
1259                         issn             = $biblioitem->{'issn'},
1260                         dewey            = $biblioitem->{'dewey'},
1261                         subclass         = $biblioitem->{'subclass'},
1262                         publicationyear  = $biblioitem->{'publicationyear'},
1263                         publishercode    = $biblioitem->{'publishercode'},
1264                         volumedate       = $biblioitem->{'volumedate'},
1265                         volumeddesc      = $biblioitem->{'volumeddesc'},
1266                         illus            = $biblioitem->{'illus'},
1267                         pages            = $biblioitem->{'pages'},
1268                         notes            = $biblioitem->{'notes'},
1269                         size             = $biblioitem->{'size'},
1270                         lccn             = $biblioitem->{'lccn'},
1271                         marc             = $biblioitem->{'marc'},
1272                         place            = $biblioitem->{'place'}";
1273
1274     $sth = $dbh->prepare($query);
1275     $sth->execute;
1276     $sth->finish;
1277 #    $dbh->disconnect;
1278     return($bibitemnum);
1279 }
1280
1281 sub OLDnewsubject {
1282   my ($dbh,$bibnum)=@_;
1283 #  my $dbh=C4Connect;
1284   my $query="insert into bibliosubject (biblionumber) values
1285   ($bibnum)";
1286   my $sth=$dbh->prepare($query);
1287 #  print $query;
1288   $sth->execute;
1289   $sth->finish;
1290 #  $dbh->disconnect;
1291 }
1292
1293 sub OLDnewsubtitle {
1294     my ($dbh,$bibnum, $subtitle) = @_;
1295 #  my $dbh   = C4Connect;
1296     $subtitle = $dbh->quote($subtitle);
1297     my $query = "insert into bibliosubtitle set
1298                             biblionumber = $bibnum,
1299                             subtitle = $subtitle";
1300     my $sth   = $dbh->prepare($query);
1301
1302     $sth->execute;
1303
1304     $sth->finish;
1305 #  $dbh->disconnect;
1306 }
1307
1308
1309 sub OLDnewitems {
1310   my ($dbh,$item, $barcode) = @_;
1311 #  my $dbh   = C4Connect;
1312   my $query = "Select max(itemnumber) from items";
1313   my $sth   = $dbh->prepare($query);
1314   my $data;
1315   my $itemnumber;
1316   my $error = "";
1317
1318   $sth->execute;
1319   $data       = $sth->fetchrow_hashref;
1320   $itemnumber = $data->{'max(itemnumber)'} + 1;
1321   $sth->finish;
1322   
1323   $item->{'booksellerid'}     = $dbh->quote($item->{'booksellerid'});
1324   $item->{'homebranch'}       = $dbh->quote($item->{'homebranch'});
1325   $item->{'price'}            = $dbh->quote($item->{'price'});
1326   $item->{'replacementprice'} = $dbh->quote($item->{'replacementprice'});
1327   $item->{'itemnotes'}        = $dbh->quote($item->{'itemnotes'});
1328
1329 #  foreach my $barcode (@barcodes) {
1330 #    $barcode = uc($barcode);
1331   $barcode = $dbh->quote($barcode);
1332   $query   = "Insert into items set
1333                             itemnumber           = $itemnumber,
1334                             biblionumber         = $item->{'biblionumber'},
1335                             biblioitemnumber     = $item->{'biblioitemnumber'},
1336                             barcode              = $barcode,
1337                             booksellerid         = $item->{'booksellerid'},
1338                             dateaccessioned      = NOW(),
1339                             homebranch           = $item->{'homebranch'},
1340                             holdingbranch        = $item->{'homebranch'},
1341                             price                = $item->{'price'},
1342                             replacementprice     = $item->{'replacementprice'},
1343                             replacementpricedate = NOW(),
1344                             itemnotes            = $item->{'itemnotes'}";
1345   if ($item->{'loan'}) {
1346       $query .= ",notforloan           = $item->{'loan'}";
1347   } # if
1348
1349   $sth = $dbh->prepare($query);
1350   $sth->execute;
1351   if (defined $sth->errstr) {
1352       $error .= $sth->errstr;
1353   }
1354   $sth->finish;
1355   $itemnumber++;
1356 #  $dbh->disconnect;
1357   return($itemnumber,$error);
1358 }
1359
1360 sub OLDmoditem {
1361   my ($dbh,$loan,$itemnum,$bibitemnum,$barcode,$notes,$homebranch,$lost,$wthdrawn,$replacement)=@_;
1362 #  my $dbh=C4Connect;
1363   my $query="update items set biblioitemnumber=$bibitemnum,
1364                               barcode='$barcode',itemnotes='$notes'
1365                           where itemnumber=$itemnum";
1366   if ($barcode eq ''){
1367     $query="update items set biblioitemnumber=$bibitemnum,notforloan=$loan where itemnumber=$itemnum";
1368   }
1369   if ($lost ne ''){
1370     $query="update items set biblioitemnumber=$bibitemnum,
1371                              barcode='$barcode',
1372                              itemnotes='$notes',
1373                              homebranch='$homebranch',
1374                              itemlost='$lost',
1375                              wthdrawn='$wthdrawn' 
1376                           where itemnumber=$itemnum";
1377   }
1378   if ($replacement ne ''){
1379     $query=~ s/ where/,replacementprice='$replacement' where/;
1380   }
1381
1382   my $sth=$dbh->prepare($query);
1383   $sth->execute;
1384   $sth->finish;
1385 #  $dbh->disconnect;
1386 }
1387
1388 sub OLDdelitem{
1389   my ($dbh,$itemnum)=@_;
1390 #  my $dbh=C4Connect;
1391   my $query="select * from items where itemnumber=$itemnum";
1392   my $sth=$dbh->prepare($query);
1393   $sth->execute;
1394   my @data=$sth->fetchrow_array;
1395   $sth->finish;
1396   $query="Insert into deleteditems values (";
1397   foreach my $temp (@data){
1398     $query=$query."'$temp',";
1399   }
1400   $query=~ s/\,$/\)/;
1401 #  print $query;
1402   $sth=$dbh->prepare($query);
1403   $sth->execute;
1404   $sth->finish;
1405   $query = "Delete from items where itemnumber=$itemnum";
1406   $sth=$dbh->prepare($query);
1407   $sth->execute;
1408   $sth->finish;
1409 #  $dbh->disconnect;
1410 }
1411
1412 sub OLDdeletebiblioitem {
1413     my ($dbh,$biblioitemnumber) = @_;
1414 #    my $dbh   = C4Connect;
1415     my $query = "Select * from biblioitems
1416 where biblioitemnumber = $biblioitemnumber";
1417     my $sth   = $dbh->prepare($query);
1418     my @results;
1419
1420     $sth->execute;
1421   
1422     if (@results = $sth->fetchrow_array) {
1423         $query = "Insert into deletedbiblioitems values (";
1424         foreach my $value (@results) {
1425             $value  = $dbh->quote($value);
1426             $query .= "$value,";
1427         } # foreach
1428
1429         $query =~ s/\,$/\)/;
1430         $dbh->do($query);
1431
1432         $query = "Delete from biblioitems
1433                         where biblioitemnumber = $biblioitemnumber";
1434         $dbh->do($query);
1435     } # if
1436     $sth->finish;
1437 # Now delete all the items attached to the biblioitem
1438     $query = "Select * from items where biblioitemnumber = $biblioitemnumber";
1439     $sth   = $dbh->prepare($query);
1440     $sth->execute;
1441     while (@results = $sth->fetchrow_array) {
1442         $query = "Insert into deleteditems values (";
1443         foreach my $value (@results) {
1444             $value  = $dbh->quote($value);
1445             $query .= "$value,";
1446         } # foreach
1447         $query =~ s/\,$/\)/;
1448         $dbh->do($query);
1449     } # while
1450     $sth->finish;
1451     $query = "Delete from items where biblioitemnumber = $biblioitemnumber";
1452     $dbh->do($query);
1453 #    $dbh->disconnect;
1454 } # sub deletebiblioitem
1455
1456 sub OLDdelbiblio{
1457   my ($dbh,$biblio)=@_;
1458 #  my $dbh=C4Connect;
1459   my $query="select * from biblio where biblionumber=$biblio";
1460   my $sth=$dbh->prepare($query);
1461   $sth->execute;
1462   if (my @data=$sth->fetchrow_array){
1463     $sth->finish;
1464     $query="Insert into deletedbiblio values (";
1465     foreach my $temp (@data){
1466       $temp=~ s/\'/\\\'/g;
1467       $query=$query."'$temp',";
1468     }
1469     $query=~ s/\,$/\)/;
1470 #   print $query;
1471     $sth=$dbh->prepare($query);
1472     $sth->execute;
1473     $sth->finish;
1474     $query = "Delete from biblio where biblionumber=$biblio";
1475     $sth=$dbh->prepare($query);
1476     $sth->execute;
1477     $sth->finish;
1478   }
1479   $sth->finish;
1480 #  $dbh->disconnect;
1481 }
1482
1483 #
1484 #
1485 # old functions
1486 #
1487 #
1488
1489 sub itemcount{
1490   my ($biblio)=@_;
1491   my $dbh=C4Connect;
1492   my $query="Select count(*) from items where biblionumber=$biblio";
1493 #  print $query;
1494   my $sth=$dbh->prepare($query);
1495   $sth->execute;
1496   my $data=$sth->fetchrow_hashref;
1497   $sth->finish;
1498   $dbh->disconnect;
1499   return($data->{'count(*)'});
1500 }
1501
1502 sub getorder{
1503   my ($bi,$bib)=@_;
1504   my $dbh=C4Connect;
1505   my $query="Select ordernumber 
1506         from aqorders 
1507         where biblionumber=? and biblioitemnumber=?";
1508   my $sth=$dbh->prepare($query);
1509   $sth->execute($bib,$bi);
1510   my $ordnum=$sth->fetchrow_hashref;
1511   $sth->finish;
1512   my $order=getsingleorder($ordnum->{'ordernumber'});
1513   $dbh->disconnect;
1514 #  print $query;
1515   return ($order,$ordnum->{'ordernumber'});
1516 }
1517
1518 sub getsingleorder {
1519   my ($ordnum)=@_;
1520   my $dbh=C4Connect;
1521   my $query="Select * from biblio,biblioitems,aqorders,aqorderbreakdown 
1522   where aqorders.ordernumber=? 
1523   and biblio.biblionumber=aqorders.biblionumber and
1524   biblioitems.biblioitemnumber=aqorders.biblioitemnumber and
1525   aqorders.ordernumber=aqorderbreakdown.ordernumber";
1526   my $sth=$dbh->prepare($query);
1527   $sth->execute($ordnum);
1528   my $data=$sth->fetchrow_hashref;
1529   $sth->finish;
1530   $dbh->disconnect;
1531   return($data);
1532 }
1533
1534 sub newbiblio {
1535   my ($biblio) = @_;
1536   my $dbh    = &C4Connect;
1537   my $bibnum=OLDnewbiblio($dbh,$biblio);
1538 # TODO : MARC add
1539   $dbh->disconnect;
1540   return($bibnum);
1541 }
1542
1543 sub modbiblio {
1544   my ($biblio) = @_;
1545   my $dbh  = C4Connect;
1546   my $biblionumber=OLDmodbiblio($dbh,$biblio);
1547   $dbh->disconnect;
1548   return($biblionumber);
1549 } # sub modbiblio
1550
1551 sub modsubtitle {
1552   my ($bibnum, $subtitle) = @_;
1553   my $dbh   = C4Connect;
1554   &OLDmodsubtitle($dbh,$bibnum,$subtitle);
1555   $dbh->disconnect;
1556 } # sub modsubtitle
1557
1558
1559 sub modaddauthor {
1560     my ($bibnum, $author) = @_;
1561     my $dbh   = C4Connect;
1562     &OLDmodaddauthor($dbh,$bibnum,$author);
1563     $dbh->disconnect;
1564 } # sub modaddauthor
1565
1566
1567 sub modsubject {
1568   my ($bibnum, $force, @subject) = @_;
1569   my $dbh   = C4Connect;
1570   my $error= &OLDmodsubject($dbh,$bibnum,$force, @subject);
1571   return($error);
1572 } # sub modsubject
1573
1574 sub modbibitem {
1575     my ($biblioitem) = @_;
1576     my $dbh   = C4Connect;
1577     &OLDmodbibitem($dbh,$biblioitem);
1578     $dbh->disconnect;
1579 } # sub modbibitem
1580
1581 sub modnote {
1582   my ($bibitemnum,$note)=@_;
1583   my $dbh=C4Connect;
1584   &OLDmodnote($dbh,$bibitemnum,$note);
1585   $dbh->disconnect;
1586 }
1587
1588 sub newbiblioitem {
1589   my ($biblioitem) = @_;
1590   my $dbh   = C4Connect;
1591   my $bibitemnum = &OLDnewbiblioitem($dbh,$biblioitem);
1592 #  print STDERR "bibitemnum : $bibitemnum\n";
1593   my $MARCbiblio= MARCkoha2marcBiblio($dbh,$biblioitem->{biblionumber},$bibitemnum);
1594 #  print STDERR $MARCbiblio->as_formatted();
1595   &MARCaddbiblio($dbh,$MARCbiblio,$biblioitem->{biblionumber});
1596   return($bibitemnum);
1597 }
1598
1599 sub newsubject {
1600   my ($bibnum)=@_;
1601   my $dbh=C4Connect;
1602   &OLDnewsubject($dbh,$bibnum);
1603   $dbh->disconnect;
1604 }
1605
1606 sub newsubtitle {
1607     my ($bibnum, $subtitle) = @_;
1608     my $dbh   = C4Connect;
1609     &OLDnewsubtitle($dbh,$bibnum,$subtitle);
1610   $dbh->disconnect;
1611 }
1612
1613
1614 sub newitems {
1615   my ($item, @barcodes) = @_;
1616   my $dbh   = C4Connect;
1617   my $errors;
1618   my $itemnumber;
1619   my $error;
1620   foreach my $barcode (@barcodes) {
1621       ($itemnumber,$error)=&OLDnewitems($dbh,$item,uc($barcode));
1622       $errors .=$error;
1623   }
1624   $dbh->disconnect;
1625   return($errors);
1626 }
1627
1628 sub moditem {
1629   my ($loan,$itemnum,$bibitemnum,$barcode,$notes,$homebranch,$lost,$wthdrawn,$replacement)=@_;
1630   my $dbh=C4Connect;
1631   &OLDmoditem($dbh,$loan,$itemnum,$bibitemnum,$barcode,$notes,$homebranch,$lost,$wthdrawn,$replacement);
1632   $dbh->disconnect;
1633 }
1634
1635 sub checkitems{
1636   my ($count,@barcodes)=@_;
1637   my $dbh=C4Connect;
1638   my $error;
1639   for (my $i=0;$i<$count;$i++){
1640     $barcodes[$i]=uc $barcodes[$i];
1641     my $query="Select * from items where barcode='$barcodes[$i]'";
1642     my $sth=$dbh->prepare($query);
1643     $sth->execute;
1644     if (my $data=$sth->fetchrow_hashref){
1645       $error.=" Duplicate Barcode: $barcodes[$i]";
1646     }
1647     $sth->finish;
1648   }
1649   $dbh->disconnect;
1650   return($error);
1651 }
1652
1653 sub countitems{
1654   my ($bibitemnum)=@_;
1655   my $dbh=C4Connect;
1656   my $query="Select count(*) from items where biblioitemnumber='$bibitemnum'";
1657   my $sth=$dbh->prepare($query);
1658   $sth->execute;
1659   my $data=$sth->fetchrow_hashref;
1660   $sth->finish;
1661   $dbh->disconnect;
1662   return($data->{'count(*)'});
1663 }
1664
1665 sub delitem{
1666   my ($itemnum)=@_;
1667   my $dbh=C4Connect;
1668   &OLDdelitem($dbh,$itemnum);
1669   $dbh->disconnect;
1670 }
1671
1672 sub deletebiblioitem {
1673     my ($biblioitemnumber) = @_;
1674     my $dbh   = C4Connect;
1675     &OLDdeletebiblioitem($dbh,$biblioitemnumber);
1676     $dbh->disconnect;
1677 } # sub deletebiblioitem
1678
1679
1680 sub delbiblio {
1681   my ($biblio)=@_;
1682   my $dbh=C4Connect;
1683   &OLDdelbiblio($dbh,$biblio);
1684   $dbh->disconnect;
1685 }
1686
1687 sub getitemtypes {
1688   my $dbh   = C4Connect;
1689   my $query = "select * from itemtypes";
1690   my $sth   = $dbh->prepare($query);
1691     # || die "Cannot prepare $query" . $dbh->errstr;
1692   my $count = 0;
1693   my @results;
1694   
1695   $sth->execute;
1696     # || die "Cannot execute $query\n" . $sth->errstr;
1697   while (my $data = $sth->fetchrow_hashref) {
1698     $results[$count] = $data;
1699     $count++;
1700   } # while
1701   
1702   $sth->finish;
1703   $dbh->disconnect;
1704   return($count, @results);
1705 } # sub getitemtypes
1706
1707 sub getbiblio {
1708     my ($biblionumber) = @_;
1709     my $dbh   = C4Connect;
1710     my $query = "Select * from biblio where biblionumber = $biblionumber";
1711     my $sth   = $dbh->prepare($query);
1712       # || die "Cannot prepare $query\n" . $dbh->errstr;
1713     my $count = 0;
1714     my @results;
1715     
1716     $sth->execute;
1717       # || die "Cannot execute $query\n" . $sth->errstr;
1718     while (my $data = $sth->fetchrow_hashref) {
1719       $results[$count] = $data;
1720       $count++;
1721     } # while
1722     
1723     $sth->finish;
1724     $dbh->disconnect;
1725     return($count, @results);
1726 } # sub getbiblio
1727
1728 sub getbiblioitem {
1729     my ($biblioitemnum) = @_;
1730     my $dbh   = C4Connect;
1731     my $query = "Select * from biblioitems where
1732 biblioitemnumber = $biblioitemnum";
1733     my $sth   = $dbh->prepare($query);
1734     my $count = 0;
1735     my @results;
1736
1737     $sth->execute;
1738
1739     while (my $data = $sth->fetchrow_hashref) {
1740         $results[$count] = $data;
1741         $count++;
1742     } # while
1743
1744     $sth->finish;
1745     $dbh->disconnect;
1746     return($count, @results);
1747 } # sub getbiblioitem
1748
1749 sub getbiblioitembybiblionumber {
1750     my ($biblionumber) = @_;
1751     my $dbh   = C4Connect;
1752     my $query = "Select * from biblioitems where biblionumber =
1753 $biblionumber";
1754     my $sth   = $dbh->prepare($query);
1755     my $count = 0;
1756     my @results;
1757
1758     $sth->execute;
1759
1760     while (my $data = $sth->fetchrow_hashref) {
1761         $results[$count] = $data;
1762         $count++;
1763     } # while
1764
1765     $sth->finish;
1766     $dbh->disconnect;
1767     return($count, @results);
1768 } # sub
1769
1770 sub getitemsbybiblioitem {
1771     my ($biblioitemnum) = @_;
1772     my $dbh   = C4Connect;
1773     my $query = "Select * from items, biblio where
1774 biblio.biblionumber = items.biblionumber and biblioitemnumber
1775 = $biblioitemnum";
1776     my $sth   = $dbh->prepare($query);
1777       # || die "Cannot prepare $query\n" . $dbh->errstr;
1778     my $count = 0;
1779     my @results;
1780     
1781     $sth->execute;
1782       # || die "Cannot execute $query\n" . $sth->errstr;
1783     while (my $data = $sth->fetchrow_hashref) {
1784       $results[$count] = $data;
1785       $count++;
1786     } # while
1787     
1788     $sth->finish;
1789     $dbh->disconnect;
1790     return($count, @results);
1791 } # sub getitemsbybiblioitem
1792
1793 sub isbnsearch {
1794     my ($isbn) = @_;
1795     my $dbh   = C4Connect;
1796     my $count = 0;
1797     my $query;
1798     my $sth;
1799     my @results;
1800     
1801     $isbn  = $dbh->quote($isbn);
1802     $query = "Select biblio.* from biblio, biblioitems where
1803 biblio.biblionumber = biblioitems.biblionumber
1804 and isbn = $isbn";
1805     $sth   = $dbh->prepare($query);
1806     
1807     $sth->execute;
1808     while (my $data = $sth->fetchrow_hashref) {
1809         $results[$count] = $data;
1810         $count++;
1811     } # while
1812
1813     $sth->finish;
1814     $dbh->disconnect;
1815     return($count, @results);
1816 } # sub isbnsearch
1817
1818 #sub skip {
1819 # At the moment this is just a straight copy of the subject code.  Needs heavy
1820 # modification to work for additional authors, obviously.
1821 # Check for additional author changes
1822     
1823 #    my $newadditionalauthor='';
1824 #    my $additionalauthors;
1825 #    foreach $newadditionalauthor (@{$biblio->{'additionalauthor'}}) {
1826 #       $additionalauthors->{$newadditionalauthor}=1;
1827 #       if ($origadditionalauthors->{$newadditionalauthor}) {
1828 #           $additionalauthors->{$newadditionalauthor}=2;
1829 #       } else {
1830 #           my $q_newadditionalauthor=$dbh->quote($newadditionalauthor);
1831 #           my $sth=$dbh->prepare("insert into biblioadditionalauthors (additionalauthor,biblionumber) values ($q_newadditionalauthor, $biblionumber)");
1832 #           $sth->execute;
1833 #           logchange('kohadb', 'add', 'biblio', 'additionalauthor', $newadditionalauthor);
1834 #           my $subfields;
1835 #           $subfields->{1}->{'Subfield_Mark'}='a';
1836 #           $subfields->{1}->{'Subfield_Value'}=$newadditionalauthor;
1837 #           my $tag='650';
1838 #           my $Record_ID;
1839 #           foreach $Record_ID (@marcrecords) {
1840 #               addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
1841 #               logchange('marc', 'add', $Record_ID, '650', 'a', $newadditionalauthor);
1842 #           }
1843 #       }
1844 #    }
1845 #    my $origadditionalauthor;
1846 #    foreach $origadditionalauthor (keys %$origadditionalauthors) {
1847 #       if ($additionalauthors->{$origadditionalauthor} == 1) {
1848 #           my $q_origadditionalauthor=$dbh->quote($origadditionalauthor);
1849 #           logchange('kohadb', 'delete', 'biblio', '$biblionumber', 'additionalauthor', $origadditionalauthor);
1850 #           my $sth=$dbh->prepare("delete from biblioadditionalauthors where biblionumber=$biblionumber and additionalauthor=$q_origadditionalauthor");
1851 #           $sth->execute;
1852 #       }
1853 #    }
1854 #
1855 #}
1856 #    $dbh->disconnect;
1857 #}
1858
1859 sub logchange {
1860 # Subroutine to log changes to databases
1861 # Eventually, this subroutine will be used to create a log of all changes made,
1862 # with the possibility of "undo"ing some changes
1863     my $database=shift;
1864     if ($database eq 'kohadb') {
1865         my $type=shift;
1866         my $section=shift;
1867         my $item=shift;
1868         my $original=shift;
1869         my $new=shift;
1870         print STDERR "KOHA: $type $section $item $original $new\n";
1871     } elsif ($database eq 'marc') {
1872         my $type=shift;
1873         my $Record_ID=shift;
1874         my $tag=shift;
1875         my $mark=shift;
1876         my $subfield_ID=shift;
1877         my $original=shift;
1878         my $new=shift;
1879         print STDERR "MARC: $type $Record_ID $tag $mark $subfield_ID $original $new\n";
1880     }
1881 }
1882
1883 #------------------------------------------------
1884
1885
1886 #---------------------------------------
1887 # Find a biblio entry, or create a new one if it doesn't exist.
1888 #  If a "subtitle" entry is in hash, add it to subtitle table
1889 sub getoraddbiblio {
1890         # input params
1891         my (
1892           $dbh,         # db handle
1893           $biblio,      # hash ref to fields
1894         )=@_;
1895
1896         # return
1897         my $biblionumber;
1898
1899         my $debug=0;
1900         my $sth;
1901         my $error;
1902
1903         #-----
1904         requireDBI($dbh,"getoraddbiblio");
1905
1906         print "<PRE>Looking for biblio </PRE>\n" if $debug;
1907         $sth=$dbh->prepare("select biblionumber
1908                 from biblio
1909                 where title=? and author=? 
1910                   and copyrightdate=? and seriestitle=?");
1911         $sth->execute(
1912                 $biblio->{title}, $biblio->{author},
1913                 $biblio->{copyright}, $biblio->{seriestitle} );
1914         if ($sth->rows) {
1915             ($biblionumber) = $sth->fetchrow;
1916             print "<PRE>Biblio exists with number $biblionumber</PRE>\n" if $debug;
1917         } else {
1918             # Doesn't exist.  Add new one.
1919             print "<PRE>Adding biblio</PRE>\n" if $debug;
1920             ($biblionumber,$error)=&newbiblio($biblio);
1921             if ( $biblionumber ) {
1922               print "<PRE>Added with biblio number=$biblionumber</PRE>\n" if $debug;
1923               if ( $biblio->{subtitle} ) {
1924                 &newsubtitle($biblionumber,$biblio->{subtitle} );
1925               } # if subtitle
1926             } else {
1927                 print "<PRE>Couldn't add biblio: $error</PRE>\n" if $debug;
1928             } # if added
1929         }
1930
1931         return $biblionumber,$error;
1932
1933 } # sub getoraddbiblio
1934
1935 #
1936 #
1937 # UNUSEFUL SUBs. Could be deleted, kept only until beta test
1938 # maybe useful for some MARC tricks steve used.
1939 #
1940
1941 sub OLD_MAYBE_DELETED_newBiblioItem {
1942     my ($env, $biblioitem) = @_;
1943     my $dbh=&C4Connect;  
1944     my $biblionumber=$biblioitem->{'biblionumber'};
1945     my $biblioitemnumber=$biblioitem->{'biblioitemnumber'};
1946     my $volume=$biblioitem->{'volume'};
1947     my $q_volume=$dbh->quote($volume);
1948     my $number=$biblioitem->{'number'};
1949     my $q_number=$dbh->quote($number);
1950     my $classification=$biblioitem->{'classification'};
1951     my $q_classification=$dbh->quote($classification);
1952     my $itemtype=$biblioitem->{'itemtype'};
1953     my $q_itemtype=$dbh->quote($itemtype);
1954     my $isbn=$biblioitem->{'isbn'};
1955     my $q_isbn=$dbh->quote($isbn);
1956     my $issn=$biblioitem->{'issn'};
1957     my $q_issn=$dbh->quote($issn);
1958     my $dewey=$biblioitem->{'dewey'};
1959     $dewey=~s/\.*0*$//;
1960     ($dewey == 0) && ($dewey='');
1961     my $subclass=$biblioitem->{'subclass'};
1962     my $q_subclass=$dbh->quote($subclass);
1963     my $publicationyear=$biblioitem->{'publicationyear'};
1964     my $publishercode=$biblioitem->{'publishercode'};
1965     my $q_publishercode=$dbh->quote($publishercode);
1966     my $volumedate=$biblioitem->{'volumedate'};
1967     my $q_volumedate=$dbh->quote($volumedate);
1968     my $illus=$biblioitem->{'illus'};
1969     my $q_illus=$dbh->quote($illus);
1970     my $pages=$biblioitem->{'pages'};
1971     my $q_pages=$dbh->quote($pages);
1972     my $notes=$biblioitem->{'notes'};
1973     my $q_notes=$dbh->quote($notes);
1974     my $size=$biblioitem->{'size'};
1975     my $q_size=$dbh->quote($size);
1976     my $place=$biblioitem->{'place'};
1977     my $q_place=$dbh->quote($place);
1978     my $lccn=$biblioitem->{'lccn'};
1979     my $q_lccn=$dbh->quote($lccn);
1980
1981
1982 # Unless the $env->{'marconly'} flag is set, update the biblioitems table with
1983 # the new data
1984
1985     unless ($env->{'marconly'}) {
1986         #my $sth=$dbh->prepare("lock tables biblioitems write");
1987         #$sth->execute;
1988         my $sth=$dbh->prepare("select max(biblioitemnumber) from biblioitems");
1989         $sth->execute;
1990         my ($biblioitemnumber) =$sth->fetchrow;
1991         $biblioitemnumber++;
1992         $sth=$dbh->prepare("insert into biblioitems (biblionumber,biblioitemnumber,volume,number,classification,itemtype,isbn,issn,dewey,subclass,publicationyear,publishercode,volumedate,illus,pages,notes,size,place,lccn) values ($biblionumber, $biblioitemnumber, $q_volume, $q_number, $q_classification, $q_itemtype, $q_isbn, $q_issn, $dewey, $q_subclass, $publicationyear, $q_publishercode, $q_volumedate, $q_illus, $q_pages,$q_notes, $q_size, $q_place, $q_lccn)");
1993         $sth->execute;
1994         #my $sth=$dbh->prepare("unlock tables");
1995         #$sth->execute;
1996     }
1997
1998
1999 # Should we check if there is already a biblioitem/amrc with the
2000 # same isbn/lccn/issn?
2001
2002     my $sth=$dbh->prepare("select title,unititle,seriestitle,copyrightdate,notes,author from biblio where biblionumber=$biblionumber");
2003     $sth->execute;
2004     my ($title, $unititle,$seriestitle,$copyrightdate,$biblionotes,$author) = $sth->fetchrow;
2005     $sth=$dbh->prepare("select subtitle from bibliosubtitle where biblionumber=$biblionumber");
2006     $sth->execute;
2007     my ($subtitle) = $sth->fetchrow;
2008     $sth=$dbh->prepare("select author from additionalauthors where biblionumber=$biblionumber");
2009     $sth->execute;
2010     my @additionalauthors;
2011     while (my ($additionalauthor) = $sth->fetchrow) {
2012         push (@additionalauthors, $additionalauthor);
2013     }
2014     $sth=$dbh->prepare("select subject from bibliosubject where biblionumber=$biblionumber");
2015     $sth->execute;
2016     my @subjects;
2017     while (my ($subject) = $sth->fetchrow) {
2018         push (@subjects, $subject);
2019     }
2020
2021 # MARC SECTION
2022
2023     $sth=$dbh->prepare("insert into Resource_Table (Record_ID) values (0)");
2024     $sth->execute;
2025     my $Resource_ID=$dbh->{'mysql_insertid'};
2026     my $Record_ID=$Resource_ID;
2027     $sth=$dbh->prepare("update Resource_Table set Record_ID=$Record_ID where Resource_ID=$Resource_ID");
2028     $sth->execute;
2029
2030 # Title
2031     {
2032         my $subfields;
2033         $subfields->{1}->{'Subfield_Mark'}='a';
2034         $subfields->{1}->{'Subfield_Value'}=$title;
2035         if ($subtitle) {
2036             $subfields->{2}->{'Subfield_Mark'}='b';
2037             $subfields->{2}->{'Subfield_Value'}=$subtitle;
2038         }
2039         my $tag='245';
2040         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2041     }
2042
2043 # author
2044     {
2045         my $subfields;
2046         $subfields->{1}->{'Subfield_Mark'}='a';
2047         $subfields->{1}->{'Subfield_Value'}=$author;
2048         my $tag='100';
2049         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2050     }
2051 # Series Title
2052     if ($seriestitle) {
2053         my $subfields;
2054         $subfields->{1}->{'Subfield_Mark'}='a';
2055         $subfields->{1}->{'Subfield_Value'}=$seriestitle;
2056         my $tag='440';
2057         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2058     }
2059 # Biblio Note
2060     if ($biblionotes) {
2061         my $subfields;
2062         $subfields->{1}->{'Subfield_Mark'}='a';
2063         $subfields->{1}->{'Subfield_Value'}=$biblionotes;
2064         $subfields->{2}->{'Subfield_Mark'}='3';
2065         $subfields->{2}->{'Subfield_Value'}='biblio';
2066         my $tag='500';
2067         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2068     }
2069 # Additional Authors
2070     foreach (@additionalauthors) {
2071         my $author=$_;
2072         (next) unless ($author);
2073         my $subfields;
2074         $subfields->{1}->{'Subfield_Mark'}='a';
2075         $subfields->{1}->{'Subfield_Value'}=$author;
2076         $subfields->{2}->{'Subfield_Mark'}='e';
2077         $subfields->{2}->{'Subfield_Value'}='author';
2078         my $tag='700';
2079         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2080     }
2081 # Illustrator
2082     if ($illus) {
2083         (next) unless ($illus);
2084         my $subfields;
2085         $subfields->{1}->{'Subfield_Mark'}='a';
2086         $subfields->{1}->{'Subfield_Value'}=$illus;
2087         $subfields->{2}->{'Subfield_Mark'}='e';
2088         $subfields->{2}->{'Subfield_Value'}='illustrator';
2089         my $tag='700';
2090         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2091     }
2092 # Subjects
2093     foreach (@subjects) {
2094         my $subject=$_;
2095         (next) unless ($subject);
2096         my $subfields;
2097         $subfields->{1}->{'Subfield_Mark'}='a';
2098         $subfields->{1}->{'Subfield_Value'}=$subject;
2099         my $tag='650';
2100         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2101     }
2102
2103
2104 # ISBN
2105     if ($isbn) {
2106         my $subfields;
2107         $subfields->{1}->{'Subfield_Mark'}='a';
2108         $subfields->{1}->{'Subfield_Value'}=$isbn;
2109         my $tag='020';
2110         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2111     }
2112 # LCCN
2113     if ($lccn) {
2114         my $subfields;
2115         $subfields->{1}->{'Subfield_Mark'}='a';
2116         $subfields->{1}->{'Subfield_Value'}=$lccn;
2117         my $tag='010';
2118         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2119     }
2120 # ISSN
2121     if ($issn) {
2122         my $subfields;
2123         $subfields->{1}->{'Subfield_Mark'}='a';
2124         $subfields->{1}->{'Subfield_Value'}=$issn;
2125         my $tag='022';
2126         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2127     }
2128 # DEWEY
2129     if ($dewey) {
2130         my $subfields;
2131         $subfields->{1}->{'Subfield_Mark'}='a';
2132         $subfields->{1}->{'Subfield_Value'}=$dewey;
2133         my $tag='082';
2134         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2135     }
2136 # DEWEY subclass and itemtype
2137     {
2138         my $subfields;
2139         $subfields->{1}->{'Subfield_Mark'}='a';
2140         $subfields->{1}->{'Subfield_Value'}=$itemtype;
2141         $subfields->{2}->{'Subfield_Mark'}='b';
2142         $subfields->{2}->{'Subfield_Value'}=$subclass;
2143         $subfields->{3}->{'Subfield_Mark'}='c';
2144         $subfields->{3}->{'Subfield_Value'}=$biblionumber;
2145         $subfields->{4}->{'Subfield_Mark'}='d';
2146         $subfields->{4}->{'Subfield_Value'}=$biblioitemnumber;
2147         my $tag='090';
2148         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2149     }
2150 # PUBLISHER
2151     {
2152         my $subfields;
2153         $subfields->{1}->{'Subfield_Mark'}='a';
2154         $subfields->{1}->{'Subfield_Value'}=$place;
2155         $subfields->{2}->{'Subfield_Mark'}='b';
2156         $subfields->{2}->{'Subfield_Value'}=$publishercode;
2157         $subfields->{3}->{'Subfield_Mark'}='c';
2158         $subfields->{3}->{'Subfield_Value'}=$publicationyear;
2159         if ($copyrightdate) {
2160             $subfields->{4}->{'Subfield_Mark'}='c';
2161             $subfields->{4}->{'Subfield_Value'}="c$copyrightdate";
2162         }
2163         my $tag='260';
2164         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2165     }
2166 # PHYSICAL
2167     if ($pages || $size) {
2168         my $subfields;
2169         $subfields->{1}->{'Subfield_Mark'}='a';
2170         $subfields->{1}->{'Subfield_Value'}=$pages;
2171         $subfields->{2}->{'Subfield_Mark'}='c';
2172         $subfields->{2}->{'Subfield_Value'}=$size;
2173         my $tag='300';
2174         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2175     }
2176 # Volume/Number
2177     if ($volume || $number) {
2178         my $subfields;
2179         $subfields->{1}->{'Subfield_Mark'}='v';
2180         $subfields->{1}->{'Subfield_Value'}=$volume;
2181         $subfields->{2}->{'Subfield_Mark'}='n';
2182         $subfields->{2}->{'Subfield_Value'}=$number;
2183         my $tag='440';
2184         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2185     }
2186 # Biblioitem Note
2187     if ($notes) {
2188         my $subfields;
2189         $subfields->{1}->{'Subfield_Mark'}='a';
2190         $subfields->{1}->{'Subfield_Value'}=$notes;
2191         $subfields->{2}->{'Subfield_Mark'}='3';
2192         $subfields->{2}->{'Subfield_Value'}='biblioitem';
2193         my $tag='500';
2194         addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2195     }
2196     $sth->finish;
2197     $dbh->disconnect;
2198     return ($env, $Record_ID);
2199 }
2200
2201 sub OLD_MAYBE_DELETED_newItem {
2202     my ($env, $Record_ID, $item) = @_;
2203     my $dbh=&C4Connect;  
2204     my $barcode=$item->{'barcode'};
2205     my $q_barcode=$dbh->quote($barcode);
2206     my $biblionumber=$item->{'biblionumber'};
2207     my $biblioitemnumber=$item->{'biblioitemnumber'};
2208     my $dateaccessioned=$item->{'dateaccessioned'};
2209     my $booksellerid=$item->{'booksellerid'};
2210     my $q_booksellerid=$dbh->quote($booksellerid);
2211     my $homebranch=$item->{'homebranch'};
2212     my $q_homebranch=$dbh->quote($homebranch);
2213     my $holdingbranch=$item->{'holdingbranch'};
2214     my $price=$item->{'price'};
2215     my $replacementprice=$item->{'replacementprice'};
2216     my $replacementpricedate=$item->{'replacementpricedate'};
2217     my $q_replacementpricedate=$dbh->quote($replacementpricedate);
2218     my $notforloan=$item->{'notforloan'};
2219     my $itemlost=$item->{'itemlost'};
2220     my $wthdrawn=$item->{'wthdrawn'};
2221     my $restricted=$item->{'restricted'};
2222     my $itemnotes=$item->{'itemnotes'};
2223     my $q_itemnotes=$dbh->quote($itemnotes);
2224     my $itemtype=$item->{'itemtype'};
2225     my $subclass=$item->{'subclass'};
2226
2227 # KOHADB Section
2228
2229     unless ($env->{'marconly'}) {
2230         my $sth=$dbh->prepare("select max(itemnumber) from items");
2231         $sth->execute;
2232         my ($itemnumber) =$sth->fetchrow;
2233         $itemnumber++;
2234         $sth=$dbh->prepare("insert into items (itemnumber,biblionumber,biblioitemnumber,barcode,dateaccessioned,booksellerid,homebranch,price,replacementprice,replacementpricedate,notforloan,itemlost,wthdrawn,restricted,itemnotes) values ($itemnumber,$biblionumber,$biblioitemnumber,$q_barcode,$dateaccessioned,$q_booksellerid,$q_homebranch,$price,$q_replacementpricedate,$notforloan,$itemlost,$wthdrawn,$restricted,$q_itemnotes)");
2235         $sth->execute;
2236     }
2237
2238
2239 # MARC SECTION
2240     my $subfields;
2241     $subfields->{1}->{'Subfield_Mark'}='p';
2242     $subfields->{1}->{'Subfield_Value'}=$barcode;
2243     $subfields->{2}->{'Subfield_Mark'}='d';
2244     $subfields->{2}->{'Subfield_Value'}=$dateaccessioned;
2245     $subfields->{3}->{'Subfield_Mark'}='e';
2246     $subfields->{3}->{'Subfield_Value'}=$booksellerid;
2247     $subfields->{4}->{'Subfield_Mark'}='b';
2248     $subfields->{4}->{'Subfield_Value'}=$homebranch;
2249     $subfields->{5}->{'Subfield_Mark'}='l';
2250     $subfields->{5}->{'Subfield_Value'}=$holdingbranch;
2251     $subfields->{6}->{'Subfield_Mark'}='c';
2252     $subfields->{6}->{'Subfield_Value'}=$price;
2253     $subfields->{7}->{'Subfield_Mark'}='c';
2254     $subfields->{7}->{'Subfield_Value'}=$replacementprice;
2255     $subfields->{8}->{'Subfield_Mark'}='d';
2256     $subfields->{8}->{'Subfield_Value'}=$replacementpricedate;
2257     if ($notforloan) {
2258         $subfields->{9}->{'Subfield_Mark'}='h';
2259         $subfields->{9}->{'Subfield_Value'}='Not for loan';
2260     }
2261     if ($notforloan) {
2262         $subfields->{10}->{'Subfield_Mark'}='j';
2263         $subfields->{10}->{'Subfield_Value'}='Item lost';
2264     }
2265     if ($notforloan) {
2266         $subfields->{11}->{'Subfield_Mark'}='j';
2267         $subfields->{11}->{'Subfield_Value'}='Item withdrawn';
2268     }
2269     if ($notforloan) {
2270         $subfields->{12}->{'Subfield_Mark'}='z';
2271         $subfields->{12}->{'Subfield_Value'}=$itemnotes;
2272     }
2273     my $tag='876';
2274     my $Tag_ID;
2275     $env->{'linkage'}=1;
2276     ($env, $Tag_ID) = addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2277     $env->{'linkage'}=0;
2278     $env->{'linkid'}=$Tag_ID;
2279     $tag='852';
2280     my $subfields2;
2281     $subfields2->{1}->{'Subfield_Mark'}='a';
2282     $subfields2->{1}->{'Subfield_Value'}='Coast Mountains School District';
2283     $subfields2->{1}->{'Subfield_Mark'}='b';
2284     $subfields2->{1}->{'Subfield_Value'}=$homebranch;
2285     $subfields2->{1}->{'Subfield_Mark'}='c';
2286     $subfields2->{1}->{'Subfield_Value'}=$itemtype;
2287     $subfields2->{2}->{'Subfield_Mark'}='m';
2288     $subfields2->{2}->{'Subfield_Value'}=$subclass;
2289     addTag($env, $Record_ID, $tag, ' ', ' ', $subfields2);
2290     $env->{'linkid'}='';
2291 }
2292
2293 sub OLD_MAYBE_DELETED_updateBiblio {
2294 # Update the biblio with biblionumber $biblio->{'biblionumber'}
2295 # I guess this routine should search through all marc records for a record that
2296 # has the same biblionumber stored in it, and modify the MARC record as well as
2297 # the biblio table.
2298 #
2299 # Also, this subroutine should search through the $biblio object and compare it
2300 # to the existing record and _LOG ALL CHANGES MADE_ in some way.  I'd like for
2301 # this logging feature to be usable to undo changes easily.
2302
2303     my ($env, $biblio) = @_;
2304     my $Record_ID;
2305     my $biblionumber=$biblio->{'biblionumber'};
2306     my $dbh=&C4Connect;  
2307     my $sth=$dbh->prepare("select * from biblio where biblionumber=$biblionumber");
2308     $sth->execute;
2309     my $origbiblio=$sth->fetchrow_hashref;
2310     $sth=$dbh->prepare("select subtitle from bibliosubtitle where biblionumber=$biblionumber");
2311     $sth->execute;
2312     my ($subtitle)=$sth->fetchrow;
2313     $origbiblio->{'subtitle'}=$subtitle;
2314     $sth=$dbh->prepare("select author from additionalauthors where biblionumber=$biblionumber");
2315     $sth->execute;
2316     my $origadditionalauthors;
2317     while (my ($author) = $sth->fetchrow) {
2318         push (@{$origbiblio->{'additionalauthors'}}, $author);
2319         $origadditionalauthors->{$author}=1;
2320     }
2321     $sth=$dbh->prepare("select subject from bibliosubject where biblionumber=$biblionumber");
2322     $sth->execute;
2323     my $origsubjects;
2324     while (my ($subject) = $sth->fetchrow) {
2325         push (@{$origbiblio->{'subjects'}}, $subject);
2326         $origsubjects->{$subject}=1;
2327     }
2328
2329     
2330 # Obtain a list of MARC Record_ID's that are tied to this biblio
2331     $sth=$dbh->prepare("select bibid from marc_subfield_table where tag='090' and subfieldvalue=$biblionumber and subfieldcode='c'");
2332     $sth->execute;
2333     my @marcrecords;
2334     while (my ($bibid) = $sth->fetchrow) {
2335         push(@marcrecords, $bibid);
2336     }
2337
2338     my $bibid='';
2339     if ($biblio->{'author'} ne $origbiblio->{'author'}) {
2340         my $q_author=$dbh->quote($biblio->{'author'});
2341         logchange('kohadb', 'change', 'biblio', 'author', $origbiblio->{'author'}, $biblio->{'author'});
2342         my $sti=$dbh->prepare("update biblio set author=$q_author where biblionumber=$biblio->{'biblionumber'}");
2343         $sti->execute;
2344         foreach $bibid (@marcrecords) {
2345             logchange('marc', 'change', $bibid, '100', 'a', $origbiblio->{'author'}, $biblio->{'author'});
2346             changeSubfield($bibid, '100', 'a', $origbiblio->{'author'}, $biblio->{'author'});
2347         }
2348     }
2349     if ($biblio->{'title'} ne $origbiblio->{'title'}) {
2350         my $q_title=$dbh->quote($biblio->{'title'});
2351         logchange('kohadb', 'change', 'biblio', 'title', $origbiblio->{'title'}, $biblio->{'title'});
2352         my $sti=$dbh->prepare("update biblio set title=$q_title where biblionumber=$biblio->{'biblionumber'}");
2353         $sti->execute;
2354         foreach $Record_ID (@marcrecords) {
2355             logchange('marc', 'change', $Record_ID, '245', 'a', $origbiblio->{'title'}, $biblio->{'title'});
2356             changeSubfield($Record_ID, '245', 'a', $origbiblio->{'title'}, $biblio->{'title'});
2357         }
2358     }
2359     if ($biblio->{'subtitle'} ne $origbiblio->{'subtitle'}) {
2360         my $q_subtitle=$dbh->quote($biblio->{'subtitle'});
2361         logchange('kohadb', 'change', 'biblio', 'subtitle', $origbiblio->{'subtitle'}, $biblio->{'subtitle'});
2362         my $sti=$dbh->prepare("update bibliosubtitle set subtitle=$q_subtitle where biblionumber=$biblio->{'biblionumber'}");
2363         $sti->execute;
2364         foreach $Record_ID (@marcrecords) {
2365             logchange('marc', 'change', $Record_ID, '245', 'b', $origbiblio->{'subtitle'}, $biblio->{'subtitle'});
2366             changeSubfield($Record_ID, '245', 'b', $origbiblio->{'subtitle'}, $biblio->{'subtitle'});
2367         }
2368     }
2369     if ($biblio->{'unititle'} ne $origbiblio->{'unititle'}) {
2370         my $q_unititle=$dbh->quote($biblio->{'unititle'});
2371         logchange('kohadb', 'change', 'biblio', 'unititle', $origbiblio->{'unititle'}, $biblio->{'unititle'});
2372         my $sti=$dbh->prepare("update biblio set unititle=$q_unititle where biblionumber=$biblio->{'biblionumber'}");
2373         $sti->execute;
2374     }
2375     if ($biblio->{'notes'} ne $origbiblio->{'notes'}) {
2376         my $q_notes=$dbh->quote($biblio->{'notes'});
2377         logchange('kohadb', 'change', 'biblio', 'notes', $origbiblio->{'notes'}, $biblio->{'notes'});
2378         my $sti=$dbh->prepare("update biblio set notes=$q_notes where biblionumber=$biblio->{'biblionumber'}");
2379         $sti->execute;
2380         foreach $Record_ID (@marcrecords) {
2381             logchange('marc', 'change', $Record_ID, '500', 'a', $origbiblio->{'notes'}, $biblio->{'notes'});
2382             changeSubfield($Record_ID, '500', 'a', $origbiblio->{'notes'}, $biblio->{'notes'});
2383         }
2384     }
2385     if ($biblio->{'serial'} ne $origbiblio->{'serial'}) {
2386         my $q_serial=$dbh->quote($biblio->{'serial'});
2387         logchange('kohadb', 'change', 'biblio', 'serial', $origbiblio->{'serial'}, $biblio->{'serial'});
2388         my $sti=$dbh->prepare("update biblio set serial=$q_serial where biblionumber=$biblio->{'biblionumber'}");
2389         $sti->execute;
2390     }
2391     if ($biblio->{'seriestitle'} ne $origbiblio->{'seriestitle'}) {
2392         my $q_seriestitle=$dbh->quote($biblio->{'seriestitle'});
2393         logchange('kohadb', 'change', 'biblio', 'seriestitle', $origbiblio->{'seriestitle'}, $biblio->{'seriestitle'});
2394         my $sti=$dbh->prepare("update biblio set seriestitle=$q_seriestitle where biblionumber=$biblio->{'biblionumber'}");
2395         $sti->execute;
2396         foreach $Record_ID (@marcrecords) {
2397             logchange('marc', 'change', $Record_ID, '440', 'a', $origbiblio->{'seriestitle'}, $biblio->{'seriestitle'});
2398             changeSubfield($Record_ID, '440', 'a', $origbiblio->{'seriestitle'}, $biblio->{'seriestitle'});
2399         }
2400     }
2401     if ($biblio->{'copyrightdate'} ne $origbiblio->{'copyrightdate'}) {
2402         my $q_copyrightdate=$dbh->quote($biblio->{'copyrightdate'});
2403         logchange('kohadb', 'change', 'biblio', 'copyrightdate', $origbiblio->{'copyrightdate'}, $biblio->{'copyrightdate'});
2404         my $sti=$dbh->prepare("update biblio set copyrightdate=$q_copyrightdate where biblionumber=$biblio->{'biblionumber'}");
2405         $sti->execute;
2406         foreach $Record_ID (@marcrecords) {
2407             logchange('marc', 'change', $Record_ID, '260', 'c', "c$origbiblio->{'notes'}", "c$biblio->{'notes'}");
2408             changeSubfield($Record_ID, '260', 'c', "c$origbiblio->{'notes'}", "c$biblio->{'notes'}");
2409         }
2410     }
2411
2412 # Check for subject heading changes
2413     
2414     my $newsubject='';
2415     my $subjects;
2416     foreach $newsubject (@{$biblio->{'subject'}}) {
2417         $subjects->{$newsubject}=1;
2418         if ($origsubjects->{$newsubject}) {
2419             $subjects->{$newsubject}=2;
2420         } else {
2421             my $q_newsubject=$dbh->quote($newsubject);
2422             my $sth=$dbh->prepare("insert into bibliosubject (subject,biblionumber) values ($q_newsubject, $biblionumber)");
2423             $sth->execute;
2424             logchange('kohadb', 'add', 'biblio', 'subject', $newsubject);
2425             my $subfields;
2426             $subfields->{1}->{'Subfield_Mark'}='a';
2427             $subfields->{1}->{'Subfield_Value'}=$newsubject;
2428             my $tag='650';
2429             my $Record_ID;
2430             foreach $Record_ID (@marcrecords) {
2431                 addTag($env, $Record_ID, $tag, ' ', ' ', $subfields);
2432                 logchange('marc', 'add', $Record_ID, '650', 'a', $newsubject);
2433             }
2434         }
2435     }
2436     my $origsubject;
2437     foreach $origsubject (keys %$origsubjects) {
2438         if ($subjects->{$origsubject} == 1) {
2439             my $q_origsubject=$dbh->quote($origsubject);
2440             logchange('kohadb', 'delete', 'biblio', '$biblionumber', 'subject', $origsubject);
2441             my $sth=$dbh->prepare("delete from bibliosubject where biblionumber=$biblionumber and subject=$q_origsubject");
2442             $sth->execute;
2443         }
2444     }
2445 }
2446
2447 sub OLD_MAYBE_DELETED_updateBiblioItem {
2448 # Update the biblioitem with biblioitemnumber $biblioitem->{'biblioitemnumber'}
2449 #
2450 # This routine should also check to see which fields are actually being
2451 # modified, and log all changes.
2452
2453     my ($env, $biblioitem) = @_;
2454     my $dbh=&C4Connect;  
2455
2456     my $biblioitemnumber=$biblioitem->{'biblioitemnumber'};
2457     my $sth=$dbh->prepare("select * from biblioitems where biblioitemnumber=$biblioitemnumber");
2458 # obi = original biblioitem
2459     my $obi=$sth->fetchrow_hashref;
2460     $sth=$dbh->prepare("select B.Record_ID from Bib_Table B, 0XX_Tag_Table T, 0XX_Subfield_Table S where B.Tag_0XX_ID=T.Tag_ID and T.Subfield_ID=S.Subfield_ID and T.Tag='090' and S.Subfield_Mark='c' and S.Subfield_Value=$biblioitemnumber");
2461     $sth->execute;
2462     my ($Record_ID) = $sth->fetchrow;
2463     if ($biblioitem->{'biblionumber'} ne $obi->{'biblionumber'}) {
2464         logchange('kohadb', 'change', 'biblioitems', 'biblionumber', $obi->{'biblionumber'}, $biblioitem->{'biblionumber'});
2465         my $sth=$dbh->prepare("update biblioitems set biblionumber=$biblioitem->{'biblionumber'} where biblioitemnumber=$biblioitemnumber");
2466         logchange('marc', 'change', $Record_ID, '090', 'c', $obi->{'biblionumber'}, $biblioitem->{'biblionumber'});
2467         changeSubfield($Record_ID, '090', 'c', $obi->{'biblionumber'}, $biblioitem->{'biblionumber'});
2468     }
2469     if ($biblioitem->{'volume'} ne $obi->{'volume'}) {
2470         logchange('kohadb', 'change', 'biblioitems', 'volume', $obi->{'volume'}, $biblioitem->{'volume'});
2471         my $q_volume=$dbh->quote($biblioitem->{'volume'});
2472         my $sth=$dbh->prepare("update biblioitems set volume=$q_volume where biblioitemnumber=$biblioitemnumber");
2473         logchange('marc', 'change', $Record_ID, '440', 'v', $obi->{'volume'}, $biblioitem->{'volume'});
2474         changeSubfield($Record_ID, '440', 'v', $obi->{'volume'}, $biblioitem->{'volume'});
2475     }
2476     if ($biblioitem->{'number'} ne $obi->{'number'}) {
2477         logchange('kohadb', 'change', 'biblioitems', 'number', $obi->{'number'}, $biblioitem->{'number'});
2478         my $q_number=$dbh->quote($biblioitem->{'number'});
2479         my $sth=$dbh->prepare("update biblioitems set number=$q_number where biblioitemnumber=$biblioitemnumber");
2480         logchange('marc', 'change', $Record_ID, '440', 'v', $obi->{'number'}, $biblioitem->{'number'});
2481         changeSubfield($Record_ID, '440', 'v', $obi->{'number'}, $biblioitem->{'number'});
2482     }
2483     if ($biblioitem->{'itemtype'} ne $obi->{'itemtype'}) {
2484         logchange('kohadb', 'change', 'biblioitems', 'itemtype', $obi->{'itemtype'}, $biblioitem->{'itemtype'});
2485         my $q_itemtype=$dbh->quote($biblioitem->{'itemtype'});
2486         my $sth=$dbh->prepare("update biblioitems set itemtype=$q_itemtype where biblioitemnumber=$biblioitemnumber");
2487         logchange('marc', 'change', $Record_ID, '090', 'a', $obi->{'itemtype'}, $biblioitem->{'itemtype'});
2488         changeSubfield($Record_ID, '090', 'a', $obi->{'itemtype'}, $biblioitem->{'itemtype'});
2489     }
2490     if ($biblioitem->{'isbn'} ne $obi->{'isbn'}) {
2491         logchange('kohadb', 'change', 'biblioitems', 'isbn', $obi->{'isbn'}, $biblioitem->{'isbn'});
2492         my $q_isbn=$dbh->quote($biblioitem->{'isbn'});
2493         my $sth=$dbh->prepare("update biblioitems set isbn=$q_isbn where biblioitemnumber=$biblioitemnumber");
2494         logchange('marc', 'change', $Record_ID, '020', 'a', $obi->{'isbn'}, $biblioitem->{'isbn'});
2495         changeSubfield($Record_ID, '020', 'a', $obi->{'isbn'}, $biblioitem->{'isbn'});
2496     }
2497     if ($biblioitem->{'issn'} ne $obi->{'issn'}) {
2498         logchange('kohadb', 'change', 'biblioitems', 'issn', $obi->{'issn'}, $biblioitem->{'issn'});
2499         my $q_issn=$dbh->quote($biblioitem->{'issn'});
2500         my $sth=$dbh->prepare("update biblioitems set issn=$q_issn where biblioitemnumber=$biblioitemnumber");
2501         logchange('marc', 'change', $Record_ID, '022', 'a', $obi->{'issn'}, $biblioitem->{'issn'});
2502         changeSubfield($Record_ID, '022', 'a', $obi->{'issn'}, $biblioitem->{'issn'});
2503     }
2504     if ($biblioitem->{'dewey'} ne $obi->{'dewey'}) {
2505         logchange('kohadb', 'change', 'biblioitems', 'dewey', $obi->{'dewey'}, $biblioitem->{'dewey'});
2506         my $sth=$dbh->prepare("update biblioitems set dewey=$biblioitem->{'dewey'} where biblioitemnumber=$biblioitemnumber");
2507         logchange('marc', 'change', $Record_ID, '082', 'a', $obi->{'dewey'}, $biblioitem->{'dewey'});
2508         changeSubfield($Record_ID, '082', 'a', $obi->{'dewey'}, $biblioitem->{'dewey'});
2509     }
2510     if ($biblioitem->{'subclass'} ne $obi->{'subclass'}) {
2511         logchange('kohadb', 'change', 'biblioitems', 'subclass', $obi->{'subclass'}, $biblioitem->{'subclass'});
2512         my $q_subclass=$dbh->quote($biblioitem->{'subclass'});
2513         my $sth=$dbh->prepare("update biblioitems set subclass=$q_subclass where biblioitemnumber=$biblioitemnumber");
2514         logchange('marc', 'change', $Record_ID, '090', 'b', $obi->{'subclass'}, $biblioitem->{'subclass'});
2515         changeSubfield($Record_ID, '090', 'b', $obi->{'subclass'}, $biblioitem->{'subclass'});
2516     }
2517     if ($biblioitem->{'place'} ne $obi->{'place'}) {
2518         logchange('kohadb', 'change', 'biblioitems', 'place', $obi->{'place'}, $biblioitem->{'place'});
2519         my $q_place=$dbh->quote($biblioitem->{'place'});
2520         my $sth=$dbh->prepare("update biblioitems set place=$q_place where biblioitemnumber=$biblioitemnumber");
2521         logchange('marc', 'change', $Record_ID, '260', 'a', $obi->{'place'}, $biblioitem->{'place'});
2522         changeSubfield($Record_ID, '260', 'a', $obi->{'place'}, $biblioitem->{'place'});
2523     }
2524     if ($biblioitem->{'publishercode'} ne $obi->{'publishercode'}) {
2525         logchange('kohadb', 'change', 'biblioitems', 'publishercode', $obi->{'publishercode'}, $biblioitem->{'publishercode'});
2526         my $q_publishercode=$dbh->quote($biblioitem->{'publishercode'});
2527         my $sth=$dbh->prepare("update biblioitems set publishercode=$q_publishercode where biblioitemnumber=$biblioitemnumber");
2528         logchange('marc', 'change', $Record_ID, '260', 'b', $obi->{'publishercode'}, $biblioitem->{'publishercode'});
2529         changeSubfield($Record_ID, '260', 'b', $obi->{'publishercode'}, $biblioitem->{'publishercode'});
2530     }
2531     if ($biblioitem->{'publicationyear'} ne $obi->{'publicationyear'}) {
2532         logchange('kohadb', 'change', 'biblioitems', 'publicationyear', $obi->{'publicationyear'}, $biblioitem->{'publicationyear'});
2533         my $q_publicationyear=$dbh->quote($biblioitem->{'publicationyear'});
2534         my $sth=$dbh->prepare("update biblioitems set publicationyear=$q_publicationyear where biblioitemnumber=$biblioitemnumber");
2535         logchange('marc', 'change', $Record_ID, '260', 'c', $obi->{'publicationyear'}, $biblioitem->{'publicationyear'});
2536         changeSubfield($Record_ID, '260', 'c', $obi->{'publicationyear'}, $biblioitem->{'publicationyear'});
2537     }
2538     if ($biblioitem->{'illus'} ne $obi->{'illus'}) {
2539         logchange('kohadb', 'change', 'biblioitems', 'illus', $obi->{'illus'}, $biblioitem->{'illus'});
2540         my $q_illus=$dbh->quote($biblioitem->{'illus'});
2541         my $sth=$dbh->prepare("update biblioitems set illus=$q_illus where biblioitemnumber=$biblioitemnumber");
2542         logchange('marc', 'change', $Record_ID, '700', 'a', $obi->{'illus'}, $biblioitem->{'illus'});
2543         changeSubfield($Record_ID, '700', 'a', $obi->{'illus'}, $biblioitem->{'illus'});
2544     }
2545     if ($biblioitem->{'pages'} ne $obi->{'pages'}) {
2546         logchange('kohadb', 'change', 'biblioitems', 'pages', $obi->{'pages'}, $biblioitem->{'pages'});
2547         my $q_pages=$dbh->quote($biblioitem->{'pages'});
2548         my $sth=$dbh->prepare("update biblioitems set pages=$q_pages where biblioitemnumber=$biblioitemnumber");
2549         logchange('marc', 'change', $Record_ID, '300', 'a', $obi->{'pages'}, $biblioitem->{'pages'});
2550         changeSubfield($Record_ID, '300', 'a', $obi->{'pages'}, $biblioitem->{'pages'});
2551     }
2552     if ($biblioitem->{'size'} ne $obi->{'size'}) {
2553         logchange('kohadb', 'change', 'biblioitems', 'size', $obi->{'size'}, $biblioitem->{'size'});
2554         my $q_size=$dbh->quote($biblioitem->{'size'});
2555         my $sth=$dbh->prepare("update biblioitems set size=$q_size where biblioitemnumber=$biblioitemnumber");
2556         logchange('marc', 'change', $Record_ID, '300', 'c', $obi->{'size'}, $biblioitem->{'size'});
2557         changeSubfield($Record_ID, '300', 'c', $obi->{'size'}, $biblioitem->{'size'});
2558     }
2559     if ($biblioitem->{'notes'} ne $obi->{'notes'}) {
2560         logchange('kohadb', 'change', 'biblioitems', 'notes', $obi->{'notes'}, $biblioitem->{'notes'});
2561         my $q_notes=$dbh->quote($biblioitem->{'notes'});
2562         my $sth=$dbh->prepare("update biblioitems set notes=$q_notes where biblioitemnumber=$biblioitemnumber");
2563         logchange('marc', 'change', $Record_ID, '500', 'a', $obi->{'notes'}, $biblioitem->{'notes'});
2564         changeSubfield($Record_ID, '500', 'a', $obi->{'notes'}, $biblioitem->{'notes'});
2565     }
2566     if ($biblioitem->{'lccn'} ne $obi->{'lccn'}) {
2567         logchange('kohadb', 'change', 'biblioitems', 'lccn', $obi->{'lccn'}, $biblioitem->{'lccn'});
2568         my $q_lccn=$dbh->quote($biblioitem->{'lccn'});
2569         my $sth=$dbh->prepare("update biblioitems set lccn=$q_lccn where biblioitemnumber=$biblioitemnumber");
2570         logchange('marc', 'change', $Record_ID, '010', 'a', $obi->{'lccn'}, $biblioitem->{'lccn'});
2571         changeSubfield($Record_ID, '010', 'a', $obi->{'lccn'}, $biblioitem->{'lccn'});
2572     }
2573     $sth->finish;
2574     $dbh->disconnect;
2575
2576 }
2577
2578 sub OLD_MAYBE_DELETED_updateItem {
2579 # Update the item with itemnumber $item->{'itemnumber'}
2580 # This routine should also modify the corresponding MARC record data. (852 and
2581 # 876 tags with 876p tag the same as $item->{'barcode'}
2582 #
2583 # This routine should also check to see which fields are actually being
2584 # modified, and log all changes.
2585
2586     my ($env, $item) = @_;
2587     my $dbh=&C4Connect;  
2588     my $itemnumber=$item->{'itemnumber'};
2589     my $biblionumber=$item->{'biblionumber'};
2590     my $biblioitemnumber=$item->{'biblioitemnumber'};
2591     my $barcode=$item->{'barcode'};
2592     my $dateaccessioned=$item->{'dateaccessioned'};
2593     my $booksellerid=$item->{'booksellerid'};
2594     my $homebranch=$item->{'homebranch'};
2595     my $price=$item->{'price'};
2596     my $replacementprice=$item->{'replacementprice'};
2597     my $replacementpricedate=$item->{'replacementpricedate'};
2598     my $multivolume=$item->{'multivolume'};
2599     my $stack=$item->{'stack'};
2600     my $notforloan=$item->{'notforloan'};
2601     my $itemlost=$item->{'itemlost'};
2602     my $wthdrawn=$item->{'wthdrawn'};
2603     my $bulk=$item->{'bulk'};
2604     my $restricted=$item->{'restricted'};
2605     my $binding=$item->{'binding'};
2606     my $itemnotes=$item->{'itemnotes'};
2607     my $holdingbranch=$item->{'holdingbranch'};
2608     my $interim=$item->{'interim'};
2609     my $sth=$dbh->prepare("select * from items where itemnumber=$itemnumber");
2610     $sth->execute;
2611     my $olditem=$sth->fetchrow_hashref;
2612     my $q_barcode=$dbh->quote($olditem->{'barcode'});
2613     $sth=$dbh->prepare("select S.Subfield_ID, B.Record_ID from 8XX_Subfield_Table S, 8XX_Tag_Table T, Bib_Table B where B.Tag_8XX_ID=T.Tag_ID and T.Subfield_ID=S.Subfield_ID and Subfield_Mark='p' and Subfield_Value=$q_barcode");
2614     $sth->execute;
2615     my ($Subfield876_ID, $Record_ID) = $sth->fetchrow;
2616     $sth=$dbh->prepare("select Subfield_Value from 8XX_Subfield_Table where Subfield_Mark=8 and Subfield_ID=$Subfield876_ID");
2617     $sth->execute;
2618     my ($link) = $sth->fetchrow;
2619     $sth=$dbh->prepare("select Subfield_ID from 8XX_Subfield_Table where Subfield_Mark=8 and Subfield_Value=$link and !(Subfield_ID=$Subfield876_ID)");
2620     $sth->execute;
2621     my ($Subfield852_ID) = $sth->fetchrow;
2622     
2623     if ($item->{'barcode'} ne $olditem->{'barcode'}) {
2624         logchange('kohadb', 'change', 'items', 'barcode', $olditem->{'barcode'}, $item->{'barcode'});
2625         my $q_barcode=$dbh->quote($item->{'barcode'});
2626         my $sth=$dbh->prepare("update items set barcode=$q_barcode where itemnumber=$itemnumber");
2627         $sth->execute;
2628         my ($Subfield_ID, $Subfield_Key) = changeSubfield($Record_ID, '876', 'p', $olditem->{'barcode'}, $item->{'barcode'}, $Subfield876_ID);
2629         logchange('marc', 'change', $Record_ID, '876', 'p', $Subfield_Key, $olditem->{'barcode'}, $item->{'barcode'});
2630     }
2631     if ($item->{'booksellerid'} ne $olditem->{'booksellerid'}) {
2632         logchange('kohadb', 'change', 'items', 'booksellerid', $olditem->{'booksellerid'}, $item->{'booksellerid'});
2633         my $q_booksellerid=$dbh->quote($item->{'booksellerid'});
2634         my $sth=$dbh->prepare("update items set booksellerid=$q_booksellerid where itemnumber=$itemnumber");
2635         $sth->execute;
2636         my ($Subfield_ID, $Subfield_Key) = changeSubfield($Record_ID, '876', 'e', $olditem->{'booksellerid'}, $item->{'booksellerid'}, $Subfield876_ID);
2637         logchange('marc', 'change', $Record_ID, '876', 'e', $Subfield_Key, $olditem->{'booksellerid'}, $item->{'booksellerid'});
2638     }
2639     if ($item->{'dateaccessioned'} ne $olditem->{'dateaccessioned'}) {
2640         logchange('kohadb', 'change', 'items', 'dateaccessioned', $olditem->{'dateaccessioned'}, $item->{'dateaccessioned'});
2641         my $q_dateaccessioned=$dbh->quote($item->{'dateaccessioned'});
2642         my $sth=$dbh->prepare("update items set dateaccessioned=$q_dateaccessioned where itemnumber=$itemnumber");
2643         $sth->execute;
2644         my ($Subfield_ID, $Subfield_Key) = changeSubfield($Record_ID, '876', 'd', $olditem->{'dateaccessioned'}, $item->{'dateaccessioned'}, $Subfield876_ID);
2645         logchange('marc', 'change', $Record_ID, '876', 'd', $Subfield_Key, $olditem->{'dateaccessioned'}, $item->{'dateaccessioned'});
2646     }
2647     if ($item->{'homebranch'} ne $olditem->{'homebranch'}) {
2648         logchange('kohadb', 'change', 'items', 'homebranch', $olditem->{'homebranch'}, $item->{'homebranch'});
2649         my $q_homebranch=$dbh->quote($item->{'homebranch'});
2650         my $sth=$dbh->prepare("update items set homebranch=$q_homebranch where itemnumber=$itemnumber");
2651         $sth->execute;
2652         my ($Subfield_ID, $Subfield_Key) = changeSubfield($Record_ID, '876', 'b', $olditem->{'homebranch'}, $item->{'homebranch'}, $Subfield876_ID);
2653         logchange('marc', 'change', $Record_ID, '876', 'b', $Subfield_Key, $olditem->{'homebranch'}, $item->{'homebranch'});
2654     }
2655     if ($item->{'holdingbranch'} ne $olditem->{'holdingbranch'}) {
2656         logchange('kohadb', 'change', 'items', 'holdingbranch', $olditem->{'holdingbranch'}, $item->{'holdingbranch'});
2657         my $q_holdingbranch=$dbh->quote($item->{'holdingbranch'});
2658         my $sth=$dbh->prepare("update items set holdingbranch=$q_holdingbranch where itemnumber=$itemnumber");
2659         $sth->execute;
2660         my ($Subfield_ID, $Subfield_Key) = changeSubfield($Record_ID, '876', 'l', $olditem->{'holdingbranch'}, $item->{'holdingbranch'}, $Subfield876_ID);
2661         logchange('marc', 'change', $Record_ID, '876', 'l', $Subfield_Key, $olditem->{'holdingbranch'}, $item->{'holdingbranch'});
2662     }
2663     if ($item->{'price'} ne $olditem->{'price'}) {
2664         logchange('kohadb', 'change', 'items', 'price', $olditem->{'price'}, $item->{'price'});
2665         my $q_price=$dbh->quote($item->{'price'});
2666         my $sth=$dbh->prepare("update items set price=$q_price where itemnumber=$itemnumber");
2667         $sth->execute;
2668         my ($Subfield_ID, $Subfield_Key) = changeSubfield($Record_ID, '876', 'c', $olditem->{'price'}, $item->{'price'}, $Subfield876_ID);
2669         logchange('marc', 'change', $Record_ID, '876', 'c', $Subfield_Key, $olditem->{'price'}, $item->{'price'});
2670     }
2671     if ($item->{'itemnotes'} ne $olditem->{'itemnotes'}) {
2672         logchange('kohadb', 'change', 'items', 'itemnotes', $olditem->{'itemnotes'}, $item->{'itemnotes'});
2673         my $q_itemnotes=$dbh->quote($item->{'itemnotes'});
2674         my $sth=$dbh->prepare("update items set itemnotes=$q_itemnotes where itemnumber=$itemnumber");
2675         $sth->execute;
2676         my ($Subfield_ID, $Subfield_Key) = changeSubfield($Record_ID, '876', 'c', $olditem->{'itemnotes'}, $item->{'itemnotes'}, $Subfield876_ID);
2677         logchange('marc', 'change', $Record_ID, '876', 'c', $Subfield_Key, $olditem->{'itemnotes'}, $item->{'itemnotes'});
2678     }
2679     if ($item->{'notforloan'} ne $olditem->{'notforloan'}) {
2680         logchange('kohadb', 'change', 'items', 'notforloan', $olditem->{'notforloan'}, $item->{'notforloan'});
2681         my $sth=$dbh->prepare("update items set notforloan=$notforloan where itemnumber=$itemnumber");
2682         $sth->execute;
2683         if ($item->{'notforloan'}) {
2684             my ($Subfield_ID, $Subfield_Key) = addSubfield($Record_ID, '876', 'h', 'Not for loan', $Subfield876_ID);
2685             logchange('marc', 'add', $Record_ID, '876', 'h', $Subfield_Key, 'Not for loan');
2686         } else {
2687             my ($Subfield_ID, $Subfield_Key) = deleteSubfield($Record_ID, '876', 'h', 'Not for loan', $Subfield876_ID);
2688             logchange('marc', 'delete', $Record_ID, '876', 'h', $Subfield_Key, 'Not for loan');
2689         }
2690     }
2691     if ($item->{'itemlost'} ne $olditem->{'itemlost'}) {
2692         logchange('kohadb', 'change', 'items', 'itemlost', $olditem->{'itemlost'}, $item->{'itemlost'});
2693         my $sth=$dbh->prepare("update items set itemlost=$itemlost where itemnumber=$itemnumber");
2694         $sth->execute;
2695         if ($item->{'itemlost'}) {
2696             my ($Subfield_ID, $Subfield_Key) = addSubfield($Record_ID, '876', 'h', 'Item lost', $Subfield876_ID);
2697             logchange('marc', 'add', $Record_ID, '876', 'h', $Subfield_Key, 'Item lost');
2698         } else {
2699             my ($Subfield_ID, $Subfield_Key) = deleteSubfield($Record_ID, '876', 'h', 'Item lost', $Subfield876_ID);
2700             logchange('marc', 'delete', $Record_ID, '876', 'h', $Subfield_Key, 'Item lost');
2701         }
2702     }
2703     if ($item->{'wthdrawn'} ne $olditem->{'wthdrawn'}) {
2704         logchange('kohadb', 'change', 'items', 'wthdrawn', $olditem->{'wthdrawn'}, $item->{'wthdrawn'});
2705         my $sth=$dbh->prepare("update items set wthdrawn=$wthdrawn where itemnumber=$itemnumber");
2706         $sth->execute;
2707         if ($item->{'wthdrawn'}) {
2708             my ($Subfield_ID, $Subfield_Key) = addSubfield($Record_ID, '876', 'h', 'Withdrawn', $Subfield876_ID);
2709             logchange('marc', 'add', $Record_ID, '876', 'h', $Subfield_Key, 'Withdrawn');
2710         } else {
2711             my ($Subfield_ID, $Subfield_Key) = deleteSubfield($Record_ID, '876', 'h', 'Withdrawn', $Subfield876_ID);
2712             logchange('marc', 'delete', $Record_ID, '876', 'h', $Subfield_Key, 'Withdrawn');
2713         }
2714     }
2715     if ($item->{'restricted'} ne $olditem->{'restricted'}) {
2716         logchange('kohadb', 'change', 'items', 'restricted', $olditem->{'restricted'}, $item->{'restricted'});
2717         my $sth=$dbh->prepare("update items set restricted=$restricted where itemnumber=$itemnumber");
2718         $sth->execute;
2719         if ($item->{'restricted'}) {
2720             my ($Subfield_ID, $Subfield_Key) = addSubfield($Record_ID, '876', 'h', 'Restricted', $Subfield876_ID);
2721             logchange('marc', 'add', $Record_ID, '876', 'h', $Subfield_Key, 'Restricted');
2722         } else {
2723             my ($Subfield_ID, $Subfield_Key) = deleteSubfield($Record_ID, '876', 'h', 'Restricted', $Subfield876_ID);
2724             logchange('marc', 'delete', $Record_ID, '876', 'h', $Subfield_Key, 'Restricted');
2725         }
2726     }
2727     $sth->finish;
2728     $dbh->disconnect;
2729 }
2730
2731 # Add a biblioitem and related data to Koha database
2732 sub OLD_MAY_BE_DELETED_newcompletebiblioitem {
2733         use strict;
2734
2735         my (
2736           $dbh,                 # DBI handle
2737           $biblio,              # hash ref to biblio record
2738           $biblioitem,          # hash ref to biblioitem record
2739           $subjects,            # list ref of subjects
2740           $addlauthors,         # list ref of additional authors
2741         )=@_ ;
2742
2743         my ( $biblionumber, $biblioitemnumber, $error);         # return values
2744
2745         my $debug=0;
2746         my $sth;
2747         my $subjectheading;
2748         my $additionalauthor;
2749
2750         #--------
2751         requireDBI($dbh,"newcompletebiblioitem");
2752
2753         print "<PRE>Trying to add biblio item Title=$biblio->{title} " .
2754                 "ISBN=$biblioitem->{isbn} </PRE>\n" if $debug;
2755
2756         # Make sure master biblio entry exists
2757         ($biblionumber,$error)=getoraddbiblio($dbh, $biblio);
2758
2759         if ( ! $error ) {
2760
2761           $biblioitem->{biblionumber}=$biblionumber;
2762
2763           # Add biblioitem
2764           $biblioitemnumber=newbiblioitem($biblioitem);
2765
2766           # Add subjects
2767           $sth=$dbh->prepare("insert into bibliosubject
2768                 (biblionumber,subject)
2769                 values (?, ? )" );
2770           foreach $subjectheading (@{$subjects} ) {
2771               $sth->execute($biblionumber, $subjectheading)
2772                         or $error.=$sth->errstr ;
2773
2774           } # foreach subject
2775
2776           # Add additional authors
2777           $sth=$dbh->prepare("insert into additionalauthors
2778                 (biblionumber,author)
2779                 values (?, ? )");
2780           foreach $additionalauthor (@{$addlauthors} ) {
2781             $sth->execute($biblionumber, $additionalauthor)
2782                         or $error.=$sth->errstr ;
2783           } # foreach author
2784
2785         } else {
2786           # couldn't get biblio
2787           $biblionumber='';
2788           $biblioitemnumber='';
2789
2790         } # if no biblio error
2791
2792         return ( $biblionumber, $biblioitemnumber, $error);
2793
2794 } # sub newcompletebiblioitem
2795
2796 #
2797 #
2798 # END OF UNUSEFUL SUBs
2799 #
2800 #
2801
2802 END { }       # module clean-up code here (global destructor)