Bug 30813: Adjust TransformMarcToKoha to take kohafields parameter
[koha-ffzg.git] / C4 / Letters.pm
index 07a4738..8ab0bb7 100644 (file)
@@ -19,7 +19,6 @@ package C4::Letters;
 
 use Modern::Perl;
 
-use MIME::Lite;
 use Carp qw( carp croak );
 use Template;
 use Module::Load::Conditional qw( can_load );
@@ -41,6 +40,8 @@ use Koha::Patrons;
 use Koha::SMTP::Servers;
 use Koha::Subscriptions;
 
+use constant SERIALIZED_EMAIL_CONTENT_TYPE => 'message/rfc822';
+
 our (@ISA, @EXPORT_OK);
 BEGIN {
     require Exporter;
@@ -528,56 +529,6 @@ sub SendAlerts {
                 . $letter->{content}
         ) if C4::Context->preference("ClaimsLog");
     }
-   # send an "account details" notice to a newly created user
-    elsif ( $type eq 'members' ) {
-        my $library = Koha::Libraries->find( $externalid->{branchcode} );
-        my $letter = GetPreparedLetter (
-            module => 'members',
-            letter_code => $letter_code,
-            branchcode => $externalid->{'branchcode'},
-            lang       => $externalid->{lang} || 'default',
-            tables => {
-                'branches'    => $library->unblessed,
-                'borrowers' => $externalid->{'borrowernumber'},
-            },
-            substitute => { 'borrowers.password' => $externalid->{'password'} },
-            want_librarian => 1,
-        ) or return;
-        return { error => "no_email" } unless $externalid->{'emailaddr'};
-
-        my $success = try {
-
-            # FIXME: This 'default' behaviour should be moved to Koha::Email
-            my $mail = Koha::Email->create(
-                {
-                    to       => $externalid->{'emailaddr'},
-                    from     => $library->branchemail,
-                    reply_to => $library->branchreplyto,
-                    sender   => $library->branchreturnpath,
-                    subject  => "" . $letter->{'title'},
-                }
-            );
-
-            if ( $letter->{is_html} ) {
-                $mail->html_body( _wrap_html( $letter->{content}, "" . $letter->{title} ) );
-            }
-            else {
-                $mail->text_body( $letter->{content} );
-            }
-
-            $mail->send_or_die({ transport => $library->smtp_server->transport });
-        }
-        catch {
-            # We expect ref($_) eq 'Email::Sender::Failure'
-            $error = $_->message;
-
-            carp "$_";
-            return;
-        };
-
-        return { error => $error }
-            unless $success;
-    }
 
     # If we come here, return an OK status
     return 1;
@@ -648,6 +599,7 @@ sub GetPreparedLetter {
 
     if (%$substitute) {
         while ( my ($token, $val) = each %$substitute ) {
+            $val //= q{};
             if ( $token eq 'items.content' ) {
                 $val =~ s|\n|<br/>|g if $letter->{is_html};
             }
@@ -785,7 +737,7 @@ sub _parseletter_sth {
     ($table eq 'debits'       )    ? "SELECT * FROM accountlines WHERE   accountlines_id = ?"                         :
     ($table eq 'items'        )    ? "SELECT * FROM $table WHERE     itemnumber = ?"                                  :
     ($table eq 'issues'       )    ? "SELECT * FROM $table WHERE     itemnumber = ?"                                  :
-    ($table eq 'old_issues'   )    ? "SELECT * FROM $table WHERE     itemnumber = ? ORDER BY timestamp DESC LIMIT 1"  :
+    ($table eq 'old_issues'   )    ? "SELECT * FROM $table WHERE     issue_id = ?"  :
     ($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 = ?"                                  :
@@ -800,6 +752,7 @@ sub _parseletter_sth {
     ($table eq 'serial') ? "SELECT * FROM $table WHERE serialid = ?" :
     ($table eq 'problem_reports') ? "SELECT * FROM $table WHERE reportid = ?" :
     ($table eq 'additional_contents' || $table eq 'opac_news') ? "SELECT * FROM additional_contents WHERE idnew = ?" :
+    ($table eq 'recalls') ? "SELECT * FROM $table WHERE recall_id = ?" :
     undef ;
     unless ($query) {
         warn "ERROR: No _parseletter_sth query for table '$table'";
@@ -872,8 +825,9 @@ sub _parseletter {
                     $dateonly = $1 unless $dateonly;
                 }
                 my $replacedby_date = eval {
-                    output_pref({ dt => dt_from_string( $replacedby ), dateonly => $dateonly });
+                    output_pref({ dt => scalar dt_from_string( $replacedby ), dateonly => $dateonly });
                 };
+                $replacedby_date //= q{};
 
                 if ( $letter->{ $letter_field } ) {
                     $letter->{ $letter_field } =~ s/\Q<<$table.$field$filter_string_used>>\E/$replacedby_date/g;
@@ -955,7 +909,6 @@ sub EnqueueLetter {
         $params->{'letter'} = _add_attachments(
             {   letter      => $params->{'letter'},
                 attachments => $params->{'attachments'},
-                message     => MIME::Lite->new( Type => 'multipart/mixed' ),
             }
         );
     }
@@ -1219,45 +1172,50 @@ sub ResendMessage {
 
 =head2 _add_attachements
 
+  _add_attachments({ letter => $letter, attachments => $attachments });
+
   named parameters:
   letter - the standard letter hashref
   attachments - listref of attachments. each attachment is a hashref of:
     type - the mime type, like 'text/plain'
     content - the actual attachment
     filename - the name of the attachment.
-  message - a MIME::Lite object to attach these to.
 
   returns your letter object, with the content updated.
+  This routine picks the I<content> of I<letter> and generates a MIME
+  email, attaching the passed I<attachments> using Koha::Email. The
+  content is replaced by the string representation of the MIME object,
+  and the content-type is updated for later handling.
 
 =cut
 
 sub _add_attachments {
     my $params = shift;
 
-    my $letter = $params->{'letter'};
-    my $attachments = $params->{'attachments'};
+    my $letter = $params->{letter};
+    my $attachments = $params->{attachments};
     return $letter unless @$attachments;
-    my $message = $params->{'message'};
-
-    # First, we have to put the body in as the first attachment
-    $message->attach(
-        Type => $letter->{'content-type'} || 'TEXT',
-        Data => $letter->{'is_html'}
-            ? _wrap_html($letter->{'content'}, $letter->{'title'})
-            : $letter->{'content'},
-    );
+
+    my $message = Koha::Email->new;
+
+    if ( $letter->{is_html} ) {
+        $message->html_body( _wrap_html( $letter->{content}, $letter->{title} ) );
+    }
+    else {
+        $message->text_body( $letter->{content} );
+    }
 
     foreach my $attachment ( @$attachments ) {
         $message->attach(
-            Type     => $attachment->{'type'},
-            Data     => $attachment->{'content'},
-            Filename => $attachment->{'filename'},
+            Encode::encode( "UTF-8", $attachment->{content} ),
+            content_type => $attachment->{type} || 'application/octet-stream',
+            name         => $attachment->{filename},
+            disposition  => 'attachment',
         );
     }
-    # we're forcing list context here to get the header, not the count back from grep.
-    ( $letter->{'content-type'} ) = grep( /^Content-Type:/, split( /\n/, $params->{'message'}->header_as_string ) );
-    $letter->{'content-type'} =~ s/^Content-Type:\s+//;
-    $letter->{'content'} = $message->body_as_string;
+
+    $letter->{'content-type'} = SERIALIZED_EMAIL_CONTENT_TYPE;
+    $letter->{content} = $message->as_string;
 
     return $letter;
 
@@ -1389,43 +1347,60 @@ sub _send_message_by_email {
         );
         return;
     };
-    my $email = try {
-        Koha::Email->create(
-            {
-                to => $to_address,
-                (
-                    C4::Context->preference('NoticeBcc')
-                    ? ( bcc => C4::Context->preference('NoticeBcc') )
-                    : ()
-                ),
-                from     => $from_address,
-                reply_to => $message->{'reply_address'} || $branch_replyto,
-                sender   => $branch_returnpath,
-                subject  => "" . $message->{subject}
+    my $email;
+
+    try {
+
+        my $params = {
+            to => $to_address,
+            (
+                C4::Context->preference('NoticeBcc')
+                ? ( bcc => C4::Context->preference('NoticeBcc') )
+                : ()
+            ),
+            from     => $from_address,
+            reply_to => $message->{'reply_address'} || $branch_replyto,
+            sender   => $branch_returnpath,
+            subject  => "" . $message->{subject}
+        };
+
+        if ( $message->{'content_type'} && $message->{'content_type'} eq SERIALIZED_EMAIL_CONTENT_TYPE ) {
+
+            # The message has been previously composed as a valid MIME object
+            # and serialized as a string on the DB
+            $email = Koha::Email->new_from_string($content);
+            $email->create($params);
+        } else {
+            $email = Koha::Email->create($params);
+            if ($is_html) {
+                $email->html_body( _wrap_html( $content, $subject ) );
+            } else {
+                $email->text_body($content);
             }
-        );
+        }
     }
     catch {
-        _set_message_status(
-            {
-                message_id   => $message->{'message_id'},
-                status       => 'failed',
-                failure_code => 'INVALID_EMAIL'
-            }
-        );
+        if ( ref($_) eq 'Koha::Exceptions::BadParameter' ) {
+            _set_message_status(
+                {
+                    message_id   => $message->{'message_id'},
+                    status       => 'failed',
+                    failure_code => "INVALID_EMAIL:".$_->parameter
+                }
+            );
+        } else {
+            _set_message_status(
+                {
+                    message_id   => $message->{'message_id'},
+                    status       => 'failed',
+                    failure_code => 'UNKNOWN_ERROR'
+                }
+            );
+        }
         return 0;
     };
     return unless $email;
 
-    if ( $is_html ) {
-        $email->html_body(
-            _wrap_html( $content, $subject )
-        );
-    }
-    else {
-        $email->text_body( $content );
-    }
-
     my $smtp_server;
     if ( $library ) {
         $smtp_server = $library->smtp_server;
@@ -1747,7 +1722,7 @@ sub _get_tt_params {
             module   => 'Koha::Old::Checkouts',
             singular => 'old_checkout',
             plural   => 'old_checkouts',
-            fk       => 'itemnumber',
+            pk       => 'issue_id',
         },
         overdues => {
             module   => 'Koha::Checkouts',