Koha-clms/Koha/UI/Table/Builder/Items.pm

158 lines
4.4 KiB
Perl

package Koha::UI::Table::Builder::Items;
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# Koha is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Koha; if not, see <https://www.gnu.org/licenses>.
use Modern::Perl;
use List::MoreUtils qw( uniq );
use C4::Biblio qw( GetMarcStructure GetMarcFromKohaField IsMarcStructureInternal );
use Koha::Items;
=head1 NAME
Koha::UI::Table::Builder::Items
Helper to build a table with a list of items with all their information.
Items' attributes that are mapped and not mapped will be listed in the table.
Only attributes that have been defined only once will be displayed (empty string is considered as not defined).
=head1 API
=head2 Class methods
=cut
=head3 new
my $table = Koha::UI::Table::Builder::Items->new( { itemnumbers => \@itemnumbers } );
Constructor.
=cut
sub new {
my ( $class, $params ) = @_;
my $self;
$self->{itemnumbers} = $params->{itemnumbers} || [];
bless $self, $class;
return $self;
}
=head3 build_table
my $items_table = Koha::UI::Table::Builder::Items->new( { itemnumbers => \@itemnumbers } )
->build_table;
my $items = $items_table->{items};
my $headers = $items_table->{headers};
Build the headers and rows for the table.
Use it with:
[% PROCESS items_table_batchmod headers => headers, items => items %]
=cut
sub build_table {
my ( $self, $params ) = @_;
my $patron = $params->{patron};
my %itemnumbers_to_idx = map { $self->{itemnumbers}->[$_] => $_ } 0 .. $#{ $self->{itemnumbers} };
my $items = Koha::Items->search( { itemnumber => $self->{itemnumbers} } );
my @items;
while ( my $item = $items->next ) {
my $item_info = $item->columns_to_str;
$item_info = {
%$item_info,
index => $itemnumbers_to_idx{ $item->itemnumber },
biblio => $item->biblio,
safe_to_delete => $item->safe_to_delete,
holds => $item->biblio->holds->count,
item_holds => $item->holds->count,
is_checked_out => $item->checkout ? 1 : 0,
nomod => $patron ? !$patron->can_edit_items_from( $item->homebranch ) : 0,
};
push @items, $item_info;
}
$self->{headers} = $self->_build_headers( \@items );
$self->{items} = \@items;
return $self;
}
=head2 Internal methods
=cut
=head3 _build_headers
Build the headers given the items' info.
=cut
sub _build_headers {
my ( $self, $items ) = @_;
my @witness_attributes = uniq map {
my $item = $_;
map {
defined $item->{$_}
&& !ref( $item->{$_} ) # biblio and safe_to_delete are objects
&& $item->{$_} ne ""
? $_
: ()
} keys %$item
} @$items;
my ( $itemtag, $itemsubfield ) = C4::Biblio::GetMarcFromKohaField("items.itemnumber");
my $tagslib = C4::Biblio::GetMarcStructure(1);
my $subfieldcode_attribute_mappings;
for my $subfield_code ( keys %{ $tagslib->{$itemtag} } ) {
my $subfield = $tagslib->{$itemtag}->{$subfield_code};
next if IsMarcStructureInternal($subfield);
next unless $subfield->{tab} eq 10; # Is this really needed?
my $attribute;
if ( $subfield->{kohafield} ) {
( $attribute = $subfield->{kohafield} ) =~ s|^items\.||;
} else {
$attribute = $subfield_code; # It's in more_subfields_xml
}
next unless grep { $attribute eq $_ } @witness_attributes;
$subfieldcode_attribute_mappings->{$subfield_code} = $attribute;
}
return [
map {
{
header_value => $tagslib->{$itemtag}->{$_}->{lib},
attribute => $subfieldcode_attribute_mappings->{$_},
subfield_code => $_,
}
} sort keys %$subfieldcode_attribute_mappings
];
}
1