X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FLetters.pm;h=28c6984c61629fcba19f2fdd1f0a48bdaa78fde5;hb=6c2984e78a5a8e26c995523655a9b86442813318;hp=6846a00e98ca06dad37c17535e967ba05a155bb3;hpb=c8df6bdcc9fe2523a77c839270b31304d8e13ee5;p=koha.git diff --git a/C4/Letters.pm b/C4/Letters.pm index 6846a00e98..28c6984c61 100644 --- a/C4/Letters.pm +++ b/C4/Letters.pm @@ -22,8 +22,6 @@ use warnings; use MIME::Lite; use Mail::Sendmail; -use Encode; -use Carp; use C4::Members; use C4::Branch; @@ -243,6 +241,7 @@ sub findrelatedto ($$) { sub SendAlerts { my ( $type, $externalid, $letter ) = @_; my $dbh = C4::Context->dbh; + my $strsth; if ( $type eq 'issue' ) { # warn "sending issues..."; @@ -290,99 +289,56 @@ sub SendAlerts { ); sendmail(%mail) or carp $Mail::Sendmail::error; -# warn "sending to $mail{To} From $mail{From} subj $mail{Subject} Mess $mail{Message}"; } } } elsif ( $type eq 'claimacquisition' ) { - # warn "sending issues..."; - my $letter = getletter( 'claimacquisition', $letter ); + $letter = getletter( 'claimacquisition', $letter ); # prepare the letter... # search the biblionumber - my $strsth = -"select aqorders.*,aqbasket.*,biblio.*,biblioitems.* from aqorders LEFT JOIN aqbasket on aqbasket.basketno=aqorders.basketno LEFT JOIN biblio on aqorders.biblionumber=biblio.biblionumber LEFT JOIN biblioitems on aqorders.biblioitemnumber=biblioitems.biblioitemnumber where aqorders.ordernumber IN (" - . join( ",", @$externalid ) . ")"; - my $sthorders = $dbh->prepare($strsth); - $sthorders->execute; - my $dataorders = $sthorders->fetchall_arrayref( {} ); - parseletter( $letter, 'aqbooksellers', - $dataorders->[0]->{booksellerid} ); - my $sthbookseller = - $dbh->prepare("select * from aqbooksellers where id=?"); - $sthbookseller->execute( $dataorders->[0]->{booksellerid} ); - my $databookseller = $sthbookseller->fetchrow_hashref; - - # parsing branch info - my $userenv = C4::Context->userenv; - parseletter( $letter, 'branches', $userenv->{branch} ); - - # parsing librarian name - $letter->{content} =~ s/<>/$userenv->{firstname}/g; - $letter->{content} =~ s/<>/$userenv->{surname}/g; - $letter->{content} =~ - s/<>/$userenv->{emailaddress}/g; - foreach my $data ( @{$dataorders} ) { - if ( $letter->{content} =~ m/(<<.*>>)/ ) { - my $line = $1; - foreach my $field ( keys %{$data} ) { - $line =~ s/(<<[^\.]+.$field>>)/$data->{$field}/; - } - $letter->{content} =~ s/(<<.*>>)/$line\n$1/; - } - } - $letter->{content} =~ s/<<[^>]*>>//g; - my $innerletter = $letter; - - # ... then send mail - if ( $databookseller->{bookselleremail} - || $databookseller->{contemail} ) - { - my %mail = ( - To => $databookseller->{bookselleremail} - . ( - $databookseller->{contemail} - ? "," . $databookseller->{contemail} - : "" - ), - From => $userenv->{emailaddress}, - Subject => "" . $innerletter->{title}, - Message => "" . $innerletter->{content}, - 'Content-Type' => 'text/plain; charset="utf8"', - ); - sendmail(%mail) or carp $Mail::Sendmail::error; - } - if ( C4::Context->preference("LetterLog") ) { - logaction( - "ACQUISITION", - "Send Acquisition claim letter", - "", - "order list : " - . join( ",", @$externalid ) - . "\n$innerletter->{title}\n$innerletter->{content}" - ); + $strsth = qq{ + SELECT aqorders.*,aqbasket.*,biblio.*,biblioitems.*,aqbooksellers.* + FROM aqorders + LEFT JOIN aqbasket ON aqbasket.basketno=aqorders.basketno + LEFT JOIN biblio ON aqorders.biblionumber=biblio.biblionumber + LEFT JOIN biblioitems ON aqorders.biblioitemnumber=biblioitems.biblioitemnumber + LEFT JOIN aqbooksellers ON aqbasket.booksellerid=aqbooksellers.id + WHERE aqorders.ordernumber IN ( } + . join( ",", @$externalid ) . ")"; } elsif ( $type eq 'claimissues' ) { - # warn "sending issues..."; - my $letter = getletter( 'claimissues', $letter ); + $letter = getletter( 'claimissues', $letter ); # prepare the letter... # search the biblionumber - my $strsth = -"select serial.*,subscription.*, biblio.* from serial LEFT JOIN subscription on serial.subscriptionid=subscription.subscriptionid LEFT JOIN biblio on serial.biblionumber=biblio.biblionumber where serial.serialid IN (" + $strsth = qq{ + SELECT serial.*,subscription.*, biblio.*, aqbooksellers.* + FROM serial + LEFT JOIN subscription ON serial.subscriptionid=subscription.subscriptionid + LEFT JOIN biblio ON serial.biblionumber=biblio.biblionumber + LEFT JOIN aqbooksellers ON subscription.aqbooksellerid=aqbooksellers.id + WHERE serial.serialid IN ( + } . join( ",", @$externalid ) . ")"; + } + + if ( $type eq 'claimacquisition' or $type eq 'claimissues' ) { my $sthorders = $dbh->prepare($strsth); $sthorders->execute; - my $dataorders = $sthorders->fetchall_arrayref( {} ); - parseletter( $letter, 'aqbooksellers', - $dataorders->[0]->{aqbooksellerid} ); - my $sthbookseller = - $dbh->prepare("select * from aqbooksellers where id=?"); - $sthbookseller->execute( $dataorders->[0]->{aqbooksellerid} ); - my $databookseller = $sthbookseller->fetchrow_hashref; + my @fields = map { + $sthorders->{mysql_table}[$_] . "." . $sthorders->{NAME}[$_] } + (0 .. $#{$sthorders->{NAME}} ) ; + + my @orders_infos; + while ( my $row = $sthorders->fetchrow_arrayref() ) { + my %rec = (); + @rec{@fields} = @$row; + push @orders_infos, \%rec; + } # parsing branch info my $userenv = C4::Context->userenv; @@ -391,59 +347,65 @@ sub SendAlerts { # parsing librarian name $letter->{content} =~ s/<>/$userenv->{firstname}/g; $letter->{content} =~ s/<>/$userenv->{surname}/g; - $letter->{content} =~ - s/<>/$userenv->{emailaddress}/g; - foreach my $data ( @{$dataorders} ) { - if ( $letter->{content} =~ m/(<<.*>>)/ ) { - my $line = $1; - foreach my $field ( keys %{$data} ) { - $line =~ s/(<<[^\.]+.$field>>)/$data->{$field}/; + $letter->{content} =~ s/<>/$userenv->{emailaddress}/g; + + # Get Fields remplacement + my $order_format = $1 if ( $letter->{content} =~ m/(.*<\/order>)/xms ); + + # Foreach field to remplace + while ( $letter->{content} =~ m/<<([^>]*)>>/g ) { + my $field = $1; + my $value = $orders_infos[0]->{$field} || ""; + $value = sprintf("%.2f", $value) if $field =~ /price/; + $letter->{content} =~ s/<<$field>>/$value/g; + } + + if ( $order_format ) { + # For each order + foreach my $infos ( @orders_infos ) { + my $order_content = $order_format; + # We replace by value + while ( $order_content =~ m/<<([^>]*)>>/g ) { + my $field = $1; + my $value = $infos->{$field} || ""; + $value = sprintf("%.2f", $value) if $field =~ /price/; + $order_content =~ s/(<<$field>>)/$value/g; } - $letter->{content} =~ s/(<<.*>>)/$line\n$1/; + $order_content =~ s/<\/{0,1}?order>//g; + $letter->{content} =~ s/.*<\/order>/$order_content\n$order_format/xms; } + $letter->{content} =~ s/.*<\/order>//xms; } - $letter->{content} =~ s/<<[^>]*>>//g; + my $innerletter = $letter; # ... then send mail - if ( $databookseller->{bookselleremail} - || $databookseller->{contemail} ) { - my $mail_to = $databookseller->{bookselleremail}; - if ($databookseller->{contemail}) { - if (!$mail_to) { - $mail_to = $databookseller->{contemail}; - } else { - $mail_to .= q|,|; - $mail_to .= $databookseller->{contemail}; - } - } - my $mail_subj = $innerletter->{title}; - my $mail_msg = $innerletter->{content}; - $mail_msg ||= q{}; - $mail_subj ||= q{}; - + if ( $orders_infos[0]->{'aqbooksellers.bookselleremail'} + || $orders_infos[0]->{'aqbooksellers.contemail'} ) { + my $to = $orders_infos[0]->{'aqbooksellers.bookselleremail'}; + $to .= ", " if $to; + $to .= $orders_infos[0]->{'aqbooksellers.contemail'} || ""; my %mail = ( - To => $mail_to, - From => $userenv->{emailaddress}, - Subject => $mail_subj, - Message => $mail_msg, + To => $to, + From => $userenv->{emailaddress}, + Subject => Encode::encode( "utf8", "" . $innerletter->{title} ), + Message => Encode::encode( "utf8", "" . $innerletter->{content} ), 'Content-Type' => 'text/plain; charset="utf8"', ); sendmail(%mail) or carp $Mail::Sendmail::error; - logaction( - "ACQUISITION", - "CLAIM ISSUE", - undef, - "To=" - . $databookseller->{contemail} - . " Title=" - . $innerletter->{title} - . " Content=" - . $innerletter->{content} - ) if C4::Context->preference("LetterLog"); + warn "sending to $mail{To} From $mail{From} subj $mail{Subject} Mess $mail{Message}" if $debug; + if ( C4::Context->preference("LetterLog") ) { + logaction( "ACQUISITION", "Send Acquisition claim letter", "", "order list : " . join( ",", @$externalid ) . "\n$innerletter->{title}\n$innerletter->{content}" ) if $type eq 'claimacquisition'; + logaction( "ACQUISITION", "CLAIM ISSUE", undef, "To=" . $mail{To} . " Title=" . $innerletter->{title} . " Content=" . $innerletter->{content} ) if $type eq 'claimissues'; + } + } else { + return {error => "no_email" }; } - } - # send an "account details" notice to a newly created user + + warn "sending to From $userenv->{emailaddress} subj $innerletter->{title} Mess $innerletter->{content}" if $debug; + } + + # send an "account details" notice to a newly created user elsif ( $type eq 'members' ) { # must parse the password special, before it's hashed. $letter->{content} =~ s/<>/$externalid->{'password'}/g; @@ -490,7 +452,6 @@ sub parseletter_sth { ($table eq 'biblioitems' ) ? "SELECT * FROM $table WHERE biblionumber = ?" : ($table eq 'items' ) ? "SELECT * FROM $table WHERE itemnumber = ?" : ($table eq 'issues' ) ? "SELECT * FROM $table WHERE itemnumber = ?" : - ($table eq 'suggestions' ) ? "SELECT * FROM $table WHERE borrowernumber = ? and biblionumber = ?" : ($table eq 'reserves' ) ? "SELECT * FROM $table WHERE borrowernumber = ? and biblionumber = ?" : ($table eq 'borrowers' ) ? "SELECT * FROM $table WHERE borrowernumber = ?" : ($table eq 'branches' ) ? "SELECT * FROM $table WHERE branchcode = ?" : @@ -837,8 +798,8 @@ sub _send_message_by_email ($;$$$) { if ( my $bcc = C4::Context->preference('OverdueNoticeBcc') ) { $sendmail_params{ Bcc } = $bcc; } - + _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 if ( sendmail( %sendmail_params ) ) { _set_message_status( { message_id => $message->{'message_id'}, status => 'sent' } ); @@ -864,6 +825,12 @@ sub _send_message_by_sms ($) { return $success; } +sub _update_message_to_address { + my ($id, $to)= @_; + my $dbh = C4::Context->dbh(); + $dbh->do('UPDATE message_queue SET to_address=? WHERE message_id=?',undef,($to,$id)); +} + sub _set_message_status ($) { my $params = shift or return undef;