Lines 2233-2246
Internal function, called only by AddReturn that calculates and updates
Link Here
|
2233 |
|
2233 |
|
2234 |
Should only be called for overdue returns |
2234 |
Should only be called for overdue returns |
2235 |
|
2235 |
|
|
|
2236 |
Calculation of the debarment date has been moved to a separate subroutine _calculate_new_debar_dt |
2237 |
to ease testing. |
2238 |
|
2236 |
=cut |
2239 |
=cut |
2237 |
|
2240 |
|
2238 |
sub _debar_user_on_return { |
2241 |
sub _calculate_new_debar_dt { |
2239 |
my ( $borrower, $item, $dt_due, $return_date ) = @_; |
2242 |
my ( $borrower, $item, $dt_due, $return_date ) = @_; |
2240 |
|
2243 |
|
2241 |
my $branchcode = _GetCircControlBranch( $item, $borrower ); |
2244 |
my $branchcode = _GetCircControlBranch( $item, $borrower ); |
2242 |
$return_date //= dt_from_string(); |
|
|
2243 |
|
2244 |
my $circcontrol = C4::Context->preference('CircControl'); |
2245 |
my $circcontrol = C4::Context->preference('CircControl'); |
2245 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
2246 |
my $issuing_rule = Koha::IssuingRules->get_effective_issuing_rule( |
2246 |
{ categorycode => $borrower->{categorycode}, |
2247 |
{ categorycode => $borrower->{categorycode}, |
Lines 2252-2332
sub _debar_user_on_return {
Link Here
|
2252 |
my $unit = $issuing_rule ? $issuing_rule->lengthunit : undef; |
2253 |
my $unit = $issuing_rule ? $issuing_rule->lengthunit : undef; |
2253 |
my $chargeable_units = C4::Overdues::get_chargeable_units($unit, $dt_due, $return_date, $branchcode); |
2254 |
my $chargeable_units = C4::Overdues::get_chargeable_units($unit, $dt_due, $return_date, $branchcode); |
2254 |
|
2255 |
|
2255 |
if ($finedays) { |
2256 |
return unless $finedays; |
2256 |
|
|
|
2257 |
# finedays is in days, so hourly loans must multiply by 24 |
2258 |
# thus 1 hour late equals 1 day suspension * finedays rate |
2259 |
$finedays = $finedays * 24 if ( $unit eq 'hours' ); |
2260 |
|
2257 |
|
2261 |
# grace period is measured in the same units as the loan |
2258 |
# finedays is in days, so hourly loans must multiply by 24 |
2262 |
my $grace = |
2259 |
# thus 1 hour late equals 1 day suspension * finedays rate |
2263 |
DateTime::Duration->new( $unit => $issuing_rule->firstremind ); |
2260 |
$finedays = $finedays * 24 if ( $unit eq 'hours' ); |
2264 |
|
2261 |
|
2265 |
my $deltadays = DateTime::Duration->new( |
2262 |
# grace period is measured in the same units as the loan |
2266 |
days => $chargeable_units |
2263 |
my $grace = |
2267 |
); |
2264 |
DateTime::Duration->new( $unit => $issuing_rule->firstremind ); |
2268 |
if ( $deltadays->subtract($grace)->is_positive() ) { |
|
|
2269 |
my $suspension_days = $deltadays * $finedays; |
2270 |
|
2271 |
# If the max suspension days is < than the suspension days |
2272 |
# the suspension days is limited to this maximum period. |
2273 |
my $max_sd = $issuing_rule->maxsuspensiondays; |
2274 |
if ( defined $max_sd ) { |
2275 |
$max_sd = DateTime::Duration->new( days => $max_sd ); |
2276 |
$suspension_days = $max_sd |
2277 |
if DateTime::Duration->compare( $max_sd, $suspension_days ) < 0; |
2278 |
} |
2279 |
|
2265 |
|
2280 |
my ( $has_been_extended, $is_a_reminder ); |
2266 |
my $deltadays = DateTime::Duration->new( |
2281 |
if ( C4::Context->preference('CumulativeRestrictionPeriods') and $borrower->{debarred} ) { |
2267 |
days => $chargeable_units |
2282 |
my $debarment = @{ GetDebarments( { borrowernumber => $borrower->{borrowernumber}, type => 'SUSPENSION' } ) }[0]; |
2268 |
); |
2283 |
if ( $debarment ) { |
2269 |
if ( $deltadays->subtract($grace)->is_positive() ) { |
2284 |
$return_date = dt_from_string( $debarment->{expiration}, 'sql' ); |
2270 |
my $suspension_days = $deltadays * $finedays; |
2285 |
$has_been_extended = 1; |
2271 |
|
2286 |
} |
2272 |
# If the max suspension days is < than the suspension days |
2287 |
} |
2273 |
# the suspension days is limited to this maximum period. |
|
|
2274 |
my $max_sd = $issuing_rule->maxsuspensiondays; |
2275 |
if ( defined $max_sd ) { |
2276 |
$max_sd = DateTime::Duration->new( days => $max_sd ); |
2277 |
$suspension_days = $max_sd |
2278 |
if DateTime::Duration->compare( $max_sd, $suspension_days ) < 0; |
2279 |
} |
2288 |
|
2280 |
|
2289 |
if ( $issuing_rule->suspension_chargeperiod > 1 ) { |
2281 |
my ( $has_been_extended ); |
2290 |
# No need to / 1 and do not consider / 0 |
2282 |
if ( C4::Context->preference('CumulativeRestrictionPeriods') and $borrower->{debarred} ) { |
2291 |
$suspension_days = DateTime::Duration->new( |
2283 |
my $debarment = @{ GetDebarments( { borrowernumber => $borrower->{borrowernumber}, type => 'SUSPENSION' } ) }[0]; |
2292 |
days => floor( $suspension_days->in_units('days') / $issuing_rule->suspension_chargeperiod ) |
2284 |
if ( $debarment ) { |
2293 |
); |
2285 |
$return_date = dt_from_string( $debarment->{expiration}, 'sql' ); |
|
|
2286 |
$has_been_extended = 1; |
2294 |
} |
2287 |
} |
|
|
2288 |
} |
2295 |
|
2289 |
|
2296 |
my $new_debar_dt; |
2290 |
if ( $issuing_rule->suspension_chargeperiod > 1 ) { |
2297 |
# Use the calendar or not to calculate the debarment date |
2291 |
# No need to / 1 and do not consider / 0 |
2298 |
if ( C4::Context->preference('SuspensionsCalendar') eq 'noSuspensionsWhenClosed' ) { |
2292 |
$suspension_days = DateTime::Duration->new( |
2299 |
my $calendar = Koha::Calendar->new( |
2293 |
days => floor( $suspension_days->in_units('days') / $issuing_rule->suspension_chargeperiod ) |
2300 |
branchcode => $branchcode, |
2294 |
); |
2301 |
days_mode => 'Calendar' |
2295 |
} |
2302 |
); |
|
|
2303 |
$new_debar_dt = $calendar->addDate( $return_date, $suspension_days ); |
2304 |
} |
2305 |
else { |
2306 |
$new_debar_dt = $return_date->clone()->add_duration($suspension_days); |
2307 |
} |
2308 |
|
2296 |
|
2309 |
Koha::Patron::Debarments::AddUniqueDebarment({ |
2297 |
my $new_debar_dt; |
2310 |
borrowernumber => $borrower->{borrowernumber}, |
2298 |
# Use the calendar or not to calculate the debarment date |
2311 |
expiration => $new_debar_dt->ymd(), |
2299 |
if ( C4::Context->preference('SuspensionsCalendar') eq 'noSuspensionsWhenClosed' ) { |
2312 |
type => 'SUSPENSION', |
2300 |
my $calendar = Koha::Calendar->new( |
2313 |
}); |
2301 |
branchcode => $branchcode, |
2314 |
# if borrower was already debarred but does not get an extra debarment |
2302 |
days_mode => 'Calendar' |
2315 |
my $patron = Koha::Patrons->find( $borrower->{borrowernumber} ); |
2303 |
); |
2316 |
my $new_debarment_str; |
2304 |
$new_debar_dt = $calendar->addDate( $return_date, $suspension_days ); |
2317 |
if ( $borrower->{debarred} eq $patron->is_debarred ) { |
2305 |
} |
2318 |
$is_a_reminder = 1; |
2306 |
else { |
2319 |
$new_debarment_str = $borrower->{debarred}; |
2307 |
$new_debar_dt = $return_date->clone()->add_duration($suspension_days); |
2320 |
} else { |
|
|
2321 |
$new_debarment_str = $new_debar_dt->ymd(); |
2322 |
} |
2323 |
# FIXME Should return a DateTime object |
2324 |
return $new_debarment_str, $is_a_reminder; |
2325 |
} |
2308 |
} |
|
|
2309 |
return $new_debar_dt; |
2326 |
} |
2310 |
} |
2327 |
return; |
2311 |
return; |
2328 |
} |
2312 |
} |
2329 |
|
2313 |
|
|
|
2314 |
sub _debar_user_on_return { |
2315 |
my ( $borrower, $item, $dt_due, $return_date ) = @_; |
2316 |
|
2317 |
$return_date //= dt_from_string(); |
2318 |
|
2319 |
my $new_debar_dt = _calculate_new_debar_dt ($borrower, $item, $dt_due, $return_date); |
2320 |
|
2321 |
return unless $new_debar_dt; |
2322 |
|
2323 |
Koha::Patron::Debarments::AddUniqueDebarment({ |
2324 |
borrowernumber => $borrower->{borrowernumber}, |
2325 |
expiration => $new_debar_dt->ymd(), |
2326 |
type => 'SUSPENSION', |
2327 |
}); |
2328 |
# if borrower was already debarred but does not get an extra debarment |
2329 |
my $patron = Koha::Patrons->find( $borrower->{borrowernumber} ); |
2330 |
my ($new_debarment_str, $is_a_reminder); |
2331 |
if ( $borrower->{debarred} eq $patron->is_debarred ) { |
2332 |
$is_a_reminder = 1; |
2333 |
$new_debarment_str = $borrower->{debarred}; |
2334 |
} else { |
2335 |
$new_debarment_str = $new_debar_dt->ymd(); |
2336 |
} |
2337 |
# FIXME Should return a DateTime object |
2338 |
return $new_debarment_str, $is_a_reminder; |
2339 |
} |
2340 |
|
2330 |
=head2 _FixOverduesOnReturn |
2341 |
=head2 _FixOverduesOnReturn |
2331 |
|
2342 |
|
2332 |
&_FixOverduesOnReturn($borrowernumber, $itemnumber, $exemptfine, $status); |
2343 |
&_FixOverduesOnReturn($borrowernumber, $itemnumber, $exemptfine, $status); |
2333 |
- |
|
|