]> wagnertech.de Git - mfinanz.git/blobdiff - SL/DN.pm
kivitendo 3.9.2-0.2
[mfinanz.git] / SL / DN.pm
index 76ee1b834d364fb12f861b1abb656da86efe37e2..054370d9269173356198c42b5d908a6e97076f7b 100644 (file)
--- a/SL/DN.pm
+++ b/SL/DN.pm
@@ -78,9 +78,11 @@ sub get_config {
   }
 
   $query =
-    qq|SELECT dunning_ar_amount_fee, dunning_ar_amount_interest, dunning_ar, dunning_creator
+    qq|SELECT dunning_ar_amount_fee, dunning_ar_amount_interest, dunning_ar, dunning_creator,
+              dunning_original_invoice_creation_mode
        FROM defaults|;
-  ($form->{AR_amount_fee}, $form->{AR_amount_interest}, $form->{AR}, $form->{dunning_creator})
+  ($form->{AR_amount_fee}, $form->{AR_amount_interest}, $form->{AR}, $form->{dunning_creator},
+   $form->{dunning_original_invoice_creation_mode})
     = selectrow_query($form, $dbh, $query);
 
   $main::lxdebug->leave_sub();
@@ -147,9 +149,9 @@ sub _save_config {
   }
 
   $query  = qq|UPDATE defaults SET dunning_ar_amount_fee = ?, dunning_ar_amount_interest = ?, dunning_ar = ?,
-               dunning_creator = ?|;
+               dunning_creator = ?, dunning_original_invoice_creation_mode = ?|;
   @values = (conv_i($form->{AR_amount_fee}), conv_i($form->{AR_amount_interest}), conv_i($form->{AR}),
-             $form->{dunning_creator});
+             $form->{dunning_creator}, $form->{dunning_original_invoice_creation_mode});
   do_query($form, $dbh, $query, @values);
 
   return 1;
@@ -333,14 +335,14 @@ sub save_dunning {
 
   # Save PDFs in filemanagement and webdav after transation succeeded,
   # because otherwise files in the storage may exists if the transaction
-  # failed. Ignore all errros.
-  # Todo: Maybe catch errros and display them as warnings or non fatal errors in the status.
+  # failed. Ignore all errors.
+  # Todo: Maybe catch errors and display them as warnings or non fatal errors in the status.
   if (!$error && $form->{DUNNING_PDFS_STORAGE} && scalar @{ $form->{DUNNING_PDFS_STORAGE} }) {
     _store_pdf_to_webdav_and_filemanagement($_->{dunning_id}, $_->{path}, $_->{name}) for @{ $form->{DUNNING_PDFS_STORAGE} };
   }
 
-  $error       = 'unknown errror' if !$error && !$rc;
-  $rc->{error} = $error           if $error;
+  $error       = 'unknown error' if !$error && !$rc;
+  $rc->{error} = $error          if $error;
 
   $::lxdebug->leave_sub;
 
@@ -431,7 +433,7 @@ sub _save_dunning {
   $form->{DUNNING_PDFS_EMAIL} = [];
 
   $form->{dunning_id} = $dunning_id;
-
+  $form->{media} = 'email' if $send_email;
   $self->create_invoice_for_fees($myconfig, $form, $dbh, $dunning_id);
 
   $self->print_invoice_for_fees($myconfig, $form, $dunning_id, $dbh);
@@ -456,12 +458,15 @@ sub send_email {
   my $query =
     qq|SELECT
          dcfg.email_body,     dcfg.email_subject, dcfg.email_attachment,
-         COALESCE (NULLIF(c.invoice_mail, ''), c.email) AS recipient, c.name,
+         COALESCE (NULLIF(aba.dunning_mail, ''), NULLIF(aba.email,''),
+                   NULLIF(c.dunning_mail, ''),
+                   NULLIF(c.invoice_mail, ''), c.email) AS recipient, c.name,
          (SELECT login from employee where id = ar.employee_id) as invoice_employee_login
        FROM dunning d
        LEFT JOIN dunning_config dcfg ON (d.dunning_config_id = dcfg.id)
        LEFT JOIN ar                  ON (d.trans_id          = ar.id)
        LEFT JOIN customer c          ON (ar.customer_id      = c.id)
+       LEFT JOIN additional_billing_addresses aba ON (aba.id = ar.billing_address_id)
        WHERE (d.dunning_id = ?)
        LIMIT 1|;
   my $ref = selectfirst_hashref_query($form, $dbh, $query, $dunning_id);
@@ -514,7 +519,8 @@ sub send_email {
   $mail->{record_id}   = \@ids;
   $mail->{record_type} = 'dunning';
 
-  $mail->send();
+  my $error = $mail->send();
+  die "Mailer error during 'send': $error\n" if $error;
 
   $main::lxdebug->leave_sub();
 }
@@ -617,6 +623,16 @@ sub get_invoices {
     push(@values, $form->{department_id});
   }
 
+  if ($form->{payment_id}) {
+    $where .= " AND a.payment_id = ?";
+    push(@values, $form->{payment_id});
+  }
+
+  if ($form->{invoice}) {
+    $where .= " AND a.invoice = ?";
+    push(@values, $form->{invoice});
+  }
+
   my %columns = (
     "ordnumber" => "a.ordnumber",
     "invnumber" => "a.invnumber",
@@ -659,7 +675,9 @@ sub get_invoices {
          a.direct_debit,
          pt.description as payment_term,
          dep.description as departmentname,
-         ct.invoice_mail AS cv_email,
+         COALESCE (NULLIF(aba.dunning_mail, ''), NULLIF(aba.email,''),
+                   NULLIF(ct.dunning_mail, ''),
+                   NULLIF(ct.invoice_mail, ''), ct.email) AS recipient,
          cfg.dunning_description, cfg.dunning_level,
 
          d.transdate AS dunning_date, d.duedate AS dunning_duedate,
@@ -676,6 +694,7 @@ sub get_invoices {
        FROM ar a
 
        LEFT JOIN customer ct ON (a.customer_id = ct.id)
+       LEFT JOIN additional_billing_addresses aba ON (aba.id = a.billing_address_id)
        LEFT JOIN department dep ON (a.department_id = dep.id)
        LEFT JOIN payment_terms pt ON (a.payment_id = pt.id)
        LEFT JOIN dunning_config cfg ON (a.dunning_config_id = cfg.id)
@@ -702,10 +721,11 @@ sub get_invoices {
        ))
         $paid
         AND (a.duedate < current_date)
+        AND ct.dunning_lock = false
 
        $where
 
-       ORDER BY a.id, transdate, duedate, name|;
+       ORDER BY ct.name, a.id, transdate, duedate |;
   my $sth = prepare_execute_query($form, $dbh, $query, $id_for_max_dunning_level, @values);
 
   $form->{DUNNINGS} = [];
@@ -1204,6 +1224,59 @@ sub print_original_invoice {
 
   die "Invalid invoice object" unless ref($invoice) eq 'SL::DB::Invoice';
 
+  my $filestore_enabled = SL::DB::Default->get->webdav
+                       || SL::DB::Default->get->doc_storage;
+  if ($::instance_conf->get_dunning_original_invoice_creation_mode eq 'use_last_created_or_create_new'
+      && $filestore_enabled) {
+    my ($file_name, $file_path);
+    # search file in files and webdav
+    if (SL::DB::Default->get->doc_storage) {
+      my $file_entry = SL::DB::Manager::File->get_first(
+        query => [
+          object_type => $invoice->type,
+          object_id   => $invoice->id,
+        ],
+      );
+      if ($file_entry) {
+        my $file = SL::File::Object->new(
+          db_file => $file_entry,
+          id => $file_entry->id,
+          loaded => 1,
+        );
+        $file_name = $file->file_name();
+        $file_path = $file->get_file();
+      }
+    } elsif (SL::DB::Default->get->webdav) {
+      my $webdav = SL::Webdav->new(
+        type   => $invoice->type,
+        number => $invoice->record_number,
+      );
+      my @latest_object = $webdav->get_all_latest();
+      if (scalar @latest_object) {
+        $file_name = $latest_object[0]->basename . "." . $latest_object[0]->extension;
+        $file_path = $latest_object[0]->full_filedescriptor();
+      }
+    } # end file search
+
+    my $attachment_filename    = $form->get_formname_translation('invoice') . "_" . $invoice->invnumber . ".pdf";
+    if ($file_name ne '' and $file_path ne '') {
+      my $spool = $::lx_office_conf{paths}->{spool};
+      my $spool_path = File::Spec->catfile($spool, $file_name);
+
+      copy($file_path, $spool_path) or die "The copy operation failed: $!";
+
+      push @{ $form->{DUNNING_PDFS} }        , $file_name;
+      push @{ $form->{DUNNING_PDFS_EMAIL} }  , {
+        'path'       => $file_path,
+        'name'       => $file_name, };
+      push @{ $form->{DUNNING_PDFS_STORAGE} }, {
+        'dunning_id' => $dunning_id,
+        'path'       => $file_path,
+        'name'       => $file_name };
+      return;
+    }
+  }
+
   my $print_form          = Form->new('');
   $print_form->{type}     = 'invoice';
   $print_form->{formname} = 'invoice',