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

(-)a/C4/Branch.pm (+8 lines)
Lines 20-25 use strict; Link Here
20
#use warnings; FIXME - Bug 2505
20
#use warnings; FIXME - Bug 2505
21
require Exporter;
21
require Exporter;
22
use C4::Context;
22
use C4::Context;
23
use Koha::Database;
23
24
24
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
25
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
25
26
Lines 570-575 sub GetBranchesCount { Link Here
570
    return $row->{'branches_count'};
571
    return $row->{'branches_count'};
571
}
572
}
572
573
574
sub GetBranchEmailFromBorrowernumber {
575
    my ( $borrowernumber ) = @_;
576
    return unless $borrowernumber;
577
    my $rs = Koha::Database->new->schema->resultset('Borrower')->search({ borrowernumber => $borrowernumber }, {join => 'branchcode'});
578
    return $rs->next->branchcode->branchemail;
579
}
580
573
1;
581
1;
574
__END__
582
__END__
575
583
(-)a/C4/Letters.pm (-71 / +61 lines)
Lines 31-36 use C4::Log; Link Here
31
use C4::SMS;
31
use C4::SMS;
32
use C4::Debug;
32
use C4::Debug;
33
use Koha::DateUtils;
33
use Koha::DateUtils;
34
use Koha::Database;
34
use Date::Calc qw( Add_Delta_Days );
35
use Date::Calc qw( Add_Delta_Days );
35
use Encode;
36
use Encode;
36
use Carp;
37
use Carp;
Lines 907-913 sub EnqueueLetter { Link Here
907
    my $params = shift or return;
908
    my $params = shift or return;
908
909
909
    return unless exists $params->{'letter'};
910
    return unless exists $params->{'letter'};
910
#   return unless exists $params->{'borrowernumber'};
911
    return unless exists $params->{'message_transport_type'};
911
    return unless exists $params->{'message_transport_type'};
912
912
913
    my $content = $params->{letter}->{content};
913
    my $content = $params->{letter}->{content};
Lines 927-954 sub EnqueueLetter { Link Here
927
        );
927
        );
928
    }
928
    }
929
929
930
    my $dbh       = C4::Context->dbh();
930
    my @to_addresses;
931
    my $statement = << 'ENDSQL';
931
    if ( $params->{to_address} ) {
932
INSERT INTO message_queue
932
        @to_addresses = ( $params->{to_address} );
933
( borrowernumber, subject, content, metadata, letter_code, message_transport_type, status, time_queued, to_address, from_address, content_type )
933
    } elsif ( $params->{borrowernumber} and $params->{message_transport_type} eq 'email' ) {
934
VALUES
934
        @to_addresses = @{ C4::Members::GetNoticeEmailAddresses( $params->{borrowernumber} ) };
935
( ?,              ?,       ?,       ?,        ?,           ?,                      ?,      NOW(),       ?,          ?,            ? )
935
    }
936
ENDSQL
937
936
938
    my $sth    = $dbh->prepare($statement);
937
    my $from_address;
939
    my $result = $sth->execute(
938
    if ( $params->{from_address} ) {
940
        $params->{'borrowernumber'},              # borrowernumber
939
        $from_address = $params->{from_address};
941
        $params->{'letter'}->{'title'},           # subject
940
    } elsif ( $params->{message_transport_type} eq 'email' ) {
942
        $params->{'letter'}->{'content'},         # content
941
        if ( $params->{borrowernumber} ) {
943
        $params->{'letter'}->{'metadata'} || '',  # metadata
942
            $from_address = C4::Branch::GetBranchEmailFromBorrowernumber( $params->{borrowernumber} );
944
        $params->{'letter'}->{'code'}     || '',  # letter_code
943
        }
945
        $params->{'message_transport_type'},      # message_transport_type
944
946
        'pending',                                # status
945
        $from_address ||= C4::Context->preference('KohaAdminEmailAddress');
947
        $params->{'to_address'},                  # to_address
946
    }
948
        $params->{'from_address'},                # from_address
947
949
        $params->{'letter'}->{'content-type'},    # content_type
948
    my $rs = Koha::Database->new->schema->resultset('MessageQueue');
950
    );
949
    for my $to_address ( @to_addresses ) {
951
    return $dbh->last_insert_id(undef,undef,'message_queue', undef);
950
        $rs->create({
951
            borrowernumber => $params->{borrowernumber},
952
            subject => $params->{letter}{title},
953
            content => $params->{letter}{content},
954
            metadata => ( $params->{letter}{metadata} || '' ),
955
            letter_code => ( $params->{letter}{code}     || ''),
956
            message_transport_type => $params->{message_transport_type},
957
            status => 'pending',
958
            to_address => $to_address,
959
            from_address => $from_address,
960
            content_type => $params->{letter}{'content-type'},
961
        });
962
    }
963
    return scalar( @to_addresses );
952
}
964
}
953
965
954
=head2 SendQueuedMessages ([$hashref]) 
966
=head2 SendQueuedMessages ([$hashref]) 
Lines 973-978 sub SendQueuedMessages { Link Here
973
          if $params->{'verbose'} or $debug;
985
          if $params->{'verbose'} or $debug;
974
        # This is just begging for subclassing
986
        # This is just begging for subclassing
975
        next MESSAGE if ( lc($message->{'message_transport_type'}) eq 'rss' );
987
        next MESSAGE if ( lc($message->{'message_transport_type'}) eq 'rss' );
988
976
        if ( lc( $message->{'message_transport_type'} ) eq 'email' ) {
989
        if ( lc( $message->{'message_transport_type'} ) eq 'email' ) {
977
            _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} );
990
            _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} );
978
        }
991
        }
Lines 1034-1064 list of hashes, each has represents a message in the message queue. Link Here
1034
sub GetQueuedMessages {
1047
sub GetQueuedMessages {
1035
    my $params = shift;
1048
    my $params = shift;
1036
1049
1037
    my $dbh = C4::Context->dbh();
1050
    my $rs = Koha::Database->new->schema->resultset('MessageQueue')->search(
1038
    my $statement = << 'ENDSQL';
1051
        {
1039
SELECT message_id, borrowernumber, subject, content, message_transport_type, status, time_queued
1052
            (
1040
FROM message_queue
1053
                $params->{borrowernumber}
1041
ENDSQL
1054
                ? ( borrowernumber => $params->{borrowernumber} )
1042
1055
                : ()
1043
    my @query_params;
1056
            ),
1044
    my @whereclauses;
1057
        },
1045
    if ( exists $params->{'borrowernumber'} ) {
1058
        {
1046
        push @whereclauses, ' borrowernumber = ? ';
1059
            (
1047
        push @query_params, $params->{'borrowernumber'};
1060
                $params->{limit}
1048
    }
1061
                ? ( rows => $params->{limit} )
1049
1062
                : ()
1050
    if ( @whereclauses ) {
1063
            ),
1051
        $statement .= ' WHERE ' . join( 'AND', @whereclauses );
1064
        },
1052
    }
1065
    );
1053
1066
    $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
1054
    if ( defined $params->{'limit'} ) {
1067
    return [ $rs->all ];
1055
        $statement .= ' LIMIT ? ';
1056
        push @query_params, $params->{'limit'};
1057
    }
1058
1059
    my $sth = $dbh->prepare( $statement );
1060
    my $result = $sth->execute( @query_params );
1061
    return $sth->fetchall_arrayref({});
1062
}
1068
}
1063
1069
1064
=head2 GetMessageTransportTypes
1070
=head2 GetMessageTransportTypes
Lines 1164-1185 sub _send_message_by_email { Link Here
1164
    my ($username, $password, $method) = @_;
1170
    my ($username, $password, $method) = @_;
1165
1171
1166
    my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} );
1172
    my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} );
1167
    my $to_address = $message->{'to_address'};
1173
1168
    unless ($to_address) {
1174
    unless ( $member and $message->{to_address} ) {
1169
        unless ($member) {
1175
        warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})" unless $member;
1170
            warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})";
1176
        _set_message_status({
1171
            _set_message_status( { message_id => $message->{'message_id'},
1177
            message_id => $message->{'message_id'},
1172
                                   status     => 'failed' } );
1178
            status     => 'failed'
1173
            return;
1179
        });
1174
        }
1180
        return;
1175
        $to_address = C4::Members::GetNoticeEmailAddress( $message->{'borrowernumber'} );
1176
        unless ($to_address) {  
1177
            # warn "FAIL: No 'to_address' and no email for " . ($member->{surname} ||'') . ", borrowernumber ($message->{borrowernumber})";
1178
            # warning too verbose for this more common case?
1179
            _set_message_status( { message_id => $message->{'message_id'},
1180
                                   status     => 'failed' } );
1181
            return;
1182
        }
1183
    }
1181
    }
1184
1182
1185
    my $utf8   = decode('MIME-Header', $message->{'subject'} );
1183
    my $utf8   = decode('MIME-Header', $message->{'subject'} );
Lines 1200-1206 sub _send_message_by_email { Link Here
1200
    my $email = Koha::Email->new();
1198
    my $email = Koha::Email->new();
1201
    my %sendmail_params = $email->create_message_headers(
1199
    my %sendmail_params = $email->create_message_headers(
1202
        {
1200
        {
1203
            to      => $to_address,
1204
            from    => $message->{'from_address'} || $branch_email,
1201
            from    => $message->{'from_address'} || $branch_email,
1205
            replyto => $branch_replyto,
1202
            replyto => $branch_replyto,
1206
            sender  => $branch_returnpath,
1203
            sender  => $branch_returnpath,
Lines 1215-1221 sub _send_message_by_email { Link Here
1215
       $sendmail_params{ Bcc } = $bcc;
1212
       $sendmail_params{ Bcc } = $bcc;
1216
    }
1213
    }
1217
1214
1218
    _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
1219
    if ( sendmail( %sendmail_params ) ) {
1215
    if ( sendmail( %sendmail_params ) ) {
1220
        _set_message_status( { message_id => $message->{'message_id'},
1216
        _set_message_status( { message_id => $message->{'message_id'},
1221
                status     => 'sent' } );
1217
                status     => 'sent' } );
Lines 1289-1300 sub _send_message_by_sms { Link Here
1289
    return $success;
1285
    return $success;
1290
}
1286
}
1291
1287
1292
sub _update_message_to_address {
1293
    my ($id, $to)= @_;
1294
    my $dbh = C4::Context->dbh();
1295
    $dbh->do('UPDATE message_queue SET to_address=? WHERE message_id=?',undef,($to,$id));
1296
}
1297
1298
sub _set_message_status {
1288
sub _set_message_status {
1299
    my $params = shift or return;
1289
    my $params = shift or return;
1300
1290
(-)a/C4/Members.pm (-20 / +25 lines)
Lines 70-76 BEGIN { Link Here
70
        &getidcity
70
        &getidcity
71
71
72
        &GetFirstValidEmailAddress
72
        &GetFirstValidEmailAddress
73
        &GetNoticeEmailAddress
73
        &GetNoticeEmailAddresses
74
74
75
        &GetAge
75
        &GetAge
76
        &GetCities
76
        &GetCities
Lines 1430-1462 sub GetFirstValidEmailAddress { Link Here
1430
    }
1430
    }
1431
}
1431
}
1432
1432
1433
=head2 GetNoticeEmailAddress
1433
=head2 GetNoticeEmailAddresses
1434
1434
1435
  $email = GetNoticeEmailAddress($borrowernumber);
1435
  $emails = GetNoticeEmailAddresses( borrowernumber );
1436
1436
1437
Return the email address of borrower used for notices, given the borrowernumber.
1437
Return the email addresses of borrower used for notices, given the borrowernumber.
1438
Returns the empty string if no email address.
1438
Returns an empty arrayref if no email address.
1439
1439
1440
=cut
1440
=cut
1441
1441
1442
sub GetNoticeEmailAddress {
1442
sub GetNoticeEmailAddresses {
1443
    my $borrowernumber = shift;
1443
    my $borrowernumber = shift;
1444
1444
1445
    my $which_address = C4::Context->preference("AutoEmailPrimaryAddress");
1445
    my $which_addresses = C4::Context->preference("AutoEmailPrimaryAddress");
1446
    # if syspref is set to 'first valid' (value == OFF), look up email address
1446
    my @email_addresses;
1447
    if ( $which_address eq 'OFF' ) {
1447
    for my $email_address_field ( split /,/, $which_addresses ) {
1448
        return GetFirstValidEmailAddress($borrowernumber);
1448
1449
        # if syspref is set to 'first valid' (value == OFF), look up email address
1450
        if ( $email_address_field eq 'OFF' ) {
1451
            return [ GetFirstValidEmailAddress($borrowernumber) ];
1452
        }
1453
1454
        # specified email address field
1455
        my $email_address = C4::Context->dbh->selectcol_arrayref(
1456
            qq|
1457
                SELECT $email_address_field AS email
1458
                FROM borrowers
1459
                WHERE borrowernumber = ?
1460
            |, {}, $borrowernumber
1461
        );
1462
        push @email_addresses, $email_address->[0] if $email_address->[0];
1449
    }
1463
    }
1450
    # specified email address field
1464
    return \@email_addresses;
1451
    my $dbh = C4::Context->dbh;
1452
    my $sth = $dbh->prepare( qq{
1453
        SELECT $which_address AS primaryemail
1454
        FROM borrowers
1455
        WHERE borrowernumber=?
1456
    } );
1457
    $sth->execute($borrowernumber);
1458
    my $data = $sth->fetchrow_hashref;
1459
    return $data->{'primaryemail'} || '';
1460
}
1465
}
1461
1466
1462
=head2 GetExpiryDate 
1467
=head2 GetExpiryDate 
(-)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 / +5 lines)
Lines 228-235 sub AddReserve { Link Here
228
                {   letter                 => $letter,
228
                {   letter                 => $letter,
229
                    borrowernumber         => $borrowernumber,
229
                    borrowernumber         => $borrowernumber,
230
                    message_transport_type => 'email',
230
                    message_transport_type => 'email',
231
                    from_address           => $admin_email_address,
231
                    to_address             => $admin_email_address,
232
                    to_address           => $admin_email_address,
233
                }
232
                }
234
            );
233
            );
235
        }
234
        }
Lines 1942-1950 sub _koha_notify_reserve { Link Here
1942
    my $dbh = C4::Context->dbh;
1941
    my $dbh = C4::Context->dbh;
1943
    my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
1942
    my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
1944
1943
1945
    # Try to get the borrower's email address
1946
    my $to_address = C4::Members::GetNoticeEmailAddress($borrowernumber);
1947
1948
    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( {
1944
    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( {
1949
            borrowernumber => $borrowernumber,
1945
            borrowernumber => $borrowernumber,
1950
            message_name => 'Hold_Filled'
1946
            message_name => 'Hold_Filled'
Lines 1960-1967 sub _koha_notify_reserve { Link Here
1960
    my $reserve = $sth->fetchrow_hashref;
1956
    my $reserve = $sth->fetchrow_hashref;
1961
    my $branch_details = GetBranchDetail( $reserve->{'branchcode'} );
1957
    my $branch_details = GetBranchDetail( $reserve->{'branchcode'} );
1962
1958
1963
    my $admin_email_address = $branch_details->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress');
1964
1965
    my %letter_params = (
1959
    my %letter_params = (
1966
        module => 'reserves',
1960
        module => 'reserves',
1967
        branchcode => $reserve->{branchcode},
1961
        branchcode => $reserve->{branchcode},
Lines 1990-2003 sub _koha_notify_reserve { Link Here
1990
        C4::Letters::EnqueueLetter( {
1984
        C4::Letters::EnqueueLetter( {
1991
            letter => $letter,
1985
            letter => $letter,
1992
            borrowernumber => $borrowernumber,
1986
            borrowernumber => $borrowernumber,
1993
            from_address => $admin_email_address,
1994
            message_transport_type => $mtt,
1987
            message_transport_type => $mtt,
1995
        } );
1988
        } );
1996
    };
1989
    };
1997
1990
1991
    # Try to get the borrower's email addresses
1992
    my $to_addresses = C4::Members::GetNoticeEmailAddresses($borrowernumber);
1993
1998
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
1994
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
1999
        next if (
1995
        next if (
2000
               ( $mtt eq 'email' and not $to_address ) # No email address
1996
               ( $mtt eq 'email' and not @$to_addresses ) # No email address
2001
            or ( $mtt eq 'sms'   and not $borrower->{smsalertnumber} ) # No SMS number
1997
            or ( $mtt eq 'sms'   and not $borrower->{smsalertnumber} ) # No SMS number
2002
            or ( $mtt eq 'phone' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl
1998
            or ( $mtt eq 'phone' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl
2003
        );
1999
        );
(-)a/misc/cronjobs/overdue_notices.pl (-6 / +5 lines)
Lines 569-576 END_SQL Link Here
569
                  and warn "borrower $borr has items triggering level $i.";
569
                  and warn "borrower $borr has items triggering level $i.";
570
570
571
                @emails_to_use = ();
571
                @emails_to_use = ();
572
                my $notice_email =
573
                    C4::Members::GetNoticeEmailAddress($borrowernumber);
574
                unless ($nomail) {
572
                unless ($nomail) {
575
                    if (@emails) {
573
                    if (@emails) {
576
                        foreach (@emails) {
574
                        foreach (@emails) {
Lines 578-584 END_SQL Link Here
578
                        }
576
                        }
579
                    }
577
                    }
580
                    else {
578
                    else {
581
                        push @emails_to_use, $notice_email if ($notice_email);
579
                        my $notice_emails =
580
                            C4::Members::GetNoticeEmailAddresses($borrowernumber);
581
                        push @emails_to_use, @$notice_emails;
582
                    }
582
                    }
583
                }
583
                }
584
584
Lines 718-724 END_SQL Link Here
718
                              letternumber   => $i,
718
                              letternumber   => $i,
719
                              postcode       => $data->{'zipcode'},
719
                              postcode       => $data->{'zipcode'},
720
                              country        => $data->{'country'},
720
                              country        => $data->{'country'},
721
                              email          => $notice_email,
721
                              email          => $notice_emails,
722
                              itemcount      => $itemcount,
722
                              itemcount      => $itemcount,
723
                              titles         => $titles,
723
                              titles         => $titles,
724
                              outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
724
                              outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
Lines 739-745 END_SQL Link Here
739
                                  city           => $data->{'city'},
739
                                  city           => $data->{'city'},
740
                                  postcode       => $data->{'zipcode'},
740
                                  postcode       => $data->{'zipcode'},
741
                                  country        => $data->{'country'},
741
                                  country        => $data->{'country'},
742
                                  email          => $notice_email,
742
                                  email          => ( scalar( @emails_to_use ) ? $emails_to_use[0] : undef ),
743
                                  itemcount      => $itemcount,
743
                                  itemcount      => $itemcount,
744
                                  titles         => $titles,
744
                                  titles         => $titles,
745
                                  outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
745
                                  outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
Lines 752-758 END_SQL Link Here
752
                                {   letter                 => $letter,
752
                                {   letter                 => $letter,
753
                                    borrowernumber         => $borrowernumber,
753
                                    borrowernumber         => $borrowernumber,
754
                                    message_transport_type => $mtt,
754
                                    message_transport_type => $mtt,
755
                                    from_address           => $admin_email_address,
756
                                    to_address             => join(',', @emails_to_use),
755
                                    to_address             => join(',', @emails_to_use),
757
                                }
756
                                }
758
                            );
757
                            );
(-)a/opac/opac-memberentry.pl (-3 / +1 lines)
Lines 129-139 if ( $action eq 'create' ) { Link Here
129
129
130
            C4::Letters::EnqueueLetter(
130
            C4::Letters::EnqueueLetter(
131
                {
131
                {
132
                    borrowernumber         => $borrower{borrowernumber},
132
                    letter                 => $letter,
133
                    letter                 => $letter,
133
                    message_transport_type => 'email',
134
                    message_transport_type => 'email',
134
                    to_address             => $borrower{'email'},
135
                    from_address =>
136
                      C4::Context->preference('KohaAdminEmailAddress'),
137
                }
135
                }
138
            );
136
            );
139
        }
137
        }
(-)a/opac/opac-shareshelf.pl (-6 / +4 lines)
Lines 158-165 sub show_accept { Link Here
158
sub notify_owner {
158
sub notify_owner {
159
    my ($param) = @_;
159
    my ($param) = @_;
160
160
161
    my $toaddr = C4::Members::GetNoticeEmailAddress( $param->{owner} );
161
    my $toaddr = C4::Members::GetNoticeEmailAddresses( $param->{owner} );
162
    return if !$toaddr;
162
    return unless scalar( @$toaddr );
163
163
164
164
    #prepare letter
165
    #prepare letter
165
    my $letter = C4::Letters::GetPreparedLetter(
166
    my $letter = C4::Letters::GetPreparedLetter(
Lines 173-182 sub notify_owner { Link Here
173
    #send letter to queue
174
    #send letter to queue
174
    C4::Letters::EnqueueLetter(
175
    C4::Letters::EnqueueLetter(
175
        {
176
        {
177
            borrowernumber         => $param->{owner},
176
            letter                 => $letter,
178
            letter                 => $letter,
177
            message_transport_type => 'email',
179
            message_transport_type => 'email',
178
            from_address => C4::Context->preference('KohaAdminEmailAddress'),
179
            to_address   => $toaddr,
180
        }
180
        }
181
    );
181
    );
182
}
182
}
Lines 202-208 sub process_addrlist { Link Here
202
202
203
sub send_invitekey {
203
sub send_invitekey {
204
    my ($param) = @_;
204
    my ($param) = @_;
205
    my $fromaddr = C4::Context->preference('KohaAdminEmailAddress');
206
    my $url =
205
    my $url =
207
        C4::Context->preference('OPACBaseURL')
206
        C4::Context->preference('OPACBaseURL')
208
      . "/cgi-bin/koha/opac-shareshelf.pl?shelfnumber="
207
      . "/cgi-bin/koha/opac-shareshelf.pl?shelfnumber="
Lines 243-249 sub send_invitekey { Link Here
243
            {
242
            {
244
                letter                 => $letter,
243
                letter                 => $letter,
245
                message_transport_type => 'email',
244
                message_transport_type => 'email',
246
                from_address           => $fromaddr,
247
                to_address             => $a,
245
                to_address             => $a,
248
            }
246
            }
249
        );
247
        );
(-)a/t/db_dependent/Branch.t (-5 / +21 lines)
Lines 21-29 use Modern::Perl; Link Here
21
use C4::Context;
21
use C4::Context;
22
use Data::Dumper;
22
use Data::Dumper;
23
23
24
use Test::More tests => 36;
24
use Test::More tests => 38;
25
25
26
use C4::Branch;
26
use C4::Branch;
27
use C4::Members qw( AddMember );
27
28
28
BEGIN {
29
BEGIN {
29
    use FindBin;
30
    use FindBin;
Lines 305-310 my $brCat1 = GetBranchesInCategory( $cat1->{categorycode} ); Link Here
305
my @b      = ( $b2->{branchcode} );
306
my @b      = ( $b2->{branchcode} );
306
is_deeply( $brCat1, \@b, 'CAT1 has branch BRB' );
307
is_deeply( $brCat1, \@b, 'CAT1 has branch BRB' );
307
308
309
my $b3_email = 'email_b3@example.org';
308
my $b3 = {
310
my $b3 = {
309
    add            => 1,
311
    add            => 1,
310
    branchcode     => 'BRC',
312
    branchcode     => 'BRC',
Lines 318-324 my $b3 = { Link Here
318
    branchcountry  => 'countryC',
320
    branchcountry  => 'countryC',
319
    branchphone    => 'phoneC',
321
    branchphone    => 'phoneC',
320
    branchfax      => 'faxC',
322
    branchfax      => 'faxC',
321
    branchemail    => 'emailC',
323
    branchemail    => $b3_email,
322
    branchurl      => 'urlC',
324
    branchurl      => 'urlC',
323
    branchip       => 'ipC',
325
    branchip       => 'ipC',
324
    branchprinter  => undef,
326
    branchprinter  => undef,
Lines 355-360 is_deeply($categories, [ {%$cat1}, {%$cat2},{ %new_category, selected => 1 } ], Link Here
355
my $loop = GetBranchesLoop;
357
my $loop = GetBranchesLoop;
356
is( scalar(@$loop), GetBranchesCount(), 'There is the right number of branches' );
358
is( scalar(@$loop), GetBranchesCount(), 'There is the right number of branches' );
357
359
358
# End transaction
360
# Test GetBranchEmailFromBorrowernumber
359
$dbh->rollback;
361
my $borrowernumber = C4::Members::AddMember(
360
362
    cardnumber   => 'CARDNUMBER42_TEST',
363
    firstname    => 'fn',
364
    surname      => 'surname',
365
    categorycode => 'S',
366
    branchcode   => $b3->{branchcode},
367
    dateofbirth  => '',
368
    dateexpiry   => '9999-12-31',
369
    userid       => 'userid'
370
);
371
is( C4::Branch::GetBranchEmailFromBorrowernumber($borrowernumber), $b3_email,
372
'GetBranchEmailFromBorrowernumber returns the branchemail from a borrowernumber'
373
);
374
is( C4::Branch::GetBranchEmailFromBorrowernumber(), undef,
375
'GetBranchEmailFromBorrowernumber returns undef if no parameter is given'
376
);
(-)a/t/db_dependent/Letters.t (-9 / +66 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 => 68;
21
use Test::More tests => 86;
22
use Test::MockModule;
22
use Test::MockModule;
23
use Test::Warn;
23
use Test::Warn;
24
24
Lines 62-73 my $library = $builder->build({ Link Here
62
    source => 'Branch',
62
    source => 'Branch',
63
});
63
});
64
my $date = dt_from_string;
64
my $date = dt_from_string;
65
my ( $email, $emailpro ) = ( 'email@example.org', 'emailpro@example.org' );
65
my $borrowernumber = AddMember(
66
my $borrowernumber = AddMember(
66
    firstname    => 'Jane',
67
    firstname    => 'Jane',
67
    surname      => 'Smith',
68
    surname      => 'Smith',
68
    categorycode => 'PT',
69
    categorycode => 'PT',
69
    branchcode   => $library->{branchcode},
70
    branchcode   => $library->{branchcode},
70
    dateofbirth  => $date,
71
    dateofbirth  => $date,
72
    email        => $email,
73
    emailpro     => $emailpro,
71
);
74
);
72
75
73
my $marc_record = MARC::Record->new;
76
my $marc_record = MARC::Record->new;
Lines 93-100 my $my_message = { Link Here
93
    to_address             => 'to@example.com',
96
    to_address             => 'to@example.com',
94
    from_address           => 'from@example.com',
97
    from_address           => 'from@example.com',
95
};
98
};
96
my $message_id = C4::Letters::EnqueueLetter($my_message);
99
is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the letter argument returns undef' );
97
is( $message_id, undef, 'EnqueueLetter without the letter argument returns undef' );
98
100
99
delete $my_message->{message_transport_type};
101
delete $my_message->{message_transport_type};
100
$my_message->{letter} = {
102
$my_message->{letter} = {
Lines 104-116 $my_message->{letter} = { Link Here
104
    code         => 'TEST_MESSAGE',
106
    code         => 'TEST_MESSAGE',
105
    content_type => 'text/plain',
107
    content_type => 'text/plain',
106
};
108
};
107
$message_id = C4::Letters::EnqueueLetter($my_message);
109
is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the message_transport_type argument returns undef' );
108
is( $message_id, undef, 'EnqueueLetter without the message type argument argument returns undef' );
109
110
110
$my_message->{message_transport_type} = 'sms';
111
$my_message->{message_transport_type} = 'sms';
111
$message_id = C4::Letters::EnqueueLetter($my_message);
112
my $messages_queued = C4::Letters::EnqueueLetter($my_message);
112
ok(defined $message_id && $message_id > 0, 'new message successfully queued');
113
is($messages_queued, 1, 'new message successfully queued');
113
114
114
115
# GetQueuedMessages
115
# GetQueuedMessages
116
my $messages = C4::Letters::GetQueuedMessages();
116
my $messages = C4::Letters::GetQueuedMessages();
Lines 118-124 is( @$messages, 1, 'GetQueuedMessages without argument returns all the entries' Link Here
118
118
119
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
119
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
120
is( @$messages, 1, 'one message stored for the borrower' );
120
is( @$messages, 1, 'one message stored for the borrower' );
121
is( $messages->[0]->{message_id}, $message_id, 'EnqueueLetter returns the message id correctly' );
122
is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' );
121
is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' );
123
is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' );
122
is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' );
124
is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' );
123
is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' );
Lines 397-402 is($mail{'To'}, 'testemail@mydomain.com', "mailto correct in sent claim"); Link Here
397
is($mail{'Message'}, 'my vendor|John Smith|Ordernumber ' . $ordernumber . ' (Silence in the library) (1 ordered)', 'Claim notice text constructed successfully');
396
is($mail{'Message'}, 'my vendor|John Smith|Ordernumber ' . $ordernumber . ' (Silence in the library) (1 ordered)', 'Claim notice text constructed successfully');
398
}
397
}
399
398
399
# EnqueueLetter and AutoEmailPrimaryAddress
400
$my_message = {
401
    borrowernumber         => $borrowernumber,
402
    message_transport_type => 'email',
403
    to_address             => 'to@example.com',
404
    from_address           => 'from@example.com',
405
    letter                 => {
406
        content      => 'a message',
407
        title        => 'message title',
408
        metadata     => 'metadata',
409
        code         => 'TEST_MESSAGE',
410
        content_type => 'text/plain',
411
    },
412
};
413
414
$dbh->do(q|DELETE FROM message_queue|);
415
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email');
416
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
417
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
418
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
419
is( $messages->[0]{to_address}, 'to@example.com', 'AutoEmailPrimaryAddress=email, EnqueueLetter used the to_address given in parameter' );
420
421
$dbh->do(q|DELETE FROM message_queue|);
422
delete $my_message->{to_address};
423
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
424
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
425
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
426
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email, EnqueueLetter used the patron email address if no to_address is given in parameter' );
427
428
$dbh->do(q|DELETE FROM message_queue|);
429
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'emailpro');
430
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
431
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
432
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
433
is( $messages->[0]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=emailpro, EnqueueLetter used the patron emailpro address if no to_address is given in parameter' );
434
435
$dbh->do(q|DELETE FROM message_queue|);
436
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'OFF');
437
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
438
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
439
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
440
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=OFF, EnqueueLetter used the patron email address if no to_address is given in parameter' );
441
442
$dbh->do(q|DELETE FROM message_queue|);
443
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email|OFF|emailpro'); # This is no consistent. OFF should be alone.
444
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
445
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
446
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
447
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email|OFF|emailpro, EnqueueLetter used the patron email address if no to_address is given in parameter' );
448
449
$dbh->do(q|DELETE FROM message_queue|);
450
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email|emailpro');
451
is( C4::Letters::EnqueueLetter($my_message), 2, 'messages successfully queued' );
452
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
453
is( scalar( @$messages ), 2, 'The messages have been queued for the expected patron' );
454
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email|emailpro, EnqueueLetter used the patron email address for the first letter' );
455
is( $messages->[1]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=email|emailpro, EnqueueLetter used the patron emailpro address for the second letter' );
456
400
{
457
{
401
use C4::Serials;
458
use C4::Serials;
402
459
(-)a/t/db_dependent/Members.t (-5 / +12 lines)
Lines 149-163 is ($checkcardnum, "2", "Card number is too long"); Link Here
149
149
150
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'OFF' );
150
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'OFF' );
151
C4::Context->clear_syspref_cache();
151
C4::Context->clear_syspref_cache();
152
my $notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
153
is_deeply( $notice_emails, [ $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is off" );
152
154
153
my $notice_email = GetNoticeEmailAddress($member->{'borrowernumber'});
155
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro,OFF' );
154
is ($notice_email, $EMAIL, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is off");
156
C4::Context->clear_syspref_cache();
157
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
158
is_deeply( $notice_emails, [ $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress contains off" );
155
159
156
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro' );
160
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro' );
157
C4::Context->clear_syspref_cache();
161
C4::Context->clear_syspref_cache();
162
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
163
is_deeply ($notice_emails, [ $EMAILPRO ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is emailpro");
158
164
159
$notice_email = GetNoticeEmailAddress($member->{'borrowernumber'});
165
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro,email' );
160
is ($notice_email, $EMAILPRO, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is emailpro");
166
C4::Context->clear_syspref_cache();
167
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
168
is_deeply ($notice_emails, [ $EMAILPRO, $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is emailpro|email");
161
169
162
ok(!$member->{is_expired}, "GetMemberDetails() indicates that patron is not expired");
170
ok(!$member->{is_expired}, "GetMemberDetails() indicates that patron is not expired");
163
ModMember(borrowernumber => $member->{'borrowernumber'}, dateexpiry => '2001-01-1');
171
ModMember(borrowernumber => $member->{'borrowernumber'}, dateexpiry => '2001-01-1');
164
- 

Return to bug 12802