Hi there,

I've been working on some time zone support for Evergreen to accomodate the 
inclusion of Manitoba SPRUCE into the Sitka family, as well as our long 
suffering libraries in B.C. but using Mountain Time, and the few sites who 
don't use daylight savings.
 
The main issue with due dates, is that a database trigger pushes all 
day-interval due dates to 23:59 in the server time.  Unfortuately, the staff 
client does convert this time when displayed, for example sites in Mountain 
time see this as 00:59.  This is very bad, as it's basically the next day, so 
the due date is really not very accurate for them.

In order to circumvent this, I've removed the trigger and enhanced a block of 
code around O:A:Circ:Circulate.pm +2172 which already contained an incomplete 
time zone bit to actually be functional:

    # get time zone from org setting, failing that use local (server time zone)
    my $tz = $U->ou_ancestor_setting_value($self->circ_lib, 'global.timezone') 
|| 'local';

    # set the due date to 'now' in that time zone
    my $due_date = DateTime->now(time_zone => $tz);

    #if we're dealing with an interval that evenly divides into days, we want 
to push it to 23:59 of the due day
    #first we take the 'now' in the correct time zone and push it to 23:59
    my $ddseconds = OpenSRF::Utils->interval_to_seconds($duration);
    if($ddseconds % 86400 == 0){
        $due_date = DateTime->new(
            year      => $due_date->year,
            month     => $due_date->month,
            day       => $due_date->day,
            hour      => 23,
            minute    => 59,
            time_zone => $tz,
        );
    }

The timezone setting itself is a "link" type setting with a new fieldmapper 
table that is basically just a copy of Postgres' internal time zone names 
(pg_timezone_names -- although as a copy of that table, the idea being that the 
list could be truncated based on local needs as it's very large)

So far it works great in non-production testing.  But right now my current 
problem with this approach is that it doesn't adjust manually set due dates -- 
those are not passed through this function (as they don't have a 
$circ->interval), so it means that a multiday loan that is set manually in the 
staff client, will not be pushed to 23:59.

There are numerous ways I could restore the previous functionality, however 
I've been thinking about this, and the previous functionality of pushing any 
multi-day loan to 23:59 is not intuitive and probably breaks some usability 
concepts.  If there is a manual due time selector, the user should expect it to 
actually set the time, a user wouldn't normally expect it to be pushed to 23:59 
if there is a time selector -- there's nothing telling the user when it's going 
to be pushed to 23:59 so it's not intuitive and breaks the user's expectation.  
 It's a bit different than when the server calculates a due date interval from 
7 days as there's no time directly associated with that interval.

My personal preference would be to enhance the staff client have a popup or 
some way of selecting between just a "due date" with no time option, implicit 
that the time will be pushed to 23:59, and then either a "due date + time" 
option, or just a "time" option, presuming that the item would be due the same 
day.  Another important feature that may be worth adding here would be some way 
of having a buch of presets, for example 1 hour, 3 hours, or 1 day, 3 days, 
etc.  I haven't done anything with this piece yet but I'd appreciate any 
feedback or thoughts on how it should work.

Thanks

James Fournie
BC Libraries Cooperative

Reply via email to