Lines 39-45
use C4::Context;
Link Here
|
39 |
use C4::Dates qw/format_date/; |
39 |
use C4::Dates qw/format_date/; |
40 |
use C4::Debug; |
40 |
use C4::Debug; |
41 |
use C4::Letters; |
41 |
use C4::Letters; |
42 |
use C4::Overdues qw(GetFine); |
42 |
use C4::Overdues qw(GetFine GetOverdueMessageTransportTypes); |
43 |
use C4::Budgets qw(GetCurrency); |
43 |
use C4::Budgets qw(GetCurrency); |
44 |
|
44 |
|
45 |
=head1 NAME |
45 |
=head1 NAME |
Lines 430-435
END_SQL
Link Here
|
430 |
# my $outfile = 'overdues_' . ( $mybranch || $branchcode || 'default' ); |
430 |
# my $outfile = 'overdues_' . ( $mybranch || $branchcode || 'default' ); |
431 |
while ( my $overdue_rules = $rqoverduerules->fetchrow_hashref ) { |
431 |
while ( my $overdue_rules = $rqoverduerules->fetchrow_hashref ) { |
432 |
PERIOD: foreach my $i ( 1 .. 3 ) { |
432 |
PERIOD: foreach my $i ( 1 .. 3 ) { |
|
|
433 |
my $print_sent = 0; # We never sent a print notice |
433 |
|
434 |
|
434 |
$verbose and warn "branch '$branchcode', pass $i\n"; |
435 |
$verbose and warn "branch '$branchcode', pass $i\n"; |
435 |
my $mindays = $overdue_rules->{"delay$i"}; # the notice will be sent after mindays days (grace period) |
436 |
my $mindays = $overdue_rules->{"delay$i"}; # the notice will be sent after mindays days (grace period) |
Lines 451-457
END_SQL
Link Here
|
451 |
# <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode> <country> |
452 |
# <date> <itemcount> <firstname> <lastname> <address1> <address2> <address3> <city> <postcode> <country> |
452 |
|
453 |
|
453 |
my $borrower_sql = <<'END_SQL'; |
454 |
my $borrower_sql = <<'END_SQL'; |
454 |
SELECT distinct(issues.borrowernumber), firstname, surname, address, address2, city, zipcode, country, email, emailpro, B_email |
455 |
SELECT distinct(issues.borrowernumber), firstname, surname, address, address2, city, zipcode, country, email, emailpro, B_email, smsalertnumber |
455 |
FROM issues,borrowers,categories |
456 |
FROM issues,borrowers,categories |
456 |
WHERE issues.borrowernumber=borrowers.borrowernumber |
457 |
WHERE issues.borrowernumber=borrowers.borrowernumber |
457 |
AND borrowers.categorycode=categories.categorycode |
458 |
AND borrowers.categorycode=categories.categorycode |
Lines 540-604
END_SQL
Link Here
|
540 |
} |
541 |
} |
541 |
$sth2->finish; |
542 |
$sth2->finish; |
542 |
|
543 |
|
543 |
$letter = parse_letter( |
544 |
my @message_transport_types = @{ GetOverdueMessageTransportTypes( $branchcode, $overdue_rules->{categorycode}, $i) }; |
544 |
{ letter_code => $overdue_rules->{"letter$i"}, |
545 |
@message_transport_types = @{ GetOverdueMessageTransportTypes( "", $overdue_rules->{categorycode}, $i) } |
545 |
borrowernumber => $borrowernumber, |
546 |
unless @message_transport_types; |
546 |
branchcode => $branchcode, |
|
|
547 |
items => \@items, |
548 |
substitute => { # this appears to be a hack to overcome incomplete features in this code. |
549 |
bib => $branch_details->{'branchname'}, # maybe 'bib' is a typo for 'lib<rary>'? |
550 |
'items.content' => $titles, |
551 |
'count' => $itemcount, |
552 |
} |
553 |
} |
554 |
); |
555 |
unless ($letter) { |
556 |
$verbose and warn "Message '$overdue_rules->{letter$i}' content not found"; |
557 |
|
547 |
|
558 |
# might as well skip while PERIOD, no other borrowers are going to work. |
548 |
unless ( @message_transport_types ) { |
559 |
# FIXME : Does this mean a letter must be defined in order to trigger a debar ? |
549 |
@message_transport_types = @{ GetOverdueMessageTransportTypes( q{}, $overdue_rules->{categorycode}, $i) }; |
560 |
next PERIOD; |
|
|
561 |
} |
562 |
|
563 |
if ( $exceededPrintNoticesMaxLines ) { |
564 |
$letter->{'content'} .= "List too long for form; please check your account online for a complete list of your overdue items."; |
565 |
} |
550 |
} |
566 |
|
551 |
|
567 |
my @misses = grep { /./ } map { /^([^>]*)[>]+/; ( $1 || '' ); } split /\</, $letter->{'content'}; |
552 |
for my $mtt ( @message_transport_types ) { |
568 |
if (@misses) { |
553 |
|
569 |
$verbose and warn "The following terms were not matched and replaced: \n\t" . join "\n\t", @misses; |
554 |
my $letter = parse_letter( |
570 |
} |
555 |
{ letter_code => $overdue_rules->{"letter$i"}, |
571 |
$letter->{'content'} =~ s/\<[^<>]*?\>//g; # Now that we've warned about them, remove them. |
556 |
borrowernumber => $borrowernumber, |
572 |
$letter->{'content'} =~ s/\<[^<>]*?\>//g; # 2nd pass for the double nesting. |
557 |
branchcode => $branchcode, |
573 |
|
558 |
items => \@items, |
574 |
if ( !$nomail && scalar @emails_to_use ) { |
559 |
substitute => { # this appears to be a hack to overcome incomplete features in this code. |
575 |
C4::Letters::EnqueueLetter( |
560 |
bib => $branch_details->{'branchname'}, # maybe 'bib' is a typo for 'lib<rary>'? |
576 |
{ letter => $letter, |
561 |
'items.content' => $titles, |
577 |
borrowernumber => $borrowernumber, |
562 |
'count' => $itemcount, |
578 |
message_transport_type => 'email', |
563 |
}, |
579 |
from_address => $admin_email_address, |
564 |
message_transport_type => $mtt, |
580 |
to_address => join(',', @emails_to_use), |
|
|
581 |
} |
565 |
} |
582 |
); |
566 |
); |
583 |
} else { |
567 |
unless ($letter) { |
584 |
# if not sent by email then print |
568 |
$verbose and warn "Message '$overdue_rules->{letter$i}' content not found"; |
585 |
push @output_chunks, |
569 |
|
586 |
prepare_letter_for_printing( |
570 |
# might as well skip while PERIOD, no other borrowers are going to work. |
587 |
{ letter => $letter, |
571 |
# FIXME : Does this mean a letter must be defined in order to trigger a debar ? |
588 |
borrowernumber => $borrowernumber, |
572 |
next PERIOD; |
589 |
firstname => $data->{'firstname'}, |
573 |
} |
590 |
lastname => $data->{'surname'}, |
574 |
|
591 |
address1 => $data->{'address'}, |
575 |
if ( $exceededPrintNoticesMaxLines ) { |
592 |
address2 => $data->{'address2'}, |
576 |
$letter->{'content'} .= "List too long for form; please check your account online for a complete list of your overdue items."; |
593 |
city => $data->{'city'}, |
577 |
} |
594 |
postcode => $data->{'zipcode'}, |
578 |
|
595 |
country => $data->{'country'}, |
579 |
my @misses = grep { /./ } map { /^([^>]*)[>]+/; ( $1 || '' ); } split /\</, $letter->{'content'}; |
596 |
email => $notice_email, |
580 |
if (@misses) { |
597 |
itemcount => $itemcount, |
581 |
$verbose and warn "The following terms were not matched and replaced: \n\t" . join "\n\t", @misses; |
598 |
titles => $titles, |
582 |
} |
599 |
outputformat => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : '', |
583 |
$letter->{'content'} =~ s/\<[^<>]*?\>//g; # Now that we've warned about them, remove them. |
|
|
584 |
$letter->{'content'} =~ s/\<[^<>]*?\>//g; # 2nd pass for the double nesting. |
585 |
|
586 |
if ($nomail) { |
587 |
push @output_chunks, |
588 |
prepare_letter_for_printing( |
589 |
{ letter => $letter, |
590 |
borrowernumber => $borrowernumber, |
591 |
firstname => $data->{'firstname'}, |
592 |
lastname => $data->{'surname'}, |
593 |
address1 => $data->{'address'}, |
594 |
address2 => $data->{'address2'}, |
595 |
city => $data->{'city'}, |
596 |
postcode => $data->{'zipcode'}, |
597 |
country => $data->{'country'}, |
598 |
email => $notice_email, |
599 |
itemcount => $itemcount, |
600 |
titles => $titles, |
601 |
outputformat => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : '', |
602 |
} |
603 |
); |
604 |
} else { |
605 |
if ( ($mtt eq 'email' and not scalar @emails_to_use) or ($mtt eq 'sms' and not $data->{smsalertnumber}) ) { |
606 |
# email or sms is requested but not exist, do a print. |
607 |
$mtt = 'print'; |
600 |
} |
608 |
} |
601 |
); |
609 |
unless ( $mtt eq 'print' and $print_sent == 1 ) { |
|
|
610 |
# Just sent a print if not already done. |
611 |
C4::Letters::EnqueueLetter( |
612 |
{ letter => $letter, |
613 |
borrowernumber => $borrowernumber, |
614 |
message_transport_type => $mtt, |
615 |
from_address => $admin_email_address, |
616 |
to_address => join(',', @emails_to_use), |
617 |
} |
618 |
); |
619 |
# A print notice should be sent only once per overdue level. |
620 |
# Without this check, a print could be sent twice or more if the library checks sms and email and print and the patron has no email or sms number. |
621 |
$print_sent = 1 if $mtt eq 'print'; |
622 |
} |
623 |
} |
602 |
} |
624 |
} |
603 |
} |
625 |
} |
604 |
$sth->finish; |
626 |
$sth->finish; |
Lines 722-727
sub parse_letter {
Link Here
|
722 |
tables => \%tables, |
744 |
tables => \%tables, |
723 |
substitute => $substitute, |
745 |
substitute => $substitute, |
724 |
repeat => { item => \@item_tables }, |
746 |
repeat => { item => \@item_tables }, |
|
|
747 |
message_transport_type => $params->{message_transport_type}, |
725 |
); |
748 |
); |
726 |
} |
749 |
} |
727 |
|
750 |
|
Lines 751-756
sub prepare_letter_for_printing {
Link Here
|
751 |
} |
774 |
} |
752 |
|
775 |
|
753 |
my $return; |
776 |
my $return; |
|
|
777 |
chomp $params->{titles}; |
754 |
if ( exists $params->{'outputformat'} && $params->{'outputformat'} eq 'csv' ) { |
778 |
if ( exists $params->{'outputformat'} && $params->{'outputformat'} eq 'csv' ) { |
755 |
if ($csv->combine( |
779 |
if ($csv->combine( |
756 |
$params->{'firstname'}, $params->{'lastname'}, $params->{'address1'}, $params->{'address2'}, $params->{'postcode'}, |
780 |
$params->{'firstname'}, $params->{'lastname'}, $params->{'address1'}, $params->{'address2'}, $params->{'postcode'}, |
757 |
- |
|
|