use Koha::Email;
use Koha::DateUtils qw( format_sqldatetime dt_from_string );
+use Koha::Patrons;
use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
}
sub getletter {
- my ( $module, $code, $branchcode, $message_transport_type ) = @_;
+ my ( $module, $code, $branchcode, $message_transport_type, $lang) = @_;
$message_transport_type //= '%';
+ $lang = 'default' unless( $lang && C4::Context->preference('TranslateNotices') );
- if ( C4::Context->preference('IndependentBranches')
- and $branchcode
- and C4::Context->userenv ) {
- $branchcode = C4::Context->userenv->{'branch'};
+ my $only_my_library = C4::Context->only_my_library;
+ if ( $only_my_library and $branchcode ) {
+ $branchcode = C4::Context::mybranch();
}
$branchcode //= '';
FROM letter
WHERE module=? AND code=? AND (branchcode = ? OR branchcode = '')
AND message_transport_type LIKE ?
+ AND lang =?
ORDER BY branchcode DESC LIMIT 1
});
- $sth->execute( $module, $code, $branchcode, $message_transport_type );
+ $sth->execute( $module, $code, $branchcode, $message_transport_type, $lang );
my $line = $sth->fetchrow_hashref
or return;
$line->{'content-type'} = 'text/html; charset="UTF-8"' if $line->{is_html};
# find the list of borrowers to alert
my $alerts = getalert( '', 'issue', $subscriptionid );
foreach (@$alerts) {
- my $borinfo = C4::Members::GetMember('borrowernumber' => $_->{'borrowernumber'});
- my $email = $borinfo->{email} or next;
+ my $patron = Koha::Patrons->find( $_->{borrowernumber} );
+ next unless $patron; # Just in case
+ my $email = $patron->email or next;
# warn "sending issues...";
my $userenv = C4::Context->userenv;
'branches' => $_->{branchcode},
'biblio' => $biblionumber,
'biblioitems' => $biblionumber,
- 'borrowers' => $borinfo,
+ 'borrowers' => $patron->unblessed,
'subscription' => $subscriptionid,
'serial' => $externalid,
},
my $mtt = $params{message_transport_type} || 'email';
my $lang = $params{lang} || 'default';
- my $letter = getletter( $module, $letter_code, $branchcode, $mtt )
- or warn( "No $module $letter_code letter transported by " . $mtt ),
- return;
+ my $letter = getletter( $module, $letter_code, $branchcode, $mtt, $lang );
+
+ unless ( $letter ) {
+ $letter = getletter( $module, $letter_code, $branchcode, $mtt, 'default' )
+ or warn( "No $module $letter_code letter transported by " . $mtt ),
+ return;
+ }
my $tables = $params{tables} || {};
my $substitute = $params{substitute} || {};
content => $letter->{content},
tables => $tables,
loops => $loops,
+ substitute => $substitute,
}
);
=head2 SendQueuedMessages ([$hashref])
- my $sent = SendQueuedMessages( { verbose => 1 } );
+ my $sent = SendQueuedMessages({ verbose => 1, limit => 50 });
-sends all of the 'pending' items in the message queue.
+Sends all of the 'pending' items in the message queue, unless the optional
+limit parameter is passed too. The verbose parameter is also optional.
-returns number of messages sent.
+Returns number of messages sent.
=cut
sub SendQueuedMessages {
my $params = shift;
- my $unsent_messages = _get_unsent_messages();
+ my $unsent_messages = _get_unsent_messages( { limit => $params->{limit} } );
MESSAGE: foreach my $message ( @$unsent_messages ) {
# warn Data::Dumper->Dump( [ $message ], [ 'message' ] );
warn sprintf( 'sending %s message to patron: %s',
}
elsif ( lc( $message->{'message_transport_type'} ) eq 'sms' ) {
if ( C4::Context->preference('SMSSendDriver') eq 'Email' ) {
- my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} );
- my $sms_provider = Koha::SMS::Providers->find( $member->{'sms_provider_id'} );
+ my $patron = Koha::Patrons->find( $message->{borrowernumber} );
+ my $sms_provider = Koha::SMS::Providers->find( $patron->sms_provider_id );
unless ( $sms_provider ) {
warn sprintf( "Patron %s has no sms provider id set!", $message->{'borrowernumber'} ) if $params->{'verbose'} or $debug;
+ _set_message_status( { message_id => $message->{'message_id'}, status => 'failed' } );
+ next MESSAGE;
+ }
+ unless ( $patron->smsalertnumber ) {
+ _set_message_status( { message_id => $message->{'message_id'}, status => 'failed' } );
+ warn sprintf( "No smsalertnumber found for patron %s!", $message->{'borrowernumber'} ) if $params->{'verbose'} or $debug;
next MESSAGE;
}
+ $message->{to_address} = $patron->smsalertnumber; #Sometime this is set to email - sms should always use smsalertnumber
$message->{to_address} .= '@' . $sms_provider->domain();
+ _update_message_to_address($message->{'message_id'},$message->{to_address});
_send_message_by_email( $message, $params->{'username'}, $params->{'password'}, $params->{'method'} );
} else {
_send_message_by_sms( $message );
my $params = shift;
my $dbh = C4::Context->dbh();
- my $statement = << 'ENDSQL';
-SELECT mq.message_id, mq.borrowernumber, mq.subject, mq.content, mq.message_transport_type, mq.status, mq.time_queued, mq.from_address, mq.to_address, mq.content_type, b.branchcode, mq.letter_code
- FROM message_queue mq
- LEFT JOIN borrowers b ON b.borrowernumber = mq.borrowernumber
- WHERE status = ?
-ENDSQL
+ my $statement = qq{
+ SELECT mq.message_id, mq.borrowernumber, mq.subject, mq.content, mq.message_transport_type, mq.status, mq.time_queued, mq.from_address, mq.to_address, mq.content_type, b.branchcode, mq.letter_code
+ FROM message_queue mq
+ LEFT JOIN borrowers b ON b.borrowernumber = mq.borrowernumber
+ WHERE status = ?
+ };
my @query_params = ('pending');
if ( ref $params ) {
my $message = shift or return;
my ($username, $password, $method) = @_;
- my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} );
+ my $patron = Koha::Patrons->find( $message->{borrowernumber} );
my $to_address = $message->{'to_address'};
unless ($to_address) {
- unless ($member) {
+ unless ($patron) {
warn "FAIL: No 'to_address' and INVALID borrowernumber ($message->{borrowernumber})";
_set_message_status( { message_id => $message->{'message_id'},
status => 'failed' } );
return;
}
- $to_address = C4::Members::GetNoticeEmailAddress( $message->{'borrowernumber'} );
+ $to_address = $patron->notice_email_address;
unless ($to_address) {
# warn "FAIL: No 'to_address' and no email for " . ($member->{surname} ||'') . ", borrowernumber ($message->{borrowernumber})";
# warning too verbose for this more common case?
my $branch_email = undef;
my $branch_replyto = undef;
my $branch_returnpath = undef;
- if ($member) {
- my $library = Koha::Libraries->find( $member->{branchcode} );
+ if ($patron) {
+ my $library = $patron->library;
$branch_email = $library->branchemail;
$branch_replyto = $library->branchreplyto;
$branch_returnpath = $library->branchreturnpath;
sub _send_message_by_sms {
my $message = shift or return;
- my $member = C4::Members::GetMember( 'borrowernumber' => $message->{'borrowernumber'} );
+ my $patron = Koha::Patrons->find( $message->{borrowernumber} );
- unless ( $member->{smsalertnumber} ) {
+ unless ( $patron and $patron->smsalertnumber ) {
_set_message_status( { message_id => $message->{'message_id'},
status => 'failed' } );
return;
return;
}
- my $success = C4::SMS->send_sms( { destination => $member->{'smsalertnumber'},
+ my $success = C4::SMS->send_sms( { destination => $patron->smsalertnumber,
message => $message->{'content'},
} );
_set_message_status( { message_id => $message->{'message_id'},
my $content = $params->{content};
my $tables = $params->{tables};
my $loops = $params->{loops};
+ my $substitute = $params->{substitute} || {};
my $use_template_cache = C4::Context->config('template_cache_dir') && defined $ENV{GATEWAY_INTERFACE};
my $template = Template->new(
}
) or die Template->error();
- my $tt_params = { %{ _get_tt_params( $tables ) }, %{ _get_tt_params( $loops, 'is_a_loop' ) } };
+ my $tt_params = { %{ _get_tt_params( $tables ) }, %{ _get_tt_params( $loops, 'is_a_loop' ) }, %$substitute };
$content = qq|[% USE KohaDates %]$content|;
pk => 'idnew',
},
aqorders => {
- module => 'Koha::Tmp::Orders', # Should Koha::Acquisition::Orders when will be based on Koha::Objects
+ module => 'Koha::Acquisition::Orders',
singular => 'order',
plural => 'orders',
pk => 'ordernumber',
plural => 'old_checkouts',
fk => 'itemnumber',
},
+ overdues => {
+ module => 'Koha::Checkouts',
+ singular => 'overdue',
+ plural => 'overdues',
+ fk => 'itemnumber',
+ },
borrower_modifications => {
module => 'Koha::Patron::Modifications',
singular => 'patron_modification',
croak "ERROR processing table $table. Wrong API call.";
}
my $key = $pk ? $pk : $fk;
- my $objects = $module->search( { $key => { -in => $values } } );
+ # $key does not come from user input
+ my $objects = $module->search(
+ { $key => $values },
+ {
+ # We want to retrieve the data in the same order
+ # FIXME MySQLism
+ # field is a MySQLism, but they are no other way to do it
+ # To be generic we could do it in perl, but we will need to fetch
+ # all the data then order them
+ @$values ? ( order_by => \[ "field($key, " . join( ', ', @$values ) . ")" ] ) : ()
+ }
+ );
$params->{ $config->{$table}->{plural} } = $objects;
}
elsif ( $ref eq q{} || $ref eq 'HASH' ) {
}
}
- $params->{today} = dt_from_string();
+ $params->{today} = output_pref({ dt => dt_from_string, dateformat => 'iso' });
return $params;
}
+=head2 get_item_content
+
+ my $item = Koha::Items->find(...)->unblessed;
+ my @item_content_fields = qw( date_due title barcode author itemnumber );
+ my $item_content = C4::Letters::get_item_content({
+ item => $item,
+ item_content_fields => \@item_content_fields
+ });
+
+This function generates a tab-separated list of values for the passed item. Dates
+are formatted following the current setup.
+
+=cut
+
+sub get_item_content {
+ my ( $params ) = @_;
+ my $item = $params->{item};
+ my $dateonly = $params->{dateonly} || 0;
+ my $item_content_fields = $params->{item_content_fields} || [];
+
+ return unless $item;
+
+ my @item_info = map {
+ $_ =~ /^date|date$/
+ ? eval {
+ output_pref(
+ { dt => dt_from_string( $item->{$_} ), dateonly => $dateonly } );
+ }
+ : $item->{$_}
+ || ''
+ } @$item_content_fields;
+ return join( "\t", @item_info ) . "\n";
+}
1;
__END__