Lines 463-468
elsif ( defined $text_filename ) {
Link Here
|
463 |
|
463 |
|
464 |
my %already_queued; |
464 |
my %already_queued; |
465 |
my %seen = map { $_ => 1 } @branches; |
465 |
my %seen = map { $_ => 1 } @branches; |
|
|
466 |
|
467 |
# Work through branches |
466 |
foreach my $branchcode (@branches) { |
468 |
foreach my $branchcode (@branches) { |
467 |
my $calendar; |
469 |
my $calendar; |
468 |
if ( C4::Context->preference('OverdueNoticeCalendar') ) { |
470 |
if ( C4::Context->preference('OverdueNoticeCalendar') ) { |
Lines 520-536
END_SQL
Link Here
|
520 |
@itemtypes = Koha::ItemTypes->search()->get_column('itemtype'); |
522 |
@itemtypes = Koha::ItemTypes->search()->get_column('itemtype'); |
521 |
} |
523 |
} |
522 |
|
524 |
|
|
|
525 |
# Work through category and itemtype combinations to catch overdue rules for each |
523 |
for my $category (@categories) { |
526 |
for my $category (@categories) { |
524 |
for my $itemtype (@itemtypes) { |
527 |
for my $itemtype (@itemtypes) { |
525 |
my $i = 0; |
528 |
my $i = 0; |
|
|
529 |
# Work through triggers until we run out of rules |
526 |
PERIOD: while (1) { |
530 |
PERIOD: while (1) { |
527 |
$i++; |
531 |
$i++; |
528 |
my $j = $i + 1; |
532 |
my $ii = $i + 1; |
529 |
my $overdue_rules = Koha::CirculationRules->get_effective_rules( |
533 |
my $overdue_rules = Koha::CirculationRules->get_effective_rules( |
530 |
{ |
534 |
{ |
531 |
rules => [ |
535 |
rules => [ |
532 |
"overdue_$i" . '_delay', "overdue_$i" . '_notice', "overdue_$i" . '_mtt', |
536 |
"overdue_$i" . '_delay', "overdue_$i" . '_notice', "overdue_$i" . '_mtt', |
533 |
"overdue_$i" . '_restrict', "overdue_$j" . '_delay' |
537 |
"overdue_$i" . '_restrict', "overdue_$ii" . '_delay' |
534 |
], |
538 |
], |
535 |
categorycode => $category, |
539 |
categorycode => $category, |
536 |
branchcode => $branchcode, |
540 |
branchcode => $branchcode, |
Lines 546-553
END_SQL
Link Here
|
546 |
my $mindays = |
550 |
my $mindays = |
547 |
$overdue_rules->{ "overdue_$i" . '_delay' }; # the notice will be sent after mindays days (grace period) |
551 |
$overdue_rules->{ "overdue_$i" . '_delay' }; # the notice will be sent after mindays days (grace period) |
548 |
my $maxdays = ( |
552 |
my $maxdays = ( |
549 |
$overdue_rules->{ "overdue_$j" . '_delay' } |
553 |
$overdue_rules->{ "overdue_$ii" . '_delay' } |
550 |
? $overdue_rules->{ "overdue_$j" . '_delay' } - 1 |
554 |
? $overdue_rules->{ "overdue_$ii" . '_delay' } - 1 |
551 |
: ($MAX) |
555 |
: ($MAX) |
552 |
); # issues being more than maxdays late are managed somewhere else. (borrower probably suspended) |
556 |
); # issues being more than maxdays late are managed somewhere else. (borrower probably suspended) |
553 |
|
557 |
|
Lines 565-570
END_SQL
Link Here
|
565 |
# 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). |
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). |
566 |
# <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode> <country> |
570 |
# <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode> <country> |
567 |
|
571 |
|
|
|
572 |
# Fetch all overdue issues where the item is not lost and the borrower category wants overdue notices grouping by borrower |
568 |
my $borrower_sql = <<"END_SQL"; |
573 |
my $borrower_sql = <<"END_SQL"; |
569 |
SELECT issues.borrowernumber, firstname, surname, address, address2, city, zipcode, country, email, emailpro, B_email, smsalertnumber, phone, cardnumber, date_due |
574 |
SELECT issues.borrowernumber, firstname, surname, address, address2, city, zipcode, country, email, emailpro, B_email, smsalertnumber, phone, cardnumber, date_due |
570 |
FROM issues,borrowers,categories,items |
575 |
FROM issues,borrowers,categories,items |
Lines 589-595
END_SQL
Link Here
|
589 |
} |
594 |
} |
590 |
$borrower_sql .= ' AND categories.overduenoticerequired=1 ORDER BY issues.borrowernumber'; |
595 |
$borrower_sql .= ' AND categories.overduenoticerequired=1 ORDER BY issues.borrowernumber'; |
591 |
|
596 |
|
592 |
# $sth gets borrower info iff at least one overdue item has triggered the overdue action. |
597 |
# $sth gets borrower info if at least one overdue item has triggered the overdue action. |
593 |
my $sth = $dbh->prepare($borrower_sql); |
598 |
my $sth = $dbh->prepare($borrower_sql); |
594 |
$sth->execute(@borrower_parameters); |
599 |
$sth->execute(@borrower_parameters); |
595 |
|
600 |
|
Lines 600-605
END_SQL
Link Here
|
600 |
} |
605 |
} |
601 |
$verbose and warn sprintf "Found %s borrowers with overdues\n", $sth->rows; |
606 |
$verbose and warn sprintf "Found %s borrowers with overdues\n", $sth->rows; |
602 |
my $borrowernumber; |
607 |
my $borrowernumber; |
|
|
608 |
# Iterate over all overdue issues |
603 |
while ( my $data = $sth->fetchrow_hashref ) { |
609 |
while ( my $data = $sth->fetchrow_hashref ) { |
604 |
|
610 |
|
605 |
# check the borrower has at least one item that matches |
611 |
# check the borrower has at least one item that matches |
Lines 633-639
END_SQL
Link Here
|
633 |
next; |
639 |
next; |
634 |
} |
640 |
} |
635 |
$borrowernumber = $data->{'borrowernumber'}; |
641 |
$borrowernumber = $data->{'borrowernumber'}; |
|
|
642 |
|
643 |
# Skip duplicate borrowers as we'll have already handled them |
636 |
next if ( $patron_homelibrary && $already_queued{"$borrowernumber$i"} ); |
644 |
next if ( $patron_homelibrary && $already_queued{"$borrowernumber$i"} ); |
|
|
645 |
|
637 |
my $borr = sprintf( "%s%s%s (%s)", |
646 |
my $borr = sprintf( "%s%s%s (%s)", |
638 |
$data->{'surname'} || '', |
647 |
$data->{'surname'} || '', |
639 |
$data->{'firstname'} && $data->{'surname'} ? ', ' : '', |
648 |
$data->{'firstname'} && $data->{'surname'} ? ', ' : '', |
Lines 700-705
END_SQL
Link Here
|
700 |
|
709 |
|
701 |
my $j = 0; |
710 |
my $j = 0; |
702 |
my $exceededPrintNoticesMaxLines = 0; |
711 |
my $exceededPrintNoticesMaxLines = 0; |
|
|
712 |
# Get each overdue item for this patron |
703 |
while ( my $item_info = $sth2->fetchrow_hashref() ) { |
713 |
while ( my $item_info = $sth2->fetchrow_hashref() ) { |
704 |
if ( C4::Context->preference('OverdueNoticeCalendar') ) { |
714 |
if ( C4::Context->preference('OverdueNoticeCalendar') ) { |
705 |
$days_between = |
715 |
$days_between = |
706 |
- |
|
|