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