]> wagnertech.de Git - kivitendo-erp.git/commitdiff
Verkaufsrechnungstemplates
authorSven Schöling <s.schoeling@linet-services.de>
Fri, 6 Nov 2009 11:57:29 +0000 (12:57 +0100)
committerSven Schöling <s.schoeling@linet-services.de>
Fri, 6 Nov 2009 11:57:29 +0000 (12:57 +0100)
Merge branch 'is_template'

Conflicts:

bin/mozilla/is.pl

29 files changed:
SL/AP.pm
SL/AR.pm
SL/CT.pm
SL/DN.pm
SL/Form.pm
SL/IO.pm
SL/IR.pm
SL/IS.pm
SL/Menu.pm
SL/MoreCommon.pm
SL/RecordLinks.pm
bin/mozilla/ap.pl
bin/mozilla/ar.pl
bin/mozilla/bp.pl
bin/mozilla/ca.pl
bin/mozilla/common.pl
bin/mozilla/cp.pl
bin/mozilla/dn.pl
bin/mozilla/do.pl
bin/mozilla/gl.pl
bin/mozilla/ir.pl
bin/mozilla/menu.pl
bin/mozilla/oe.pl
bin/mozilla/rp.pl
doc/changelog
locale/de/dn
locale/en/dn
sql/Pg-upgrade2/fix_datepaid.sql [new file with mode: 0644]
templates/webpages/dunning/search_de.html

index 7b5a461505774eb22d762d7f5cfee586fdbdab42..aaf2d5e6e4293ed5b25c393b72e0119ea1478659 100644 (file)
--- a/SL/AP.pm
+++ b/SL/AP.pm
 package AP;
 
 use SL::DBUtils;
+use SL::IO;
 use SL::MoreCommon;
 
+use Data::Dumper;
+
 use strict;
 
 sub post_transaction {
@@ -67,7 +70,7 @@ sub post_transaction {
       (split(/--/, $form->{"AP_amount_$i"}))[0];
   }
   ($form->{AP_amounts}{payables}) = split(/--/, $form->{APselected});
-  ($form->{AP}{payables})         = split(/--/, $form->{APselected});
+  ($form->{AP_payables})          = split(/--/, $form->{APselected});
 
   # reverse and parse amounts
   for my $i (1 .. $form->{rowcount}) {
@@ -155,9 +158,6 @@ sub post_transaction {
   # amount for total AP
   $form->{payables} = $form->{invtotal};
 
-  $form->{datepaid} = $form->{transdate} unless ($form->{datepaid});
-  my $datepaid = ($form->{invpaid} != 0) ? $form->{datepaid} : undef;
-
   # update exchangerate
   if (($form->{currency} ne $form->{defaultcurrency}) && !$exchangerate) {
     $form->update_exchangerate($dbh, $form->{currency}, $form->{transdate}, 0,
@@ -195,14 +195,14 @@ sub post_transaction {
 
     $query = qq|UPDATE ap SET
                 invnumber = ?, transdate = ?, ordnumber = ?, vendor_id = ?, taxincluded = ?,
-                amount = ?, duedate = ?, paid = ?, datepaid = ?, netamount = ?,
+                amount = ?, duedate = ?, paid = ?, netamount = ?,
                 curr = ?, notes = ?, department_id = ?, storno = ?, storno_id = ?
                WHERE id = ?|;
     @values = ($form->{invnumber}, conv_date($form->{transdate}),
                   $form->{ordnumber}, conv_i($form->{vendor_id}),
                   $form->{taxincluded} ? 't' : 'f', $form->{invtotal},
                   conv_date($form->{duedate}), $form->{invpaid},
-                  conv_date($datepaid), $form->{netamount},
+                  $form->{netamount},
                   $form->{currency}, $form->{notes},
                   conv_i($form->{department_id}), $form->{storno},
                   $form->{storno_id}, $form->{id});
@@ -272,7 +272,7 @@ sub post_transaction {
 
       # get paid account
 
-      ($form->{AP}{"paid_$i"}) = split(/--/, $form->{"AP_paid_$i"});
+      ($form->{"AP_paid_account_$i"}) = split(/--/, $form->{"AP_paid_$i"});
       $form->{"datepaid_$i"} = $form->{transdate}
         unless ($form->{"datepaid_$i"});
 
@@ -289,9 +289,9 @@ sub post_transaction {
           qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, project_id, taxkey) | .
           qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, | .
           qq|        (SELECT taxkey_id FROM chart WHERE accno = ?))|;
-        @values = ($form->{id}, $form->{AP}{payables}, $amount,
+        @values = ($form->{id}, $form->{AP_payables}, $amount,
                    conv_date($form->{"datepaid_$i"}), $project_id,
-                   $form->{AP}{payables});
+                   $form->{AP_payables});
         do_query($form, $dbh, $query, @values);
       }
       $form->{payables} = $amount;
@@ -301,9 +301,9 @@ sub post_transaction {
         qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, source, memo, project_id, taxkey) | .
         qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, ?, ?, ?, | .
         qq|        (SELECT taxkey_id FROM chart WHERE accno = ?))|;
-      @values = ($form->{id}, $form->{AP}{"paid_$i"}, $form->{"paid_$i"},
+      @values = ($form->{id}, $form->{"AP_paid_account_$i"}, $form->{"paid_$i"},
                  conv_date($form->{"datepaid_$i"}), $form->{"source_$i"},
-                 $form->{"memo_$i"}, $project_id, $form->{AP}{"paid_$i"});
+                 $form->{"memo_$i"}, $project_id, $form->{"AP_paid_account_$i"});
       do_query($form, $dbh, $query, @values);
 
       # add exchange rate difference
@@ -315,9 +315,9 @@ sub post_transaction {
           qq|INSERT INTO acc_trans (trans_id, chart_id, amount, transdate, fx_transaction, cleared, project_id, taxkey) | .
           qq|VALUES (?, (SELECT id FROM chart WHERE accno = ?), ?, ?, 't', 'f', ?, | .
           qq|        (SELECT taxkey_id FROM chart WHERE accno = ?))|;
-        @values = ($form->{id}, $form->{AP}{"paid_$i"}, $amount,
+        @values = ($form->{id}, $form->{"AP_paid_account_$i"}, $amount,
                    conv_date($form->{"datepaid_$i"}), $project_id,
-                   $form->{AP}{"paid_$i"});
+                   $form->{"AP_paid_account_$i"});
         do_query($form, $dbh, $query, @values);
       }
 
@@ -354,6 +354,8 @@ sub post_transaction {
     do_query($form, $dbh, $query,  $form->{invpaid}, $form->{invpaid} ? conv_date($form->{datepaid}) : undef, conv_i($form->{id}));
   }
 
+  IO->set_datepaid(table => 'ap', id => $form->{id}, dbh => $dbh);
+
   my $rc = 1;
   if (!$provided_dbh) {
     $dbh->commit();
@@ -786,6 +788,8 @@ sub storno {
     do_query($form, $dbh, $query, (values %$row));
   }
 
+  map { IO->set_datepaid(table => 'ap', id => $_, dbh => $dbh) } ($id, $new_id);
+
   $dbh->commit;
 
   $main::lxdebug->leave_sub();
index b48741d34088c9946f127e028df1a6988d4084f4..7d037838cf10ae9258bd0dd062133f6e51a2360e 100644 (file)
--- a/SL/AR.pm
+++ b/SL/AR.pm
@@ -36,6 +36,7 @@ package AR;
 
 use Data::Dumper;
 use SL::DBUtils;
+use SL::IO;
 use SL::MoreCommon;
 
 use strict;
@@ -141,10 +142,6 @@ sub post_transaction {
   ($null, $form->{department_id}) = split(/--/, $form->{department});
   $form->{department_id} *= 1;
 
-  # record last payment date in ar table
-  $form->{datepaid} ||= $form->{transdate} ;
-  my $datepaid = ($form->{paid} != 0) ? $form->{datepaid} : undef;
-
   # amount for AR account
   $form->{receivables} = $form->round_amount($form->{amount}, 2) * -1;
 
@@ -156,12 +153,12 @@ sub post_transaction {
     $query =
       qq|UPDATE ar set
            invnumber = ?, ordnumber = ?, transdate = ?, customer_id = ?,
-           taxincluded = ?, amount = ?, duedate = ?, paid = ?, datepaid = ?,
+           taxincluded = ?, amount = ?, duedate = ?, paid = ?,
            netamount = ?, curr = ?, notes = ?, department_id = ?,
            employee_id = ?, storno = ?, storno_id = ?
          WHERE id = ?|;
     my @values = ($form->{invnumber}, $form->{ordnumber}, conv_date($form->{transdate}), conv_i($form->{customer_id}), $form->{taxincluded} ? 't' : 'f', $form->{amount},
-                  conv_date($form->{duedate}), $form->{paid}, conv_date($datepaid), $form->{netamount}, $form->{currency}, $form->{notes}, conv_i($form->{department_id}),
+                  conv_date($form->{duedate}), $form->{paid}, $form->{netamount}, $form->{currency}, $form->{notes}, conv_i($form->{department_id}),
                   conv_i($form->{employee_id}), $form->{storno} ? 't' : 'f', $form->{storno_id}, conv_i($form->{id}));
     do_query($form, $dbh, $query, @values);
 
@@ -266,6 +263,8 @@ sub post_transaction {
     }
   }
 
+  IO->set_datepaid(table => 'ar', id => $form->{id}, dbh => $dbh);
+
   my $rc = 1;
   if (!$provided_dbh) {
     $rc = $dbh->commit();
@@ -673,6 +672,8 @@ sub storno {
     do_query($form, $dbh, $query, (values %$row));
   }
 
+  map { IO->set_datepaid(table => 'ap', id => $_, dbh => $dbh) } ($id, $new_id);
+
   $dbh->commit;
 
   $main::lxdebug->leave_sub();
index 12df265d825d76d9a3f83654fc79b49551af5918..1b9d91593e6b93cd03d099e784795f27be376a98 100644 (file)
--- a/SL/CT.pm
+++ b/SL/CT.pm
@@ -1071,7 +1071,7 @@ sub get_bank_info {
 
   my $table        = $params{vc} eq 'customer' ? 'customer' : 'vendor';
   my @ids          = ref $params{id} eq 'ARRAY' ? @{ $params{id} } : ($params{id});
-  my $placeholders = ('?') x scalar @ids;
+  my $placeholders = join ", ", ('?') x scalar @ids;
   my $query        = qq|SELECT id, name, account_number, bank, bank_code, iban, bic
                         FROM ${table}
                         WHERE id IN (${placeholders})|;
index e1a634202946aedf4503031fb5abdbcaffdf5642..0ac071c6f93d6c6d9ece8df12063b360df31ca7d 100644 (file)
--- a/SL/DN.pm
+++ b/SL/DN.pm
@@ -618,9 +618,11 @@ sub get_dunning {
     qq|SELECT a.id, a.ordnumber, a.invoice, a.transdate, a.invnumber, a.amount,
          ct.name AS customername, ct.id AS customer_id, a.duedate, da.fee,
          da.interest, dn.dunning_description, da.transdate AS dunning_date,
-         da.duedate AS dunning_duedate, da.dunning_id, da.dunning_config_id
+         da.duedate AS dunning_duedate, da.dunning_id, da.dunning_config_id,
+         e2.name AS salesman
        FROM ar a
-       JOIN customer ct ON (a.customer_id = ct.id), dunning da
+       JOIN customer ct ON (a.customer_id = ct.id)
+       LEFT JOIN employee e2 ON (a.salesman_id = e2.id), dunning da
        LEFT JOIN dunning_config dn ON (da.dunning_config_id = dn.id)
        $where
        ORDER BY $sortorder|;
index 17273ec5023ad76358e6064dec30bc8027ae06b2..579b1ef65cdfbbf8faf669c58811d91fa0ea68d5 100644 (file)
@@ -630,6 +630,8 @@ sub create_http_response {
 sub header {
   $main::lxdebug->enter_sub();
 
+  # extra code ist currently only used by menuv3 and menuv4 to set their css.
+  # it is strongly deprecated, and will be changed in a future version.
   my ($self, $extra_code) = @_;
 
   if ($self->{header}) {
@@ -2738,7 +2740,7 @@ sub all_departments {
                  ORDER BY description|;
   $self->{all_departments} = selectall_hashref_query($self, $dbh, $query);
 
-  delete($self->{all_departments}) unless (@{ $self->{all_departments} });
+  delete($self->{all_departments}) unless (@{ $self->{all_departments} || [] });
 
   $main::lxdebug->leave_sub();
 }
index 814a452dca3d0dc5fbc0e0ced1726dcd26b7835f..b840e458cae134455ff9f6b81fb5dd1c661ae9a8 100644 (file)
--- a/SL/IO.pm
+++ b/SL/IO.pm
@@ -1,5 +1,8 @@
 package IO;
 
+use List::Util qw(first);
+use List::MoreUtils qw(any);
+
 use SL::DBUtils;
 
 use strict;
@@ -26,4 +29,50 @@ sub retrieve_partunits {
 }
 
 
+sub set_datepaid {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, qw(id table));
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
+  my $id       = conv_i($params{id});
+  my $table    = (any { $_ eq $params{table} } qw(ar ap gl)) ? $params{table} : 'ar';
+
+  my ($curr_datepaid, $curr_paid) = selectfirst_array_query($form, $dbh, qq|SELECT datepaid, paid FROM $table WHERE id = ?|, $id);
+
+  my $query    = <<SQL;
+    SELECT MAX(at.transdate)
+    FROM acc_trans at
+    LEFT JOIN chart c ON (at.chart_id = c.id)
+    WHERE (at.trans_id = ?)
+      AND (c.link LIKE '%paid%')
+SQL
+
+  my ($max_acc_trans_date) = selectfirst_array_query($form, $dbh, $query, $id);
+
+  if ($max_acc_trans_date && ($max_acc_trans_date ne $curr_datepaid)) {
+    # 1. Fall: Es gab mindestens eine Zahlung, und das Datum der Zahlung entspricht nicht
+    # dem vermerkten Zahlungsdatum.
+    do_query($form, $dbh, qq|UPDATE $table SET datepaid = ? WHERE id = ?|, $max_acc_trans_date, $id);
+
+  } elsif (!$max_acc_trans_date && ($curr_paid * 1)) {
+    # 2. Fall: Es gab keine Zahlung, aber paid ist nicht 0. Das ist z.B. der Fall, wenn
+    # die Funktion "als bezahlt buchen" verwendet oder wenn ein Beleg storniert wird.
+    # In diesem Fall das letzte Modifikationsdatum als Bezahldatum nehmen, oder aber das
+    # Erstelldatum, wenn keine Modifikation erfolgt ist (bei Stornos z.B.).
+    do_query($form, $dbh, qq|UPDATE $table SET datepaid = COALESCE(mtime::date, itime::date) WHERE id = ?|, $id);
+  }
+
+  $dbh->commit() unless $params{dbh};
+
+  $main::lxdebug->leave_sub();
+}
+
+
 1;
index ab515b21a2832e25edb419990a4031760dc50fbd..7e24d4e011564c270c5da7a5f8cd26bb8a067e00 100644 (file)
--- a/SL/IR.pm
+++ b/SL/IR.pm
@@ -41,6 +41,7 @@ use SL::CVar;
 use SL::DBUtils;
 use SL::DO;
 use SL::GenericTranslations;
+use SL::IO;
 use SL::MoreCommon;
 use List::Util qw(min);
 
@@ -141,9 +142,6 @@ sub post_invoice {
     # ansonsten stolpert man immer wieder viermal statt einmal heftig
     # und auch das undo discount formatting ist nicht besonders wartungsfreundlich
 
-    # keep entered selling price
-    $fxsellprice = $form->parse_amount($myconfig, $form->{"sellprice_$i"});
-
     # keine ahnung wofür das in IS.pm gemacht wird:
     #      my ($dec) = ($fxsellprice =~ /\.(\d+)/);
     #  $dec = length $dec;
@@ -510,9 +508,11 @@ sub post_invoice {
     }
   }
 
+  IO->set_datepaid(table => 'ap', id => $form->{id}, dbh => $dbh);
+
   if ($payments_only) {
-    $query = qq|UPDATE ap SET paid = ?, datepaid = ? WHERE id = ?|;
-    do_query($form, $dbh, $query,  $form->{paid}, $form->{paid} ? conv_date($form->{datepaid}) : undef, conv_i($form->{id}));
+    $query = qq|UPDATE ap SET paid = ? WHERE id = ?|;
+    do_query($form, $dbh, $query, $form->{paid}, conv_i($form->{id}));
 
     if (!$provided_dbh) {
       $dbh->commit();
@@ -536,7 +536,7 @@ sub post_invoice {
   $query = qq|UPDATE ap SET
                 invnumber    = ?, ordnumber   = ?, quonumber     = ?, transdate   = ?,
                 orddate      = ?, quodate     = ?, vendor_id     = ?, amount      = ?,
-                netamount    = ?, paid        = ?, duedate       = ?, datepaid    = ?,
+                netamount    = ?, paid        = ?, duedate       = ?,
                 invoice      = ?, taxzone_id  = ?, notes         = ?, taxincluded = ?,
                 intnotes     = ?, curr        = ?, storno_id     = ?, storno      = ?,
                 cp_id        = ?, employee_id = ?, department_id = ?,
@@ -545,7 +545,7 @@ sub post_invoice {
   @values = (
                 $form->{invnumber},          $form->{ordnumber},           $form->{quonumber},      conv_date($form->{invdate}),
       conv_date($form->{orddate}), conv_date($form->{quodate}),     conv_i($form->{vendor_id}),               $amount,
-                $netamount,                  $form->{paid},      conv_date($form->{duedate}),       $form->{paid} ? conv_date($form->{datepaid}) : undef,
+                $netamount,                  $form->{paid},      conv_date($form->{duedate}),
             '1',                             $taxzone_id,                  $form->{notes},          $form->{taxincluded} ? 't' : 'f',
                 $form->{intnotes},           $form->{currency},     conv_i($form->{storno_id}),     $form->{storno}      ? 't' : 'f',
          conv_i($form->{cp_id}),      conv_i($form->{employee_id}), conv_i($form->{department_id}),
index e17efc6e6da991880d9056b1c6a3eb00682d2b55..7c923b0dd4b7461e6559e26cbec3c45623e13b1b 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -45,6 +45,7 @@ use SL::DO;
 use SL::GenericTranslations;
 use SL::MoreCommon;
 use SL::IC;
+use SL::IO;
 use Data::Dumper;
 
 use strict;
@@ -948,9 +949,11 @@ sub post_invoice {
     $form->{marge_total} *= -1;
   }
 
+  IO->set_datepaid(table => 'ar', id => $form->{id}, dbh => $dbh);
+
   if ($payments_only) {
-    $query = qq|UPDATE ar SET paid = ?, datepaid = ? WHERE id = ?|;
-    do_query($form, $dbh, $query,  $form->{paid}, $form->{paid} ? conv_date($form->{datepaid}) : undef, conv_i($form->{id}));
+    $query = qq|UPDATE ar SET paid = ? WHERE id = ?|;
+    do_query($form, $dbh, $query,  $form->{paid}, conv_i($form->{id}));
 
     if (!$provided_dbh) {
       $dbh->commit();
@@ -988,7 +991,7 @@ sub post_invoice {
   $query = qq|UPDATE ar set
                 invnumber   = ?, ordnumber     = ?, quonumber     = ?, cusordnumber  = ?,
                 transdate   = ?, orddate       = ?, quodate       = ?, customer_id   = ?,
-                amount      = ?, netamount     = ?, paid          = ?, datepaid      = ?,
+                amount      = ?, netamount     = ?, paid          = ?,
                 duedate     = ?, deliverydate  = ?, invoice       = ?, shippingpoint = ?,
                 shipvia     = ?, terms         = ?, notes         = ?, intnotes      = ?,
                 curr        = ?, department_id = ?, payment_id    = ?, taxincluded   = ?,
@@ -997,11 +1000,11 @@ sub post_invoice {
                 cp_id       = ?, marge_total   = ?, marge_percent = ?,
                 globalproject_id               = ?, delivery_customer_id             = ?,
                 transaction_description        = ?, delivery_vendor_id               = ?,
-               donumber    = ?
+                donumber    = ?
               WHERE id = ?|;
   @values = (          $form->{"invnumber"},           $form->{"ordnumber"},             $form->{"quonumber"},          $form->{"cusordnumber"},
              conv_date($form->{"invdate"}),  conv_date($form->{"orddate"}),    conv_date($form->{"quodate"}),    conv_i($form->{"customer_id"}),
-                       $amount,                        $netamount,                       $form->{"paid"},     conv_date($form->{"datepaid"}),
+                       $amount,                        $netamount,                       $form->{"paid"},
              conv_date($form->{"duedate"}),  conv_date($form->{"deliverydate"}),    '1',                                $form->{"shippingpoint"},
                        $form->{"shipvia"},      conv_i($form->{"terms"}),                $form->{"notes"},              $form->{"intnotes"},
                        $form->{"currency"},     conv_i($form->{"department_id"}), conv_i($form->{"payment_id"}),        $form->{"taxincluded"} ? 't' : 'f',
@@ -1010,7 +1013,7 @@ sub post_invoice {
                 conv_i($form->{"cp_id"}),            1 * $form->{marge_total} ,      1 * $form->{marge_percent},
                 conv_i($form->{"globalproject_id"}),                              conv_i($form->{"delivery_customer_id"}),
                        $form->{transaction_description},                          conv_i($form->{"delivery_vendor_id"}),
-                      $form->{"donumber"}, #das entsprechende feld lieferscheinnummer aus der html-form 12.02.09 jb
+                       $form->{"donumber"}, #das entsprechende feld lieferscheinnummer aus der html-form 12.02.09 jb
                 conv_i($form->{"id"}));
   do_query($form, $dbh, $query, @values);
 
index 9fcf15374eb3babffd34ac5d408db0b7d28b4269..9dfb8519051b10e69e999b9926d5f2737d975e60 100644 (file)
@@ -63,46 +63,35 @@ sub menuitem {
 
   my ($self, $myconfig, $form, $item) = @_;
 
-  my $module = $form->{script};
-  my $action = "section_menu";
-  my $target = "";
+  my $module = $self->{$item}{module} || $form->{script};
+  my $action = $self->{$item}{action} || "section_menu";
+  my $target = $self->{$item}{target} || "";
 
-  if ($self->{$item}{module}) {
-    $module = $self->{$item}{module};
-  }
-  if ($self->{$item}{action}) {
-    $action = $self->{$item}{action};
-  }
-  if ($self->{$item}{target}) {
-    $target = $self->{$item}{target};
-  }
+  my $level  = $form->escape($item);
 
-  my $level = $form->escape($item);
+  my $style  = 'style="vertical-align:top"';
+  my $target_token = ($target)
+     ? "target='$target'" : '';
 
-  my $str = qq|<a style="vertical-align:top" href=$module?action=$action&level=$level|;
+  my $href = ($self->{$item}{href})
+           ? $form->escape($self->{$item}{href})
+           : "$module?action=$action&amp;level=$level";
 
-  my @vars = qw(module action target href);
-
-  if ($self->{$item}{href}) {
-    $str  = qq|<a href=$self->{$item}{href}|;
-    @vars = qw(module target href);
-  }
+  my @vars = ($self->{$item}{href})
+           ? qw(module        target href)
+           : qw(module action target href);
 
   map { delete $self->{$item}{$_} } @vars;
 
   # add other params
   foreach my $key (keys %{ $self->{$item} }) {
-    $str .= "&" . $form->escape($key, 1) . "=";
+    $href .= "&amp;" . $form->escape($key, 1) . "=";
     my ($value, $conf) = split(/=/, $self->{$item}{$key}, 2);
     $value = $myconfig->{$value} . "/$conf" if ($conf);
-    $str .= $form->escape($value, 1);
-  }
-
-  if ($target) {
-    $str .= qq| target=$target|;
+    $href .= $form->escape($value, 1);
   }
 
-  $str .= ">";
+  my $str = "<a href='$href' $target_token $style>";
 
   $main::lxdebug->leave_sub();
 
index 48eef0cf93eca60a4a6b62f28c2aa93c88b25394..e93dd172e155d9a64834157e65bd6d7a0bf06468 100644 (file)
@@ -165,6 +165,5 @@ sub listify {
   my @ary = scalar @_ > 1 ? @_ : ref $_[0] eq 'ARRAY' ? @{ $_[0] } : (@_);
   return wantarray ? @ary : scalar @ary;
 }
-+
 
 1;
index 09fd642c1b55e82ca0a278ad51ceca1643dd8974..ae61edd349b12c51c5bf90ffdf90ce03d37c4c58 100644 (file)
@@ -203,3 +203,82 @@ sub delete {
 }
 
 1;
+
+__END__
+
+=head1 NAME
+
+SL::RecordLinks - Verlinkung von Lx-Office Objekten.
+
+=head1 SYNOPSIS
+
+  use SL::RecordLinks;
+
+  my @links = RecordLinks->get_links(
+    from_table => 'ar',
+    from_id    => 2,
+    to_table   => 'oe',
+  );
+  my @links = RecordLinks->get_links_via(
+    from_table => 'oe',
+    to_id      => '14',
+    via        => [
+      { id => 12 },
+      { id => 13},
+    ],
+  );
+
+  RecordLinks->create_links(
+    mode       => 'ids',
+    from_table => 'ar',
+    from_id    => 1,
+    to_table   => 'oe',
+    to_ids     => [4, 6, 9],
+  )
+  RecordLinks->create_links(@links);
+
+  delete
+
+=head1 DESCRIPTION
+
+=over 4
+
+Transitive RecordLinks mit get_links_via.
+
+get_links_via erwartet den zusätzlichen parameter via. via ist ein
+hashref mit den jeweils optionalen Einträgen table und id, die sich
+genauso verhalten wie die from/to_table/id werte der get_links funktion.
+
+Alternativ kann via auch ein Array dieser Hashes sein:
+
+  get_links_via(
+    from_table => 'oe',
+    from_id    => 1,
+    to_table   => 'ar',
+    via        => {
+      table      => 'delivery_orders'
+    },
+  )
+
+  get_links_via(
+    from_table => 'oe',
+    to_id      => '14',
+    via        => [
+      { id => 12 },
+      { id => 13},
+    ],
+  )
+
+Die Einträge in einem via-Array werden exakt in dieser Reihenfolge
+benutzt und sind nicht optional. Da obige Beispiel würde also die
+Verknüpfung:
+
+  oe:11 -> ar:12 -> is:13 -> do:14
+
+finden, nicht aber:
+
+  oe:11 -> ar:13 -> do:14
+
+=back
+
+=cut
index 97f2dbad9480ecc449eaafd292a5b1f33e266f2a..551b0ee106f122a20a6faa1c34218b4d293388e0 100644 (file)
@@ -163,21 +163,21 @@ sub create_links {
   map { $form->{selectcurrency} .= "<option>$_\n" } @curr;
 
   # vendors
-  if (@{ $form->{all_vendor} }) {
+  if (@{ $form->{all_vendor} || [] }) {
     $form->{vendor} = qq|$form->{vendor}--$form->{vendor_id}|;
     map { $form->{selectvendor} .= "<option>$_->{name}--$_->{id}\n" }
       (@{ $form->{all_vendor} });
   }
 
   # departments
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
     $form->{department}       = "$form->{department}--$form->{department_id}";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   $form->{employee} = "$form->{employee}--$form->{employee_id}";
@@ -1070,8 +1070,8 @@ sub post {
   my ($debitaccno,    $debittaxkey)    = split /--/, $form->{AP_amountselected};
   my ($taxkey,        $NULL)           = split /--/, $form->{taxchartselected};
   my ($payablesaccno, $payablestaxkey) = split /--/, $form->{APselected};
-  $form->{AP}{amount_1} = $debitaccno;
-  $form->{AP}{payables} = $payablesaccno;
+  $form->{AP_amount_1}  = $debitaccno;
+  $form->{AP_payables}  = $payablesaccno;
   $form->{taxkey}       = $taxkey;
   $form->{storno}       = 0;
 
@@ -1213,7 +1213,7 @@ sub search {
   $form->all_vc(\%myconfig, "vendor", "AP");
 
   my $vendor;
-  if (@{ $form->{all_vendor} }) {
+  if (@{ $form->{all_vendor} || [] }) {
     map { $vendor .= "<option>$_->{name}--$_->{id}\n" }
       @{ $form->{all_vendor} };
     $vendor = qq|<select name=vendor><option>\n$vendor\n</select>|;
@@ -1222,13 +1222,13 @@ sub search {
   }
 
   # departments
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   my $department = qq|
index a8937506f6356b0626e3ad20e142f39ee57b9aff..2094ead3ac34c7bce7ca99ec54a91d92392667e0 100644 (file)
@@ -173,30 +173,30 @@ sub create_links {
   map { $form->{selectcurrency} .= "<option>$_\n" } @curr;
 
   # customers
-  if (@{ $form->{all_customer} }) {
+  if (@{ $form->{all_customer} || [] }) {
     $form->{customer} = "$form->{customer}--$form->{customer_id}";
     map { $form->{selectcustomer} .= "<option>$_->{name}--$_->{id}\n" }
       (@{ $form->{all_customer} });
   }
 
   # departments
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
     $form->{department}       = "$form->{department}--$form->{department_id}";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   $form->{employee} = "$form->{employee}--$form->{employee_id}";
 
   # sales staff
-  if (@{ $form->{all_employees} }) {
+  if (@{ $form->{all_employees} || [] }) {
     $form->{selectemployee} = "";
     map { $form->{selectemployee} .= "<option>$_->{name}--$_->{id}\n" }
-      (@{ $form->{all_employees} });
+      (@{ $form->{all_employees} || [] });
   }
 
   # build the popup menus
@@ -1269,7 +1269,7 @@ sub search {
   # setup customer selection
   $form->all_vc(\%myconfig, "customer", "AR");
 
-  if (@{ $form->{all_customer} }) {
+  if (@{ $form->{all_customer} || [] }) {
     map { $customer .= "<option>$_->{name}--$_->{id}\n" }
       @{ $form->{all_customer} };
     $customer = qq|<select name=customer><option>\n$customer</select>|;
@@ -1278,13 +1278,13 @@ sub search {
   }
 
   # departments
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   $department = qq|
index 10acafdaa079005eb069856c80df4b768f83835f..421667da8415ee051db202ea6f68c6f62bdfe8c9 100644 (file)
@@ -95,7 +95,7 @@ sub search {
   # setup customer/vendor selection
   BP->get_vc(\%myconfig, \%$form);
 
-  if (@{ $form->{"all_$form->{vc}"} }) {
+  if (@{ $form->{"all_$form->{vc}"} || [] }) {
     map { $name .= "<option>$_->{name}--$_->{id}\n" }
       @{ $form->{"all_$form->{vc}"} };
     $name = qq|<select name=$form->{vc}><option>\n$name</select>|;
index 66a6a6a3d241cffcef13a6fa9faf502680491ddb..b35b66495ce2c35c52c5856fcf1a89f6b08674c3 100644 (file)
@@ -161,13 +161,13 @@ sub list {
 
   # get departments
   $form->all_departments(\%myconfig);
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   my $department = qq|
index 3bc458a8d642dec18af65e2427685d1a9fd9fbb5..2b2016f76f03fe465b21eb355c14afad05520b42 100644 (file)
@@ -586,7 +586,7 @@ sub mark_as_paid_common {
 
   if($form->{mark_as_paid}) {
     my $dbh ||= $form->get_standard_dbh($myconfig);
-    my $query = qq|UPDATE $db_name SET paid = amount WHERE id = ?|;
+    my $query = qq|UPDATE $db_name SET paid = amount, datepaid = current_date WHERE id = ?|;
     do_query($form, $dbh, $query, $form->{id});
     $dbh->commit();
     $form->redirect($locale->text("Marked as paid"));
index 6a21edecbbf1990eed7f7a3320ebeb7d85702136..c19cc53128fdb586bcf5bfd102759d431db74b0e 100644 (file)
@@ -74,14 +74,14 @@ sub payment {
   }
 
   # departments
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
     $form->{department}       = "$form->{department}--$form->{department_id}";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   CP->paymentaccounts(\%myconfig, \%$form);
@@ -235,82 +235,82 @@ sub form_header {
     <td>
       <table width=100%>
         <tr valign=top>
-         <td>
-           <table>
-             <tr>
-               <td align=right>
-               <input name=all_vc type=checkbox style=checkbox value=Y $allvc>
-               <input type=hidden name="oldall_vc" value="$form->{all_vc}"></td>
-               <th align=left>| . $locale->text('All') . qq|</th>
-             </tr>
-             <tr>
-               <th align=right>$vclabel</th>
-               <td>$vc</td>
-                <input type=hidden name="select$form->{vc}" value="$form->{"select$form->{vc}"}">
-                <input type=hidden name="$form->{vc}_id" value=$form->{"$form->{vc}_id"}>
-               <input type=hidden name="old$form->{vc}" value="$form->{"old$form->{vc}"}">
-             </tr>
-             <tr valign=top>
-               <th align=right nowrap>| . $locale->text('Address') . qq|</th>
-               <td colspan=2>
-                 <table>
-                   <tr>
-                     <td>$form->{street}</td>
-                   </tr>
-                   <tr>
-                     <td>$form->{zipcode}</td>
-                   </tr>
-                   <tr>
-                     <td>$form->{city}</td>
-                   </tr>
-                   <tr>
-                     <td>$form->{country}</td>
-                   </tr>
-                 </table>
-               </td>
-               <input type=hidden name=street value="$form->{street}">
-               <input type=hidden name=zipcode value="$form->{zipcode}">
-               <input type=hidden name=city value="$form->{city}">
-               <input type=hidden name=country value="$form->{country}">
-             </tr>
-             <tr>
-               <th align=right>| . $locale->text('Memo') . qq|</th>
-               <td colspan=2><input name="memo" size=30 value="$form->{memo}"></td>
-             </tr>
-           </table>
-         </td>
-         <td align=right>
-           <table>
-             $department
-             <tr>
-               <th align=right nowrap>| . $locale->text('Account') . qq|</th>
-               <td colspan=3><select name=account>$form->{selectaccount}</select>
-               <input type=hidden name=selectaccount value="$form->{selectaccount}">
-               </td>
-             </tr>
-             <tr>
-               <th align=right nowrap>| . $locale->text('Date') . qq|</th>
+          <td>
+            <table>
+              <tr>
+                <td align=right>
+                <input name=all_vc type=checkbox style=checkbox value=Y $allvc>
+                <input type=hidden name="oldall_vc" value="$form->{all_vc}"></td>
+                <th align=left>| . $locale->text('All') . qq|</th>
+              </tr>
+              <tr>
+                <th align=right>$vclabel</th>
+                <td>$vc</td>
+                <input type=hidden name="select$form->{vc}" value="| . H($form->{"select$form->{vc}"}) . qq|">
+                <input type=hidden name="$form->{vc}_id" value="|    . H($form->{"$form->{vc}_id"}) . qq|">
+                <input type=hidden name="old$form->{vc}" value="|    . H($form->{"old$form->{vc}"}) . qq|">
+              </tr>
+              <tr valign=top>
+                <th align=right nowrap>| . $locale->text('Address') . qq|</th>
+                <td colspan=2>
+                  <table>
+                    <tr>
+                      <td>$form->{street}</td>
+                    </tr>
+                    <tr>
+                      <td>$form->{zipcode}</td>
+                    </tr>
+                    <tr>
+                      <td>$form->{city}</td>
+                    </tr>
+                    <tr>
+                      <td>$form->{country}</td>
+                    </tr>
+                  </table>
+                </td>
+                <input type=hidden name=street value="$form->{street}">
+                <input type=hidden name=zipcode value="$form->{zipcode}">
+                <input type=hidden name=city value="$form->{city}">
+                <input type=hidden name=country value="$form->{country}">
+              </tr>
+              <tr>
+                <th align=right>| . $locale->text('Memo') . qq|</th>
+                <td colspan=2><input name="memo" size=30 value="$form->{memo}"></td>
+              </tr>
+            </table>
+          </td>
+          <td align=right>
+            <table>
+              $department
+              <tr>
+                <th align=right nowrap>| . $locale->text('Account') . qq|</th>
+                <td colspan=3><select name=account>$form->{selectaccount}</select>
+                <input type=hidden name=selectaccount value="$form->{selectaccount}">
+                </td>
+              </tr>
+              <tr>
+                <th align=right nowrap>| . $locale->text('Date') . qq|</th>
                 $button1
-             </tr>
-             <tr>
-               <th align=right nowrap>| . $locale->text('Currency') . qq|</th>
-               <td><select name=currency>$form->{selectcurrency}</select></td>
-               <input type=hidden name=selectcurrency value="$form->{selectcurrency}">
-               <input type=hidden name=oldcurrency value=$form->{oldcurrency}>
-             </tr>
-             $exchangerate
-             <tr>
-               <th align=right nowrap>| . $locale->text('Source') . qq|</th>
-               <td colspan=3><input name=source value="$form->{source}" size=10></td>
-             </tr>
-             <tr>
-               <th align="right" nowrap>| . $locale->text('Amount') . qq|</th>
-               <td colspan="3"><input name="amount" size="10" value="|
+              </tr>
+              <tr>
+                <th align=right nowrap>| . $locale->text('Currency') . qq|</th>
+                <td><select name=currency>$form->{selectcurrency}</select></td>
+                <input type=hidden name=selectcurrency value="$form->{selectcurrency}">
+                <input type=hidden name=oldcurrency value=$form->{oldcurrency}>
+              </tr>
+              $exchangerate
+              <tr>
+                <th align=right nowrap>| . $locale->text('Source') . qq|</th>
+                <td colspan=3><input name=source value="$form->{source}" size=10></td>
+              </tr>
+              <tr>
+                <th align="right" nowrap>| . $locale->text('Amount') . qq|</th>
+                <td colspan="3"><input name="amount" size="10" value="|
     . $form->format_amount(\%myconfig, $form->{amount}, 2) . qq|" onBlur=\"check_right_number_format(this)\"></td>
-             </tr>
-           </table>
-         </td>
-       </tr>
+              </tr>
+            </table>
+          </td>
+        </tr>
       </table>
     </td>
   </tr>
@@ -622,7 +622,7 @@ sub update {
       }
 
       # Modified by J.Zach, see abovev
-      $amount += $form->{"paid_$i"}; 
+      $amount += $form->{"paid_$i"};
 
     } else {
       $form->{"paid_$i"} = "";
@@ -636,7 +636,7 @@ sub update {
   }
 
   # Line added by J.Zach, see above
-  $form->{amount}=$amount; 
+  $form->{amount}=$amount;
 
   &form_header;
   &list_invoices;
index 51e046c8693a135fb16216d5b6a7f89576f1b37e..872919cfc3a6d9c786fd20b7501d3683e92b794b 100644 (file)
@@ -102,7 +102,7 @@ sub add {
 
   $form->{SHOW_CUSTOMER_SELECTION}      = $form->{all_customer}    && scalar @{ $form->{all_customer} };
   $form->{SHOW_DUNNING_LEVEL_SELECTION} = $form->{DUNNING}         && scalar @{ $form->{DUNNING} };
-  $form->{SHOW_DEPARTMENT_SELECTION}    = $form->{all_departments} && scalar @{ $form->{all_departments} };
+  $form->{SHOW_DEPARTMENT_SELECTION}    = $form->{all_departments} && scalar @{ $form->{all_departments} || [] };
 
   $form->{title}    = $locale->text('Start Dunning Process');
   $form->{jsscript} = 1;
@@ -319,7 +319,7 @@ sub show_dunning {
   $main::auth->assert('dunning_edit');
 
   my @filter_field_list = qw(customer_id customer dunning_level department_id invnumber ordnumber
-                             transdatefrom transdateto dunningfrom dunningto notes showold);
+                             transdatefrom transdateto dunningfrom dunningto notes showold salesman);
 
   report_generator_set_default_sort('customername', 1);
 
@@ -360,21 +360,26 @@ sub show_dunning {
     'interest'            => { 'text' => $locale->text('Interest') },
   );
 
+  if ($form->{l_salesman}) {
+   # Show salesman column
+    $column_defs{'salesman'} = ( { 'text' =>  $locale->text('Salesperson') } );
+  }
+
   $report->set_columns(%column_defs);
   $report->set_column_order(qw(checkbox dunning_description customername invnumber transdate
-                               duedate amount dunning_date dunning_duedate fee interest));
+                               duedate amount dunning_date dunning_duedate fee interest salesman));
   $report->set_sort_indicator($form->{sort}, $form->{sortdir});
 
   my $edit_url  = build_std_url('script=is.pl', 'action=edit', 'callback') . '&id=';
   my $print_url = build_std_url('action=print_dunning', 'format=pdf', 'media=screen') . '&dunning_id=';
   my $sort_url  = build_std_url('action=show_dunning', grep { $form->{$_} } @filter_field_list);
 
-  foreach my $name (qw(dunning_description customername invnumber transdate duedate dunning_date dunning_duedate)) {
+  foreach my $name (qw(dunning_description customername invnumber transdate duedate dunning_date dunning_duedate salesman)) {
     my $sortdir                 = $form->{sort} eq $name ? 1 - $form->{sortdir} : $form->{sortdir};
     $column_defs{$name}->{link} = $sort_url . "&sort=$name&sortdir=$sortdir";
   }
 
-  my %alignment = map { $_ => 'right' } qw(transdate duedate amount dunning_date dunning_duedate fee interest);
+  my %alignment = map { $_ => 'right' } qw(transdate duedate amount dunning_date dunning_duedate fee interest salesman);
 
   my ($current_dunning_rows, $previous_dunning_id, $first_row_for_dunning);
 
index c69052bd941dee713a8d9a880c1e38d01545ad38..fd8482b196b4fcdcd2c221c155c41fd28448d977 100644 (file)
@@ -725,7 +725,8 @@ sub invoice {
   $form->{type} = "invoice";
 
   # locale messages
-  $locale = new Locale "$myconfig{countrycode}", "$script";
+  $main::locale = new Locale "$myconfig{countrycode}", "$script";
+  $locale = $main::locale;
 
   require "bin/mozilla/$form->{script}";
 
index 731f525767357c38d45bc2bfd75dec6041c71dd6..4b34a5080690a3205842396ad9065b7919047cb4 100644 (file)
@@ -110,13 +110,13 @@ sub add {
 
   # departments
   $form->all_departments(\%myconfig);
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   $form->{show_details} = $myconfig{show_form_details} unless defined $form->{show_details};
@@ -146,13 +146,13 @@ sub prepare_transaction {
 
   # departments
   $form->all_departments(\%myconfig);
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   my $i        = 1;
@@ -240,13 +240,13 @@ sub search {
   $form->all_departments(\%myconfig);
 
   # departments
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
 
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   my $department = qq|
index d848abc64f2a9c54cb57fe5215a91f7c91a63a7c..c599c832510c905ffc83e4e34be8de885a023ae0 100644 (file)
@@ -153,7 +153,7 @@ sub invoice_links {
     map {
       $form->{selectdepartment} .=
         "<option>$_->{description}--$_->{id}\n"
-    } (@{ $form->{all_departments} });
+    } (@{ $form->{all_departments} || [] });
   }
 
   # forex
index 07ad1108e7f5473c8cb6471b1396e64afb64f652..27643486a7341871a4bee57248df89a9ce630ea9 100644 (file)
@@ -164,7 +164,7 @@ sub section_menu {
         # expand menu
         if ($zeige) {
           print
-            qq|<tr><td valign=bottom><b>$spacer<img src="image/unterpunkt.png">$label</b></td></tr>\n|;
+            qq|<tr><td style='vertical-align:bottom'><b>$spacer<img src="image/unterpunkt.png">$label</b></td></tr>\n|;
         }
 
         # remove same level items
index 116d16869ae6a8dd30dd1aaffaacac5da2159d67..95ccfa6888cc470a6c8ee59558f8e4cced38ade1 100644 (file)
@@ -252,7 +252,7 @@ sub order_links {
   $form->{employee}    = "$form->{employee}--$form->{employee_id}";
 
   # build vendor/customer drop down comatibility... don't ask
-  if (@{ $form->{"all_$form->{vc}"} }) {
+  if (@{ $form->{"all_$form->{vc}"} || [] }) {
     $form->{"select$form->{vc}"} = 1;
     $form->{$form->{vc}}         = qq|$form->{$form->{vc}}--$form->{"$form->{vc}_id"}|;
   }
@@ -490,6 +490,12 @@ sub form_footer {
      print_options   => print_options(inline => 1),
      label_edit      => $locale->text("Edit the $form->{type}"),
      label_workflow  => $locale->text("Workflow $form->{type}"),
+     is_sales        => scalar ($form->{type} =~ /^sales_/),              # these vars are exported, so that the template
+     is_order        => scalar ($form->{type} =~ /_order$/),              # may determine what to show
+     is_sales_quo    => scalar ($form->{type} =~ /sales_quotation$/),
+     is_req_quo      => scalar ($form->{type} =~ /request_quotation$/),
+     is_sales_ord    => scalar ($form->{type} =~ /sales_order$/),
+     is_pur_ord      => scalar ($form->{type} =~ /purchase_order$/),
   });
 
   $main::lxdebug->leave_sub();
@@ -776,7 +782,7 @@ sub orders {
   my @hidden_variables = map { "l_${_}" } @columns;
   push @hidden_variables, "l_subtotal", $form->{vc}, qw(l_closed l_notdelivered open closed delivered notdelivered ordnumber quonumber
                                                         transaction_description transdatefrom transdateto type vc employee_id salesman_id
-                                                        reqdatefrom reqdateto);
+                                                        reqdatefrom reqdateto projectnumber);
 
   my $href = build_std_url('action=orders', grep { $form->{$_} } @hidden_variables);
 
@@ -1361,7 +1367,8 @@ sub invoice {
   $form->{type} = "invoice";
 
   # locale messages
-  $locale = new Locale "$myconfig{countrycode}", "$script";
+  $main::locale = new Locale "$myconfig{countrycode}", "$script";
+  $locale = $main::locale;
 
   require "bin/mozilla/$form->{script}";
 
index 5115ddd35e3ea9c5b3ef7830223135d9ad35aff5..5099c899551d9d1171fd3fad1b3dfba6f841674b 100644 (file)
@@ -154,9 +154,9 @@ sub report {
 
   # get departments
   $form->all_departments(\%myconfig);
-  if (@{ $form->{all_departments} }) {
+  if (@{ $form->{all_departments} || [] }) {
     $form->{selectdepartment} = "<option>\n";
-    map { $form->{selectdepartment} .= "<option>$_->{description}--$_->{id}\n" } @{ $form->{all_departments} };
+    map { $form->{selectdepartment} .= "<option>$_->{description}--$_->{id}\n" } @{ $form->{all_departments} || [] };
   }
 
   my $department = qq|
index 0309404f4085e44bda60b01012a6eafde2349520..5780acf7f013bad1ac1e2e59c77748ed406bba88 100644 (file)
@@ -2,6 +2,162 @@
 # Veränderungen von Lx-Office ERP #
 ###################################
 
+2009-11-5 - unstable stand release-2.6.0-340-g9e15903
+
+  Größere neue Features:
+
+  - SEPA Export
+
+    Lx-Office unterstützt nun die elektronische Überweisung im SEPA Format.
+    Eine genaue Anleitung und Feature Beschreibung dazu gibt es in den
+    Releasenotes.
+
+  - Secure Cookies.
+
+    Diese Option ist standardmäßig akiviert, und sollte moderne Browser
+    anweisen, das Lx-Office Cookie nur an per https gesicherte Webseiten
+    herauszugeben. Dadurch wird die Identifikationssicherheit erhöht.
+
+  - Benutzerdefinierte Variablen in Artikelstammdaten.
+
+    Zusättzlich zu Aufträgen, Lieferscheinen und Rechnungen sind
+    benutzerdefinierte Vriabeln jetzt auch in Waren, Dienstleistungen
+    und Erzeugnissen verfügbar. Diese werden, sofern als solche markiert, auch
+    in Belegen in den Artiekln mit angezeigt, und werden wie Beschreibung und
+    Preis überlagert. In der Artikelsuche sind sie durchsuchbar.
+
+
+  Kleinere neue Features und Detailverbesserungen:
+
+  - Das alte Javascriptmenü funktioniert jetzt wieder.
+  - Der Parser für CGI Variablen wurde überarbeitet.
+  - MIME Types für PDF-Anhänge aus OpenDocument Vorlagen werden nun korrekt
+    gesetzt.
+  - Wenn Javascript ausgeschaltet ist, wird jetzt eine Warnung auf dem
+    Startbildschirm angezeigt.
+  - Die Artikelmaske ist jetzt mit Tabs aufgeräumt.
+  - Einige alte Dateien aus der SQL Ledger Basis wurden entfernt.
+  - Die Darstellung auf Browsern der KHTML Engine (z.B. Konqueror) wurde
+    verbessert.
+  - Die Darstellung des CSS Menüs wurde leicht verbessert.
+  - Die Funktionalität der Warensuche wurde deutlich erweitert, vorallem die
+    Suche nach Waren, die in Belegen verwendet werden.
+  - Charset Konvertierungen werden jetzt nur dann durchgeführt, wenn sich die
+    Charsets auch wirklich unterscheiden.
+  - Bei Lieferschein zu Rechnung Konvertierung werden jetzt die Lieferdaten in
+    die Artikelzeilen übernommen.
+  - Bei 'als neu speichern' bei Aufträgen wurden einige Felder nicht korrekt
+    gesetzt.
+  - Standardgewichtseinheit wird im unter den Stadardeinstellungen jetzt als
+    Auswahl präsentiert.
+  - Workflowaktionen in Belegen setzen jetzt den Bearbeiter korrekt.
+  - Dislogbuchen geht nicht mehr auf Überschriftskonten.
+  - Artikel haben jetzt ein Attribut, das anziegt ob sie eine Seriennummer
+    haben.
+  - Benutzerdefinierte Variablen können jetzte als ungültig markiert werden, und
+    tauchen dann für diesen Artikel nicht mehr in Belegen auf.
+  - Die Sprache American English wurde entfernt.
+  - Die Sprache British English wurde in English umbenannt.
+  - Lieferscheine werden jetzt auch im WebDAV gespeichert.
+  - In allen Masken wird bei Erneuern in der gleichen Maske jetzt der Fokus
+    beibehalten.
+  - Gewinn und Verlustrechnungen berücksichtigt jetzt partielle Zahlungen.
+  - Die Detailansicht in Belegen wird jetzt über Javascript getriggert und
+    benötigt keinen Seitenneuaufbau mehr.
+  - Aufträge behalten ihren Fokus jetzt explizit auch beim Speichern. Dadurch
+    ist es möglich während des bearbeitens eines Auftrags zwischenzuspeichern,
+    ohne den Arbeitsfluß zu unterbrechen.
+
+
+
+  API Änderungen:
+
+  - cp_greeting heisst jetzt cp_gender und ist auf die flags 'm' und 'f'
+    beschränkt.
+  - Mit SL::GenericTranslations ist ein Modul dazugekommen um beliebige Elemente
+    zu übersetzen.
+  - Die Syntax für das <%if ...%> Konstrukt in Templates wurde deutlich
+    erweitert (Dokumentation in doc/dokumentenvorlage-und-variablen.html).
+  - Das Mahnsystem exportiert jetzt mehr Felder an die Templates.
+  - SL::RecordLinks haben jetzt eine transitive Suchfunktion: get_links_via.
+    Siehe perldoc SL::RecordLinks
+  - SL::MoreCommon exportiert jetzt einige nützliche
+    Arraymanipulationsfunktionen die an Ruby angelehnt sind.
+  - SL::DBUtils hat jetzt eine Funktion zum überprüfen ob eine Tablelle
+    existiert, und einen Wrapper für große tokenbasierte Selects.
+  - SL::OE kennt jetzt die Funktion retrieve_simple, die einen Auftrag nach id
+    lädt, ohne die kompletten Kontextinformationen von retrieve zu laden.
+  - login.pl unterstützt jetzt einen callback parameter. Damit lassen sich
+    andere Webanwendungen in der menu.ini integrieren.
+  - Im Lagerbewegungsbericht wird nun eine Spalte "Dokument" angezeigt, die auf
+    die Belege verlinkt.
+  - locale stellt jetzt immer die iconv Objekte bereit um Datenbankcharset <->
+    ISO-8859-1 zu konvertieren, auch wenn die Sprache selber nicht existiert.
+  - Upgrade auf JQuery 1.3.1
+  - Das Testframework über selenium wurde entfernt.
+  - Ein neues Testframework in Anlehnung an die Tests von Bugzilla wurde
+    eingeführt.
+  - Das komplette Programm läuft jetzt im Perl strict Modus. Neuer Code muss
+    zwingend ebenfalls strict geschrieben werden.
+
+
+
+  Bugfixes:
+
+  - Eine Funktion zum Auslesen von Lieferanten war nicht gegen mehrfache Aufrufe
+    abgesichert.
+  - Der Workflow Auftrag -> Lieferschein konnte unter Umständen auf das falsche
+    Script verweisen, oder es wurden Felder nicht übernommen.
+  - Die Auftragssuche ergab bei bestimmten Werten der Listenbegrenzung
+    fehlerhafte Anzeigen.
+  - Unter Umständen gingen bei Kreditorenbuchungen die Bemerkungen verloren.
+  - Ein Fehler in der Saldenberechnung der Kontenübersicht wurde behoben.
+  - Das Zahlungsdatum bei gebuchten Zahlungen war unter Umständen nicht korrekt.
+  - Die Dimension von Datenbankfeldern war zu klein für Belege über einer
+    Milliarde.
+  - Kompatibilität zu Postgres 8.4.
+  - Beim Erzeugen einer Einkaufsrechnung aus mehreren Lieferscheinen wurde
+    fälschlicherweise iene Verkaufsrechnung erzeugt.
+  - Im Ausdruck von Angeboten/Aufträgen wurden Lieferanteninformationen unter
+    bestimmten Umständen nicht weitergegeben.
+  - Einige Codingfehler in selten benutzten Fehlermeldungen wurden behoben.
+  - In der Suche von Lieferscheinen war das Verhalten der "offen" und
+    "geschlossen" Checkboxen inkonsistent mit dem restlichen Programm.
+  - Beim Erstellen eines neuen Benutzers wurden OpenDocument Vorlagen nicht
+    kopiert.
+  - Ein IE5 Bugfix von CGI::Ajax hat Probleme bei bestimmten Werten gemacht, und
+    wurde entfernt.
+  - Nach dem speichern einer Rechnung wurde die Folgeanzeige nicht korrekt
+    befüllt.
+  - Dienstleistungen wurden beim speichern fälschlicherweise auf Warenbestand
+    überprüft.
+  - Es gab Probleme in der Auftragssuche nach Projektnummer, wenn eine niedriger
+    Auswahllistenbeschränkung eingestellt war.
+  - Fehler und potentielle Sicherheitslücken in der Historiensuchmaschine
+    beseitigt.
+  - Es wurden einige "division by zero" Fehler im Zusammenhang mit Preisfaktoren
+    behoben.
+  - Das XUL Menü zeigt jetzt wieder korrekt den Titlestring an.
+  - Es wurden in der Lieferübersicht von Lieferanten fehlerhafte Werte
+    angezeigt.
+  - In der Adminitrationsmaske gab es einen Bug der dazu führte, dass Mitglieder
+    einer Rechtegruppe mehrfach auftauchten.
+  - Suche nach Lieferscheinen mit einer bestimmten Projektnummer war fehlerhaft.
+  - Einheiten in Druckvorlagen wurden nicht lokalisiert.
+  - Daten und Zahlen wurden in Druckvorlagen unter Umständen nicht korrekt
+    formatiert.
+  - Bei Einkaufsrechnungen gab es Probleme mit der Rabattberechnung.
+  - Lieferanten in Einkaufsrechnungen wurden nicht richtig formatiert.
+
+
+
+  Liste gefixter Bugs aus dem Bugtracker:
+
+  922 940 1024 1025 1028 1030 1031 1034 1035 1037 1040 1043 1044 1046 1051 1055
+  1057 1058 1073 1077 1081 1082 1098 1100 1101 1108 1110 1118 1125 1127 1133
+  1136 1138 1147 1150 1151 1155 1164 1186 1190 1191 1199 1201
+
+
 2009-06-02 - Version 2.6.0
 
   Größere neue Features:
index a4896c7c8a523bcafd8d0228339c9d9d374ad024..45e3c04bed0b77a827fd68bc0efaed622b44c82a 100644 (file)
@@ -218,6 +218,7 @@ $self->{texts} = {
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
   'Sales Invoice'               => 'Rechnung',
+  'Salesperson'                 => 'Verkäufer/in',
   'Sales Order'                 => 'Kundenauftrag',
   'Sales quotation'             => 'Angebot',
   'Screen'                      => 'Bildschirm',
index 0689bbeda2b06d2f2a2ff642995f5fd1e02ce8a5..d954e40c6f2a172772eccc9fe5d94d665e2eba01 100644 (file)
@@ -219,6 +219,7 @@ $self->{texts} = {
   'SCREENED'                    => 'SCREENED',
   'Sales Invoice'               => 'Sales Invoice',
   'Sales Order'                 => 'Sales Order',
+  'Salesperson'                 => 'Salesperson',
   'Sales quotation'             => 'Sales quotation',
   'Screen'                      => 'Screen',
   'Select a Customer'           => 'Select a Customer',
diff --git a/sql/Pg-upgrade2/fix_datepaid.sql b/sql/Pg-upgrade2/fix_datepaid.sql
new file mode 100644 (file)
index 0000000..d4cc74b
--- /dev/null
@@ -0,0 +1,21 @@
+-- @tag: fix_datepaid
+-- @description: Felder datepaid in ar und ap richtig setzen
+-- @depends: release_2_6_0
+
+UPDATE ap
+  SET datepaid = COALESCE((SELECT MAX(at.transdate)
+                           FROM acc_trans at
+                           LEFT JOIN chart c ON (at.chart_id = c.id)
+                           WHERE (at.trans_id = ap.id)
+                             AND (c.link LIKE '%paid%')),
+                          COALESCE(ap.mtime::date, ap.itime::date))
+  WHERE paid <> 0;
+
+UPDATE ar
+  SET datepaid = COALESCE((SELECT MAX(at.transdate)
+                           FROM acc_trans at
+                           LEFT JOIN chart c ON (at.chart_id = c.id)
+                           WHERE (at.trans_id = ar.id)
+                             AND (c.link LIKE '%paid%')),
+                          COALESCE(ar.mtime::date, ar.itime::date))
+  WHERE paid <> 0;
index d9b10b0e46a01a5e4bbfb8aa8d4e398f0bd5f5f1..5bd1b9d0d0010f2847440fe9e6afc2b0d0f382e3 100644 (file)
       <tr>
        <th align="right" nowrap>Alte Mahnungen anzeigen</th>
        <td><input type="checkbox" value="1" name="showold"></td>
+       <th align="right" nowrap>Verk&auml;ufer anzeigen</th>
+       <td><input type="checkbox" value="1" name="l_salesman"></td>
       </tr>
      </table>
     </td>