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