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

(-)a/C4/Letters.pm (-65 / +61 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::DateUtils qw( format_sqldatetime dt_from_string );
39
use Koha::DateUtils qw( format_sqldatetime dt_from_string );
40
use Koha::Patrons;
40
use Koha::Patrons;
Lines 977-983 sub EnqueueLetter { Link Here
977
    my $params = shift or return;
977
    my $params = shift or return;
978
978
979
    return unless exists $params->{'letter'};
979
    return unless exists $params->{'letter'};
980
#   return unless exists $params->{'borrowernumber'};
981
    return unless exists $params->{'message_transport_type'};
980
    return unless exists $params->{'message_transport_type'};
982
981
983
    my $content = $params->{letter}->{content};
982
    my $content = $params->{letter}->{content};
Lines 997-1024 sub EnqueueLetter { Link Here
997
        );
996
        );
998
    }
997
    }
999
998
1000
    my $dbh       = C4::Context->dbh();
999
    my @to_addresses;
1001
    my $statement = << 'ENDSQL';
1000
    if ( $params->{to_address} ) {
1002
INSERT INTO message_queue
1001
        @to_addresses = ( $params->{to_address} );
1003
( borrowernumber, subject, content, metadata, letter_code, message_transport_type, status, time_queued, to_address, from_address, content_type )
1002
    } elsif ( $params->{borrowernumber} and $params->{message_transport_type} eq 'email' ) {
1004
VALUES
1003
        @to_addresses = @{ C4::Members::GetNoticeEmailAddresses( $params->{borrowernumber} ) };
1005
( ?,              ?,       ?,       ?,        ?,           ?,                      ?,      NOW(),       ?,          ?,            ? )
1004
    }
1006
ENDSQL
1007
1005
1008
    my $sth    = $dbh->prepare($statement);
1006
    my $from_address;
1009
    my $result = $sth->execute(
1007
    if ( $params->{from_address} ) {
1010
        $params->{'borrowernumber'},              # borrowernumber
1008
        $from_address = $params->{from_address};
1011
        $params->{'letter'}->{'title'},           # subject
1009
    } elsif ( $params->{message_transport_type} eq 'email' ) {
1012
        $params->{'letter'}->{'content'},         # content
1010
        if ( $params->{borrowernumber} ) {
1013
        $params->{'letter'}->{'metadata'} || '',  # metadata
1011
            my $rs = Koha::Database->new->schema->resultset('Borrower')->search({ borrowernumber => $params->{borrowernumber} }, {join => 'branchcode'});
1014
        $params->{'letter'}->{'code'}     || '',  # letter_code
1012
            $from_address = $rs->next->branchcode->branchemail;
1015
        $params->{'message_transport_type'},      # message_transport_type
1013
        }
1016
        'pending',                                # status
1014
1017
        $params->{'to_address'},                  # to_address
1015
        $from_address ||= C4::Context->preference('KohaAdminEmailAddress');
1018
        $params->{'from_address'},                # from_address
1016
    }
1019
        $params->{'letter'}->{'content-type'},    # content_type
1017
1020
    );
1018
    my $rs = Koha::Database->new->schema->resultset('MessageQueue');
1021
    return $dbh->last_insert_id(undef,undef,'message_queue', undef);
1019
    for my $to_address ( @to_addresses ) {
1020
        $rs->create({
1021
            borrowernumber => $params->{borrowernumber},
1022
            subject => $params->{letter}{title},
1023
            content => $params->{letter}{content},
1024
            metadata => ( $params->{letter}{metadata} || '' ),
1025
            letter_code => ( $params->{letter}{code}     || ''),
1026
            message_transport_type => $params->{message_transport_type},
1027
            status => 'pending',
1028
            to_address => $to_address,
1029
            from_address => $from_address,
1030
            content_type => $params->{letter}{'content-type'},
1031
        });
1032
    }
1033
    return scalar( @to_addresses );
1022
}
1034
}
1023
1035
1024
=head2 SendQueuedMessages ([$hashref]) 
1036
=head2 SendQueuedMessages ([$hashref]) 
Lines 1043-1048 sub SendQueuedMessages { Link Here
1043
          if $params->{'verbose'} or $debug;
1055
          if $params->{'verbose'} or $debug;
1044
        # This is just begging for subclassing
1056
        # This is just begging for subclassing
1045
        next MESSAGE if ( lc($message->{'message_transport_type'}) eq 'rss' );
1057
        next MESSAGE if ( lc($message->{'message_transport_type'}) eq 'rss' );
1058
1046
        if ( lc( $message->{'message_transport_type'} ) eq 'email' ) {
1059
        if ( lc( $message->{'message_transport_type'} ) eq 'email' ) {
1047
            _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} );
1060
            _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} );
1048
        }
1061
        }
Lines 1123-1153 list of hashes, each has represents a message in the message queue. Link Here
1123
sub GetQueuedMessages {
1136
sub GetQueuedMessages {
1124
    my $params = shift;
1137
    my $params = shift;
1125
1138
1126
    my $dbh = C4::Context->dbh();
1139
    my $rs = Koha::Database->new->schema->resultset('MessageQueue')->search(
1127
    my $statement = << 'ENDSQL';
1140
        {
1128
SELECT message_id, borrowernumber, subject, content, message_transport_type, status, time_queued
1141
            (
1129
FROM message_queue
1142
                $params->{borrowernumber}
1130
ENDSQL
1143
                ? ( borrowernumber => $params->{borrowernumber} )
1131
1144
                : ()
1132
    my @query_params;
1145
            ),
1133
    my @whereclauses;
1146
        },
1134
    if ( exists $params->{'borrowernumber'} ) {
1147
        {
1135
        push @whereclauses, ' borrowernumber = ? ';
1148
            (
1136
        push @query_params, $params->{'borrowernumber'};
1149
                $params->{limit}
1137
    }
1150
                ? ( rows => $params->{limit} )
1138
1151
                : ()
1139
    if ( @whereclauses ) {
1152
            ),
1140
        $statement .= ' WHERE ' . join( 'AND', @whereclauses );
1153
        },
1141
    }
1154
    );
1142
1155
    $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
1143
    if ( defined $params->{'limit'} ) {
1156
    return [ $rs->all ];
1144
        $statement .= ' LIMIT ? ';
1145
        push @query_params, $params->{'limit'};
1146
    }
1147
1148
    my $sth = $dbh->prepare( $statement );
1149
    my $result = $sth->execute( @query_params );
1150
    return $sth->fetchall_arrayref({});
1151
}
1157
}
1152
1158
1153
=head2 GetMessageTransportTypes
1159
=head2 GetMessageTransportTypes
Lines 1304-1324 sub _send_message_by_email { Link Here
1304
1310
1305
    my $patron = Koha::Patrons->find( $message->{borrowernumber} );
1311
    my $patron = Koha::Patrons->find( $message->{borrowernumber} );
1306
    my $to_address = $message->{'to_address'};
1312
    my $to_address = $message->{'to_address'};
1307
    unless ($to_address) {
1313
    unless ($patron and $to_address) {
1308
        unless ($patron) {
1314
        warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})" unless $patron;
1309
            warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})";
1315
        _set_message_status({
1310
            _set_message_status( { message_id => $message->{'message_id'},
1316
            message_id => $message->{message_id},
1311
                                   status     => 'failed' } );
1317
            status     => 'failed',
1312
            return;
1318
        });
1313
        }
1319
        return;
1314
        $to_address = C4::Members::GetNoticeEmailAddress( $message->{'borrowernumber'} );
1315
        unless ($to_address) {  
1316
            # warn "FAIL: No 'to_address' and no email for " . ($member->{surname} ||'') . ", borrowernumber ($message->{borrowernumber})";
1317
            # warning too verbose for this more common case?
1318
            _set_message_status( { message_id => $message->{'message_id'},
1319
                                   status     => 'failed' } );
1320
            return;
1321
        }
1322
    }
1320
    }
1323
1321
1324
    my $utf8   = decode('MIME-Header', $message->{'subject'} );
1322
    my $utf8   = decode('MIME-Header', $message->{'subject'} );
Lines 1354-1361 sub _send_message_by_email { Link Here
1354
       $sendmail_params{ Bcc } = $bcc;
1352
       $sendmail_params{ Bcc } = $bcc;
1355
    }
1353
    }
1356
1354
1357
    _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
1358
1359
    if ( sendmail( %sendmail_params ) ) {
1355
    if ( sendmail( %sendmail_params ) ) {
1360
        _set_message_status( { message_id => $message->{'message_id'},
1356
        _set_message_status( { message_id => $message->{'message_id'},
1361
                status     => 'sent' } );
1357
                status     => 'sent' } );
(-)a/C4/Members.pm (-20 / +25 lines)
Lines 65-71 BEGIN { Link Here
65
        &GetAllIssues
65
        &GetAllIssues
66
66
67
        &GetFirstValidEmailAddress
67
        &GetFirstValidEmailAddress
68
        &GetNoticeEmailAddress
68
        &GetNoticeEmailAddresses
69
69
70
        &GetMemberAccountRecords
70
        &GetMemberAccountRecords
71
        &GetBorNotifyAcctRecord
71
        &GetBorNotifyAcctRecord
Lines 936-968 sub GetFirstValidEmailAddress { Link Here
936
    return $borrower->first_valid_email_address();
936
    return $borrower->first_valid_email_address();
937
}
937
}
938
938
939
=head2 GetNoticeEmailAddress
939
=head2 GetNoticeEmailAddresses
940
940
941
  $email = GetNoticeEmailAddress($borrowernumber);
941
  $emails = GetNoticeEmailAddresses( borrowernumber );
942
942
943
Return the email address of borrower used for notices, given the borrowernumber.
943
Return the email addresses of borrower used for notices, given the borrowernumber.
944
Returns the empty string if no email address.
944
Returns an empty arrayref if no email address.
945
945
946
=cut
946
=cut
947
947
948
sub GetNoticeEmailAddress {
948
sub GetNoticeEmailAddresses {
949
    my $borrowernumber = shift;
949
    my $borrowernumber = shift;
950
950
951
    my $which_address = C4::Context->preference("AutoEmailPrimaryAddress");
951
    my $which_addresses = C4::Context->preference("AutoEmailPrimaryAddress");
952
    # if syspref is set to 'first valid' (value == OFF), look up email address
952
    my @email_addresses;
953
    if ( $which_address eq 'OFF' ) {
953
    for my $email_address_field ( split /,/, $which_addresses ) {
954
        return GetFirstValidEmailAddress($borrowernumber);
954
955
        # if syspref is set to 'first valid' (value == OFF), look up email address
956
        if ( $email_address_field eq 'OFF' ) {
957
            return [ GetFirstValidEmailAddress($borrowernumber) ];
958
        }
959
960
        # specified email address field
961
        my $email_address = C4::Context->dbh->selectcol_arrayref(
962
            qq|
963
                SELECT $email_address_field AS email
964
                FROM borrowers
965
                WHERE borrowernumber = ?
966
            |, {}, $borrowernumber
967
        );
968
        push @email_addresses, $email_address->[0] if $email_address->[0];
955
    }
969
    }
956
    # specified email address field
970
    return \@email_addresses;
957
    my $dbh = C4::Context->dbh;
958
    my $sth = $dbh->prepare( qq{
959
        SELECT $which_address AS primaryemail
960
        FROM borrowers
961
        WHERE borrowernumber=?
962
    } );
963
    $sth->execute($borrowernumber);
964
    my $data = $sth->fetchrow_hashref;
965
    return $data->{'primaryemail'} || '';
966
}
971
}
967
972
968
=head2 GetBorrowersToExpunge
973
=head2 GetBorrowersToExpunge
(-)a/C4/Message.pm (-26 lines)
Lines 158-164 the message. Link Here
158
sub enqueue {
158
sub enqueue {
159
    my ($class, $letter, $borrower, $transport) = @_;
159
    my ($class, $letter, $borrower, $transport) = @_;
160
    my $metadata   = _metadata($letter);
160
    my $metadata   = _metadata($letter);
161
    my $to_address = _to_address($borrower, $transport);
162
161
163
    # Same as render_metadata
162
    # Same as render_metadata
164
    my $format ||= sub { $_[0] || "" };
163
    my $format ||= sub { $_[0] || "" };
Lines 170-203 sub enqueue { Link Here
170
        letter                 => $letter,
169
        letter                 => $letter,
171
        borrowernumber         => $borrower->{borrowernumber},
170
        borrowernumber         => $borrower->{borrowernumber},
172
        message_transport_type => $transport,
171
        message_transport_type => $transport,
173
        to_address             => $to_address,
174
    });
172
    });
175
}
173
}
176
174
177
# based on message $transport, pick an appropriate address to send to
178
sub _to_address {
179
    my ($borrower, $transport) = @_;
180
    my $address;
181
    if ($transport eq 'email') {
182
        $address = $borrower->{email}
183
            || $borrower->{emailpro}
184
            || $borrower->{B_email};
185
    } elsif ($transport eq 'sms') {
186
        $address = $borrower->{smsalertnumber}
187
            || $borrower->{phone}
188
            || $borrower->{phonepro}
189
            || $borrower->{B_phone};
190
    } else {
191
        warn "'$transport' is an unknown message transport.";
192
    }
193
    if (not defined $address) {
194
        warn "An appropriate $transport address "
195
            . "for borrower $borrower->{userid} "
196
            . "could not be found.";
197
    }
198
    return $address;
199
}
200
201
# _metadata($letter) -- return the letter split into head/body/footer
175
# _metadata($letter) -- return the letter split into head/body/footer
202
sub _metadata {
176
sub _metadata {
203
    my ($letter) = @_;
177
    my ($letter) = @_;
(-)a/C4/Reserves.pm (-9 / +8 lines)
Lines 245-252 sub AddReserve { Link Here
245
                {   letter                 => $letter,
245
                {   letter                 => $letter,
246
                    borrowernumber         => $borrowernumber,
246
                    borrowernumber         => $borrowernumber,
247
                    message_transport_type => 'email',
247
                    message_transport_type => 'email',
248
                    from_address           => $admin_email_address,
248
                    to_address             => $admin_email_address,
249
                    to_address           => $admin_email_address,
250
                }
249
                }
251
            );
250
            );
252
        }
251
        }
Lines 604-615 sub GetReservesForBranch { Link Here
604
Takes an itemnumber and returns the status of the reserve placed on it.
603
Takes an itemnumber and returns the status of the reserve placed on it.
605
If several reserves exist, the reserve with the lower priority is given.
604
If several reserves exist, the reserve with the lower priority is given.
606
605
607
=cut
608
609
## FIXME: I don't think this does what it thinks it does.
606
## FIXME: I don't think this does what it thinks it does.
610
## It only ever checks the first reserve result, even though
607
## It only ever checks the first reserve result, even though
611
## multiple reserves for that bib can have the itemnumber set
608
## multiple reserves for that bib can have the itemnumber set
612
## the sub is only used once in the codebase.
609
## the sub is only used once in the codebase.
610
611
=cut
612
613
sub GetReserveStatus {
613
sub GetReserveStatus {
614
    my ($itemnumber) = @_;
614
    my ($itemnumber) = @_;
615
615
Lines 1640-1648 sub _koha_notify_reserve { Link Here
1640
1640
1641
    my $patron = Koha::Patrons->find( $borrowernumber );
1641
    my $patron = Koha::Patrons->find( $borrowernumber );
1642
1642
1643
    # Try to get the borrower's email address
1644
    my $to_address = C4::Members::GetNoticeEmailAddress($borrowernumber);
1645
1646
    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( {
1643
    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( {
1647
            borrowernumber => $borrowernumber,
1644
            borrowernumber => $borrowernumber,
1648
            message_name => 'Hold_Filled'
1645
            message_name => 'Hold_Filled'
Lines 1681-1694 sub _koha_notify_reserve { Link Here
1681
        C4::Letters::EnqueueLetter( {
1678
        C4::Letters::EnqueueLetter( {
1682
            letter => $letter,
1679
            letter => $letter,
1683
            borrowernumber => $borrowernumber,
1680
            borrowernumber => $borrowernumber,
1684
            from_address => $admin_email_address,
1685
            message_transport_type => $mtt,
1681
            message_transport_type => $mtt,
1686
        } );
1682
        } );
1687
    };
1683
    };
1688
1684
1685
    # Try to get the borrower's email addresses
1686
    my $to_addresses = C4::Members::GetNoticeEmailAddresses($borrowernumber);
1687
1689
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
1688
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
1690
        next if (
1689
        next if (
1691
               ( $mtt eq 'email' and not $to_address ) # No email address
1690
               ( $mtt eq 'email' and not @$to_addresses ) # No email address
1692
            or ( $mtt eq 'sms'   and not $patron->smsalertnumber ) # No SMS number
1691
            or ( $mtt eq 'sms'   and not $patron->smsalertnumber ) # No SMS number
1693
            or ( $mtt eq 'phone' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl
1692
            or ( $mtt eq 'phone' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl
1694
        );
1693
        );
(-)a/members/memberentry.pl (-12 / +8 lines)
Lines 418-436 if ((!$nok) and $nodouble and ($op eq 'insert' or $op eq 'save')){ Link Here
418
        # If 'AutoEmailOpacUser' syspref is on, email user their account details from the 'notice' that matches the user's branchcode.
418
        # If 'AutoEmailOpacUser' syspref is on, email user their account details from the 'notice' that matches the user's branchcode.
419
        if ( C4::Context->preference("AutoEmailOpacUser") == 1 && $newdata{'userid'}  && $newdata{'password'}) {
419
        if ( C4::Context->preference("AutoEmailOpacUser") == 1 && $newdata{'userid'}  && $newdata{'password'}) {
420
            #look for defined primary email address, if blank - attempt to use borr.email and borr.emailpro instead
420
            #look for defined primary email address, if blank - attempt to use borr.email and borr.emailpro instead
421
            my $emailaddr;
421
            my @email_addresses;
422
            if  (C4::Context->preference("AutoEmailPrimaryAddress") ne 'OFF'  && 
422
            for my $field ( split /,/, C4::Context->preference("AutoEmailPrimaryAddress") ) {
423
                $newdata{C4::Context->preference("AutoEmailPrimaryAddress")} =~  /\w\@\w/ ) {
423
                push @email_addresses, $_ if $newdata{$_} =~ /\w@\w/
424
                $emailaddr =   $newdata{C4::Context->preference("AutoEmailPrimaryAddress")} 
425
            } 
426
            elsif ($newdata{email} =~ /\w\@\w/) {
427
                $emailaddr = $newdata{email} 
428
            }
424
            }
429
            elsif ($newdata{emailpro} =~ /\w\@\w/) {
425
            my $emailaddr = join ", ", @email_addresses;
430
                $emailaddr = $newdata{emailpro} 
426
            unless ( $emailaddr ) {
431
            }
427
                for my $field ( qw( email emailpro B_email ) ) {
432
            elsif ($newdata{B_email} =~ /\w\@\w/) {
428
                    $emailaddr = $newdata{$field} if $newdata{$field} =~ m|\w\@\w|;
433
                $emailaddr = $newdata{B_email} 
429
                }
434
            }
430
            }
435
            # if we manage to find a valid email address, send notice 
431
            # if we manage to find a valid email address, send notice 
436
            if ($emailaddr) {
432
            if ($emailaddr) {
(-)a/misc/cronjobs/overdue_notices.pl (-5 / +5 lines)
Lines 581-588 END_SQL Link Here
581
                  and warn "borrower $borr has items triggering level $i.";
581
                  and warn "borrower $borr has items triggering level $i.";
582
582
583
                @emails_to_use = ();
583
                @emails_to_use = ();
584
                my $notice_email =
585
                    C4::Members::GetNoticeEmailAddress($borrowernumber);
586
                unless ($nomail) {
584
                unless ($nomail) {
587
                    if (@emails) {
585
                    if (@emails) {
588
                        foreach (@emails) {
586
                        foreach (@emails) {
Lines 590-596 END_SQL Link Here
590
                        }
588
                        }
591
                    }
589
                    }
592
                    else {
590
                    else {
593
                        push @emails_to_use, $notice_email if ($notice_email);
591
                        my $notice_emails =
592
                            C4::Members::GetNoticeEmailAddresses($borrowernumber);
593
                        push @emails_to_use, @$notice_emails;
594
                    }
594
                    }
595
                }
595
                }
596
596
Lines 730-736 END_SQL Link Here
730
                              letternumber   => $i,
730
                              letternumber   => $i,
731
                              postcode       => $data->{'zipcode'},
731
                              postcode       => $data->{'zipcode'},
732
                              country        => $data->{'country'},
732
                              country        => $data->{'country'},
733
                              email          => $notice_email,
733
                              email          => ( scalar( @emails_to_use ) ? $emails_to_use[0] : undef ),
734
                              itemcount      => $itemcount,
734
                              itemcount      => $itemcount,
735
                              titles         => $titles,
735
                              titles         => $titles,
736
                              outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
736
                              outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
Lines 749-755 END_SQL Link Here
749
                                  city           => $data->{'city'},
749
                                  city           => $data->{'city'},
750
                                  postcode       => $data->{'zipcode'},
750
                                  postcode       => $data->{'zipcode'},
751
                                  country        => $data->{'country'},
751
                                  country        => $data->{'country'},
752
                                  email          => $notice_email,
752
                                  email          => ( scalar( @emails_to_use ) ? $emails_to_use[0] : undef ),
753
                                  itemcount      => $itemcount,
753
                                  itemcount      => $itemcount,
754
                                  titles         => $titles,
754
                                  titles         => $titles,
755
                                  outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
755
                                  outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
(-)a/opac/opac-memberentry.pl (-3 / +1 lines)
Lines 182-192 if ( $action eq 'create' ) { Link Here
182
182
183
            C4::Letters::EnqueueLetter(
183
            C4::Letters::EnqueueLetter(
184
                {
184
                {
185
                    borrowernumber         => $borrower{borrowernumber},
185
                    letter                 => $letter,
186
                    letter                 => $letter,
186
                    message_transport_type => 'email',
187
                    message_transport_type => 'email',
187
                    to_address             => $borrower{'email'},
188
                    from_address =>
189
                      C4::Context->preference('KohaAdminEmailAddress'),
190
                }
188
                }
191
            );
189
            );
192
        }
190
        }
(-)a/opac/opac-shareshelf.pl (-6 / +4 lines)
Lines 166-173 sub show_accept { Link Here
166
sub notify_owner {
166
sub notify_owner {
167
    my ($param) = @_;
167
    my ($param) = @_;
168
168
169
    my $toaddr = C4::Members::GetNoticeEmailAddress( $param->{owner} );
169
    my $toaddr = C4::Members::GetNoticeEmailAddresses( $param->{owner} );
170
    return if !$toaddr;
170
    return unless scalar( @$toaddr );
171
171
172
172
    my $patron = Koha::Patrons->find( $param->{owner} );
173
    my $patron = Koha::Patrons->find( $param->{owner} );
173
174
Lines 184-193 sub notify_owner { Link Here
184
    #send letter to queue
185
    #send letter to queue
185
    C4::Letters::EnqueueLetter(
186
    C4::Letters::EnqueueLetter(
186
        {
187
        {
188
            borrowernumber         => $param->{owner},
187
            letter                 => $letter,
189
            letter                 => $letter,
188
            message_transport_type => 'email',
190
            message_transport_type => 'email',
189
            from_address => C4::Context->preference('KohaAdminEmailAddress'),
190
            to_address   => $toaddr,
191
        }
191
        }
192
    );
192
    );
193
}
193
}
Lines 213-219 sub process_addrlist { Link Here
213
213
214
sub send_invitekey {
214
sub send_invitekey {
215
    my ($param) = @_;
215
    my ($param) = @_;
216
    my $fromaddr = C4::Context->preference('KohaAdminEmailAddress');
217
    my $url =
216
    my $url =
218
        C4::Context->preference('OPACBaseURL')
217
        C4::Context->preference('OPACBaseURL')
219
      . "/cgi-bin/koha/opac-shareshelf.pl?shelfnumber="
218
      . "/cgi-bin/koha/opac-shareshelf.pl?shelfnumber="
Lines 255-261 sub send_invitekey { Link Here
255
            {
254
            {
256
                letter                 => $letter,
255
                letter                 => $letter,
257
                message_transport_type => 'email',
256
                message_transport_type => 'email',
258
                from_address           => $fromaddr,
259
                to_address             => $a,
257
                to_address             => $a,
260
            }
258
            }
261
        );
259
        );
(-)a/t/db_dependent/Letters.t (-10 / +67 lines)
Lines 18-24 Link Here
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
18
# along with Koha; if not, see <http://www.gnu.org/licenses>.
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
use Test::More tests => 76;
21
use Test::More tests => 82;
22
use Test::MockModule;
22
use Test::MockModule;
23
use Test::Warn;
23
use Test::Warn;
24
24
Lines 64-69 my $library = $builder->build({ Link Here
64
});
64
});
65
my $patron_category = $builder->build({ source => 'Category' })->{categorycode};
65
my $patron_category = $builder->build({ source => 'Category' })->{categorycode};
66
my $date = dt_from_string;
66
my $date = dt_from_string;
67
my ( $email, $emailpro ) = ( 'email@example.org', 'emailpro@example.org' );
67
my $borrowernumber = AddMember(
68
my $borrowernumber = AddMember(
68
    firstname    => 'Jane',
69
    firstname    => 'Jane',
69
    surname      => 'Smith',
70
    surname      => 'Smith',
Lines 71-76 my $borrowernumber = AddMember( Link Here
71
    branchcode   => $library->{branchcode},
72
    branchcode   => $library->{branchcode},
72
    dateofbirth  => $date,
73
    dateofbirth  => $date,
73
    smsalertnumber => undef,
74
    smsalertnumber => undef,
75
    email        => $email,
76
    emailpro     => $emailpro,
74
);
77
);
75
78
76
my $marc_record = MARC::Record->new;
79
my $marc_record = MARC::Record->new;
Lines 98-105 my $my_message = { Link Here
98
    to_address             => undef,
101
    to_address             => undef,
99
    from_address           => 'from@example.com',
102
    from_address           => 'from@example.com',
100
};
103
};
101
my $message_id = C4::Letters::EnqueueLetter($my_message);
104
is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the letter argument returns undef' );
102
is( $message_id, undef, 'EnqueueLetter without the letter argument returns undef' );
103
105
104
delete $my_message->{message_transport_type};
106
delete $my_message->{message_transport_type};
105
$my_message->{letter} = {
107
$my_message->{letter} = {
Lines 109-121 $my_message->{letter} = { Link Here
109
    code         => 'TEST_MESSAGE',
111
    code         => 'TEST_MESSAGE',
110
    content_type => 'text/plain',
112
    content_type => 'text/plain',
111
};
113
};
112
$message_id = C4::Letters::EnqueueLetter($my_message);
114
is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the message_transport_type argument returns undef' );
113
is( $message_id, undef, 'EnqueueLetter without the message type argument argument returns undef' );
114
115
115
$my_message->{message_transport_type} = 'sms';
116
$my_message->{message_transport_type} = 'sms';
116
$message_id = C4::Letters::EnqueueLetter($my_message);
117
my $messages_queued = C4::Letters::EnqueueLetter($my_message);
117
ok(defined $message_id && $message_id > 0, 'new message successfully queued');
118
is($messages_queued, 1, 'new message successfully queued');
118
119
119
120
# GetQueuedMessages
120
# GetQueuedMessages
121
my $messages = C4::Letters::GetQueuedMessages();
121
my $messages = C4::Letters::GetQueuedMessages();
Lines 123-129 is( @$messages, 1, 'GetQueuedMessages without argument returns all the entries' Link Here
123
123
124
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
124
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
125
is( @$messages, 1, 'one message stored for the borrower' );
125
is( @$messages, 1, 'one message stored for the borrower' );
126
is( $messages->[0]->{message_id}, $message_id, 'EnqueueLetter returns the message id correctly' );
127
is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' );
126
is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' );
128
is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' );
127
is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' );
129
is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' );
128
is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' );
Lines 485-490 is($mail{'To'}, 'testemail@mydomain.com', "mailto correct in sent claim"); Link Here
485
is($mail{'Message'}, 'my vendor|John Smith|Ordernumber ' . $ordernumber . ' (Silence in the library) (1 ordered)', 'Claim notice text constructed successfully');
484
is($mail{'Message'}, 'my vendor|John Smith|Ordernumber ' . $ordernumber . ' (Silence in the library) (1 ordered)', 'Claim notice text constructed successfully');
486
}
485
}
487
486
487
# EnqueueLetter and AutoEmailPrimaryAddress
488
$my_message = {
489
    borrowernumber         => $borrowernumber,
490
    message_transport_type => 'email',
491
    to_address             => 'to@example.com',
492
    from_address           => 'from@example.com',
493
    letter                 => {
494
        content      => 'a message',
495
        title        => 'message title',
496
        metadata     => 'metadata',
497
        code         => 'TEST_MESSAGE',
498
        content_type => 'text/plain',
499
    },
500
};
501
502
$dbh->do(q|DELETE FROM message_queue|);
503
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email');
504
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
505
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
506
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
507
is( $messages->[0]{to_address}, 'to@example.com', 'AutoEmailPrimaryAddress=email, EnqueueLetter used the to_address given in parameter' );
508
509
$dbh->do(q|DELETE FROM message_queue|);
510
delete $my_message->{to_address};
511
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
512
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
513
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
514
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email, EnqueueLetter used the patron email address if no to_address is given in parameter' );
515
516
$dbh->do(q|DELETE FROM message_queue|);
517
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'emailpro');
518
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
519
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
520
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
521
is( $messages->[0]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=emailpro, EnqueueLetter used the patron emailpro address if no to_address is given in parameter' );
522
523
$dbh->do(q|DELETE FROM message_queue|);
524
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'OFF');
525
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
526
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
527
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
528
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=OFF, EnqueueLetter used the patron email address if no to_address is given in parameter' );
529
530
$dbh->do(q|DELETE FROM message_queue|);
531
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email|OFF|emailpro'); # This is no consistent. OFF should be alone.
532
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
533
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
534
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
535
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email|OFF|emailpro, EnqueueLetter used the patron email address if no to_address is given in parameter' );
536
537
$dbh->do(q|DELETE FROM message_queue|);
538
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email|emailpro');
539
is( C4::Letters::EnqueueLetter($my_message), 2, 'messages successfully queued' );
540
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
541
is( scalar( @$messages ), 2, 'The messages have been queued for the expected patron' );
542
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email|emailpro, EnqueueLetter used the patron email address for the first letter' );
543
is( $messages->[1]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=email|emailpro, EnqueueLetter used the patron emailpro address for the second letter' );
544
488
{
545
{
489
use C4::Serials;
546
use C4::Serials;
490
547
Lines 645-651 subtest 'SendQueuedMessages' => sub { Link Here
645
702
646
    my $sms_pro = $builder->build_object({ class => 'Koha::SMS::Providers', value => { domain => 'kidclamp.rocks' } });
703
    my $sms_pro = $builder->build_object({ class => 'Koha::SMS::Providers', value => { domain => 'kidclamp.rocks' } });
647
    ModMember( borrowernumber => $borrowernumber, smsalertnumber => '5555555555', sms_provider_id => $sms_pro->id() );
704
    ModMember( borrowernumber => $borrowernumber, smsalertnumber => '5555555555', sms_provider_id => $sms_pro->id() );
648
    $message_id = C4::Letters::EnqueueLetter($my_message); #using datas set around line 95 and forward
705
    C4::Letters::EnqueueLetter($my_message); #using datas set around line 95 and forward
649
    C4::Letters::SendQueuedMessages();
706
    C4::Letters::SendQueuedMessages();
650
    my $sms_message_address = $schema->resultset('MessageQueue')->search({
707
    my $sms_message_address = $schema->resultset('MessageQueue')->search({
651
        borrowernumber => $borrowernumber,
708
        borrowernumber => $borrowernumber,
(-)a/t/db_dependent/Members.t (-5 / +12 lines)
Lines 140-154 is ($checkcardnum, "2", "Card number is too long"); Link Here
140
140
141
t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'OFF' );
141
t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'OFF' );
142
C4::Context->clear_syspref_cache();
142
C4::Context->clear_syspref_cache();
143
my $notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
144
is_deeply( $notice_emails, [ $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is off" );
143
145
144
my $notice_email = GetNoticeEmailAddress($member->{'borrowernumber'});
146
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro,OFF' );
145
is ($notice_email, $EMAIL, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is off");
147
C4::Context->clear_syspref_cache();
148
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
149
is_deeply( $notice_emails, [ $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress contains off" );
146
150
147
t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'emailpro' );
151
t::lib::Mocks::mock_preference( 'AutoEmailPrimaryAddress', 'emailpro' );
148
C4::Context->clear_syspref_cache();
152
C4::Context->clear_syspref_cache();
153
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
154
is_deeply ($notice_emails, [ $EMAILPRO ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is emailpro");
149
155
150
$notice_email = GetNoticeEmailAddress($member->{'borrowernumber'});
156
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro,email' );
151
is ($notice_email, $EMAILPRO, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is emailpro");
157
C4::Context->clear_syspref_cache();
158
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
159
is_deeply ($notice_emails, [ $EMAILPRO, $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is emailpro|email");
152
160
153
# Check_Userid tests
161
# Check_Userid tests
154
%data = (
162
%data = (
155
- 

Return to bug 12802