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