doc/skr04-update-3804 nach DocBook gewandelt
[kivitendo-erp.git] / bin / mozilla / gl.pl
index f5f8460..f4f87cc 100644 (file)
@@ -31,6 +31,9 @@
 #
 #======================================================================
 
+use utf8;
+use strict;
+
 use POSIX qw(strftime);
 use List::Util qw(sum);
 
@@ -44,8 +47,6 @@ require "bin/mozilla/common.pl";
 require "bin/mozilla/drafts.pl";
 require "bin/mozilla/reportgenerator.pl";
 
-use strict;
-
 # this is for our long dates
 # $locale->text('January')
 # $locale->text('February')
@@ -74,10 +75,6 @@ use strict;
 # $locale->text('Nov')
 # $locale->text('Dec')
 
-my $tax;
-my $debitlock  = 0;
-my $creditlock = 0;
-
 sub add {
   $main::lxdebug->enter_sub();
 
@@ -96,12 +93,6 @@ sub add {
   # yep. aber er holt hier auch schon ALL_CHARTS. Aufwand / Nutzen? jb
   GL->transaction(\%myconfig, \%$form);
 
-  map {
-    $tax .=
-      qq|<option value="$_->{id}--$_->{rate}">$_->{taxdescription}  |
-      . ($_->{rate} * 100) . qq| %|
-  } @{ $form->{TAX} };
-
   $form->{rowcount}  = 2;
 
   $form->{debit}  = 0;
@@ -136,12 +127,6 @@ sub prepare_transaction {
 
   GL->transaction(\%myconfig, \%$form);
 
-  map {
-    $tax .=
-      qq|<option value="$_->{id}--$_->{rate}">$_->{taxdescription}  |
-      . ($_->{rate} * 100) . qq| %|
-  } @{ $form->{TAX} };
-
   $form->{amount} = $form->format_amount(\%myconfig, $form->{amount}, 2);
 
   # departments
@@ -226,199 +211,27 @@ sub edit {
 
 
 sub search {
-  $main::lxdebug->enter_sub();
-
-  $main::auth->assert('general_ledger');
-
-  my $form     = $main::form;
-  my %myconfig = %main::myconfig;
-  my $locale   = $main::locale;
-  my $cgi      = $main::cgi;
-
-  $form->{title} = $locale->text('Journal');
-
-  $form->all_departments(\%myconfig);
-
-  # departments
-  if (@{ $form->{all_departments} || [] }) {
-    $form->{selectdepartment} = "<option>\n";
-
-    map {
-      $form->{selectdepartment} .=
-        "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} || [] });
-  }
-
-  my $department = qq|
-        <tr>
-          <th align=right nowrap>| . $locale->text('Department') . qq|</th>
-          <td colspan=3><select name=department>$form->{selectdepartment}</select></td>
-        </tr>
-| if $form->{selectdepartment};
-
-  $form->get_lists("projects" => { "key" => "ALL_PROJECTS",
-                                   "all" => 1 });
-
-  my %project_labels = ();
-  my @project_values = ("");
-  foreach my $item (@{ $form->{"ALL_PROJECTS"} }) {
-    push(@project_values, $item->{"id"});
-    $project_labels{$item->{"id"}} = $item->{"projectnumber"};
-  }
-
-  my $projectnumber =
-    NTI($cgi->popup_menu('-name' => "project_id",
-                         '-values' => \@project_values,
-                         '-labels' => \%project_labels));
-
-  # use JavaScript Calendar or not
-  $form->{jsscript} = 1;
-  my $jsscript = "";
-  my ($button1, $button2, $onload);
-  if ($form->{jsscript}) {
-
-    # with JavaScript Calendar
-    $button1 = qq|
-       <td><input name=datefrom id=datefrom size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
-       <input type=button name=datefrom id="trigger1" value=|
-      . $locale->text('button') . qq|></td>
-       |;
-    $button2 = qq|
-       <td><input name=dateto id=dateto size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\">
-       <input type=button name=dateto id="trigger2" value=|
-      . $locale->text('button') . qq|></td>
-     |;
-
-    #write Trigger
-    $jsscript =
-      Form->write_trigger(\%myconfig, "2", "datefrom", "BR", "trigger1",
-                          "dateto", "BL", "trigger2");
-  } else {
-
-    # without JavaScript Calendar
-    $button1 =
-      qq|<td><input name=datefrom id=datefrom size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\"></td>|;
-    $button2 =
-      qq|<td><input name=dateto id=dateto size=11 title="$myconfig{dateformat}" onBlur=\"check_right_date_format(this)\"></td>|;
-  }
-  $form->{javascript} .= qq|<script type="text/javascript" src="js/common.js"></script>|;
-  $form->header;
-  $onload = qq|focus()|;
-  $onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
-  $onload .= qq|;setupPoints('|. $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
-  print qq|
-<body onLoad="$onload">
+  $::lxdebug->enter_sub;
+  $::auth->assert('general_ledger');
 
-<form method=post action=gl.pl>
-
-<input type=hidden name=sort value=transdate>
-
-<table width=100%>
-  <tr>
-    <th class=listtop>$form->{title}</th>
-  </tr>
-  <tr height="5"></tr>
-  <tr>
-    <td>
-      <table>
-        <tr>
-          <th align=right>| . $locale->text('Reference') . qq|</th>
-          <td><input name=reference size=20></td>
-          <th align=right>| . $locale->text('Source') . qq|</th>
-          <td><input name=source size=20></td>
-        </tr>
-        $department
-        <tr>
-          <th align=right>| . $locale->text('Description') . qq|</th>
-          <td colspan=3><input name=description size=40></td>
-        </tr>
-        <tr>
-          <th align=right>| . $locale->text('Notes') . qq|</th>
-          <td colspan=3><input name=notes size=40></td>
-        </tr>
-        <tr>
-          <th align=right>| . $locale->text('Project Number') . qq|</th>
-          <td colspan=3>$projectnumber</td>
-        </tr>
-        <tr>
-          <th align=right>| . $locale->text('From') . qq|</th>
-          $button1
-          <th align=right>| . $locale->text('To (time)') . qq|</th>
-          $button2
-        </tr>
-        <tr>
-          <th align=right>| . $locale->text('Include in Report') . qq|</th>
-          <td colspan=3>
-            <table>
-              <tr>
-                <td>
-                  <input name="category" class=radio type=radio value=X checked>&nbsp;|
-    . $locale->text('All') . qq|
-                  <input name="category" class=radio type=radio value=A>&nbsp;|
-    . $locale->text('Asset') . qq|
-                  <input name="category" class=radio type=radio value=L>&nbsp;|
-    . $locale->text('Liability') . qq|
-                  <input name="category" class=radio type=radio value=I>&nbsp;|
-    . $locale->text('Revenue') . qq|
-                  <input name="category" class=radio type=radio value=E>&nbsp;|
-    . $locale->text('Expense') . qq|
-                </td>
-              </tr>
-              <tr>
-                <table>
-                  <tr>
-                    <td align=right><input name="l_id" class=checkbox type=checkbox value=Y></td>
-                    <td>| . $locale->text('ID') . qq|</td>
-                    <td align=right><input name="l_transdate" class=checkbox type=checkbox value=Y checked></td>
-                    <td>| . $locale->text('Date') . qq|</td>
-                    <td align=right><input name="l_reference" class=checkbox type=checkbox value=Y checked></td>
-                    <td>| . $locale->text('Reference') . qq|</td>
-                    <td align=right><input name="l_description" class=checkbox type=checkbox value=Y checked></td>
-                    <td>| . $locale->text('Description') . qq|</td>
-                    <td align=right><input name="l_notes" class=checkbox type=checkbox value=Y></td>
-                    <td>| . $locale->text('Notes') . qq|</td>
-                  </tr>
-                  <tr>
-                    <td align=right><input name="l_debit" class=checkbox type=checkbox value=Y checked></td>
-                    <td>| . $locale->text('Debit') . qq|</td>
-                    <td align=right><input name="l_credit" class=checkbox type=checkbox value=Y checked></td>
-                    <td>| . $locale->text('Credit') . qq|</td>
-                    <td align=right><input name="l_source" class=checkbox type=checkbox value=Y checked></td>
-                    <td>| . $locale->text('Source') . qq|</td>
-                    <td align=right><input name="l_accno" class=checkbox type=checkbox value=Y checked></td>
-                    <td>| . $locale->text('Account') . qq|</td>
-                  </tr>
-                  <tr>
-                    <td align=right><input name="l_subtotal" class=checkbox type=checkbox value=Y></td>
-                    <td>| . $locale->text('Subtotal') . qq|</td>
-                    <td align=right><input name="l_projectnumbers" class=checkbox type=checkbox value=Y></td>
-                    <td>| . $locale->text('Project Number') . qq|</td>
-                  </tr>
-                </table>
-              </tr>
-            </table>
-        </tr>
-      </table>
-    </td>
-  </tr>
-  <tr>
-    <td><hr size=3 noshade></td>
-  </tr>
-</table>
-
-$jsscript
+  $::form->all_departments(\%::myconfig);
+  $::form->get_lists(
+    projects  => { key => "ALL_PROJECTS", all => 1 },
+    employees => "ALL_EMPLOYEES",
+  );
 
-<input type=hidden name=nextsub value=generate_report>
+  my $onload = "focus()"
+             . qq|;setupDateFormat('|. $::myconfig{dateformat} . qq|', '| . $::locale->text("Falsches Datumsformat!") . qq|')|
+             . qq|;setupPoints('|. $::myconfig{numberformat} .   qq|', '| . $::locale->text("wrongformat") . qq|')|;
 
-<br>
-<input class=submit type=submit name=action value="|
-    . $locale->text('Continue') . qq|">
-</form>
+  $::form->header;
+  print $::form->parse_html_template('gl/search', {
+    onload => $onload,
+    department_label => sub { ("$_[0]{description}--$_[0]{id}")x2 },
+    employee_label => sub { "$_[0]{id}--$_[0]{name}" },
+  });
 
-</body>
-</html>
-|;
-  $main::lxdebug->leave_sub();
+  $::lxdebug->leave_sub;
 }
 
 sub create_subtotal_row {
@@ -449,7 +262,26 @@ sub generate_report {
   my %myconfig = %main::myconfig;
   my $locale   = $main::locale;
 
-  report_generator_set_default_sort('transdate', 1);
+  # generate_report wird beim ersten Aufruf per Weiter-Knopf und POST mit der hidden Variablen sort mit Wert "datesort" (früher "transdate" als Defaultsortiervariable) übertragen
+
+  # <form method=post action=gl.pl>
+  # <input type=hidden name=sort value=datesort>    # form->{sort} setzen
+  # <input type=hidden name=nextsub value=generate_report>
+
+  # anhand von neuer Variable datesort wird jetzt $form->{sort} auf transdate oder gldate gesetzt
+  # damit ist die Hidden Variable "sort" wahrscheinlich sogar überflüssig
+
+  # ändert man die Sortierreihenfolge per Klick auf eine der Überschriften wird die Variable "sort" per GET übergeben, z.B. id,transdate, gldate, ...
+  # gl.pl?action=generate_report&employee=18383--Jan%20B%c3%bcren&datesort=transdate&category=X&l_transdate=Y&l_gldate=Y&l_id=Y&l_reference=Y&l_description=Y&l_source=Y&l_debit=Y&l_credit=Y&sort=gldate&sortdir=0
+
+  if ( $form->{sort} eq 'datesort' ) {   # sollte bei einem Post (Aufruf aus Suchmaske) immer wahr sein
+      # je nachdem ob in Suchmaske "transdate" oder "gldate" ausgesucht wurde erstes Suchergebnis entsprechend sortieren
+      $form->{sort} = $form->{datesort};
+  };
+
+  # was passiert hier?
+  report_generator_set_default_sort("$form->{datesort}", 1);
+#  report_generator_set_default_sort('transdate', 1);
 
   GL->all_transactions(\%myconfig, \%$form);
 
@@ -470,14 +302,18 @@ sub generate_report {
   my $ml = ($form->{ml} =~ /(A|E|Q)/) ? -1 : 1;
 
   my @columns = qw(
-    transdate      id               reference      description
+    gldate         transdate        id             reference      description
     notes          source           debit          debit_accno
     credit         credit_accno     debit_tax      debit_tax_accno
-    credit_tax     credit_tax_accno projectnumbers balance
+    credit_tax     credit_tax_accno projectnumbers balance employee
   );
 
-  my @hidden_variables = qw(accno source reference department description notes project_id datefrom dateto category l_subtotal);
+  # add employee here, so that variable is still known and passed in url when choosing a different sort order in resulting table
+  my @hidden_variables = qw(accno source reference department description notes project_id datefrom dateto employee datesort category l_subtotal);
   push @hidden_variables, map { "l_${_}" } @columns;
+  foreach ( @hidden_variables ) {
+      print URL "$_\n";
+  };
 
   my (@options, @date_options);
   push @options,      $locale->text('Account')     . " : $form->{accno} $form->{account_description}" if ($form->{accno});
@@ -485,7 +321,9 @@ sub generate_report {
   push @options,      $locale->text('Reference')   . " : $form->{reference}"                          if ($form->{reference});
   push @options,      $locale->text('Description') . " : $form->{description}"                        if ($form->{description});
   push @options,      $locale->text('Notes')       . " : $form->{notes}"                              if ($form->{notes});
-
+  push @options,      $locale->text('Employee')       . " : $form->{employee_name}"                              if ($form->{employee_name});
+  my $datesorttext = $form->{datesort} eq 'transdate' ? $locale->text('Invoice Date') :  $locale->text('Booking Date');
+  push @date_options,      "$datesorttext"                              if ($form->{datesort} and ($form->{datefrom} or $form->{dateto}));
   push @date_options, $locale->text('From'), $locale->date(\%myconfig, $form->{datefrom}, 1)          if ($form->{datefrom});
   push @date_options, $locale->text('Bis'),  $locale->date(\%myconfig, $form->{dateto},   1)          if ($form->{dateto});
   push @options,      join(' ', @date_options)                                                        if (scalar @date_options);
@@ -497,18 +335,23 @@ sub generate_report {
 
 
   my $callback = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables);
+  print URL $callback;
+  close URL;
 
   $form->{l_credit_accno}     = 'Y';
   $form->{l_debit_accno}      = 'Y';
   $form->{l_credit_tax}       = 'Y';
   $form->{l_debit_tax}        = 'Y';
+#  $form->{l_gldate}           = 'Y';  # Spalte mit gldate immer anzeigen
   $form->{l_credit_tax_accno} = 'Y';
+  $form->{l_datesort} = 'Y';
   $form->{l_debit_tax_accno}  = 'Y';
   $form->{l_balance}          = $form->{accno} ? 'Y' : '';
 
   my %column_defs = (
     'id'               => { 'text' => $locale->text('ID'), },
-    'transdate'        => { 'text' => $locale->text('Date'), },
+    'transdate'        => { 'text' => $locale->text('Invoice Date'), },
+    'gldate'           => { 'text' => $locale->text('Booking Date'), },
     'reference'        => { 'text' => $locale->text('Reference'), },
     'source'           => { 'text' => $locale->text('Source'), },
     'description'      => { 'text' => $locale->text('Description'), },
@@ -523,9 +366,10 @@ sub generate_report {
     'credit_tax_accno' => { 'text' => $locale->text('Credit Tax Account'), },
     'balance'          => { 'text' => $locale->text('Balance'), },
     'projectnumbers'   => { 'text' => $locale->text('Project Numbers'), },
+    'employee'         => { 'text' => $locale->text('Employee'), },
   );
 
-  foreach my $name (qw(id transdate reference description debit_accno credit_accno debit_tax_accno credit_tax_accno)) {
+  foreach my $name (qw(id transdate gldate reference description debit_accno credit_accno debit_tax_accno credit_tax_accno)) {
     my $sortname                = $name =~ m/accno/ ? 'accno' : $name;
     my $sortdir                 = $sortname eq $form->{sort} ? 1 - $form->{sortdir} : $form->{sortdir};
     $column_defs{$name}->{link} = $callback . "&sort=$sortname&sortdir=$sortdir";
@@ -536,7 +380,7 @@ sub generate_report {
 
   my %column_alignment;
   map { $column_alignment{$_}     = 'right'  } qw(balance id debit credit debit_tax credit_tax balance);
-  map { $column_alignment{$_}     = 'center' } qw(reference debit_accno credit_accno debit_tax_accno credit_tax_accno);
+  map { $column_alignment{$_}     = 'center' } qw(transdate gldate reference debit_accno credit_accno debit_tax_accno credit_tax_accno);
   map { $column_alignment{$_}     = 'left' } qw(description source notes);
   map { $column_defs{$_}->{align} = $column_alignment{$_} } keys %column_alignment;
 
@@ -555,6 +399,7 @@ sub generate_report {
                        'attachment_basename'  => $locale->text('general_ledger_list') . strftime('_%Y%m%d', localtime time),
     );
   $report->set_options_from_form();
+  $locale->set_numberformat_wo_thousands_separator(\%myconfig) if lc($report->{options}->{output_format}) eq 'csv';
 
   # add sort to callback
   $form->{callback} = "$callback&sort=" . E($form->{sort}) . "&sortdir=" . E($form->{sortdir});
@@ -607,7 +452,7 @@ sub generate_report {
     $row->{balance}->{data}        = $data;
     $row->{projectnumbers}->{data} = join ", ", sort { lc($a) cmp lc($b) } keys %{ $ref->{projectnumbers} };
 
-    map { $row->{$_}->{data} = $ref->{$_} } qw(id reference description notes);
+    map { $row->{$_}->{data} = $ref->{$_} } qw(id reference description notes gldate employee);
 
     map { $row->{$_}->{data} = \@{ $rows{$_} }; } qw(transdate debit credit debit_accno credit_accno debit_tax_accno credit_tax_accno source);
 
@@ -715,19 +560,19 @@ sub update {
         $form->{"credit_$i"} = 0;
         $form->{"tax_$i"}    = 0;
         $creditcount--;
-        $creditlock = 1;
+        $form->{creditlock} = 1;
       }
       if (($creditcount >= 2) && ($debitcount == 2)) {
         $form->{"debit_$i"} = 0;
         $form->{"tax_$i"}   = 0;
         $debitcount--;
-        $debitlock = 1;
+        $form->{debitlock} = 1;
       }
       if (($creditcount == 1) && ($debitcount == 2)) {
-        $creditlock = 1;
+        $form->{creditlock} = 1;
       }
       if (($creditcount == 2) && ($debitcount == 1)) {
-        $debitlock = 1;
+        $form->{debitlock} = 1;
       }
       if ($debitcredit && $credittax) {
         $form->{"taxchart_$i"} = "0--0.00";
@@ -812,7 +657,7 @@ sub display_rows {
 
   my $form     = $main::form;
   my %myconfig = %main::myconfig;
-  my $cgi      = $main::cgi;
+  my $cgi      = $::request->{cgi};
 
   $form->{debit_1}     = 0 if !$form->{"debit_1"};
   $form->{totaldebit}  = 0;
@@ -830,8 +675,8 @@ sub display_rows {
   my %charts = ();
   my $taxchart_init;
   foreach my $item (@{ $form->{ALL_CHARTS} }) {
-    if ($item->{charttype} eq 'H'){ #falls überschrift
-      next;                         #überspringen (Bug 1150)
+    if ($item->{charttype} eq 'H'){ #falls überschrift
+      next;                         #überspringen (Bug 1150)
     }
     my $key = $item->{accno} . "--" . $item->{tax_id};
     $taxchart_init = $item->{tax_id} unless (@chart_values);
@@ -895,7 +740,7 @@ sub display_rows {
       . $cgi->hidden('-name' => "previous_accno_$i",
                      '-default' => $selected_accno_full)
       . qq|</td>|;
-    $tax = qq|<td>| .
+    my $tax_ddbox = qq|<td>| .
       NTI($cgi->popup_menu('-name' => "taxchart_$i",
                            '-id' => "taxchart_$i",
                            '-style' => 'width:200px',
@@ -953,9 +798,9 @@ sub display_rows {
     my $debitreadonly  = "";
     my $creditreadonly = "";
     if ($i == $form->{rowcount}) {
-      if ($debitlock) {
+      if ($form->{debitlock}) {
         $debitreadonly = "readonly";
-      } elsif ($creditlock) {
+      } elsif ($form->{creditlock}) {
         $creditreadonly = "readonly";
       }
     }
@@ -965,8 +810,10 @@ sub display_rows {
                            '-values' => \@project_values,
                            '-labels' => \%project_labels,
                            '-default' => $form->{"project_id_$i"} ));
+    my $projectnumber_hidden = qq|
+    <input type="hidden" name="project_id_$i" value="$form->{"project_id_$i"}">|;
 
-    my $copy2credit = 'onkeyup="copy_debit_to_credit()"' if $i == 1;
+    my $copy2credit = $i == 1 ? 'onkeyup="copy_debit_to_credit()"' : '';
 
     print qq|<tr valign=top>
     $accno
@@ -975,7 +822,7 @@ sub display_rows {
     <td><input name="debit_$i" size="8" value="$form->{"debit_$i"}" accesskey=$i $copy2credit $debitreadonly></td>
     <td><input name="credit_$i" size=8 value="$form->{"credit_$i"}" $creditreadonly></td>
     <td><input type="hidden" name="tax_$i" value="$form->{"tax_$i"}">$form->{"tax_$i"}</td>
-    $tax|;
+    $tax_ddbox|;
 
     if ($form->{show_details}) {
       print qq|
@@ -983,10 +830,14 @@ sub display_rows {
     $memo
     <td>$projectnumber</td>
 |;
-    }
+    } else {
     print qq|
     $source_hidden
     $memo_hidden
+    $projectnumber_hidden
+    |;
+    }
+    print qq|
   </tr>
 |;
   }
@@ -1024,10 +875,9 @@ sub form_header {
   $form->{title} = $locale->text("$title General Ledger Transaction");
   my $readonly   = ($form->{id}) ? "readonly" : "";
 
-  my $show_details_checked = "checked" if $form->{show_details};
-
-  my $ob_transaction_checked = "checked" if $form->{ob_transaction};
-  my $cb_transaction_checked = "checked" if $form->{cb_transaction};
+  my $show_details_checked   = $form->{show_details}   ? "checked" : '';
+  my $ob_transaction_checked = $form->{ob_transaction} ? "checked" : '';
+  my $cb_transaction_checked = $form->{cb_transaction} ? "checked" : '';
 
   # $locale->text('Add General Ledger Transaction')
   # $locale->text('Edit General Ledger Transaction')
@@ -1148,7 +998,14 @@ sub form_header {
 <table width=100%>
   <tr>
     <th class=listtop>$form->{title}</th>
-  </tr>
+  </tr>| .
+
+  ($form->{saved_message} ? qq|
+  <tr>
+    <td>$form->{saved_message}</th>
+  </tr>| : '') .
+
+qq|
   <tr height="5"></tr>
   <tr>
     <td>
@@ -1285,7 +1142,7 @@ sub form_footer {
   my $form     = $main::form;
   my %myconfig = %main::myconfig;
   my $locale   = $main::locale;
-  my $cgi      = $main::cgi;
+  my $cgi      = $::request->{cgi};
 
   my $follow_ups_block;
   if ($form->{id}) {
@@ -1333,7 +1190,7 @@ $follow_ups_block
       print qq|<input class=submit type=submit name=action value="| . $locale->text('Storno') . qq|">|;
     }
 
-    # Löschen und Ändern von Buchungen nicht mehr möglich (GoB) nur am selben Tag möglich
+    # Löschen und Ändern von Buchungen nicht mehr möglich (GoB) nur am selben Tag möglich
     if (!$form->{locked} && $radieren) {
       print qq|
         <input class=submit type=submit name=action value="| . $locale->text('Post') . qq|" accesskey="b">
@@ -1348,7 +1205,7 @@ $follow_ups_block
 
   } else {
     if ($form->{draft_id}) {
-      my $remove_draft_checked = 'checked' if ($form->{remove_draft});
+      my $remove_draft_checked = $form->{remove_draft} ? 'checked' : '';
       print qq|<p>\n|
         . qq|  <input name="remove_draft" id="remove_draft" type="checkbox" class="checkbox" ${remove_draft_checked}>|
         . qq|  <label for="remove_draft">| . $locale->text('Remove Draft') . qq|</label>\n|
@@ -1423,7 +1280,7 @@ sub yes {
       if(!exists $form->{addition} && $form->{id} ne "") {
         $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
         $form->{addition} = "DELETED";
-        $form->save_history($form->dbconnect(\%myconfig));
+        $form->save_history;
       }
     # /saving the history
     $form->redirect($locale->text('Transaction deleted!'))
@@ -1455,6 +1312,7 @@ sub post_transaction {
   my $debitcount  = 0;
   my $creditcount = 0;
   my $debitcredit;
+  my %split_safety = ();
 
   my @flds = qw(accno debit credit projectnumber fx_transaction source memo tax taxchart);
 
@@ -1468,6 +1326,9 @@ sub post_transaction {
     push @a, {};
     $debitcredit = ($form->{"debit_$i"} == 0) ? "0" : "1";
 
+    $split_safety{   $form->{"debit_$i"}  <=> 0 }++;
+    $split_safety{ - $form->{"credit_$i"} <=> 0 }++;
+
     if ($debitcredit) {
       $debitcount++;
     } else {
@@ -1478,19 +1339,19 @@ sub post_transaction {
       $form->{"credit_$i"} = 0;
       $form->{"tax_$i"}    = 0;
       $creditcount--;
-      $creditlock = 1;
+      $form->{creditlock} = 1;
     }
     if (($creditcount >= 2) && ($debitcount == 2)) {
       $form->{"debit_$i"} = 0;
       $form->{"tax_$i"}   = 0;
       $debitcount--;
-      $debitlock = 1;
+      $form->{debitlock} = 1;
     }
     if (($creditcount == 1) && ($debitcount == 2)) {
-      $creditlock = 1;
+      $form->{creditlock} = 1;
     }
     if (($creditcount == 2) && ($debitcount == 1)) {
-      $debitlock = 1;
+      $form->{debitlock} = 1;
     }
     if ($debitcredit && $credittax) {
       $form->{"taxchart_$i"} = "0--0.00";
@@ -1531,6 +1392,10 @@ sub post_transaction {
     $count++;
   }
 
+  if ($split_safety{-1} > 1 && $split_safety{1} > 1) {
+    $::form->error($::locale->text("Split entry detected. The values you have entered will result in an entry with more than one position on both debit and credit. Due to known problems involving accounting software Lx-Office does not allow these."));
+  }
+
   for my $i (1 .. $count) {
     my $j = $i - 1;
     for (@flds) { $form->{"${_}_$i"} = $a[$j]->{$_} }
@@ -1544,7 +1409,7 @@ sub post_transaction {
   for my $i (1 .. $form->{rowcount}) {
     my $dr  = $form->{"debit_$i"};
     my $cr  = $form->{"credit_$i"};
-    $tax = $form->{"tax_$i"};
+    my $tax = $form->{"tax_$i"};
     if ($dr && $cr) {
       $form->error($locale->text('Cannot post transaction with a debit and credit entry for the same account!'));
     }
@@ -1581,7 +1446,7 @@ sub post_transaction {
     $form->{snumbers} = qq|ordnumber_| . $form->{ordnumber};
     $form->{addition} = "SAVED";
     $form->{what_done} = $locale->text("Buchungsnummer") . " = " . $form->{id};
-    $form->save_history($form->dbconnect(\%myconfig));
+    $form->save_history;
   }
   # /saving the history
 
@@ -1596,6 +1461,12 @@ sub post {
   my $form     = $main::form;
   my $locale   = $main::locale;
 
+  if ($::myconfig{mandatory_departments} && !$form->{department}) {
+    $form->{saved_message} = $::locale->text('You have to specify a department.');
+    update();
+    exit;
+  }
+
   $form->{title}  = $locale->text("$form->{title} General Ledger Transaction");
   $form->{storno} = 0;
 
@@ -1603,7 +1474,7 @@ sub post {
 
   remove_draft() if $form->{remove_draft};
 
-  $form->{callback} = build_std_url("action=add", "show_details");
+  $form->{callback} = build_std_url("action=add&DONT_LOAD_DRAFT=1", "show_details");
   $form->redirect($form->{callback});
 
   $main::lxdebug->leave_sub();
@@ -1643,7 +1514,7 @@ sub storno {
   if(!exists $form->{addition} && $form->{id} ne "") {
     $form->{snumbers} = "ordnumber_$form->{ordnumber}";
     $form->{addition} = "STORNO";
-    $form->save_history($form->dbconnect(\%myconfig));
+    $form->save_history;
   }
   # /saving the history