Lines 34-39
use HTML::Entities;
Link Here
|
34 |
use CGI qw ( -utf8 ); |
34 |
use CGI qw ( -utf8 ); |
35 |
use DateTime; |
35 |
use DateTime; |
36 |
use C4::Auth; |
36 |
use C4::Auth; |
|
|
37 |
use MARC::Record; |
38 |
use XML::Writer; |
37 |
|
39 |
|
38 |
=head1 NAME |
40 |
=head1 NAME |
39 |
|
41 |
|
Lines 154-159
sub GetAvailability {
Link Here
|
154 |
return $out; |
156 |
return $out; |
155 |
} |
157 |
} |
156 |
|
158 |
|
|
|
159 |
=head2 GetLibrisAvailability |
160 |
|
161 |
Returns item status for items from the Swedish national |
162 |
catalogue LIBRIS. Given a unique id stored in control-field 001, |
163 |
item status for all copies are returned as XML. |
164 |
|
165 |
=head3 id (Required) |
166 |
|
167 |
The LIBRIS id of the bibliographic item. |
168 |
This number is completely separate from ISBN or internal Koha ids. |
169 |
It can be found in MARC control-field 001, indexed by Zebra. |
170 |
|
171 |
=cut |
172 |
|
173 |
sub GetLibrisAvailability { |
174 |
my ( $cgi ) = @_; |
175 |
|
176 |
# Prepare XML header and output. |
177 |
my $xsi_ns = 'http://www.w3.org/2001/XMLSchema-instance'; |
178 |
my $item_ns = 'http://appl.libris.kb.se/LIBRISItem.xsd'; |
179 |
|
180 |
my $writer = XML::Writer->new( OUTPUT => 'self', |
181 |
ENCODING => 'utf-8' ); |
182 |
$writer->xmlDecl(); |
183 |
|
184 |
my $libris_id = $cgi->param( 'id' ); |
185 |
|
186 |
# Retrieve availability info: |
187 |
my ( $info, $error ) = _libris_availability( $libris_id ); |
188 |
if ( not defined $info ) { |
189 |
$writer->dataElement( 'Error', $error ); |
190 |
} else { |
191 |
foreach my $item (@{ $info->items }) { |
192 |
$writer->startTag( |
193 |
'Item_Information', |
194 |
'xmlns:xsi' => $xsi_ns, |
195 |
'xsi:noNamespaceSchema' => $item_ns ); |
196 |
$writer->dataElement( 'Item_No', $item->{'item_no'} ); |
197 |
$writer->dataElement( 'Location', $item->{'location'} ); |
198 |
$writer->dataElement( 'Call_No', $item->{'call_no'} ); |
199 |
$writer->dataElement( 'Status', $item->{'status'} ); |
200 |
$writer->dataElement( 'Status_Date_Description', $item->{'status_date_desc'} ); |
201 |
$writer->dataElement( 'Status_Date', $item->{'status_date'} ); |
202 |
$writer->dataElement( 'UniqueItemId', $item->{'unique_id'} ); |
203 |
$writer->endTag(); |
204 |
} |
205 |
} |
206 |
return $writer->end(); # Calling 'end' returns the XML output. |
207 |
} |
208 |
|
157 |
=head2 GetRecords |
209 |
=head2 GetRecords |
158 |
|
210 |
|
159 |
Given a list of biblionumbers, returns a list of record objects that |
211 |
Given a list of biblionumbers, returns a list of record objects that |
Lines 781-784
sub _availability {
Link Here
|
781 |
} |
833 |
} |
782 |
} |
834 |
} |
783 |
|
835 |
|
|
|
836 |
=head2 _libris_availability |
837 |
|
838 |
Returns, for an LIBRIS (Swedish national catalogue) ID, |
839 |
an array containing availability information. |
840 |
|
841 |
my ( $result, $errmsg ) = _libris_availability; |
842 |
$result will be undefined on error, $errmsg will be set. |
843 |
|
844 |
=cut |
845 |
|
846 |
sub _libris_availability |
847 |
{ |
848 |
my ( $libris_id ) = @_; |
849 |
|
850 |
return ( undef, "Missing parameter: Libris id" ) unless defined $libris_id; |
851 |
|
852 |
my ($error, $results, $count) = C4::Search::SimpleSearch( $libris_id, 0, 1 ); |
853 |
|
854 |
if ($count < 1 || scalar @{ $results } < 1) { |
855 |
return ( undef, "No search results for Libris id $libris_id" ); |
856 |
} |
857 |
|
858 |
my $xml = @{ $results }[0]; |
859 |
my $marcflavor = C4::Context->preference( 'marcflavour' ); |
860 |
my $record = MARC::Record->new_from_xml( $xml, 'utf8', $marcflavor ); |
861 |
my $biblionumber = $record->subfield( '999', 'c' ); |
862 |
|
863 |
if (defined $biblionumber) { |
864 |
# Possible enhancement; verify ontrol-field 003 is either 'LIBRIS' or 'SE-LIBR'. |
865 |
my @kohaitems = GetItemsInfo( $biblionumber ); |
866 |
|
867 |
my ( $status, $status_date, $status_date_desc ); |
868 |
|
869 |
my @items; |
870 |
foreach my $kohaitem ( @kohaitems ) { |
871 |
# Convert Koha status to Libris equivalent. |
872 |
if ( exists $kohaitem->{'notforloan'} ) { |
873 |
$status = 'Not for loan'; |
874 |
|
875 |
} elsif ( exists $kohaitem->{'onloan'} ) { |
876 |
$status = 'On loan'; |
877 |
if ( defined $kohaitem->{'datelastborrowed'} ) { |
878 |
$status_date = $kohaitem->{'datedue'}; |
879 |
$status_date_desc = 'Due on'; |
880 |
} |
881 |
|
882 |
} elsif ( exists $kohaitem->{'itemlost'} ) { |
883 |
$status = 'Item lost'; |
884 |
if ( defined $kohaitem->{'itemlost_on'} ) { |
885 |
$status_date = $kohaitem->{'itemlost_on'}; |
886 |
$status_date_desc = 'Item lost on'; |
887 |
} |
888 |
|
889 |
} elsif ( exists $kohaitem->{'withdrawn'} ) { |
890 |
$status = 'Withdrawn'; |
891 |
if (defined $kohaitem->{'withdrawn_om'} ) { |
892 |
$status_date = $kohaitem->{'withdrawn_on'}; |
893 |
$status_date_desc = 'Withdrawn on'; |
894 |
} |
895 |
} elsif ( exists $kohaitem->{'damaged'} ) { |
896 |
$status = 'Damaged'; |
897 |
} else { |
898 |
$status = 'Available'; |
899 |
} |
900 |
|
901 |
# No date set yet, fall back to 'date last seen': |
902 |
if ( not defined $status_date and defined $kohaitem->{'datelastseen'} ) { |
903 |
$status_date_desc = 'Last seen on'; |
904 |
$status_date = $kohaitem->{'datelastseen'}; |
905 |
} |
906 |
my $item = { |
907 |
location => $kohaitem->{'branchname'}, |
908 |
status => $status, |
909 |
status_date => $status_date, |
910 |
status_date_desc => $status_date_desc, |
911 |
call_number => $kohaitem->{'itemcallnumber'}, |
912 |
item_id => $kohaitem->{'copynumber'}, |
913 |
unique_item_id => $kohaitem->{'barcode'}, |
914 |
}; |
915 |
push( @items, $item ); |
916 |
} |
917 |
|
918 |
my $result = { 'items' => @items }; |
919 |
return ( $result, undef ); |
920 |
} |
921 |
|
922 |
return ( undef, "Mo item information for $libris_id with biblionumber $biblionumber" ); |
923 |
} |
924 |
|
784 |
1; |
925 |
1; |
785 |
- |
|
|