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