@@ -, +, @@ - Define a long loan item type (like 10 days) that will use the calendar - and a hourly loan (like 2 hours) that will ignore the calendar - Create items with those item types - Mark today as a closed day - Check the items out --- C4/Circulation.pm | 18 +++++++++++++----- C4/UsageStats.pm | 1 - Koha/CirculationRules.pm | 30 ++++++++++++++++++++++++++++++ t/db_dependent/UsageStats.t | 1 - 4 files changed, 43 insertions(+), 7 deletions(-) --- a/C4/Circulation.pm +++ a/C4/Circulation.pm @@ -3576,7 +3576,7 @@ sub updateWrongTransfer { $newdatedue = CalcDateDue($startdate,$itemtype,$branchcode,$borrower); this function calculates the due date given the start date and configured circulation rules, -checking against the holidays calendar as per the 'useDaysMode' syspref. +checking against the holidays calendar as per the useDaysMode circulation rule. C<$startdate> = DateTime object representing start date of loan period (assumed to be today) C<$itemtype> = itemtype code of item in question C<$branch> = location whose calendar to use @@ -3610,8 +3610,16 @@ sub CalcDateDue { } + my $useDaysMode_value = Koha::CirculationRules->get_useDaysMode_effective_value( + { + categorycode => $borrower->{categorycode}, + itemtype => $itemtype, + branchcode => $branch, + } + ); + # calculate the datedue as normal - if ( C4::Context->preference('useDaysMode') eq 'Days' ) + if ( $useDaysMode_value eq 'Days' ) { # ignoring calendar if ( $loanlength->{lengthunit} eq 'hours' ) { $datedue->add( hours => $loanlength->{$length_key} ); @@ -3628,7 +3636,7 @@ sub CalcDateDue { else { # days $dur = DateTime::Duration->new( days => $loanlength->{$length_key}); } - my $calendar = Koha::Calendar->new( branchcode => $branch ); + my $calendar = Koha::Calendar->new( branchcode => $branch, days_mode => $useDaysMode_value ); $datedue = $calendar->addDate( $datedue, $dur, $loanlength->{lengthunit} ); if ($loanlength->{lengthunit} eq 'days') { $datedue->set_hour(23); @@ -3666,8 +3674,8 @@ sub CalcDateDue { $datedue = $expiry_dt->clone->set_time_zone( C4::Context->tz ); } } - if ( C4::Context->preference('useDaysMode') ne 'Days' ) { - my $calendar = Koha::Calendar->new( branchcode => $branch ); + if ( $useDaysMode_value ne 'Days' ) { + my $calendar = Koha::Calendar->new( branchcode => $branch, days_mode => $useDaysMode_value ); if ( $calendar->is_holiday($datedue) ) { # Don't return on a closed day $datedue = $calendar->prev_open_days( $datedue, 1 ); --- a/C4/UsageStats.pm +++ a/C4/UsageStats.pm @@ -155,7 +155,6 @@ sub BuildReport { ReturnBeforeExpiry TransfersMaxDaysWarning UseBranchTransferLimits - useDaysMode UseTransportCostMatrix UseCourseReserves finesCalendar --- a/Koha/CirculationRules.pm +++ a/Koha/CirculationRules.pm @@ -487,6 +487,36 @@ sub guess_article_requestable_itemtypes { return $res; } +=head3 get_useDaysMode_effective_value + +Return the value for useDaysMode defined in the circulation rules. +If not defined (or empty string), the value of the system preference useDaysMode is returned + +=cut + +sub get_useDaysMode_effective_value { + my ( $class, $params ) = @_; + + my $categorycode = $params->{categorycode}; + my $itemtype = $params->{itemtype}; + my $branchcode = $params->{branchcode}; + + my $useDaysMode_rule = $class->get_effective_rule( + { + categorycode => $categorycode, + itemtype => $itemtype, + branchcode => $branchcode, + rule_name => 'useDaysMode', + } + ); + + return ( defined($useDaysMode_rule) + and $useDaysMode_rule->rule_value ne '' ) + ? $useDaysMode_rule->rule_value + : C4::Context->preference('useDaysMode'); + +} + =head3 type --- a/t/db_dependent/UsageStats.t +++ a/t/db_dependent/UsageStats.t @@ -416,7 +416,6 @@ sub mocking_systempreferences_to_a_set_value { ReturnBeforeExpiry TransfersMaxDaysWarning UseBranchTransferLimits - useDaysMode UseTransportCostMatrix UseCourseReserves finesCalendar --