@ISA = qw(Exporter);
@EXPORT = qw(
- GetItem
AddItemFromMarc
AddItem
AddItemBatchFromMarc
modification transaction must keep the items table
and the MARC XML in sync at all times.
-Consequently, all code that creates, modifies, or deletes
-item records B<must> use an appropriate function from
-C<C4::Items>. If no existing function is suitable, it is
-better to add one to C<C4::Items> than to use add
-one-off SQL statements to add or modify items.
-
The items table will be considered authoritative. In other
words, if there is ever a discrepancy between the items
table and the MARC XML, the items table should be considered
=cut
-=head2 GetItem
-
- $item = GetItem($itemnumber,$barcode,$serial);
-
-Return item information, for a given itemnumber or barcode.
-The return value is a hashref mapping item column
-names to values. If C<$serial> is true, include serial publication data.
-
-=cut
-
-sub GetItem {
- my ($itemnumber,$barcode, $serial) = @_;
- my $dbh = C4::Context->dbh;
-
- my $item;
- if ($itemnumber) {
- $item = Koha::Items->find( $itemnumber );
- } else {
- $item = Koha::Items->find( { barcode => $barcode } );
- }
-
- return unless ( $item );
-
- my $data = $item->unblessed();
- $data->{itype} = $item->effective_itemtype(); # set the correct itype
-
- if ($serial) {
- 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();
- }
-
- return $data;
-} # sub GetItem
-
=head2 CartToShelf
CartToShelf($itemnumber);
croak "FAILED CartToShelf() - no itemnumber supplied";
}
- my $item = GetItem($itemnumber);
- if ( $item->{location} eq 'CART' ) {
- $item->{location} = $item->{permanent_location};
- ModItem($item, undef, $itemnumber);
+ my $item = Koha::Items->find($itemnumber);
+ if ( $item->location eq 'CART' ) {
+ ModItem({ location => $item->permanent_location}, undef, $itemnumber);
}
}
croak "FAILED ShelfToCart() - no itemnumber supplied";
}
- my $item = GetItem($itemnumber);
- $item->{'location'} = 'CART';
- ModItem($item, undef, $itemnumber);
+ ModItem({ location => 'CART'}, undef, $itemnumber);
}
=head2 AddItemFromMarc
my $dbh = C4::Context->dbh;
# parse item hash from MARC
- my $frameworkcode = C4::Biblio::GetFrameworkCode( $biblionumber );
- my ($itemtag,$itemsubfield)=C4::Biblio::GetMarcFromKohaField("items.itemnumber",$frameworkcode);
-
- my $localitemmarc=MARC::Record->new;
- $localitemmarc->append_fields($source_item_marc->field($itemtag));
- my $item = TransformMarcToKoha( $localitemmarc, $frameworkcode ,'items');
- my $unlinked_item_subfields = _get_unlinked_item_subfields($localitemmarc, $frameworkcode);
- return AddItem($item, $biblionumber, $dbh, $frameworkcode, $unlinked_item_subfields);
+ my $frameworkcode = C4::Biblio::GetFrameworkCode($biblionumber);
+ my ( $itemtag, $itemsubfield ) = C4::Biblio::GetMarcFromKohaField( "items.itemnumber", $frameworkcode );
+
+ my $localitemmarc = MARC::Record->new;
+ $localitemmarc->append_fields( $source_item_marc->field($itemtag) );
+ my $item = C4::Biblio::TransformMarcToKoha( $localitemmarc, $frameworkcode, 'items' );
+ my $unlinked_item_subfields = _get_unlinked_item_subfields( $localitemmarc, $frameworkcode );
+ return AddItem( $item, $biblionumber, $dbh, $frameworkcode, $unlinked_item_subfields );
}
=head2 AddItem
$item->{'itemnumber'} = $itemnumber;
- ModZebra( $item->{biblionumber}, "specialUpdate", "biblioserver" );
+ C4::Biblio::ModZebra( $item->{biblionumber}, "specialUpdate", "biblioserver" );
logaction( "CATALOGUING", "ADD", $itemnumber, "item" )
if C4::Context->preference("CataloguingLog");
}
);
-Change one or more columns in an item record and update
-the MARC representation of the item.
+Change one or more columns in an item record.
The first argument is a hashref mapping from item column
names to the new values. The second and third arguments
my @fields = qw( itemlost withdrawn damaged );
- # Only call GetItem if we need to set an "on" date field
+ # Only retrieve the item if we need to set an "on" date field
if ( $item->{itemlost} || $item->{withdrawn} || $item->{damaged} ) {
- my $pre_mod_item = GetItem( $item->{'itemnumber'} );
+ my $pre_mod_item = Koha::Items->find( $item->{'itemnumber'} );
for my $field (@fields) {
if ( defined( $item->{$field} )
- and not $pre_mod_item->{$field}
+ and not $pre_mod_item->$field
and $item->{$field} )
{
$item->{ $field . '_on' } =
VALUES (?, ?, NOW(), ?)");
$sth->execute($itemnumber, $frombranch, $tobranch);
- ModItem({ holdingbranch => $tobranch }, undef, $itemnumber);
+ ModItem({ holdingbranch => $tobranch }, undef, $itemnumber, { log_action => 0 });
ModDateLastSeen($itemnumber);
return;
}
my ( $parameters ) = @_;
my $minlocation = $parameters->{'minlocation'} // '';
my $maxlocation = $parameters->{'maxlocation'} // '';
+ my $class_source = $parameters->{'class_source'} // C4::Context->preference('DefaultClassificationSource');
my $location = $parameters->{'location'} // '';
my $itemtype = $parameters->{'itemtype'} // '';
my $ignoreissued = $parameters->{'ignoreissued'} // '';
my $offset = $parameters->{'offset'} // '';
my $size = $parameters->{'size'} // '';
my $statushash = $parameters->{'statushash'} // '';
+ my $ignore_waiting_holds = $parameters->{'ignore_waiting_holds'} // '';
my $dbh = C4::Context->dbh;
my ( @bind_params, @where_strings );
+ my $min_cnsort = GetClassSort($class_source,undef,$minlocation);
+ my $max_cnsort = GetClassSort($class_source,undef,$maxlocation);
+
my $select_columns = q{
- SELECT items.itemnumber, barcode, itemcallnumber, title, author, biblio.biblionumber, biblio.frameworkcode, datelastseen, homebranch, location, notforloan, damaged, itemlost, withdrawn, stocknumber
+ SELECT DISTINCT(items.itemnumber), barcode, itemcallnumber, title, author, biblio.biblionumber, biblio.frameworkcode, datelastseen, homebranch, location, notforloan, damaged, itemlost, withdrawn, stocknumber
};
- my $select_count = q{SELECT COUNT(*)};
+ my $select_count = q{SELECT COUNT(DISTINCT(items.itemnumber))};
my $query = q{
FROM items
LEFT JOIN biblio ON items.biblionumber = biblio.biblionumber
}
if ($minlocation) {
- push @where_strings, 'itemcallnumber >= ?';
- push @bind_params, $minlocation;
+ push @where_strings, 'items.cn_sort >= ?';
+ push @bind_params, $min_cnsort;
}
if ($maxlocation) {
- push @where_strings, 'itemcallnumber <= ?';
- push @bind_params, $maxlocation;
+ push @where_strings, 'items.cn_sort <= ?';
+ push @bind_params, $max_cnsort;
}
if ($datelastseen) {
push @where_strings, 'issues.date_due IS NULL';
}
+ if ( $ignore_waiting_holds ) {
+ $query .= "LEFT JOIN reserves ON items.itemnumber = reserves.itemnumber ";
+ push( @where_strings, q{(reserves.found != 'W' OR reserves.found IS NULL)} );
+ }
+
if ( @where_strings ) {
$query .= 'WHERE ';
$query .= join ' AND ', @where_strings;
# get restricted status and description if applicable
$descriptions = Koha::AuthorisedValues->get_description_by_koha_field({frameworkcode => $data->{frameworkcode}, kohafield => 'items.restricted', authorised_value => $data->{restricted} });
- $data->{restricted} = $descriptions->{lib} // '';
- $data->{restrictedopac} = $descriptions->{opac_description} // '';
+ $data->{restrictedvalue} = $descriptions->{lib} // '';
+ $data->{restrictedvalueopac} = $descriptions->{opac_description} // '';
# my stack procedures
$descriptions = Koha::AuthorisedValues->get_description_by_koha_field({frameworkcode => $data->{frameworkcode}, kohafield => 'items.stack', authorised_value => $data->{stack} });
sub get_hostitemnumbers_of {
my ($biblionumber) = @_;
- my $marcrecord = C4::Biblio::GetMarcBiblio({ biblionumber => $biblionumber });
+ if( !C4::Context->preference('EasyAnalyticalRecords') ) {
+ return ();
+ }
+
+ my $marcrecord = C4::Biblio::GetMarcBiblio({ biblionumber => $biblionumber });
return unless $marcrecord;
my ( @returnhostitemnumbers, $tag, $biblio_s, $item_s );
# while the other treats the MARC representation as authoritative
# under certain circumstances.
- my $itemrecord = GetItem($itemnumber);
+ my $item = Koha::Items->find($itemnumber) or return;
# Tack on 'items.' prefix to column names so that C4::Biblio::TransformKohaToMarc will work.
# Also, don't emit a subfield if the underlying field is blank.
-
- return Item2Marc($itemrecord,$biblionumber);
+ return Item2Marc($item->unblessed, $biblionumber);
}
sub Item2Marc {
} keys %{ $itemrecord }
};
my $framework = C4::Biblio::GetFrameworkCode( $biblionumber );
- my $itemmarc = C4::Biblio::TransformKohaToMarc(
- $mungeditem, { no_split => 1},
- );
+ my $itemmarc = C4::Biblio::TransformKohaToMarc( $mungeditem ); # Bug 21774: no_split parameter removed to allow cloned subfields
my ( $itemtag, $itemsubfield ) = C4::Biblio::GetMarcFromKohaField(
"items.itemnumber", $framework,
);
my $countanalytics = GetAnalyticsCount($itemnumber);
- # check that there is no issue on this item before deletion.
- my $sth = $dbh->prepare(
- q{
- SELECT COUNT(*) FROM issues
- WHERE itemnumber = ?
- }
- );
- $sth->execute($itemnumber);
- my ($onloan) = $sth->fetchrow;
-
- my $item = GetItem($itemnumber);
+ my $item = Koha::Items->find($itemnumber) or return;
- if ($onloan) {
+ if ($item->checkout) {
$status = "book_on_loan";
}
elsif ( defined C4::Context->userenv
and !C4::Context->IsSuperLibrarian()
and C4::Context->preference("IndependentBranches")
- and ( C4::Context->userenv->{branch} ne $item->{'homebranch'} ) )
+ and ( C4::Context->userenv->{branch} ne $item->homebranch ) )
{
$status = "not_same_branch";
}
else {
# check it doesn't have a waiting reserve
- $sth = $dbh->prepare(
+ my $sth = $dbh->prepare(
q{
SELECT COUNT(*) FROM reserves
WHERE (found = 'W' OR found = 'T')
my $original_item_marc = shift;
my $frameworkcode = shift;
- my $marcstructure = GetMarcStructure(1, $frameworkcode, { unsafe => 1 });
+ my $marcstructure = C4::Biblio::GetMarcStructure(1, $frameworkcode, { unsafe => 1 });
# assume that this record has only one field, and that that
# field contains only the item information
$query .= qq{ AND $where_str };
}
- $query .= q{ AND biblio_metadata.format = 'marcxml' AND biblio_metadata.marcflavour = ? };
+ $query .= q{ AND biblio_metadata.format = 'marcxml' AND biblio_metadata.schema = ? };
push @where_args, C4::Context->preference('marcflavour');
my @columns = Koha::Database->new()->schema()->resultset('Item')->result_source->columns;
while ( my $values = $sth->fetchrow_hashref ) {
my $biblionumber = $values->{biblionumber};
my $itemnumber = $values->{itemnumber};
- my $item = C4::Items::GetItem( $itemnumber );
for my $substitution ( @$substitutions ) {
next unless $substitution->{field};
C4::Items::ModItem( {$substitution->{field} => $substitution->{value}}, $biblionumber, $itemnumber )