@@ -, +, @@ --email is provided. --- C4/Branch.pm | 8 +++ C4/Letters.pm | 132 ++++++++++++++++++--------------------- C4/Members.pm | 45 +++++++------ C4/Message.pm | 26 -------- C4/Reserves.pm | 14 ++--- misc/cronjobs/overdue_notices.pl | 11 ++-- opac/opac-memberentry.pl | 4 +- opac/opac-shareshelf.pl | 10 ++- t/db_dependent/Branch.t | 26 ++++++-- t/db_dependent/Letters.t | 75 +++++++++++++++++++--- t/db_dependent/Members.t | 18 ++++-- 11 files changed, 208 insertions(+), 161 deletions(-) --- a/C4/Branch.pm +++ a/C4/Branch.pm @@ -20,6 +20,7 @@ use strict; #use warnings; FIXME - Bug 2505 require Exporter; use C4::Context; +use Koha::Database; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); @@ -568,6 +569,13 @@ sub GetBranchesCount { return $row->{'branches_count'}; } +sub GetBranchEmailFromBorrowernumber { + my ( $borrowernumber ) = @_; + return unless $borrowernumber; + my $rs = Koha::Database->new->schema->resultset('Borrower')->search({ borrowernumber => $borrowernumber }, {join => 'branchcode'}); + return $rs->next->branchcode->branchemail; +} + 1; __END__ --- a/C4/Letters.pm +++ a/C4/Letters.pm @@ -31,6 +31,7 @@ use C4::Log; use C4::SMS; use C4::Debug; use Koha::DateUtils; +use Koha::Database; use Date::Calc qw( Add_Delta_Days ); use Encode; use Carp; @@ -857,7 +858,6 @@ sub EnqueueLetter { my $params = shift or return; return unless exists $params->{'letter'}; -# return unless exists $params->{'borrowernumber'}; return unless exists $params->{'message_transport_type'}; my $content = $params->{letter}->{content}; @@ -877,28 +877,40 @@ sub EnqueueLetter { ); } - my $dbh = C4::Context->dbh(); - my $statement = << 'ENDSQL'; -INSERT INTO message_queue -( borrowernumber, subject, content, metadata, letter_code, message_transport_type, status, time_queued, to_address, from_address, content_type ) -VALUES -( ?, ?, ?, ?, ?, ?, ?, NOW(), ?, ?, ? ) -ENDSQL + my @to_addresses; + if ( $params->{to_address} ) { + @to_addresses = ( $params->{to_address} ); + } elsif ( $params->{borrowernumber} and $params->{message_transport_type} eq 'email' ) { + @to_addresses = @{ C4::Members::GetNoticeEmailAddresses( $params->{borrowernumber} ) }; + } - my $sth = $dbh->prepare($statement); - my $result = $sth->execute( - $params->{'borrowernumber'}, # borrowernumber - $params->{'letter'}->{'title'}, # subject - $params->{'letter'}->{'content'}, # content - $params->{'letter'}->{'metadata'} || '', # metadata - $params->{'letter'}->{'code'} || '', # letter_code - $params->{'message_transport_type'}, # message_transport_type - 'pending', # status - $params->{'to_address'}, # to_address - $params->{'from_address'}, # from_address - $params->{'letter'}->{'content-type'}, # content_type - ); - return $dbh->last_insert_id(undef,undef,'message_queue', undef); + my $from_address; + if ( $params->{from_address} ) { + $from_address = $params->{from_address}; + } elsif ( $params->{message_transport_type} eq 'email' ) { + if ( $params->{borrowernumber} ) { + $from_address = C4::Branch::GetBranchEmailFromBorrowernumber( $params->{borrowernumber} ); + } + + $from_address ||= C4::Context->preference('KohaAdminEmailAddress'); + } + + my $rs = Koha::Database->new->schema->resultset('MessageQueue'); + for my $to_address ( @to_addresses ) { + $rs->create({ + borrowernumber => $params->{borrowernumber}, + subject => $params->{letter}{title}, + content => $params->{letter}{content}, + metadata => ( $params->{letter}{metadata} || '' ), + letter_code => ( $params->{letter}{code} || ''), + message_transport_type => $params->{message_transport_type}, + status => 'pending', + to_address => $to_address, + from_address => $from_address, + content_type => $params->{letter}{'content-type'}, + }); + } + return scalar( @to_addresses ); } =head2 SendQueuedMessages ([$hashref]) @@ -923,6 +935,7 @@ sub SendQueuedMessages { if $params->{'verbose'} or $debug; # This is just begging for subclassing next MESSAGE if ( lc($message->{'message_transport_type'}) eq 'rss' ); + if ( lc( $message->{'message_transport_type'} ) eq 'email' ) { _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} ); } @@ -984,31 +997,24 @@ list of hashes, each has represents a message in the message queue. sub GetQueuedMessages { my $params = shift; - my $dbh = C4::Context->dbh(); - my $statement = << 'ENDSQL'; -SELECT message_id, borrowernumber, subject, content, message_transport_type, status, time_queued -FROM message_queue -ENDSQL - - my @query_params; - my @whereclauses; - if ( exists $params->{'borrowernumber'} ) { - push @whereclauses, ' borrowernumber = ? '; - push @query_params, $params->{'borrowernumber'}; - } - - if ( @whereclauses ) { - $statement .= ' WHERE ' . join( 'AND', @whereclauses ); - } - - if ( defined $params->{'limit'} ) { - $statement .= ' LIMIT ? '; - push @query_params, $params->{'limit'}; - } - - my $sth = $dbh->prepare( $statement ); - my $result = $sth->execute( @query_params ); - return $sth->fetchall_arrayref({}); + my $rs = Koha::Database->new->schema->resultset('MessageQueue')->search( + { + ( + $params->{borrowernumber} + ? ( borrowernumber => $params->{borrowernumber} ) + : () + ), + }, + { + ( + $params->{limit} + ? ( rows => $params->{limit} ) + : () + ), + }, + ); + $rs->result_class('DBIx::Class::ResultClass::HashRefInflator'); + return [ $rs->all ]; } =head2 GetMessageTransportTypes @@ -1114,22 +1120,14 @@ sub _send_message_by_email { my ($username, $password, $method) = @_; my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} ); - my $to_address = $message->{'to_address'}; - unless ($to_address) { - unless ($member) { - warn "FAIL: No 'to_address' and 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? - _set_message_status( { message_id => $message->{'message_id'}, - status => 'failed' } ); - return; - } + + unless ( $member and $message->{to_address} ) { + warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})" unless $member; + _set_message_status({ + message_id => $message->{'message_id'}, + status => 'failed' + }); + return; } my $utf8 = decode('MIME-Header', $message->{'subject'} ); @@ -1150,7 +1148,6 @@ sub _send_message_by_email { my $email = Koha::Email->new(); my %sendmail_params = $email->create_message_headers( { - to => $to_address, from => $message->{'from_address'} || $branch_email, replyto => $branch_replyto, sender => $branch_returnpath, @@ -1165,7 +1162,6 @@ 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 ( sendmail( %sendmail_params ) ) { _set_message_status( { message_id => $message->{'message_id'}, status => 'sent' } ); @@ -1239,12 +1235,6 @@ sub _send_message_by_sms { return $success; } -sub _update_message_to_address { - my ($id, $to)= @_; - my $dbh = C4::Context->dbh(); - $dbh->do('UPDATE message_queue SET to_address=? WHERE message_id=?',undef,($to,$id)); -} - sub _set_message_status { my $params = shift or return; --- a/C4/Members.pm +++ a/C4/Members.pm @@ -72,7 +72,7 @@ BEGIN { &getidcity &GetFirstValidEmailAddress - &GetNoticeEmailAddress + &GetNoticeEmailAddresses &GetAge &GetCities @@ -1542,33 +1542,38 @@ sub GetFirstValidEmailAddress { } } -=head2 GetNoticeEmailAddress +=head2 GetNoticeEmailAddresses - $email = GetNoticeEmailAddress($borrowernumber); + $emails = GetNoticeEmailAddresses( borrowernumber ); -Return the email address of borrower used for notices, given the borrowernumber. -Returns the empty string if no email address. +Return the email addresses of borrower used for notices, given the borrowernumber. +Returns an empty arrayref if no email address. =cut -sub GetNoticeEmailAddress { +sub GetNoticeEmailAddresses { my $borrowernumber = shift; - 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); + my $which_addresses = C4::Context->preference("AutoEmailPrimaryAddress"); + my @email_addresses; + for my $email_address_field ( split /,/, $which_addresses ) { + + # if syspref is set to 'first valid' (value == OFF), look up email address + if ( $email_address_field eq 'OFF' ) { + return [ GetFirstValidEmailAddress($borrowernumber) ]; + } + + # specified email address field + my $email_address = C4::Context->dbh->selectcol_arrayref( + qq| + SELECT $email_address_field AS email + FROM borrowers + WHERE borrowernumber = ? + |, {}, $borrowernumber + ); + push @email_addresses, $email_address->[0] if $email_address->[0]; } - # 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'} || ''; + return \@email_addresses; } =head2 GetExpiryDate --- a/C4/Message.pm +++ a/C4/Message.pm @@ -158,7 +158,6 @@ the message. sub enqueue { my ($class, $letter, $borrower, $transport) = @_; my $metadata = _metadata($letter); - my $to_address = _to_address($borrower, $transport); # Same as render_metadata my $format ||= sub { $_[0] || "" }; @@ -170,34 +169,9 @@ sub enqueue { letter => $letter, borrowernumber => $borrower->{borrowernumber}, message_transport_type => $transport, - to_address => $to_address, }); } -# based on message $transport, pick an appropriate address to send to -sub _to_address { - my ($borrower, $transport) = @_; - my $address; - if ($transport eq 'email') { - $address = $borrower->{email} - || $borrower->{emailpro} - || $borrower->{B_email}; - } elsif ($transport eq 'sms') { - $address = $borrower->{smsalertnumber} - || $borrower->{phone} - || $borrower->{phonepro} - || $borrower->{B_phone}; - } else { - warn "'$transport' is an unknown message transport."; - } - if (not defined $address) { - warn "An appropriate $transport address " - . "for borrower $borrower->{userid} " - . "could not be found."; - } - return $address; -} - # _metadata($letter) -- return the letter split into head/body/footer sub _metadata { my ($letter) = @_; --- a/C4/Reserves.pm +++ a/C4/Reserves.pm @@ -231,8 +231,7 @@ sub AddReserve { { letter => $letter, borrowernumber => $borrowernumber, message_transport_type => 'email', - from_address => $admin_email_address, - to_address => $admin_email_address, + to_address => $admin_email_address, } ); } @@ -1993,9 +1992,6 @@ sub _koha_notify_reserve { my $dbh = C4::Context->dbh; my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber); - - # Try to get the borrower's email address - my $to_address = C4::Members::GetNoticeEmailAddress($borrowernumber); my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( { borrowernumber => $borrowernumber, @@ -2012,8 +2008,6 @@ sub _koha_notify_reserve { my $reserve = $sth->fetchrow_hashref; my $branch_details = GetBranchDetail( $reserve->{'branchcode'} ); - my $admin_email_address = $branch_details->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress'); - my %letter_params = ( module => 'reserves', branchcode => $reserve->{branchcode}, @@ -2042,14 +2036,16 @@ sub _koha_notify_reserve { C4::Letters::EnqueueLetter( { letter => $letter, borrowernumber => $borrowernumber, - from_address => $admin_email_address, message_transport_type => $mtt, } ); }; + # Try to get the borrower's email addresses + my $to_addresses = C4::Members::GetNoticeEmailAddresses($borrowernumber); + while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) { next if ( - ( $mtt eq 'email' and not $to_address ) # No email address + ( $mtt eq 'email' and not @$to_addresses ) # No email address or ( $mtt eq 'sms' and not $borrower->{smsalertnumber} ) # No SMS number or ( $mtt eq 'phone' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl ); --- a/misc/cronjobs/overdue_notices.pl +++ a/misc/cronjobs/overdue_notices.pl @@ -555,8 +555,6 @@ END_SQL and warn "borrower $borr has items triggering level $i."; @emails_to_use = (); - my $notice_email = - C4::Members::GetNoticeEmailAddress($borrowernumber); unless ($nomail) { if (@emails) { foreach (@emails) { @@ -564,7 +562,9 @@ END_SQL } } else { - push @emails_to_use, $notice_email if ($notice_email); + my $notice_emails = + C4::Members::GetNoticeEmailAddresses($borrowernumber); + push @emails_to_use, @$notice_emails; } } @@ -699,7 +699,7 @@ END_SQL letternumber => $i, postcode => $data->{'zipcode'}, country => $data->{'country'}, - email => $notice_email, + email => $notice_emails, itemcount => $itemcount, titles => $titles, outputformat => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '', @@ -720,7 +720,7 @@ END_SQL city => $data->{'city'}, postcode => $data->{'zipcode'}, country => $data->{'country'}, - email => $notice_email, + email => ( scalar( @emails_to_use ) ? $emails_to_use[0] : undef ), itemcount => $itemcount, titles => $titles, outputformat => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '', @@ -733,7 +733,6 @@ END_SQL { letter => $letter, borrowernumber => $borrowernumber, message_transport_type => $mtt, - from_address => $admin_email_address, to_address => join(',', @emails_to_use), } ); --- a/opac/opac-memberentry.pl +++ a/opac/opac-memberentry.pl @@ -124,11 +124,9 @@ if ( $action eq 'create' ) { C4::Letters::EnqueueLetter( { + borrowernumber => $borrower{borrowernumber}, letter => $letter, message_transport_type => 'email', - to_address => $borrower{'email'}, - from_address => - C4::Context->preference('KohaAdminEmailAddress'), } ); } --- a/opac/opac-shareshelf.pl +++ a/opac/opac-shareshelf.pl @@ -133,8 +133,9 @@ sub show_accept { sub notify_owner { my ($param) = @_; - my $toaddr = C4::Members::GetNoticeEmailAddress( $param->{owner} ); - return if !$toaddr; + my $toaddr = C4::Members::GetNoticeEmailAddresses( $param->{owner} ); + return unless scalar( @$toaddr ); + #prepare letter my $letter = C4::Letters::GetPreparedLetter( @@ -148,10 +149,9 @@ sub notify_owner { #send letter to queue C4::Letters::EnqueueLetter( { + borrowernumber => $param->{owner}, letter => $letter, message_transport_type => 'email', - from_address => C4::Context->preference('KohaAdminEmailAddress'), - to_address => $toaddr, } ); } @@ -177,7 +177,6 @@ sub process_addrlist { sub send_invitekey { my ($param) = @_; - my $fromaddr = C4::Context->preference('KohaAdminEmailAddress'); my $url = 'http://' . C4::Context->preference('OPACBaseURL') @@ -215,7 +214,6 @@ sub send_invitekey { { letter => $letter, message_transport_type => 'email', - from_address => $fromaddr, to_address => $a, } ); --- a/t/db_dependent/Branch.t +++ a/t/db_dependent/Branch.t @@ -21,9 +21,10 @@ use Modern::Perl; use C4::Context; use Data::Dumper; -use Test::More tests => 36; +use Test::More tests => 38; use C4::Branch; +use C4::Members qw( AddMember ); BEGIN { use FindBin; @@ -305,6 +306,7 @@ my $brCat1 = GetBranchesInCategory( $cat1->{categorycode} ); my @b = ( $b2->{branchcode} ); is_deeply( $brCat1, \@b, 'CAT1 has branch BRB' ); +my $b3_email = 'email_b3@example.org'; my $b3 = { add => 1, branchcode => 'BRC', @@ -318,7 +320,7 @@ my $b3 = { branchcountry => 'countryC', branchphone => 'phoneC', branchfax => 'faxC', - branchemail => 'emailC', + branchemail => $b3_email, branchurl => 'urlC', branchip => 'ipC', branchprinter => undef, @@ -355,6 +357,20 @@ is_deeply($categories, [ {%$cat1}, {%$cat2},{ %new_category, selected => 1 } ], my $loop = GetBranchesLoop; is( scalar(@$loop), GetBranchesCount(), 'There is the right number of branches' ); -# End transaction -$dbh->rollback; - +# Test GetBranchEmailFromBorrowernumber +my $borrowernumber = C4::Members::AddMember( + cardnumber => 'CARDNUMBER42_TEST', + firstname => 'fn', + surname => 'surname', + categorycode => 'S', + branchcode => $b3->{branchcode}, + dateofbirth => '', + dateexpiry => '9999-12-31', + userid => 'userid' +); +is( C4::Branch::GetBranchEmailFromBorrowernumber($borrowernumber), $b3_email, +'GetBranchEmailFromBorrowernumber returns the branchemail from a borrowernumber' +); +is( C4::Branch::GetBranchEmailFromBorrowernumber(), undef, +'GetBranchEmailFromBorrowernumber returns undef if no parameter is given' +); --- 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 => 76; use Test::MockModule; use Test::Warn; @@ -57,12 +57,15 @@ $dbh->do(q|DELETE FROM message_queue|); $dbh->do(q|DELETE FROM message_transport_types|); my $date = dt_from_string; +my ( $email, $emailpro ) = ( 'email@example.org', 'emailpro@example.org' ); my $borrowernumber = AddMember( firstname => 'Jane', surname => 'Smith', categorycode => 'PT', branchcode => 'CPL', dateofbirth => $date, + email => $email, + emailpro => $emailpro, ); my $marc_record = MARC::Record->new; @@ -88,8 +91,7 @@ my $my_message = { to_address => 'to@example.com', from_address => 'from@example.com', }; -my $message_id = C4::Letters::EnqueueLetter($my_message); -is( $message_id, undef, 'EnqueueLetter without the letter argument returns undef' ); +is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the letter argument returns undef' ); delete $my_message->{message_transport_type}; $my_message->{letter} = { @@ -99,13 +101,11 @@ $my_message->{letter} = { code => 'TEST_MESSAGE', content_type => 'text/plain', }; -$message_id = C4::Letters::EnqueueLetter($my_message); -is( $message_id, undef, 'EnqueueLetter without the message type argument argument returns undef' ); +is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the message_transport_type argument returns undef' ); $my_message->{message_transport_type} = 'sms'; -$message_id = C4::Letters::EnqueueLetter($my_message); -ok(defined $message_id && $message_id > 0, 'new message successfully queued'); - +my $messages_queued = C4::Letters::EnqueueLetter($my_message); +is($messages_queued, 1, 'new message successfully queued'); # GetQueuedMessages my $messages = C4::Letters::GetQueuedMessages(); @@ -113,7 +113,6 @@ is( @$messages, 1, 'GetQueuedMessages without argument returns all the entries' $messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber }); is( @$messages, 1, 'one message stored for the borrower' ); -is( $messages->[0]->{message_id}, $message_id, 'EnqueueLetter returns the message id correctly' ); is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' ); is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' ); is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' ); @@ -341,4 +340,60 @@ is($err, 1, "Successfully sent claim"); is($mail{'To'}, 'testemail@mydomain.com', "mailto correct in sent claim"); is($mail{'Message'}, 'my vendor|John Smith|Ordernumber ' . $ordernumber . ' (Silence in the library) (1 ordered)', 'Claim notice text constructed successfully'); -$dbh->rollback; +# EnqueueLetter and AutoEmailPrimaryAddress +$my_message = { + borrowernumber => $borrowernumber, + message_transport_type => 'email', + to_address => 'to@example.com', + from_address => 'from@example.com', + letter => { + content => 'a message', + title => 'message title', + metadata => 'metadata', + code => 'TEST_MESSAGE', + content_type => 'text/plain', + }, +}; + +$dbh->do(q|DELETE FROM message_queue|); +t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email'); +is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' ); +$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber }); +is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' ); +is( $messages->[0]{to_address}, 'to@example.com', 'AutoEmailPrimaryAddress=email, EnqueueLetter used the to_address given in parameter' ); + +$dbh->do(q|DELETE FROM message_queue|); +delete $my_message->{to_address}; +is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' ); +$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber }); +is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' ); +is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email, EnqueueLetter used the patron email address if no to_address is given in parameter' ); + +$dbh->do(q|DELETE FROM message_queue|); +t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'emailpro'); +is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' ); +$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber }); +is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' ); +is( $messages->[0]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=emailpro, EnqueueLetter used the patron emailpro address if no to_address is given in parameter' ); + +$dbh->do(q|DELETE FROM message_queue|); +t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'OFF'); +is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' ); +$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber }); +is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' ); +is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=OFF, EnqueueLetter used the patron email address if no to_address is given in parameter' ); + +$dbh->do(q|DELETE FROM message_queue|); +t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email|OFF|emailpro'); # This is no consistent. OFF should be alone. +is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' ); +$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber }); +is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' ); +is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email|OFF|emailpro, EnqueueLetter used the patron email address if no to_address is given in parameter' ); + +$dbh->do(q|DELETE FROM message_queue|); +t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email|emailpro'); +is( C4::Letters::EnqueueLetter($my_message), 2, 'messages successfully queued' ); +$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber }); +is( scalar( @$messages ), 2, 'The messages have been queued for the expected patron' ); +is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email|emailpro, EnqueueLetter used the patron email address for the first letter' ); +is( $messages->[1]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=email|emailpro, EnqueueLetter used the patron emailpro address for the second letter' ); --- a/t/db_dependent/Members.t +++ a/t/db_dependent/Members.t @@ -17,7 +17,7 @@ use Modern::Perl; -use Test::More tests => 72; +use Test::More tests => 74; use Test::MockModule; use Data::Dumper; use C4::Context; @@ -202,15 +202,23 @@ is ($checkcardnum, "2", "Card number is too long"); C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'OFF' ); C4::Context->clear_syspref_cache(); +my $notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'}); +is_deeply( $notice_emails, [ $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is off" ); -my $notice_email = GetNoticeEmailAddress($member->{'borrowernumber'}); -is ($notice_email, $EMAIL, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is off"); +C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro,OFF' ); +C4::Context->clear_syspref_cache(); +$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'}); +is_deeply( $notice_emails, [ $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress contains off" ); C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro' ); C4::Context->clear_syspref_cache(); +$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'}); +is_deeply ($notice_emails, [ $EMAILPRO ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is emailpro"); -$notice_email = GetNoticeEmailAddress($member->{'borrowernumber'}); -is ($notice_email, $EMAILPRO, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is emailpro"); +C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro,email' ); +C4::Context->clear_syspref_cache(); +$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'}); +is_deeply ($notice_emails, [ $EMAILPRO, $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is emailpro|email"); ok(!$member->{is_expired}, "GetMemberDetails() indicates that patron is not expired"); ModMember(borrowernumber => $member->{'borrowernumber'}, dateexpiry => '2001-01-1'); --