| 
      
            Lines 7-13
          use C4::Circulation;
      
      
        Link Here
      
     | 
  
        
          | 7 | 
          use C4::Items;  | 
          7 | 
          use C4::Items;  | 
        
        
          | 8 | 
          use Koha::IssuingRule;  | 
          8 | 
          use Koha::IssuingRule;  | 
        
        
          | 9 | 
          use Koha::Items;  | 
          9 | 
          use Koha::Items;  | 
        
            
              | 10 | 
               | 
               | 
               | 
            
        
          | 11 | 
          use Test::More tests => 6;  | 
          10 | 
          use Test::More tests => 6;  | 
        
        
          | 12 | 
           | 
          11 | 
           | 
        
        
          | 13 | 
          use t::lib::TestBuilder;  | 
          12 | 
          use t::lib::TestBuilder;  | 
        
  
    | 
      
            Lines 29-39
          my $library1 = $builder->build({
      
      
        Link Here
      
     | 
  
        
          | 29 | 
          my $library2 = $builder->build({ | 
          28 | 
          my $library2 = $builder->build({ | 
        
        
          | 30 | 
              source => 'Branch',  | 
          29 | 
              source => 'Branch',  | 
        
        
          | 31 | 
          });  | 
          30 | 
          });  | 
        
          
            
              | 32 | 
               | 
              31 | 
              my $itemtype = $builder->build({ | 
            
            
               | 
               | 
              32 | 
                  source => 'Itemtype',  | 
            
            
              | 33 | 
                  value  => { notforloan => 0 } | 
            
            
              | 34 | 
              })->{itemtype}; | 
            
        
          | 33 | 
           | 
          35 | 
           | 
        
        
          | 34 | 
          t::lib::Mocks::mock_userenv({ branchcode => $library1->{branchcode} }); | 
          36 | 
          t::lib::Mocks::mock_userenv({ branchcode => $library1->{branchcode} }); | 
        
        
          | 35 | 
           | 
          37 | 
           | 
        
            
              | 36 | 
              my $bib_title = "Test Title";  | 
               | 
               | 
            
        
          | 37 | 
           | 
          38 | 
           | 
        
        
          | 38 | 
          my $borrower1 = $builder->build({ | 
          39 | 
          my $borrower1 = $builder->build({ | 
        
        
          | 39 | 
              source => 'Borrower',  | 
          40 | 
              source => 'Borrower',  | 
        
  
    | 
      
            Lines 51-101
          my $borrower2 = $builder->build({
      
      
        Link Here
      
     | 
  
        
          | 51 | 
              }  | 
          52 | 
              }  | 
        
        
          | 52 | 
          });  | 
          53 | 
          });  | 
        
        
          | 53 | 
           | 
          54 | 
           | 
        
          
            
              | 54 | 
              # Test hold_fulfillment_policy  | 
              55 | 
              my $borrower3 = $builder->build({ | 
            
            
              | 55 | 
              my ( $itemtype ) = @{ $dbh->selectrow_arrayref("SELECT itemtype FROM itemtypes LIMIT 1") }; | 
              56 | 
                  source => 'Borrower',  | 
            
            
               | 
               | 
              57 | 
                  value => { | 
            
            
              | 58 | 
                      branchcode => $library2->{branchcode}, | 
            
            
              | 59 | 
                      dateexpiry => '3000-01-01',  | 
            
            
              | 60 | 
                  }  | 
            
            
              | 61 | 
              });  | 
            
            
              | 62 | 
               | 
            
        
          | 56 | 
          my $borrowernumber1 = $borrower1->{borrowernumber}; | 
          63 | 
          my $borrowernumber1 = $borrower1->{borrowernumber}; | 
        
        
          | 57 | 
          my $borrowernumber2 = $borrower2->{borrowernumber}; | 
          64 | 
          my $borrowernumber2 = $borrower2->{borrowernumber}; | 
        
        
          | 58 | 
          my $library_A = $library1->{branchcode}; | 
          65 | 
          my $library_A = $library1->{branchcode}; | 
        
        
          | 59 | 
          my $library_B = $library2->{branchcode}; | 
          66 | 
          my $library_B = $library2->{branchcode}; | 
        
        
          | 60 | 
           | 
          67 | 
           | 
        
          
            
              | 61 | 
              $dbh->do("INSERT INTO biblio (frameworkcode, author, title, datecreated) VALUES ('', 'Koha test', '$bib_title', '2011-02-01')"); | 
              68 | 
              my $biblio = $builder->build_sample_biblio({itemtype=>$itemtype}); | 
            
            
              | 62 | 
               | 
              69 | 
              my $biblionumber = $biblio->biblionumber;  | 
            
            
              | 63 | 
              my $biblionumber = $dbh->selectrow_array("SELECT biblionumber FROM biblio WHERE title = '$bib_title'") | 
              70 | 
              my $item1  = $builder->build_sample_item({ | 
            
            
              | 64 | 
                or BAIL_OUT("Cannot find newly created biblio record"); | 
              71 | 
                  biblionumber=>$biblionumber,  | 
            
            
              | 65 | 
               | 
              72 | 
                  itype=>$itemtype,  | 
            
            
              | 66 | 
              $dbh->do("INSERT INTO biblioitems (biblionumber, itemtype) VALUES ($biblionumber, '$itemtype')"); | 
              73 | 
                  homebranch => $library_A,  | 
            
            
              | 67 | 
               | 
              74 | 
                  holdingbranch => $library_A  | 
            
            
              | 68 | 
              my $biblioitemnumber =  | 
              75 | 
              })->unblessed;  | 
            
            
              | 69 | 
                $dbh->selectrow_array("SELECT biblioitemnumber FROM biblioitems WHERE biblionumber = $biblionumber") | 
              76 | 
              my $item2  = $builder->build_sample_item({ | 
            
            
              | 70 | 
                or BAIL_OUT("Cannot find newly created biblioitems record"); | 
              77 | 
                  biblionumber=>$biblionumber,  | 
            
            
              | 71 | 
               | 
              78 | 
                  itype=>$itemtype,  | 
            
            
              | 72 | 
              $dbh->do(" | 
              79 | 
                  homebranch => $library_A,  | 
            
            
              | 73 | 
                  INSERT INTO items (barcode, biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)  | 
              80 | 
                  holdingbranch => $library_A  | 
            
            
              | 74 | 
                  VALUES ('AllowHoldIf1', $biblionumber, $biblioitemnumber, '$library_A', '$library_A', 0, 0, 0, 0, NULL, '$itemtype') | 
              81 | 
              })->unblessed;  | 
            
            
              | 75 | 
              ");  | 
               | 
               | 
            
        
          | 76 | 
           | 
          82 | 
           | 
        
          
            
              | 77 | 
              my $itemnumber1 =  | 
              83 | 
              # Test hold_fulfillment_policy  | 
            
            
              | 78 | 
                $dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber") | 
               | 
               | 
            
            
              | 79 | 
                or BAIL_OUT("Cannot find newly created item"); | 
            
            
              | 80 | 
               | 
            
            
              | 81 | 
              my $item1 = Koha::Items->find( $itemnumber1 )->unblessed;  | 
            
            
              | 82 | 
               | 
            
            
              | 83 | 
              $dbh->do(" | 
            
            
              | 84 | 
                  INSERT INTO items (barcode, biblionumber, biblioitemnumber, homebranch, holdingbranch, notforloan, damaged, itemlost, withdrawn, onloan, itype)  | 
            
            
              | 85 | 
                  VALUES ('AllowHoldIf2', $biblionumber, $biblioitemnumber, '$library_A', '$library_A', 0, 0, 0, 0, NULL, '$itemtype') | 
            
            
              | 86 | 
              ");  | 
            
        
          | 87 | 
           | 
          84 | 
           | 
        
            
              | 88 | 
              my $itemnumber2 =  | 
               | 
               | 
            
            
              | 89 | 
                $dbh->selectrow_array("SELECT itemnumber FROM items WHERE biblionumber = $biblionumber ORDER BY itemnumber DESC") | 
            
            
              | 90 | 
                or BAIL_OUT("Cannot find newly created item"); | 
            
        
          | 91 | 
           | 
          85 | 
           | 
        
            
              | 92 | 
              my $item2 = Koha::Items->find( $itemnumber2 )->unblessed;  | 
               | 
               | 
            
        
          | 93 | 
           | 
          86 | 
           | 
        
            
              | 94 | 
              $dbh->do("DELETE FROM issuingrules"); | 
               | 
               | 
            
        
          | 95 | 
          my $rule = Koha::IssuingRule->new(  | 
          87 | 
          my $rule = Koha::IssuingRule->new(  | 
        
        
          | 96 | 
              { | 
          88 | 
              { | 
        
        
          | 97 | 
                  categorycode => '*',  | 
          89 | 
                  categorycode => '*',  | 
        
          
            
              | 98 | 
                      itemtype     => '*',  | 
              90 | 
                      itemtype     => $itemtype,  | 
            
        
          | 99 | 
                  branchcode   => '*',  | 
          91 | 
                  branchcode   => '*',  | 
        
        
          | 100 | 
                  issuelength  => 7,  | 
          92 | 
                  issuelength  => 7,  | 
        
        
          | 101 | 
                  lengthunit   => 8,  | 
          93 | 
                  lengthunit   => 8,  | 
        
  
    | 
      
            Lines 128-136
          AddReturn( $item1->{barcode} );
      
      
        Link Here
      
     | 
  
        
          | 128 | 
                  my $hold_allowed_from_any_libraries = 2;  | 
          120 | 
                  my $hold_allowed_from_any_libraries = 2;  | 
        
        
          | 129 | 
                  my $sth_delete_rules = $dbh->prepare(q|DELETE FROM default_circ_rules|);  | 
          121 | 
                  my $sth_delete_rules = $dbh->prepare(q|DELETE FROM default_circ_rules|);  | 
        
        
          | 130 | 
                  my $sth_insert_rule = $dbh->prepare(q|INSERT INTO default_circ_rules(singleton, holdallowed, hold_fulfillment_policy, returnbranch) VALUES ('singleton', ?, 'any', 'homebranch');|); | 
          122 | 
                  my $sth_insert_rule = $dbh->prepare(q|INSERT INTO default_circ_rules(singleton, holdallowed, hold_fulfillment_policy, returnbranch) VALUES ('singleton', ?, 'any', 'homebranch');|); | 
        
            
               | 
               | 
              123 | 
                      my $sth_insert_branch_rule = $dbh->prepare(q|INSERT INTO default_branch_circ_rules(branchcode, holdallowed, hold_fulfillment_policy, returnbranch) VALUES (?, ?, 'any', 'homebranch');|);  | 
            
        
          | 131 | 
           | 
          124 | 
           | 
        
        
          | 132 | 
                  subtest 'Item is available at a different library' => sub { | 
          125 | 
                  subtest 'Item is available at a different library' => sub { | 
        
          
            
              | 133 | 
                          plan tests => 4;  | 
              126 | 
                          plan tests => 7;  | 
            
        
          | 134 | 
           | 
          127 | 
           | 
        
        
          | 135 | 
                      $item1 = Koha::Items->find( $item1->{itemnumber} ); | 
          128 | 
                      $item1 = Koha::Items->find( $item1->{itemnumber} ); | 
        
        
          | 136 | 
                      $item1->set({homebranch => $library_B, holdingbranch => $library_B })->store; | 
          129 | 
                      $item1->set({homebranch => $library_B, holdingbranch => $library_B })->store; | 
        
  
    | 
      
            Lines 140-147
          AddReturn( $item1->{barcode} );
      
      
        Link Here
      
     | 
  
        
          | 140 | 
                      #Item 1 homebranch library B is available  | 
          133 | 
                      #Item 1 homebranch library B is available  | 
        
        
          | 141 | 
                      #Item 2 homebranch library A is checked out  | 
          134 | 
                      #Item 2 homebranch library A is checked out  | 
        
        
          | 142 | 
                      #Borrower1 is from library A  | 
          135 | 
                      #Borrower1 is from library A  | 
        
            
              | 143 | 
                          #CircControl has no effect - same rule for all branches as set at line 96  | 
               | 
               | 
            
            
              | 144 | 
                          #FIXME: ReservesControlBranch is not checked in these subs we are testing  | 
            
        
          | 145 | 
           | 
          136 | 
           | 
        
        
          | 146 | 
                      { | 
          137 | 
                      { | 
        
        
          | 147 | 
                          $sth_delete_rules->execute;  | 
          138 | 
                          $sth_delete_rules->execute;  | 
        
  
    | 
      
            Lines 150-159
          AddReturn( $item1->{barcode} );
      
      
        Link Here
      
     | 
  
        
          | 150 | 
                          t::lib::Mocks::mock_preference('ReservesControlBranch', 'ItemHomeLibrary'); | 
          141 | 
                          t::lib::Mocks::mock_preference('ReservesControlBranch', 'ItemHomeLibrary'); | 
        
        
          | 151 | 
                          $is = IsAvailableForItemLevelRequest( $item1, $borrower1);  | 
          142 | 
                          $is = IsAvailableForItemLevelRequest( $item1, $borrower1);  | 
        
        
          | 152 | 
                          is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" );  | 
          143 | 
                          is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" );  | 
        
            
               | 
               | 
              144 | 
                              $is = IsAvailableForItemLevelRequest( $item1, $borrower2);  | 
            
            
              | 145 | 
                              is( $is, 1, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at home library, holdable = one available => the hold is not allowed at item level" );  | 
            
            
              | 146 | 
                              $sth_insert_branch_rule->execute( $library_B, $hold_allowed_from_any_libraries );  | 
            
            
              | 147 | 
                              #Adding a rule for the item's home library affects the availability for a borrower from another library because ReservesControlBranch is set to ItemHomeLibrary  | 
            
            
              | 148 | 
                              $is = IsAvailableForItemLevelRequest( $item1, $borrower1);  | 
            
            
              | 149 | 
                              is( $is, 0, "Hold allowed from home library + ReservesControlBranch=ItemHomeLibrary, One item is available at different library, holdable = one available => the hold is not allowed at item level" );  | 
            
        
          | 153 | 
           | 
          150 | 
           | 
        
        
          | 154 | 
                          t::lib::Mocks::mock_preference('ReservesControlBranch', 'PatronLibrary'); | 
          151 | 
                          t::lib::Mocks::mock_preference('ReservesControlBranch', 'PatronLibrary'); | 
        
        
          | 155 | 
                          $is = IsAvailableForItemLevelRequest( $item1, $borrower1);  | 
          152 | 
                          $is = IsAvailableForItemLevelRequest( $item1, $borrower1);  | 
        
        
          | 156 | 
                          is( $is, 1, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" );  | 
          153 | 
                          is( $is, 1, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, not holdable = none available => the hold is allowed at item level" );  | 
        
            
               | 
               | 
              154 | 
                              #Adding a rule for the patron's home library affects the availability for an item from another library because ReservesControlBranch is set to PatronLibrary  | 
            
            
              | 155 | 
                              $sth_insert_branch_rule->execute( $library_A, $hold_allowed_from_any_libraries );  | 
            
            
              | 156 | 
                              $is = IsAvailableForItemLevelRequest( $item1, $borrower1);  | 
            
            
              | 157 | 
                              is( $is, 0, "Hold allowed from home library + ReservesControlBranch=PatronLibrary, One item is available at different library, holdable = one available => the hold is not allowed at item level" );  | 
            
        
          | 157 | 
                      }  | 
          158 | 
                      }  | 
        
        
          | 158 | 
           | 
          159 | 
           | 
        
        
          | 159 | 
                      { | 
          160 | 
                      { | 
        
  
    | 
      
            Lines 213-247
          AddReturn( $item1->{barcode} );
      
      
        Link Here
      
     | 
  
        
          | 213 | 
              };  | 
          214 | 
              };  | 
        
        
          | 214 | 
          }  | 
          215 | 
          }  | 
        
        
          | 215 | 
           | 
          216 | 
           | 
        
          
            
              | 216 | 
              my $biblio = $builder->build({ | 
              217 | 
              my $itemtype2 = $builder->build({ | 
            
            
              | 217 | 
                  source => 'Biblio',  | 
              218 | 
                  source => 'Itemtype',  | 
            
            
              | 218 | 
              });  | 
              219 | 
                  value  => { notforloan => 0 } | 
            
            
              | 219 | 
               | 
              220 | 
              })->{itemtype}; | 
            
            
              | 220 | 
              my $item3 = $builder->build({ | 
              221 | 
              my $item3 = $builder->build_sample_item({ itype => $itemtype2 }); | 
            
            
              | 221 | 
                  source => 'Item',  | 
               | 
               | 
            
            
              | 222 | 
                  value => { | 
            
            
              | 223 | 
                      biblionumber => $biblio->{biblionumber}, | 
            
            
              | 224 | 
                      itemlost     => 0,  | 
            
            
              | 225 | 
                      notforloan   => 0,  | 
            
            
              | 226 | 
                      withdrawn    => 0,  | 
            
            
              | 227 | 
                      damaged      => 0,  | 
            
            
              | 228 | 
                      onloan       => undef,  | 
            
            
              | 229 | 
                  }  | 
            
            
              | 230 | 
              });  | 
            
        
          | 231 | 
           | 
          222 | 
           | 
        
        
          | 232 | 
          my $hold = $builder->build({ | 
          223 | 
          my $hold = $builder->build({ | 
        
        
          | 233 | 
              source => 'Reserve',  | 
          224 | 
              source => 'Reserve',  | 
        
        
          | 234 | 
              value =>{ | 
          225 | 
              value =>{ | 
        
          
            
              | 235 | 
                      itemnumber => $item3->{itemnumber}, | 
              226 | 
                      itemnumber => $item3->itemnumber,  | 
            
        
          | 236 | 
                  found => 'T'  | 
          227 | 
                  found => 'T'  | 
        
        
          | 237 | 
              }  | 
          228 | 
              }  | 
        
        
          | 238 | 
          });  | 
          229 | 
          });  | 
        
        
          | 239 | 
           | 
          230 | 
           | 
        
            
              | 240 | 
              $dbh->do("DELETE FROM issuingrules"); | 
               | 
               | 
            
        
          | 241 | 
          $rule = Koha::IssuingRule->new(  | 
          231 | 
          $rule = Koha::IssuingRule->new(  | 
        
        
          | 242 | 
              { | 
          232 | 
              { | 
        
        
          | 243 | 
                  categorycode => '*',  | 
          233 | 
                  categorycode => '*',  | 
        
          
            
              | 244 | 
                      itemtype     => '*',  | 
              234 | 
                      itemtype     => $itemtype2,  | 
            
        
          | 245 | 
                  branchcode   => '*',  | 
          235 | 
                  branchcode   => '*',  | 
        
        
          | 246 | 
                  issuelength  => 7,  | 
          236 | 
                  issuelength  => 7,  | 
        
        
          | 247 | 
                  lengthunit   => 8,  | 
          237 | 
                  lengthunit   => 8,  | 
        
  
    | 
      
            Lines 251-257
          $rule = Koha::IssuingRule->new(
      
      
        Link Here
      
     | 
  
        
          | 251 | 
          );  | 
          241 | 
          );  | 
        
        
          | 252 | 
          $rule->store();  | 
          242 | 
          $rule->store();  | 
        
        
          | 253 | 
           | 
          243 | 
           | 
        
          
            
              | 254 | 
              $is = IsAvailableForItemLevelRequest( $item3, $borrower1);  | 
              244 | 
              $is = IsAvailableForItemLevelRequest( $item3->unblessed, $borrower1);  | 
            
        
          | 255 | 
          is( $is, 1, "Item can be held, items in transit are not available" );  | 
          245 | 
          is( $is, 1, "Item can be held, items in transit are not available" );  | 
        
        
          | 256 | 
           | 
          246 | 
           | 
        
        
          | 257 | 
          # Cleanup  | 
          247 | 
          # Cleanup  | 
        
            
              | 258 | 
              -   | 
               | 
               |