Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / FU.pm
index 55f58f0..822e31f 100644 (file)
--- a/SL/FU.pm
+++ b/SL/FU.pm
@@ -6,20 +6,29 @@ use List::Util qw(first);
 
 use SL::Common;
 use SL::DBUtils;
+use SL::DB;
 use SL::Notes;
 
 use strict;
 
 sub save {
+  my ($self, %params) = @_;
   $main::lxdebug->enter_sub();
 
+  my $rc = SL::DB->client->with_transaction(\&_save, $self, %params);
+
+  $::lxdebug->leave_sub;
+  return $rc;
+}
+
+sub _save {
   my $self     = shift;
   my %params   = @_;
 
   my $myconfig = \%main::myconfig;
   my $form     = $main::form;
 
-  my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
+  my $dbh      = $params{dbh} || SL::DB->client->dbh;
   my ($query, @values);
 
   if (!$params{id}) {
@@ -56,9 +65,7 @@ sub save {
 
   $sth->finish();
 
-  $dbh->commit() unless ($params{dbh});
-
-  $main::lxdebug->leave_sub();
+  return 1;
 }
 
 sub finish {
@@ -72,11 +79,10 @@ sub finish {
   my $myconfig = \%main::myconfig;
   my $form     = $main::form;
 
-  my $dbh      = $form->get_standard_dbh($myconfig);
-
-  do_query($form, $dbh, qq|UPDATE follow_ups SET done = TRUE WHERE id = ?|, conv_i($params{id}));
-
-  $dbh->commit();
+  SL::DB->client->with_transaction(sub {
+    do_query($form, SL::DB->client->dbh, qq|UPDATE follow_ups SET done = TRUE WHERE id = ?|, conv_i($params{id}));
+    1;
+  }) or do { die SL::DB->client->error };
 
   $main::lxdebug->leave_sub();
 }
@@ -92,15 +98,16 @@ sub delete {
   my $myconfig = \%main::myconfig;
   my $form     = $main::form;
 
-  my $dbh      = $form->get_standard_dbh($myconfig);
-
-  my $id       = conv_i($params{id});
+  SL::DB->client->with_transaction(sub {
+    my $dbh      = SL::DB->client->dbh;
 
-  do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|,                         $id);
-  do_query($form, $dbh, qq|DELETE FROM follow_ups      WHERE id = ?|,                                   $id);
-  do_query($form, $dbh, qq|DELETE FROM notes           WHERE (trans_id = ?) AND (trans_module = 'fu')|, $id);
+    my $id       = conv_i($params{id});
 
-  $dbh->commit();
+    do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|,                         $id);
+    do_query($form, $dbh, qq|DELETE FROM follow_ups      WHERE id = ?|,                                   $id);
+    do_query($form, $dbh, qq|DELETE FROM notes           WHERE (trans_id = ?) AND (trans_module = 'fu')|, $id);
+    1;
+  }) or do { die SL::DB->client->error };
 
   $main::lxdebug->leave_sub();
 }
@@ -188,8 +195,10 @@ sub follow_ups {
   my @values_user   = ();
 
   if ($params{trans_id}) {
-    $where .= qq| AND EXISTS (SELECT * FROM follow_up_links ful
-                              WHERE (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
+    $where .= qq| AND fu.id IN (select follow_up_id from follow_up_links where trans_id = ?)|;
+   # $where .= qq| AND (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
+   # $where .= qq| AND EXISTS (SELECT * FROM follow_up_links ful
+   #                           WHERE (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
     push @values, conv_i($params{trans_id});
   }
 
@@ -210,7 +219,7 @@ sub follow_ups {
   foreach my $item (qw(subject body)) {
     next unless ($params{$item});
     $where .= qq| AND (n.${item} ILIKE ?)|;
-    push @values, '%' . $params{$item} . '%';
+    push @values, like($params{$item});
   }
 
   if ($params{reference}) {
@@ -219,7 +228,7 @@ sub follow_ups {
                               WHERE (ful.follow_up_id = fu.id)
                                 AND (ful.trans_info ILIKE ?)
                               LIMIT 1)|;
-    push @values, '%' . $params{reference} . '%';
+    push @values, like($params{reference});
   }
 
   if ($params{follow_up_date_from}) {
@@ -239,8 +248,12 @@ sub follow_ups {
     $where .= qq| AND (date_trunc('DAY', fu.itime) <= ?)|;
     push @values, conv_date($params{itime_to});
   }
+  if ($params{created_for}) {
+    $where .= qq| AND fu.created_for_user = ?|;
+    push @values, conv_i($params{created_for});
+  }
 
-  if ($params{all_users}) {
+  if ($params{all_users} || $params{trans_id}) {  # trans_id only for documents?
     $where_user = qq|OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?))|;
     push @values_user, $employee_id;
   }
@@ -325,8 +338,14 @@ sub link_details {
     };
 
   } elsif ($params{trans_type} eq 'sales_quotation') {
+    my $script = 'oe.pl';
+    my $action = 'edit';
+    if ($::instance_conf->get_feature_experimental_order) {
+      $script = 'controller.pl';
+      $action = 'Order/edit';
+    }
     $link = {
-      'url'   => 'oe.pl?action=edit&type=sales_quotation&id=' . $params{trans_id},
+      'url'   => $script . '?action=' . $action . '&type=sales_quotation&id=' . $params{trans_id},
       'title' => $locale->text('Sales quotation') . " $params{trans_info}",
     };
 
@@ -345,8 +364,14 @@ sub link_details {
     };
 
   } elsif ($params{trans_type} eq 'sales_order') {
+    my $script = 'oe.pl';
+    my $action = 'edit';
+    if ($::instance_conf->get_feature_experimental_order) {
+      $script = 'controller.pl';
+      $action = 'Order/edit';
+    }
     $link = {
-      'url'   => 'oe.pl?action=edit&type=sales_order&id=' . $params{trans_id},
+      'url'   => $script . '?action=' . $action . '&type=sales_order&id=' . $params{trans_id},
       'title' => $locale->text('Sales Order') . " $params{trans_info}",
     };
 
@@ -356,6 +381,12 @@ sub link_details {
       'title' => $locale->text('Sales Invoice') . " $params{trans_info}",
     };
 
+  } elsif ($params{trans_type} eq 'purchase_invoice') {
+    $link = {
+      'url'   => 'ir.pl?action=edit&type=purchase_invoice&id=' . $params{trans_id},
+      'title' => $locale->text('Purchase Invoice') . " $params{trans_info}",
+    };
+
   } elsif ($params{trans_type} eq 'credit_note') {
     $link = {
       'url'   => 'is.pl?action=edit&type=credit_note&id=' . $params{trans_id},
@@ -369,14 +400,26 @@ sub link_details {
     };
 
   } elsif ($params{trans_type} eq 'request_quotation') {
+    my $script = 'oe.pl';
+    my $action = 'edit';
+    if ($::instance_conf->get_feature_experimental_order) {
+      $script = 'controller.pl';
+      $action = 'Order/edit';
+    }
     $link = {
-      'url'   => 'oe.pl?action=edit&type=request_quotation&id=' . $params{trans_id},
+      'url'   => $script . '?action=' . $action . '&type=request_quotation&id=' . $params{trans_id},
       'title' => $locale->text('Request quotation') . " $params{trans_info}",
     };
 
   } elsif ($params{trans_type} eq 'purchase_order') {
+    my $script = 'oe.pl';
+    my $action = 'edit';
+    if ($::instance_conf->get_feature_experimental_order) {
+      $script = 'controller.pl';
+      $action = 'Order/edit';
+    }
     $link = {
-      'url'   => 'oe.pl?action=edit&type=purchase_order&id=' . $params{trans_id},
+      'url'   => $script . '?action=' . $action . '&type=purchase_order&id=' . $params{trans_id},
       'title' => $locale->text('Purchase Order') . " $params{trans_info}",
     };
 
@@ -422,24 +465,25 @@ sub save_access_rights {
   my $myconfig = \%main::myconfig;
   my $form     = $main::form;
 
-  my $dbh      = $form->get_standard_dbh($myconfig);
-
-  my ($id)     = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $::myconfig{login});
+  SL::DB->client->with_transaction(sub {
+    my $dbh      = SL::DB->client->dbh;
 
-  do_query($form, $dbh, qq|DELETE FROM follow_up_access WHERE what = ?|, $id);
+    my ($id)     = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $::myconfig{login});
 
-  my $query    = qq|INSERT INTO follow_up_access (who, what) VALUES (?, ?)|;
-  my $sth      = prepare_query($form, $dbh, $query);
+    do_query($form, $dbh, qq|DELETE FROM follow_up_access WHERE what = ?|, $id);
 
-  while (my ($who, $access_allowed) = each %{ $params{access} }) {
-    next unless ($access_allowed);
+    my $query    = qq|INSERT INTO follow_up_access (who, what) VALUES (?, ?)|;
+    my $sth      = prepare_query($form, $dbh, $query);
 
-    do_statement($form, $sth, $query, conv_i($who), $id);
-  }
+    while (my ($who, $access_allowed) = each %{ $params{access} }) {
+      next unless ($access_allowed);
 
-  $sth->finish();
+      do_statement($form, $sth, $query, conv_i($who), $id);
+    }
 
-  $dbh->commit();
+    $sth->finish();
+    1;
+  }) or do { die SL::DB->client->error };
 
   $main::lxdebug->leave_sub();
 }