[Koha-bugs] [Bug 8486] New: Critical error in Koha::Calendar::days_between ?

bugzilla-daemon at bugs.koha-community.org bugzilla-daemon at bugs.koha-community.org
Sat Jul 21 08:30:40 CEST 2012


http://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=8486

          Priority: P5 - low
 Change sponsored?: ---
            Bug ID: 8486
          Assignee: colin.campbell at ptfs-europe.com
            Blocks: 7420, 8251
           Summary: Critical error in Koha::Calendar::days_between ?
          Severity: blocker
    Classification: Unclassified
                OS: All
          Reporter: paul.poulain at biblibre.com
          Hardware: All
            Status: ASSIGNED
           Version: master
         Component: Architecture, internals, and plumbing
           Product: Koha

My setup has syspref finesCalendar set "Use Calendar to skip all days the
library is closed".

I made the small following script:
#!/usr/bin/perl

use Koha::Calendar;
use Koha::DateUtils;
use 5.010;

my $calendar = Koha::Calendar->new( branchcode => 'MAURES' );
say "Test 1=".$calendar->days_between(dt_from_string("2012-01-10") ,
dt_from_string("2012-05-05") )->in_units('days');
say "Test 2=".$calendar->days_between(dt_from_string("2012-05-05") ,
dt_from_string("2012-01-01") )->in_units('days');

The result I get is:

./test_calendar.pl 
DURATION : $VAR1 = bless( {
                 'seconds' => 0,
                 'minutes' => 0,
                 'end_of_month' => 'wrap',
                 'nanoseconds' => 0,
                 'days' => 26,
                 'months' => 3
               }, 'DateTime::Duration' );
Test 1=26
DURATION : $VAR1 = bless( {
                 'seconds' => 0,
                 'minutes' => 0,
                 'end_of_month' => 'preserve',
                 'nanoseconds' => 0,
                 'days' => -4,
                 'months' => -4
               }, 'DateTime::Duration' );
Test 2=-4

(the DURATION line comes from a warn I put in days_between

Whatever the month, I always get the same result.
Digging into documentation, I found this:

$ perldoc DateTime::Duration
       ·   in_units( ... )

           Returns the length of the duration in the units (any of those that
can be passed to new) given as
           arguments. All lengths are integral, but may be negative. Smaller
units are computed from what remains
           after taking away the larger units given, so for example:

             my $dur = DateTime::Duration->new( years => 1, months => 15 );

             $dur->in_units( 'years' );            # 2
             $dur->in_units( 'months' );           # 27
             $dur->in_units( 'years', 'months' );  # (2, 3)
             $dur->in_units( 'weeks', 'days' );    # (0, 0) !

           The last example demonstrates that there will not be any conversion
between units which don't have a
           fixed conversion rate. The only conversions possible are:

           ·       years <=> months

           ·       weeks <=> days

           ·       hours <=> minutes

           ·       seconds <=> nanoseconds

           For the explanation of why this is the case, please see the How
Datetime Math Works section of the
           DateTime.pm documentation




CONCLUSION = the days_between() sub is doing a completely wrong calculation. I
think we should to a date1-date2 to get a number of days, then remove all
closed days.
2012-07-01 to 2012-07-15 is 14 (days)
2012-07-06 closed => 13 (days)
2012-07-07 closed => 12 (days)

This problem is probably the real cause of bug 8251 and the trouble I get to
test bug 7420

Colin, I've assigned this bug to you because you're Koha::Calendar initial
author. Anyone is welcomed to confirm and provide a fix.

What is really missing is a test plan. With a strong one, we would have
detected the problem before

-- 
You are receiving this mail because:
You are watching all bug changes.


More information about the Koha-bugs mailing list