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