Bug 21738: make call of CanBookBeReserved more safe
[koha.git] / C4 / XSLT.pm
index 364d6a1..bf2647a 100644 (file)
@@ -24,12 +24,13 @@ package C4::XSLT;
 use Modern::Perl;
 
 use C4::Context;
-use C4::Branch;
 use C4::Items;
 use C4::Koha;
 use C4::Biblio;
 use C4::Circulation;
 use C4::Reserves;
+use Koha::AuthorisedValues;
+use Koha::ItemTypes;
 use Koha::XSLT_Handler;
 use Koha::Libraries;
 
@@ -67,7 +68,7 @@ Is only used in this module currently.
 sub transformMARCXML4XSLT {
     my ($biblionumber, $record) = @_;
     my $frameworkcode = GetFrameworkCode($biblionumber) || '';
-    my $tagslib = &GetMarcStructure(1,$frameworkcode);
+    my $tagslib = &GetMarcStructure(1, $frameworkcode, { unsafe => 1 });
     my @fields;
     # FIXME: wish there was a better way to handle exceptions
     eval {
@@ -179,7 +180,7 @@ sub get_xslt_sysprefs {
 
     # singleBranchMode was a system preference, but no longer is
     # we can retain it here for compatibility
-    my $singleBranchMode = Koha::Libraries->search->count == 1;
+    my $singleBranchMode = Koha::Libraries->search->count == 1 ? 1 : 0;
     $sysxml .= "<syspref name=\"singleBranchMode\">$singleBranchMode</syspref>\n";
 
     $sysxml .= "</sysprefs>\n";
@@ -273,12 +274,14 @@ sub buildKohaItemsNamespace {
         @items = grep { !$hi{$_->{itemnumber}} } @items;
     }
 
-    my $shelflocations = GetKohaAuthorisedValues('items.location',GetFrameworkCode($biblionumber), 'opac');
-    my $ccodes         = GetKohaAuthorisedValues('items.ccode',GetFrameworkCode($biblionumber), 'opac');
+    my $shelflocations =
+      { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => GetFrameworkCode($biblionumber), kohafield => 'items.location' } ) };
+    my $ccodes =
+      { map { $_->{authorised_value} => $_->{opac_description} } Koha::AuthorisedValues->get_descriptions_by_koha_field( { frameworkcode => GetFrameworkCode($biblionumber), kohafield => 'items.ccode' } ) };
 
     my %branches = map { $_->branchcode => $_->branchname } Koha::Libraries->search({}, { order_by => 'branchname' });
 
-    my $itemtypes = GetItemTypes();
+    my $itemtypes = { map { $_->{itemtype} => $_ } @{ Koha::ItemTypes->search->unblessed } };
     my $location = "";
     my $ccode = "";
     my $xml = '';
@@ -289,12 +292,12 @@ sub buildKohaItemsNamespace {
 
         my $reservestatus = C4::Reserves::GetReserveStatus( $item->{itemnumber} );
 
-        if ( $itemtypes->{ $item->{itype} }->{notforloan} || $item->{notforloan} || $item->{onloan} || $item->{withdrawn} || $item->{itemlost} || $item->{damaged} ||
+        if ( ( $item->{itype} && $itemtypes->{ $item->{itype} }->{notforloan} ) || $item->{notforloan} || $item->{onloan} || $item->{withdrawn} || $item->{itemlost} || $item->{damaged} ||
              (defined $transfertwhen && $transfertwhen ne '') || $item->{itemnotforloan} || (defined $reservestatus && $reservestatus eq "Waiting") ){ 
             if ( $item->{notforloan} < 0) {
                 $status = "On order";
             } 
-            if ( $item->{itemnotforloan} > 0 || $item->{notforloan} > 0 || $itemtypes->{ $item->{itype} }->{notforloan} == 1 ) {
+            if ( $item->{itemnotforloan} && $item->{itemnotforloan} > 0 || $item->{notforloan} && $item->{notforloan} > 0 || $item->{itype} && $itemtypes->{ $item->{itype} }->{notforloan} && $itemtypes->{ $item->{itype} }->{notforloan} == 1 ) {
                 $status = "reference";
             }
             if ($item->{onloan}) {
@@ -323,14 +326,16 @@ sub buildKohaItemsNamespace {
         $location = $item->{location}? xml_escape($shelflocations->{$item->{location}}||$item->{location}):'';
         $ccode = $item->{ccode}? xml_escape($ccodes->{$item->{ccode}}||$item->{ccode}):'';
         my $itemcallnumber = xml_escape($item->{itemcallnumber});
+        my $stocknumber = $item->{stocknumber}? xml_escape($item->{stocknumber}):'';
         $xml .=
             "<item>"
           . "<homebranch>$homebranch</homebranch>"
           . "<holdingbranch>$holdingbranch</holdingbranch>"
           . "<location>$location</location>"
           . "<ccode>$ccode</ccode>"
-          . "<status>$status</status>"
+          . "<status>".( $status // q{} )."</status>"
           . "<itemcallnumber>$itemcallnumber</itemcallnumber>"
+          . "<stocknumber>$stocknumber</stocknumber>"
           . "</item>";
     }
     $xml = "<items xmlns=\"http://www.koha-community.org/items\">".$xml."</items>";