Projektverwaltung in eine eigene Datei ausgelagert und auf die Verwendung von Templat...
authorMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 21 Jan 2008 17:37:48 +0000 (17:37 +0000)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Mon, 21 Jan 2008 17:37:48 +0000 (17:37 +0000)
15 files changed:
SL/Form.pm
SL/PE.pm
SL/Projects.pm [new file with mode: 0644]
bin/mozilla/arap.pl
bin/mozilla/pe.pl
bin/mozilla/projects.pl [new file with mode: 0644]
locale/de/all
locale/de/pe
locale/de/projects [new file with mode: 0644]
menu.ini
projects.pl [new symlink]
templates/webpages/projects/project_form_de.html [new file with mode: 0644]
templates/webpages/projects/project_form_master.html [new file with mode: 0644]
templates/webpages/projects/search_de.html [new file with mode: 0644]
templates/webpages/projects/search_master.html [new file with mode: 0644]

index d7da58c..290eb75 100644 (file)
@@ -763,6 +763,7 @@ sub parse_html_template {
   if (!$template->process($file, $additional_params, \$output)) {
     print STDERR $template->error();
   }
+  $main::lxdebug->message(0, "err " . $template->error());
 
   $output = $main::locale->{iconv}->convert($output) if ($main::locale);
 
index d04c576..d165a2f 100644 (file)
--- a/SL/PE.pm
+++ b/SL/PE.pm
@@ -28,8 +28,7 @@
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #======================================================================
 #
-# Project module
-# also used for partsgroups
+# Partsgroups and pricegroups
 #
 #======================================================================
 
@@ -39,133 +38,6 @@ use Data::Dumper;
 
 use SL::DBUtils;
 
-sub projects {
-  $main::lxdebug->enter_sub();
-
-  my ($self, $myconfig, $form) = @_;
-
-  # connect to database
-  my $dbh = $form->dbconnect($myconfig);
-
-  my ($where, @values);
-
-  foreach my $column (qw(projectnumber description)) {
-    if ($form->{$column}) {
-      $where .= qq|AND $column ILIKE ? |;
-      push(@values, '%' . $form->{$column} . '%');
-    }
-  }
-
-  if ($form->{status} eq 'orphaned') {
-    my %col_prefix = ("ar" => "global", "ap" => "global", "oe" => "global");
-    my $first = 1;
-
-    $where .= qq|AND id NOT IN (|;
-    foreach my $table (qw(acc_trans invoice orderitems rmaitems ar ap oe)) {
-      $where .= "UNION " unless ($first);
-      $first = 0;
-      $where .=
-        qq|SELECT DISTINCT $col_prefix{$table}project_id FROM $table | .
-        qq|WHERE NOT $col_prefix{$table}project_id ISNULL |;
-    }
-    $where .= qq|) |;
-  }
-
-  if ($form->{active} eq "active") {
-    $where .= qq|AND active |;
-  } elsif ($form->{active} eq "inactive") {
-    $where .= qq|AND NOT active |;
-  }
-
-  substr($where, 0, 4) = "WHERE " if ($where);
-
-  my $sortorder = $form->{sort} ? $form->{sort} : "projectnumber";
-  $sortorder =~ s/[^a-z_]//g;
-  my $query =
-    qq|SELECT id, projectnumber, description, active | .
-    qq|FROM project | .
-    $where .
-    qq|ORDER BY $sortorder|;
-
-  $form->{project_list} =
-    selectall_hashref_query($form, $dbh, $query, @values);
-  $dbh->disconnect;
-
-  $main::lxdebug->leave_sub();
-
-  return scalar(@{ $form->{project_list} });
-}
-
-sub get_project {
-  $main::lxdebug->enter_sub();
-
-  my ($self, $myconfig, $form) = @_;
-
-  # connect to database
-  my $dbh = $form->dbconnect($myconfig);
-
-  my $query =
-    qq|SELECT * FROM project | .
-    qq|WHERE id = ?|;
-       my @values = ($form->{id});
-  my $sth = $dbh->prepare($query);
-  $sth->execute(@values) || $form->dberror($query);
-
-  my $ref = $sth->fetchrow_hashref(NAME_lc);
-
-  map { $form->{$_} = $ref->{$_} } keys %$ref;
-
-  $sth->finish;
-
-  # check if it is orphaned
-  my %col_prefix = ("ar" => "global", "ap" => "global", "oe" => "global");
-  @values = ();
-  $query = qq|SELECT |;
-  my $first = 1;
-  foreach my $table (qw(acc_trans invoice orderitems rmaitems ar ap oe)) {
-    $query .= " + " unless ($first);
-    $first = 0;
-    $query .=
-      qq|(SELECT COUNT(*) FROM $table | .
-      qq| WHERE $col_prefix{$table}project_id = ?) |;
-    push(@values, $form->{id});
-  }
-
-  ($form->{orphaned}) = selectrow_query($form, $dbh, $query, @values);
-  $form->{orphaned} = !$form->{orphaned};
-
-  $dbh->disconnect;
-
-  $main::lxdebug->leave_sub();
-}
-
-sub save_project {
-  $main::lxdebug->enter_sub();
-
-  my ($self, $myconfig, $form) = @_;
-
-  # connect to database
-  my $dbh = $form->dbconnect($myconfig);
-
-  my @values = ($form->{projectnumber}, $form->{description});
-
-  if ($form->{id}) {
-    $query =
-      qq|UPDATE project SET projectnumber = ?, description = ?, active = ? | .
-      qq|WHERE id = ?|;
-    push(@values, ($form->{active} ? 't' : 'f'), $form->{id});
-  } else {
-    $query =
-      qq|INSERT INTO project (projectnumber, description, active) | .
-      qq|VALUES (?, ?, 't')|;
-  }
-  do_query($form, $dbh, $query, @values);
-
-  $dbh->disconnect;
-
-  $main::lxdebug->leave_sub();
-}
-
 sub partsgroups {
   $main::lxdebug->enter_sub();
 
@@ -265,10 +137,7 @@ sub delete_tuple {
   # connect to database
   my $dbh = $form->dbconnect($myconfig);
 
-  my $table =
-    $form->{type} eq "project" ? "project" :
-    $form->{type} eq "pricegroup" ? "pricegroup" :
-    "partsgroup";
+  my $table = $form->{type} eq "pricegroup" ? "pricegroup" : "partsgroup";
 
   $query = qq|DELETE FROM $table WHERE id = ?|;
   do_query($form, $dbh, $query, $form->{id});
diff --git a/SL/Projects.pm b/SL/Projects.pm
new file mode 100644 (file)
index 0000000..5327e91
--- /dev/null
@@ -0,0 +1,204 @@
+#=====================================================================
+# LX-Office ERP
+# Copyright (C) 2004
+# Based on SQL-Ledger Version 2.1.9
+# Web http://www.lx-office.org
+#
+#=====================================================================
+# SQL-Ledger Accounting
+# Copyright (C) 1998-2002
+#
+#  Author: Dieter Simader
+#   Email: dsimader@sql-ledger.org
+#     Web: http://www.sql-ledger.org
+#
+#  Contributors:
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#======================================================================
+#
+# Project module
+#
+#======================================================================
+
+package Projects;
+
+use Data::Dumper;
+
+use SL::DBUtils;
+
+my %project_id_column_prefixes  = ("ar"              => "global",
+                                   "ap"              => "global",
+                                   "oe"              => "global",
+                                   "delivery_orders" => "global");
+
+my @tables_with_project_id_cols = qw(acc_trans
+                                     invoice
+                                     orderitems
+                                     rmaitems
+                                     ar
+                                     ap
+                                     oe
+                                     delivery_orders
+                                     delivery_order_items);
+
+sub search_projects {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
+
+  my (@filters, @values);
+
+  foreach my $column (qw(projectnumber description)) {
+    if ($params{$column}) {
+      push @filters, "$column ILIKE ?";
+      push @values, '%' . $params{$column} . '%';
+    }
+  }
+
+  if ($params{status} eq 'orphaned') {
+    my @sub_filters;
+
+    foreach my $table (@tables_with_project_id_cols) {
+      push @sub_filters, qq|SELECT DISTINCT $project_id_column_prefixes{$table}project_id FROM $table
+                            WHERE NOT $project_id_column_prefixes{$table}project_id ISNULL|;
+    }
+
+    push @filters, "id NOT IN (" . join(" UNION ", @sub_filters) . ")";
+  }
+
+  if ($params{active} eq "active") {
+    push @filters, 'active';
+
+  } elsif ($params{active} eq "inactive") {
+    push @filters, 'NOT COALESCE(active, FALSE)';
+  }
+
+  my $where = 'WHERE ' . join(' AND ', map { "($_)" } @filters) if (scalar @filters);
+
+  my $sortorder =  $params{sort} ? $params{sort} : "projectnumber";
+  $sortorder    =~ s/[^a-z_]//g;
+  my $query     = qq|SELECT id, projectnumber, description, active
+                     FROM project
+                     $where
+                     ORDER BY $sortorder|;
+
+  $form->{project_list} = selectall_hashref_query($form, $dbh, $query, @values);
+
+  $main::lxdebug->leave_sub();
+
+  return scalar(@{ $form->{project_list} });
+}
+
+sub get_project {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  if (!$params{id}) {
+    $main::lxdebug->leave_sub();
+    return { };
+  }
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
+
+  my $project  = selectfirst_hashref_query($form, $dbh, qq|SELECT * FROM project WHERE id = ?|, conv_i($params{id})) || { };
+
+  if ($params{orphaned}) {
+    # check if it is orphaned
+    my (@values, $query);
+
+    foreach my $table (@tables_with_project_id_cols) {
+      $query .= " + " if ($query);
+      $query .= qq|(SELECT COUNT(*) FROM $table
+                    WHERE $project_id_column_prefixes{$table}project_id = ?) |;
+      push @values, conv_i($params{id});
+    }
+
+    $query = 'SELECT ' . $query;
+
+    ($project->{orphaned}) = selectrow_query($form, $dbh, $query, @values);
+    $project->{orphaned}   = !$project->{orphaned};
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $project;
+}
+
+sub save_project {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
+
+  my @values;
+
+  if (!$params{id}) {
+    ($params{id}) = selectfirst_array_query($form, $dbh, qq|SELECT nextval('id')|);
+    do_query($form, $dbh, qq|INSERT INTO project (id) VALUES (?)|, conv_i($params{id}));
+
+    $params{active} = 1;
+  }
+
+  $query  = qq|UPDATE project SET projectnumber = ?, description = ?, active = ?
+               WHERE id = ?|;
+
+  @values = ($params{projectnumber}, $params{description}, $params{active} ? 't' : 'f', conv_i($params{id}));
+  do_query($form, $dbh, $query, @values);
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+
+  return $params{id};
+}
+
+sub delete_project {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, qw(id));
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
+
+  do_query($form, $dbh, qq|DELETE FROM project WHERE id = ?|, conv_i($params{id}));
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+1;
+
index 38308a9..8971da5 100644 (file)
@@ -30,6 +30,8 @@
 # common routines for gl, ar, ap, is, ir, oe
 #
 
+use SL::Projects;
+
 # any custom scripts for this one
 if (-f "bin/mozilla/custom_arap.pl") {
   eval { require "bin/mozilla/custom_arap.pl"; };
@@ -281,7 +283,8 @@ sub check_project {
 
         # get new project
         $form->{projectnumber} = $form->{"${prefix}projectnumber${suffix}"};
-        if (($rows = PE->projects(\%myconfig, $form)) > 1) {
+        my %params             = map { $_ => $form->{$_} } qw(projectnumber description active);
+        if (($rows = Projects->search_projects(%params)) > 1) {
 
           # check form->{project_list} how many there are
           $form->{rownumber} = $i;
index 5a617ba..8c6132e 100644 (file)
@@ -27,8 +27,7 @@
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #======================================================================
 #
-# project administration
-# partsgroup administration
+# partsgroup, pricegroup administration
 #
 #======================================================================
 
@@ -68,9 +67,6 @@ sub edit {
   #/show hhistory button
   $form->{title} = "Edit";
 
-  if ($form->{type} eq 'project') {
-    PE->get_project(\%myconfig, \%$form);
-  }
   if ($form->{type} eq 'partsgroup') {
     PE->get_partsgroup(\%myconfig, \%$form);
   }
@@ -88,33 +84,6 @@ sub search {
 
   $auth->assert('config');
 
-  if ($form->{type} eq 'project') {
-    $report        = "project_report";
-    $sort          = 'projectnumber';
-    $form->{title} = $locale->text('Projects');
-
-    $number = qq|
-       <tr>
-         <th align=right width=1%>| . $locale->text('Number') . qq|</th>
-         <td>| . $cgi->textfield('-name' => 'projectnumber', '-size' => 20) . qq|</td>
-       </tr>
-       <tr>
-         <th align=right>| . $locale->text('Description') . qq|</th>
-         <td>| . $cgi->textfield('-name' => 'description', '-size' => 60) . qq|</td>
-       </tr>
-  <tr>
-    <th>&nbsp;</th>
-    <td>| .
-    $cgi->radio_group('-name' => 'active', '-default' => 'active',
-                      '-values' => ['active', 'inactive', 'both'],
-                      '-labels' => { 'active' => ' ' . $locale->text("Active"),
-                                     'inactive' => ' ' . $locale->text("Inactive"),
-                                     'both' => ' ' . $locale->text("Both") })
-    . qq|</td>
-  </tr>
-|;
-
-  }
   if ($form->{type} eq 'partsgroup') {
     $report        = "partsgroup_report";
     $sort          = 'partsgroup';
@@ -192,273 +161,11 @@ sub search {
   $lxdebug->leave_sub();
 }
 
-sub project_report {
-  $lxdebug->enter_sub();
-
-  $auth->assert('config');
-
-  map { $form->{$_} = $form->unescape($form->{$_}) }
-    (projectnumber, description);
-  PE->projects(\%myconfig, \%$form);
-
-  $callback =
-    "$form->{script}?action=project_report&type=$form->{type}&status=$form->{status}&active=" .
-    E($form->{active});
-  $href = $callback;
-
-  if ($form->{status} eq 'all') {
-    $option = $locale->text('All');
-  }
-  if ($form->{status} eq 'orphaned') {
-    $option .= $locale->text('Orphaned');
-  }
-  if ($form->{projectnumber}) {
-    $href     .= "&projectnumber=" . $form->escape($form->{projectnumber});
-    $callback .= "&projectnumber=$form->{projectnumber}";
-    $option   .=
-      "\n<br>" . $locale->text('Project') . " : $form->{projectnumber}";
-  }
-  if ($form->{description}) {
-    $href     .= "&description=" . $form->escape($form->{description});
-    $callback .= "&description=$form->{description}";
-    $option   .=
-      "\n<br>" . $locale->text('Description') . " : $form->{description}";
-  }
-
-  @column_index = qw(projectnumber description);
-
-  push(@column_index, "active") if ("both" eq $form->{active});
-
-  $column_header{projectnumber} =
-      qq|<th><a class=listheading href=$href&sort=projectnumber>|
-    . $locale->text('Number')
-    . qq|</a></th>|;
-  $column_header{description} =
-      qq|<th><a class=listheading href=$href&sort=description>|
-    . $locale->text('Description')
-    . qq|</a></th>|;
-  $column_header{active} =
-      qq|<th class="listheading">| . $locale->text('Active') . qq|</th>|;
-
-  $form->{title} = $locale->text('Projects');
-
-  $form->header;
-
-  print qq|
-<body>
-
-<table width=100%>
-  <tr>
-    <th class=listtop>$form->{title}</th>
-  </tr>
-  <tr height="5"></tr>
-  <tr>
-    <td>$option</td>
-  </tr>
-  <tr>
-    <td>
-      <table width=100%>
-       <tr class=listheading>
-|;
-
-  map { print "$column_header{$_}\n" } @column_index;
-
-  print qq|
-        </tr>
-|;
-
-  # escape callback
-  $form->{callback} = $callback .= "&sort=$form->{sort}";
-
-  # escape callback for href
-  $callback = $form->escape($callback);
-
-  foreach $ref (@{ $form->{project_list} }) {
-
-    $i++;
-    $i %= 2;
-
-    print qq|
-        <tr valign=top class=listrow$i>
-|;
-
-    $column_data{projectnumber} =
-      qq|<td><a href=$form->{script}?action=edit&type=$form->{type}&status=$form->{status}&id=$ref->{id}&callback=$callback>$ref->{projectnumber}</td>|;
-    $column_data{description} = qq|<td>$ref->{description}&nbsp;</td>|;
-    $column_data{active} =
-      qq|<td>| .
-      ($ref->{active} ? $locale->text("Yes") : $locale->text("No")) .
-      qq|</td>|;
-
-    map { print "$column_data{$_}\n" } @column_index;
-
-    print "
-        </tr>
-";
-  }
-
-  print qq|
-      </table>
-    </td>
-  </tr>
-  <tr>
-    <td><hr size=3 noshade></td>
-  </tr>
-</table>
-
-<br>
-<form method=post action=$form->{script}>
-
-<input name=callback type=hidden value="$form->{callback}">
-
-<input type=hidden name=type value=$form->{type}>
-
-<input class=submit type=submit name=action value="|
-    . $locale->text('Add') . qq|">
-
-  </form>
-
-</body>
-</html>
-|;
-
-  $lxdebug->leave_sub();
-}
-
-sub form_project_header {
-  $lxdebug->enter_sub();
-
-  $auth->assert('config');
-
-  $form->{title} = $locale->text("$form->{title} Project");
-
-  # $locale->text('Add Project')
-  # $locale->text('Edit Project')
-
-  $form->{description} =~ s/\"/&quot;/g;
-
-  my $projectnumber =
-    $cgi->textfield('-name' => 'projectnumber', '-size' => 20,
-                    '-default' => $form->{projectnumber});
-
-  my $description;
-  if (($rows = $form->numtextrows($form->{description}, 60)) > 1) {
-    $description =
-      $cgi->textarea('-name' => 'description', '-rows' => $rows, '-cols' => 60,
-                     '-style' => 'width: 100%', '-wrap' => 'soft',
-                     '-default' => $form->{description});
-  } else {
-    $description =
-      $cgi->textfield('-name' => 'description', '-size' => 60,
-                      '-default' => $form->{description});
-  }
-
-  my $active;
-  if ($form->{id}) {
-    $active =
-      qq|
-  <tr>
-    <th>&nbsp;</th>
-    <td>| .
-      $cgi->radio_group('-name' => 'active',
-                        '-values' => [1, 0],
-                        '-default' => $form->{active} * 1,
-                        '-labels' => { 1 => $locale->text("Active"),
-                                       0 => $locale->text("Inactive") })
-      . qq|</td>
-  </tr>
-|;
-  }
-
-  $form->header;
-
-  print qq|
-<body>
-
-<form method=post action=$form->{script}>
-
-<input type=hidden name=id value=$form->{id}>
-<input type=hidden name=type value=project>
-
-<table width=100%>
-  <tr>
-    <th class=listtop>$form->{title}</th>
-  </tr>
-  <tr height="5"></tr>
-  <tr>
-    <td>
-      <table>
-       <tr>
-         <th align=right>| . $locale->text('Number') . qq|</th>
-         <td>$projectnumber</td>
-       </tr>
-       <tr>
-         <th align=right>| . $locale->text('Description') . qq|</th>
-         <td>$description</td>
-       </tr>
-      $active
-      </table>
-    </td>
-  </tr>
-  <tr>
-    <td colspan=2><hr size=3 noshade></td>
-  </tr>
-</table>
-|;
-
-  $lxdebug->leave_sub();
-}
-
-sub form_project_footer {
-  $lxdebug->enter_sub();
-
-  $auth->assert('config');
-
-  print qq|
-
-<input name=callback type=hidden value="$form->{callback}">
-
-<br><input type=submit class=submit name=action value="|
-    . $locale->text('Save') . qq|">
-|;
-
-  if ($form->{id} && $form->{orphaned}) {
-    print qq|
-<input type=submit class=submit name=action value="|
-      . $locale->text('Delete') . qq|">|;
-  }
-
-  if ($form->{id}) {
-    # button for saving history
-    print qq|
-      <input type=button onclick=set_history_window(|
-      . $form->{id}
-      . qq|); name=history id=history value=|
-      . $locale->text('history')
-      . qq|>|;
-    # /button for saving history
-  }
-
-  print qq|
-</form>
-
-</body>
-</html>
-|;
-
-  $lxdebug->leave_sub();
-}
-
 sub save {
   $lxdebug->enter_sub();
 
   $auth->assert('config');
 
-  if ($form->{type} eq 'project') {
-    $form->isblank("projectnumber", $locale->text('Project Number missing!'));
-    PE->save_project(\%myconfig, \%$form);
-    $form->redirect($locale->text('Project saved!'));
-  }
   if ($form->{type} eq 'partsgroup') {
     $form->isblank("partsgroup", $locale->text('Group missing!'));
     PE->save_partsgroup(\%myconfig, \%$form);
@@ -489,9 +196,6 @@ sub delete {
 
   PE->delete_tuple(\%myconfig, \%$form);
 
-  if ($form->{type} eq 'project') {
-    $form->redirect($locale->text('Project deleted!'));
-  }
   if ($form->{type} eq 'partsgroup') {
     $form->redirect($locale->text('Group deleted!'));
   }
diff --git a/bin/mozilla/projects.pl b/bin/mozilla/projects.pl
new file mode 100644 (file)
index 0000000..768a212
--- /dev/null
@@ -0,0 +1,232 @@
+#=====================================================================
+# LX-Office ERP
+# Copyright (C) 2004
+# Based on SQL-Ledger Version 2.1.9
+# Web http://www.lx-office.org
+#
+#=====================================================================
+# SQL-Ledger Accounting
+# Copyright (c) 1998-2002
+#
+#  Author: Dieter Simader
+#   Email: dsimader@sql-ledger.org
+#     Web: http://www.sql-ledger.org
+#
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#======================================================================
+#
+# project administration
+#======================================================================
+
+use POSIX qw(strftime);
+
+use SL::Projects;
+use SL::ReportGenerator;
+
+require "bin/mozilla/common.pl";
+require "bin/mozilla/reportgenerator.pl";
+
+sub add {
+  $lxdebug->enter_sub();
+
+  $auth->assert('project_edit');
+
+  # construct callback
+  $form->{callback} = build_std_url('action') unless $form->{callback};
+
+  display_project_form();
+
+  $lxdebug->leave_sub();
+}
+
+sub edit {
+  $lxdebug->enter_sub();
+
+  $auth->assert('project_edit');
+
+  # show history button
+  $form->{javascript} = qq|<script type="text/javascript" src="js/show_history.js"></script>|;
+  #/show hhistory button
+  $form->{title} = "Edit";
+
+  $form->{project} = Projects->get_project('id' => $form->{id}, 'orphaned' => 1);
+
+  display_project_form();
+
+  $lxdebug->leave_sub();
+}
+
+sub search {
+  $lxdebug->enter_sub();
+
+  $auth->assert('project_edit');
+
+  $form->{title} = $locale->text('Projects');
+
+  $form->header();
+  print $form->parse_html_template('projects/search');
+
+  $lxdebug->leave_sub();
+}
+
+sub project_report {
+  $lxdebug->enter_sub();
+
+  $auth->assert('project_edit');
+
+  $form->{sort} ||= 'projectnumber';
+
+  my $filter      = $form->{filter} || { };
+  Projects->search_projects(%{ $filter }, 'sort' => $form->{sort});
+
+  my $report      = SL::ReportGenerator->new(\%myconfig, $form);
+
+  my @columns     = qw(projectnumber description active);
+  my @hidden_vars = ('filter');
+  my $href        = build_std_url('action=project_report', @hidden_vars);
+
+  my %column_defs = (
+    'projectnumber'            => { 'text' => $locale->text('Number'), },
+    'description'              => { 'text' => $locale->text('Description'), },
+    'active'                   => { 'text' => $locale->text('Active'), 'visible' => 'both' eq $filter->{active}, },
+    );
+
+  foreach (qw(projectnumber description)) {
+    $column_defs{$_}->{link}    = $href . "&sort=$_";
+    $column_defs{$_}->{visible} = 1;
+  }
+
+  $report->set_columns(%column_defs);
+  $report->set_column_order(@columns);
+
+  $report->set_export_options('project_report', @hidden_vars);
+
+  $report->set_sort_indicator($form->{sort}, 1);
+
+  my @options;
+  push @options, $locale->text('All')                                            if ($filter->{all});
+  push @options, $locale->text('Orphaned')                                       if ($filter->{orphaned});
+  push @options, $locale->text('Project Number') . " : $filter->{projectnumber}" if ($filter->{projectnumber});
+  push @options, $locale->text('Description') . " : $filter->{description}"      if ($filter->{description});
+  push @options, $locale->text('Active')                                         if ($filter->{active} eq 'active');
+  push @options, $locale->text('Inactive')                                       if ($filter->{active} eq 'inactive');
+  push @options, $locale->text('Orphaned')                                       if ($filter->{status} eq 'orphaned');
+
+  $form->{title} = $locale->text('Projects');
+
+  $report->set_options('top_info_text'       => join("\n", @options),
+                       'output_format'       => 'HTML',
+                       'title'               => $form->{title},
+                       'attachment_basename' => $locale->text('project_list') . strftime('_%Y%m%d', localtime time),
+    );
+  $report->set_options_from_form();
+
+  my $edit_url = build_std_url('action=edit&type=project');
+  my $callback = $form->escape($href) . '&sort=' . E($form->{sort});
+
+  foreach $project (@{ $form->{project_list} }) {
+    $project->{active} = $project->{active} ? $locale->text('Yes')  : $locale->text('No');
+
+    my $row = { map { $_ => { 'data' => $project->{$_} } } keys %{ $project } };
+
+    $row->{projectnumber}->{link} = $edit_url . "&id=" . E($project->{id}) . "&callback=${callback}";
+
+    $report->add_data($row);
+  }
+
+  $report->generate_with_headers();
+
+  $lxdebug->leave_sub();
+}
+
+sub display_project_form {
+  $lxdebug->enter_sub();
+
+  $auth->assert('project_edit');
+
+  $form->{project} ||= { };
+
+  $form->{title}     = $form->{project}->{id} ? $locale->text("Edit Project") : $locale->text("Add Project");
+
+  $form->header();
+  print $form->parse_html_template('projects/project_form');
+
+  $lxdebug->leave_sub();
+}
+
+sub save {
+  $lxdebug->enter_sub();
+
+  $auth->assert('project_edit');
+
+  $form->isblank("project.projectnumber", $locale->text('Project Number missing!'));
+
+  my $project    = $form->{project} || { };
+  my $is_new     = !$project->{id};
+  $project->{id} = Projects->save_project(%{ $project });
+
+  # saving the history
+  if(!exists $form->{addition} && $project->{id} ne "") {
+    $form->{id}       = $project->{id};
+    $form->{snumbers} = qq|projectnumber_| . $project->{projectnumber};
+       $form->{addition} = "SAVED";
+       $form->save_history($form->dbconnect(\%myconfig));
+  }
+  # /saving the history
+
+  if ($form->{callback}) {
+    map { $form->{callback} .= "&new_${_}=" . $form->escape($project->{$_}); } qw(projectnumber description id);
+    my $message              = $is_new ? $locale->text('The project has been added.') : $locale->text('The project has been saved.');
+    $form->{callback}       .= "&message="  . E($message);
+  }
+
+  $form->redirect($locale->text('Project saved!'));
+
+  $lxdebug->leave_sub();
+}
+
+sub save_as_new {
+  $lxdebug->enter_sub();
+
+  delete $form->{project}->{id} if ($form->{project});
+  save();
+
+  $lxdebug->leave_sub();
+}
+
+sub delete {
+  $lxdebug->enter_sub();
+
+  $auth->assert('project_edit');
+
+  my $project = $form->{project} || { };
+  Projects->delete_project('id' => $project->{id});
+
+  # saving the history
+  if(!exists $form->{addition}) {
+    $form->{snumbers} = qq|projectnumber_| . $project->{projectnumber};
+       $form->{addition} = "DELETED";
+       $form->save_history($form->dbconnect(\%myconfig));
+  }
+  # /saving the history
+
+  $form->redirect($locale->text('Project deleted!'));
+
+  $lxdebug->leave_sub();
+}
+
+sub continue {
+  call_sub($form->{nextsub});
+}
index 04b2a5a..9e76a5a 100644 (file)
@@ -237,7 +237,7 @@ aktualisieren wollen?',
   'Body:'                       => 'Text:',
   'Books are open'              => 'Die Bücher sind geöffnet.',
   'Boolean variables: If the default value is non-empty then the checkbox will be checked by default and unchecked otherwise.' => 'Ja/Nein-Variablen: Wenn der Standardwert nicht leer ist, so wird die Checkbox standardm&auml;&szlig;ig angehakt.',
-  'Both'                        => 'Sowohl als auch',
+  'Both'                        => 'Beide',
   'Bottom'                      => 'Unten',
   'Bought'                      => 'Gekauft',
   'Buchungsdatum'               => 'Buchungsdatum',
@@ -1407,6 +1407,8 @@ aktualisieren wollen?',
   'The pg_restore process could not be started.' => 'Der pg_restore-Prozess konnte nicht gestartet werden.',
   'The preferred one is to install packages provided by your operating system distribution (e.g. Debian or RPM packages).' => 'Die bevorzugte Art, ein Perl-Modul zu installieren, ist durch Installation eines von Ihrem Betriebssystem zur Verf&uuml;gung gestellten Paketes (z.B. Debian-Pakete oder RPM).',
   'The program\'s exit code was [% HTML.escape(retval) %] (&quot;0&quot; usually means that everything went OK).' => 'Der Exitcode des Programms war [% HTML.escape(retval) %] (&quot;0&quot; bedeutet normalerweise, dass die Wiederherstellung erfolgreich war).',
+  'The project has been added.' => 'Das Projekt wurde erfasst.',
+  'The project has been saved.' => 'Das Projekt wurde gespeichert.',
   'The restoration process has started. Here\'s the output of the &quot;pg_restore&quot; command:' => 'Der Wiederherstellungsprozess wurde gestartet. Hier ist die Ausgabe des &quot;pg_restore&quot;-Programmes:',
   'The restoration process is complete. Please review &quot;pg_restore&quot;\'s output to find out if the restoration was successful.' => 'Die Wiederherstellung ist abgeschlossen. Bitte sehen Sie sich die Ausgabe von &quot;pg_restore&quot; an, um festzustellen, ob die Wiederherstellung erfolgreich war.',
   'The second way is to use Perl\'s CPAN module and let it download and install the module for you.' => 'Die zweite Variante besteht darin, Perls CPAN-Modul zu benutzen und es das Modul f&uuml;r Sie installieren zu lassen.',
@@ -1688,6 +1690,7 @@ aktualisieren wollen?',
   'prices updated!'             => ' Preise aktualisiert!',
   'print'                       => 'drucken',
   'proforma'                    => 'Proforma',
+  'project_list'                => 'projektliste',
   'purchase_delivery_order_list' => 'lieferscheinliste_einkauf',
   'purchase_order'              => 'Auftrag',
   'purchase_order_list'         => 'lieferantenauftragsliste',
index d230592..f09932f 100644 (file)
@@ -4,11 +4,9 @@ $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
   'AR'                          => 'Verkauf',
-  'Active'                      => 'Aktiv',
   'Add'                         => 'Erfassen',
   'Add Group'                   => 'Warengruppe erfassen',
   'Add Pricegroup'              => 'Preisgruppe erfassen',
-  'Add Project'                 => 'Projekt erfassen',
   'Address'                     => 'Adresse',
   'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'All'                         => 'Alle',
@@ -17,7 +15,6 @@ $self->{texts} = {
   'Bcc'                         => 'Bcc',
   'Bin List'                    => 'Lagerliste',
   'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
-  'Both'                        => 'Sowohl als auch',
   'CANCELED'                    => 'Storniert',
   'Cc'                          => 'Cc',
   'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
@@ -47,12 +44,10 @@ $self->{texts} = {
   'Delete'                      => 'Löschen',
   'Delivery Order'              => 'Lieferschein',
   'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
-  'Description'                 => 'Beschreibung',
   'Directory'                   => 'Verzeichnis',
   'ELSE'                        => 'Zusatz',
   'Edit Group'                  => 'Warengruppe editieren',
   'Edit Pricegroup'             => 'Preisgruppe bearbeiten',
-  'Edit Project'                => 'Projekt bearbeiten',
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
@@ -63,7 +58,6 @@ $self->{texts} = {
   'Group saved!'                => 'Warengruppe gespeichert!',
   'Groups'                      => 'Warengruppen',
   'History'                     => 'Historie',
-  'Inactive'                    => 'Inaktiv',
   'Invoice'                     => 'Rechnung',
   'MAILED'                      => 'Gesendet',
   'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
@@ -77,7 +71,6 @@ $self->{texts} = {
   'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.',
   'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
   'Name'                        => 'Name',
-  'No'                          => 'Nein',
   'No %s was found matching the search parameters.' => 'Es wurde kein %s gefunden, auf den die Suchparameter zutreffen.',
   'No Customer was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Endkunde gefunden',
   'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
@@ -85,7 +78,6 @@ $self->{texts} = {
   'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
   'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
   'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
-  'Number'                      => 'Nummer',
   'Orphaned'                    => 'Nie benutzt',
   'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
@@ -103,11 +95,6 @@ $self->{texts} = {
   'Pricegroup missing!'         => 'Preisgruppe fehlt!',
   'Pricegroup saved!'           => 'Preisgruppe gespeichert!',
   'Proforma Invoice'            => 'Proformarechnung',
-  'Project'                     => 'Projekt',
-  'Project Number missing!'     => 'Projektnummer fehlt!',
-  'Project deleted!'            => 'Projekt gelöscht!',
-  'Project saved!'              => 'Projekt gespeichert!',
-  'Projects'                    => 'Projekte',
   'Purchase Order'              => 'Lieferantenauftrag',
   'Quotation'                   => 'Angebot',
   'RFQ'                         => 'Anfrage',
@@ -142,7 +129,6 @@ $self->{texts} = {
   'Vendor details'              => 'Lieferantendetails',
   'View warehouse content'      => 'Lagerbestand ansehen',
   'Warehouse management'        => 'Lagerverwaltung/Bestandsveränderung',
-  'Yes'                         => 'Ja',
   'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
@@ -183,14 +169,11 @@ $self->{subs} = {
   'form_partsgroup_header'      => 'form_partsgroup_header',
   'form_pricegroup_footer'      => 'form_pricegroup_footer',
   'form_pricegroup_header'      => 'form_pricegroup_header',
-  'form_project_footer'         => 'form_project_footer',
-  'form_project_header'         => 'form_project_header',
   'format_dates'                => 'format_dates',
   'mark_as_paid_common'         => 'mark_as_paid_common',
   'part_selection_internal'     => 'part_selection_internal',
   'partsgroup_report'           => 'partsgroup_report',
   'pricegroup_report'           => 'pricegroup_report',
-  'project_report'              => 'project_report',
   'reformat_numbers'            => 'reformat_numbers',
   'retrieve_partunits'          => 'retrieve_partunits',
   'save'                        => 'save',
diff --git a/locale/de/projects b/locale/de/projects
new file mode 100644 (file)
index 0000000..93bdf2c
--- /dev/null
@@ -0,0 +1,202 @@
+#!/usr/bin/perl
+
+$self->{texts} = {
+  'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AR'                          => 'Verkauf',
+  'Active'                      => 'Aktiv',
+  'Add Project'                 => 'Projekt erfassen',
+  'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All'                         => 'Alle',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Summen- u. Saldenliste, GuV, BWA, Bilanz, Projektbuchungen)',
+  'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
+  'Bcc'                         => 'Bcc',
+  'Bin List'                    => 'Lagerliste',
+  'Binding to the LDAP server as "#1" failed. Please check config/authentication.pl.' => 'Die Anmeldung am LDAP-Server als "#1" schlug fehl. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'CANCELED'                    => 'Storniert',
+  'CSV export -- options'       => 'CSV-Export -- Optionen',
+  'Cc'                          => 'Cc',
+  'Change Lx-Office installation settings (all menu entries beneath \'System\')' => 'Ver&auml;ndern der Lx-Office-Installationseinstellungen (Men&uuml;punkte unterhalb von \'System\')',
+  'Confirmation'                => 'Auftragsbestätigung',
+  'Contact'                     => 'Kontakt',
+  'Could not spawn html2ps or GhostScript.' => 'html2ps oder GhostScript konnte nicht gestartet werden.',
+  'Could not spawn the printer command.' => 'Die Druckanwendung konnte nicht gestartet werden.',
+  'Could not write the html2ps config file.' => 'Die tempor&auml;re html2ps-Konfigurationsdatei konnte nicht geschrieben werden.',
+  'Could not write the temporary HTML file.' => 'Eine tempor&auml;re HTML-Datei konnte nicht geschrieben werden.',
+  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
+  'Create and edit customers and vendors' => 'Kunden und Lieferanten erfassen und bearbeiten',
+  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
+  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
+  'Create and edit parts, services, assemblies' => 'Artikel, Dienstleistungen, Erzeugnisse erfassen und bearbeiten',
+  'Create and edit projects'    => 'Projekte erfassen und bearbeiten',
+  'Create and edit purchase delivery orders' => 'Lieferscheine von Lieferanten erfassen und bearbeiten',
+  'Create and edit purchase orders' => 'Lieferantenauftr&auml;ge erfassen und bearbeiten',
+  'Create and edit sales delivery orders' => 'Lieferscheine f&uuml;r Kunden erfassen und bearbeiten',
+  'Create and edit sales orders' => 'Auftragsbest&auml;tigungen erfassen und bearbeiten',
+  'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
+  'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
+  'Credit Note'                 => 'Gutschrift',
+  'Customer Number'             => 'Kundennummer',
+  'Customer details'            => 'Kundendetails',
+  'DATEV Export'                => 'DATEV-Export',
+  'DELETED'                     => 'Gelöscht',
+  'DUNNING STARTED'             => 'Mahnprozess gestartet',
+  'Dataset upgrade'             => 'Datenbankaktualisierung',
+  'Date'                        => 'Datum',
+  'Delivery Order'              => 'Lieferschein',
+  'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
+  'Description'                 => 'Beschreibung',
+  'Directory'                   => 'Verzeichnis',
+  'ELSE'                        => 'Zusatz',
+  'Edit Project'                => 'Projekt bearbeiten',
+  'Enter longdescription'       => 'Langtext eingeben',
+  'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
+  'File'                        => 'Datei',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
+  'History'                     => 'Historie',
+  'Inactive'                    => 'Inaktiv',
+  'Invoice'                     => 'Rechnung',
+  'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
+  'Mark as paid?'               => 'Als bezahlt markieren?',
+  'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
+  'Message'                     => 'Nachricht',
+  'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
+  'Missing \'tag\' field.'      => 'Fehlendes Feld \'tag\'.',
+  'Missing parameter #1 in call to sub #2.' => 'Fehlernder Parameter \'#1\' in Funktionsaufruf \'#2\'.',
+  'More than one control file with the tag \'%s\' exist.' => 'Es gibt mehr als eine Kontrolldatei mit dem Tag \'%s\'.',
+  'Name'                        => 'Name',
+  'No'                          => 'Nein',
+  'No %s was found matching the search parameters.' => 'Es wurde kein %s gefunden, auf den die Suchparameter zutreffen.',
+  'No Customer was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Endkunde gefunden',
+  'No Vendor was found matching the search parameters.' => 'Zu dem Suchbegriff wurde kein Händler gefunden',
+  'No customer has been selected yet.' => 'Es wurde noch kein Kunde ausgewählt.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
+  'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
+  'No vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'Number'                      => 'Nummer',
+  'Orphaned'                    => 'Nie benutzt',
+  'Others'                      => 'Andere',
+  'PAYMENT POSTED'              => 'Rechung gebucht',
+  'PDF export -- options'       => 'PDF-Export -- Optionen',
+  'POSTED'                      => 'Gebucht',
+  'POSTED AS NEW'               => 'Als neu gebucht',
+  'PRINTED'                     => 'Gedruckt',
+  'Packing List'                => 'Lieferschein',
+  'Part Number'                 => 'Artikelnummer',
+  'Part description'            => 'Artikelbeschreibung',
+  'Pick List'                   => 'Sammelliste',
+  'Please enter values'         => 'Bitte Werte eingeben',
+  'Proforma Invoice'            => 'Proformarechnung',
+  'Project Number'              => 'Projektnummer',
+  'Project Number missing!'     => 'Projektnummer fehlt!',
+  'Project deleted!'            => 'Projekt gelöscht!',
+  'Project saved!'              => 'Projekt gespeichert!',
+  'Projects'                    => 'Projekte',
+  'Purchase Order'              => 'Lieferantenauftrag',
+  'Quotation'                   => 'Angebot',
+  'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reports'                     => 'Berichte',
+  'SAVED'                       => 'Gespeichert',
+  'SAVED FOR DUNNING'           => 'Gespeichert',
+  'SCREENED'                    => 'Angezeigt',
+  'Select a Customer'           => 'Endkunde auswählen',
+  'Select a customer'           => 'Einen Kunden ausw&auml;hlen',
+  'Select a part'               => 'Artikel ausw&auml;hlen',
+  'Select a vendor'             => 'Einen Lieferanten ausw&auml;hlen',
+  'Storno Invoice'              => 'Stornorechnung',
+  'Storno Packing List'         => 'Stornolieferschein',
+  'Subject'                     => 'Betreff',
+  'The \'tag\' field must only consist of alphanumeric characters or the carachters - _ ( )' => 'Das Feld \'tag\' darf nur aus alphanumerischen Zeichen und den Zeichen - _ ( ) bestehen.',
+  'The LDAP server "#1:#2" is unreachable. Please check config/authentication.pl.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The config file "config/authentication.pl" contained invalid Perl code:' => 'Die Konfigurationsdatei "config/authentication.pl" enthielt ung&uuml;tigen Perl-Code:',
+  'The config file "config/authentication.pl" was not found.' => 'Die Konfigurationsdatei "config/authentication.pl" wurde nicht gefunden.',
+  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/authentication.pl.' => 'Die Verbindung zum LDAP-Server kann nicht verschl&uuml;sselt werden (Fehler bei SSL/TLS-Initialisierung). Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/authentication.pl.',
+  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
+  'The connection to the template database failed:' => 'Die Verbindung zur Vorlagendatenbank schlug fehl:',
+  'The creation of the authentication database failed:' => 'Das Anlegen der Authentifizierungsdatenbank schlug fehl:',
+  'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
+  'The project has been added.' => 'Das Projekt wurde erfasst.',
+  'The project has been saved.' => 'Das Projekt wurde gespeichert.',
+  'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
+  'Trying to call a sub without a name' => 'Es wurde versucht, eine Unterfunktion ohne Namen aufzurufen.',
+  'Unit'                        => 'Einheit',
+  'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
+  'Value'                       => 'Wert',
+  'Variable'                    => 'Variable',
+  'Vendor details'              => 'Lieferantendetails',
+  'View warehouse content'      => 'Lagerbestand ansehen',
+  'Warehouse management'        => 'Lagerverwaltung/Bestandsveränderung',
+  'Yes'                         => 'Ja',
+  'You do not have the permissions to access this function.' => 'Sie verf&uuml;gen nicht &uuml;ber die notwendigen Rechte, um auf diese Funktion zuzugreifen.',
+  '[email]'                     => '[email]',
+  'bin_list'                    => 'Lagerliste',
+  'config/authentication.pl: Key "DB_config" is missing.' => 'config/authentication.pl: Das Schl&uuml;sselwort "DB_config" fehlt.',
+  'config/authentication.pl: Key "LDAP_config" is missing.' => 'config/authentication.pl: Der Schl&uuml;ssel "LDAP_config" fehlt.',
+  'config/authentication.pl: Missing parameters in "DB_config". Required parameters are "host", "db" and "user".' => 'config/authentication.pl: Fehlende Parameter in "DB_config". Ben&ouml;tigte Parameter sind "host", "db" und "user".',
+  'config/authentication.pl: Missing parameters in "LDAP_config". Required parameters are "host", "attribute" and "base_dn".' => 'config/authentication.pl: Fehlende Parameter in "LDAP_config". Ben&ouml;tigt werden "host", "attribute" und "base_dn".',
+  'customer'                    => 'Kunde',
+  'invoice'                     => 'Rechnung',
+  'no'                          => 'nein',
+  'packing_list'                => 'Versandliste',
+  'pick_list'                   => 'Entnahmeliste',
+  'proforma'                    => 'Proforma',
+  'project_list'                => 'projektliste',
+  'purchase_order'              => 'Auftrag',
+  'report_generator_dispatch_to is not defined.' => 'report_generator_dispatch_to ist nicht definiert.',
+  'report_generator_nextsub is not defined.' => 'report_generator_nextsub ist nicht definiert.',
+  'request_quotation'           => 'Angebotsanforderung',
+  'sales_order'                 => 'Kundenauftrag',
+  'sales_quotation'             => 'Verkaufsangebot',
+  'vendor'                      => 'Lieferant',
+  'yes'                         => 'ja',
+};
+
+$self->{subs} = {
+  'E'                           => 'E',
+  'H'                           => 'H',
+  'NTI'                         => 'NTI',
+  'Q'                           => 'Q',
+  'add'                         => 'add',
+  'build_std_url'               => 'build_std_url',
+  'calculate_qty'               => 'calculate_qty',
+  'call_sub'                    => 'call_sub',
+  'continue'                    => 'continue',
+  'cov_selection_internal'      => 'cov_selection_internal',
+  'delete'                      => 'delete',
+  'delivery_customer_selection' => 'delivery_customer_selection',
+  'display_project_form'        => 'display_project_form',
+  'edit'                        => 'edit',
+  'format_dates'                => 'format_dates',
+  'mark_as_paid_common'         => 'mark_as_paid_common',
+  'part_selection_internal'     => 'part_selection_internal',
+  'project_report'              => 'project_report',
+  'reformat_numbers'            => 'reformat_numbers',
+  'report_generator_back'       => 'report_generator_back',
+  'report_generator_dispatcher' => 'report_generator_dispatcher',
+  'report_generator_do'         => 'report_generator_do',
+  'report_generator_export_as_csv' => 'report_generator_export_as_csv',
+  'report_generator_export_as_pdf' => 'report_generator_export_as_pdf',
+  'retrieve_partunits'          => 'retrieve_partunits',
+  'save'                        => 'save',
+  'save_as_new'                 => 'save_as_new',
+  'search'                      => 'search',
+  'select_part'                 => 'select_part',
+  'select_part_internal'        => 'select_part_internal',
+  'set_longdescription'         => 'set_longdescription',
+  'show_history'                => 'show_history',
+  'show_vc_details'             => 'show_vc_details',
+  'vendor_selection'            => 'vendor_selection',
+  'weiter'                      => 'continue',
+  'löschen'                     => 'delete',
+  'neue_ware'                   => 'new_part',
+  'speichern'                   => 'save',
+  'als_neu_speichern'           => 'save_as_new',
+};
+
+1;
index c2bcf05..b073842 100644 (file)
--- a/menu.ini
+++ b/menu.ini
@@ -32,9 +32,8 @@ item=assembly
 
 [Master Data--Add Project]
 ACCESS=project_edit
-module=pe.pl
+module=projects.pl
 action=add
-type=project
 
 [Master Data--Update Prices]
 ACCESS=part_service_assembly_edit
@@ -85,9 +84,8 @@ searchitems=assembly
 
 [Master Data--Reports--Projects]
 ACCESS=project_edit
-module=pe.pl
+module=projects.pl
 action=search
-type=project
 
 [Master Data--Reports--Projecttransactions]
 ACCESS=report
diff --git a/projects.pl b/projects.pl
new file mode 120000 (symlink)
index 0000000..385000d
--- /dev/null
@@ -0,0 +1 @@
+am.pl
\ No newline at end of file
diff --git a/templates/webpages/projects/project_form_de.html b/templates/webpages/projects/project_form_de.html
new file mode 100644 (file)
index 0000000..231797b
--- /dev/null
@@ -0,0 +1,63 @@
+[% USE HTML %][% USE LxERP %]<body>
+
+ [%- IF message %]
+ <p>[% message %]</p>
+
+ <hr>
+ [%- END %]
+
+ <form method="post" action="projects.pl">
+
+  <input type="hidden" name="project.id" value="[% HTML.escape(project.id) %]">
+
+  <div class="listtop">[% title %]</div>
+
+  <p>
+   <table>
+    <tr>
+     <th align="right">Nummer</th>
+     <td><input name="project.projectnumber" size="20" value="[% HTML.escape(project.projectnumber) %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right">Beschreibung</th>
+     <td>
+      [%- SET rows = LxERP.numtextrows(project.description, 60) %]
+      [%- IF rows > 1 %]
+      <textarea name="project.description" rows="rows" cols="60" style="width: 100%" wrap="soft">[% HTML.escape(project.description) %]</textarea>
+      [%- ELSE %]
+      <input name="project.description" size="60" value="[% HTML.escape(project.description) %]">
+      [%- END %]
+     </td>
+    </tr>
+
+    [%- IF project.id %]
+    <tr>
+     <th align="right">&nbsp;</th>
+     <td>
+      <input type="radio" name="project.active" id="active_1" value="1"[% IF project.active %] checked[% END %]><label for="active_1">Aktiv</label>
+      <input type="radio" name="project.active" id="active_0" value="0"[% IF !project.active %] checked[% END %]><label for="active_0">Inaktiv</label>
+     </td>
+    </tr>
+    [%- END %]
+   </table>
+  </p>
+
+  <p><hr size="3" noshade></p>
+
+  <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
+
+  <p>
+   <input type="submit" class="submit" name="action" value="Speichern">
+   [%- IF project.id %]
+   <input type="submit" class="submit" name="action" value="als neu speichern">
+   [%- IF project.orphaned %]
+   <input type="submit" class="submit" name="action" value="Löschen">
+   [%- END %]
+   <input type="button" onclick="set_history_window([% HTML.escape(project.id) %]);" name="history" id="history" value="Historie">
+   [%- END %]
+  </p>
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/projects/project_form_master.html b/templates/webpages/projects/project_form_master.html
new file mode 100644 (file)
index 0000000..c299818
--- /dev/null
@@ -0,0 +1,63 @@
+[% USE HTML %][% USE LxERP %]<body>
+
+ [%- IF message %]
+ <p>[% message %]</p>
+
+ <hr>
+ [%- END %]
+
+ <form method="post" action="projects.pl">
+
+  <input type="hidden" name="project.id" value="[% HTML.escape(project.id) %]">
+
+  <div class="listtop">[% title %]</div>
+
+  <p>
+   <table>
+    <tr>
+     <th align="right"><translate>Number</translate></th>
+     <td><input name="project.projectnumber" size="20" value="[% HTML.escape(project.projectnumber) %]"></td>
+    </tr>
+
+    <tr>
+     <th align="right"><translate>Description</translate></th>
+     <td>
+      [%- SET rows = LxERP.numtextrows(project.description, 60) %]
+      [%- IF rows > 1 %]
+      <textarea name="project.description" rows="rows" cols="60" style="width: 100%" wrap="soft">[% HTML.escape(project.description) %]</textarea>
+      [%- ELSE %]
+      <input name="project.description" size="60" value="[% HTML.escape(project.description) %]">
+      [%- END %]
+     </td>
+    </tr>
+
+    [%- IF project.id %]
+    <tr>
+     <th align="right">&nbsp;</th>
+     <td>
+      <input type="radio" name="project.active" id="active_1" value="1"[% IF project.active %] checked[% END %]><label for="active_1"><translate>Active</translate></label>
+      <input type="radio" name="project.active" id="active_0" value="0"[% IF !project.active %] checked[% END %]><label for="active_0"><translate>Inactive</translate></label>
+     </td>
+    </tr>
+    [%- END %]
+   </table>
+  </p>
+
+  <p><hr size="3" noshade></p>
+
+  <input name="callback" type="hidden" value="[% HTML.escape(callback) %]">
+
+  <p>
+   <input type="submit" class="submit" name="action" value="<translate>Save</translate>">
+   [%- IF project.id %]
+   <input type="submit" class="submit" name="action" value="<translate>Save as new</translate>">
+   [%- IF project.orphaned %]
+   <input type="submit" class="submit" name="action" value="<translate>Delete</translate>">
+   [%- END %]
+   <input type="button" onclick="set_history_window([% HTML.escape(project.id) %]);" name="history" id="history" value="<translate>history</translate>">
+   [%- END %]
+  </p>
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/projects/search_de.html b/templates/webpages/projects/search_de.html
new file mode 100644 (file)
index 0000000..94bd529
--- /dev/null
@@ -0,0 +1,52 @@
+[% USE HTML %]<body>
+
+ <form method="post" action="projects.pl">
+
+  <div class="listtop">[% title %]</div>
+
+  <p>
+   <table>
+    <tr>
+     <th align="right">Nummer</th>
+     <td><input name="filter.projectnumber" size="20"></td>
+    </tr>
+
+    <tr>
+     <th align="right">Beschreibung</th>
+     <td><input name="filter.description" size="60"></td>
+    </tr>
+
+    <tr>
+     <th>&nbsp;</th>
+     <td>
+      <input type="radio" name="filter.active" id="active_active" value="active" checked>
+      <label for="active_active">Aktiv</label>
+      <input type="radio" name="filter.active" id="active_inactive" value="inactive">
+      <label for="active_inactive">Inaktiv</label>
+      <input type="radio" name="filter.active" id="active_both" value="both">
+      <label for="active_both">Beide</label>
+     </td>
+    </tr>
+
+    <tr>
+     <td>&nbsp;</td>
+     <td>
+      <input type="radio" name="filter.status" id="status_all" value="all" checked>
+      <label for="status_all">Alle</label>
+      <input type="radio" name="filter.status" id="status_orphaned" value="orphaned">
+      <label for="status_orphaned">Nie benutzt</label>
+    </tr>
+   </table>
+  </p>
+
+  <hr size="3" noshade>
+
+  <input type="hidden" name="nextsub" value="project_report">
+
+  <p>
+   <input class="submit" type="submit" name="action" value="Weiter">
+  </p>
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/projects/search_master.html b/templates/webpages/projects/search_master.html
new file mode 100644 (file)
index 0000000..4f41383
--- /dev/null
@@ -0,0 +1,52 @@
+[% USE HTML %]<body>
+
+ <form method="post" action="projects.pl">
+
+  <div class="listtop">[% title %]</div>
+
+  <p>
+   <table>
+    <tr>
+     <th align="right"><translate>Number</translate></th>
+     <td><input name="filter.projectnumber" size="20"></td>
+    </tr>
+
+    <tr>
+     <th align="right"><translate>Description</translate></th>
+     <td><input name="filter.description" size="60"></td>
+    </tr>
+
+    <tr>
+     <th>&nbsp;</th>
+     <td>
+      <input type="radio" name="filter.active" id="active_active" value="active" checked>
+      <label for="active_active"><translate>Active</translate></label>
+      <input type="radio" name="filter.active" id="active_inactive" value="inactive">
+      <label for="active_inactive"><translate>Inactive</translate></label>
+      <input type="radio" name="filter.active" id="active_both" value="both">
+      <label for="active_both"><translate>Both</translate></label>
+     </td>
+    </tr>
+
+    <tr>
+     <td>&nbsp;</td>
+     <td>
+      <input type="radio" name="filter.status" id="status_all" value="all" checked>
+      <label for="status_all"><translate>All</translate></label>
+      <input type="radio" name="filter.status" id="status_orphaned" value="orphaned">
+      <label for="status_orphaned"><translate>Orphaned</translate></label>
+    </tr>
+   </table>
+  </p>
+
+  <hr size="3" noshade>
+
+  <input type="hidden" name="nextsub" value="project_report">
+
+  <p>
+   <input class="submit" type="submit" name="action" value="<translate>Continue</translate>">
+  </p>
+ </form>
+
+</body>
+</html>