View | Details | Raw Unified | Return to bug 12802
Collapse All | Expand All

(-)a/C4/Circulation.pm (-4 / +6 lines)
Lines 3600-3612 sub SendCirculationAlert { Link Here
3600
3600
3601
        C4::Context->dbh->do(q|LOCK TABLE message_queue READ|) unless $do_not_lock;
3601
        C4::Context->dbh->do(q|LOCK TABLE message_queue READ|) unless $do_not_lock;
3602
        C4::Context->dbh->do(q|LOCK TABLE message_queue WRITE|) unless $do_not_lock;
3602
        C4::Context->dbh->do(q|LOCK TABLE message_queue WRITE|) unless $do_not_lock;
3603
        my $message = C4::Message->find_last_message($borrower, $type, $mtt);
3603
        my @messages = C4::Message->find_last_messages($borrower, $type, $mtt);
3604
        unless ( $message ) {
3604
        unless ( @messages ) {
3605
            C4::Context->dbh->do(q|UNLOCK TABLES|) unless $do_not_lock;
3605
            C4::Context->dbh->do(q|UNLOCK TABLES|) unless $do_not_lock;
3606
            C4::Message->enqueue($letter, $borrower, $mtt);
3606
            C4::Message->enqueue($letter, $borrower, $mtt);
3607
        } else {
3607
        } else {
3608
            $message->append($letter);
3608
            foreach my $message (@messages) {
3609
            $message->update;
3609
                $message->append($letter);
3610
                $message->update;
3611
            }
3610
        }
3612
        }
3611
        C4::Context->dbh->do(q|UNLOCK TABLES|) unless $do_not_lock;
3613
        C4::Context->dbh->do(q|UNLOCK TABLES|) unless $do_not_lock;
3612
    }
3614
    }
(-)a/C4/Letters.pm (-65 / +81 lines)
Lines 34-40 use C4::SMS; Link Here
34
use C4::Debug;
34
use C4::Debug;
35
use Koha::DateUtils;
35
use Koha::DateUtils;
36
use Koha::SMS::Providers;
36
use Koha::SMS::Providers;
37
37
use Koha::Database;
38
use Koha::Email;
38
use Koha::Email;
39
use Koha::Notice::Messages;
39
use Koha::Notice::Messages;
40
use Koha::Notice::Templates;
40
use Koha::Notice::Templates;
Lines 920-933 sub _parseletter { Link Here
920
920
921
=head2 EnqueueLetter
921
=head2 EnqueueLetter
922
922
923
  my $success = EnqueueLetter( { letter => $letter, 
923
    my @message_ids = EnqueueLetter({
924
        borrowernumber => '12', message_transport_type => 'email' } )
924
        letter => $letter,
925
        borrowernumber => '12',
926
        message_transport_type => 'email'
927
    });
925
928
926
places a letter in the message_queue database table, which will
929
places a letter in the message_queue database table, which will
927
eventually get processed (sent) by the process_message_queue.pl
930
eventually get processed (sent) by the process_message_queue.pl
928
cronjob when it calls SendQueuedMessages.
931
cronjob when it calls SendQueuedMessages.
929
932
930
return message_id on success
933
return the list of message ids
931
934
932
=cut
935
=cut
933
936
Lines 935-941 sub EnqueueLetter { Link Here
935
    my $params = shift or return;
938
    my $params = shift or return;
936
939
937
    return unless exists $params->{'letter'};
940
    return unless exists $params->{'letter'};
938
#   return unless exists $params->{'borrowernumber'};
939
    return unless exists $params->{'message_transport_type'};
941
    return unless exists $params->{'message_transport_type'};
940
942
941
    my $content = $params->{letter}->{content};
943
    my $content = $params->{letter}->{content};
Lines 955-983 sub EnqueueLetter { Link Here
955
        );
957
        );
956
    }
958
    }
957
959
958
    my $dbh       = C4::Context->dbh();
960
    my @to_addresses;
959
    my $statement = << 'ENDSQL';
961
    if ( $params->{to_address} ) {
960
INSERT INTO message_queue
962
        @to_addresses = ( $params->{to_address} );
961
( borrowernumber, subject, content, metadata, letter_code, message_transport_type, status, time_queued, to_address, from_address, reply_address, content_type )
963
    } elsif ( $params->{borrowernumber} and $params->{message_transport_type} eq 'email' ) {
962
VALUES
964
        my $patron = Koha::Patrons->find($params->{borrowernumber});
963
( ?,              ?,       ?,       ?,        ?,           ?,                      ?,      NOW(),       ?,          ?,            ?,           ? )
965
        if ($patron) {
964
ENDSQL
966
            @to_addresses = @{ $patron->notice_email_addresses };
965
967
        }
966
    my $sth    = $dbh->prepare($statement);
968
    }
967
    my $result = $sth->execute(
969
968
        $params->{'borrowernumber'},              # borrowernumber
970
    my $from_address;
969
        $params->{'letter'}->{'title'},           # subject
971
    if ( $params->{from_address} ) {
970
        $params->{'letter'}->{'content'},         # content
972
        $from_address = $params->{from_address};
971
        $params->{'letter'}->{'metadata'} || '',  # metadata
973
    } elsif ( $params->{message_transport_type} eq 'email' ) {
972
        $params->{'letter'}->{'code'}     || '',  # letter_code
974
        if ( $params->{borrowernumber} ) {
973
        $params->{'message_transport_type'},      # message_transport_type
975
            my $rs = Koha::Database->new->schema->resultset('Borrower')->search({ borrowernumber => $params->{borrowernumber} }, {join => 'branchcode'});
974
        'pending',                                # status
976
            $from_address = $rs->next->branchcode->branchemail;
975
        $params->{'to_address'},                  # to_address
977
        }
976
        $params->{'from_address'},                # from_address
978
977
        $params->{'reply_address'},               # reply_address
979
        $from_address ||= C4::Context->preference('KohaAdminEmailAddress');
978
        $params->{'letter'}->{'content-type'},    # content_type
980
    }
979
    );
981
980
    return $dbh->last_insert_id(undef,undef,'message_queue', undef);
982
    my @message_ids;
983
984
    my $rs = Koha::Database->new->schema->resultset('MessageQueue');
985
    if ($params->{message_transport_type} eq 'email') {
986
        for my $to_address ( @to_addresses ) {
987
            my $message = $rs->create({
988
                borrowernumber => $params->{borrowernumber},
989
                subject => $params->{letter}{title},
990
                content => $params->{letter}{content},
991
                metadata => ( $params->{letter}{metadata} || '' ),
992
                letter_code => ( $params->{letter}{code}     || ''),
993
                message_transport_type => $params->{message_transport_type},
994
                status => 'pending',
995
                time_queued => \'NOW()',
996
                to_address => $to_address,
997
                from_address => $from_address,
998
                reply_address => $params->{'reply_address'},
999
                content_type => $params->{letter}{'content-type'},
1000
            });
1001
            push @message_ids, $message->id();
1002
        }
1003
    } else {
1004
        my $message = $rs->create({
1005
            borrowernumber => $params->{borrowernumber},
1006
            subject => $params->{letter}{title},
1007
            content => $params->{letter}{content},
1008
            metadata => ( $params->{letter}{metadata} || '' ),
1009
            letter_code => ( $params->{letter}{code}     || ''),
1010
            message_transport_type => $params->{message_transport_type},
1011
            status => 'pending',
1012
            time_queued => \'NOW()',
1013
            from_address => $from_address,
1014
            reply_address => $params->{'reply_address'},
1015
            content_type => $params->{letter}{'content-type'},
1016
        });
1017
        push @message_ids, $message->id();
1018
    }
1019
1020
    return @message_ids;
981
}
1021
}
982
1022
983
=head2 SendQueuedMessages ([$hashref]) 
1023
=head2 SendQueuedMessages ([$hashref]) 
Lines 1116-1146 Return is an arrayref of hashes, each has represents a message in the message qu Link Here
1116
sub GetQueuedMessages {
1156
sub GetQueuedMessages {
1117
    my $params = shift;
1157
    my $params = shift;
1118
1158
1119
    my $dbh = C4::Context->dbh();
1159
    my (%cond, %attrs);
1120
    my $statement = << 'ENDSQL';
1121
SELECT message_id, borrowernumber, subject, content, message_transport_type, status, time_queued, updated_on
1122
FROM message_queue
1123
ENDSQL
1124
1125
    my @query_params;
1126
    my @whereclauses;
1127
    if ( exists $params->{'borrowernumber'} ) {
1128
        push @whereclauses, ' borrowernumber = ? ';
1129
        push @query_params, $params->{'borrowernumber'};
1130
    }
1131
1160
1132
    if ( @whereclauses ) {
1161
    $cond{borrowernumber} = $params->{borrowernumber} if $params->{borrowernumber};
1133
        $statement .= ' WHERE ' . join( 'AND', @whereclauses );
1134
    }
1135
1162
1136
    if ( defined $params->{'limit'} ) {
1163
    $attrs{rows} = $params->{limit} if $params->{limit};
1137
        $statement .= ' LIMIT ? ';
1138
        push @query_params, $params->{'limit'};
1139
    }
1140
1164
1141
    my $sth = $dbh->prepare( $statement );
1165
    my $rs = Koha::Database->new->schema->resultset('MessageQueue')->search(\%cond, \%attrs);
1142
    my $result = $sth->execute( @query_params );
1166
    $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
1143
    return $sth->fetchall_arrayref({});
1167
    return [ $rs->all ];
1144
}
1168
}
1145
1169
1146
=head2 GetMessageTransportTypes
1170
=head2 GetMessageTransportTypes
Lines 1324-1344 sub _send_message_by_email { Link Here
1324
1348
1325
    my $patron = Koha::Patrons->find( $message->{borrowernumber} );
1349
    my $patron = Koha::Patrons->find( $message->{borrowernumber} );
1326
    my $to_address = $message->{'to_address'};
1350
    my $to_address = $message->{'to_address'};
1327
    unless ($to_address) {
1351
    unless ($patron and $to_address) {
1328
        unless ($patron) {
1352
        warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})" unless $patron;
1329
            warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})";
1353
        _set_message_status({
1330
            _set_message_status( { message_id => $message->{'message_id'},
1354
            message_id => $message->{message_id},
1331
                                   status     => 'failed' } );
1355
            status     => 'failed',
1332
            return;
1356
        });
1333
        }
1357
        return;
1334
        $to_address = $patron->notice_email_address;
1335
        unless ($to_address) {  
1336
            # warn "FAIL: No 'to_address' and no email for " . ($member->{surname} ||'') . ", borrowernumber ($message->{borrowernumber})";
1337
            # warning too verbose for this more common case?
1338
            _set_message_status( { message_id => $message->{'message_id'},
1339
                                   status     => 'failed' } );
1340
            return;
1341
        }
1342
    }
1358
    }
1343
1359
1344
    my $subject = $message->{'subject'};
1360
    my $subject = $message->{'subject'};
(-)a/C4/Message.pm (-37 / +8 lines)
Lines 54-60 How to update a borrower's last checkout message: Link Here
54
54
55
  use C4::Message;
55
  use C4::Message;
56
  my $borrower = { borrowernumber => 1 };
56
  my $borrower = { borrowernumber => 1 };
57
  my $message  = C4::Message->find_last_message($borrower, 'CHECKOUT', 'email');
57
  my $message  = C4::Message->find_last_messages($borrower, 'CHECKOUT', 'email');
58
  $message->append("you also checked out some other book....");
58
  $message->append("you also checked out some other book....");
59
  $message->update;
59
  $message->update;
60
60
Lines 111-127 sub find { Link Here
111
    }
111
    }
112
}
112
}
113
113
114
=head3 C4::Message->find_last_message($borrower, $letter_code, $transport)
114
=head3 C4::Message->find_last_messages($borrower, $letter_code, $transport)
115
115
116
This method is used to get the borrower's most recent, pending, check-in or
116
This method is used to get the borrower's most recent, pending, check-in or
117
checkout message.  (This makes it possible to add more information to the
117
checkout messages.  (This makes it possible to add more information to the
118
message before it gets sent out.)
118
message before it gets sent out.)
119
119
120
=cut
120
=cut
121
121
122
# C4::Message->find_last_message($borrower, $letter_code, $transport)
122
# C4::Message->find_last_messages($borrower, $letter_code, $transport)
123
# -- get the borrower's most recent pending checkin or checkout notification
123
# -- get the borrower's most recent pending checkin or checkout notifications
124
sub find_last_message {
124
sub find_last_messages {
125
    my ($class, $borrower, $letter_code, $transport) = @_;
125
    my ($class, $borrower, $letter_code, $transport) = @_;
126
    # $type is the message_transport_type
126
    # $type is the message_transport_type
127
    $transport ||= 'email';
127
    $transport ||= 'email';
Lines 140-150 sub find_last_message { Link Here
140
        $letter_code,
140
        $letter_code,
141
        $transport,
141
        $transport,
142
    );
142
    );
143
    if (@$msgs) {
143
144
        return $class->new($msgs->[0]);
144
    return map { $class->new($_) } @$msgs;
145
    } else {
146
        return;
147
    }
148
}
145
}
149
146
150
147
Lines 159-165 the message. Link Here
159
sub enqueue {
156
sub enqueue {
160
    my ($class, $letter, $borrower, $transport) = @_;
157
    my ($class, $letter, $borrower, $transport) = @_;
161
    my $metadata   = _metadata($letter);
158
    my $metadata   = _metadata($letter);
162
    my $to_address = _to_address($borrower, $transport);
163
159
164
    # Same as render_metadata
160
    # Same as render_metadata
165
    my $format ||= sub { $_[0] || "" };
161
    my $format ||= sub { $_[0] || "" };
Lines 171-204 sub enqueue { Link Here
171
        letter                 => $letter,
167
        letter                 => $letter,
172
        borrowernumber         => $borrower->{borrowernumber},
168
        borrowernumber         => $borrower->{borrowernumber},
173
        message_transport_type => $transport,
169
        message_transport_type => $transport,
174
        to_address             => $to_address,
175
    });
170
    });
176
}
171
}
177
172
178
# based on message $transport, pick an appropriate address to send to
179
sub _to_address {
180
    my ($borrower, $transport) = @_;
181
    my $address;
182
    if ($transport eq 'email') {
183
        $address = $borrower->{email}
184
            || $borrower->{emailpro}
185
            || $borrower->{B_email};
186
    } elsif ($transport eq 'sms') {
187
        $address = $borrower->{smsalertnumber}
188
            || $borrower->{phone}
189
            || $borrower->{phonepro}
190
            || $borrower->{B_phone};
191
    } else {
192
        warn "'$transport' is an unknown message transport.";
193
    }
194
    if (not defined $address) {
195
        warn "An appropriate $transport address "
196
            . "for borrower $borrower->{userid} "
197
            . "could not be found.";
198
    }
199
    return $address;
200
}
201
202
# _metadata($letter) -- return the letter split into head/body/footer
173
# _metadata($letter) -- return the letter split into head/body/footer
203
sub _metadata {
174
sub _metadata {
204
    my ($letter) = @_;
175
    my ($letter) = @_;
(-)a/C4/Reserves.pm (-7 / +7 lines)
Lines 721-732 SELECT COUNT(*) FROM reserves WHERE biblionumber=? AND borrowernumber<>? Link Here
721
Takes an itemnumber and returns the status of the reserve placed on it.
721
Takes an itemnumber and returns the status of the reserve placed on it.
722
If several reserves exist, the reserve with the lower priority is given.
722
If several reserves exist, the reserve with the lower priority is given.
723
723
724
=cut
725
726
## FIXME: I don't think this does what it thinks it does.
724
## FIXME: I don't think this does what it thinks it does.
727
## It only ever checks the first reserve result, even though
725
## It only ever checks the first reserve result, even though
728
## multiple reserves for that bib can have the itemnumber set
726
## multiple reserves for that bib can have the itemnumber set
729
## the sub is only used once in the codebase.
727
## the sub is only used once in the codebase.
728
729
=cut
730
730
sub GetReserveStatus {
731
sub GetReserveStatus {
731
    my ($itemnumber) = @_;
732
    my ($itemnumber) = @_;
732
733
Lines 1828-1836 sub _koha_notify_reserve { Link Here
1828
1829
1829
    my $patron = Koha::Patrons->find( $borrowernumber );
1830
    my $patron = Koha::Patrons->find( $borrowernumber );
1830
1831
1831
    # Try to get the borrower's email address
1832
    my $to_address = $patron->notice_email_address;
1833
1834
    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( {
1832
    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( {
1835
            borrowernumber => $borrowernumber,
1833
            borrowernumber => $borrowernumber,
1836
            message_name => 'Hold_Filled'
1834
            message_name => 'Hold_Filled'
Lines 1869-1882 sub _koha_notify_reserve { Link Here
1869
        C4::Letters::EnqueueLetter( {
1867
        C4::Letters::EnqueueLetter( {
1870
            letter => $letter,
1868
            letter => $letter,
1871
            borrowernumber => $borrowernumber,
1869
            borrowernumber => $borrowernumber,
1872
            from_address => $admin_email_address,
1873
            message_transport_type => $mtt,
1870
            message_transport_type => $mtt,
1874
        } );
1871
        } );
1875
    };
1872
    };
1876
1873
1874
    # Try to get the borrower's email addresses
1875
    my $to_addresses = $patron->notice_email_addresses;
1876
1877
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
1877
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
1878
        next if (
1878
        next if (
1879
               ( $mtt eq 'email' and not $to_address ) # No email address
1879
               ( $mtt eq 'email' and not @$to_addresses ) # No email address
1880
            or ( $mtt eq 'sms'   and not $patron->smsalertnumber ) # No SMS number
1880
            or ( $mtt eq 'sms'   and not $patron->smsalertnumber ) # No SMS number
1881
            or ( $mtt eq 'itiva' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl
1881
            or ( $mtt eq 'itiva' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl
1882
            or ( $mtt eq 'phone' and not $patron->phone ) # No phone number to call
1882
            or ( $mtt eq 'phone' and not $patron->phone ) # No phone number to call
(-)a/Koha/Patron.pm (-10 / +15 lines)
Lines 1227-1251 sub return_claims { Link Here
1227
    return Koha::Checkouts::ReturnClaims->_new_from_dbic( $return_claims );
1227
    return Koha::Checkouts::ReturnClaims->_new_from_dbic( $return_claims );
1228
}
1228
}
1229
1229
1230
=head3 notice_email_address
1230
=head3 notice_email_addresses
1231
1231
1232
  my $email = $patron->notice_email_address;
1232
  my $emails = $patron->notice_email_addresses;
1233
1233
1234
Return the email address of patron used for notices.
1234
Return an arrayref containing the email addresses of patron used for notices.
1235
Returns the empty string if no email address.
1236
1235
1237
=cut
1236
=cut
1238
1237
1239
sub notice_email_address{
1238
sub notice_email_addresses {
1240
    my ( $self ) = @_;
1239
    my ( $self ) = @_;
1241
1240
1242
    my $which_address = C4::Context->preference("AutoEmailPrimaryAddress");
1241
    my $which_addresses = C4::Context->preference("AutoEmailPrimaryAddress");
1243
    # if syspref is set to 'first valid' (value == OFF), look up email address
1242
    my @email_addresses;
1244
    if ( $which_address eq 'OFF' ) {
1243
    for my $email_address_field (split /,/, $which_addresses) {
1245
        return $self->first_valid_email_address;
1244
        # if syspref is set to 'first valid' (value == OFF), look up email address
1245
        if ( $email_address_field eq 'OFF' ) {
1246
            return [ $self->first_valid_email_address ];
1247
        }
1248
1249
        my $email_address = $self->$email_address_field;
1250
        push @email_addresses, $email_address if $email_address;
1246
    }
1251
    }
1247
1252
1248
    return $self->$which_address || '';
1253
    return \@email_addresses;
1249
}
1254
}
1250
1255
1251
=head3 first_valid_email_address
1256
=head3 first_valid_email_address
(-)a/Koha/Patron/Password/Recovery.pm (-3 / +6 lines)
Lines 153-159 sub SendPasswordRecoveryEmail { Link Here
153
    my $library = $borrower->library;
153
    my $library = $borrower->library;
154
    my $kohaEmail = $library->branchemail || C4::Context->preference('KohaAdminEmailAddress');  # send from patron's branch or Koha Admin
154
    my $kohaEmail = $library->branchemail || C4::Context->preference('KohaAdminEmailAddress');  # send from patron's branch or Koha Admin
155
155
156
    my $message_id = C4::Letters::EnqueueLetter(
156
    my @message_ids = C4::Letters::EnqueueLetter(
157
        {
157
        {
158
            letter                 => $letter,
158
            letter                 => $letter,
159
            borrowernumber         => $borrower->borrowernumber,
159
            borrowernumber         => $borrower->borrowernumber,
Lines 163-170 sub SendPasswordRecoveryEmail { Link Here
163
        }
163
        }
164
    );
164
    );
165
165
166
    my $num_letters_attempted =
166
    my $num_letters_attempted = 0;
167
      C4::Letters::SendQueuedMessages( { message_id => $message_id } );
167
    foreach my $message_id (@message_ids) {
168
        $num_letters_attempted +=
169
          C4::Letters::SendQueuedMessages( { message_id => $message_id } );
170
    }
168
171
169
    return ($num_letters_attempted > 0);
172
    return ($num_letters_attempted > 0);
170
}
173
}
(-)a/circ/pendingreserves.pl (-1 / +2 lines)
Lines 95-101 if ( $op eq 'cancel_reserve' and $reserve_id ) { Link Here
95
                        from_address           => $admin_email_address,
95
                        from_address           => $admin_email_address,
96
                    }
96
                    }
97
                );
97
                );
98
                unless ( $patron->notice_email_address ) {
98
                my $email_addresses = $patron->notice_email_addresses;
99
                unless ( @$email_addresses ) {
99
                    push @messages, {type => 'alert', code => 'no_email_address', };
100
                    push @messages, {type => 'alert', code => 'no_email_address', };
100
                }
101
                }
101
                push @messages, { type => 'message', code => 'letter_enqueued' };
102
                push @messages, { type => 'message', code => 'letter_enqueued' };
(-)a/installer/data/mysql/atomicupdate/bug_12802-change-autoemailprimaryddress-syspref-type.sql (+1 lines)
Line 0 Link Here
1
UPDATE systempreferences SET type='multiple' WHERE variable='AutoEmailPrimaryAddress';
(-)a/installer/data/mysql/mandatory/sysprefs.sql (-1 / +1 lines)
Lines 72-78 INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` Link Here
72
('AutoCreateAuthorities','0',NULL,'Automatically create authorities that do not exist when cataloging records.','YesNo'),
72
('AutoCreateAuthorities','0',NULL,'Automatically create authorities that do not exist when cataloging records.','YesNo'),
73
('AutoCreditNumber', '', '', 'Automatically generate a number for account credits', 'Choice'),
73
('AutoCreditNumber', '', '', 'Automatically generate a number for account credits', 'Choice'),
74
('AutoEmailOpacUser','0',NULL,'Sends notification emails containing new account details to patrons - when account is created.','YesNo'),
74
('AutoEmailOpacUser','0',NULL,'Sends notification emails containing new account details to patrons - when account is created.','YesNo'),
75
('AutoEmailPrimaryAddress','OFF','email|emailpro|B_email|cardnumber|OFF','Defines the default email address where \'Account Details\' emails are sent.','Choice'),
75
('AutoEmailPrimaryAddress','OFF','email|emailpro|B_email|cardnumber|OFF','Defines the default email address where \'Account Details\' emails are sent.','multiple'),
76
('AutoShareWithMana','subscription','','defines datas automatically shared with mana','multiple'),
76
('AutoShareWithMana','subscription','','defines datas automatically shared with mana','multiple'),
77
('AutoLocation','0',NULL,'If ON, IP authentication is enabled, blocking access to the staff interface from unauthorized IP addresses','YesNo'),
77
('AutoLocation','0',NULL,'If ON, IP authentication is enabled, blocking access to the staff interface from unauthorized IP addresses','YesNo'),
78
('AutomaticItemReturn','1',NULL,'If ON, Koha will automatically set up a transfer of this item to its homebranch','YesNo'),
78
('AutomaticItemReturn','1',NULL,'If ON, Koha will automatically set up a transfer of this item to its homebranch','YesNo'),
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/patrons.pref (-1 / +1 lines)
Lines 151-157 Patrons: Link Here
151
         - "Use"
151
         - "Use"
152
         - pref: AutoEmailPrimaryAddress
152
         - pref: AutoEmailPrimaryAddress
153
           default: "OFF"
153
           default: "OFF"
154
           choices:
154
           multiple:
155
               email: home
155
               email: home
156
               emailpro: work
156
               emailpro: work
157
               B_email: alternate
157
               B_email: alternate
(-)a/members/memberentry.pl (-12 / +8 lines)
Lines 466-484 if ((!$nok) and $nodouble and ($op eq 'insert' or $op eq 'save')){ Link Here
466
        # If 'AutoEmailOpacUser' syspref is on, email user their account details from the 'notice' that matches the user's branchcode.
466
        # If 'AutoEmailOpacUser' syspref is on, email user their account details from the 'notice' that matches the user's branchcode.
467
        if ( C4::Context->preference("AutoEmailOpacUser") == 1 && $newdata{'userid'}  && $newdata{'password'}) {
467
        if ( C4::Context->preference("AutoEmailOpacUser") == 1 && $newdata{'userid'}  && $newdata{'password'}) {
468
            #look for defined primary email address, if blank - attempt to use borr.email and borr.emailpro instead
468
            #look for defined primary email address, if blank - attempt to use borr.email and borr.emailpro instead
469
            my $emailaddr;
469
            my @email_addresses;
470
            if  (C4::Context->preference("AutoEmailPrimaryAddress") ne 'OFF'  && 
470
            for my $field ( split /,/, C4::Context->preference("AutoEmailPrimaryAddress") ) {
471
                $newdata{C4::Context->preference("AutoEmailPrimaryAddress")} =~  /\w\@\w/ ) {
471
                push @email_addresses, newdata{$field} if $newdata{$field} =~ /\w@\w/
472
                $emailaddr =   $newdata{C4::Context->preference("AutoEmailPrimaryAddress")} 
473
            } 
474
            elsif ($newdata{email} =~ /\w\@\w/) {
475
                $emailaddr = $newdata{email} 
476
            }
472
            }
477
            elsif ($newdata{emailpro} =~ /\w\@\w/) {
473
            my $emailaddr = join ", ", @email_addresses;
478
                $emailaddr = $newdata{emailpro} 
474
            unless ( $emailaddr ) {
479
            }
475
                for my $field ( qw( email emailpro B_email ) ) {
480
            elsif ($newdata{B_email} =~ /\w\@\w/) {
476
                    $emailaddr = $newdata{$field} if $newdata{$field} =~ m|\w\@\w|;
481
                $emailaddr = $newdata{B_email} 
477
                }
482
            }
478
            }
483
            # if we manage to find a valid email address, send notice 
479
            # if we manage to find a valid email address, send notice 
484
            if ($emailaddr) {
480
            if ($emailaddr) {
(-)a/misc/cronjobs/notice_unprocessed_suggestions.pl (-2 / +2 lines)
Lines 47-58 for my $number_of_days (@days) { Link Here
47
47
48
        my $budget = C4::Budgets::GetBudget( $suggestion->{budgetid} );
48
        my $budget = C4::Budgets::GetBudget( $suggestion->{budgetid} );
49
        my $patron = Koha::Patrons->find( $budget->{budget_owner_id} );
49
        my $patron = Koha::Patrons->find( $budget->{budget_owner_id} );
50
        my $email_address = $patron->notice_email_address;
50
        my $email_addresses = $patron->notice_email_addresses;
51
        my $library = $patron->library;
51
        my $library = $patron->library;
52
        my $admin_email_address = $library->branchemail
52
        my $admin_email_address = $library->branchemail
53
          || C4::Context->preference('KohaAdminEmailAddress');
53
          || C4::Context->preference('KohaAdminEmailAddress');
54
54
55
        if ($email_address) {
55
        if (@$email_addresses) {
56
            say "Patron " . $patron->borrowernumber . " is going to be notified" if $verbose;
56
            say "Patron " . $patron->borrowernumber . " is going to be notified" if $verbose;
57
            my $letter = C4::Letters::GetPreparedLetter(
57
            my $letter = C4::Letters::GetPreparedLetter(
58
                module      => 'suggestions',
58
                module      => 'suggestions',
(-)a/misc/cronjobs/overdue_notices.pl (-4 / +4 lines)
Lines 612-618 END_SQL Link Here
612
612
613
                my $patron = Koha::Patrons->find( $borrowernumber );
613
                my $patron = Koha::Patrons->find( $borrowernumber );
614
                @emails_to_use = ();
614
                @emails_to_use = ();
615
                my $notice_email = $patron->notice_email_address;
616
                unless ($nomail) {
615
                unless ($nomail) {
617
                    if (@emails) {
616
                    if (@emails) {
618
                        foreach (@emails) {
617
                        foreach (@emails) {
Lines 620-626 END_SQL Link Here
620
                        }
619
                        }
621
                    }
620
                    }
622
                    else {
621
                    else {
623
                        push @emails_to_use, $notice_email if ($notice_email);
622
                        my $notice_emails = $patron->notice_email_addresses;
623
                        push @emails_to_use, @$notice_emails;
624
                    }
624
                    }
625
                }
625
                }
626
626
Lines 762-768 END_SQL Link Here
762
                              letternumber   => $i,
762
                              letternumber   => $i,
763
                              postcode       => $data->{'zipcode'},
763
                              postcode       => $data->{'zipcode'},
764
                              country        => $data->{'country'},
764
                              country        => $data->{'country'},
765
                              email          => $notice_email,
765
                              email          => ( scalar( @emails_to_use ) ? $emails_to_use[0] : undef ),
766
                              itemcount      => $itemcount,
766
                              itemcount      => $itemcount,
767
                              titles         => $titles,
767
                              titles         => $titles,
768
                              outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
768
                              outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
Lines 781-787 END_SQL Link Here
781
                                  city           => $data->{'city'},
781
                                  city           => $data->{'city'},
782
                                  postcode       => $data->{'zipcode'},
782
                                  postcode       => $data->{'zipcode'},
783
                                  country        => $data->{'country'},
783
                                  country        => $data->{'country'},
784
                                  email          => $notice_email,
784
                                  email          => ( scalar( @emails_to_use ) ? $emails_to_use[0] : undef ),
785
                                  itemcount      => $itemcount,
785
                                  itemcount      => $itemcount,
786
                                  titles         => $titles,
786
                                  titles         => $titles,
787
                                  outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
787
                                  outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
(-)a/misc/cronjobs/thirdparty/TalkingTech_itiva_outbound.pl (-1 / +4 lines)
Lines 131-137 foreach my $type (@types) { Link Here
131
    my $patrons;
131
    my $patrons;
132
    foreach my $issues (@loop) {
132
    foreach my $issues (@loop) {
133
        $patrons->{$issues->{borrowernumber}} ||= Koha::Patrons->find( $issues->{borrowernumber} ) if $skip_patrons_with_email;
133
        $patrons->{$issues->{borrowernumber}} ||= Koha::Patrons->find( $issues->{borrowernumber} ) if $skip_patrons_with_email;
134
        next if $skip_patrons_with_email && $patrons->{$issues->{borrowernumber}}->notice_email_address;
134
        if ($skip_patrons_with_email) {
135
            my $email_addresses = $patrons->{$issues->{borrowernumber}}->notice_email_addresses;
136
            next if @$email_addresses;
137
        }
135
138
136
        my $date_dt = dt_from_string ( $issues->{'date_due'} );
139
        my $date_dt = dt_from_string ( $issues->{'date_due'} );
137
        my $due_date = output_pref( { dt => $date_dt, dateonly => 1, dateformat =>'metric' } );
140
        my $due_date = output_pref( { dt => $date_dt, dateonly => 1, dateformat =>'metric' } );
(-)a/opac/opac-memberentry.pl (-5 / +5 lines)
Lines 197-212 if ( $action eq 'create' ) { Link Here
197
                },
197
                },
198
            );
198
            );
199
199
200
            my $message_id = C4::Letters::EnqueueLetter(
200
            my @message_ids = C4::Letters::EnqueueLetter(
201
                {
201
                {
202
                    borrowernumber         => $borrower{borrowernumber},
202
                    letter                 => $letter,
203
                    letter                 => $letter,
203
                    message_transport_type => 'email',
204
                    message_transport_type => 'email',
204
                    to_address             => $borrower{'email'},
205
                    from_address =>
206
                      C4::Context->preference('KohaAdminEmailAddress'),
207
                }
205
                }
208
            );
206
            );
209
            C4::Letters::SendQueuedMessages({ message_id => $message_id });
207
            for my $message_id (@message_ids) {
208
                C4::Letters::SendQueuedMessages({ message_id => $message_id });
209
            }
210
        }
210
        }
211
        else {
211
        else {
212
            ( $template, $borrowernumber, $cookie ) = get_template_and_user(
212
            ( $template, $borrowernumber, $cookie ) = get_template_and_user(
(-)a/opac/opac-shareshelf.pl (-5 / +2 lines)
Lines 165-171 sub notify_owner { Link Here
165
    my $patron = Koha::Patrons->find( $param->{owner} );
165
    my $patron = Koha::Patrons->find( $param->{owner} );
166
    return unless $patron;
166
    return unless $patron;
167
167
168
    my $toaddr = $patron->notice_email_address or return;
168
    return unless @{ $patron->notice_email_addresses };
169
169
170
    #prepare letter
170
    #prepare letter
171
    my $letter = C4::Letters::GetPreparedLetter(
171
    my $letter = C4::Letters::GetPreparedLetter(
Lines 180-189 sub notify_owner { Link Here
180
    #send letter to queue
180
    #send letter to queue
181
    C4::Letters::EnqueueLetter(
181
    C4::Letters::EnqueueLetter(
182
        {
182
        {
183
            borrowernumber         => $param->{owner},
183
            letter                 => $letter,
184
            letter                 => $letter,
184
            message_transport_type => 'email',
185
            message_transport_type => 'email',
185
            from_address => C4::Context->preference('KohaAdminEmailAddress'),
186
            to_address   => $toaddr,
187
        }
186
        }
188
    );
187
    );
189
}
188
}
Lines 209-215 sub process_addrlist { Link Here
209
208
210
sub send_invitekey {
209
sub send_invitekey {
211
    my ($param) = @_;
210
    my ($param) = @_;
212
    my $fromaddr = C4::Context->preference('KohaAdminEmailAddress');
213
    my $url =
211
    my $url =
214
        C4::Context->preference('OPACBaseURL')
212
        C4::Context->preference('OPACBaseURL')
215
      . "/cgi-bin/koha/opac-shareshelf.pl?shelfnumber="
213
      . "/cgi-bin/koha/opac-shareshelf.pl?shelfnumber="
Lines 251-257 sub send_invitekey { Link Here
251
            {
249
            {
252
                letter                 => $letter,
250
                letter                 => $letter,
253
                message_transport_type => 'email',
251
                message_transport_type => 'email',
254
                from_address           => $fromaddr,
255
                to_address             => $a,
252
                to_address             => $a,
256
            }
253
            }
257
        );
254
        );
(-)a/suggestion/suggestion.pl (-2 / +2 lines)
Lines 186-193 if ( $op =~ /save/i ) { Link Here
186
186
187
            if ( $notify ) {
187
            if ( $notify ) {
188
                my $patron = Koha::Patrons->find( $suggestion_only->{managedby} );
188
                my $patron = Koha::Patrons->find( $suggestion_only->{managedby} );
189
                my $email_address = $patron->notice_email_address;
189
                my $email_addresses = $patron->notice_email_addresses;
190
                if ($patron->notice_email_address) {
190
                if (@$email_addresses) {
191
                    my $library = $patron->library;
191
                    my $library = $patron->library;
192
                    my $admin_email_address = $library->branchemail
192
                    my $admin_email_address = $library->branchemail
193
                      || C4::Context->preference('KohaAdminEmailAddress');
193
                      || C4::Context->preference('KohaAdminEmailAddress');
(-)a/t/db_dependent/Koha/Patrons.t (-4 / +7 lines)
Lines 1007-1022 subtest 'holds and old_holds' => sub { Link Here
1007
    $patron->delete;
1007
    $patron->delete;
1008
};
1008
};
1009
1009
1010
subtest 'notice_email_address' => sub {
1010
subtest 'notice_email_addresses' => sub {
1011
    plan tests => 2;
1011
    plan tests => 3;
1012
1012
1013
    my $patron = $builder->build_object({ class => 'Koha::Patrons' });
1013
    my $patron = $builder->build_object({ class => 'Koha::Patrons' });
1014
1014
1015
    t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'OFF' );
1015
    t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'OFF' );
1016
    is ($patron->notice_email_address, $patron->email, "Koha::Patron->notice_email_address returns correct value when AutoEmailPrimaryAddress is off");
1016
    is_deeply ($patron->notice_email_addresses, [$patron->email], "Koha::Patron->notice_email_addresses returns correct value when AutoEmailPrimaryAddress is off");
1017
1017
1018
    t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'emailpro' );
1018
    t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'emailpro' );
1019
    is ($patron->notice_email_address, $patron->emailpro, "Koha::Patron->notice_email_address returns correct value when AutoEmailPrimaryAddress is emailpro");
1019
    is_deeply ($patron->notice_email_addresses, [$patron->emailpro], "Koha::Patron->notice_email_addresses returns correct value when AutoEmailPrimaryAddress is emailpro");
1020
1021
    t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'email,emailpro' );
1022
    is_deeply ($patron->notice_email_addresses, [$patron->email, $patron->emailpro], "Koha::Patron->notice_email_addresses returns correct value when AutoEmailPrimaryAddress is email,emailpro");
1020
1023
1021
    $patron->delete;
1024
    $patron->delete;
1022
};
1025
};
(-)a/t/db_dependent/Letters.t (-15 / +91 lines)
Lines 112-119 my $my_message = { Link Here
112
    to_address             => undef,
112
    to_address             => undef,
113
    from_address           => 'from@example.com',
113
    from_address           => 'from@example.com',
114
};
114
};
115
my $message_id = C4::Letters::EnqueueLetter($my_message);
115
is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the letter argument returns undef' );
116
is( $message_id, undef, 'EnqueueLetter without the letter argument returns undef' );
117
116
118
delete $my_message->{message_transport_type};
117
delete $my_message->{message_transport_type};
119
$my_message->{letter} = {
118
$my_message->{letter} = {
Lines 124-136 $my_message->{letter} = { Link Here
124
    content_type => 'text/plain',
123
    content_type => 'text/plain',
125
};
124
};
126
125
127
$message_id = C4::Letters::EnqueueLetter($my_message);
126
my @message_ids = C4::Letters::EnqueueLetter($my_message);
128
is( $message_id, undef, 'EnqueueLetter without the message type argument argument returns undef' );
127
is( scalar @message_ids, 0, 'EnqueueLetter without the message type argument argument returns an empty list' );
129
128
130
$my_message->{message_transport_type} = 'sms';
129
$my_message->{message_transport_type} = 'sms';
131
$message_id = C4::Letters::EnqueueLetter($my_message);
130
@message_ids = C4::Letters::EnqueueLetter($my_message);
132
ok(defined $message_id && $message_id > 0, 'new message successfully queued');
131
is(scalar @message_ids, 1, 'new message successfully queued');
133
134
132
135
# GetQueuedMessages
133
# GetQueuedMessages
136
my $messages = C4::Letters::GetQueuedMessages();
134
my $messages = C4::Letters::GetQueuedMessages();
Lines 138-144 is( @$messages, 1, 'GetQueuedMessages without argument returns all the entries' Link Here
138
136
139
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
137
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
140
is( @$messages, 1, 'one message stored for the borrower' );
138
is( @$messages, 1, 'one message stored for the borrower' );
141
is( $messages->[0]->{message_id}, $message_id, 'EnqueueLetter returns the message id correctly' );
142
is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' );
139
is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' );
143
is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' );
140
is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' );
144
is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' );
141
is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' );
Lines 820-827 subtest 'SendQueuedMessages' => sub { Link Here
820
    is( $@, '', 'SendQueuedMessages should not explode if the patron does not have a sms provider set' );
817
    is( $@, '', 'SendQueuedMessages should not explode if the patron does not have a sms provider set' );
821
818
822
    my $sms_pro = $builder->build_object({ class => 'Koha::SMS::Providers', value => { domain => 'kidclamp.rocks' } });
819
    my $sms_pro = $builder->build_object({ class => 'Koha::SMS::Providers', value => { domain => 'kidclamp.rocks' } });
823
    $patron->set( { smsalertnumber => '5555555555', sms_provider_id => $sms_pro->id() } )->store;
820
    $patron->set( { smsalertnumber => '5555555555', sms_provider_id => $sms_pro->id(), email => '', emailpro => '' } )->store;
824
    $message_id = C4::Letters::EnqueueLetter($my_message); #using datas set around line 95 and forward
821
    C4::Letters::EnqueueLetter($my_message); #using datas set around line 95 and forward
825
822
826
    warning_like { C4::Letters::SendQueuedMessages(); }
823
    warning_like { C4::Letters::SendQueuedMessages(); }
827
        qr|Fake send_or_die|,
824
        qr|Fake send_or_die|,
Lines 843-849 subtest 'SendQueuedMessages' => sub { Link Here
843
840
844
    t::lib::Mocks::mock_preference('EmailSMSSendDriverFromAddress', 'override@example.com');
841
    t::lib::Mocks::mock_preference('EmailSMSSendDriverFromAddress', 'override@example.com');
845
842
846
    $message_id = C4::Letters::EnqueueLetter($my_message);
843
    C4::Letters::EnqueueLetter($my_message);
847
    warning_like { C4::Letters::SendQueuedMessages(); }
844
    warning_like { C4::Letters::SendQueuedMessages(); }
848
        qr|Fake send_or_die|,
845
        qr|Fake send_or_die|,
849
        "SendAlerts is using the mocked send_or_die routine (claimissues)";
846
        "SendAlerts is using the mocked send_or_die routine (claimissues)";
Lines 861-867 subtest 'SendQueuedMessages' => sub { Link Here
861
858
862
    $schema->resultset('MessageQueue')->search({borrowernumber => $borrowernumber,status => 'sent'})->delete(); #clear borrower queue
859
    $schema->resultset('MessageQueue')->search({borrowernumber => $borrowernumber,status => 'sent'})->delete(); #clear borrower queue
863
    $my_message->{to_address} = 'fixme@kidclamp.iswrong';
860
    $my_message->{to_address} = 'fixme@kidclamp.iswrong';
864
    $message_id = C4::Letters::EnqueueLetter($my_message);
861
    C4::Letters::EnqueueLetter($my_message);
865
862
866
    my $number_attempted = C4::Letters::SendQueuedMessages({
863
    my $number_attempted = C4::Letters::SendQueuedMessages({
867
        borrowernumber => -1, # -1 still triggers the borrowernumber condition
864
        borrowernumber => -1, # -1 still triggers the borrowernumber condition
Lines 875-880 subtest 'SendQueuedMessages' => sub { Link Here
875
872
876
    my $sms_message_address = $schema->resultset('MessageQueue')->search({
873
    my $sms_message_address = $schema->resultset('MessageQueue')->search({
877
        borrowernumber => $borrowernumber,
874
        borrowernumber => $borrowernumber,
875
        message_transport_type => 'sms',
878
        status => 'sent'
876
        status => 'sent'
879
    })->next()->to_address();
877
    })->next()->to_address();
880
    is( $sms_message_address, '5555555555@kidclamp.rocks', 'SendQueuedMessages populates the to address correctly for SMS by email when to_address is set incorrectly' );
878
    is( $sms_message_address, '5555555555@kidclamp.rocks', 'SendQueuedMessages populates the to address correctly for SMS by email when to_address is set incorrectly' );
Lines 989-995 subtest 'Test message_id parameter for SendQueuedMessages' => sub { Link Here
989
        'message_transport_type' => 'email',
987
        'message_transport_type' => 'email',
990
        'from_address'           => 'root@localhost' # invalid KohaAdminEmailAddress
988
        'from_address'           => 'root@localhost' # invalid KohaAdminEmailAddress
991
    };
989
    };
992
    my $message_id = C4::Letters::EnqueueLetter($my_message);
990
    my ($message_id) = C4::Letters::EnqueueLetter($my_message);
993
    throws_ok {
991
    throws_ok {
994
        C4::Letters::SendQueuedMessages( { message_id => $message_id } );
992
        C4::Letters::SendQueuedMessages( { message_id => $message_id } );
995
    } 'Koha::Exceptions::BadParameter',
993
    } 'Koha::Exceptions::BadParameter',
Lines 999-1008 subtest 'Test message_id parameter for SendQueuedMessages' => sub { Link Here
999
    is( $message_1->{status}, 'pending', 'Invalid KohaAdminEmailAddress => status pending' );
997
    is( $message_1->{status}, 'pending', 'Invalid KohaAdminEmailAddress => status pending' );
1000
998
1001
    $my_message->{from_address} = 'root@example.org'; # valid KohaAdminEmailAddress
999
    $my_message->{from_address} = 'root@example.org'; # valid KohaAdminEmailAddress
1002
    $message_id = C4::Letters::EnqueueLetter($my_message);
1000
    ($message_id) = C4::Letters::EnqueueLetter($my_message);
1003
    C4::Letters::SendQueuedMessages( { message_id => $message_id } );
1001
    C4::Letters::SendQueuedMessages( { message_id => $message_id } );
1004
    $message_1 = C4::Letters::GetMessage($message_1->{message_id});
1002
    $message_1 = C4::Letters::GetMessage($message_1->{message_id});
1005
    my $message_2 = C4::Letters::GetMessage($message_id);
1003
    my $message_2 = C4::Letters::GetMessage($message_id);
1006
    is( $message_1->{status}, 'pending', 'Message 1 status is unchanged' ); # Must be 'failed'
1004
    is( $message_1->{status}, 'pending', 'Message 1 status is unchanged' ); # Must be 'failed'
1007
    is( $message_2->{status}, 'sent', 'Valid KohaAdminEmailAddress => status sent' );
1005
    is( $message_2->{status}, 'sent', 'Valid KohaAdminEmailAddress => status sent' );
1008
};
1006
};
1009
- 
1007
1008
subtest 'EnqueueLetter and AutoEmailPrimaryAddress' => sub {
1009
    plan tests => 19;
1010
1011
    my ( $email, $emailpro ) = ( 'email@example.org', 'emailpro@example.org' );
1012
    my $borrowernumber = Koha::Patron->new({
1013
        firstname    => 'Jane',
1014
        surname      => 'Smith',
1015
        categorycode => $patron_category,
1016
        branchcode   => $library->{branchcode},
1017
        dateofbirth  => $date,
1018
        smsalertnumber => undef,
1019
        email        => $email,
1020
        emailpro     => $emailpro,
1021
    })->store->borrowernumber;
1022
1023
    my $my_message = {
1024
        borrowernumber         => $borrowernumber,
1025
        message_transport_type => 'email',
1026
        to_address             => 'to@example.com',
1027
        from_address           => 'from@example.com',
1028
        letter                 => {
1029
            content      => 'a message',
1030
            title        => 'message title',
1031
            metadata     => 'metadata',
1032
            code         => 'TEST_MESSAGE',
1033
            content_type => 'text/plain',
1034
        },
1035
    };
1036
1037
    $dbh->do(q|DELETE FROM message_queue|);
1038
    t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email');
1039
    @message_ids = C4::Letters::EnqueueLetter($my_message);
1040
    is(scalar @message_ids, 1, 'message successfully queued' );
1041
    $messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
1042
    is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
1043
    is( $messages->[0]{to_address}, 'to@example.com', 'AutoEmailPrimaryAddress=email, EnqueueLetter used the to_address given in parameter' );
1044
1045
    $dbh->do(q|DELETE FROM message_queue|);
1046
    delete $my_message->{to_address};
1047
    @message_ids = C4::Letters::EnqueueLetter($my_message);
1048
    is(scalar @message_ids, 1, 'message successfully queued' );
1049
    $messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
1050
    is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
1051
    is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email, EnqueueLetter used the patron email address if no to_address is given in parameter' );
1052
1053
    $dbh->do(q|DELETE FROM message_queue|);
1054
    t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'emailpro');
1055
    @message_ids = C4::Letters::EnqueueLetter($my_message);
1056
    is( scalar @message_ids, 1, 'message successfully queued' );
1057
    $messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
1058
    is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
1059
    is( $messages->[0]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=emailpro, EnqueueLetter used the patron emailpro address if no to_address is given in parameter' );
1060
1061
    $dbh->do(q|DELETE FROM message_queue|);
1062
    t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'OFF');
1063
    @message_ids = C4::Letters::EnqueueLetter($my_message);
1064
    is( scalar @message_ids, 1, 'message successfully queued' );
1065
    $messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
1066
    is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
1067
    is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=OFF, EnqueueLetter used the patron email address if no to_address is given in parameter' );
1068
1069
    $dbh->do(q|DELETE FROM message_queue|);
1070
    t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email,OFF,emailpro'); # This is no consistent. OFF should be alone.
1071
    @message_ids = C4::Letters::EnqueueLetter($my_message);
1072
    is( scalar @message_ids, 1, 'message successfully queued' );
1073
    $messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
1074
    is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
1075
    is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email,OFF,emailpro, EnqueueLetter used the patron email address if no to_address is given in parameter' );
1076
1077
    $dbh->do(q|DELETE FROM message_queue|);
1078
    t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email,emailpro');
1079
    @message_ids = C4::Letters::EnqueueLetter($my_message);
1080
    is( scalar @message_ids, 2, 'messages successfully queued' );
1081
    $messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
1082
    is( scalar( @$messages ), 2, 'The messages have been queued for the expected patron' );
1083
    is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email,emailpro, EnqueueLetter used the patron email address for the first letter' );
1084
    is( $messages->[1]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=email,emailpro, EnqueueLetter used the patron emailpro address for the second letter' );
1085
};

Return to bug 12802