| Lines 8-14
          use DBI;
      
      
        Link Here | 
        
          | 8 | use DateTime; | 8 | use DateTime; | 
        
          | 9 | use t::lib::Mocks; | 9 | use t::lib::Mocks; | 
        
          | 10 | use t::lib::TestBuilder; | 10 | use t::lib::TestBuilder; | 
          
            
              | 11 | use C4::Calendar qw( new insert_single_holiday delete_holiday insert_week_day_holiday ); | 11 | use C4::Calendar    qw( new insert_single_holiday delete_holiday insert_week_day_holiday ); | 
        
          | 12 | use Koha::DateUtils qw( dt_from_string ); | 12 | use Koha::DateUtils qw( dt_from_string ); | 
        
          | 13 | use Koha::Library::Hours; | 13 | use Koha::Library::Hours; | 
        
          | 14 | use Koha::CirculationRules; | 14 | use Koha::CirculationRules; | 
  
    | Lines 362-440
          is( $date->ymd, $renewed_date->ymd, 'Renewal period of "" should trigger fallove
      
      
        Link Here | 
        
          | 362 | my $library1 = $builder->build( { source => 'Branch' } ); | 362 | my $library1 = $builder->build( { source => 'Branch' } ); | 
        
          | 363 | Koha::CirculationRules->set_rules( | 363 | Koha::CirculationRules->set_rules( | 
        
          | 364 |     { | 364 |     { | 
          
            
              | 365 |         categorycode => $categorycode, | 365 |         categorycode => $borrower->categorycode, | 
        
          | 366 |         itemtype     => $itemtype, | 366 |         itemtype     => $itemtype, | 
        
          | 367 |         branchcode   => $library1->{branchcode}, | 367 |         branchcode   => $library1->{branchcode}, | 
        
          | 368 |         rules        => { | 368 |         rules        => { | 
          
            
              | 369 |             issuelength   => 3, # loan period is 3 hours | 369 |             issuelength => 3,         # loan period is 3 hours | 
            
              | 370 |             lengthunit    => 'hours', | 370 |             lengthunit  => 'hours', | 
            
              | 371 |             daysmode      => '', | 371 |             daysmode    => '', | 
        
          | 372 |         } | 372 |         } | 
        
          | 373 |     } | 373 |     } | 
        
          | 374 | ); | 374 | ); | 
        
          | 375 |  | 375 |  | 
          
            
              | 376 | my $open = DateTime->new( year => 2023, month => 5, day => 1, hour => 10 )->hms; | 376 | my $open  = DateTime->new( year => 2023, month => 5, day => 1, hour => 10 )->hms; | 
        
          | 377 | my $close = DateTime->new( year => 2023, month => 5, day => 1, hour => 16 )->hms; | 377 | my $close = DateTime->new( year => 2023, month => 5, day => 1, hour => 16 )->hms; | 
          
            
              | 378 | my $now = DateTime->new( year => 2023, month => 5, day => 1, hour => 14 ); | 378 | my $now   = DateTime->new( year => 2023, month => 5, day => 1, hour => 14 ); | 
            
              |  |  | 379 |  | 
            
              | 380 | foreach ( 0 .. 6 ) { | 
        
          | 379 |  | 381 |  | 
            
              | 380 | foreach (0..6) { |  |  | 
        
          | 381 |     # library opened 4 hours ago and closes in 2 hours. | 382 |     # library opened 4 hours ago and closes in 2 hours. | 
          
            
              | 382 |     Koha::Library::Hour->new({ day => $_, library_id => $library1->{branchcode}, open_time => $open, close_time => $close })->store; | 383 |     Koha::Library::Hour->new( | 
            
              |  |  | 384 |         { day => $_, library_id => $library1->{branchcode}, open_time => $open, close_time => $close } )->store; | 
        
          | 383 | } | 385 | } | 
        
          | 384 |  | 386 |  | 
        
          | 385 | # ignore calendar | 387 | # ignore calendar | 
          
            
              | 386 | t::lib::Mocks::mock_preference('useDaysMode', 'Days'); | 388 | t::lib::Mocks::mock_preference( 'useDaysMode',                       'Days' ); | 
            
              | 387 | t::lib::Mocks::mock_preference('ConsiderLibraryHoursInCirculation', 'close'); | 389 | t::lib::Mocks::mock_preference( 'ConsiderLibraryHoursInCirculation', 'close' ); | 
            
              |  |  | 390 |  | 
        
          | 388 | # shorten loan period | 391 | # shorten loan period | 
        
          | 389 |  | 392 |  | 
        
          | 390 | $date = C4::Circulation::CalcDateDue( $now, $itemtype, $library1->{branchcode}, $borrower ); | 393 | $date = C4::Circulation::CalcDateDue( $now, $itemtype, $library1->{branchcode}, $borrower ); | 
        
          | 391 | my $expected_duetime = $now->clone->add( hours => 2 ); | 394 | my $expected_duetime = $now->clone->add( hours => 2 ); | 
          
            
              | 392 | is( $date, $expected_duetime, "Loan period was shortened because ConsiderLibraryHoursInCirculation is set to close time" ); | 395 | is( | 
            
              |  |  | 396 |     $date, $expected_duetime, | 
            
              | 397 |     "Loan period was shortened because ConsiderLibraryHoursInCirculation is set to close time" | 
            
              | 398 | ); | 
            
              | 399 |  | 
            
              | 400 | t::lib::Mocks::mock_preference( 'ConsiderLibraryHoursInCirculation', 'open' ); | 
        
          | 393 |  | 401 |  | 
            
              | 394 | t::lib::Mocks::mock_preference('ConsiderLibraryHoursWhenIssuing', 'open'); |  |  | 
        
          | 395 | # extend loan period | 402 | # extend loan period | 
        
          | 396 |  | 403 |  | 
          
            
              | 397 | $date = C4::Circulation::CalcDateDue( $now, $itemtype, $library1->{branchcode}, $borrower ); | 404 | $date             = C4::Circulation::CalcDateDue( $now, $itemtype, $library1->{branchcode}, $borrower ); | 
        
          | 398 | $expected_duetime = $now->clone->add( days => 1 )->subtract( hours => 4 ); | 405 | $expected_duetime = $now->clone->add( days => 1 )->subtract( hours => 4 ); | 
          
            
              | 399 | is( $date, $expected_duetime, "Loan period was extended because ConsiderLibraryHoursInCirculation is set to open time" ); | 406 | is( | 
            
              |  |  | 407 |     $date, $expected_duetime, | 
            
              | 408 |     "Loan period was extended because ConsiderLibraryHoursInCirculation is set to open time" | 
            
              | 409 | ); | 
        
          | 400 |  | 410 |  | 
        
          | 401 | my $holiday_tomorrow = $now->clone->add( days => 1 ); | 411 | my $holiday_tomorrow = $now->clone->add( days => 1 ); | 
        
          | 402 |  | 412 |  | 
        
          | 403 | # consider calendar | 413 | # consider calendar | 
        
          | 404 | my $library1_calendar = C4::Calendar->new( branchcode => $library1->{branchcode} ); | 414 | my $library1_calendar = C4::Calendar->new( branchcode => $library1->{branchcode} ); | 
        
          | 405 | $library1_calendar->insert_single_holiday( | 415 | $library1_calendar->insert_single_holiday( | 
          
            
              | 406 |     day             => $holiday_tomorrow->day, | 416 |     day         => $holiday_tomorrow->day, | 
            
              | 407 |     month           => $holiday_tomorrow->month, | 417 |     month       => $holiday_tomorrow->month, | 
            
              | 408 |     year            => $holiday_tomorrow->year, | 418 |     year        => $holiday_tomorrow->year, | 
            
              | 409 |     title           => 'testholiday', | 419 |     title       => 'testholiday', | 
            
              | 410 |     description     => 'testholiday' | 420 |     description => 'testholiday' | 
        
          | 411 | ); | 421 | ); | 
        
          | 412 | Koha::CirculationRules->set_rules( | 422 | Koha::CirculationRules->set_rules( | 
        
          | 413 |     { | 423 |     { | 
          
            
              | 414 |         categorycode => $categorycode, | 424 |         categorycode => $patron_category->categorycode, | 
        
          | 415 |         itemtype     => $itemtype, | 425 |         itemtype     => $itemtype, | 
        
          | 416 |         branchcode   => $library1->{branchcode}, | 426 |         branchcode   => $library1->{branchcode}, | 
        
          | 417 |         rules        => { | 427 |         rules        => { | 
          
            
              | 418 |             issuelength   => 18, # loan period must cross over into tomorrow | 428 |             issuelength => 18,        # loan period must cross over into tomorrow | 
            
              | 419 |             lengthunit    => 'hours', | 429 |             lengthunit  => 'hours', | 
        
          | 420 |         } | 430 |         } | 
        
          | 421 |     } | 431 |     } | 
        
          | 422 | ); | 432 | ); | 
        
          | 423 |  | 433 |  | 
          
            
              | 424 | t::lib::Mocks::mock_preference('useDaysMode', 'Calendar'); | 434 | t::lib::Mocks::mock_preference( 'useDaysMode',                       'Calendar' ); | 
            
              | 425 | t::lib::Mocks::mock_preference('ConsiderLibraryHoursInCirculation', 'close'); | 435 | t::lib::Mocks::mock_preference( 'ConsiderLibraryHoursInCirculation', 'close' ); | 
            
              |  |  | 436 |  | 
        
          | 426 | # shorten loan period | 437 | # shorten loan period | 
        
          | 427 |  | 438 |  | 
          
            
              | 428 | $date = C4::Circulation::CalcDateDue( $now, $itemtype, $library1->{branchcode}, $borrower ); | 439 | $date             = C4::Circulation::CalcDateDue( $now, $itemtype, $library1->{branchcode}, $borrower ); | 
            
              | 429 | $expected_duetime = $now->clone->add( days => 2, hours => 2 ); | 440 | $expected_duetime = $now->clone->add( hours => 2 ); | 
            
              | 430 | is( $date, $expected_duetime, "Loan period was shortened (but considers the holiday) because ConsiderLibraryHoursInCirculation is set to close time" ); | 441 | is( | 
            
              |  |  | 442 |     $date, $expected_duetime, | 
            
              | 443 |     "Loan period was shortened (but considers the holiday) because ConsiderLibraryHoursInCirculation is set to close time" | 
            
              | 444 | ); | 
        
          | 431 |  | 445 |  | 
        
          | 432 | t::lib::Mocks::mock_preference( 'ConsiderLibraryHoursInCirculation', 'open' ); | 446 | t::lib::Mocks::mock_preference( 'ConsiderLibraryHoursInCirculation', 'open' ); | 
            
              |  |  | 447 |  | 
        
          | 433 | # extend loan period | 448 | # extend loan period | 
        
          | 434 |  | 449 |  | 
          
            
              | 435 | $date = C4::Circulation::CalcDateDue( $now, $itemtype, $library1->{branchcode}, $borrower ); | 450 | $date             = C4::Circulation::CalcDateDue( $now, $itemtype, $library1->{branchcode}, $borrower ); | 
        
          | 436 | $expected_duetime = $now->clone->add( days => 2 )->subtract( hours => 4 ); | 451 | $expected_duetime = $now->clone->add( days => 2 )->subtract( hours => 4 ); | 
          
            
              | 437 | is( $date, $expected_duetime, "Loan period was extended (but considers the holiday) because ConsiderLibraryHoursInCirculation is set to open time" ); | 452 | is( | 
            
              |  |  | 453 |     $date, $expected_duetime, | 
            
              | 454 |     "Loan period was extended (but considers the holiday) because ConsiderLibraryHoursInCirculation is set to open time" | 
            
              | 455 | ); | 
        
          | 438 |  | 456 |  | 
        
          | 439 | $cache->clear_from_cache($key); | 457 | $cache->clear_from_cache($key); | 
        
          | 440 | $schema->storage->txn_rollback; | 458 | $schema->storage->txn_rollback; | 
            
              | 441 | -  |  |  |