-=over 4
-
-create a biblioitem, the parameter is a hash
-
-=back
-
-=cut
-
-sub newbiblioitem {
- my ($biblioitem) = @_;
- my $dbh = C4::Context->dbh;
- # add biblio information to the hash
- my $MARCbiblio = MARCkoha2marcBiblio( $dbh, $biblioitem );
- $biblioitem->{marc} = $MARCbiblio->as_usmarc();
- my $bibitemnum = &REALnewbiblioitem( $dbh, $biblioitem );
- return ($bibitemnum);
-}
-
-=head2 newsubtitle($biblionumber,$subtitle);
-
-=over 4
-
-insert a subtitle for $biblionumber biblio
-
-=back
-
-=cut
-
-
-sub newsubtitle {
- my ( $bibnum, $subtitle ) = @_;
- my $dbh = C4::Context->dbh;
- &REALnewsubtitle( $dbh, $bibnum, $subtitle );
-}
-
-=head2 newitems
-
-$errors = newitems($dbh, $item, @barcodes);
-
-=over 4
-
-insert items ($item is a hash)
-
-=back
-
-=cut
-
-
-sub newitems {
- my ( $dbh, $item, @barcodes ) = @_;
- #my $dbh = C4::Context->dbh;
- my $errors;
- my $itemnumber;
- my $error;
- foreach my $barcode (@barcodes) {
- # add items, one by one for each barcode.
- my $oneitem=$item;
- $oneitem->{barcode}= $barcode;
- my $MARCitem = &MARCkoha2marcItem( $dbh, $oneitem);
- $oneitem->{marc} = $MARCitem->as_usmarc;
- ( $itemnumber, $error ) = &REALnewitems( $dbh, $oneitem);
-# $errors .= $error;
-# &MARCadditem( $dbh, $MARCitem, $item->{biblionumber} );
- }
- return ($errors);
-}
-
-=head2 moditem($dbh,$item);
-
-=over 4
-
-modify an item ($item is a hash with all item informations)
-
-=back
-
-=cut
-
-
-sub moditem {
- my ($dbh, $item) = @_;
- #my $dbh = C4::Context->dbh;
- &REALmoditem( $dbh, $item );
- my $MARCitem =
- &MARCkoha2marcItem( $dbh, $item->{'biblionumber'}, $item->{'itemnum'} );
- my $bibid =
- &MARCfind_MARCbibid_from_oldbiblionumber( $dbh, $item->{biblionumber} );
- &MARCmoditem( $dbh, $MARCitem, $bibid, $item->{itemnum}, 0 );
-}
-
-=head2 checkitems
-
-$error = checkitems($count,@barcodes);
-
-=over 4
-
-check for each @barcode entry that the barcode is not a duplicate
-
-=back
-
-=cut
-
-sub checkitems {
- my ( $count, @barcodes ) = @_;
- my $dbh = C4::Context->dbh;
- my $error;
- my $sth = $dbh->prepare("Select * from items where barcode=?");
- for ( my $i = 0 ; $i < $count ; $i++ ) {
- $barcodes[$i] = uc $barcodes[$i];
- $sth->execute( $barcodes[$i] );
- if ( my $data = $sth->fetchrow_hashref ) {
- $error .= " Duplicate Barcode: $barcodes[$i]";
- }
- }
- $sth->finish;
- return ($error);
-}
-
-=head2 delitem($itemnum);
-
-=over 4
-
-delete item $itemnum being the item number to delete
-
-=back
-
-=cut
-
-sub delitem {
- my ($itemnum) = @_;
- my $dbh = C4::Context->dbh;
- &REALdelitem( $dbh, $itemnum );
-}
-
-=head2 deletebiblioitem($biblioitemnumber);
-
-=over 4
-
-delete the biblioitem $biblioitemnumber
-
-=back
-
-=cut
-
-sub deletebiblioitem {
- my ($biblioitemnumber) = @_;
- my $dbh = C4::Context->dbh;
- &REALdelbiblioitem( $dbh, $biblioitemnumber );
-} # sub deletebiblioitem
-
-=head2 delbiblio($biblionumber)
-
-=over 4
-
-delete biblio $biblionumber
-
-=back
-
-=cut
-
-sub delbiblio {
- my ($biblio) = @_;
- my $dbh = C4::Context->dbh;
- &REALdelbiblio( $dbh, $biblio );
- my $bibid = &MARCfind_MARCbibid_from_oldbiblionumber( $dbh, $biblio );
- &MARCdelbiblio( $dbh, $bibid, 0 );
-}
-
-=head2 getbiblio
-
-($count,@results) = getbiblio($biblionumber);
-
-=over 4
-
-return an array with hash of biblios.
-
-FIXME : biblionumber being the primary key, this sub will always return only 1 result, API should be modified...
-
-=back
-
-=cut
-
-sub getbiblio {
- my ($biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select * from biblio where biblionumber = ?");
-
- # || die "Cannot prepare $query\n" . $dbh->errstr;
- my $count = 0;
- my @results;
-
- $sth->execute($biblionumber);
-
- # || die "Cannot execute $query\n" . $sth->errstr;
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return ( $count, @results );
-} # sub getbiblio
-
-=head2 bibdata
-
- $data = &bibdata($biblionumber, $type);
-
-Returns information about the book with the given biblionumber.
-
-C<$type> is ignored.
-
-C<&bibdata> returns a reference-to-hash. The keys are the fields in
-the C<biblio>, C<biblioitems>, and C<bibliosubtitle> tables in the
-Koha database.
-
-In addition, C<$data-E<gt>{subject}> is the list of the book's
-subjects, separated by C<" , "> (space, comma, space).
-
-If there are multiple biblioitems with the given biblionumber, only
-the first one is considered.
-
-=cut
-#'
-sub bibdata {
- my ($bibnum, $type) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select *, biblioitems.notes AS bnotes, biblio.notes
- from biblio
- left join biblioitems on biblioitems.biblionumber = biblio.biblionumber
- left join bibliosubtitle on
- biblio.biblionumber = bibliosubtitle.biblionumber
- left join itemtypes on biblioitems.itemtype=itemtypes.itemtype
- where biblio.biblionumber = ?
- ");
- $sth->execute($bibnum);
- my $data;
- $data = $sth->fetchrow_hashref;
- $sth->finish;
- # handle management of repeated subtitle
- $sth = $dbh->prepare("Select * from bibliosubtitle where biblionumber = ?");
- $sth->execute($bibnum);
- my @subtitles;
- while (my $dat = $sth->fetchrow_hashref){
- my %line;
- $line{subtitle} = $dat->{subtitle};
- push @subtitles, \%line;
- } # while
- $data->{subtitles} = \@subtitles;
- $sth->finish;
- $sth = $dbh->prepare("Select * from bibliosubject where biblionumber = ?");
- $sth->execute($bibnum);
- my @subjects;
- while (my $dat = $sth->fetchrow_hashref){
- my %line;
- $line{subject} = $dat->{'subject'};
- push @subjects, \%line;
- } # while
- $data->{subjects} = \@subjects;
- $sth->finish;
- $sth = $dbh->prepare("Select * from additionalauthors where biblionumber = ?");
- $sth->execute($bibnum);
- while (my $dat = $sth->fetchrow_hashref){
- $data->{'additionalauthors'} .= "$dat->{'author'} - ";
- } # while
- chop $data->{'additionalauthors'};
- chop $data->{'additionalauthors'};
- chop $data->{'additionalauthors'};
- $sth->finish;
- return($data);
-} # sub bibdata
-
-=head2 getbiblioitem
-
-($count,@results) = getbiblioitem($biblioitemnumber);
-
-=over 4
-
-return an array with hash of biblioitemss.
-
-FIXME : biblioitemnumber being unique, this sub will always return only 1 result, API should be modified...
-
-=back
-
-=cut
-
-sub getbiblioitem {
- my ($biblioitemnum) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "Select * from biblioitems where
-biblioitemnumber = ?"
- );
- my $count = 0;
- my @results;
-
- $sth->execute($biblioitemnum);
-
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return ( $count, @results );
-} # sub getbiblioitem
-
-=head2 getbiblioitembybiblionumber
-
-($count,@results) = getbiblioitembybiblionumber($biblionumber);
-
-=over 4
-
-return an array with hash of biblioitems for the given biblionumber.
-
-=back
-
-=cut
-
-sub getbiblioitembybiblionumber {
- my ($biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select * from biblioitems where biblionumber = ?");
- my $count = 0;
- my @results;
-
- $sth->execute($biblionumber);
-
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return ( $count, @results );
-} # sub
-
-=head2 getitemsbybiblioitem
-
-($count,@results) = getitemsbybiblioitem($biblionumber);
-
-=over 4
-
-returns an array with hash of items
-
-=back
-
-=cut
-
-sub getitemsbybiblioitem {
- my ($biblioitemnum) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare( "Select * from items, biblio where
-biblio.biblionumber = items.biblionumber and biblioitemnumber
-= ?"
- );
-
- # || die "Cannot prepare $query\n" . $dbh->errstr;
- my $count = 0;
- my @results;
-
- $sth->execute($biblioitemnum);
-
- # || die "Cannot execute $query\n" . $sth->errstr;
- while ( my $data = $sth->fetchrow_hashref ) {
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return ( $count, @results );
-} # sub getitemsbybiblioitem
-
-=head2 ItemInfo
-
- @results = &ItemInfo($env, $biblionumber, $type);
-
-Returns information about books with the given biblionumber.
-
-C<$type> may be either C<intra> or anything else. If it is not set to
-C<intra>, then the search will exclude lost, very overdue, and
-withdrawn items.
-
-C<$env> is ignored.
-
-C<&ItemInfo> returns a list of references-to-hash. Each element
-contains a number of keys. Most of them are table items from the
-C<biblio>, C<biblioitems>, C<items>, and C<itemtypes> tables in the
-Koha database. Other keys include:
-
-=over 4
-
-=item C<$data-E<gt>{branchname}>
-
-The name (not the code) of the branch to which the book belongs.
-
-=item C<$data-E<gt>{datelastseen}>
-
-This is simply C<items.datelastseen>, except that while the date is
-stored in YYYY-MM-DD format in the database, here it is converted to
-DD/MM/YYYY format. A NULL date is returned as C<//>.
-
-=item C<$data-E<gt>{datedue}>
-
-=item C<$data-E<gt>{class}>
-
-This is the concatenation of C<biblioitems.classification>, the book's
-Dewey code, and C<biblioitems.subclass>.
-
-=item C<$data-E<gt>{ocount}>
-
-I think this is the number of copies of the book available.
-
-=item C<$data-E<gt>{order}>
-
-If this is set, it is set to C<One Order>.
-
-=back
-
-=cut
-#'
-sub ItemInfo {
- my ($env,$biblionumber,$type) = @_;
- my $dbh = C4::Context->dbh;
- my $query = "SELECT *,items.notforloan as itemnotforloan FROM items, biblio, biblioitems
- left join itemtypes on biblioitems.itemtype = itemtypes.itemtype
- WHERE items.biblionumber = ?
- AND biblioitems.biblioitemnumber = items.biblioitemnumber
- AND biblio.biblionumber = items.biblionumber";
- $query .= " order by items.dateaccessioned desc";
- my $sth=$dbh->prepare($query);
- $sth->execute($biblionumber);
- my $i=0;
- my @results;
- while (my $data=$sth->fetchrow_hashref){
- my $datedue = '';
- my $isth=$dbh->prepare("Select issues.*,borrowers.cardnumber from issues,borrowers where itemnumber = ? and returndate is null and issues.borrowernumber=borrowers.borrowernumber");
- $isth->execute($data->{'itemnumber'});
- if (my $idata=$isth->fetchrow_hashref){
- $data->{borrowernumber} = $idata->{borrowernumber};
- $data->{cardnumber} = $idata->{cardnumber};
- $datedue = format_date($idata->{'date_due'});
- }
- if ($datedue eq ''){
- my ($restype,$reserves)=C4::Reserves2::CheckReserves($data->{'itemnumber'});
- if ($restype) {
- $datedue=$restype;
- }
- }
- $isth->finish;
- #get branch information.....
- my $bsth=$dbh->prepare("SELECT * FROM branches WHERE branchcode = ?");
- $bsth->execute($data->{'holdingbranch'});
- if (my $bdata=$bsth->fetchrow_hashref){
- $data->{'branchname'} = $bdata->{'branchname'};
- }
- my $date=format_date($data->{'datelastseen'});
- $data->{'datelastseen'}=$date;
- $data->{'datedue'}=$datedue;
- # get notforloan complete status if applicable
- my $sthnflstatus = $dbh->prepare('select authorised_value from marc_subfield_structure where kohafield="items.notforloan"');
- $sthnflstatus->execute;
- my ($authorised_valuecode) = $sthnflstatus->fetchrow;
- if ($authorised_valuecode) {
- $sthnflstatus = $dbh->prepare("select lib from authorised_values where category=? and authorised_value=?");
- $sthnflstatus->execute($authorised_valuecode,$data->{itemnotforloan});
- my ($lib) = $sthnflstatus->fetchrow;
- $data->{notforloan} = $lib;
- }
- $results[$i]=$data;
- $i++;
- }
- $sth->finish;
- return(@results);
-}
-
-=head2 bibitems
-
- ($count, @results) = &bibitems($biblionumber);
-
-Given the biblionumber for a book, C<&bibitems> looks up that book's
-biblioitems (different publications of the same book, the audio book
-and film versions, etc.).
-
-C<$count> is the number of elements in C<@results>.
-
-C<@results> is an array of references-to-hash; the keys are the fields
-of the C<biblioitems> and C<itemtypes> tables of the Koha database. In
-addition, C<itemlost> indicates the availability of the item: if it is
-"2", then all copies of the item are long overdue; if it is "1", then
-all copies are lost; otherwise, there is at least one copy available.
-
-=cut
-#'
-sub bibitems {
- my ($bibnum) = @_;
-
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("SELECT biblioitems.*,
- itemtypes.*,
- MIN(items.itemlost) as itemlost,
- MIN(items.dateaccessioned) as dateaccessioned
- FROM biblioitems, itemtypes, items
- WHERE biblioitems.biblionumber = ?
- AND biblioitems.itemtype = itemtypes.itemtype
- AND biblioitems.biblioitemnumber = items.biblioitemnumber
- GROUP BY items.biblioitemnumber");
- my $count = 0;
- my @results;
- $sth->execute($bibnum);
- while (my $data = $sth->fetchrow_hashref) {
- $results[$count] = $data;
- $count++;
- } # while
- $sth->finish;
- return($count, @results);
-} # sub bibitems
-
-
-=head2 bibitemdata
-
- $itemdata = &bibitemdata($biblioitemnumber);
-
-Looks up the biblioitem with the given biblioitemnumber. Returns a
-reference-to-hash. The keys are the fields from the C<biblio>,
-C<biblioitems>, and C<itemtypes> tables in the Koha database, except
-that C<biblioitems.notes> is given as C<$itemdata-E<gt>{bnotes}>.
-
-=cut
-#'
-sub bibitemdata {
- my ($bibitem) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select *,biblioitems.notes as bnotes from biblio, biblioitems,itemtypes where biblio.biblionumber = biblioitems.biblionumber and biblioitemnumber = ? and biblioitems.itemtype = itemtypes.itemtype");
- my $data;
-
- $sth->execute($bibitem);
-
- $data = $sth->fetchrow_hashref;
-
- $sth->finish;
- return($data);
-} # sub bibitemdata
-
-
-=head2 getbibliofromitemnumber
-
- $item = &getbibliofromitemnumber($env, $dbh, $itemnumber);
-
-Looks up the item with the given itemnumber.
-
-C<$env> and C<$dbh> are ignored.
-
-C<&itemnodata> returns a reference-to-hash whose keys are the fields
-from the C<biblio>, C<biblioitems>, and C<items> tables in the Koha
-database.
-
-=cut
-#'
-sub getbibliofromitemnumber {
- my ($env,$dbh,$itemnumber) = @_;
- $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from biblio,items,biblioitems
- where items.itemnumber = ?
- and biblio.biblionumber = items.biblionumber
- and biblioitems.biblioitemnumber = items.biblioitemnumber");
-# print $query;
- $sth->execute($itemnumber);
- my $data=$sth->fetchrow_hashref;
- $sth->finish;
- return($data);
-}
-
-=head2 barcodes
-
- @barcodes = &barcodes($biblioitemnumber);
-
-Given a biblioitemnumber, looks up the corresponding items.
-
-Returns an array of references-to-hash; the keys are C<barcode> and
-C<itemlost>.
-
-The returned items include very overdue items, but not lost ones.
-
-=cut
-#'
-sub barcodes{
- #called from request.pl
- my ($biblioitemnumber)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("SELECT barcode, itemlost, holdingbranch FROM items
- WHERE biblioitemnumber = ?
- AND (wthdrawn <> 1 OR wthdrawn IS NULL)");
- $sth->execute($biblioitemnumber);
- my @barcodes;
- my $i=0;
- while (my $data=$sth->fetchrow_hashref){
- $barcodes[$i]=$data;
- $i++;
- }
- $sth->finish;
- return(@barcodes);
-}
-
-
-=head2 itemdata
-
- $item = &itemdata($barcode);
-
-Looks up the item with the given barcode, and returns a
-reference-to-hash containing information about that item. The keys of
-the hash are the fields from the C<items> and C<biblioitems> tables in
-the Koha database.
-
-=cut
-#'
-sub get_item_from_barcode {
- my ($barcode)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from items,biblioitems where barcode=?
- and items.biblioitemnumber=biblioitems.biblioitemnumber");
- $sth->execute($barcode);
- my $data=$sth->fetchrow_hashref;
- $sth->finish;
- return($data);
-}
-
-
-=head2 itemissues
-
- @issues = &itemissues($biblioitemnumber, $biblio);
-
-Looks up information about who has borrowed the bookZ<>(s) with the
-given biblioitemnumber.
-
-C<$biblio> is ignored.
-
-C<&itemissues> returns an array of references-to-hash. The keys
-include the fields from the C<items> table in the Koha database.
-Additional keys include:
-
-=over 4
-
-=item C<date_due>
-
-If the item is currently on loan, this gives the due date.
-
-If the item is not on loan, then this is either "Available" or
-"Cancelled", if the item has been withdrawn.
-
-=item C<card>
-
-If the item is currently on loan, this gives the card number of the
-patron who currently has the item.
-
-=item C<timestamp0>, C<timestamp1>, C<timestamp2>
-
-These give the timestamp for the last three times the item was
-borrowed.
-
-=item C<card0>, C<card1>, C<card2>
-
-The card number of the last three patrons who borrowed this item.
-
-=item C<borrower0>, C<borrower1>, C<borrower2>
-
-The borrower number of the last three patrons who borrowed this item.
-
-=back
-
-=cut
-#'
-sub itemissues {
- my ($bibitem, $biblio)=@_;
- my $dbh = C4::Context->dbh;
- # FIXME - If this function die()s, the script will abort, and the
- # user won't get anything; depending on how far the script has
- # gotten, the user might get a blank page. It would be much better
- # to at least print an error message. The easiest way to do this
- # is to set $SIG{__DIE__}.
- my $sth = $dbh->prepare("Select * from items where
-items.biblioitemnumber = ?")
- || die $dbh->errstr;
- my $i = 0;
- my @results;
-
- $sth->execute($bibitem)
- || die $sth->errstr;
-
- while (my $data = $sth->fetchrow_hashref) {
- # Find out who currently has this item.
- # FIXME - Wouldn't it be better to do this as a left join of
- # some sort? Currently, this code assumes that if
- # fetchrow_hashref() fails, then the book is on the shelf.
- # fetchrow_hashref() can fail for any number of reasons (e.g.,
- # database server crash), not just because no items match the
- # search criteria.
- my $sth2 = $dbh->prepare("select * from issues,borrowers
-where itemnumber = ?
-and returndate is NULL
-and issues.borrowernumber = borrowers.borrowernumber");
-
- $sth2->execute($data->{'itemnumber'});
- if (my $data2 = $sth2->fetchrow_hashref) {
- $data->{'date_due'} = $data2->{'date_due'};
- $data->{'card'} = $data2->{'cardnumber'};
- $data->{'borrower'} = $data2->{'borrowernumber'};
- } else {
- if ($data->{'wthdrawn'} eq '1') {
- $data->{'date_due'} = 'Cancelled';
- } else {
- $data->{'date_due'} = 'Available';
- } # else
- } # else
-
- $sth2->finish;
-
- # Find the last 3 people who borrowed this item.
- $sth2 = $dbh->prepare("select * from issues, borrowers
- where itemnumber = ?
- and issues.borrowernumber = borrowers.borrowernumber
- and returndate is not NULL
- order by returndate desc,timestamp desc") || die $dbh->errstr;
- $sth2->execute($data->{'itemnumber'}) || die $sth2->errstr;
- for (my $i2 = 0; $i2 < 2; $i2++) { # FIXME : error if there is less than 3 pple borrowing this item
- if (my $data2 = $sth2->fetchrow_hashref) {
- $data->{"timestamp$i2"} = $data2->{'timestamp'};
- $data->{"card$i2"} = $data2->{'cardnumber'};
- $data->{"borrower$i2"} = $data2->{'borrowernumber'};
- } # if
- } # for
-
- $sth2->finish;
- $results[$i] = $data;
- $i++;
- }
-
- $sth->finish;
- return(@results);
-}
-
-=head2 getsubject
-
- ($count, $subjects) = &getsubject($biblionumber);
-
-Looks up the subjects of the book with the given biblionumber. Returns
-a two-element list. C<$subjects> is a reference-to-array, where each
-element is a subject of the book, and C<$count> is the number of
-elements in C<$subjects>.
-
-=cut
-#'
-sub getsubject {
- my ($bibnum)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from bibliosubject where biblionumber=?");
- $sth->execute($bibnum);
- my @results;
- my $i=0;
- while (my $data=$sth->fetchrow_hashref){
- $results[$i]=$data;
- $i++;
- }
- $sth->finish;
- return($i,\@results);
-}
-
-=head2 getaddauthor
-
- ($count, $authors) = &getaddauthor($biblionumber);
-
-Looks up the additional authors for the book with the given
-biblionumber.
-
-Returns a two-element list. C<$authors> is a reference-to-array, where
-each element is an additional author, and C<$count> is the number of
-elements in C<$authors>.
-
-=cut
-#'
-sub getaddauthor {
- my ($bibnum)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from additionalauthors where biblionumber=?");
- $sth->execute($bibnum);
- my @results;
- my $i=0;
- while (my $data=$sth->fetchrow_hashref){
- $results[$i]=$data;
- $i++;
- }
- $sth->finish;
- return($i,\@results);
-}
-
-
-=head2 getsubtitle
-
- ($count, $subtitles) = &getsubtitle($biblionumber);
-
-Looks up the subtitles for the book with the given biblionumber.
-
-Returns a two-element list. C<$subtitles> is a reference-to-array,
-where each element is a subtitle, and C<$count> is the number of
-elements in C<$subtitles>.
-
-=cut
-#'
-sub getsubtitle {
- my ($bibnum)=@_;
- my $dbh = C4::Context->dbh;
- my $sth=$dbh->prepare("Select * from bibliosubtitle where biblionumber=?");
- $sth->execute($bibnum);
- my @results;
- my $i=0;
- while (my $data=$sth->fetchrow_hashref){
- $results[$i]=$data;
- $i++;
- }
- $sth->finish;
- return($i,\@results);
-}
-
-
-=head2 getwebsites
-
- ($count, @websites) = &getwebsites($biblionumber);
-
-Looks up the web sites pertaining to the book with the given
-biblionumber.
-
-C<$count> is the number of elements in C<@websites>.
-
-C<@websites> is an array of references-to-hash; the keys are the
-fields from the C<websites> table in the Koha database.
-
-=cut
-#FIXME : could maybe be deleted. Otherwise, would be better in a Websites.pm package
-#(with add / modify / delete subs)
-
-sub getwebsites {
- my ($biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select * from websites where biblionumber = ?");
- my $count = 0;
- my @results;
-
- $sth->execute($biblionumber);
- while (my $data = $sth->fetchrow_hashref) {
- # FIXME - The URL scheme shouldn't be stripped off, at least
- # not here, since it's part of the URL, and will be useful in
- # constructing a link to the site. If you don't want the user
- # to see the "http://" part, strip that off when building the
- # HTML code.
- $data->{'url'} =~ s/^http:\/\///; # FIXME - Leaning toothpick
- # syndrome
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return($count, @results);
-} # sub getwebsites
-
-=head2 getwebbiblioitems
-
- ($count, @results) = &getwebbiblioitems($biblionumber);
-
-Given a book's biblionumber, looks up the web versions of the book
-(biblioitems with itemtype C<WEB>).
-
-C<$count> is the number of items in C<@results>. C<@results> is an
-array of references-to-hash; the keys are the items from the
-C<biblioitems> table of the Koha database.
-
-=cut
-#'
-sub getwebbiblioitems {
- my ($biblionumber) = @_;
- my $dbh = C4::Context->dbh;
- my $sth = $dbh->prepare("Select * from biblioitems where biblionumber = ?
-and itemtype = 'WEB'");
- my $count = 0;
- my @results;
-
- $sth->execute($biblionumber);
- while (my $data = $sth->fetchrow_hashref) {
- $data->{'url'} =~ s/^http:\/\///;
- $results[$count] = $data;
- $count++;
- } # while
-
- $sth->finish;
- return($count, @results);
-} # sub getwebbiblioitems
-
-sub nsb_clean {
- my $NSB = '\x88'; # NSB : begin Non Sorting Block
- my $NSE = '\x89'; # NSE : Non Sorting Block end
- # handles non sorting blocks
- my ($string) = @_;
- $_ = $string;
- s/$NSB/(/gm;
- s/[ ]{0,1}$NSE/) /gm;
- $string = $_;
- return ($string);
-}
-
-sub FindDuplicate {
- my ($record)=@_;
- my $dbh = C4::Context->dbh;
- my $result = MARCmarc2koha($dbh,$record,'');
- my $sth;
- my ($biblionumber,$bibid,$title);
- # search duplicate on ISBN, easy and fast...
- if ($result->{isbn}) {
- $sth = $dbh->prepare("select biblio.biblionumber,bibid,title from biblio,biblioitems,marc_biblio where biblio.biblionumber=biblioitems.biblionumber and marc_biblio.biblionumber=biblioitems.biblionumber and isbn=?");
- $sth->execute($result->{'isbn'});
- ($biblionumber,$bibid,$title) = $sth->fetchrow;
- return $biblionumber,$bibid,$title if ($biblionumber);
- }
- # a more complex search : build a request for SearchMarc::catalogsearch()
- my (@tags, @and_or, @excluding, @operator, @value, $offset,$length);
- # search on biblio.title
- my ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblio.title","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "contains";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for title, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on biblio.author
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblio.author","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "contains";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for author, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on publicationyear.
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.publicationyear","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "=";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for publicationyear, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on size.
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.size","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "=";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for size, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on publisher.
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.publishercode","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "=";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for publishercode, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
- # ... and on volume.
- ($tag,$subfield) = MARCfind_marc_from_kohafield($dbh,"biblioitems.volume","");
- if ($record->field($tag)) {
- if ($record->field($tag)->subfields($subfield)) {
- push @tags, "'".$tag.$subfield."'";
- push @and_or, "and";
- push @excluding, "";
- push @operator, "=";
- push @value, $record->field($tag)->subfield($subfield);
-# warn "for volume, I add $tag / $subfield".$record->field($tag)->subfield($subfield);
- }
- }
-
- my ($finalresult,$nbresult) = C4::SearchMarc::catalogsearch($dbh,\@tags,\@and_or,\@excluding,\@operator,\@value,0,10);
- # there is at least 1 result => return the 1st one
- if ($nbresult) {
-# warn "$nbresult => ".@$finalresult[0]->{biblionumber},@$finalresult[0]->{bibid},@$finalresult[0]->{title};
- return @$finalresult[0]->{biblionumber},@$finalresult[0]->{bibid},@$finalresult[0]->{title};
- }
- # no result, returns nothing
- return;
-}
-
-sub DisplayISBN {
- my ($isbn)=@_;
- my $seg1;
- if(substr($isbn, 0, 1) <=7) {
- $seg1 = substr($isbn, 0, 1);
- } elsif(substr($isbn, 0, 2) <= 94) {
- $seg1 = substr($isbn, 0, 2);
- } elsif(substr($isbn, 0, 3) <= 995) {
- $seg1 = substr($isbn, 0, 3);
- } elsif(substr($isbn, 0, 4) <= 9989) {
- $seg1 = substr($isbn, 0, 4);
- } else {
- $seg1 = substr($isbn, 0, 5);
- }
- my $x = substr($isbn, length($seg1));
- my $seg2;
- if(substr($x, 0, 2) <= 19) {
-# if(sTmp2 < 10) sTmp2 = "0" sTmp2;
- $seg2 = substr($x, 0, 2);
- } elsif(substr($x, 0, 3) <= 699) {
- $seg2 = substr($x, 0, 3);
- } elsif(substr($x, 0, 4) <= 8399) {
- $seg2 = substr($x, 0, 4);
- } elsif(substr($x, 0, 5) <= 89999) {
- $seg2 = substr($x, 0, 5);
- } elsif(substr($x, 0, 6) <= 9499999) {
- $seg2 = substr($x, 0, 6);
- } else {
- $seg2 = substr($x, 0, 7);
- }
- my $seg3=substr($x,length($seg2));
- $seg3=substr($seg3,0,length($seg3)-1) ;
- my $seg4 = substr($x, -1, 1);
- return "$seg1-$seg2-$seg3-$seg4";
-}
-
-=head2 get_itemnumbers_of
-
- my @itemnumbers_of = get_itemnumbers_of(@biblionumbers);
-
-Given a list of biblionumbers, return the list of corresponding itemnumbers
-for each biblionumber.
-
-Return a reference on a hash where keys are biblionumbers and values are
-references on array of itemnumbers.
-
-=cut
-sub get_itemnumbers_of {
- my @biblionumbers = @_;
-
- my $dbh = C4::Context->dbh;
-
- my $query = '
-SELECT itemnumber,
- biblionumber
- FROM items
- WHERE biblionumber IN (?'.(',?' x scalar @biblionumbers - 1).')
-';
- my $sth = $dbh->prepare($query);
- $sth->execute(@biblionumbers);
-
- my %itemnumbers_of;
-
- while (my ($itemnumber, $biblionumber) = $sth->fetchrow_array) {
- push @{$itemnumbers_of{$biblionumber}}, $itemnumber;
- }
-
- return \%itemnumbers_of;
-}
-
-sub get_iteminfos_of {
- my @itemnumbers = @_;
-
- my $query = '
-SELECT *
- FROM items
- WHERE itemnumber IN ('.join(',', @itemnumbers).')
-';
- return get_infos_of($query, 'itemnumber');
-}
-
-sub get_biblioiteminfos_of {
- my @biblioitemnumbers = @_;
-
- my $query = '
-SELECT biblioitemnumber,
- publicationyear,
- itemtype
- FROM biblioitems
- WHERE biblioitemnumber IN ('.join(',', @biblioitemnumbers).')
-';
-
- return get_infos_of($query, 'biblioitemnumber');
-}
-
-END { } # module clean-up code here (global destructor)
-
-=back