Nach Löschen in ar/ap/gl via DB-Trigger in acc_trans aufräumen
[kivitendo-erp.git] / SL / GL.pm
index def0dc8..7bcb475 100644 (file)
--- a/SL/GL.pm
+++ b/SL/GL.pm
@@ -39,6 +39,7 @@
 package GL;
 
 use Data::Dumper;
+use SL::DATEV qw(:CONSTANTS);
 use SL::DBUtils;
 
 use strict;
@@ -50,9 +51,8 @@ sub delete_transaction {
   # connect to database
   my $dbh = $form->dbconnect_noauto($myconfig);
 
-  my @values = (conv_i($form->{id}));
-  do_query($form, $dbh, qq|DELETE FROM acc_trans WHERE trans_id = ?|, @values);
-  do_query($form, $dbh, qq|DELETE FROM gl WHERE id = ?|, @values);
+  # acc_trans entries are deleted by database triggers.
+  do_query($form, $dbh, qq|DELETE FROM gl WHERE id = ?|, conv_i($form->{id}));
 
   # commit and redirect
   my $rc = $dbh->commit;
@@ -184,6 +184,27 @@ sub post_transaction {
     do_query($form, $dbh, qq|UPDATE gl SET storno = 't' WHERE id = ?|, conv_i($form->{storno_id}));
   }
 
+  # safety check datev export
+  if ($::instance_conf->get_datev_check_on_gl_transaction) {
+    my $transdate = $::form->{transdate} ? DateTime->from_lxoffice($::form->{transdate}) : undef;
+    $transdate  ||= DateTime->today;
+
+    my $datev = SL::DATEV->new(
+      exporttype => DATEV_ET_BUCHUNGEN,
+      format     => DATEV_FORMAT_KNE,
+      dbh        => $dbh,
+      from       => $transdate,
+      to         => $transdate,
+    );
+
+    $datev->export;
+
+    if ($datev->errors) {
+      $dbh->rollback;
+      die join "\n", $::locale->text('DATEV check returned errors:'), $datev->errors;
+    }
+  }
+
   # commit and redirect
   my $rc = $dbh->commit;
   $dbh->disconnect;
@@ -231,19 +252,22 @@ sub all_transactions {
     push(@apvalues, '%' . $form->{source} . '%');
   }
 
+  # default Datumseinschränkung falls nicht oder falsch übergeben (sollte nie passieren)
+  $form->{datesort} = 'transdate' unless $form->{datesort} =~ /^(transdate|gldate)$/;
+
   if ($form->{datefrom}) {
-    $glwhere .= " AND ac.transdate >= ?";
-    $arwhere .= " AND ac.transdate >= ?";
-    $apwhere .= " AND ac.transdate >= ?";
+    $glwhere .= " AND ac.$form->{datesort} >= ?";
+    $arwhere .= " AND ac.$form->{datesort} >= ?";
+    $apwhere .= " AND ac.$form->{datesort} >= ?";
     push(@glvalues, $form->{datefrom});
     push(@arvalues, $form->{datefrom});
     push(@apvalues, $form->{datefrom});
   }
 
   if ($form->{dateto}) {
-    $glwhere .= " AND ac.transdate <= ?";
-    $arwhere .= " AND ac.transdate <= ?";
-    $apwhere .= " AND ac.transdate <= ?";
+    $glwhere .= " AND ac.$form->{datesort} <= ?";
+    $arwhere .= " AND ac.$form->{datesort} <= ?";
+    $apwhere .= " AND ac.$form->{datesort} <= ?";
     push(@glvalues, $form->{dateto});
     push(@arvalues, $form->{dateto});
     push(@apvalues, $form->{dateto});
@@ -257,6 +281,17 @@ sub all_transactions {
     push(@arvalues, '%' . $form->{description} . '%');
     push(@apvalues, '%' . $form->{description} . '%');
   }
+  if ($form->{employee} =~ /--/) {
+    ($form->{employee_id},$form->{employee_name}) = split(/--/,$form->{employee});
+  #if ($form->{employee_id}) {
+    $glwhere .= " AND g.employee_id = ? ";
+    $arwhere .= " AND a.employee_id = ? ";
+    $apwhere .= " AND a.employee_id = ? ";
+    push(@glvalues, conv_i($form->{employee_id}));
+    push(@arvalues, conv_i($form->{employee_id}));
+    push(@apvalues, conv_i($form->{employee_id}));
+  }
 
   if ($form->{notes}) {
     $glwhere .= " AND g.notes ILIKE ?";
@@ -268,9 +303,6 @@ sub all_transactions {
   }
 
   if ($form->{accno}) {
-    exit;
-    # Diese Abfrage hatte schon 2005 keinen Sinn mehr, jedenfalls
-    # nicht über FiBu -> Berichte (keine Eingabefeld für Suchkriterium vorhanden)
     $glwhere .= " AND c.accno = '$form->{accno}'";
     $arwhere .= " AND c.accno = '$form->{accno}'";
     $apwhere .= " AND c.accno = '$form->{accno}'";
@@ -315,7 +347,7 @@ sub all_transactions {
         qq|SELECT SUM(ac.amount)
            FROM acc_trans ac
            LEFT JOIN chart c ON (ac.chart_id = c.id)
-           WHERE (c.accno = ?) AND (ac.transdate < ?)|;
+           WHERE (c.accno = ?) AND (ac.$form->{datesort} < ?)|;
       ($form->{balance}) = selectrow_query($form, $dbh, $query, $form->{accno}, conv_date($form->{datefrom}));
     }
   }
@@ -325,6 +357,7 @@ sub all_transactions {
   my %sort_columns =  (
     'id'           => [ qw(id)                   ],
     'transdate'    => [ qw(transdate id)         ],
+    'gldate'       => [ qw(gldate id)         ],
     'reference'    => [ qw(lower_reference id)   ],
     'description'  => [ qw(lower_description id) ],
     'accno'        => [ qw(accno transdate id)   ],
@@ -334,9 +367,10 @@ sub all_transactions {
     'source'          => { 'gl' => 'ac.source',     'arap' => 'ac.source',   },
     'description'     => { 'gl' => 'g.description', 'arap' => 'ct.name',     },
     );
-
+  
+  # sortdir = sort direction (ascending or descending)
   my $sortdir   = !defined $form->{sortdir} ? 'ASC' : $form->{sortdir} ? 'ASC' : 'DESC';
-  my $sortkey   = $sort_columns{$form->{sort}} ? $form->{sort} : 'transdate';
+  my $sortkey   = $sort_columns{$form->{sort}} ? $form->{sort} : $form->{datesort};  # default used to be transdate
   my $sortorder = join ', ', map { "$_ $sortdir" } @{ $sort_columns{$sortkey} };
 
   my %columns_for_sorting = ( 'gl' => '', 'arap' => '', );
@@ -350,11 +384,14 @@ sub all_transactions {
   $query =
     qq|SELECT
         ac.acc_trans_id, g.id, 'gl' AS type, $false AS invoice, g.reference, ac.taxkey, c.link,
-        g.description, ac.transdate, ac.source, ac.trans_id,
-        ac.amount, c.accno, g.notes, t.chart_id
+        g.description, ac.transdate, ac.gldate, ac.source, ac.trans_id,
+        ac.amount, c.accno, g.notes, t.chart_id,
+        CASE WHEN (COALESCE(e.name, '') = '') THEN e.login ELSE e.name END AS employee
         $project_columns
         $columns_for_sorting{gl}
-      FROM gl g, acc_trans ac $project_join, chart c
+      FROM gl g
+      LEFT JOIN employee e ON (g.employee_id = e.id),
+      acc_trans ac $project_join, chart c
       LEFT JOIN tax t ON (t.chart_id = c.id)
       WHERE $glwhere
         AND (ac.chart_id = c.id)
@@ -363,11 +400,14 @@ sub all_transactions {
       UNION
 
       SELECT ac.acc_trans_id, a.id, 'ar' AS type, a.invoice, a.invnumber, ac.taxkey, c.link,
-        ct.name, ac.transdate, ac.source, ac.trans_id,
-        ac.amount, c.accno, a.notes, t.chart_id
+        ct.name, ac.transdate, ac.gldate, ac.source, ac.trans_id,
+        ac.amount, c.accno, a.notes, t.chart_id,
+        CASE WHEN (COALESCE(e.name, '') = '') THEN e.login ELSE e.name END AS employee
         $project_columns
         $columns_for_sorting{arap}
-      FROM ar a, acc_trans ac $project_join, customer ct, chart c
+      FROM ar a
+      LEFT JOIN employee e ON (a.employee_id = e.id),
+      acc_trans ac $project_join, customer ct, chart c
       LEFT JOIN tax t ON (t.chart_id=c.id)
       WHERE $arwhere
         AND (ac.chart_id = c.id)
@@ -377,11 +417,14 @@ sub all_transactions {
       UNION
 
       SELECT ac.acc_trans_id, a.id, 'ap' AS type, a.invoice, a.invnumber, ac.taxkey, c.link,
-        ct.name, ac.transdate, ac.source, ac.trans_id,
-        ac.amount, c.accno, a.notes, t.chart_id
+        ct.name, ac.transdate, ac.gldate, ac.source, ac.trans_id,
+        ac.amount, c.accno, a.notes, t.chart_id,
+        CASE WHEN (COALESCE(e.name, '') = '') THEN e.login ELSE e.name END AS employee
         $project_columns
         $columns_for_sorting{arap}
-      FROM ap a, acc_trans ac $project_join, vendor ct, chart c
+      FROM ap a
+      LEFT JOIN employee e ON (a.employee_id = e.id),
+      acc_trans ac $project_join, vendor ct, chart c
       LEFT JOIN tax t ON (t.chart_id=c.id)
       WHERE $apwhere
         AND (ac.chart_id = c.id)
@@ -389,6 +432,7 @@ sub all_transactions {
         AND (a.id = ac.trans_id)
 
       ORDER BY $sortorder, acc_trans_id $sortdir|;
+#      ORDER BY gldate DESC, id DESC, acc_trans_id DESC
 
   my @values = (@glvalues, @arvalues, @apvalues);
 
@@ -697,7 +741,7 @@ sub storno {
   $storno_row->{storno}    = 't';
   $storno_row->{reference} = 'Storno-' . $storno_row->{reference};
 
-  delete @$storno_row{qw(itime mtime)};
+  delete @$storno_row{qw(itime mtime gldate)};
 
   $query = sprintf 'INSERT INTO gl (%s) VALUES (%s)', join(', ', keys %$storno_row), join(', ', map '?', values %$storno_row);
   do_query($form, $dbh, $query, (values %$storno_row));
@@ -710,7 +754,7 @@ sub storno {
   my $rowref = selectall_hashref_query($form, $dbh, $query, $id);
 
   for my $row (@$rowref) {
-    delete @$row{qw(itime mtime)};
+    delete @$row{qw(itime mtime acc_trans_id gldate)};
     $query = sprintf 'INSERT INTO acc_trans (%s) VALUES (%s)', join(', ', keys %$row), join(', ', map '?', values %$row);
     $row->{trans_id}   = $new_id;
     $row->{amount}    *= -1;