Lines 464-469
if ( defined $htmlfilename ) {
Link Here
|
464 |
|
464 |
|
465 |
my %already_queued; |
465 |
my %already_queued; |
466 |
my %seen = map { $_ => 1 } @branches; |
466 |
my %seen = map { $_ => 1 } @branches; |
|
|
467 |
|
468 |
# Work through branches |
467 |
foreach my $branchcode (@branches) { |
469 |
foreach my $branchcode (@branches) { |
468 |
my $calendar; |
470 |
my $calendar; |
469 |
if ( C4::Context->preference('OverdueNoticeCalendar') ) { |
471 |
if ( C4::Context->preference('OverdueNoticeCalendar') ) { |
Lines 521-537
END_SQL
Link Here
|
521 |
@itemtypes = Koha::ItemTypes->search()->get_column('itemtype'); |
523 |
@itemtypes = Koha::ItemTypes->search()->get_column('itemtype'); |
522 |
} |
524 |
} |
523 |
|
525 |
|
|
|
526 |
# Work through category and itemtype combinations to catch overdue rules for each |
524 |
for my $category (@categories) { |
527 |
for my $category (@categories) { |
525 |
for my $itemtype (@itemtypes) { |
528 |
for my $itemtype (@itemtypes) { |
526 |
my $i = 0; |
529 |
my $i = 0; |
|
|
530 |
|
531 |
# Work through triggers until we run out of rules |
527 |
PERIOD: while (1) { |
532 |
PERIOD: while (1) { |
528 |
$i++; |
533 |
$i++; |
529 |
my $j = $i + 1; |
534 |
my $ii = $i + 1; |
530 |
my $overdue_rules = Koha::CirculationRules->get_effective_rules( |
535 |
my $overdue_rules = Koha::CirculationRules->get_effective_rules( |
531 |
{ |
536 |
{ |
532 |
rules => [ |
537 |
rules => [ |
533 |
"overdue_$i" . '_delay', "overdue_$i" . '_notice', "overdue_$i" . '_mtt', |
538 |
"overdue_$i" . '_delay', "overdue_$i" . '_notice', "overdue_$i" . '_mtt', |
534 |
"overdue_$i" . '_restrict', "overdue_$j" . '_delay' |
539 |
"overdue_$i" . '_restrict', "overdue_$ii" . '_delay' |
535 |
], |
540 |
], |
536 |
categorycode => $category, |
541 |
categorycode => $category, |
537 |
branchcode => $branchcode, |
542 |
branchcode => $branchcode, |
Lines 548-555
END_SQL
Link Here
|
548 |
$overdue_rules->{ "overdue_$i" . '_delay' } |
553 |
$overdue_rules->{ "overdue_$i" . '_delay' } |
549 |
; # the notice will be sent after mindays days (grace period) |
554 |
; # the notice will be sent after mindays days (grace period) |
550 |
my $maxdays = ( |
555 |
my $maxdays = ( |
551 |
$overdue_rules->{ "overdue_$j" . '_delay' } |
556 |
$overdue_rules->{ "overdue_$ii" . '_delay' } |
552 |
? $overdue_rules->{ "overdue_$j" . '_delay' } - 1 |
557 |
? $overdue_rules->{ "overdue_$ii" . '_delay' } - 1 |
553 |
: ($MAX) |
558 |
: ($MAX) |
554 |
); # issues being more than maxdays late are managed somewhere else. (borrower probably suspended) |
559 |
); # issues being more than maxdays late are managed somewhere else. (borrower probably suspended) |
555 |
|
560 |
|
Lines 569-574
END_SQL
Link Here
|
569 |
# itemcount is interpreted here as the number of items in the overdue range defined by the current notice or all overdues < max if(-list-all). |
574 |
# itemcount is interpreted here as the number of items in the overdue range defined by the current notice or all overdues < max if(-list-all). |
570 |
# <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode> <country> |
575 |
# <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode> <country> |
571 |
|
576 |
|
|
|
577 |
# Fetch all overdue issues where the item is not lost and the borrower category wants overdue notices grouping by borrower |
572 |
my $borrower_sql = <<"END_SQL"; |
578 |
my $borrower_sql = <<"END_SQL"; |
573 |
SELECT issues.borrowernumber, firstname, surname, address, address2, city, zipcode, country, email, emailpro, B_email, smsalertnumber, phone, cardnumber, date_due |
579 |
SELECT issues.borrowernumber, firstname, surname, address, address2, city, zipcode, country, email, emailpro, B_email, smsalertnumber, phone, cardnumber, date_due |
574 |
FROM issues,borrowers,categories,items |
580 |
FROM issues,borrowers,categories,items |
Lines 593-599
END_SQL
Link Here
|
593 |
} |
599 |
} |
594 |
$borrower_sql .= ' AND categories.overduenoticerequired=1 ORDER BY issues.borrowernumber'; |
600 |
$borrower_sql .= ' AND categories.overduenoticerequired=1 ORDER BY issues.borrowernumber'; |
595 |
|
601 |
|
596 |
# $sth gets borrower info iff at least one overdue item has triggered the overdue action. |
602 |
# $sth gets borrower info if at least one overdue item has triggered the overdue action. |
597 |
my $sth = $dbh->prepare($borrower_sql); |
603 |
my $sth = $dbh->prepare($borrower_sql); |
598 |
$sth->execute(@borrower_parameters); |
604 |
$sth->execute(@borrower_parameters); |
599 |
|
605 |
|
Lines 608-613
END_SQL
Link Here
|
608 |
} |
614 |
} |
609 |
$verbose and warn sprintf "Found %s borrowers with overdues\n", $sth->rows; |
615 |
$verbose and warn sprintf "Found %s borrowers with overdues\n", $sth->rows; |
610 |
my $borrowernumber; |
616 |
my $borrowernumber; |
|
|
617 |
|
618 |
# Iterate over all overdue issues |
611 |
while ( my $data = $sth->fetchrow_hashref ) { |
619 |
while ( my $data = $sth->fetchrow_hashref ) { |
612 |
|
620 |
|
613 |
# check the borrower has at least one item that matches |
621 |
# check the borrower has at least one item that matches |
Lines 640-646
END_SQL
Link Here
|
640 |
next; |
648 |
next; |
641 |
} |
649 |
} |
642 |
$borrowernumber = $data->{'borrowernumber'}; |
650 |
$borrowernumber = $data->{'borrowernumber'}; |
|
|
651 |
|
652 |
# Skip duplicate borrowers as we'll have already handled them |
643 |
next if ( $patron_homelibrary && $already_queued{"$borrowernumber$i"} ); |
653 |
next if ( $patron_homelibrary && $already_queued{"$borrowernumber$i"} ); |
|
|
654 |
|
644 |
my $borr = sprintf( |
655 |
my $borr = sprintf( |
645 |
"%s%s%s (%s)", |
656 |
"%s%s%s (%s)", |
646 |
$data->{'surname'} || '', |
657 |
$data->{'surname'} || '', |
Lines 708-713
END_SQL
Link Here
|
708 |
|
719 |
|
709 |
my $j = 0; |
720 |
my $j = 0; |
710 |
my $exceededPrintNoticesMaxLines = 0; |
721 |
my $exceededPrintNoticesMaxLines = 0; |
|
|
722 |
|
723 |
# Get each overdue item for this patron |
711 |
while ( my $item_info = $sth2->fetchrow_hashref() ) { |
724 |
while ( my $item_info = $sth2->fetchrow_hashref() ) { |
712 |
if ( C4::Context->preference('OverdueNoticeCalendar') ) { |
725 |
if ( C4::Context->preference('OverdueNoticeCalendar') ) { |
713 |
$days_between = |
726 |
$days_between = |
714 |
- |
|
|