@@ -, +, @@ guarantor --- C4/Letters.pm | 11 +++-- C4/Members.pm | 27 +++++----- ..._12532-EnableRedirectGuaranteeEmail_syspref.sql | 2 + installer/data/mysql/sysprefs.sql | 1 + .../prog/en/modules/admin/preferences/patrons.pref | 6 +++ t/db_dependent/Letters.t | 57 +++++++++++++++++++++- t/db_dependent/Members.t | 24 ++++++++- 7 files changed, 107 insertions(+), 21 deletions(-) create mode 100644 installer/data/mysql/atomicupdate/bug_12532-EnableRedirectGuaranteeEmail_syspref.sql mode change 100644 => 100755 t/db_dependent/Letters.t --- a/C4/Letters.pm +++ a/C4/Letters.pm @@ -1131,18 +1131,18 @@ sub _send_message_by_email { my ($username, $password, $method) = @_; my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} ); + my $useGurantor = $member->{'guarantorid'} && C4::Context->preference("EnableRedirectGuaranteeEmail"); my $to_address = $message->{'to_address'}; - unless ($to_address) { + if ($useGurantor || !$to_address) { unless ($member) { - warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})"; + warn "FAIL: INVALID borrowernumber ($message->{borrowernumber})"; _set_message_status( { message_id => $message->{'message_id'}, status => 'failed' } ); return; } $to_address = C4::Members::GetNoticeEmailAddress( $message->{'borrowernumber'} ); unless ($to_address) { - # warn "FAIL: No 'to_address' and no email for " . ($member->{surname} ||'') . ", borrowernumber ($message->{borrowernumber})"; - # warning too verbose for this more common case? + warn "FAIL: No 'to_address' and no email for " . ($member->{surname} ||'') . ", borrowernumber ($message->{borrowernumber})"; _set_message_status( { message_id => $message->{'message_id'}, status => 'failed' } ); return; @@ -1182,7 +1182,8 @@ sub _send_message_by_email { $sendmail_params{ Bcc } = $bcc; } - _update_message_to_address($message->{'message_id'},$to_address) unless $message->{to_address}; #if initial message address was empty, coming here means that a to address was found and queue should be updated + #if initial message address was empty or modified, coming here means that a to address was found and queue should be updated + _update_message_to_address($message->{'message_id'},$to_address) if !$message->{to_address} || $message->{to_address} ne $to_address; if ( sendmail( %sendmail_params ) ) { _set_message_status( { message_id => $message->{'message_id'}, status => 'sent' } ); --- a/C4/Members.pm +++ a/C4/Members.pm @@ -1441,22 +1441,21 @@ Returns the empty string if no email address. sub GetNoticeEmailAddress { my $borrowernumber = shift; + my $dbh = C4::Context->dbh(); + + my $member = C4::Members::GetMember( 'borrowernumber' => $borrowernumber ); + + # Determine who we send the email to. + my $guarantorid = $member->{'guarantorid'}; + my $useGuarantor = $guarantorid && C4::Context->preference("EnableRedirectGuaranteeEmail"); + + my $recipient = $useGuarantor ? C4::Members::GetMember( 'borrowernumber' => $guarantorid ) : $member; - my $which_address = C4::Context->preference("AutoEmailPrimaryAddress"); # if syspref is set to 'first valid' (value == OFF), look up email address - if ( $which_address eq 'OFF' ) { - return GetFirstValidEmailAddress($borrowernumber); - } - # specified email address field - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare( qq{ - SELECT $which_address AS primaryemail - FROM borrowers - WHERE borrowernumber=? - } ); - $sth->execute($borrowernumber); - my $data = $sth->fetchrow_hashref; - return $data->{'primaryemail'} || ''; + my $which_address = C4::Context->preference("AutoEmailPrimaryAddress"); + my $to_address = $which_address eq 'OFF' ? GetFirstValidEmailAddress($recipient->{'borrowernumber'}) : $recipient->{ $which_address }; + + return $to_address || ''; } =head2 GetExpiryDate --- a/installer/data/mysql/atomicupdate/bug_12532-EnableRedirectGuaranteeEmail_syspref.sql +++ a/installer/data/mysql/atomicupdate/bug_12532-EnableRedirectGuaranteeEmail_syspref.sql @@ -0,0 +1,2 @@ +INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) +VALUES ('EnableRedirectGuaranteeEmail','0',NULL,'Enable the ability to redirect guarantee email messages to guarantor.','YesNo'); --- a/installer/data/mysql/sysprefs.sql +++ a/installer/data/mysql/sysprefs.sql @@ -119,6 +119,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('emailLibrarianWhenHoldIsPlaced','0',NULL,'If ON, emails the librarian whenever a hold is placed','YesNo'), ('EnableBorrowerFiles','0',NULL,'If enabled, allows librarians to upload and attach arbitrary files to a borrower record.','YesNo'), ('EnableOpacSearchHistory','1','YesNo','Enable or disable opac search history',''), +('EnableRedirectGuaranteeEmail', '0', NULL, 'Enable the ability to redirect guarantee email messages to guarantor.', 'YesNo'), ('EnableSearchHistory','0','','Enable or disable search history','YesNo'), ('EnhancedMessagingPreferences','0','','If ON, allows patrons to select to receive additional messages about items due or nearly due.','YesNo'), ('expandedSearchOption','0',NULL,'If ON, set advanced search to be expanded by default','YesNo'), --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref @@ -138,6 +138,12 @@ Patrons: yes: Allow no: "Don't allow" - librarians to discharge borrowers and borrowers to request a discharge. + - + - pref: EnableRedirectGuaranteeEmail + choices: + yes: Do + no: "Don't" + - enable the ability to redirect guarantee email messages to guarantor. All email message placed in message_queue table will be affected. "Norwegian patron database": - - pref: NorwegianPatronDBEnable --- a/t/db_dependent/Letters.t +++ a/t/db_dependent/Letters.t @@ -18,7 +18,7 @@ # along with Koha; if not, see . use Modern::Perl; -use Test::More tests => 58; +use Test::More tests => 64; use Test::MockModule; use Test::Warn; @@ -132,6 +132,61 @@ is( 'message marked failed if tried to send SMS message for borrower with no smsalertnumber set (bug 11208)' ); +#Test guarantee-guarantor email redirection +my ($GUARANTEE_EMAIL, $GUARANTOR_EMAIL) = qw| guarantee@example.com guarantor@example.com |; +my $guarantor = { + email => $GUARANTOR_EMAIL, + categorycode => 'PT', + branchcode => 'CPL', + surname => "Guarantor" +}; +$guarantor->{'borrowernumber'} = AddMember(%$guarantor); +my $guarantee = { + guarantorid => $guarantor->{'borrowernumber'}, + email => $GUARANTEE_EMAIL, + categorycode => 'PT', + branchcode => 'CPL', + surname => "Guarantee" +}; +$guarantee->{'borrowernumber'} = AddMember(%$guarantee); + +my $GUARANTEE_TO_ADDRESS = 'toto@exemple.com'; +my $guarantee_message = { + borrowernumber => $guarantee->{'borrowernumber'}, + message_transport_type => 'email', + to_address => $GUARANTEE_TO_ADDRESS, + from_address => 'from@example.com', + letter => $my_message->{'letter'} +}; + +sub SendToGuarantor { + my ($useGuarantor, $message) = @_; + C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'OFF' ); + C4::Context->set_preference( 'EnableRedirectGuaranteeEmail', $useGuarantor ); + C4::Context->clear_syspref_cache(); + my $id = C4::Letters::EnqueueLetter($message); + C4::Letters::SendQueuedMessages(); + my $result = $dbh->selectrow_hashref( 'SELECT to_address, status FROM message_queue WHERE message_id = ?', undef, ($id) ); + return $result; +} +my $result = SendToGuarantor(0,$guarantee_message); +is($result->{'status'}, "sent", "With EnableRedirectGuaranteeEmail off, message is sent."); +is($result->{'to_address'}, $GUARANTEE_TO_ADDRESS, "With EnableRedirectGuaranteeEmail off, Message is sent to the specified to_address."); + +$result = SendToGuarantor(1,$guarantee_message); +is($result->{'status'}, "sent", "With EnableRedirectGuaranteeEmail on, message is sent."); +is($result->{'to_address'}, $GUARANTOR_EMAIL, "With EnableRedirectGuaranteeEmail on, Message is sent to the guarantor's email address."); + +$guarantor->{'email'} = undef; +ModMember(%$guarantor); +$result = SendToGuarantor(1,$guarantee_message); +is($result->{'status'}, "failed", "With EnableRedirectGuaranteeEmail on, message fails if guarantor has no address."); + +$guarantee->{'guarantorid'} = undef; +ModMember(%$guarantee); +$result = SendToGuarantor(1,$guarantee_message); +is($result->{'to_address'}, $GUARANTEE_TO_ADDRESS, "With EnableRedirectGuaranteeEmail on, Message is sent to specicied to_address if he has no guarantor."); + # GetLetters my $letters = C4::Letters::GetLetters(); is( @$letters, 0, 'GetLetters returns the correct number of letters' ); --- a/t/db_dependent/Members.t +++ a/t/db_dependent/Members.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 61; +use Test::More tests => 63; use Test::MockModule; use Data::Dumper; use C4::Context; @@ -143,6 +143,7 @@ is ($checkcardnum, "2", "Card number is too long"); +C4::Context->set_preference( 'EnableRedirectGuaranteeEmail', 0 ); C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'OFF' ); C4::Context->clear_syspref_cache(); @@ -155,6 +156,27 @@ C4::Context->clear_syspref_cache(); $notice_email = GetNoticeEmailAddress($member->{'borrowernumber'}); is ($notice_email, $EMAILPRO, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is emailpro"); +#Test guarantee-guarantor email redirection +my $GUARANTEE_EMAIL = 'guanrantee@email.test'; +my $guarantee = { + guarantorid => $member->{'borrowernumber'}, + emailpro => $GUARANTEE_EMAIL, + categorycode => $CATEGORYCODE, + branchcode => $BRANCHCODE, + surname => "surname" +}; +$guarantee->{'borrowernumber'} = AddMember(%$guarantee); + +$notice_email = GetNoticeEmailAddress($guarantee->{'borrowernumber'}); +is ($notice_email, $GUARANTEE_EMAIL, "GetNoticeEmailAddress returns correct value when EnableRedirectGuaranteeEmail is disabled"); + +C4::Context->set_preference( 'EnableRedirectGuaranteeEmail', 1 ); +C4::Context->clear_syspref_cache(); + +$notice_email = GetNoticeEmailAddress($guarantee->{'borrowernumber'}); +is ($notice_email, $EMAILPRO, "GetNoticeEmailAddress returns correct value when EnableRedirectGuaranteeEmail is activated"); + + ok(!$member->{is_expired}, "GetMemberDetails() indicates that patron is not expired"); ModMember(borrowernumber => $member->{'borrowernumber'}, dateexpiry => '2001-01-1'); $member = GetMemberDetails($member->{'borrowernumber'}); --