|
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 |
- |
|
|