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 568-573 sub GetBranchesCount { Link Here
568
    return $row->{'branches_count'};
569
    return $row->{'branches_count'};
569
}
570
}
570
571
572
sub GetBranchEmailFromBorrowernumber {
573
    my ( $borrowernumber ) = @_;
574
    return unless $borrowernumber;
575
    my $rs = Koha::Database->new->schema->resultset('Borrower')->search({ borrowernumber => $borrowernumber }, {join => 'branchcode'});
576
    return $rs->next->branchcode->branchemail;
577
}
578
571
1;
579
1;
572
__END__
580
__END__
573
581
(-)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 857-863 sub EnqueueLetter { Link Here
857
    my $params = shift or return;
858
    my $params = shift or return;
858
859
859
    return unless exists $params->{'letter'};
860
    return unless exists $params->{'letter'};
860
#   return unless exists $params->{'borrowernumber'};
861
    return unless exists $params->{'message_transport_type'};
861
    return unless exists $params->{'message_transport_type'};
862
862
863
    my $content = $params->{letter}->{content};
863
    my $content = $params->{letter}->{content};
Lines 877-904 sub EnqueueLetter { Link Here
877
        );
877
        );
878
    }
878
    }
879
879
880
    my $dbh       = C4::Context->dbh();
880
    my @to_addresses;
881
    my $statement = << 'ENDSQL';
881
    if ( $params->{to_address} ) {
882
INSERT INTO message_queue
882
        @to_addresses = ( $params->{to_address} );
883
( borrowernumber, subject, content, metadata, letter_code, message_transport_type, status, time_queued, to_address, from_address, content_type )
883
    } elsif ( $params->{borrowernumber} and $params->{message_transport_type} eq 'email' ) {
884
VALUES
884
        @to_addresses = @{ C4::Members::GetNoticeEmailAddresses( $params->{borrowernumber} ) };
885
( ?,              ?,       ?,       ?,        ?,           ?,                      ?,      NOW(),       ?,          ?,            ? )
885
    }
886
ENDSQL
887
886
888
    my $sth    = $dbh->prepare($statement);
887
    my $from_address;
889
    my $result = $sth->execute(
888
    if ( $params->{from_address} ) {
890
        $params->{'borrowernumber'},              # borrowernumber
889
        $from_address = $params->{from_address};
891
        $params->{'letter'}->{'title'},           # subject
890
    } elsif ( $params->{message_transport_type} eq 'email' ) {
892
        $params->{'letter'}->{'content'},         # content
891
        if ( $params->{borrowernumber} ) {
893
        $params->{'letter'}->{'metadata'} || '',  # metadata
892
            $from_address = C4::Branch::GetBranchEmailFromBorrowernumber( $params->{borrowernumber} );
894
        $params->{'letter'}->{'code'}     || '',  # letter_code
893
        }
895
        $params->{'message_transport_type'},      # message_transport_type
894
896
        'pending',                                # status
895
        $from_address ||= C4::Context->preference('KohaAdminEmailAddress');
897
        $params->{'to_address'},                  # to_address
896
    }
898
        $params->{'from_address'},                # from_address
897
899
        $params->{'letter'}->{'content-type'},    # content_type
898
    my $rs = Koha::Database->new->schema->resultset('MessageQueue');
900
    );
899
    for my $to_address ( @to_addresses ) {
901
    return $dbh->last_insert_id(undef,undef,'message_queue', undef);
900
        $rs->create({
901
            borrowernumber => $params->{borrowernumber},
902
            subject => $params->{letter}{title},
903
            content => $params->{letter}{content},
904
            metadata => ( $params->{letter}{metadata} || '' ),
905
            letter_code => ( $params->{letter}{code}     || ''),
906
            message_transport_type => $params->{message_transport_type},
907
            status => 'pending',
908
            to_address => $to_address,
909
            from_address => $from_address,
910
            content_type => $params->{letter}{'content-type'},
911
        });
912
    }
913
    return scalar( @to_addresses );
902
}
914
}
903
915
904
=head2 SendQueuedMessages ([$hashref]) 
916
=head2 SendQueuedMessages ([$hashref]) 
Lines 923-928 sub SendQueuedMessages { Link Here
923
          if $params->{'verbose'} or $debug;
935
          if $params->{'verbose'} or $debug;
924
        # This is just begging for subclassing
936
        # This is just begging for subclassing
925
        next MESSAGE if ( lc($message->{'message_transport_type'}) eq 'rss' );
937
        next MESSAGE if ( lc($message->{'message_transport_type'}) eq 'rss' );
938
926
        if ( lc( $message->{'message_transport_type'} ) eq 'email' ) {
939
        if ( lc( $message->{'message_transport_type'} ) eq 'email' ) {
927
            _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} );
940
            _send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} );
928
        }
941
        }
Lines 984-1014 list of hashes, each has represents a message in the message queue. Link Here
984
sub GetQueuedMessages {
997
sub GetQueuedMessages {
985
    my $params = shift;
998
    my $params = shift;
986
999
987
    my $dbh = C4::Context->dbh();
1000
    my $rs = Koha::Database->new->schema->resultset('MessageQueue')->search(
988
    my $statement = << 'ENDSQL';
1001
        {
989
SELECT message_id, borrowernumber, subject, content, message_transport_type, status, time_queued
1002
            (
990
FROM message_queue
1003
                $params->{borrowernumber}
991
ENDSQL
1004
                ? ( borrowernumber => $params->{borrowernumber} )
992
1005
                : ()
993
    my @query_params;
1006
            ),
994
    my @whereclauses;
1007
        },
995
    if ( exists $params->{'borrowernumber'} ) {
1008
        {
996
        push @whereclauses, ' borrowernumber = ? ';
1009
            (
997
        push @query_params, $params->{'borrowernumber'};
1010
                $params->{limit}
998
    }
1011
                ? ( rows => $params->{limit} )
999
1012
                : ()
1000
    if ( @whereclauses ) {
1013
            ),
1001
        $statement .= ' WHERE ' . join( 'AND', @whereclauses );
1014
        },
1002
    }
1015
    );
1003
1016
    $rs->result_class('DBIx::Class::ResultClass::HashRefInflator');
1004
    if ( defined $params->{'limit'} ) {
1017
    return [ $rs->all ];
1005
        $statement .= ' LIMIT ? ';
1006
        push @query_params, $params->{'limit'};
1007
    }
1008
1009
    my $sth = $dbh->prepare( $statement );
1010
    my $result = $sth->execute( @query_params );
1011
    return $sth->fetchall_arrayref({});
1012
}
1018
}
1013
1019
1014
=head2 GetMessageTransportTypes
1020
=head2 GetMessageTransportTypes
Lines 1114-1135 sub _send_message_by_email { Link Here
1114
    my ($username, $password, $method) = @_;
1120
    my ($username, $password, $method) = @_;
1115
1121
1116
    my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} );
1122
    my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} );
1117
    my $to_address = $message->{'to_address'};
1123
1118
    unless ($to_address) {
1124
    unless ( $member and $message->{to_address} ) {
1119
        unless ($member) {
1125
        warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})" unless $member;
1120
            warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})";
1126
        _set_message_status({
1121
            _set_message_status( { message_id => $message->{'message_id'},
1127
            message_id => $message->{'message_id'},
1122
                                   status     => 'failed' } );
1128
            status     => 'failed'
1123
            return;
1129
        });
1124
        }
1130
        return;
1125
        $to_address = C4::Members::GetNoticeEmailAddress( $message->{'borrowernumber'} );
1126
        unless ($to_address) {  
1127
            # warn "FAIL: No 'to_address' and no email for " . ($member->{surname} ||'') . ", borrowernumber ($message->{borrowernumber})";
1128
            # warning too verbose for this more common case?
1129
            _set_message_status( { message_id => $message->{'message_id'},
1130
                                   status     => 'failed' } );
1131
            return;
1132
        }
1133
    }
1131
    }
1134
1132
1135
    my $utf8   = decode('MIME-Header', $message->{'subject'} );
1133
    my $utf8   = decode('MIME-Header', $message->{'subject'} );
Lines 1150-1156 sub _send_message_by_email { Link Here
1150
    my $email = Koha::Email->new();
1148
    my $email = Koha::Email->new();
1151
    my %sendmail_params = $email->create_message_headers(
1149
    my %sendmail_params = $email->create_message_headers(
1152
        {
1150
        {
1153
            to      => $to_address,
1154
            from    => $message->{'from_address'} || $branch_email,
1151
            from    => $message->{'from_address'} || $branch_email,
1155
            replyto => $branch_replyto,
1152
            replyto => $branch_replyto,
1156
            sender  => $branch_returnpath,
1153
            sender  => $branch_returnpath,
Lines 1165-1171 sub _send_message_by_email { Link Here
1165
       $sendmail_params{ Bcc } = $bcc;
1162
       $sendmail_params{ Bcc } = $bcc;
1166
    }
1163
    }
1167
1164
1168
    _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
1169
    if ( sendmail( %sendmail_params ) ) {
1165
    if ( sendmail( %sendmail_params ) ) {
1170
        _set_message_status( { message_id => $message->{'message_id'},
1166
        _set_message_status( { message_id => $message->{'message_id'},
1171
                status     => 'sent' } );
1167
                status     => 'sent' } );
Lines 1239-1250 sub _send_message_by_sms { Link Here
1239
    return $success;
1235
    return $success;
1240
}
1236
}
1241
1237
1242
sub _update_message_to_address {
1243
    my ($id, $to)= @_;
1244
    my $dbh = C4::Context->dbh();
1245
    $dbh->do('UPDATE message_queue SET to_address=? WHERE message_id=?',undef,($to,$id));
1246
}
1247
1248
sub _set_message_status {
1238
sub _set_message_status {
1249
    my $params = shift or return;
1239
    my $params = shift or return;
1250
1240
(-)a/C4/Members.pm (-20 / +25 lines)
Lines 72-78 BEGIN { Link Here
72
        &getidcity
72
        &getidcity
73
73
74
        &GetFirstValidEmailAddress
74
        &GetFirstValidEmailAddress
75
        &GetNoticeEmailAddress
75
        &GetNoticeEmailAddresses
76
76
77
        &GetAge
77
        &GetAge
78
        &GetCities
78
        &GetCities
Lines 1542-1574 sub GetFirstValidEmailAddress { Link Here
1542
    }
1542
    }
1543
}
1543
}
1544
1544
1545
=head2 GetNoticeEmailAddress
1545
=head2 GetNoticeEmailAddresses
1546
1546
1547
  $email = GetNoticeEmailAddress($borrowernumber);
1547
  $emails = GetNoticeEmailAddresses( borrowernumber );
1548
1548
1549
Return the email address of borrower used for notices, given the borrowernumber.
1549
Return the email addresses of borrower used for notices, given the borrowernumber.
1550
Returns the empty string if no email address.
1550
Returns an empty arrayref if no email address.
1551
1551
1552
=cut
1552
=cut
1553
1553
1554
sub GetNoticeEmailAddress {
1554
sub GetNoticeEmailAddresses {
1555
    my $borrowernumber = shift;
1555
    my $borrowernumber = shift;
1556
1556
1557
    my $which_address = C4::Context->preference("AutoEmailPrimaryAddress");
1557
    my $which_addresses = C4::Context->preference("AutoEmailPrimaryAddress");
1558
    # if syspref is set to 'first valid' (value == OFF), look up email address
1558
    my @email_addresses;
1559
    if ( $which_address eq 'OFF' ) {
1559
    for my $email_address_field ( split /,/, $which_addresses ) {
1560
        return GetFirstValidEmailAddress($borrowernumber);
1560
1561
        # if syspref is set to 'first valid' (value == OFF), look up email address
1562
        if ( $email_address_field eq 'OFF' ) {
1563
            return [ GetFirstValidEmailAddress($borrowernumber) ];
1564
        }
1565
1566
        # specified email address field
1567
        my $email_address = C4::Context->dbh->selectcol_arrayref(
1568
            qq|
1569
                SELECT $email_address_field AS email
1570
                FROM borrowers
1571
                WHERE borrowernumber = ?
1572
            |, {}, $borrowernumber
1573
        );
1574
        push @email_addresses, $email_address->[0] if $email_address->[0];
1561
    }
1575
    }
1562
    # specified email address field
1576
    return \@email_addresses;
1563
    my $dbh = C4::Context->dbh;
1564
    my $sth = $dbh->prepare( qq{
1565
        SELECT $which_address AS primaryemail
1566
        FROM borrowers
1567
        WHERE borrowernumber=?
1568
    } );
1569
    $sth->execute($borrowernumber);
1570
    my $data = $sth->fetchrow_hashref;
1571
    return $data->{'primaryemail'} || '';
1572
}
1577
}
1573
1578
1574
=head2 GetExpiryDate 
1579
=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 231-238 sub AddReserve { Link Here
231
                {   letter                 => $letter,
231
                {   letter                 => $letter,
232
                    borrowernumber         => $borrowernumber,
232
                    borrowernumber         => $borrowernumber,
233
                    message_transport_type => 'email',
233
                    message_transport_type => 'email',
234
                    from_address           => $admin_email_address,
234
                    to_address             => $admin_email_address,
235
                    to_address           => $admin_email_address,
236
                }
235
                }
237
            );
236
            );
238
        }
237
        }
Lines 1993-2001 sub _koha_notify_reserve { Link Here
1993
1992
1994
    my $dbh = C4::Context->dbh;
1993
    my $dbh = C4::Context->dbh;
1995
    my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
1994
    my $borrower = C4::Members::GetMember(borrowernumber => $borrowernumber);
1996
    
1997
    # Try to get the borrower's email address
1998
    my $to_address = C4::Members::GetNoticeEmailAddress($borrowernumber);
1999
1995
2000
    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( {
1996
    my $messagingprefs = C4::Members::Messaging::GetMessagingPreferences( {
2001
            borrowernumber => $borrowernumber,
1997
            borrowernumber => $borrowernumber,
Lines 2012-2019 sub _koha_notify_reserve { Link Here
2012
    my $reserve = $sth->fetchrow_hashref;
2008
    my $reserve = $sth->fetchrow_hashref;
2013
    my $branch_details = GetBranchDetail( $reserve->{'branchcode'} );
2009
    my $branch_details = GetBranchDetail( $reserve->{'branchcode'} );
2014
2010
2015
    my $admin_email_address = $branch_details->{'branchemail'} || C4::Context->preference('KohaAdminEmailAddress');
2016
2017
    my %letter_params = (
2011
    my %letter_params = (
2018
        module => 'reserves',
2012
        module => 'reserves',
2019
        branchcode => $reserve->{branchcode},
2013
        branchcode => $reserve->{branchcode},
Lines 2042-2055 sub _koha_notify_reserve { Link Here
2042
        C4::Letters::EnqueueLetter( {
2036
        C4::Letters::EnqueueLetter( {
2043
            letter => $letter,
2037
            letter => $letter,
2044
            borrowernumber => $borrowernumber,
2038
            borrowernumber => $borrowernumber,
2045
            from_address => $admin_email_address,
2046
            message_transport_type => $mtt,
2039
            message_transport_type => $mtt,
2047
        } );
2040
        } );
2048
    };
2041
    };
2049
2042
2043
    # Try to get the borrower's email addresses
2044
    my $to_addresses = C4::Members::GetNoticeEmailAddresses($borrowernumber);
2045
2050
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
2046
    while ( my ( $mtt, $letter_code ) = each %{ $messagingprefs->{transports} } ) {
2051
        next if (
2047
        next if (
2052
               ( $mtt eq 'email' and not $to_address ) # No email address
2048
               ( $mtt eq 'email' and not @$to_addresses ) # No email address
2053
            or ( $mtt eq 'sms'   and not $borrower->{smsalertnumber} ) # No SMS number
2049
            or ( $mtt eq 'sms'   and not $borrower->{smsalertnumber} ) # No SMS number
2054
            or ( $mtt eq 'phone' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl
2050
            or ( $mtt eq 'phone' and C4::Context->preference('TalkingTechItivaPhoneNotification') ) # Notice is handled by TalkingTech_itiva_outbound.pl
2055
        );
2051
        );
(-)a/misc/cronjobs/overdue_notices.pl (-6 / +5 lines)
Lines 555-562 END_SQL Link Here
555
                  and warn "borrower $borr has items triggering level $i.";
555
                  and warn "borrower $borr has items triggering level $i.";
556
556
557
                @emails_to_use = ();
557
                @emails_to_use = ();
558
                my $notice_email =
559
                    C4::Members::GetNoticeEmailAddress($borrowernumber);
560
                unless ($nomail) {
558
                unless ($nomail) {
561
                    if (@emails) {
559
                    if (@emails) {
562
                        foreach (@emails) {
560
                        foreach (@emails) {
Lines 564-570 END_SQL Link Here
564
                        }
562
                        }
565
                    }
563
                    }
566
                    else {
564
                    else {
567
                        push @emails_to_use, $notice_email if ($notice_email);
565
                        my $notice_emails =
566
                            C4::Members::GetNoticeEmailAddresses($borrowernumber);
567
                        push @emails_to_use, @$notice_emails;
568
                    }
568
                    }
569
                }
569
                }
570
570
Lines 699-705 END_SQL Link Here
699
                              letternumber   => $i,
699
                              letternumber   => $i,
700
                              postcode       => $data->{'zipcode'},
700
                              postcode       => $data->{'zipcode'},
701
                              country        => $data->{'country'},
701
                              country        => $data->{'country'},
702
                              email          => $notice_email,
702
                              email          => $notice_emails,
703
                              itemcount      => $itemcount,
703
                              itemcount      => $itemcount,
704
                              titles         => $titles,
704
                              titles         => $titles,
705
                              outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
705
                              outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
Lines 720-726 END_SQL Link Here
720
                                  city           => $data->{'city'},
720
                                  city           => $data->{'city'},
721
                                  postcode       => $data->{'zipcode'},
721
                                  postcode       => $data->{'zipcode'},
722
                                  country        => $data->{'country'},
722
                                  country        => $data->{'country'},
723
                                  email          => $notice_email,
723
                                  email          => ( scalar( @emails_to_use ) ? $emails_to_use[0] : undef ),
724
                                  itemcount      => $itemcount,
724
                                  itemcount      => $itemcount,
725
                                  titles         => $titles,
725
                                  titles         => $titles,
726
                                  outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
726
                                  outputformat   => defined $csvfilename ? 'csv' : defined $htmlfilename ? 'html' : defined $text_filename ? 'text' : '',
Lines 733-739 END_SQL Link Here
733
                                {   letter                 => $letter,
733
                                {   letter                 => $letter,
734
                                    borrowernumber         => $borrowernumber,
734
                                    borrowernumber         => $borrowernumber,
735
                                    message_transport_type => $mtt,
735
                                    message_transport_type => $mtt,
736
                                    from_address           => $admin_email_address,
737
                                    to_address             => join(',', @emails_to_use),
736
                                    to_address             => join(',', @emails_to_use),
738
                                }
737
                                }
739
                            );
738
                            );
(-)a/opac/opac-memberentry.pl (-3 / +1 lines)
Lines 124-134 if ( $action eq 'create' ) { Link Here
124
124
125
            C4::Letters::EnqueueLetter(
125
            C4::Letters::EnqueueLetter(
126
                {
126
                {
127
                    borrowernumber         => $borrower{borrowernumber},
127
                    letter                 => $letter,
128
                    letter                 => $letter,
128
                    message_transport_type => 'email',
129
                    message_transport_type => 'email',
129
                    to_address             => $borrower{'email'},
130
                    from_address =>
131
                      C4::Context->preference('KohaAdminEmailAddress'),
132
                }
130
                }
133
            );
131
            );
134
        }
132
        }
(-)a/opac/opac-shareshelf.pl (-6 / +4 lines)
Lines 133-140 sub show_accept { Link Here
133
sub notify_owner {
133
sub notify_owner {
134
    my ($param) = @_;
134
    my ($param) = @_;
135
135
136
    my $toaddr = C4::Members::GetNoticeEmailAddress( $param->{owner} );
136
    my $toaddr = C4::Members::GetNoticeEmailAddresses( $param->{owner} );
137
    return if !$toaddr;
137
    return unless scalar( @$toaddr );
138
138
139
139
    #prepare letter
140
    #prepare letter
140
    my $letter = C4::Letters::GetPreparedLetter(
141
    my $letter = C4::Letters::GetPreparedLetter(
Lines 148-157 sub notify_owner { Link Here
148
    #send letter to queue
149
    #send letter to queue
149
    C4::Letters::EnqueueLetter(
150
    C4::Letters::EnqueueLetter(
150
        {
151
        {
152
            borrowernumber         => $param->{owner},
151
            letter                 => $letter,
153
            letter                 => $letter,
152
            message_transport_type => 'email',
154
            message_transport_type => 'email',
153
            from_address => C4::Context->preference('KohaAdminEmailAddress'),
154
            to_address   => $toaddr,
155
        }
155
        }
156
    );
156
    );
157
}
157
}
Lines 177-183 sub process_addrlist { Link Here
177
177
178
sub send_invitekey {
178
sub send_invitekey {
179
    my ($param) = @_;
179
    my ($param) = @_;
180
    my $fromaddr = C4::Context->preference('KohaAdminEmailAddress');
181
    my $url =
180
    my $url =
182
        'http://'
181
        'http://'
183
      . C4::Context->preference('OPACBaseURL')
182
      . C4::Context->preference('OPACBaseURL')
Lines 215-221 sub send_invitekey { Link Here
215
            {
214
            {
216
                letter                 => $letter,
215
                letter                 => $letter,
217
                message_transport_type => 'email',
216
                message_transport_type => 'email',
218
                from_address           => $fromaddr,
219
                to_address             => $a,
217
                to_address             => $a,
220
            }
218
            }
221
        );
219
        );
(-)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 (-10 / +65 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 => 58;
21
use Test::More tests => 76;
22
use Test::MockModule;
22
use Test::MockModule;
23
use Test::Warn;
23
use Test::Warn;
24
24
Lines 57-68 $dbh->do(q|DELETE FROM message_queue|); Link Here
57
$dbh->do(q|DELETE FROM message_transport_types|);
57
$dbh->do(q|DELETE FROM message_transport_types|);
58
58
59
my $date = dt_from_string;
59
my $date = dt_from_string;
60
my ( $email, $emailpro ) = ( 'email@example.org', 'emailpro@example.org' );
60
my $borrowernumber = AddMember(
61
my $borrowernumber = AddMember(
61
    firstname    => 'Jane',
62
    firstname    => 'Jane',
62
    surname      => 'Smith',
63
    surname      => 'Smith',
63
    categorycode => 'PT',
64
    categorycode => 'PT',
64
    branchcode   => 'CPL',
65
    branchcode   => 'CPL',
65
    dateofbirth  => $date,
66
    dateofbirth  => $date,
67
    email        => $email,
68
    emailpro     => $emailpro,
66
);
69
);
67
70
68
my $marc_record = MARC::Record->new;
71
my $marc_record = MARC::Record->new;
Lines 88-95 my $my_message = { Link Here
88
    to_address             => 'to@example.com',
91
    to_address             => 'to@example.com',
89
    from_address           => 'from@example.com',
92
    from_address           => 'from@example.com',
90
};
93
};
91
my $message_id = C4::Letters::EnqueueLetter($my_message);
94
is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the letter argument returns undef' );
92
is( $message_id, undef, 'EnqueueLetter without the letter argument returns undef' );
93
95
94
delete $my_message->{message_transport_type};
96
delete $my_message->{message_transport_type};
95
$my_message->{letter} = {
97
$my_message->{letter} = {
Lines 99-111 $my_message->{letter} = { Link Here
99
    code         => 'TEST_MESSAGE',
101
    code         => 'TEST_MESSAGE',
100
    content_type => 'text/plain',
102
    content_type => 'text/plain',
101
};
103
};
102
$message_id = C4::Letters::EnqueueLetter($my_message);
104
is( C4::Letters::EnqueueLetter($my_message), undef, 'EnqueueLetter without the message_transport_type argument returns undef' );
103
is( $message_id, undef, 'EnqueueLetter without the message type argument argument returns undef' );
104
105
105
$my_message->{message_transport_type} = 'sms';
106
$my_message->{message_transport_type} = 'sms';
106
$message_id = C4::Letters::EnqueueLetter($my_message);
107
my $messages_queued = C4::Letters::EnqueueLetter($my_message);
107
ok(defined $message_id && $message_id > 0, 'new message successfully queued');
108
is($messages_queued, 1, 'new message successfully queued');
108
109
109
110
# GetQueuedMessages
110
# GetQueuedMessages
111
my $messages = C4::Letters::GetQueuedMessages();
111
my $messages = C4::Letters::GetQueuedMessages();
Lines 113-119 is( @$messages, 1, 'GetQueuedMessages without argument returns all the entries' Link Here
113
113
114
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
114
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
115
is( @$messages, 1, 'one message stored for the borrower' );
115
is( @$messages, 1, 'one message stored for the borrower' );
116
is( $messages->[0]->{message_id}, $message_id, 'EnqueueLetter returns the message id correctly' );
117
is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' );
116
is( $messages->[0]->{borrowernumber}, $borrowernumber, 'EnqueueLetter stores the borrower number correctly' );
118
is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' );
117
is( $messages->[0]->{subject}, $my_message->{letter}->{title}, 'EnqueueLetter stores the subject correctly' );
119
is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' );
118
is( $messages->[0]->{content}, $my_message->{letter}->{content}, 'EnqueueLetter stores the content correctly' );
Lines 341-344 is($err, 1, "Successfully sent claim"); Link Here
341
is($mail{'To'}, 'testemail@mydomain.com', "mailto correct in sent claim");
340
is($mail{'To'}, 'testemail@mydomain.com', "mailto correct in sent claim");
342
is($mail{'Message'}, 'my vendor|John Smith|Ordernumber ' . $ordernumber . ' (Silence in the library) (1 ordered)', 'Claim notice text constructed successfully');
341
is($mail{'Message'}, 'my vendor|John Smith|Ordernumber ' . $ordernumber . ' (Silence in the library) (1 ordered)', 'Claim notice text constructed successfully');
343
342
344
$dbh->rollback;
343
# EnqueueLetter and AutoEmailPrimaryAddress
344
$my_message = {
345
    borrowernumber         => $borrowernumber,
346
    message_transport_type => 'email',
347
    to_address             => 'to@example.com',
348
    from_address           => 'from@example.com',
349
    letter                 => {
350
        content      => 'a message',
351
        title        => 'message title',
352
        metadata     => 'metadata',
353
        code         => 'TEST_MESSAGE',
354
        content_type => 'text/plain',
355
    },
356
};
357
358
$dbh->do(q|DELETE FROM message_queue|);
359
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email');
360
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
361
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
362
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
363
is( $messages->[0]{to_address}, 'to@example.com', 'AutoEmailPrimaryAddress=email, EnqueueLetter used the to_address given in parameter' );
364
365
$dbh->do(q|DELETE FROM message_queue|);
366
delete $my_message->{to_address};
367
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
368
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
369
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
370
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email, EnqueueLetter used the patron email address if no to_address is given in parameter' );
371
372
$dbh->do(q|DELETE FROM message_queue|);
373
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'emailpro');
374
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
375
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
376
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
377
is( $messages->[0]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=emailpro, EnqueueLetter used the patron emailpro address if no to_address is given in parameter' );
378
379
$dbh->do(q|DELETE FROM message_queue|);
380
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'OFF');
381
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
382
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
383
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
384
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=OFF, EnqueueLetter used the patron email address if no to_address is given in parameter' );
385
386
$dbh->do(q|DELETE FROM message_queue|);
387
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email|OFF|emailpro'); # This is no consistent. OFF should be alone.
388
is( C4::Letters::EnqueueLetter($my_message), 1, 'message successfully queued' );
389
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
390
is( scalar( @$messages ), 1, 'The message has been queued for the expected patron' );
391
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email|OFF|emailpro, EnqueueLetter used the patron email address if no to_address is given in parameter' );
392
393
$dbh->do(q|DELETE FROM message_queue|);
394
t::lib::Mocks::mock_preference('AutoEmailPrimaryAddress', 'email|emailpro');
395
is( C4::Letters::EnqueueLetter($my_message), 2, 'messages successfully queued' );
396
$messages = C4::Letters::GetQueuedMessages({ borrowernumber => $borrowernumber });
397
is( scalar( @$messages ), 2, 'The messages have been queued for the expected patron' );
398
is( $messages->[0]{to_address}, $email, 'AutoEmailPrimaryAddress=email|emailpro, EnqueueLetter used the patron email address for the first letter' );
399
is( $messages->[1]{to_address}, $emailpro, 'AutoEmailPrimaryAddress=email|emailpro, EnqueueLetter used the patron emailpro address for the second letter' );
(-)a/t/db_dependent/Members.t (-6 / +13 lines)
Lines 17-23 Link Here
17
17
18
use Modern::Perl;
18
use Modern::Perl;
19
19
20
use Test::More tests => 72;
20
use Test::More tests => 74;
21
use Test::MockModule;
21
use Test::MockModule;
22
use Data::Dumper;
22
use Data::Dumper;
23
use C4::Context;
23
use C4::Context;
Lines 202-216 is ($checkcardnum, "2", "Card number is too long"); Link Here
202
202
203
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'OFF' );
203
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'OFF' );
204
C4::Context->clear_syspref_cache();
204
C4::Context->clear_syspref_cache();
205
my $notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
206
is_deeply( $notice_emails, [ $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is off" );
205
207
206
my $notice_email = GetNoticeEmailAddress($member->{'borrowernumber'});
208
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro,OFF' );
207
is ($notice_email, $EMAIL, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is off");
209
C4::Context->clear_syspref_cache();
210
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
211
is_deeply( $notice_emails, [ $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress contains off" );
208
212
209
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro' );
213
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro' );
210
C4::Context->clear_syspref_cache();
214
C4::Context->clear_syspref_cache();
215
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
216
is_deeply ($notice_emails, [ $EMAILPRO ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is emailpro");
211
217
212
$notice_email = GetNoticeEmailAddress($member->{'borrowernumber'});
218
C4::Context->set_preference( 'AutoEmailPrimaryAddress', 'emailpro,email' );
213
is ($notice_email, $EMAILPRO, "GetNoticeEmailAddress returns correct value when AutoEmailPrimaryAddress is emailpro");
219
C4::Context->clear_syspref_cache();
220
$notice_emails = GetNoticeEmailAddresses($member->{'borrowernumber'});
221
is_deeply ($notice_emails, [ $EMAILPRO, $EMAIL ], "GetNoticeEmailAddresses returns correct value when AutoEmailPrimaryAddress is emailpro|email");
214
222
215
ok(!$member->{is_expired}, "GetMemberDetails() indicates that patron is not expired");
223
ok(!$member->{is_expired}, "GetMemberDetails() indicates that patron is not expired");
216
ModMember(borrowernumber => $member->{'borrowernumber'}, dateexpiry => '2001-01-1');
224
ModMember(borrowernumber => $member->{'borrowernumber'}, dateexpiry => '2001-01-1');
217
- 

Return to bug 12802