X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FItems.pm;h=01509c297415c015a129d876ce440d3b5676a015;hb=499c694daf408571cc8370b4c20568336ba35cde;hp=96f60f0187aa7a4e43c0c4a60d6f2849538a679d;hpb=4370a19d75e2824d71946898d0876fb899199e52;p=koha_fer diff --git a/C4/Items.pm b/C4/Items.pm index 96f60f0187..01509c2974 100644 --- a/C4/Items.pm +++ b/C4/Items.pm @@ -1,6 +1,7 @@ package C4::Items; # Copyright 2007 LibLime, Inc. +# Parts Copyright Biblibre 2010 # # This file is part of Koha. # @@ -32,6 +33,7 @@ use C4::Branch; require C4::Reserves; use C4::Charset; use C4::Acquisition; +use List::MoreUtils qw/any/; use vars qw($VERSION @ISA @EXPORT); @@ -64,9 +66,11 @@ BEGIN { GetItemInfosOf GetItemsByBiblioitemnumber GetItemsInfo + GetItemsLocationInfo get_itemnumbers_of GetItemnumberFromBarcode GetBarcodeFromItemnumber + GetHiddenItemnumbers DelItemCheck MoveItemFromBiblio @@ -148,7 +152,6 @@ sub GetItem { my $ssth = $dbh->prepare("SELECT serialseq,publisheddate from serialitems left join serial on serialitems.serialid=serial.serialid where serialitems.itemnumber=?"); $ssth->execute($data->{'itemnumber'}) ; ($data->{'serialseq'} , $data->{'publisheddate'}) = $ssth->fetchrow_array(); - warn $data->{'serialseq'} , $data->{'publisheddate'}; } #if we don't have an items.itype, use biblioitems.itemtype. if( ! $data->{'itype'} ) { @@ -403,7 +406,7 @@ my %default_values_for_mod_from_marc = ( 'items.cn_source' => undef, copynumber => undef, damaged => 0, - dateaccessioned => undef, +# dateaccessioned => undef, enumchron => undef, holdingbranch => undef, homebranch => undef, @@ -430,18 +433,18 @@ sub ModItemFromMarc { my $biblionumber = shift; my $itemnumber = shift; - my $dbh = C4::Context->dbh; - my $frameworkcode = GetFrameworkCode( $biblionumber ); - my ($itemtag,$itemsubfield)=GetMarcFromKohaField("items.itemnumber",$frameworkcode); - - my $localitemmarc=MARC::Record->new; - $localitemmarc->append_fields($item_marc->field($itemtag)); - my $item = &TransformMarcToKoha( $dbh, $localitemmarc, $frameworkcode, 'items'); - foreach my $item_field (keys %default_values_for_mod_from_marc) { - $item->{$item_field} = $default_values_for_mod_from_marc{$item_field} unless exists $item->{$item_field}; + my $dbh = C4::Context->dbh; + my $frameworkcode = GetFrameworkCode($biblionumber); + my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); + + my $localitemmarc = MARC::Record->new; + $localitemmarc->append_fields( $item_marc->field($itemtag) ); + my $item = &TransformMarcToKoha( $dbh, $localitemmarc, $frameworkcode, 'items' ); + foreach my $item_field ( keys %default_values_for_mod_from_marc ) { + $item->{$item_field} = $default_values_for_mod_from_marc{$item_field} unless (exists $item->{$item_field}); } - my $unlinked_item_subfields = _get_unlinked_item_subfields($localitemmarc, $frameworkcode); - + my $unlinked_item_subfields = _get_unlinked_item_subfields( $localitemmarc, $frameworkcode ); + return ModItem($item, $biblionumber, $itemnumber, $dbh, $frameworkcode, $unlinked_item_subfields); } @@ -955,7 +958,7 @@ $statushash requires a hashref that has the authorized values fieldname (intems. =cut sub GetItemsForInventory { - my ( $minlocation, $maxlocation,$location, $itemtype, $ignoreissued, $datelastseen, $branch, $offset, $size, $statushash ) = @_; + my ( $minlocation, $maxlocation,$location, $itemtype, $ignoreissued, $datelastseen, $branchcode, $branch, $offset, $size, $statushash ) = @_; my $dbh = C4::Context->dbh; my ( @bind_params, @where_strings ); @@ -994,10 +997,14 @@ END_SQL push @where_strings, 'items.location = ?'; push @bind_params, $location; } - - if ( $branch ) { + + if ( $branchcode ) { + if($branch eq "homebranch"){ push @where_strings, 'items.homebranch = ?'; - push @bind_params, $branch; + }else{ + push @where_strings, 'items.holdingbranch = ?'; + } + push @bind_params, $branchcode; } if ( $itemtype ) { @@ -1271,6 +1278,31 @@ sub GetItemsInfo { $data->{notforloanvalue} = $lib; } + # get restricted status and description if applicable + my $restrictedstatus = $dbh->prepare( + 'SELECT authorised_value + FROM marc_subfield_structure + WHERE kohafield="items.restricted" + ' + ); + + $restrictedstatus->execute; + ($authorised_valuecode) = $restrictedstatus->fetchrow; + if ($authorised_valuecode) { + $restrictedstatus = $dbh->prepare( + "SELECT lib,lib_opac FROM authorised_values + WHERE category=? + AND authorised_value=?" + ); + $restrictedstatus->execute( $authorised_valuecode, + $data->{restricted} ); + + if ( my $rstdata = $restrictedstatus->fetchrow_hashref ) { + $data->{restricted} = $rstdata->{'lib'}; + $data->{restrictedopac} = $rstdata->{'lib_opac'}; + } + } + # my stack procedures my $stackstatus = $dbh->prepare( 'SELECT authorised_value @@ -1318,6 +1350,72 @@ sub GetItemsInfo { } } +=head2 GetItemsLocationInfo + + my @itemlocinfo = GetItemsLocationInfo($biblionumber); + +Returns the branch names, shelving location and itemcallnumber for each item attached to the biblio in question + +C returns a list of references-to-hash. Data returned: + +=over 2 + +=item C<$data-E{homebranch}> + +Branch Name of the item's homebranch + +=item C<$data-E{holdingbranch}> + +Branch Name of the item's holdingbranch + +=item C<$data-E{location}> + +Item's shelving location code + +=item C<$data-E{location_intranet}> + +The intranet description for the Shelving Location as set in authorised_values 'LOC' + +=item C<$data-E{location_opac}> + +The OPAC description for the Shelving Location as set in authorised_values 'LOC'. Falls back to intranet description if no OPAC +description is set. + +=item C<$data-E{itemcallnumber}> + +Item's itemcallnumber + +=item C<$data-E{cn_sort}> + +Item's call number normalized for sorting + +=back + +=cut + +sub GetItemsLocationInfo { + my $biblionumber = shift; + my @results; + + my $dbh = C4::Context->dbh; + my $query = "SELECT a.branchname as homebranch, b.branchname as holdingbranch, + location, itemcallnumber, cn_sort + FROM items, branches as a, branches as b + WHERE homebranch = a.branchcode AND holdingbranch = b.branchcode + AND biblionumber = ? + ORDER BY cn_sort ASC"; + my $sth = $dbh->prepare($query); + $sth->execute($biblionumber); + + while ( my $data = $sth->fetchrow_hashref ) { + $data->{location_intranet} = GetKohaAuthorisedValueLib('LOC', $data->{location}); + $data->{location_opac}= GetKohaAuthorisedValueLib('LOC', $data->{location}, 1); + push @results, $data; + } + return @results; +} + + =head2 GetLastAcquisitions my $lastacq = GetLastAcquisitions({'branches' => ('branch1','branch2'), @@ -1438,6 +1536,57 @@ sub GetBarcodeFromItemnumber { return ($result); } +=head2 GetHiddenItemnumbers + +=over 4 + +$result = GetHiddenItemnumbers(@items); + +=back + +=cut + +sub GetHiddenItemnumbers { + my (@items) = @_; + my @resultitems; + + my $yaml = C4::Context->preference('OpacHiddenItems'); + my $hidingrules; + eval { + $hidingrules = YAML::Load($yaml); + }; + if ($@) { + warn "Unable to parse OpacHiddenItems syspref : $@"; + return (); + } else { + my $dbh = C4::Context->dbh; + + # For each item + foreach my $item (@items) { + + # We check each rule + foreach my $field (keys %$hidingrules) { + my $query = "SELECT $field from items where itemnumber = ?"; + my $sth = $dbh->prepare($query); + $sth->execute($item->{'itemnumber'}); + my ($result) = $sth->fetchrow; + + # If the results matches the values in the yaml file + if (any { $result eq $_ } @{$hidingrules->{$field}}) { + + # We add the itemnumber to the list + push @resultitems, $item->{'itemnumber'}; + + # If at least one rule matched for an item, no need to test the others + last; + } + } + } + return @resultitems; + } + + } + =head3 get_item_authorised_values find the types and values for all authorised values assigned to this item. @@ -1739,6 +1888,9 @@ sub _do_column_fixes_for_mod { if (exists $item->{'location'} && !exists $item->{'permanent_location'}) { $item->{'permanent_location'} = $item->{'location'}; } + if (exists $item->{'timestamp'}) { + delete $item->{'timestamp'}; + } } =head2 _get_single_item_column @@ -1865,7 +2017,8 @@ sub _koha_new_item { uri = ?, enumchron = ?, more_subfields_xml = ?, - copynumber = ? + copynumber = ?, + stocknumber = ? "; my $sth = $dbh->prepare($query); $sth->execute( @@ -1902,6 +2055,7 @@ sub _koha_new_item { $item->{'enumchron'}, $item->{'more_subfields_xml'}, $item->{'copynumber'}, + $item->{'stocknumber'}, ); my $itemnumber = $dbh->{'mysql_insertid'}; if ( defined $sth->errstr ) { @@ -2000,21 +2154,31 @@ sub DelItemCheck { my $sth=$dbh->prepare("select * from issues i where i.itemnumber=?"); $sth->execute($itemnumber); - my $onloan=$sth->fetchrow; - - if ($onloan){ - $error = "book_on_loan" - }else{ - # check it doesnt have a waiting reserve - $sth=$dbh->prepare("SELECT * FROM reserves WHERE found = 'W' AND itemnumber = ?"); - $sth->execute($itemnumber); - my $reserve=$sth->fetchrow; - if ($reserve){ - $error = "book_reserved"; - }else{ - DelItem($dbh, $biblionumber, $itemnumber); - return 1; - } + my $item = GetItem($itemnumber); + my $onloan = $sth->fetchrow; + if ($onloan) { + $error = "book_on_loan"; + } + elsif (C4::Context->preference("IndependantBranches") and (C4::Context->userenv->{branch} ne $item->{C4::Context->preference("HomeOrHoldingBranch")||'homebranch'})){ + $error = "not_same_branch"; + } + else { + if ($onloan){ + $error = "book_on_loan" + } + else { + # check it doesnt have a waiting reserve + $sth=$dbh->prepare("SELECT * FROM reserves WHERE (found = 'W' or found = 'T') AND itemnumber = ?"); + $sth->execute($itemnumber); + my $reserve=$sth->fetchrow; + if ($reserve) { + $error = "book_reserved"; + } + else { + DelItem($dbh, $biblionumber, $itemnumber); + return 1; + } + } } return $error; } @@ -2112,17 +2276,20 @@ sub _marc_from_item_hash { : () } keys %{ $item } }; my $item_marc = MARC::Record->new(); - foreach my $item_field (keys %{ $mungeditem }) { - my ($tag, $subfield) = GetMarcFromKohaField($item_field, $frameworkcode); - next unless defined $tag and defined $subfield; # skip if not mapped to MARC field - if (my $field = $item_marc->field($tag)) { - $field->add_subfields($subfield => $mungeditem->{$item_field}); - } else { - my $add_subfields = []; - if (defined $unlinked_item_subfields and ref($unlinked_item_subfields) eq 'ARRAY' and $#$unlinked_item_subfields > -1) { - $add_subfields = $unlinked_item_subfields; + foreach my $item_field ( keys %{$mungeditem} ) { + my ( $tag, $subfield ) = GetMarcFromKohaField( $item_field, $frameworkcode ); + next unless defined $tag and defined $subfield; # skip if not mapped to MARC field + my @values = split(/\s?\|\s?/, $mungeditem->{$item_field}, -1); + foreach my $value (@values){ + if ( my $field = $item_marc->field($tag) ) { + $field->add_subfields( $subfield => $value ); + } else { + my $add_subfields = []; + if (defined $unlinked_item_subfields and ref($unlinked_item_subfields) eq 'ARRAY' and $#$unlinked_item_subfields > -1) { + $add_subfields = $unlinked_item_subfields; + } + $item_marc->add_fields( $tag, " ", " ", $subfield => $value, @$add_subfields ); } - $item_marc->add_fields( $tag, " ", " ", $subfield => $mungeditem->{$item_field}, @$add_subfields); } }