Zwei neue Features:
authorMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 11 Jan 2008 15:53:02 +0000 (15:53 +0000)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Fri, 11 Jan 2008 15:53:02 +0000 (15:53 +0000)
1. Beliebige Notizen für Kunden und Lieferanten können angelegt werden. Solche Notizen können auf Wiedervorlage gelegt werden, was durch 2. implementiert ist.
2. Einkaufs- und Verkaufsbelege können auf Wiedervorlage gelegt werden. Wiedervorlagen können für beliebige Nutzer erstellt werden (Aufgabe an andere Nutzer deligieren). Anstehende Wiedervorlagen und abgelaufene Angebote werden auf der Startseite in einer Aufgabenliste angezeigt.

63 files changed:
SL/CT.pm
SL/FU.pm [new file with mode: 0644]
SL/Form.pm
SL/Notes.pm [new file with mode: 0644]
SL/OE.pm
bin/mozilla/ap.pl
bin/mozilla/ar.pl
bin/mozilla/ct.pl
bin/mozilla/fu.pl [new file with mode: 0644]
bin/mozilla/gl.pl
bin/mozilla/ir.pl
bin/mozilla/is.pl
bin/mozilla/login.pl
bin/mozilla/oe.pl
bin/mozilla/todo.pl [new file with mode: 0644]
fu.pl [new symlink]
image/Productivity.png [new file with mode: 0644]
js/follow_up.js [new file with mode: 0644]
locale/de/all
locale/de/ap
locale/de/ar
locale/de/ct
locale/de/dn
locale/de/fu [new file with mode: 0644]
locale/de/gl
locale/de/ic
locale/de/io
locale/de/ir
locale/de/is
locale/de/login
locale/de/menu
locale/de/menunew
locale/de/oe
locale/de/todo [new file with mode: 0644]
menu.ini
sql/Pg-upgrade2/follow_ups.sql [new file with mode: 0644]
templates/webpages/ct/form_header_de.html
templates/webpages/ct/form_header_master.html
templates/webpages/fu/add_edit_de.html [new file with mode: 0644]
templates/webpages/fu/add_edit_master.html [new file with mode: 0644]
templates/webpages/fu/close_window_de.html [new file with mode: 0644]
templates/webpages/fu/close_window_master.html [new file with mode: 0644]
templates/webpages/fu/edit_access_rights_de.html [new file with mode: 0644]
templates/webpages/fu/edit_access_rights_master.html [new file with mode: 0644]
templates/webpages/fu/report_bottom_de.html [new file with mode: 0644]
templates/webpages/fu/report_bottom_master.html [new file with mode: 0644]
templates/webpages/fu/report_for_todo_list_de.html [new file with mode: 0644]
templates/webpages/fu/report_for_todo_list_master.html [new file with mode: 0644]
templates/webpages/fu/report_top_de.html [new file with mode: 0644]
templates/webpages/fu/report_top_master.html [new file with mode: 0644]
templates/webpages/fu/search_de.html [new file with mode: 0644]
templates/webpages/fu/search_master.html [new file with mode: 0644]
templates/webpages/login/company_logo_de.html
templates/webpages/login/company_logo_master.html
templates/webpages/oe/orders_footer_de.html
templates/webpages/oe/orders_footer_master.html
templates/webpages/oe/orders_header_de.html
templates/webpages/oe/orders_header_master.html
templates/webpages/oe/report_for_todo_list_de.html [new file with mode: 0644]
templates/webpages/oe/report_for_todo_list_master.html [new file with mode: 0644]
templates/webpages/todo/show_todo_list_de.html [new file with mode: 0644]
templates/webpages/todo/show_todo_list_master.html [new file with mode: 0644]
todo.pl [new symlink]

index e0e4084..7ccccad 100644 (file)
--- a/SL/CT.pm
+++ b/SL/CT.pm
@@ -39,8 +39,11 @@ package CT;
 
 use Data::Dumper;
 
+use SL::Common;
 use SL::CVar;
 use SL::DBUtils;
+use SL::FU;
+use SL::Notes;
 
 sub get_tuple {
   $main::lxdebug->enter_sub();
@@ -73,6 +76,52 @@ sub get_tuple {
       selectrow_query($form, $dbh, $query, $form->{salesman_id});
   }
 
+  my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
+  $query =
+    qq|SELECT n.*, n.itime::DATE AS created_on,
+         e.name AS created_by_name, e.login AS created_by_login
+       FROM notes n
+       LEFT JOIN employee e ON (n.created_by = e.id)
+       WHERE (n.trans_id = ?) AND (n.trans_module = 'ct')|;
+  $form->{NOTES} = selectall_hashref_query($form, $dbh, $query, conv_i($form->{id}));
+
+  $query =
+    qq|SELECT fu.follow_up_date, fu.done AS follow_up_done, e.name AS created_for_name, e.name AS created_for_login
+       FROM follow_ups fu
+       LEFT JOIN employee e ON (fu.created_for_user = e.id)
+       WHERE (fu.note_id = ?)
+         AND NOT COALESCE(fu.done, FALSE)
+         AND (   (fu.created_by = ?)
+              OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?)))|;
+  $sth = prepare_query($form, $dbh, $query);
+
+  foreach my $note (@{ $form->{NOTES} }) {
+    do_statement($form, $sth, $query, conv_i($note->{id}), conv_i($note->{created_by}), conv_i($employee_id));
+    $ref = $sth->fetchrow_hashref();
+
+    map { $note->{$_} = $ref->{$_} } keys %{ $ref } if ($ref);
+  }
+
+  $sth->finish();
+
+  if ($form->{edit_note_id}) {
+    $query =
+      qq|SELECT n.id AS NOTE_id, n.subject AS NOTE_subject, n.body AS NOTE_body,
+           fu.id AS FU_id, fu.follow_up_date AS FU_date, fu.done AS FU_done, fu.created_for_user AS FU_created_for_user
+         FROM notes n
+         LEFT JOIN follow_ups fu ON ((n.id = fu.note_id) AND NOT COALESCE(fu.done, FALSE))
+         WHERE n.id = ?|;
+    $ref = selectfirst_hashref_query($form, $dbh, $query, conv_i($form->{edit_note_id}));
+
+    if ($ref) {
+      foreach my $key (keys %{ $ref }) {
+        my $new_key       =  $key;
+        $new_key          =~ s/^([^_]+)/\U\1\E/;
+        $form->{$new_key} =  $ref->{$key};
+      }
+    }
+  }
+
   # check if it is orphaned
   my $arap = ( $form->{db} eq 'customer' ) ? "ar" : "ap";
   $query =
@@ -384,6 +433,9 @@ sub save_customer {
   # add shipto
   $form->add_shipto( $dbh, $form->{id}, "CT" );
 
+  $self->_save_note('dbh' => $dbh);
+  $self->_delete_selected_notes('dbh' => $dbh);
+
   CVar->save_custom_variables('dbh'       => $dbh,
                               'module'    => 'CT',
                               'trans_id'  => $form->{id},
@@ -586,6 +638,9 @@ sub save_vendor {
   # add shipto
   $form->add_shipto( $dbh, $form->{id}, "CT" );
 
+  $self->_save_note('dbh' => $dbh);
+  $self->_delete_selected_notes('dbh' => $dbh);
+
   CVar->save_custom_variables('dbh'       => $dbh,
                               'module'    => 'CT',
                               'trans_id'  => $form->{id},
@@ -845,4 +900,83 @@ sub get_delivery {
   $main::lxdebug->leave_sub();
 }
 
+sub _save_note {
+  $main::lxdebug->enter_sub();
+
+  my $self   = shift;
+  my %params = @_;
+
+  my $form   = $main::form;
+
+  Common::check_params(\%params, 'dbh');
+
+  if (!$form->{NOTE_subject}) {
+    $main::lxdebug->leave_sub();
+    return;
+  }
+
+  my $dbh = $params{dbh};
+
+  my %follow_up;
+  my %note = (
+    'id'           => $form->{NOTE_id},
+    'subject'      => $form->{NOTE_subject},
+    'body'         => $form->{NOTE_body},
+    'trans_id'     => $form->{id},
+    'trans_module' => 'ct',
+  );
+
+  $note{id} = Notes->save(%note);
+
+  if ($form->{FU_date}) {
+    %follow_up = (
+      'id'               => $form->{FU_id},
+      'note_id'          => $note{id},
+      'follow_up_date'   => $form->{FU_date},
+      'created_for_user' => $form->{FU_created_for_user},
+      'done'             => $form->{FU_done} ? 1 : 0,
+      'subject'          => $form->{NOTE_subject},
+      'body'             => $form->{NOTE_body},
+      'LINKS'            => [
+        {
+          'trans_id'     => $form->{id},
+          'trans_type'   => $form->{db} eq 'customer' ? 'customer' : 'vendor',
+          'trans_info'   => $form->{name},
+        },
+      ],
+    );
+
+    $follow_up{id} = FU->save(%follow_up);
+
+  } elsif ($form->{FU_id}) {
+    do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|, conv_i($form->{FU_id}));
+    do_query($form, $dbh, qq|DELETE FROM follow_ups      WHERE id = ?|,           conv_i($form->{FU_id}));
+  }
+
+  delete @{$form}{grep { /^NOTE_|^FU_/ } keys %{ $form }};
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _delete_selected_notes {
+  $main::lxdebug->enter_sub();
+
+  my $self   = shift;
+  my %params = @_;
+
+  Common::check_params(\%params, 'dbh');
+
+  my $form = $main::form;
+  my $dbh  = $params{dbh};
+
+  foreach my $i (1 .. $form->{NOTES_rowcount}) {
+    next unless ($form->{"NOTE_delete_$i"} && $form->{"NOTE_id_$i"});
+
+    Notes->delete('dbh' => $params{dbh},
+                  'id'  => $form->{"NOTE_id_$i"});
+  }
+
+  $main::lxdebug->leave_sub();
+}
+
 1;
diff --git a/SL/FU.pm b/SL/FU.pm
new file mode 100644 (file)
index 0000000..bd76191
--- /dev/null
+++ b/SL/FU.pm
@@ -0,0 +1,432 @@
+# Follow-Ups
+
+package FU;
+
+use List::Util qw(first);
+
+use SL::Common;
+use SL::DBUtils;
+use SL::Notes;
+
+sub save {
+  $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 ($query, @values);
+
+  if (!$params{id}) {
+    ($params{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('follow_up_id')|);
+
+    $query = qq|INSERT INTO follow_ups (created_by, done, note_id, follow_up_date, created_for_user, id)
+                VALUES ((SELECT id FROM employee WHERE login = ?), ?, ?, ?, ?, ?)|;
+
+    push @values, $form->{login};
+
+  } else {
+    $query = qq|UPDATE follow_ups SET done = ?, note_id = ?, follow_up_date = ?, created_for_user = ? WHERE id = ?|;
+  }
+
+  $params{note_id} = Notes->save('id'           => $params{note_id},
+                                 'trans_id'     => $params{id},
+                                 'trans_module' => 'fu',
+                                 'subject'      => $params{subject},
+                                 'body'         => $params{body});
+
+  $params{done} = 1 if (!defined $params{done});
+
+  do_query($form, $dbh, $query, @values, $params{done} ? 't' : 'f', conv_i($params{note_id}), $params{follow_up_date}, conv_i($params{created_for_user}), conv_i($params{id}));
+
+  do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|, conv_i($params{id}));
+
+  my $query = qq|INSERT INTO follow_up_links (follow_up_id, trans_id, trans_type, trans_info) VALUES (?, ?, ?, ?)|;
+  my $sth   = prepare_query($form, $dbh, $query);
+
+  foreach my $link (@{ $params{LINKS} }) {
+    do_statement($form, $sth, $query, conv_i($params{id}), conv_i($link->{trans_id}), $link->{trans_type}, $link->{trans_info});
+  }
+
+  $sth->finish();
+
+  $dbh->commit() unless ($params{dbh});
+
+  $main::lxdebug->leave_sub();
+}
+
+sub finish {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, 'id');
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $form->get_standard_dbh($myconfig);
+
+  do_query($form, $dbh, qq|UPDATE follow_ups SET done = TRUE WHERE id = ?|, conv_i($params{id}));
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub delete {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, 'id');
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $form->get_standard_dbh($myconfig);
+
+  my $id       = conv_i($params{id});
+
+  do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id = ?|,                         $id);
+  do_query($form, $dbh, qq|DELETE FROM follow_ups      WHERE id = ?|,                                   $id);
+  do_query($form, $dbh, qq|DELETE FROM notes           WHERE (trans_id = ?) AND (trans_module = 'fu')|, $id);
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub retrieve {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, 'id');
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $form->get_standard_dbh($myconfig);
+  my ($query, @values);
+
+  my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
+  $query            = qq|SELECT fu.*, n.subject, n.body, n.created_by
+                         FROM follow_ups fu
+                         LEFT JOIN notes n ON (fu.note_id = n.id)
+                         WHERE (fu.id = ?)
+                           AND (   (fu.created_by = ?) OR (fu.created_for_user = ?)
+                                OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?)))|;
+  my $ref           = selectfirst_hashref_query($form, $dbh, $query, conv_i($params{id}), $employee_id, $employee_id, $employee_id);
+
+  if (!$ref) {
+    $main::lxdebug->leave_sub();
+    return undef;
+  }
+
+  $ref->{LINKS} = $self->retrieve_links(%{ $ref });
+
+  $main::lxdebug->leave_sub();
+
+  return $ref;
+}
+
+sub retrieve_links {
+  $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      = $form->get_standard_dbh($myconfig);
+
+  my $query    = qq|SELECT ful.trans_id, ful.trans_type, ful.trans_info, fu.note_id
+                    FROM follow_up_links ful
+                    LEFT JOIN follow_ups fu ON (ful.follow_up_id = fu.id)
+                    WHERE ful.follow_up_id = ?
+                    ORDER BY ful.itime|;
+
+  my $links    = selectall_hashref_query($form, $dbh, $query, conv_i($params{id}));
+
+  foreach my $link_ref (@{ $links }) {
+    my $link_details = FU->link_details(%{ $link_ref });
+    map { $link_ref->{$_} = $link_details->{$_} } keys %{ $link_details} if ($link_details);
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $links;
+}
+
+sub follow_ups {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $form->get_standard_dbh($myconfig);
+  my ($query, $where, $where_user);
+
+  my ($employee_id) = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
+  my @values        = ($employee_id, $employee_id);
+
+  if ($params{trans_id}) {
+    $where .= qq| AND EXISTS (SELECT * FROM follow_up_links ful
+                              WHERE (ful.follow_up_id = fu.id) AND (ful.trans_id = ?))|;
+    push @values, conv_i($params{trans_id});
+  }
+
+  if ($params{due_only}) {
+    $where .= qq| AND (fu.follow_up_date <= current_date)|;
+  }
+
+  if ($params{done} ne $params{not_done}) {
+    my $not  = $params{not_done} ? 'NOT' : '';
+    $where  .= qq| AND $not COALESCE(fu.done, FALSE)|;
+  }
+
+  if ($params{not_id}) {
+    $where .= qq| AND (fu.id <> ?)|;
+    push @values, conv_i($params{not_id});
+  }
+
+  foreach my $item (qw(subject body)) {
+    next unless ($params{$item});
+    $where .= qq| AND (n.${item} ILIKE ?)|;
+    push @values, '%' . $params{$item} . '%';
+  }
+
+  if ($params{reference}) {
+    $where .= qq| AND EXISTS (SELECT ful.follow_up_id
+                              FROM follow_up_links ful
+                              WHERE (ful.follow_up_id = fu.id)
+                                AND (ful.trans_info ILIKE ?)
+                              LIMIT 1)|;
+    push @values, '%' . $params{reference} . '%';
+  }
+
+  if ($params{follow_up_date_from}) {
+    $where .= qq| AND (fu.follow_up_date >= ?)|;
+    push @values, conv_date($params{follow_up_date_from});
+  }
+  if ($params{follow_up_date_to}) {
+    $where .= qq| AND (fu.follow_up_date <= ?)|;
+    push @values, conv_date($params{follow_up_date_to});
+  }
+
+  if ($params{itime_from}) {
+    $where .= qq| AND (date_trunc('DAY', fu.itime) >= ?)|;
+    push @values, conv_date($params{itime_from});
+  }
+  if ($params{itime_to}) {
+    $where .= qq| AND (date_trunc('DAY', fu.itime) <= ?)|;
+    push @values, conv_date($params{itime_to});
+  }
+
+  if ($params{all_users}) {
+    $where_user = qq|OR (fu.created_by IN (SELECT DISTINCT what FROM follow_up_access WHERE who = ?))|;
+    push @values, $employee_id;
+  }
+
+  $query  = qq|SELECT fu.*, n.subject, n.body, n.created_by,
+                 fu.follow_up_date <= current_date AS due,
+                 fu.itime::DATE                    AS created_on,
+                 COALESCE(eby.name,  eby.login)    AS created_by_name,
+                 COALESCE(efor.name, efor.login)   AS created_for_user_name
+               FROM follow_ups fu
+               LEFT JOIN notes    n    ON (fu.note_id          = n.id)
+               LEFT JOIN employee eby  ON (n.created_by        = eby.id)
+               LEFT JOIN employee efor ON (fu.created_for_user = efor.id)
+               WHERE ((fu.created_by = ?) OR (fu.created_for_user = ?)
+                      $where_user)
+                 $where
+               ORDER BY fu.follow_up_date DESC, fu.id ASC|;
+
+  my $follow_ups = selectall_hashref_query($form, $dbh, $query, @values);
+
+  if (!scalar @{ $follow_ups }) {
+    $main::lxdebug->leave_sub();
+    return $follow_ups;
+  }
+
+  foreach my $fu (@{ $follow_ups }) {
+    $fu->{LINKS} = $self->retrieve_links(%{ $fu });
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $follow_ups;
+}
+
+sub link_details {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, qw(trans_id trans_type));
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+  my $locale   = $main::locale;
+
+  my $q_id     = $form->quote($params{trans_id});
+  my $link;
+
+  if ($params{trans_type} eq 'customer') {
+    $link = {
+      'url'   => 'ct.pl?action=edit&db=customer&id=' . $form->quote($params{trans_id}) . '&edit_note_id=' . $form->quote($params{note_id}),
+      'title' => $locale->text('Customer') . " '$params{trans_info}'",
+    };
+
+  } elsif ($params{trans_type} eq 'vendor') {
+    $link = {
+      'url'   => 'ct.pl?action=edit&type=sales_quotation&id=' . $params{trans_id} . '&edit_note_id=' . $form->quote($params{note_id}),
+      'title' => $locale->text('Vendor') . " '$params{trans_info}'",
+    };
+
+  } elsif ($params{trans_type} eq 'sales_quotation') {
+    $link = {
+      'url'   => 'oe.pl?action=edit&type=sales_quotation&id=' . $params{trans_id},
+      'title' => $locale->text('Sales quotation') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'sales_order') {
+    $link = {
+      'url'   => 'oe.pl?action=edit&type=sales_order&id=' . $params{trans_id},
+      'title' => $locale->text('Sales Order') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'sales_invoice') {
+    $link = {
+      'url'   => 'is.pl?action=edit&type=invoice&id=' . $params{trans_id},
+      'title' => $locale->text('Sales Invoice') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'credit_note') {
+    $link = {
+      'url'   => 'is.pl?action=edit&type=credit_note&id=' . $params{trans_id},
+      'title' => $locale->text('Credit Note') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'dunning') {
+    $link = {
+      'url'   => 'dn.pl?action=print_dunning&format=pdf&media=screen&dunning_id=' . $params{trans_id},
+      'title' => $locale->text('Dunning') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'request_quotation') {
+    $link = {
+      'url'   => 'oe.pl?action=edit&type=request_quotation&id=' . $params{trans_id},
+      'title' => $locale->text('Request quotation') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'purchase_order') {
+    $link = {
+      'url'   => 'oe.pl?action=edit&type=purchase_order&id=' . $params{trans_id},
+      'title' => $locale->text('Purchase Order') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'vendor_invoice') {
+    $link = {
+      'url'   => 'ir.pl?action=edit&type=invoice&id=' . $params{trans_id},
+      'title' => $locale->text('Vendor Invoice') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'ar_transaction') {
+    $link = {
+      'url'   => 'ar.pl?action=editid=' . $params{trans_id},
+      'title' => $locale->text('AR Transaction') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'ap_transaction') {
+    $link = {
+      'url'   => 'ap.pl?action=editid=' . $params{trans_id},
+      'title' => $locale->text('AP Transaction') . " $params{trans_info}",
+    };
+
+  } elsif ($params{trans_type} eq 'gl_transaction') {
+    $link = {
+      'url'   => 'gl.pl?action=edit&id=' . $params{trans_id},
+      'title' => $locale->text('GL Transaction') . " $params{trans_info}",
+    };
+
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $link || { };
+}
+
+sub save_access_rights {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  Common::check_params(\%params, 'access');
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $form->get_standard_dbh($myconfig);
+
+  my ($id)     = selectrow_query($form, $dbh, qq|SELECT id FROM employee WHERE login = ?|, $form->{login});
+
+  my $query    = qq|INSERT INTO follow_up_access (who, what) VALUES (?, ?)|;
+  my $sth      = prepare_query($form, $dbh, $query);
+
+  do_query($form, $dbh, qq|DELETE FROM follow_up_access WHERE what = ?|, $id);
+
+  while (my ($who, $access_allowed) = each %{ $params{access} }) {
+    next unless ($access_allowed);
+
+    do_statement($form, $sth, $query, conv_i($who), $id);
+  }
+
+  $sth->finish();
+
+  $dbh->commit();
+
+  $main::lxdebug->leave_sub();
+}
+
+sub retrieve_access_rights {
+  $main::lxdebug->enter_sub();
+
+  my $self     = shift;
+  my %params   = @_;
+
+  my $myconfig = \%main::myconfig;
+  my $form     = $main::form;
+
+  my $dbh      = $form->get_standard_dbh($myconfig);
+
+  my $sth      = prepare_execute_query($form, $dbh, qq|SELECT who FROM follow_up_access WHERE what = (SELECT id FROM employee WHERE login = ?)|, $form->{login});
+  my $access   = {};
+
+  while (my $ref = $sth->fetchrow_hashref()) {
+    $access->{$ref->{who}} = 1;
+  }
+
+  $sth->finish();
+
+  $main::lxdebug->leave_sub();
+
+  return $access;
+}
+
+1;
index 98fd7b2..4c630f1 100644 (file)
@@ -2213,6 +2213,20 @@ sub _get_simple {
   $main::lxdebug->leave_sub();
 }
 
+sub _get_groups {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key ||= "all_groups";
+
+  my $groups = $main::auth->read_groups();
+
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+}
+
 sub get_lists {
   $main::lxdebug->enter_sub();
 
@@ -2311,6 +2325,10 @@ sub get_lists {
     $self->_get_warehouses($dbh, $params{warehouses});
   }
 
+  if ($params{groups}) {
+    $self->_get_groups($dbh, $params{groups});
+  }
+
   $main::lxdebug->leave_sub();
 }
 
diff --git a/SL/Notes.pm b/SL/Notes.pm
new file mode 100644 (file)
index 0000000..c61dd3d
--- /dev/null
@@ -0,0 +1,86 @@
+# Notes
+
+package Notes;
+
+use SL::Common;
+use SL::DBUtils;
+
+sub save {
+  $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 ($query, @values);
+
+  if (!$params{id}) {
+    ($params{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('note_id')|);
+    $query        = qq|INSERT INTO notes (created_by, trans_id, trans_module, subject, body, id)
+                       VALUES ((SELECT id FROM employee WHERE login = ?), ?, ?, ?, ?, ?)|;
+    push @values, $form->{login}, conv_i($params{trans_id}), $params{trans_module};
+
+  } else {
+    $query        = qq|UPDATE notes SET subject = ?, body = ? WHERE id = ?|;
+  }
+
+  push @values, $params{subject}, $params{body}, conv_i($params{id});
+
+  do_query($form, $dbh, $query, @values);
+
+  $dbh->commit() unless ($params{dbh});
+
+  $main::lxdebug->leave_sub();
+
+  return $params{id};
+}
+
+sub retrieve {
+  $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      = $form->get_standard_dbh($myconfig);
+
+  my $ref      = selectfirst_hashref_query($form, $dbh, qq|SELECT * FROM notes WHERE id = ?|, conv_i($param{id}));
+
+  $main::lxdebug->leave_sub();
+
+  return $ref;
+}
+
+sub delete {
+  $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);
+  my $id       = conv_i($params{id});
+
+  do_query($form, $dbh, qq|DELETE FROM follow_up_links WHERE follow_up_id IN (SELECT DISTINCT id FROM follow_ups WHERE note_id = ?)|, $id);
+  do_query($form, $dbh, qq|DELETE FROM follow_ups      WHERE note_id = ?|, $id);
+  do_query($form, $dbh, qq|DELETE FROM notes           WHERE id = ?|, $id);
+
+  $dbh->commit() unless ($params{dbh});
+
+  $main::lxdebug->leave_sub();
+
+  return $ref;
+}
+
+1;
index 2e7a6be..2574afa 100644 (file)
--- a/SL/OE.pm
+++ b/SL/OE.pm
@@ -184,6 +184,41 @@ sub transactions {
   $main::lxdebug->leave_sub();
 }
 
+sub transactions_for_todo_list {
+  $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 $query    = qq|SELECT id FROM employee WHERE login = ?|;
+  my ($e_id)   = selectrow_query($form, $dbh, $query, $form->{login});
+
+  $query       =
+    qq|SELECT oe.id, oe.transdate, oe.reqdate, oe.quonumber, oe.transaction_description, oe.amount,
+         c.name AS customer,
+         e.name AS employee
+       FROM oe
+       LEFT JOIN customer c ON (oe.customer_id = c.id)
+       LEFT JOIN employee e ON (oe.employee_id = e.id)
+       WHERE (COALESCE(quotation, FALSE) = TRUE)
+         AND (COALESCE(closed,    FALSE) = FALSE)
+         AND ((oe.employee_id = ?) OR (oe.salesman_id = ?))
+         AND NOT (oe.reqdate ISNULL)
+         AND (oe.reqdate < current_date)
+       ORDER BY transdate|;
+
+  my $quotations = selectall_hashref_query($form, $dbh, $query, $e_id, $e_id);
+
+  $main::lxdebug->leave_sub();
+
+  return $quotations;
+}
+
 sub save {
   $main::lxdebug->enter_sub();
 
index 7b06ed7..0c1239f 100644 (file)
 #======================================================================
 
 use POSIX qw(strftime);
+use List::Util qw(sum);
 
 use SL::AP;
+use SL::FU;
 use SL::IR;
 use SL::IS;
 use SL::PE;
@@ -387,8 +389,14 @@ selectvendor } </select>|
     $button2 =
       qq|<td><input name=duedate id=duedate size=11 title="$myconfig{dateformat}" value="$form->{duedate}" onBlur=\"check_right_date_format(this)\"> $readonly</td>|;
   }
+
+  my $follow_up_vc         =  $form->{vendor};
+  $follow_up_vc            =~ s/--.*?//;
+  my $follow_up_trans_info =  "$form->{invnumber} ($follow_up_vc)";
+
   $form->{javascript} .= qq|<script type="text/javascript" src="js/common.js"></script>|;
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_vc_details.js"></script>|;
+  $form->{javascript} .= qq|<script type="text/javascript" src="js/follow_up.js"></script>|;
 
   $form->header;
   $onload = qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
@@ -404,6 +412,11 @@ selectvendor } </select>|
 <input type=hidden name=locked value=$form->{locked}>
 <input type=hidden name=title value="$title">
 
+<input type="hidden" name="follow_up_trans_id_1" value="| . H($form->{id}) . qq|">
+<input type="hidden" name="follow_up_trans_type_1" value="ap_transaction">
+<input type="hidden" name="follow_up_trans_info_1" value="| . H($follow_up_trans_info) . qq|">
+<input type="hidden" name="follow_up_rowcount" value="1">
+
 | . ($form->{saved_message} ? qq|<p>$form->{saved_message}</p>| : "") . qq|
 
 <table width=100%>
@@ -753,8 +766,20 @@ sub form_footer {
 
   $auth->assert('general_ledger');
 
+  my $follow_ups_block;
+  if ($form->{id}) {
+    my $follow_ups = FU->follow_ups('trans_id' => $form->{id});
+
+    if (@{ $follow_ups} ) {
+      my $num_due       = sum map { $_->{due} * 1 } @{ $follow_ups };
+      $follow_ups_block = qq|<p>| . $locale->text("There are #1 unfinished follow-ups of which #2 are due.", scalar @{ $follow_ups }, $num_due) . qq|</p>|;
+    }
+  }
+
   print qq|
 
+$follow_ups_block
+
 <input name=callback type=hidden value="$form->{callback}">
 <input name="gldate" type="hidden" value="| . Q($form->{gldate}) . qq|">
 |
@@ -792,6 +817,7 @@ sub form_footer {
 
     print qq| <input class=submit type=submit name=action value="| . $locale->text('Post Payment') . qq|">
               <input class=submit type=submit name=action value="| . $locale->text('Use As Template') . qq|">
+              <input type="button" class="submit" onclick="follow_up_window()" value="| . $locale->text('Follow-Up') . qq|">
 |;
   } elsif (($transdate > $closedto) && !$form->{id}) {
     print qq|
index ae15aed..88a9b97 100644 (file)
 #======================================================================
 
 use POSIX qw(strftime);
+use List::Util qw(sum);
 
 use SL::AR;
+use SL::FU;
 use SL::IS;
 use SL::PE;
 use SL::ReportGenerator;
@@ -431,9 +433,14 @@ sub form_header {
       qq|<td><input name=duedate id=duedate size=11 title="$myconfig{dateformat}" value="$form->{duedate}" onBlur=\"check_right_date_format(this)\"></td>|;
   }
 
+  my $follow_up_vc         =  $form->{customer};
+  $follow_up_vc            =~ s/--.*?//;
+  my $follow_up_trans_info =  "$form->{invnumber} ($follow_up_vc)";
+
   $form->{javascript} .=
     qq|<script type="text/javascript" src="js/common.js"></script>| .
-    qq|<script type="text/javascript" src="js/show_vc_details.js"></script>|;
+    qq|<script type="text/javascript" src="js/show_vc_details.js"></script>| .
+    qq|<script type="text/javascript" src="js/follow_up.js"></script>|;
 
   $form->header;
   $onload = qq|focus()|;
@@ -449,6 +456,10 @@ sub form_header {
 <input type=hidden name=closedto value=$form->{closedto}>
 <input type=hidden name=locked value=$form->{locked}>
 <input type=hidden name=title value="$title">
+<input type="hidden" name="follow_up_trans_id_1" value="| . H($form->{id}) . qq|">
+<input type="hidden" name="follow_up_trans_type_1" value="ar_transaction">
+<input type="hidden" name="follow_up_trans_info_1" value="| . H($follow_up_trans_info) . qq|">
+<input type="hidden" name="follow_up_rowcount" value="1">
 
 | . ($form->{saved_message} ? qq|<p>$form->{saved_message}</p>| : "") . qq|
 
@@ -800,8 +811,20 @@ sub form_footer {
 
   my ($transdate, $closedto);
 
+  my $follow_ups_block;
+  if ($form->{id}) {
+    my $follow_ups = FU->follow_ups('trans_id' => $form->{id});
+
+    if (@{ $follow_ups} ) {
+      my $num_due       = sum map { $_->{due} * 1 } @{ $follow_ups };
+      $follow_ups_block = qq|<p>| . $locale->text("There are #1 unfinished follow-ups of which #2 are due.", scalar @{ $follow_ups }, $num_due) . qq|</p>|;
+    }
+  }
+
   print qq|
 
+$follow_ups_block
+
 <input name=gldate type=hidden value="| . Q($form->{gldate}) . qq|">
 
 <input name=callback type=hidden value="$form->{callback}">
@@ -842,7 +865,10 @@ sub form_footer {
         <input class=submit type=submit name=action value="| . $locale->text('Use As Template') . qq|"> |;
     }
     print qq|
-        <input class=submit type=submit name=action value="| . $locale->text('Post Payment') .    qq|"> |;
+        <input class=submit type=submit name=action value="| . $locale->text('Post Payment') .    qq|">
+        <input type="button" class="submit" onclick="follow_up_window()" value="|
+      . $locale->text('Follow-Up')
+      . qq|"> |;
 
   } else {
     if ($transdate > $closedto) {
index d4c5230..d4d2f9f 100644 (file)
@@ -267,10 +267,11 @@ sub form_header {
 
   $auth->assert('customer_vendor_edit');
 
-  $form->get_lists("employees" => "ALL_SALESMEN",
+  $form->get_lists("employees" => "ALL_EMPLOYEES",
                    "taxzones"  => "ALL_TAXZONES");
   $form->get_pricegroup(\%myconfig, { all => 1 });
 
+  $form->{ALL_SALESMEN}   = $form->{ALL_EMPLOYEES};
   $form->{taxincluded}    = ($form->{taxincluded}) ? "checked" : "";
   $form->{is_admin}       = $myconfig{role} eq 'admin';
   $form->{is_customer}    = $form->{db}     eq 'customer';
@@ -295,12 +296,12 @@ sub form_header {
   map { $form->{"MB_$_"} = [ map +{ id => $_, description => $_ }, @{ $form->{$_} } ] } qw(TITLES GREETINGS COMPANY_GREETINGS DEPARTMENT);
 ## /LINET
 
+  $form->{NOTES} ||= [ ];
+
   $form->{CUSTOM_VARIABLES} = CVar->get_custom_variables('module' => 'CT', 'trans_id' => $form->{id});
 
   CVar->render_inputs('variables' => $form->{CUSTOM_VARIABLES}) if (scalar @{ $form->{CUSTOM_VARIABLES} });
 
-  $main::lxdebug->dump(0, "cvar", $form->{CUSTOM_VARIABLES});
-
   $form->header;
   print $form->parse_html_template('ct/form_header');
 
diff --git a/bin/mozilla/fu.pl b/bin/mozilla/fu.pl
new file mode 100644 (file)
index 0000000..7c78dd7
--- /dev/null
@@ -0,0 +1,403 @@
+use POSIX qw(strftime);
+
+use SL::FU;
+use SL::ReportGenerator;
+
+require "bin/mozilla/reportgenerator.pl";
+
+sub _collect_links {
+  $lxdebug->enter_sub();
+
+  my $dest = shift;
+
+  $dest->{LINKS} = [];
+
+  foreach my $i (1 .. $form->{trans_rowcount}) {
+    next if (!$form->{"trans_id_$i"} || !$form->{"trans_type_$i"});
+
+    push @{ $dest->{LINKS} }, { map { +"trans_$_" => $form->{"trans_${_}_$i"} } qw(id type info) };
+  }
+
+  $lxdebug->leave_sub();
+}
+
+sub add {
+  $lxdebug->enter_sub();
+
+  _collect_links($form);
+
+  $form->get_employee($form->get_standard_dbh(\%myconfig));
+  $form->{created_for_user} = $form->{employee_id};
+
+  my $link_details;
+
+  if (0 < scalar @{ $form->{LINKS} }) {
+    $link_details = FU->link_details(%{ $form->{LINKS}->[0] });
+  }
+
+  if ($link_details && $link_details->{title}) {
+    $form->{title} = $locale->text('Add Follow-Up for #1', $link_details->{title});
+  } else {
+    $form->{title} = $locale->text('Add Follow-Up');
+  }
+
+  display_form();
+
+  $lxdebug->leave_sub();
+}
+
+sub edit {
+  $lxdebug->enter_sub();
+
+  my $ref = FU->retrieve('id' => $form->{id});
+
+  if (!$ref) {
+    $form->error($locale->text("Invalid follow-up ID."));
+  }
+
+  map { $form->{$_} = $ref->{$_} } keys %{ $ref };
+
+  if (@{ $form->{LINKS} } && $form->{LINKS}->[0]->{title}) {
+    $form->{title} = $locale->text('Edit Follow-Up for #1', $form->{LINKS}->[0]->{title});
+  } else {
+    $form->{title} = $locale->text('Edit Follow-Up');
+  }
+
+  display_form();
+
+  $lxdebug->leave_sub();
+}
+
+sub display_form {
+  $lxdebug->enter_sub();
+
+  $form->get_lists("employees" => "EMPLOYEES");
+
+  my %params;
+  $params{not_id}     = $form->{id} if ($form->{id});
+  $params{trans_id}   = $form->{LINKS}->[0]->{trans_id} if (@{ $form->{LINKS} });
+  $form->{FOLLOW_UPS} = FU->follow_ups(%params);
+
+  $form->{jsscript}   = 1;
+
+  $form->header();
+  print $form->parse_html_template('fu/add_edit');
+
+  $lxdebug->leave_sub();
+}
+
+sub save_follow_up {
+  $lxdebug->enter_sub();
+
+  $form->isblank('created_for_user', $locale->text('You must chose a user.'));
+  $form->isblank('follow_up_date',   $locale->text('The follow-up date is missing.'));
+  $form->isblank('subject',          $locale->text('The subject is missing.'));
+
+  my %params = (map({ $_ => $form->{$_} } qw(id subject body created_for_user follow_up_date)), 'done' => 0);
+
+  _collect_links(\%params);
+
+  FU->save(%params);
+
+  if ($form->{POPUP_MODE}) {
+    $form->header();
+    print $form->parse_html_template('fu/close_window');
+    exit 0;
+  }
+
+  $form->{SAVED_MESSAGE} = $locale->text('Follow-Up saved.');
+
+  if ($form->{callback}) {
+    $form->redirect();
+  }
+
+  delete @{$form}{qw(id subject body created_for_user follow_up_date)};
+
+  map { $form->{$_} = 1 } qw(due_only all_users not_done);
+
+  report();
+
+  $lxdebug->leave_sub();
+}
+
+sub finish {
+  $lxdebug->enter_sub();
+
+  if ($form->{id}) {
+    my $ref = FU->retrieve('id' => $form->{id});
+
+    if (!$ref) {
+      $form->error($locale->text("Invalid follow-up ID."));
+    }
+
+    FU->finish('id' => $form->{id});
+
+  } else {
+    foreach my $i (1..$form->{rowcount}) {
+      next unless ($form->{"selected_$i"} && $form->{"follow_up_id_$i"});
+
+      FU->finish('id' => $form->{"follow_up_id_$i"});
+    }
+  }
+
+  if ($form->{POPUP_MODE}) {
+    $form->header();
+    print $form->parse_html_template('fu/close_window');
+    exit 0;
+  }
+
+  $form->redirect() if ($form->{callback});
+
+  report();
+
+  $lxdebug->leave_sub();
+}
+
+sub delete {
+  $lxdebug->enter_sub();
+
+  if ($form->{id}) {
+    my $ref = FU->retrieve('id' => $form->{id});
+
+    if (!$ref) {
+      $form->error($locale->text("Invalid follow-up ID."));
+    }
+
+    FU->delete('id' => $form->{id});
+
+  } else {
+    foreach my $i (1..$form->{rowcount}) {
+      next unless ($form->{"selected_$i"} && $form->{"follow_up_id_$i"});
+
+      FU->delete('id' => $form->{"follow_up_id_$i"});
+    }
+  }
+
+  if ($form->{POPUP_MODE}) {
+    $form->header();
+    print $form->parse_html_template('fu/close_window');
+    exit 0;
+  }
+
+  $form->redirect() if ($form->{callback});
+
+  report();
+
+  $lxdebug->leave_sub();
+}
+
+sub search {
+  $lxdebug->enter_sub();
+
+  $form->get_lists("employees" => "EMPLOYEES");
+
+  $form->{jsscript} = 1;
+  $form->{title}    = $locale->text('Follow-Ups');
+
+  $form->header();
+  print $form->parse_html_template('fu/search');
+
+  $lxdebug->leave_sub();
+}
+
+sub report {
+  $lxdebug->enter_sub();
+
+  my @report_params = qw(created_for subject body reference follow_up_date_from follow_up_date_to itime_from itime_to due_only all_users done not_done);
+
+  my $follow_ups    = FU->follow_ups(map { $_ => $form->{$_} } @report_params);
+  $form->{rowcount} = scalar @{ $follow_ups };
+
+  $form->{title}    = $locale->text('Follow-Ups');
+
+  my %column_defs = (
+    'selected'              => { 'text' => '', },
+    'follow_up_date'        => { 'text' => $locale->text('Follow-Up Date'), },
+    'created_on'            => { 'text' => $locale->text('Created on'), },
+    'title'                 => { 'text' => $locale->text('Reference'), },
+    'subject'               => { 'text' => $locale->text('Subject'), },
+    'created_by_name'       => { 'text' => $locale->text('Created by'), },
+    'created_for_user_name' => { 'text' => $locale->text('Follow-up for'), },
+    'done'                  => { 'text' => $locale->text('Done'), 'visible' => $form->{done} && $form->{not_done} ? 1 : 0 },
+  );
+
+  my @columns = qw(selected follow_up_date created_on subject title created_by_name created_for_user_name done);
+
+  my @options;
+
+  if ($form->{created_for}) {
+    $form->get_lists("employees" => "EMPLOYEES");
+
+    foreach my $employee (@{ $form->{EMPLOYEES} }) {
+      if ($employee->{id} == $form->{created_for}) {
+        push @options, $locale->text('Created for') . " : " . ($employee->{name} ? "$employee->{name} ($employee->{login})" : $employee->{login});
+        last;
+      }
+    }
+  }
+
+  push @options, $locale->text('Subject')                  . " : $form->{subject}"   if ($form->{subject});
+  push @options, $locale->text('Body')                     . " : $form->{body}"      if ($form->{body});
+  push @options, $locale->text('Reference')                . " : $form->{reference}" if ($form->{reference});
+  push @options, $locale->text('Done')                                               if ($form->{done});
+  push @options, $locale->text('Not done yet')                                       if ($form->{not_done});
+  push @options, $locale->text('Only due follow-ups')                                if ($form->{due_only});
+  push @options, $locale->text("Other users' follow-ups")                            if ($form->{all_users});
+
+  my @hidden_report_params = map { +{ 'key' => $_, 'value' => $form->{$_} } } @report_params;
+
+  my $report = SL::ReportGenerator->new(\%myconfig, $form, 'std_column_visibility' => 1);
+
+  $report->set_columns(%column_defs);
+  $report->set_column_order(@columns);
+
+  $report->set_export_options('report', @report_params);
+
+  $report->set_sort_indicator('follow_up_date', 1);
+
+  $report->set_options('raw_top_info_text'    => $form->parse_html_template('fu/report_top',    { 'OPTIONS' => \@options }),
+                       'raw_bottom_info_text' => $form->parse_html_template('fu/report_bottom', { 'HIDDEN'  => \@hidden_report_params }),
+                       'output_format'        => 'HTML',
+                       'title'                => $form->{title},
+                       'attachment_basename'  => $locale->text('follow_up_list') . strftime('_%Y%m%d', localtime time),
+    );
+  $report->set_options_from_form();
+
+  my $idx      = 0;
+  my $callback = build_std_url('action=report', grep { $form->{$_} } @report_params);
+  my $edit_url = build_std_url('action=edit', 'callback=' . E($callback));
+
+  foreach my $fu (@{ $follow_ups }) {
+    $idx++;
+
+    $fu->{done} = $fu->{done} ? $locale->text('Yes') : $locale->text('No');
+
+    my $row = { map { $_ => { 'data' => $fu->{$_} } } keys %{ $fu } };
+
+    $row->{selected} = {
+      'raw_data' =>   $cgi->hidden('-name' => "follow_up_id_${idx}", '-value' => $fu->{id})
+                    . $cgi->checkbox('-name' => "selected_${idx}",   '-value' => 1, '-label' => ''),
+      'valign'   => 'center',
+      'align'    => 'center',
+    };
+
+    if (@{ $fu->{LINKS} }) {
+      my $link = $fu->{LINKS}->[0];
+
+      $row->{title}->{data} = $link->{title};
+      $row->{title}->{link} = $link->{url};
+    }
+
+    $row->{subject}->{link} = $edit_url . '&id=' . Q($fu->{id});
+
+    $report->add_data($row);
+  }
+
+  $report->generate_with_headers();
+
+  $lxdebug->leave_sub();
+}
+
+sub report_for_todo_list {
+  $lxdebug->enter_sub();
+
+  my @report_params = qw(created_for subject body reference follow_up_date_from follow_up_date_to itime_from itime_to due_only all_users done not_done);
+
+  my %params   = (
+    'due_only'          => 1,
+    'not_done'          => 1,
+    'created_for_login' => $form->{login},
+    );
+
+  my $follow_ups = FU->follow_ups(%params);
+  my $content;
+
+  if (@{ $follow_ups }) {
+    my $callback = build_std_url('action');
+    my $edit_url = build_std_url('script=fu.pl', 'action=edit', 'callback=' . E($callback)) . '&id=';
+
+    foreach my $fu (@{ $follow_ups }) {
+      if (@{ $fu->{LINKS} }) {
+        my $link = $fu->{LINKS}->[0];
+
+        $fu->{reference}      = $link->{title};
+        $fu->{reference_link} = $link->{url};
+      }
+    }
+
+    $content = $form->parse_html_template('fu/report_for_todo_list', { 'FOLLOW_UPS' => $follow_ups,
+                                                                       'callback'   => $callback,
+                                                                       'edit_url'   => $edit_url, });
+  }
+
+  $lxdebug->leave_sub();
+
+  return $content;
+}
+
+sub edit_access_rights {
+  $lxdebug->enter_sub();
+
+  my $access = FU->retrieve_access_rights();
+
+  $form->get_lists("employees" => "EMPLOYEES");
+
+  map { $_->{access} = $access->{$_->{id}} } @{ $form->{EMPLOYEES} };
+
+  $form->{title} = $locale->text('Edit Access Rights for Follow-Ups');
+
+  $form->header();
+  print $form->parse_html_template('fu/edit_access_rights');
+
+  $lxdebug->leave_sub();
+}
+
+sub save_access_rights {
+  $lxdebug->enter_sub();
+
+  my %access;
+
+  foreach my $i (1 .. $form->{rowcount}) {
+    my $id = $form->{"employee_id_$i"};
+
+    $access{$id} = 1 if ($id && $form->{"access_$id"});
+  }
+
+  FU->save_access_rights('access' => \%access);
+
+  $form->{SAVED_MESSAGE} = $locale->text('The access rights have been saved.');
+  edit_access_rights();
+
+  $lxdebug->leave_sub();
+}
+
+sub update {
+  call_sub($form->{nextsub});
+}
+
+sub continue {
+  call_sub($form->{nextsub});
+}
+
+sub save {
+  if ($form->{save_nextsub}) {
+    call_sub($form->{save_nextsub});
+  } else {
+    save_follow_up();
+  }
+}
+
+sub dispatcher {
+  foreach my $action (qw(finish save delete)) {
+    if ($form->{"action_${action}"}) {
+      call_sub($action);
+      return;
+    }
+  }
+
+  call_sub($form->{default_action}) if ($form->{default_action});
+
+  $form->error($locale->text('No action defined.'));
+}
+
+1;
index 6c4b413..0a2ab4c 100644 (file)
@@ -32,7 +32,9 @@
 #======================================================================
 
 use POSIX qw(strftime);
+use List::Util qw(sum);
 
+use SL::FU;
 use SL::GL;
 use SL::IS;
 use SL::PE;
@@ -1068,6 +1070,9 @@ sub form_header {
   print qq|
 <body onLoad="fokus()">
 
+<script type="text/javascript" src="js/common.js"></script>
+<script type="text/javascript" src="js/follow_up.js"></script>
+
 <form method=post name="gl" action=gl.pl>
 |;
 
@@ -1076,6 +1081,10 @@ sub form_header {
   print qq|
 <input type=hidden name=title value="$title">
 
+<input type="hidden" name="follow_up_trans_id_1" value="| . H($form->{id}) . qq|">
+<input type="hidden" name="follow_up_trans_type_1" value="gl_transaction">
+<input type="hidden" name="follow_up_trans_info_1" value="| . H($form->{id}) . qq|">
+<input type="hidden" name="follow_up_rowcount" value="1">
 
 <table width=100%>
   <tr>
@@ -1205,6 +1214,16 @@ sub form_footer {
 
   $auth->assert('general_ledger');
 
+  my $follow_ups_block;
+  if ($form->{id}) {
+    my $follow_ups = FU->follow_ups('trans_id' => $form->{id});
+
+    if (@{ $follow_ups} ) {
+      my $num_due       = sum map { $_->{due} * 1 } @{ $follow_ups };
+      $follow_ups_block = qq|<p>| . $locale->text("There are #1 unfinished follow-ups of which #2 are due.", scalar @{ $follow_ups }, $num_due) . qq|</p>|;
+    }
+  }
+
   ($dec) = ($form->{totaldebit} =~ /\.(\d+)/);
   $dec = length $dec;
   $decimalplaces = ($dec > 2) ? $dec : 2;
@@ -1228,6 +1247,8 @@ sub form_footer {
 
 <input name=callback type=hidden value="$form->{callback}">
 
+$follow_ups_block
+
 <br>
 |;
 
@@ -1247,6 +1268,11 @@ sub form_footer {
         <input class=submit type=submit name=action value="| . $locale->text('Delete') . qq|">|;
     }
 
+    print qq|
+        <input type="button" class="submit" onclick="follow_up_window()" value="|
+      . $locale->text('Follow-Up')
+      . qq|"> |;
+
   } else {
     if ($transdate > $closedto) {
       print qq|
index 5b47194..239a859 100644 (file)
 #
 #======================================================================
 
+use SL::FU;
 use SL::IR;
 use SL::IS;
 use SL::PE;
-use List::Util qw(max);
+use List::Util qw(max sum);
 
 require "bin/mozilla/io.pl";
 require "bin/mozilla/invoice_io.pl";
@@ -400,9 +401,14 @@ sub form_header {
                         "invdate", "BL", "trigger1",
                         "duedate", "BL", "trigger2");
 
+  my $follow_up_vc         =  $form->{vendor};
+  $follow_up_vc            =~ s/--.*?//;
+  my $follow_up_trans_info =  "$form->{invnumber} ($follow_up_vc)";
+
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_form_details.js"></script>|;
   $form->{javascript} .= qq|<script type="text/javascript" src="js/common.js"></script>|;
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_vc_details.js"></script>|;
+  $form->{javascript} .= qq|<script type="text/javascript" src="js/follow_up.js"></script>|;
 
   $jsscript .= $form->write_trigger(\%myconfig, 2, "orddate", "BL", "trigger_orddate", "quodate", "BL", "trigger_quodate");
 
@@ -608,6 +614,20 @@ sub form_footer {
   $form->{invtotal}    =
     $form->format_amount(\%myconfig, $form->{invtotal}, 2, 0);
 
+  my $follow_ups_block;
+  if ($form->{id}) {
+    my $follow_ups = FU->follow_ups('trans_id' => $form->{id});
+
+    if (@{ $follow_ups} ) {
+      my $num_due       = sum map { $_->{due} * 1 } @{ $follow_ups };
+      $follow_ups_block = qq|
+      <tr>
+        <td colspan="2">| . $locale->text("There are #1 unfinished follow-ups of which #2 are due.", scalar @{ $follow_ups }, $num_due) . qq|</td>
+      </tr>
+|;
+    }
+  }
+
   print qq|
   <tr>
     <td colspan=$colspan>
@@ -623,6 +643,7 @@ sub form_footer {
                <td>$notes</td>
                <td>$intnotes</td>
              </tr>
+        $follow_ups_block
            </table>
          </td>
          <td colspan=2 align=right width=100%>
@@ -811,6 +832,9 @@ sub form_footer {
   }
     print qq|<input class=submit type=submit name=action value="|
       . $locale->text('Use As Template') . qq|">
+        <input type="button" class="submit" onclick="follow_up_window()" value="|
+      . $locale->text('Follow-Up')
+      . qq|">
 |;
 
   }
index 975cb94..b632b38 100644 (file)
 #
 #======================================================================
 
+use SL::FU;
 use SL::IS;
 use SL::PE;
 use Data::Dumper;
-use List::Util qw(max);
+use List::Util qw(max sum);
 
 require "bin/mozilla/io.pl";
 require "bin/mozilla/invoice_io.pl";
@@ -574,6 +575,11 @@ sub form_header {
   }
 
   $credittext = $locale->text('Credit Limit exceeded!!!');
+
+  my $follow_up_vc         =  $form->{customer};
+  $follow_up_vc            =~ s/--.*?//;
+  my $follow_up_trans_info =  "$form->{invnumber} ($follow_up_vc)";
+
   $onload = ($form->{resubmit} && ($form->{format} eq "html")) ? qq|window.open('about:blank','Beleg'); document.invoice.target = 'Beleg';document.invoice.submit()|
           : ($form->{resubmit})                                ? qq|document.invoice.submit()|
           : ($creditwarning)                                   ? qq|alert('$credittext')|
@@ -599,6 +605,7 @@ sub form_header {
 <script type="text/javascript" src="js/delivery_customer_selection.js"></script>
 <script type="text/javascript" src="js/vendor_selection.js"></script>
 <script type="text/javascript" src="js/calculate_qty.js"></script>
+<script type="text/javascript" src="js/follow_up.js"></script>
 
 <form method="post" name="invoice" action="$form->{script}">
 | ;
@@ -614,6 +621,11 @@ sub form_header {
 
   print qq|
 
+<input type="hidden" name="follow_up_trans_id_1" value="| . H($form->{id}) . qq|">
+<input type="hidden" name="follow_up_trans_type_1" value="sales_invoice">
+<input type="hidden" name="follow_up_trans_info_1" value="| . H($follow_up_trans_info) . qq|">
+<input type="hidden" name="follow_up_rowcount" value="1">
+
 <input type="hidden" name="lizenzen" value="$lizenzen">
 
 <div class="listtop" width="100%">$form->{title}</div>
@@ -860,6 +872,20 @@ sub form_footer {
   $form->{invtotal}    =
     $form->format_amount(\%myconfig, $form->{invtotal}, 2, 0);
 
+  my $follow_ups_block;
+  if ($form->{id}) {
+    my $follow_ups = FU->follow_ups('trans_id' => $form->{id});
+
+    if (@{ $follow_ups} ) {
+      my $num_due       = sum map { $_->{due} * 1 } @{ $follow_ups };
+      $follow_ups_block = qq|
+      <tr>
+        <td colspan="2">| . $locale->text("There are #1 unfinished follow-ups of which #2 are due.", scalar @{ $follow_ups }, $num_due) . qq|</td>
+      </tr>
+|;
+    }
+  }
+
   print qq|
   <tr>
     <td>
@@ -878,6 +904,7 @@ sub form_footer {
                 <td><select name="payment_id" onChange="if (this.value) set_duedate(['payment_id__' + this.value],['duedate'])">$payment
                 </select></td>
              </tr>
+        $follow_ups_block
            </table>
          </td>
           <td>
@@ -1095,18 +1122,18 @@ if ($form->{type} eq "credit_note") {
     print qq|<input class="submit" type="submit" name="action" value="|
       . $locale->text('Use As Template') . qq|">
 |;
-  if ($form->{id} && !($form->{type} eq "credit_note")) {
-    print qq|
+    if ($form->{id} && !($form->{type} eq "credit_note")) {
+      print qq|
     <input class="submit" type="submit" name="action" value="|
       . $locale->text('Credit Note') . qq|">
 |;
-  }
+    }
     if ($form->{radier}) {
     print qq|
     <input class="submit" type="submit" name="action" value="|
       . $locale->text('Delete') . qq|">
 |;
-  }
+    }
 
 
     if ($invdate > $closedto) {
@@ -1116,6 +1143,11 @@ if ($form->{type} eq "credit_note") {
 |;
     }
 
+    print qq|
+      <input type="button" class="submit" onclick="follow_up_window()" value="|
+      . $locale->text('Follow-Up')
+      . qq|">|;
+
   } else {
     if ($invdate > $closedto) {
       print qq|<input class="submit" type="submit" name="action" id="update_button" value="|
index 9df7232..309b3d1 100644 (file)
@@ -33,6 +33,7 @@ use SL::User;
 use SL::Form;
 
 require "bin/mozilla/common.pl";
+require "bin/mozilla/todo.pl";
 
 # This is required because the am.pl in the root directory
 # is not scanned by locales.pl:
@@ -163,6 +164,8 @@ sub company_logo {
 
   $locale             =  new Locale $myconfig{countrycode}, "login" if ($language ne $myconfig{countrycode});
 
+  $form->{todo_list}  = create_todo_list();
+
   $form->{stylesheet} =  $myconfig{stylesheet};
   $form->{title}      =  $locale->text('About');
 
@@ -188,3 +191,4 @@ sub show_error {
 
   exit;
 }
+
index cb875d1..2c613a8 100644 (file)
 
 use POSIX qw(strftime);
 
+use SL::FU;
 use SL::OE;
 use SL::IR;
 use SL::IS;
 use SL::PE;
 use SL::ReportGenerator;
-use List::Util qw(max reduce);
+use List::Util qw(max reduce sum);
 
 require "bin/mozilla/io.pl";
 require "bin/mozilla/arap.pl";
@@ -431,6 +432,19 @@ sub form_header {
 
   $credittext = $locale->text('Credit Limit exceeded!!!');
 
+  my $follow_up_vc                =  $form->{ $form->{vc} eq 'customer' ? 'customer' : 'vendor' };
+  $follow_up_vc                   =~ s/--.*?//;
+  $TMPL_VAR{follow_up_trans_info} =  ($form->{type} =~ /_quotation$/ ? $form->{quonumber} : $form->{ordnumber}) . " ($follow_up_vc)";
+
+  if ($form->{id}) {
+    my $follow_ups = FU->follow_ups('trans_id' => $form->{id});
+
+    if (scalar @{ $follow_ups }) {
+      $TMPL_VAR{num_follow_ups}     = scalar                    @{ $follow_ups };
+      $TMPL_VAR{num_due_follow_ups} = sum map { $_->{due} * 1 } @{ $follow_ups };
+    }
+  }
+
   $onload = ($form->{resubmit} && ($form->{format} eq "html")) ? "window.open('about:blank','Beleg'); document.oe.target = 'Beleg';document.oe.submit()"
           : ($form->{resubmit})                                ? "document.oe.submit()"
           : ($creditwarning)                                   ? "alert('$credittext')"
@@ -439,7 +453,7 @@ sub form_header {
   $onload .= qq|;setupDateFormat('|. $myconfig{dateformat} .qq|', '|. $locale->text("Falsches Datumsformat!") .qq|')|;
   $onload .= qq|;setupPoints('|.   $myconfig{numberformat} .qq|', '|. $locale->text("wrongformat") .qq|')|;
   $TMPL_VAR{onload} = $onload;
-  
+
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_form_details.js"></script>|;
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_history.js"></script>|;
   $form->{javascript} .= qq|<script type="text/javascript" src="js/show_vc_details.js"></script>|;
@@ -2017,3 +2031,21 @@ sub display_form {
   $lxdebug->leave_sub();
 }
 
+sub report_for_todo_list {
+  $lxdebug->enter_sub();
+
+  my $quotations = OE->transactions_for_todo_list();
+  my $content;
+
+  if (@{ $quotations }) {
+    my $edit_url = build_std_url('script=oe.pl', 'action=edit', 'type=sales_quotation', 'vc=customer');
+
+    $content     = $form->parse_html_template('oe/report_for_todo_list', { 'QUOTATIONS' => $quotations,
+                                                                           'edit_url'   => $edit_url });
+  }
+
+  $lxdebug->leave_sub();
+
+  return $content;
+}
+
diff --git a/bin/mozilla/todo.pl b/bin/mozilla/todo.pl
new file mode 100644 (file)
index 0000000..0f8cf3d
--- /dev/null
@@ -0,0 +1,82 @@
+#=====================================================================
+# 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.
+#######################################################################
+
+sub create_todo_list {
+  $lxdebug->enter_sub();
+
+  my (@todo_items, $todo_list);
+
+  push @todo_items, todo_list_follow_ups();
+  push @todo_items, todo_list_overdue_sales_quotations();
+
+  @todo_items = grep { $_ } @todo_items;
+  $todo_list  = join("", @todo_items);
+
+  $lxdebug->leave_sub();
+
+  return $todo_list;
+}
+
+sub show_todo_list {
+  $lxdebug->enter_sub();
+
+  $form->{todo_list} = create_todo_list();
+  $form->{title}     = $locale->text('TODO list');
+
+  $form->header();
+  print $form->parse_html_template('todo/show_todo_list');
+
+  $lxdebug->leave_sub();
+}
+
+sub todo_list_follow_ups {
+  $lxdebug->enter_sub();
+
+  require "bin/mozilla/fu.pl";
+
+  my $content = report_for_todo_list();
+
+  $lxdebug->leave_sub();
+
+  return $content;
+}
+
+sub todo_list_overdue_sales_quotations {
+  $lxdebug->enter_sub();
+
+  require "bin/mozilla/oe.pl";
+
+  my $content = report_for_todo_list();
+
+  $lxdebug->leave_sub();
+
+  return $content;
+}
+
+1;
diff --git a/fu.pl b/fu.pl
new file mode 120000 (symlink)
index 0000000..385000d
--- /dev/null
+++ b/fu.pl
@@ -0,0 +1 @@
+am.pl
\ No newline at end of file
diff --git a/image/Productivity.png b/image/Productivity.png
new file mode 100644 (file)
index 0000000..fa1d076
Binary files /dev/null and b/image/Productivity.png differ
diff --git a/js/follow_up.js b/js/follow_up.js
new file mode 100644 (file)
index 0000000..407341e
--- /dev/null
@@ -0,0 +1,29 @@
+function follow_up_window() {
+  var width = 900;
+  var height = 700;
+  var parm = centerParms(width, height) + ",width=" + width + ",height=" + height + ",status=yes,scrollbars=yes";
+
+  url = "fu.pl?" +
+    "action=add" + "&" +
+    "POPUP_MODE=1";
+
+  var trans_rowcount = document.getElementsByName("follow_up_rowcount");
+
+  if (typeof trans_rowcount != "undefined") {
+    for (i = 1; i <= trans_rowcount[0].value; i++) {
+      var trans_id   = document.getElementsByName("follow_up_trans_id_" + i);
+      var trans_type = document.getElementsByName("follow_up_trans_type_" + i);
+      var trans_info = document.getElementsByName("follow_up_trans_info_" + i);
+
+      url += "&" +
+        "trans_id_"   + i + "=" + escape_more(typeof trans_id   != "undefined" ? trans_id[0].value   : "") + "&" +
+        "trans_type_" + i + "=" + escape_more(typeof trans_type != "undefined" ? trans_type[0].value : "") + "&" +
+        "trans_info_" + i + "=" + escape_more(typeof trans_info != "undefined" ? trans_info[0].value : "");
+    }
+
+    url += "&trans_rowcount=" + escape_more(trans_rowcount[0].value);
+  }
+
+  //alert(url);
+  window.open(url, "_new_generic", parm);
+}
index ff7bdbe..e26c8b1 100644 (file)
@@ -103,6 +103,8 @@ $self->{texts} = {
   'Add Department'              => 'Abteilung erfassen',
   'Add Dunning'                 => 'Mahnung erzeugen',
   'Add Exchangerate'            => 'Wechselkurs erfassen',
+  'Add Follow-Up'               => 'Wiedervorlage erstellen',
+  'Add Follow-Up for #1'        => 'Wiedervorlage f&uuml;r #1 erstellen',
   'Add General Ledger Transaction' => 'Dialogbuchen',
   'Add Group'                   => 'Warengruppe erfassen',
   'Add Language'                => 'Sprache hinzufügen',
@@ -129,6 +131,7 @@ $self->{texts} = {
   'Add a new group'             => 'Neue Gruppe erfassen',
   'Add and edit %s'             => '%s hinzuf&uuml;gen und bearbeiten',
   'Add custom variable'         => 'Benutzerdefinierte Variable erfassen',
+  'Add note'                    => 'Notiz erfassen',
   'Add to group'                => 'Zu Gruppe hinzufügen',
   'Add unit'                    => 'Einheit hinzuf&uuml;gen',
   'Address'                     => 'Adresse',
@@ -141,6 +144,8 @@ $self->{texts} = {
   'All changes in that file have been reverted.' => 'Alle &Auml;nderungen in dieser Datei wurden r&uuml;ckg&auml;ngig gemacht.',
   'All database upgrades have been applied.' => 'Alle Datenbankupdates wurden eingespielt.',
   'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
+  'Allow access'                => 'Zugriff erlauben',
+  'Allow the following users access to my follow-ups:' => 'Erlaube den folgenden Benutzern Zugriff auf meine Wiedervorlagen:',
   'Alternatively you can skip this step and create groups yourself.' => 'Alternativ k&ouml;nnen Sie diesen Schritt &uuml;berspringen und selber Gruppen anlegen.',
   'Amended Advance Turnover Tax Return' => 'Berichtigte Anmeldung',
   'Amended Advance Turnover Tax Return (Nr. 10)' => 'Ist dies eine berichtigte Anmeldung? (Nr. 10/Zeile 15 Steuererklärung)',
@@ -209,6 +214,7 @@ aktualisieren wollen?',
   'Birthday'                    => 'Geburtstag',
   'Bis'                         => 'bis',
   'Bis Konto: '                 => 'bis Konto: ',
+  'Body'                        => 'Text',
   '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.',
@@ -226,6 +232,7 @@ aktualisieren wollen?',
   'CANCELED'                    => 'Storniert',
   'CSV export -- options'       => 'CSV-Export -- Optionen',
   'Calculate'                   => 'Berechnen',
+  'Cancel'                      => 'Abbrechen',
   'Cancel Accounts Payables Transaction' => 'Kreditorenbuchung stornieren',
   'Cancel Accounts Receivables Transaction' => 'Debitorenbuchung stornieren',
   'Cannot create Lock!'         => 'System kann nicht gesperrt werden!',
@@ -324,6 +331,9 @@ aktualisieren wollen?',
   'Create invoice?'             => 'Rechnung erstellen?',
   'Create new'                  => 'Neu erfassen',
   'Create tables'               => 'Tabellen anlegen',
+  'Created by'                  => 'Erstellt von',
+  'Created for'                 => 'Erstellt f&uuml;r',
+  'Created on'                  => 'Erstellt am',
   'Credit'                      => 'Haben',
   'Credit Account'              => 'Habenkonto',
   'Credit Limit'                => 'Kreditlimit',
@@ -438,6 +448,7 @@ aktualisieren wollen?',
   'Due Date'                    => 'Fälligkeitsdatum',
   'Due Date missing!'           => 'Fälligkeitsdatum fehlt!',
   'Duedate +Days'               => 'Fällikeitsdatum +Tage',
+  'Dunning'                     => 'Mahnung',
   'Dunning Amount'              => 'gemahnter Betrag',
   'Dunning Date'                => 'Mahndatum',
   'Dunning Date from'           => 'Mahnungen von',
@@ -469,6 +480,8 @@ aktualisieren wollen?',
   'EUR'                         => 'E/Ü-Rechnung',
   'Edit'                        => 'Bearbeiten',
   'Edit '                       => 'Bearbeiten',
+  'Edit Access Rights'          => 'Zugriffsrechte bearbeiten',
+  'Edit Access Rights for Follow-Ups' => 'Zugriffsrechte f&uuml;r Wiedervorlagen bearbeiten',
   'Edit Account'                => 'Kontodaten bearbeiten',
   'Edit Accounting Group'       => 'Buchungsgruppe bearbeiten',
   'Edit Accounts Payables Transaction' => 'Kreditorenbuchung bearbeiten',
@@ -481,6 +494,8 @@ aktualisieren wollen?',
   'Edit Department'             => 'Abteilung bearbeiten',
   'Edit Dunning'                => 'Mahnungen konfigurieren',
   'Edit Dunning Process Config' => 'Mahnwesenkonfiguration bearbeiten',
+  'Edit Follow-Up'              => 'Wiedervorlage bearbeiten',
+  'Edit Follow-Up for #1'       => 'Wiedervorlage f&uuml;r #1 bearbeiten',
   'Edit General Ledger Transaction' => 'Buchung im Hauptbuch bearbeiten',
   'Edit Group'                  => 'Warengruppe editieren',
   'Edit Language'               => 'Sprache bearbeiten',
@@ -509,6 +524,7 @@ aktualisieren wollen?',
   'Edit group '                 => 'Gruppe bearbeiten',
   'Edit group membership'       => 'Gruppenmitgliedschaften bearbeiten',
   'Edit groups'                 => 'Gruppen bearbeiten',
+  'Edit note'                   => 'Notiz bearbeiten',
   'Edit rights'                 => 'Rechte bearbeiten',
   'Edit templates'              => 'Vorlage bearbeiten',
   'Edit the membership of all users in all groups:' => 'Bearbeiten der Mitgliedschaft aller Benutzer in allen Gruppen:',
@@ -538,6 +554,7 @@ aktualisieren wollen?',
   'Exchangerate missing!'       => 'Es fehlt der Wechselkurs!',
   'Existing Buchungsgruppen'    => 'Existierende Buchungsgruppen',
   'Existing Datasets'           => 'existierende Datenbanken',
+  'Existing pending follow-ups for this item' => 'Noch nicht erledigte Wiedervorlagen f&uuml;r dieses Dokument',
   'Expense'                     => 'Aufwandskonto',
   'Expense Account'             => 'Aufwandskonto',
   'Expense accno'               => 'Aufwandskonto',
@@ -562,7 +579,17 @@ aktualisieren wollen?',
   'Fee'                         => 'Gebühr',
   'File'                        => 'Datei',
   'Files created by Lx-Office\'s &quot;Backup Dataset&quot; function are such files.' => 'Dateien, die von Lx-Office\' Funktion &quot;Datenbank sichern&quot; erstellt wurden, erf&uuml;llen diese Kriterien.',
+  'Finish'                      => 'Abschlie&szlig;en',
   'Folgekonto'                  => 'Folgekonto',
+  'Follow-Up'                   => 'Wiedervorlage',
+  'Follow-Up Date'              => 'Wiedervorlagedatum',
+  'Follow-Up On'                => 'Wiedervorlage am',
+  'Follow-Up done'              => 'Wiedervorlage erledigt',
+  'Follow-Up for'               => 'Wiedervorlage f&uuml;r',
+  'Follow-Up for user'          => 'Wiedervorlage f&uuml;r Benutzer',
+  'Follow-Up saved.'            => 'Wiedervorlage gespeichert.',
+  'Follow-Ups'                  => 'Wiedervorlagen',
+  'Follow-up for'               => 'Wiedervorlage für',
   'Font size'                   => 'Schriftgr&ouml;&szlig;e',
   'For each unit there\'s either no or exactly one base unit. If you chose a base unit then you also have to chose a factor. That way the new unit will be defined as a multiple of the base unit. The base unit must be the &quot;smaller&quot; one. A factor may not be less than 1. Therefore you may define &quot;kg&quot; with the base unit &quot;g&quot; and a factor of &quot;1&quot;, but not the other way round.' => 'Einheiten haben entweder keine oder genau eine Basiseinheit, von der sie ein Vielfaches sind. Wenn Sie eine Basiseinheit ausw&auml;hlen, dann m&uuml;ssen Sie auch einen Faktor eingeben. Sie m&uuml;ssen Einheiten als ein Vielfaches einer kleineren Einheit eingeben. So ist die Definition von &quot;kg&quot; mit der Basiseinheit &quot;g&quot; und dem Faktor 1000 zul&auml;ssig, die Definition von &quot;g&quot; mit der Basiseinheit &quot;kg&quot; und dem Faktor &quot;0,001&quot; hingegen nicht.',
   'Foreign Exchange Gain'       => 'Wechselkurserträge',
@@ -644,6 +671,7 @@ aktualisieren wollen?',
   'Introduction of Buchungsgruppen' => 'Einf&uuml;hrung von Buchungsgruppen',
   'Introduction of units'       => 'Einf&uuml;hrung von Einheiten',
   'Inv. Duedate'                => 'Rg. Fälligkeit',
+  'Invalid follow-up ID.'       => 'Ung&uuml;ltige Wiedervorlage-ID.',
   'Invdate'                     => 'Rechnungsdatum',
   'Invdate from'                => 'Rechnungen von',
   'Inventory'                   => 'Inventar',
@@ -840,6 +868,7 @@ aktualisieren wollen?',
   'None'                        => 'Kein',
   'Not Discountable'            => 'Nicht rabattierfähig',
   'Not delivered'               => 'Nicht geliefert',
+  'Not done yet'                => 'Noch nicht fertig',
   'Not obsolete'                => 'Gültig',
   'Note'                        => 'Hinweis',
   'Notes'                       => 'Bemerkungen',
@@ -864,6 +893,7 @@ aktualisieren wollen?',
   'On Hand'                     => 'Auf Lager',
   'On Order'                    => 'Ist bestellt',
   'One or more Perl modules missing' => 'Ein oder mehr Perl-Module fehlen',
+  'Only due follow-ups'         => 'Nur f&auml;llige Wiedervorlagen',
   'Open'                        => 'Offen',
   'OpenDocument/OASIS'          => 'OpenDocument/OASIS',
   'Openings'                    => 'Öffnungszeiten',
@@ -878,6 +908,7 @@ aktualisieren wollen?',
   'Ordered'                     => 'Vom Kunde bestellt',
   'Orientation'                 => 'Seitenformat',
   'Orphaned'                    => 'Nie benutzt',
+  'Other users\' follow-ups'    => 'Wiedervorlagen anderer Benutzer',
   'Other values are ignored.'   => 'Andere Eingaben werden ignoriert.',
   'Others'                      => 'Andere',
   'Otherwise all users will only have access to their own settings.' => 'Andernfalls haben alle Benutzer nur Zugriff auf ihre Benutzereinstellungen.',
@@ -885,6 +916,7 @@ aktualisieren wollen?',
   'Out of balance!'             => 'Summen stimmen nicht berein!',
   'Output Number Format'        => 'Zahlenformat (Ausgabe)',
   'Outputformat'                => 'Ausgabeformat',
+  'Overdue sales quotations'    => '&Uuml;berf&auml;llige Angebote',
   'Own Product'                 => 'eigenes Produkt',
   'PAYMENT POSTED'              => 'Rechung gebucht',
   'PDF'                         => 'PDF',
@@ -983,6 +1015,7 @@ aktualisieren wollen?',
   'Prior to Lx-Office v2.4.0 the user had to chose the accounts for each part and service.' => 'Vor Lx-Office 2.4.0 musste der Benutzer die Konten bei jeder Ware und jeder Dienstleistung einzeln ausw&auml;hlen.',
   'Private E-mail'              => 'Private eMail',
   'Private Phone'               => 'Privates Tel.',
+  'Productivity'                => 'Produktivit&auml;t',
   'Profit Center'               => 'Erfolgsbereich',
   'Proforma Invoice'            => 'Proformarechnung',
   'Programm'                    => 'Programm',
@@ -1045,6 +1078,7 @@ aktualisieren wollen?',
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
   'Request for Quotations'      => 'Anfragen',
+  'Request quotation'           => 'Preisanfrage',
   'Required by'                 => 'Lieferdatum',
   'Restore Dataset'             => 'Datenbank wiederherstellen',
   'Revenue'                     => 'Erlöskonto',
@@ -1061,6 +1095,7 @@ aktualisieren wollen?',
   'Sales Order'                 => 'Kundenauftrag',
   'Sales Orders'                => 'Aufträge',
   'Sales invoice number'        => 'Ausgangsrechnungsnummer',
+  'Sales quotation'             => 'Angebot',
   'Salesman'                    => 'Verkäufer/in',
   'Salesperson'                 => 'Verkäufer',
   'Same as the quote character' => 'Wie Anf&uuml;hrungszeichen',
@@ -1124,6 +1159,7 @@ aktualisieren wollen?',
   'Shopartikel'                 => 'Shopartikel',
   'Short'                       => 'Knapp',
   'Show'                        => 'Zeigen',
+  'Show TODO list'              => 'Aufgabenliste anzeigen',
   'Show by default'             => 'Standardm&auml;&szlig;ig anzeigen',
   'Show details'                => 'Details anzeigen',
   'Show old dunnings'           => 'Alte Mahnungen anzeigen',
@@ -1157,6 +1193,7 @@ aktualisieren wollen?',
   'Subtotal'                    => 'Zwischensumme',
   'Superuser name'              => 'Datenbankadministrator',
   'System'                      => 'System',
+  'TODO list'                   => 'Aufgabenliste',
   'TOP100'                      => 'Top 100',
   'Tax'                         => 'Steuer',
   'Tax Consultant'              => 'Steuerberater/-in',
@@ -1203,6 +1240,7 @@ aktualisieren wollen?',
   'Text, text field and number variables: The default value will be used as-is.' => 'Textzeilen, Textfelder und Zahlenvariablen: Der Standardwert wird so wie er ist &uuml;bernommen.',
   '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 access rights have been saved.' => 'Die Zugriffsrechte wurden gespeichert.',
   'The authentication configuration file &quot;config/authentication.pl&quot; does not exist. This Lx-Office installation has probably not been updated correctly yet. Please contact your administrator.' => 'Die Konfigurationsdatei f&uuml;r die Authentifizierung &quot;config/authentication.pl&quot; wurde nicht gefunden. Diese Lx-Office-Installation wurde vermutlich noch nicht vollst&auml;ndig aktualisiert oder eingerichtet. Bitte wenden Sie sich an Ihren Administrator.',
   'The authentication database is not reachable at the moment. Either it hasn\'t been set up yet or the database server might be down. Please contact your administrator.' => 'Die Authentifizierungsdatenbank kann momentan nicht erreicht werden. Entweder wurde sie noch nicht eingerichtet, oder der Datenbankserver antwortet nicht. Bitte wenden Sie sich an Ihren Administrator.',
   'The available options depend on the varibale type:' => 'Die verf&uuml;gbaren Optionen h&auml;ngen vom Variablentypen ab:',
@@ -1238,6 +1276,7 @@ aktualisieren wollen?',
   'The email address is missing.' => 'Die Emailadresse fehlt.',
   'The factor is missing in row %d.' => 'Der Faktor fehlt in Zeile %d.',
   'The factor is missing.'      => 'Der Faktor fehlt.',
+  'The follow-up date is missing.' => 'Das Wiedervorlagedatum fehlt.',
   'The following Buchungsgruppen have already been created:' => 'Die folgenden Buchungsgruppen wurden bereits angelegt:',
   'The following Datasets need to be updated' => 'Folgende Datenbanken müssen aktualisiert werden',
   'The following drafts have been saved and can be loaded.' => 'Die folgenden Entw&uuml;rfe wurden gespeichert und k&ouml;nnen geladen werden.',
@@ -1267,6 +1306,7 @@ aktualisieren wollen?',
   '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.',
+  'The subject is missing.'     => 'Der Betreff fehlt.',
   'The tables for user management and authentication do not exist. They will be created in the next step in the following database:' => 'Die Tabellen zum Speichern der Benutzerdaten und zur Benutzerauthentifizierung wurden nicht gefunden. Sie werden in der folgenden Datenbank angelegt:',
   'The tabulator character'     => 'Das Tabulator-Symbol',
   'The third way is to download the module from the above mentioned URL and to install the module manually following the installations instructions contained in the source archive.' => 'Die dritte Variante besteht darin, das Paket von der oben genannten URL herunterzuladen und es manuell zu installieren. Beachten Sie dabei die im Paket enthaltenen Installationsanweisungen.',
@@ -1279,7 +1319,9 @@ aktualisieren wollen?',
   'The user is a member in the following group(s):' => 'Der Benutzer ist Mitglied in den folgenden Gruppen:',
   'The user migration process is complete.' => 'Der Prozess der Benutzerdatenmigration ist abgeschlossen.',
   'The variable name must only consist of letters, numbers and underscores. It must begin with a letter. Example: send_christmas_present' => 'Der Variablenname darf nur aus Zeichen (keine Umlaute), Ziffern und Unterstrichen bestehen. Er muss mit einem Buchstaben beginnen. Beispiel: weihnachtsgruss_verschicken',
+  'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 f&auml;llig ist/sind.',
   'There are four tax zones.'   => 'Es gibt vier Steuerzonen.',
+  'There are no items on your TODO list at the moment.' => 'Ihre Aufgabenliste enth&auml;lt momentan keine Eintr&auml;ge.',
   'There are still entries in the database for which no unit has been assigned.' => 'Es gibt noch Eintr&auml;ge in der Datenbank, f&uuml;r die keine Einheit zugeordnet ist.',
   'There are usually three ways to install Perl modules.' => 'Es gibt normalerweise drei Arten, ein Perlmodul zu installieren.',
   'There is nothing to do in this step.' => 'In diesem Schritt gibt es nichts mehr zu tun.',
@@ -1335,6 +1377,7 @@ aktualisieren wollen?',
   'UStVa'                       => 'UStVa',
   'UStVa Einstellungen'         => 'UStVa Einstellungen',
   'Unbalanced Ledger'           => 'Bilanzfehler',
+  'Unfinished follow-ups'       => 'Nicht erledigte Wiedervorlagen',
   'Unit'                        => 'Einheit',
   'Unit of measure'             => 'Maßeinheit',
   'Units'                       => 'Einheiten',
@@ -1417,9 +1460,11 @@ aktualisieren wollen?',
   'You have to chose which unit to save for each of them.' => 'Sie m&uuml;ssen f&uuml;r jeden Artikel die neue Einheit ausw&auml;hlen.',
   'You have to create at least one group, grant it access to Lx-Office\'s functions and assign users to it.' => 'Sie m&uuml;ssen mindestens eine Benutzergruppe anlegen, ihr Zugriff auf die verschiedenen Funktionsbereiche von Lx-Office gew&auml;hren und Benutzer dieser Gruppe zuordnen.',
   'You have to create new Buchungsgruppen for all the combinations of inventory, income and expense accounts that have been used already.' => 'Sie m&uuml;ssen neue Buchungsgruppen f&uuml;r alle Kombinationen aus Inventar-, Erl&ouml;s- und Aufwandskonto, die bereits benutzt wurden.',
+  'You must chose a user.'      => 'Sie m&uuml;ssen einen Benutzer ausw&auml;hlen.',
   'You will now be forwarded to the administration panel.' => 'Sie werden nun zum Administrationsbereich weitergeleitet.',
   'You\'re not editing a file.' => 'Sie bearbeiten momentan keine Datei.',
   'You\'ve already chosen the following limitations:' => 'Sie haben bereits die folgenden Einschr&auml;nkungen vorgenommen:',
+  'Your TODO list'              => 'Ihre Aufgabenliste',
   'Zeitpunkt'                   => 'Zeitpunkt',
   'Zeitraum'                    => 'Zeitraum',
   'Zero amount posting!'        => 'Buchung ohne Wert',
@@ -1462,6 +1507,8 @@ aktualisieren wollen?',
   'eMail?'                      => 'eMail?',
   'ea'                          => 'St.',
   'emailed to'                  => 'gemailt an',
+  'follow_up_list'              => 'wiedervorlageliste',
+  'for'                         => 'f&uuml;r',
   'for Period'                  => 'für den Zeitraum',
   'from (time)'                 => 'von',
   'general_ledger_list'         => 'buchungsjournal',
index c6877f3..00fc68c 100644 (file)
@@ -1,9 +1,11 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AP Transaction (abbreviation)' => 'K',
   'AP Transactions'             => 'Kreditorenbuchungen',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Account'                     => 'Konto',
   'Add Accounts Payables Transaction' => 'Kreditorenbuchung erfassen',
   'Address'                     => 'Adresse',
@@ -55,6 +57,7 @@ $self->{texts} = {
   'Credit Limit'                => 'Kreditlimit',
   'Credit Note'                 => 'Gutschrift',
   'Currency'                    => 'Währung',
+  'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
@@ -76,6 +79,7 @@ $self->{texts} = {
   'Draft saved.'                => 'Entwurf gespeichert.',
   'Due Date'                    => 'Fälligkeitsdatum',
   'Due Date missing!'           => 'Fälligkeitsdatum fehlt!',
+  'Dunning'                     => 'Mahnung',
   'ELSE'                        => 'Zusatz',
   'Edit Accounts Payables Transaction' => 'Kreditorenbuchung bearbeiten',
   'Employee'                    => 'Bearbeiter',
@@ -89,7 +93,9 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'Follow-Up'                   => 'Wiedervorlage',
   'From'                        => 'Von',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
@@ -166,9 +172,13 @@ $self->{texts} = {
   'Remaining'                   => 'Rest',
   'Remove draft when posting'   => 'Entwurf beim Buchen l&ouml;schen',
   'Reports'                     => 'Berichte',
+  'Request quotation'           => 'Preisanfrage',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Salesperson'                 => 'Verkäufer',
   'Save draft'                  => 'Entwurf speichern',
   'Select a Customer'           => 'Endkunde auswählen',
@@ -197,6 +207,7 @@ $self->{texts} = {
   '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.',
+  'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 f&auml;llig ist/sind.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
   'Transaction %d cancelled.'   => 'Buchung %d erfolgreich storniert.',
@@ -214,6 +225,7 @@ $self->{texts} = {
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor details'              => 'Lieferantendetails',
   'Vendor missing!'             => 'Lieferant fehlt!',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
index c4b7b96..a933ee2 100644 (file)
@@ -1,7 +1,9 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'AR Transaction (abbreviation)' => 'D',
   'AR Transactions'             => 'Debitorenbuchungen',
   'Account'                     => 'Konto',
@@ -80,6 +82,7 @@ $self->{texts} = {
   'Draft saved.'                => 'Entwurf gespeichert.',
   'Due Date'                    => 'Fälligkeitsdatum',
   'Due Date missing!'           => 'Fälligkeitsdatum fehlt!',
+  'Dunning'                     => 'Mahnung',
   'ELSE'                        => 'Zusatz',
   'Edit Accounts Receivables Transaction' => 'Debitorenbuchung bearbeiten',
   'Enter longdescription'       => 'Langtext eingeben',
@@ -94,7 +97,9 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'Follow-Up'                   => 'Wiedervorlage',
   'From'                        => 'Von',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
@@ -172,9 +177,13 @@ $self->{texts} = {
   'Remaining'                   => 'Rest',
   'Remove draft when posting'   => 'Entwurf beim Buchen l&ouml;schen',
   'Reports'                     => 'Berichte',
+  'Request quotation'           => 'Preisanfrage',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Salesperson'                 => 'Verkäufer',
   'Save draft'                  => 'Entwurf speichern',
   'Select a Customer'           => 'Endkunde auswählen',
@@ -206,6 +215,7 @@ $self->{texts} = {
   '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.',
+  'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 f&auml;llig ist/sind.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
   'Transaction %d cancelled.'   => 'Buchung %d erfolgreich storniert.',
@@ -222,6 +232,8 @@ $self->{texts} = {
   'Use As Template'             => 'Als Vorlage verwenden',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
+  'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor details'              => 'Lieferantendetails',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
   'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
index bc7e0a1..fc9b464 100644 (file)
@@ -1,7 +1,9 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Add Customer'                => 'Kunde erfassen',
   'Add Vendor'                  => 'Lieferant erfassen',
   'Address'                     => 'Adresse',
@@ -37,6 +39,7 @@ $self->{texts} = {
   'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
   'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
+  'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer deleted!'           => 'Kunde gelöscht!',
   'Customer details'            => 'Kundendetails',
@@ -49,6 +52,7 @@ $self->{texts} = {
   'Date'                        => 'Datum',
   'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
   'Directory'                   => 'Verzeichnis',
+  'Dunning'                     => 'Mahnung',
   'E-mail'                      => 'eMail',
   'ELSE'                        => 'Zusatz',
   'Edit Customer'               => 'Kunde editieren',
@@ -57,6 +61,7 @@ $self->{texts} = {
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'Fax'                         => 'Fax',
   'File'                        => 'Datei',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
@@ -101,11 +106,14 @@ $self->{texts} = {
   'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
   'Reports'                     => 'Berichte',
   'Request for Quotation'       => 'Anfrage',
+  'Request quotation'           => 'Preisanfrage',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
   'SIC'                         => 'SIC',
+  'Sales Invoice'               => 'Rechnung',
   'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Select a Customer'           => 'Endkunde auswählen',
   'Select a customer'           => 'Einen Kunden ausw&auml;hlen',
   'Select a vendor'             => 'Einen Lieferanten ausw&auml;hlen',
@@ -132,6 +140,8 @@ $self->{texts} = {
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
+  'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor deleted!'             => 'Lieferant gelöscht!',
   'Vendor details'              => 'Lieferantendetails',
index 2db8e02..52b9c54 100644 (file)
@@ -3,7 +3,9 @@ $self->{texts} = {
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
   'Add Request for Quotation'   => 'Anfrage erfassen',
@@ -53,6 +55,7 @@ $self->{texts} = {
   'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
   'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
+  'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'Customername'                => 'Kundenname',
@@ -68,6 +71,7 @@ $self->{texts} = {
   'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
   'Directory'                   => 'Verzeichnis',
   'Discount'                    => 'Rabatt',
+  'Dunning'                     => 'Mahnung',
   'Dunning Date'                => 'Mahndatum',
   'Dunning Description missing in row ' => 'Mahnstufenbeschreibung fehlt in Zeile ',
   'Dunning Duedate'             => 'Zahlbar bis',
@@ -90,6 +94,7 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
@@ -179,10 +184,14 @@ $self->{texts} = {
   'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
+  'Request quotation'           => 'Preisanfrage',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Screen'                      => 'Bildschirm',
   'Search Dunning'              => 'Mahnung suchen',
   'Select a Customer'           => 'Endkunde auswählen',
@@ -223,6 +232,8 @@ $self->{texts} = {
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
+  'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
   'Yes'                         => 'Ja',
diff --git a/locale/de/fu b/locale/de/fu
new file mode 100644 (file)
index 0000000..fecb45f
--- /dev/null
@@ -0,0 +1,172 @@
+$self->{texts} = {
+  'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
+  'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
+  'Add Follow-Up'               => 'Wiedervorlage erstellen',
+  'Add Follow-Up for #1'        => 'Wiedervorlage f&uuml;r #1 erstellen',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
+  '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.',
+  'Body'                        => 'Text',
+  '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',
+  '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',
+  'Created by'                  => 'Erstellt von',
+  'Created for'                 => 'Erstellt f&uuml;r',
+  'Created on'                  => 'Erstellt am',
+  'Credit Note'                 => 'Gutschrift',
+  'Customer'                    => 'Kunde',
+  'DATEV Export'                => 'DATEV-Export',
+  'DELETED'                     => 'Gelöscht',
+  'DUNNING STARTED'             => 'Mahnprozess gestartet',
+  'Dataset upgrade'             => 'Datenbankaktualisierung',
+  'Date'                        => 'Datum',
+  'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
+  'Directory'                   => 'Verzeichnis',
+  'Done'                        => 'Fertig',
+  'Dunning'                     => 'Mahnung',
+  'ELSE'                        => 'Zusatz',
+  'Edit Access Rights for Follow-Ups' => 'Zugriffsrechte f&uuml;r Wiedervorlagen bearbeiten',
+  'Edit Follow-Up'              => 'Wiedervorlage bearbeiten',
+  'Edit Follow-Up for #1'       => 'Wiedervorlage f&uuml;r #1 bearbeiten',
+  'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
+  'File'                        => 'Datei',
+  'Follow-Up Date'              => 'Wiedervorlagedatum',
+  'Follow-Up saved.'            => 'Wiedervorlage gespeichert.',
+  'Follow-Ups'                  => 'Wiedervorlagen',
+  'Follow-up for'               => 'Wiedervorlage für',
+  'GL Transaction'              => 'Dialogbuchung',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
+  'Invalid follow-up ID.'       => 'Ung&uuml;ltige Wiedervorlage-ID.',
+  'Invoice'                     => 'Rechnung',
+  'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
+  '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\'.',
+  'No'                          => 'Nein',
+  'No action defined.'          => 'Keine Aktion definiert.',
+  'No or an unknown authenticantion module specified in "config/authentication.pl".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/authentication.pl" angegeben.',
+  'Not done yet'                => 'Noch nicht fertig',
+  'Only due follow-ups'         => 'Nur f&auml;llige Wiedervorlagen',
+  'Other users\' follow-ups'    => 'Wiedervorlagen anderer Benutzer',
+  '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',
+  'Pick List'                   => 'Sammelliste',
+  'Proforma Invoice'            => 'Proformarechnung',
+  'Purchase Order'              => 'Lieferantenauftrag',
+  'Quotation'                   => 'Angebot',
+  'RFQ'                         => 'Anfrage',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reference'                   => 'Referenz',
+  'Reports'                     => 'Berichte',
+  'Request quotation'           => 'Preisanfrage',
+  'SAVED'                       => 'Gespeichert',
+  'SAVED FOR DUNNING'           => 'Gespeichert',
+  'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
+  '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 access rights have been saved.' => 'Die Zugriffsrechte wurden gespeichert.',
+  '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 follow-up date is missing.' => 'Das Wiedervorlagedatum fehlt.',
+  'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
+  'The subject is missing.'     => 'Der Betreff fehlt.',
+  'To (email)'                  => 'An',
+  'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
+  'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
+  'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
+  '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.',
+  'You must chose a user.'      => 'Sie m&uuml;ssen einen Benutzer ausw&auml;hlen.',
+  '[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".',
+  'follow_up_list'              => 'wiedervorlageliste',
+  'invoice'                     => 'Rechnung',
+  'packing_list'                => 'Versandliste',
+  'pick_list'                   => 'Entnahmeliste',
+  'proforma'                    => 'Proforma',
+  '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',
+};
+
+$self->{subs} = {
+  '_collect_links'              => '_collect_links',
+  'add'                         => 'add',
+  'continue'                    => 'continue',
+  'delete'                      => 'delete',
+  'dispatcher'                  => 'dispatcher',
+  'display_form'                => 'display_form',
+  'edit'                        => 'edit',
+  'edit_access_rights'          => 'edit_access_rights',
+  'finish'                      => 'finish',
+  'report'                      => 'report',
+  'report_for_todo_list'        => 'report_for_todo_list',
+  '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',
+  'save'                        => 'save',
+  'save_access_rights'          => 'save_access_rights',
+  'save_follow_up'              => 'save_follow_up',
+  'search'                      => 'search',
+  'update'                      => 'update',
+  'abbrechen'                   => 'cancel',
+  'weiter'                      => 'continue',
+  'löschen'                     => 'delete',
+  'abschlie&szlig;en'           => 'finish',
+  'speichern'                   => 'save',
+};
+
+1;
index 5ecf7a9..d31f7fe 100644 (file)
@@ -1,7 +1,9 @@
 $self->{texts} = {
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Account'                     => 'Konto',
   'Add General Ledger Transaction' => 'Dialogbuchen',
   'Address'                     => 'Adresse',
@@ -59,6 +61,7 @@ $self->{texts} = {
   'Credit Note'                 => 'Gutschrift',
   'Credit Tax'                  => 'Umsatzsteuer',
   'Credit Tax Account'          => 'Umsatzsteuerkonto',
+  'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'DATEV Export'                => 'DATEV-Export',
@@ -79,6 +82,7 @@ $self->{texts} = {
   'Description'                 => 'Beschreibung',
   'Description missing!'        => 'Beschreibung fehlt.',
   'Directory'                   => 'Verzeichnis',
+  'Dunning'                     => 'Mahnung',
   'ELSE'                        => 'Zusatz',
   'Edit General Ledger Transaction' => 'Buchung im Hauptbuch bearbeiten',
   'Empty transaction!'          => 'Buchung ist leer!',
@@ -90,7 +94,9 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'Follow-Up'                   => 'Wiedervorlage',
   'From'                        => 'Von',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'History'                     => 'Historie',
   'ID'                          => 'Buchungsnummer',
@@ -159,10 +165,14 @@ $self->{texts} = {
   'Reference'                   => 'Referenz',
   'Reference missing!'          => 'Referenz fehlt!',
   'Reports'                     => 'Berichte',
+  'Request quotation'           => 'Preisanfrage',
   'Revenue'                     => 'Erlöskonto',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Select a Customer'           => 'Endkunde auswählen',
   'Select a customer'           => 'Einen Kunden ausw&auml;hlen',
   'Select a vendor'             => 'Einen Lieferanten ausw&auml;hlen',
@@ -186,6 +196,7 @@ $self->{texts} = {
   '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.',
+  'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 f&auml;llig ist/sind.',
   'To (email)'                  => 'An',
   'To (time)'                   => 'Bis',
   'Transaction %d cancelled.'   => 'Buchung %d erfolgreich storniert.',
@@ -200,6 +211,8 @@ $self->{texts} = {
   'Update'                      => 'Erneuern',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
+  'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor details'              => 'Lieferantendetails',
   '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.',
index 15515f2..0297072 100644 (file)
@@ -4,7 +4,9 @@ $self->{texts} = {
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Accounting Menu'             => 'Kontoverwaltung',
   'Active'                      => 'Aktiv',
   'Add '                        => 'Hinzufügen',
@@ -62,6 +64,7 @@ $self->{texts} = {
   'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
   'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
+  'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'DATEV Export'                => 'DATEV-Export',
@@ -79,6 +82,7 @@ $self->{texts} = {
   'Directory'                   => 'Verzeichnis',
   'Discount'                    => 'Rabatt',
   'Drawing'                     => 'Zeichnung',
+  'Dunning'                     => 'Mahnung',
   'E-mail'                      => 'eMail',
   'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
   'EAN'                         => 'EAN',
@@ -97,6 +101,7 @@ $self->{texts} = {
   'February'                    => 'Februar',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
@@ -211,10 +216,14 @@ $self->{texts} = {
   'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
+  'Request quotation'           => 'Preisanfrage',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Save'                        => 'Speichern',
   'Save as new'                 => 'als neu speichern',
   'Screen'                      => 'Bildschirm',
@@ -267,6 +276,8 @@ $self->{texts} = {
   'Updated'                     => 'Erneuert am',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
+  'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
   'Weight'                      => 'Gewicht',
index 15a5879..3eccdec 100644 (file)
@@ -3,7 +3,9 @@ $self->{texts} = {
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
   'Add Request for Quotation'   => 'Anfrage erfassen',
@@ -44,6 +46,7 @@ $self->{texts} = {
   'Create and edit sales quotations' => 'Angebote erfassen und bearbeiten',
   'Create and edit vendor invoices' => 'Eingangsrechnungen erfassen und bearbeiten',
   'Credit Note'                 => 'Gutschrift',
+  'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'DATEV Export'                => 'DATEV-Export',
@@ -58,6 +61,7 @@ $self->{texts} = {
   'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
   'Directory'                   => 'Verzeichnis',
   'Discount'                    => 'Rabatt',
+  'Dunning'                     => 'Mahnung',
   'E-mail'                      => 'eMail',
   'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
   'EK'                          => 'EK',
@@ -70,6 +74,7 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
@@ -151,10 +156,14 @@ $self->{texts} = {
   'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
+  'Request quotation'           => 'Preisanfrage',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Screen'                      => 'Bildschirm',
   'Select a Customer'           => 'Endkunde auswählen',
   'Select a customer'           => 'Einen Kunden ausw&auml;hlen',
@@ -189,6 +198,8 @@ $self->{texts} = {
   'Unknown dependency \'%s\'.'  => 'Unbekannte Abh&auml;ngigkeit \'%s\'.',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
+  'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
   'Yes'                         => 'Ja',
index c16bf5d..061754c 100644 (file)
@@ -3,7 +3,9 @@ $self->{texts} = {
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Account'                     => 'Konto',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
@@ -58,6 +60,7 @@ $self->{texts} = {
   'Credit Limit'                => 'Kreditlimit',
   'Credit Note'                 => 'Gutschrift',
   'Currency'                    => 'Währung',
+  'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
   'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
@@ -79,6 +82,7 @@ $self->{texts} = {
   'Discount'                    => 'Rabatt',
   'Draft saved.'                => 'Entwurf gespeichert.',
   'Due Date'                    => 'Fälligkeitsdatum',
+  'Dunning'                     => 'Mahnung',
   'E-mail'                      => 'eMail',
   'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
   'EK'                          => 'EK',
@@ -98,6 +102,8 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'Follow-Up'                   => 'Wiedervorlage',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
@@ -200,10 +206,14 @@ $self->{texts} = {
   'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
+  'Request quotation'           => 'Preisanfrage',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Save draft'                  => 'Entwurf speichern',
   'Screen'                      => 'Bildschirm',
   'Select a Customer'           => 'Endkunde auswählen',
@@ -239,6 +249,7 @@ $self->{texts} = {
   '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:',
+  'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 f&auml;llig ist/sind.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
   'Transactions, AR transactions, AP transactions' => 'Dialogbuchen, Debitorenrechnungen, Kreditorenrechnungen',
@@ -250,6 +261,7 @@ $self->{texts} = {
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
   'Vendor missing!'             => 'Lieferant fehlt!',
index 2a286c8..a64e8d7 100644 (file)
@@ -3,7 +3,9 @@ $self->{texts} = {
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Account'                     => 'Konto',
   'Add Credit Note'             => 'Gutschrift erfassen',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
@@ -90,6 +92,7 @@ $self->{texts} = {
   'Discount'                    => 'Rabatt',
   'Draft saved.'                => 'Entwurf gespeichert.',
   'Due Date'                    => 'Fälligkeitsdatum',
+  'Dunning'                     => 'Mahnung',
   'Dunning Amount'              => 'gemahnter Betrag',
   'E-mail'                      => 'eMail',
   'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
@@ -114,6 +117,8 @@ $self->{texts} = {
   'Feb'                         => 'Feb',
   'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'Follow-Up'                   => 'Wiedervorlage',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
@@ -223,10 +228,14 @@ $self->{texts} = {
   'Reports'                     => 'Berichte',
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
+  'Request quotation'           => 'Preisanfrage',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales quotation'             => 'Angebot',
   'Salesman'                    => 'Verkäufer/in',
   'Save draft'                  => 'Entwurf speichern',
   'Screen'                      => 'Bildschirm',
@@ -265,6 +274,7 @@ $self->{texts} = {
   '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:',
+  'There are #1 unfinished follow-ups of which #2 are due.' => 'Es gibt #1 Wiedervorlage(n), von denen #2 f&auml;llig ist/sind.',
   'To (email)'                  => 'An',
   'Total'                       => 'Summe',
   'Trade Discount'              => 'Rabatt',
@@ -277,6 +287,8 @@ $self->{texts} = {
   'Use As Template'             => 'Als Vorlage verwenden',
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
+  'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
   'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
index 3d5c479..98fdbc3 100644 (file)
@@ -1,20 +1,62 @@
 $self->{texts} = {
+  ' Date missing!'              => ' Datum fehlt!',
+  ' missing!'                   => ' fehlt!',
+  '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'About'                       => 'über',
+  'Add Exchangerate'            => 'Wechselkurs erfassen',
+  'Add Follow-Up'               => 'Wiedervorlage erstellen',
+  'Add Follow-Up for #1'        => 'Wiedervorlage f&uuml;r #1 erstellen',
+  'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
+  'Add Quotation'               => 'Angebot erfassen',
+  'Add Request for Quotation'   => 'Anfrage erfassen',
+  'Add Sales Invoice'           => 'Rechnung erfassen',
+  'Add Sales Order'             => 'Auftrag erfassen',
+  'Add Vendor Invoice'          => 'Einkaufsrechnung erfassen',
   'Address'                     => 'Adresse',
   'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
   'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
+  'Amount'                      => 'Betrag',
+  'Apr'                         => 'Apr',
+  'April'                       => 'April',
+  'Are you sure you want to delete Order Number' => 'Soll der Auftrag mit folgender Nummer wirklich gelöscht werden:',
+  'Are you sure you want to delete Quotation Number' => 'Sind Sie sicher, dass Angebotnummer gelöscht werden soll?',
+  'Attachment'                  => 'als Anhang',
   'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
+  'Aug'                         => 'Aug',
+  'August'                      => 'August',
   'Bcc'                         => 'Bcc',
+  'Billing Address'             => 'Rechnungsadresse',
+  'Bin'                         => 'Lagerplatz',
   '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.',
+  'Bis'                         => 'bis',
+  'Body'                        => 'Text',
   'CANCELED'                    => 'Storniert',
+  'CSV export -- options'       => 'CSV-Export -- Optionen',
+  'Cannot delete order!'        => 'Auftrag kann nicht gelöscht werden!',
+  'Cannot delete quotation!'    => 'Angebot kann nicht gelöscht werden!',
+  'Cannot save order!'          => 'Auftrag kann nicht gespeichert werden!',
+  'Cannot save quotation!'      => 'Angebot kann nicht gespeichert werden!',
   '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\')',
+  'City'                        => 'Stadt',
+  'Closed'                      => 'Geschlossen',
+  'Collective Orders only work for orders from one customer!' => 'Sammelaufträge funktionieren nur für Aufträge von einem Kunden!',
+  'Company Name'                => 'Firmenname',
+  'Confirm!'                    => 'Bestätigen Sie!',
   'Confirmation'                => 'Auftragsbestätigung',
   'Contact'                     => 'Kontakt',
+  'Continue'                    => 'Weiter',
+  '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.',
+  'Country'                     => 'Land',
   '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',
@@ -27,30 +69,100 @@ $self->{texts} = {
   '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',
+  'Created by'                  => 'Erstellt von',
+  'Created for'                 => 'Erstellt f&uuml;r',
+  'Created on'                  => 'Erstellt am',
+  'Credit Limit exceeded!!!'    => 'Kreditlimit überschritten!',
   'Credit Note'                 => 'Gutschrift',
+  'Curr'                        => 'Währung',
+  'Currency'                    => 'Währung',
+  'Customer'                    => 'Kunde',
   'Customer Number'             => 'Kundennummer',
   'Customer details'            => 'Kundendetails',
+  'Customer missing!'           => 'Kundenname fehlt!',
+  'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
+  'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'Customer type'               => 'Kundentyp',
   'DATEV Export'                => 'DATEV-Export',
   'DELETED'                     => 'Gelöscht',
   'DUNNING STARTED'             => 'Mahnprozess gestartet',
   'Dataset upgrade'             => 'Datenbankaktualisierung',
   'Date'                        => 'Datum',
+  'Dec'                         => 'Dez',
+  'December'                    => 'Dezember',
+  'Delivered'                   => 'Geliefert',
+  'Delivery Date'               => 'Lieferdatum',
+  'Department'                  => 'Abteilung',
   'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
+  'Description'                 => 'Beschreibung',
   'Directory'                   => 'Verzeichnis',
+  'Discount'                    => 'Rabatt',
+  'Done'                        => 'Fertig',
+  'Dunning'                     => 'Mahnung',
+  'E-mail'                      => 'eMail',
+  'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
+  'EK'                          => 'EK',
   'ELSE'                        => 'Zusatz',
+  'Edit Access Rights for Follow-Ups' => 'Zugriffsrechte f&uuml;r Wiedervorlagen bearbeiten',
+  'Edit Follow-Up'              => 'Wiedervorlage bearbeiten',
+  'Edit Follow-Up for #1'       => 'Wiedervorlage f&uuml;r #1 bearbeiten',
+  'Edit Purchase Order'         => 'Lieferantenaufrag bearbeiten',
+  'Edit Quotation'              => 'Angebot bearbeiten',
+  'Edit Request for Quotation'  => 'Anfrage bearbeiten',
+  'Edit Sales Order'            => 'Auftrag bearbeiten',
+  'Edit the purchase_order'     => 'Bearbeiten des Lieferantenauftrags',
+  'Edit the request_quotation'  => 'Bearbeiten der Preisanfrage',
+  'Edit the sales_order'        => 'Bearbeiten des Auftrags',
+  'Edit the sales_quotation'    => 'Bearbeiten des Angebots',
+  'Employee'                    => 'Bearbeiter',
   'Enter longdescription'       => 'Langtext eingeben',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
+  'Ertrag'                      => 'Ertrag',
+  'Ertrag prozentual'           => 'Ertrag prozentual',
+  'Exchangerate'                => 'Wechselkurs',
+  'Exchangerate missing!'       => 'Es fehlt der Wechselkurs!',
+  'Extended'                    => 'Gesamt',
+  'Falsches Datumsformat!'      => 'Falsches Datumsformat!',
+  'Fax'                         => 'Fax',
+  'Feb'                         => 'Feb',
+  'February'                    => 'Februar',
   'File'                        => 'Datei',
+  'Follow-Up Date'              => 'Wiedervorlagedatum',
+  'Follow-Up saved.'            => 'Wiedervorlage gespeichert.',
+  'Follow-Ups'                  => 'Wiedervorlagen',
+  'Follow-up for'               => 'Wiedervorlage für',
+  'From'                        => 'Von',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
+  'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
+  'ID'                          => 'Buchungsnummer',
+  'In-line'                     => 'im Text',
+  'Include in Report'           => 'In Bericht aufnehmen',
   'Incorrect Password!'         => 'Ungültiges Passwort!',
   'Incorrect username or password!' => 'Ungültiger Benutzername oder falsches Passwort!',
+  'Invalid follow-up ID.'       => 'Ung&uuml;ltige Wiedervorlage-ID.',
   'Invoice'                     => 'Rechnung',
+  'Invoice Date missing!'       => 'Rechnungsdatum fehlt!',
+  'Invoice Number missing!'     => 'Rechnungsnummer fehlt!',
+  'Jan'                         => 'Jan',
+  'January'                     => 'Januar',
+  'Jul'                         => 'Jul',
+  'July'                        => 'Juli',
+  'Jun'                         => 'Jun',
+  'June'                        => 'Juni',
+  'L'                           => 'L',
+  'LP'                          => 'LP',
+  'License'                     => 'Lizenz',
   'MAILED'                      => 'Gesendet',
   'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
+  'Mar'                         => 'März',
+  'March'                       => 'März',
   'Mark as paid?'               => 'Als bezahlt markieren?',
   'Marked as paid'              => 'Als bezahlt markiert',
   'Master Data'                 => 'Stammdaten',
+  'May'                         => 'Mai',
+  'May '                        => 'Mai',
   'May set the BCC field when sending emails' => 'Beim Verschicken von Emails das Feld \'BCC\' setzen',
   'Message'                     => 'Nachricht',
   'Missing \'description\' field.' => 'Fehlendes Feld \'description\'.',
@@ -58,72 +170,179 @@ $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',
+  'No action defined.'          => 'Keine Aktion definiert.',
   '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 vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'No.'                         => 'Position',
+  'Not delivered'               => 'Nicht geliefert',
+  'Not done yet'                => 'Noch nicht fertig',
+  'Notes'                       => 'Bemerkungen',
+  'Nov'                         => 'Nov',
+  'November'                    => 'November',
+  'Number'                      => 'Nummer',
+  'Number missing in Row'       => 'Nummer fehlt in Zeile',
+  'Oct'                         => 'Okt',
+  'October'                     => 'Oktober',
+  'Only due follow-ups'         => 'Nur f&auml;llige Wiedervorlagen',
+  'Open'                        => 'Offen',
+  'OpenDocument/OASIS'          => 'OpenDocument/OASIS',
+  'Order'                       => 'Auftrag',
+  'Order Date missing!'         => 'Auftragsdatum fehlt!',
+  'Order Number'                => 'Auftragsnummer',
+  'Order Number missing!'       => 'Auftragsnummer fehlt!',
+  'Order deleted!'              => 'Auftrag gelöscht!',
+  'Other users\' follow-ups'    => 'Wiedervorlagen anderer Benutzer',
   'Others'                      => 'Andere',
   'PAYMENT POSTED'              => 'Rechung gebucht',
+  'PDF'                         => 'PDF',
+  'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
+  'PDF export -- options'       => 'PDF-Export -- Optionen',
   'POSTED'                      => 'Gebucht',
   'POSTED AS NEW'               => 'Als neu gebucht',
   'PRINTED'                     => 'Gedruckt',
   'Packing List'                => 'Lieferschein',
+  'Packing List Date missing!'  => 'Datum für Verpackungsliste fehlt!',
+  'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
+  'Part Description'            => 'Artikelbeschreibung',
+  'Phone'                       => 'Telefon',
   'Pick List'                   => 'Sammelliste',
   'Please enter values'         => 'Bitte Werte eingeben',
+  'Postscript'                  => 'Postscript',
+  'Price'                       => 'Preis',
+  'Price Factor'                => 'Preisfaktor',
+  'Pricegroup'                  => 'Preisgruppe',
+  'Printer'                     => 'Drucker',
   'Proforma Invoice'            => 'Proformarechnung',
+  'Project'                     => 'Projekt',
+  'Project Number'              => 'Projektnummer',
+  'Project not on file!'        => 'Dieses Projekt ist nicht in der Datenbank!',
   'Purchase Order'              => 'Lieferantenauftrag',
+  'Purchase Orders'             => 'Lieferantenaufträge',
+  'Qty'                         => 'Menge',
+  'Queue'                       => 'Warteschlange',
   'Quotation'                   => 'Angebot',
+  'Quotation Date missing!'     => 'Angebotsdatum fehlt!',
+  'Quotation Number'            => 'Angebotsnummer',
+  'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
+  'Quotation deleted!'          => 'Angebot wurde gelöscht.',
+  'Quotations'                  => 'Angebote',
   'RFQ'                         => 'Anfrage',
+  'RFQ Number'                  => 'Anfragenummer',
   'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reference'                   => 'Referenz',
   'Reports'                     => 'Berichte',
+  'Reqdate'                     => 'Lieferdatum',
+  'Request for Quotation'       => 'Anfrage',
+  'Request for Quotations'      => 'Anfragen',
+  'Request quotation'           => 'Preisanfrage',
+  'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales Orders'                => 'Aufträge',
+  'Sales quotation'             => 'Angebot',
+  'Salesman'                    => 'Verkäufer/in',
+  'Screen'                      => 'Bildschirm',
   'Select a Customer'           => 'Endkunde auswählen',
   'Select a customer'           => 'Einen Kunden ausw&auml;hlen',
   'Select a vendor'             => 'Einen Lieferanten ausw&auml;hlen',
+  'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
+  'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
+  'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
+  'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
+  'Sep'                         => 'Sep',
+  'September'                   => 'September',
+  'Serial No.'                  => 'Seriennummer',
+  'Ship'                        => 'Lagerausgang',
+  'Ship rcvd'                   => 'Lagereingang',
+  'Ship to'                     => 'Lieferadresse',
+  'Ship via'                    => 'Transportmittel',
+  'Shipping Address'            => 'Lieferadresse',
   'Storno Invoice'              => 'Stornorechnung',
   'Storno Packing List'         => 'Stornolieferschein',
+  'Street'                      => 'Straße',
   'Subject'                     => 'Betreff',
+  'Subtotal'                    => 'Zwischensumme',
+  'TODO list'                   => 'Aufgabenliste',
+  'Tax'                         => 'Steuer',
   '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 access rights have been saved.' => 'Die Zugriffsrechte wurden gespeichert.',
   '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 follow-up date is missing.' => 'Das Wiedervorlagedatum fehlt.',
+  'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
+  'The subject is missing.'     => 'Der Betreff fehlt.',
   'To (email)'                  => 'An',
+  'Total'                       => 'Summe',
+  'Transaction description'     => 'Vorgangsbezeichnung',
   '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'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
+  'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
+  'Vendor missing!'             => 'Lieferant fehlt!',
+  'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
+  'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
+  'Vendor type'                 => 'Lieferantentyp',
   'Version'                     => 'Version',
+  'Workflow purchase_order'     => 'Workflow Lieferantenauftrag',
+  'Workflow request_quotation'  => 'Workflow Preisanfrage',
+  'Workflow sales_order'        => 'Workflow Auftrag',
+  'Workflow sales_quotation'    => 'Workflow Angebot',
+  'Yes'                         => 'Ja',
   'You are logged out!'         => 'Auf Wiedersehen!',
   'You did not enter a name!'   => 'Sie haben keinen Namen eingegeben!',
   '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.',
+  'You must chose a user.'      => 'Sie m&uuml;ssen einen Benutzer ausw&auml;hlen.',
+  'Zipcode'                     => 'PLZ',
   '[email]'                     => '[email]',
   'bin_list'                    => 'Lagerliste',
+  'button'                      => '?',
   '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',
+  'emailed to'                  => 'gemailt an',
+  'follow_up_list'              => 'wiedervorlageliste',
   'invoice'                     => 'Rechnung',
   'no'                          => 'nein',
+  'none (pricegroup)'           => 'keine',
   'packing_list'                => 'Versandliste',
   'pick_list'                   => 'Entnahmeliste',
   'proforma'                    => 'Proforma',
   'purchase_order'              => 'Auftrag',
+  'purchase_order_list'         => 'lieferantenauftragsliste',
+  'quotation_list'              => 'angebotsliste',
+  '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',
+  'rfq_list'                    => 'anfragenliste',
   'sales_order'                 => 'Kundenauftrag',
+  'sales_order_list'            => 'auftragsliste',
   'sales_quotation'             => 'Verkaufsangebot',
+  'saved!'                      => 'gespeichert',
+  'sent'                        => 'gesendet',
+  'sent to printer'             => 'an Drucker geschickt',
   'vendor'                      => 'Lieferant',
+  'wrongformat'                 => 'Falsches Format',
   'yes'                         => 'ja',
 };
 
@@ -132,26 +351,123 @@ $self->{subs} = {
   'H'                           => 'H',
   'NTI'                         => 'NTI',
   'Q'                           => 'Q',
+  '_collect_links'              => '_collect_links',
+  'add'                         => 'add',
+  'backorder_exchangerate'      => 'backorder_exchangerate',
   'build_std_url'               => 'build_std_url',
   'calculate_qty'               => 'calculate_qty',
   'call_sub'                    => 'call_sub',
+  'check_delivered_flag'        => 'check_delivered_flag',
+  'check_for_direct_delivery'   => 'check_for_direct_delivery',
+  'check_for_direct_delivery_no' => 'check_for_direct_delivery_no',
+  'check_for_direct_delivery_yes' => 'check_for_direct_delivery_yes',
+  'check_form'                  => 'check_form',
+  'check_name'                  => 'check_name',
+  'check_oe_access'             => 'check_oe_access',
+  'check_project'               => 'check_project',
   'company_logo'                => 'company_logo',
+  'continue'                    => 'continue',
   'cov_selection_internal'      => 'cov_selection_internal',
+  'create_backorder'            => 'create_backorder',
+  'create_subtotal_row'         => 'create_subtotal_row',
+  'create_todo_list'            => 'create_todo_list',
+  'customer_details'            => 'customer_details',
+  'delete'                      => 'delete',
+  'delete_order_quotation'      => 'delete_order_quotation',
   'delivery_customer_selection' => 'delivery_customer_selection',
+  'dispatcher'                  => 'dispatcher',
+  'display_form'                => 'display_form',
+  'display_row'                 => 'display_row',
+  'e_mail'                      => 'e_mail',
+  'edit'                        => 'edit',
+  'edit_access_rights'          => 'edit_access_rights',
+  'edit_e_mail'                 => 'edit_e_mail',
+  'finish'                      => 'finish',
+  'form_footer'                 => 'form_footer',
+  'form_header'                 => 'form_header',
   'format_dates'                => 'format_dates',
+  'invoice'                     => 'invoice',
+  'invoicetotal'                => 'invoicetotal',
+  'item_selected'               => 'item_selected',
   'login'                       => 'login',
   'login_screen'                => 'login_screen',
   'logout'                      => 'logout',
   'mark_as_paid_common'         => 'mark_as_paid_common',
+  'name_selected'               => 'name_selected',
+  'new_item'                    => 'new_item',
+  'new_license'                 => 'new_license',
+  'no'                          => 'no',
+  'order'                       => 'order',
+  'order_links'                 => 'order_links',
+  'orders'                      => 'orders',
+  'poso'                        => 'poso',
+  'post_as_new'                 => 'post_as_new',
+  'prepare_order'               => 'prepare_order',
+  'print'                       => 'print',
+  'print_form'                  => 'print_form',
+  'print_options'               => 'print_options',
+  'project_selected'            => 'project_selected',
+  'purchase_order'              => 'purchase_order',
+  'quotation'                   => 'quotation',
   'reformat_numbers'            => 'reformat_numbers',
+  'relink_accounts'             => 'relink_accounts',
+  'report'                      => 'report',
+  'report_for_todo_list'        => 'report_for_todo_list',
+  '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',
+  'request_for_quotation'       => 'request_for_quotation',
   'retrieve_partunits'          => 'retrieve_partunits',
+  'sales_order'                 => 'sales_order',
+  'save'                        => 'save',
+  'save_access_rights'          => 'save_access_rights',
+  'save_and_close'              => 'save_and_close',
+  'save_as_new'                 => 'save_as_new',
+  'save_exchangerate'           => 'save_exchangerate',
+  'save_follow_up'              => 'save_follow_up',
+  'search'                      => 'search',
+  'select_item'                 => 'select_item',
+  'select_name'                 => 'select_name',
+  'select_project'              => 'select_project',
+  'send_email'                  => 'send_email',
+  'set_duedate'                 => 'set_duedate',
+  'set_headings'                => 'set_headings',
   'set_longdescription'         => 'set_longdescription',
+  'set_pricegroup'              => 'set_pricegroup',
+  'ship_to'                     => 'ship_to',
   'show_error'                  => 'show_error',
   'show_history'                => 'show_history',
+  'show_todo_list'              => 'show_todo_list',
   'show_vc_details'             => 'show_vc_details',
+  'todo_list_follow_ups'        => 'todo_list_follow_ups',
+  'todo_list_overdue_sales_quotations' => 'todo_list_overdue_sales_quotations',
+  'update'                      => 'update',
+  'validate_items'              => 'validate_items',
+  'vendor_details'              => 'vendor_details',
   'vendor_selection'            => 'vendor_selection',
+  'yes'                         => 'yes',
+  'abbrechen'                   => 'cancel',
   'weiter'                      => 'continue',
+  'löschen'                     => 'delete',
+  'email'                       => 'e_mail',
+  'abschlie&szlig;en'           => 'finish',
+  'rechnung'                    => 'invoice',
   'anmeldung'                   => 'login',
+  'nein'                        => 'no',
+  'auftrag'                     => 'order',
+  'drucken'                     => 'print',
+  'lieferantenauftrag'          => 'purchase_order',
+  'angebot'                     => 'quotation',
+  'anfrage'                     => 'request_for_quotation',
+  'kundenauftrag'               => 'sales_order',
+  'speichern'                   => 'save',
+  'speichern_und_schließen'     => 'save_and_close',
+  'als_neu_speichern'           => 'save_as_new',
+  'lieferadresse'               => 'ship_to',
+  'erneuern'                    => 'update',
+  'ja'                          => 'yes',
 };
 
 1;
index fd59978..7e8e801 100644 (file)
@@ -15,6 +15,7 @@ $self->{texts} = {
   'Add Customer'                => 'Kunde erfassen',
   'Add Department'              => 'Abteilung erfassen',
   'Add Dunning'                 => 'Mahnung erzeugen',
+  'Add Follow-Up'               => 'Wiedervorlage erstellen',
   'Add Group'                   => 'Warengruppe erfassen',
   'Add Language'                => 'Sprache hinzufügen',
   'Add Lead'                    => 'Kundenquelle erfassen',
@@ -75,9 +76,11 @@ $self->{texts} = {
   'Dimension units'             => 'Ma&szlig;einheiten',
   'Directory'                   => 'Verzeichnis',
   'Dunnings'                    => 'Mahnungen',
+  'Edit Access Rights'          => 'Zugriffsrechte bearbeiten',
   'Edit Dunning'                => 'Mahnungen konfigurieren',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'Follow-Ups'                  => 'Wiedervorlagen',
   'General Ledger'              => 'Finanzbuchhaltung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Groups'                      => 'Warengruppen',
@@ -124,6 +127,7 @@ $self->{texts} = {
   'Price Factors'               => 'Preisfaktoren',
   'Pricegroups'                 => 'Preisgruppen',
   'Printer'                     => 'Drucker',
+  'Productivity'                => 'Produktivit&auml;t',
   'Programm'                    => 'Programm',
   'Projects'                    => 'Projekte',
   'Projecttransactions'         => 'Projektbuchungen',
@@ -141,6 +145,7 @@ $self->{texts} = {
   'Service units'               => 'Dienstleistungseinheiten',
   'Services'                    => 'Dienstleistungen',
   'Shipto'                      => 'Lieferanschriften',
+  'Show TODO list'              => 'Aufgabenliste anzeigen',
   'Stylesheet'                  => 'Stilvorlage',
   'Subject'                     => 'Betreff',
   'System'                      => 'System',
index 09c3566..2835cb8 100644 (file)
@@ -14,6 +14,7 @@ $self->{texts} = {
   'Add Customer'                => 'Kunde erfassen',
   'Add Department'              => 'Abteilung erfassen',
   'Add Dunning'                 => 'Mahnung erzeugen',
+  'Add Follow-Up'               => 'Wiedervorlage erstellen',
   'Add Group'                   => 'Warengruppe erfassen',
   'Add Language'                => 'Sprache hinzufügen',
   'Add Lead'                    => 'Kundenquelle erfassen',
@@ -74,9 +75,11 @@ $self->{texts} = {
   'Dimension units'             => 'Ma&szlig;einheiten',
   'Directory'                   => 'Verzeichnis',
   'Dunnings'                    => 'Mahnungen',
+  'Edit Access Rights'          => 'Zugriffsrechte bearbeiten',
   'Edit Dunning'                => 'Mahnungen konfigurieren',
   'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
   'File'                        => 'Datei',
+  'Follow-Ups'                  => 'Wiedervorlagen',
   'General Ledger'              => 'Finanzbuchhaltung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Groups'                      => 'Warengruppen',
@@ -123,6 +126,7 @@ $self->{texts} = {
   'Price Factors'               => 'Preisfaktoren',
   'Pricegroups'                 => 'Preisgruppen',
   'Printer'                     => 'Drucker',
+  'Productivity'                => 'Produktivit&auml;t',
   'Programm'                    => 'Programm',
   'Projects'                    => 'Projekte',
   'Projecttransactions'         => 'Projektbuchungen',
@@ -140,6 +144,7 @@ $self->{texts} = {
   'Service units'               => 'Dienstleistungseinheiten',
   'Services'                    => 'Dienstleistungen',
   'Shipto'                      => 'Lieferanschriften',
+  'Show TODO list'              => 'Aufgabenliste anzeigen',
   'Stylesheet'                  => 'Stilvorlage',
   'Subject'                     => 'Betreff',
   'System'                      => 'System',
index d89a994..970bc25 100644 (file)
@@ -4,7 +4,9 @@ $self->{texts} = {
   '*/'                          => '*/',
   'ADDED'                       => 'Hinzugefügt',
   'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
   'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
   'Add Exchangerate'            => 'Wechselkurs erfassen',
   'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
   'Add Quotation'               => 'Angebot erfassen',
@@ -88,6 +90,7 @@ $self->{texts} = {
   'Description'                 => 'Beschreibung',
   'Directory'                   => 'Verzeichnis',
   'Discount'                    => 'Rabatt',
+  'Dunning'                     => 'Mahnung',
   'E-mail'                      => 'eMail',
   'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
   'EK'                          => 'EK',
@@ -114,6 +117,7 @@ $self->{texts} = {
   'February'                    => 'Februar',
   'File'                        => 'Datei',
   'From'                        => 'Von',
+  'GL Transaction'              => 'Dialogbuchung',
   'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
   'Group'                       => 'Warengruppe',
   'History'                     => 'Historie',
@@ -212,12 +216,15 @@ $self->{texts} = {
   'Reqdate'                     => 'Lieferdatum',
   'Request for Quotation'       => 'Anfrage',
   'Request for Quotations'      => 'Anfragen',
+  'Request quotation'           => 'Preisanfrage',
   'Required by'                 => 'Lieferdatum',
   'SAVED'                       => 'Gespeichert',
   'SAVED FOR DUNNING'           => 'Gespeichert',
   'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
   'Sales Order'                 => 'Kundenauftrag',
   'Sales Orders'                => 'Aufträge',
+  'Sales quotation'             => 'Angebot',
   'Salesman'                    => 'Verkäufer/in',
   'Screen'                      => 'Bildschirm',
   'Select a Customer'           => 'Endkunde auswählen',
@@ -260,6 +267,7 @@ $self->{texts} = {
   'Value'                       => 'Wert',
   'Variable'                    => 'Variable',
   'Vendor'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
   'Vendor Number'               => 'Lieferantennummer',
   'Vendor details'              => 'Lieferantendetails',
   'Vendor missing!'             => 'Lieferant fehlt!',
@@ -362,6 +370,7 @@ $self->{subs} = {
   'quotation'                   => 'quotation',
   'reformat_numbers'            => 'reformat_numbers',
   'relink_accounts'             => 'relink_accounts',
+  'report_for_todo_list'        => 'report_for_todo_list',
   'report_generator_back'       => 'report_generator_back',
   'report_generator_dispatcher' => 'report_generator_dispatcher',
   'report_generator_do'         => 'report_generator_do',
diff --git a/locale/de/todo b/locale/de/todo
new file mode 100644 (file)
index 0000000..7cbfb05
--- /dev/null
@@ -0,0 +1,461 @@
+$self->{texts} = {
+  ' Date missing!'              => ' Datum fehlt!',
+  ' missing!'                   => ' fehlt!',
+  '*/'                          => '*/',
+  'ADDED'                       => 'Hinzugefügt',
+  'AP'                          => 'Einkauf',
+  'AP Transaction'              => 'Kreditorenbuchung',
+  'AR'                          => 'Verkauf',
+  'AR Transaction'              => 'Debitorenbuchung',
+  'Add Exchangerate'            => 'Wechselkurs erfassen',
+  'Add Follow-Up'               => 'Wiedervorlage erstellen',
+  'Add Follow-Up for #1'        => 'Wiedervorlage f&uuml;r #1 erstellen',
+  'Add Purchase Order'          => 'Lieferantenauftrag erfassen',
+  'Add Quotation'               => 'Angebot erfassen',
+  'Add Request for Quotation'   => 'Anfrage erfassen',
+  'Add Sales Invoice'           => 'Rechnung erfassen',
+  'Add Sales Order'             => 'Auftrag erfassen',
+  'Add Vendor Invoice'          => 'Einkaufsrechnung erfassen',
+  'Address'                     => 'Adresse',
+  'Advance turnover tax return' => 'Umsatzsteuervoranmeldung',
+  'All reports'                 => 'Alle Berichte (Konten&uuml;bersicht, Saldenbilanz, GuV, BWA, Bilanz, Projektbuchungen)',
+  'Amount'                      => 'Betrag',
+  'Apr'                         => 'Apr',
+  'April'                       => 'April',
+  'Are you sure you want to delete Order Number' => 'Soll der Auftrag mit folgender Nummer wirklich gelöscht werden:',
+  'Are you sure you want to delete Quotation Number' => 'Sind Sie sicher, dass Angebotnummer gelöscht werden soll?',
+  'Attachment'                  => 'als Anhang',
+  'Attempt to call an undefined sub named \'%s\'' => 'Es wurde versucht, eine nicht definierte Unterfunktion namens \'%s\' aufzurufen.',
+  'Aug'                         => 'Aug',
+  'August'                      => 'August',
+  'Bcc'                         => 'Bcc',
+  'Billing Address'             => 'Rechnungsadresse',
+  'Bin'                         => 'Lagerplatz',
+  '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.',
+  'Bis'                         => 'bis',
+  'Body'                        => 'Text',
+  'CANCELED'                    => 'Storniert',
+  'CSV export -- options'       => 'CSV-Export -- Optionen',
+  'Cannot delete order!'        => 'Auftrag kann nicht gelöscht werden!',
+  'Cannot delete quotation!'    => 'Angebot kann nicht gelöscht werden!',
+  'Cannot save order!'          => 'Auftrag kann nicht gespeichert werden!',
+  'Cannot save quotation!'      => 'Angebot kann nicht gespeichert werden!',
+  '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\')',
+  'City'                        => 'Stadt',
+  'Closed'                      => 'Geschlossen',
+  'Collective Orders only work for orders from one customer!' => 'Sammelaufträge funktionieren nur für Aufträge von einem Kunden!',
+  'Company Name'                => 'Firmenname',
+  'Confirm!'                    => 'Bestätigen Sie!',
+  'Confirmation'                => 'Auftragsbestätigung',
+  'Contact'                     => 'Kontakt',
+  'Continue'                    => 'Weiter',
+  '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.',
+  'Country'                     => 'Land',
+  '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',
+  'Created by'                  => 'Erstellt von',
+  'Created for'                 => 'Erstellt f&uuml;r',
+  'Created on'                  => 'Erstellt am',
+  'Credit Limit exceeded!!!'    => 'Kreditlimit überschritten!',
+  'Credit Note'                 => 'Gutschrift',
+  'Curr'                        => 'Währung',
+  'Currency'                    => 'Währung',
+  'Customer'                    => 'Kunde',
+  'Customer Number'             => 'Kundennummer',
+  'Customer details'            => 'Kundendetails',
+  'Customer missing!'           => 'Kundenname fehlt!',
+  'Customer not on file or locked!' => 'Dieser Kunde existiert nicht oder ist gesperrt.',
+  'Customer not on file!'       => 'Kunde ist nicht in der Datenbank!',
+  'Customer type'               => 'Kundentyp',
+  'DATEV Export'                => 'DATEV-Export',
+  'DELETED'                     => 'Gelöscht',
+  'DUNNING STARTED'             => 'Mahnprozess gestartet',
+  'Dataset upgrade'             => 'Datenbankaktualisierung',
+  'Date'                        => 'Datum',
+  'Dec'                         => 'Dez',
+  'December'                    => 'Dezember',
+  'Delivered'                   => 'Geliefert',
+  'Delivery Date'               => 'Lieferdatum',
+  'Department'                  => 'Abteilung',
+  'Dependency loop detected:'   => 'Schleife in den Abh&auml;ngigkeiten entdeckt:',
+  'Description'                 => 'Beschreibung',
+  'Directory'                   => 'Verzeichnis',
+  'Discount'                    => 'Rabatt',
+  'Done'                        => 'Fertig',
+  'Dunning'                     => 'Mahnung',
+  'E-mail'                      => 'eMail',
+  'E-mail address missing!'     => 'E-Mail-Adresse fehlt!',
+  'EK'                          => 'EK',
+  'ELSE'                        => 'Zusatz',
+  'Edit Access Rights for Follow-Ups' => 'Zugriffsrechte f&uuml;r Wiedervorlagen bearbeiten',
+  'Edit Follow-Up'              => 'Wiedervorlage bearbeiten',
+  'Edit Follow-Up for #1'       => 'Wiedervorlage f&uuml;r #1 bearbeiten',
+  'Edit Purchase Order'         => 'Lieferantenaufrag bearbeiten',
+  'Edit Quotation'              => 'Angebot bearbeiten',
+  'Edit Request for Quotation'  => 'Anfrage bearbeiten',
+  'Edit Sales Order'            => 'Auftrag bearbeiten',
+  'Edit the purchase_order'     => 'Bearbeiten des Lieferantenauftrags',
+  'Edit the request_quotation'  => 'Bearbeiten der Preisanfrage',
+  'Edit the sales_order'        => 'Bearbeiten des Auftrags',
+  'Edit the sales_quotation'    => 'Bearbeiten des Angebots',
+  'Employee'                    => 'Bearbeiter',
+  'Enter longdescription'       => 'Langtext eingeben',
+  'Error in database control file \'%s\': %s' => 'Fehler in Datenbankupgradekontrolldatei \'%s\': %s',
+  'Ertrag'                      => 'Ertrag',
+  'Ertrag prozentual'           => 'Ertrag prozentual',
+  'Exchangerate'                => 'Wechselkurs',
+  'Exchangerate missing!'       => 'Es fehlt der Wechselkurs!',
+  'Extended'                    => 'Gesamt',
+  'Falsches Datumsformat!'      => 'Falsches Datumsformat!',
+  'Fax'                         => 'Fax',
+  'Feb'                         => 'Feb',
+  'February'                    => 'Februar',
+  'File'                        => 'Datei',
+  'Follow-Up Date'              => 'Wiedervorlagedatum',
+  'Follow-Up saved.'            => 'Wiedervorlage gespeichert.',
+  'Follow-Ups'                  => 'Wiedervorlagen',
+  'Follow-up for'               => 'Wiedervorlage für',
+  'From'                        => 'Von',
+  'GL Transaction'              => 'Dialogbuchung',
+  'General ledger and cash'     => 'Finanzbuchhaltung und Zahlungsverkehr',
+  'Group'                       => 'Warengruppe',
+  'History'                     => 'Historie',
+  'ID'                          => 'Buchungsnummer',
+  'In-line'                     => 'im Text',
+  'Include in Report'           => 'In Bericht aufnehmen',
+  'Invalid follow-up ID.'       => 'Ung&uuml;ltige Wiedervorlage-ID.',
+  'Invoice'                     => 'Rechnung',
+  'Invoice Date missing!'       => 'Rechnungsdatum fehlt!',
+  'Invoice Number missing!'     => 'Rechnungsnummer fehlt!',
+  'Jan'                         => 'Jan',
+  'January'                     => 'Januar',
+  'Jul'                         => 'Jul',
+  'July'                        => 'Juli',
+  'Jun'                         => 'Jun',
+  'June'                        => 'Juni',
+  'L'                           => 'L',
+  'LP'                          => 'LP',
+  'License'                     => 'Lizenz',
+  'MAILED'                      => 'Gesendet',
+  'Manage license keys'         => 'Lizenzschl&uuml;ssel verwalten',
+  'Mar'                         => 'März',
+  'March'                       => 'März',
+  'Mark as paid?'               => 'Als bezahlt markieren?',
+  'Marked as paid'              => 'Als bezahlt markiert',
+  'Master Data'                 => 'Stammdaten',
+  'May'                         => 'Mai',
+  'May '                        => 'Mai',
+  '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 action defined.'          => 'Keine Aktion definiert.',
+  '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 vendor has been selected yet.' => 'Es wurde noch kein Lieferant ausgewählt.',
+  'No.'                         => 'Position',
+  'Not delivered'               => 'Nicht geliefert',
+  'Not done yet'                => 'Noch nicht fertig',
+  'Notes'                       => 'Bemerkungen',
+  'Nov'                         => 'Nov',
+  'November'                    => 'November',
+  'Number'                      => 'Nummer',
+  'Number missing in Row'       => 'Nummer fehlt in Zeile',
+  'Oct'                         => 'Okt',
+  'October'                     => 'Oktober',
+  'Only due follow-ups'         => 'Nur f&auml;llige Wiedervorlagen',
+  'Open'                        => 'Offen',
+  'OpenDocument/OASIS'          => 'OpenDocument/OASIS',
+  'Order'                       => 'Auftrag',
+  'Order Date missing!'         => 'Auftragsdatum fehlt!',
+  'Order Number'                => 'Auftragsnummer',
+  'Order Number missing!'       => 'Auftragsnummer fehlt!',
+  'Order deleted!'              => 'Auftrag gelöscht!',
+  'Other users\' follow-ups'    => 'Wiedervorlagen anderer Benutzer',
+  'Others'                      => 'Andere',
+  'PAYMENT POSTED'              => 'Rechung gebucht',
+  'PDF'                         => 'PDF',
+  'PDF (OpenDocument/OASIS)'    => 'PDF (OpenDocument/OASIS)',
+  'PDF export -- options'       => 'PDF-Export -- Optionen',
+  'POSTED'                      => 'Gebucht',
+  'POSTED AS NEW'               => 'Als neu gebucht',
+  'PRINTED'                     => 'Gedruckt',
+  'Packing List'                => 'Lieferschein',
+  'Packing List Date missing!'  => 'Datum für Verpackungsliste fehlt!',
+  'Packing List Number missing!' => 'Verpackungslistennummer fehlt!',
+  'Part Description'            => 'Artikelbeschreibung',
+  'Phone'                       => 'Telefon',
+  'Pick List'                   => 'Sammelliste',
+  'Please enter values'         => 'Bitte Werte eingeben',
+  'Postscript'                  => 'Postscript',
+  'Price'                       => 'Preis',
+  'Price Factor'                => 'Preisfaktor',
+  'Pricegroup'                  => 'Preisgruppe',
+  'Printer'                     => 'Drucker',
+  'Proforma Invoice'            => 'Proformarechnung',
+  'Project'                     => 'Projekt',
+  'Project Number'              => 'Projektnummer',
+  'Project not on file!'        => 'Dieses Projekt ist nicht in der Datenbank!',
+  'Purchase Order'              => 'Lieferantenauftrag',
+  'Purchase Orders'             => 'Lieferantenaufträge',
+  'Qty'                         => 'Menge',
+  'Queue'                       => 'Warteschlange',
+  'Quotation'                   => 'Angebot',
+  'Quotation Date missing!'     => 'Angebotsdatum fehlt!',
+  'Quotation Number'            => 'Angebotsnummer',
+  'Quotation Number missing!'   => 'Angebotsnummer fehlt!',
+  'Quotation deleted!'          => 'Angebot wurde gelöscht.',
+  'Quotations'                  => 'Angebote',
+  'RFQ'                         => 'Anfrage',
+  'RFQ Number'                  => 'Anfragenummer',
+  'Receipt, payment, reconciliation' => 'Zahlungseingang, Zahlungsausgang, Kontenabgleich',
+  'Reference'                   => 'Referenz',
+  'Reports'                     => 'Berichte',
+  'Reqdate'                     => 'Lieferdatum',
+  'Request for Quotation'       => 'Anfrage',
+  'Request for Quotations'      => 'Anfragen',
+  'Request quotation'           => 'Preisanfrage',
+  'Required by'                 => 'Lieferdatum',
+  'SAVED'                       => 'Gespeichert',
+  'SAVED FOR DUNNING'           => 'Gespeichert',
+  'SCREENED'                    => 'Angezeigt',
+  'Sales Invoice'               => 'Rechnung',
+  'Sales Order'                 => 'Kundenauftrag',
+  'Sales Orders'                => 'Aufträge',
+  'Sales quotation'             => 'Angebot',
+  'Salesman'                    => 'Verkäufer/in',
+  'Screen'                      => 'Bildschirm',
+  'Select a Customer'           => 'Endkunde auswählen',
+  'Select a customer'           => 'Einen Kunden ausw&auml;hlen',
+  'Select a vendor'             => 'Einen Lieferanten ausw&auml;hlen',
+  'Select from one of the items below' => 'Wählen Sie einen der untenstehenden Einträge',
+  'Select from one of the names below' => 'Wählen Sie einen der untenstehenden Namen',
+  'Select from one of the projects below' => 'Wählen Sie eines der untenstehenden Projekte',
+  'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
+  'Sep'                         => 'Sep',
+  'September'                   => 'September',
+  'Serial No.'                  => 'Seriennummer',
+  'Ship'                        => 'Lagerausgang',
+  'Ship rcvd'                   => 'Lagereingang',
+  'Ship to'                     => 'Lieferadresse',
+  'Ship via'                    => 'Transportmittel',
+  'Shipping Address'            => 'Lieferadresse',
+  'Storno Invoice'              => 'Stornorechnung',
+  'Storno Packing List'         => 'Stornolieferschein',
+  'Street'                      => 'Straße',
+  'Subject'                     => 'Betreff',
+  'Subtotal'                    => 'Zwischensumme',
+  'TODO list'                   => 'Aufgabenliste',
+  'Tax'                         => 'Steuer',
+  '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 access rights have been saved.' => 'Die Zugriffsrechte wurden gespeichert.',
+  '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 follow-up date is missing.' => 'Das Wiedervorlagedatum fehlt.',
+  'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
+  'The subject is missing.'     => 'Der Betreff fehlt.',
+  'To (email)'                  => 'An',
+  'Total'                       => 'Summe',
+  'Transaction description'     => 'Vorgangsbezeichnung',
+  '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'                      => 'Lieferant',
+  'Vendor Invoice'              => 'Einkaufsrechnung',
+  'Vendor Number'               => 'Lieferantennummer',
+  'Vendor details'              => 'Lieferantendetails',
+  'Vendor missing!'             => 'Lieferant fehlt!',
+  'Vendor not on file or locked!' => 'Dieser Lieferant existiert nicht oder ist gesperrt.',
+  'Vendor not on file!'         => 'Lieferant ist nicht in der Datenbank!',
+  'Vendor type'                 => 'Lieferantentyp',
+  'Workflow purchase_order'     => 'Workflow Lieferantenauftrag',
+  'Workflow request_quotation'  => 'Workflow Preisanfrage',
+  'Workflow sales_order'        => 'Workflow Auftrag',
+  'Workflow sales_quotation'    => 'Workflow Angebot',
+  '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.',
+  'You must chose a user.'      => 'Sie m&uuml;ssen einen Benutzer ausw&auml;hlen.',
+  'Zipcode'                     => 'PLZ',
+  '[email]'                     => '[email]',
+  'bin_list'                    => 'Lagerliste',
+  'button'                      => '?',
+  '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',
+  'emailed to'                  => 'gemailt an',
+  'follow_up_list'              => 'wiedervorlageliste',
+  'invoice'                     => 'Rechnung',
+  'no'                          => 'nein',
+  'none (pricegroup)'           => 'keine',
+  'packing_list'                => 'Versandliste',
+  'pick_list'                   => 'Entnahmeliste',
+  'proforma'                    => 'Proforma',
+  'purchase_order'              => 'Auftrag',
+  'purchase_order_list'         => 'lieferantenauftragsliste',
+  'quotation_list'              => 'angebotsliste',
+  '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',
+  'rfq_list'                    => 'anfragenliste',
+  'sales_order'                 => 'Kundenauftrag',
+  'sales_order_list'            => 'auftragsliste',
+  'sales_quotation'             => 'Verkaufsangebot',
+  'saved!'                      => 'gespeichert',
+  'sent'                        => 'gesendet',
+  'sent to printer'             => 'an Drucker geschickt',
+  'vendor'                      => 'Lieferant',
+  'wrongformat'                 => 'Falsches Format',
+  'yes'                         => 'ja',
+};
+
+$self->{subs} = {
+  'E'                           => 'E',
+  'H'                           => 'H',
+  'NTI'                         => 'NTI',
+  'Q'                           => 'Q',
+  '_collect_links'              => '_collect_links',
+  'add'                         => 'add',
+  'backorder_exchangerate'      => 'backorder_exchangerate',
+  'build_std_url'               => 'build_std_url',
+  'calculate_qty'               => 'calculate_qty',
+  'call_sub'                    => 'call_sub',
+  'check_delivered_flag'        => 'check_delivered_flag',
+  'check_for_direct_delivery'   => 'check_for_direct_delivery',
+  'check_for_direct_delivery_no' => 'check_for_direct_delivery_no',
+  'check_for_direct_delivery_yes' => 'check_for_direct_delivery_yes',
+  'check_form'                  => 'check_form',
+  'check_name'                  => 'check_name',
+  'check_oe_access'             => 'check_oe_access',
+  'check_project'               => 'check_project',
+  'continue'                    => 'continue',
+  'cov_selection_internal'      => 'cov_selection_internal',
+  'create_backorder'            => 'create_backorder',
+  'create_subtotal_row'         => 'create_subtotal_row',
+  'create_todo_list'            => 'create_todo_list',
+  'customer_details'            => 'customer_details',
+  'delete'                      => 'delete',
+  'delete_order_quotation'      => 'delete_order_quotation',
+  'delivery_customer_selection' => 'delivery_customer_selection',
+  'dispatcher'                  => 'dispatcher',
+  'display_form'                => 'display_form',
+  'display_row'                 => 'display_row',
+  'e_mail'                      => 'e_mail',
+  'edit'                        => 'edit',
+  'edit_access_rights'          => 'edit_access_rights',
+  'edit_e_mail'                 => 'edit_e_mail',
+  'finish'                      => 'finish',
+  'form_footer'                 => 'form_footer',
+  'form_header'                 => 'form_header',
+  'format_dates'                => 'format_dates',
+  'invoice'                     => 'invoice',
+  'invoicetotal'                => 'invoicetotal',
+  'item_selected'               => 'item_selected',
+  'mark_as_paid_common'         => 'mark_as_paid_common',
+  'name_selected'               => 'name_selected',
+  'new_item'                    => 'new_item',
+  'new_license'                 => 'new_license',
+  'no'                          => 'no',
+  'order'                       => 'order',
+  'order_links'                 => 'order_links',
+  'orders'                      => 'orders',
+  'poso'                        => 'poso',
+  'post_as_new'                 => 'post_as_new',
+  'prepare_order'               => 'prepare_order',
+  'print'                       => 'print',
+  'print_form'                  => 'print_form',
+  'print_options'               => 'print_options',
+  'project_selected'            => 'project_selected',
+  'purchase_order'              => 'purchase_order',
+  'quotation'                   => 'quotation',
+  'reformat_numbers'            => 'reformat_numbers',
+  'relink_accounts'             => 'relink_accounts',
+  'report'                      => 'report',
+  'report_for_todo_list'        => 'report_for_todo_list',
+  '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',
+  'request_for_quotation'       => 'request_for_quotation',
+  'retrieve_partunits'          => 'retrieve_partunits',
+  'sales_order'                 => 'sales_order',
+  'save'                        => 'save',
+  'save_access_rights'          => 'save_access_rights',
+  'save_and_close'              => 'save_and_close',
+  'save_as_new'                 => 'save_as_new',
+  'save_exchangerate'           => 'save_exchangerate',
+  'save_follow_up'              => 'save_follow_up',
+  'search'                      => 'search',
+  'select_item'                 => 'select_item',
+  'select_name'                 => 'select_name',
+  'select_project'              => 'select_project',
+  'send_email'                  => 'send_email',
+  'set_duedate'                 => 'set_duedate',
+  'set_headings'                => 'set_headings',
+  'set_longdescription'         => 'set_longdescription',
+  'set_pricegroup'              => 'set_pricegroup',
+  'ship_to'                     => 'ship_to',
+  'show_history'                => 'show_history',
+  'show_todo_list'              => 'show_todo_list',
+  'show_vc_details'             => 'show_vc_details',
+  'todo_list_follow_ups'        => 'todo_list_follow_ups',
+  'todo_list_overdue_sales_quotations' => 'todo_list_overdue_sales_quotations',
+  'update'                      => 'update',
+  'validate_items'              => 'validate_items',
+  'vendor_details'              => 'vendor_details',
+  'vendor_selection'            => 'vendor_selection',
+  'yes'                         => 'yes',
+  'abbrechen'                   => 'cancel',
+  'weiter'                      => 'continue',
+  'löschen'                     => 'delete',
+  'email'                       => 'e_mail',
+  'abschlie&szlig;en'           => 'finish',
+  'rechnung'                    => 'invoice',
+  'nein'                        => 'no',
+  'auftrag'                     => 'order',
+  'drucken'                     => 'print',
+  'lieferantenauftrag'          => 'purchase_order',
+  'angebot'                     => 'quotation',
+  'anfrage'                     => 'request_for_quotation',
+  'kundenauftrag'               => 'sales_order',
+  'speichern'                   => 'save',
+  'speichern_und_schließen'     => 'save_and_close',
+  'als_neu_speichern'           => 'save_as_new',
+  'lieferadresse'               => 'ship_to',
+  'erneuern'                    => 'update',
+  'ja'                          => 'yes',
+};
+
+1;
index 8f0d8d4..9da4aab 100644 (file)
--- a/menu.ini
+++ b/menu.ini
@@ -392,6 +392,31 @@ vc=customer
 type=receipt
 
 
+[Productivity]
+
+[Productivity--Show TODO list]
+module=todo.pl
+action=show_todo_list
+
+[Productivity--Add Follow-Up]
+module=fu.pl
+action=add
+
+[Productivity--Edit Access Rights]
+module=fu.pl
+action=edit_access_rights
+
+[Productivity--Reports]
+module=menu.pl
+action=acc_menu
+target=acc_menu
+submenu=1
+
+[Productivity--Reports--Follow-Ups]
+module=fu.pl
+action=search
+
+
 [System]
 ACCESS=config
 
diff --git a/sql/Pg-upgrade2/follow_ups.sql b/sql/Pg-upgrade2/follow_ups.sql
new file mode 100644 (file)
index 0000000..c64bffc
--- /dev/null
@@ -0,0 +1,75 @@
+-- @tag: follow_ups
+-- @description: Tabellenstruktur f&uuml;r Wiedervorlagen und allgemeine Notizen
+-- @depends: release_2_4_3
+CREATE SEQUENCE note_id;
+CREATE TABLE notes (
+       id integer NOT NULL DEFAULT nextval('note_id'),
+       subject text,
+       body text,
+       created_by integer NOT NULL,
+
+       trans_id integer,
+       trans_module varchar(10),
+
+       itime timestamp DEFAULT now(),
+       mtime timestamp,
+
+       PRIMARY KEY (id),
+       FOREIGN KEY (created_by) REFERENCES employee (id)
+);
+
+CREATE TRIGGER mtime_notes
+    BEFORE UPDATE ON notes
+    FOR EACH ROW
+    EXECUTE PROCEDURE set_mtime();
+
+CREATE SEQUENCE follow_up_id;
+CREATE TABLE follow_ups (
+       id integer NOT NULL DEFAULT nextval('follow_up_id'),
+       follow_up_date date NOT NULL,
+       created_for_user integer NOT NULL,
+       done boolean DEFAULT FALSE,
+       note_id integer NOT NULL,
+       created_by integer NOT NULL,
+
+       itime timestamp DEFAULT now(),
+       mtime timestamp,
+
+       PRIMARY KEY (id),
+       FOREIGN KEY (created_for_user) REFERENCES employee (id),
+       FOREIGN KEY (created_by) REFERENCES employee (id),
+       FOREIGN KEY (note_id) REFERENCES notes (id)
+);
+
+CREATE TRIGGER mtime_follow_ups
+    BEFORE UPDATE ON follow_ups
+    FOR EACH ROW
+    EXECUTE PROCEDURE set_mtime();
+
+CREATE SEQUENCE follow_up_link_id;
+CREATE TABLE follow_up_links (
+       id integer NOT NULL DEFAULT nextval('follow_up_link_id'),
+       follow_up_id integer NOT NULL,
+       trans_id integer NOT NULL,
+       trans_type text NOT NULL,
+       trans_info text,
+
+       itime timestamp DEFAULT now(),
+       mtime timestamp,
+
+       PRIMARY KEY (id),
+       FOREIGN KEY (follow_up_id) REFERENCES follow_ups (id)
+);
+
+CREATE TRIGGER mtime_follow_up_links
+    BEFORE UPDATE ON follow_up_links
+    FOR EACH ROW
+    EXECUTE PROCEDURE set_mtime();
+
+CREATE TABLE follow_up_access (
+       who integer NOT NULL,
+       what integer NOT NULL,
+
+       FOREIGN KEY (who) REFERENCES employee (id),
+       FOREIGN KEY (what) REFERENCES employee (id)
+);
index eb73366..bfdd6fc 100644 (file)
@@ -15,6 +15,7 @@
 <li><a href="#" rel="shipto">Lieferadresse</a></li>
 <li><a href="#" rel="contacts">Ansprechpartner</a></li>
 <li><a href="#" rel="deliveries">Lieferungen</a></li>
+<li><a href="#" rel="vcnotes">Bemerkungen</a></li>
 [%- IF CUSTOM_VARIABLES.size %]
 <li><a href="#" rel="custom_variables">Benutzerdefinierte Variablen</a></li>
 [%- END %]
   </table>
 <br style="clear: left" /></div>
 
+<div id="vcnotes" class="tabcontent">
+
+ [%- IF NOTES && NOTES.size %]
+ <p>
+  <table>
+   <tr>
+    <th class="listheading">Löschen</th>
+    <th class="listheading">Betreff</th>
+    <th class="listheading">Erstellt am</th>
+    <th class="listheading">Erstellt von</th>
+    <th class="listheading">Wiedervorlagedatum</th>
+    <th class="listheading">Wiedervorlage f&uuml;r</th>
+    <th class="listheading">Wiedervorlage erledigt</th>
+   </tr>
+
+   [%- FOREACH row = NOTES %]
+   <tr class="listrow[% loop.count % 2 %]">
+    <input type="hidden" name="NOTE_id_[% loop.count %]" value="[% HTML.escape(row.id) %]">
+    <td>[% UNLESS NOTE_id && (NOTE_id == row.id) %]<input type="checkbox" name="NOTE_delete_[% loop.count %]" value="1">[% END %]</td>
+    <td><a href="ct.pl?action=edit&db=[% HTML.escape(db) %]&id=[% HTML.escape(id) %]&edit_note_id=[% HTML.escape(row.id) %]">[% HTML.escape(row.subject) %]</a></td>
+    <td>[% HTML.escape(row.created_on) %]</td>
+    <td>[% IF row.created_by_name %][% HTML.escape(row.created_by_name) %][% ELSE %][% HTML.escape(row.created_by_login) %][% END %]</td>
+    <td>[% HTML.escape(row.follow_up_date) %]</td>
+    <td>[% IF row.created_for_name %][% HTML.escape(row.created_for_name) %][% ELSE %][% HTML.escape(row.created_for_login) %][% END %]</td>
+    <td>[% IF row.follow_up_date %][% IF row.follow_up_done %]Ja[% ELSE %]Nein[% END %][% END %]</td>
+   </tr>
+   [%- END %]
+   <input type="hidden" name="NOTES_rowcount" value="[% NOTES.size %]">
+  </table>
+ </p>
+ [%- END %]
+
+ <div class="listtop">[% IF NOTE_id %]Notiz bearbeiten[% ELSE %]Notiz erfassen[% END %]</div>
+
+ <input type="hidden" name="NOTE_id" value="[% HTML.escape(NOTE_id) %]">
+ <input type="hidden" name="FU_id" value="[% HTML.escape(FU_id) %]">
+
+ <p>
+  <table>
+   <tr>
+    <td valign="right">Betreff</td>
+    <td><input name="NOTE_subject" value="[% HTML.escape(NOTE_subject) %]" size="50"></td>
+   </tr>
+
+   <tr>
+    <td valign="right" align="top">Text</td>
+    <td align="top"><textarea cols="50" rows="10" name="NOTE_body">[% HTML.escape(NOTE_body) %]</textarea></td>
+   </tr>
+
+   <tr>
+    <td valign="right">Wiedervorlage am</td>
+    <td>
+     <input name="FU_date" id="FU_date" value="[% HTML.escape(FU_date) %]" size="12">
+     <input type="button" name="FU_date_button" id="FU_date_trigger" value="?">
+     f&uuml;r
+     <select name="FU_created_for_user">
+     [%- FOREACH row = ALL_EMPLOYEES %]
+     <option value="[% HTML.escape(row.id) %]"[% IF (NOTE_id && (row.id == FU_created_for_user)) || (row.login == login) %] selected[% END %]>
+      [%- IF row.name %][%- HTML.escape(row.name) %] ([% HTML.escape(row.login) %])[% ELSE %][% HTML.escape(row.login) %][% END %]
+     </option>
+     [%- END %]
+     </select>
+    </td>
+   </tr>
+
+   <tr>
+    <td></td>
+    <td>
+     <input type="checkbox" name="FU_done" id="FU_done" value="1"[% IF FU_done %] checked[% END %]>
+     <label for="FU_done">Wiedervorlage erledigt</label>
+    </td>
+   </tr>
+  </table>
+ </p>
+
+ <br style="clear: left" />
+</div>
+
+<script type="text/javascript">
+ <!--
+     Calendar.setup({ inputField : "FU_date", ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "FU_date_trigger" });
+   -->
+</script>
+
 [%- IF CUSTOM_VARIABLES.size %]
 <div id="custom_variables" class="tabcontent">
 
index b8b3b1f..2cb6726 100644 (file)
@@ -15,6 +15,7 @@
 <li><a href="#" rel="shipto"><translate>Shipping Address</translate></a></li>
 <li><a href="#" rel="contacts">Ansprechpartner</a></li>
 <li><a href="#" rel="deliveries"><translate>Lieferungen</translate></a></li>
+<li><a href="#" rel="vcnotes"><translate>Notes</translate></a></li>
 [%- IF CUSTOM_VARIABLES.size %]
 <li><a href="#" rel="custom_variables"><translate>Custom Variables</translate></a></li>
 [%- END %]
   </table>
 <br style="clear: left" /></div>
 
+<div id="vcnotes" class="tabcontent">
+
+ [%- IF NOTES && NOTES.size %]
+ <p>
+  <table>
+   <tr>
+    <th class="listheading"><translate>Delete</translate></th>
+    <th class="listheading"><translate>Subject</translate></th>
+    <th class="listheading"><translate>Created on</translate></th>
+    <th class="listheading"><translate>Created by</translate></th>
+    <th class="listheading"><translate>Follow-Up Date</translate></th>
+    <th class="listheading"><translate>Follow-Up for</translate></th>
+    <th class="listheading"><translate>Follow-Up done</translate></th>
+   </tr>
+
+   [%- FOREACH row = NOTES %]
+   <tr class="listrow[% loop.count % 2 %]">
+    <input type="hidden" name="NOTE_id_[% loop.count %]" value="[% HTML.escape(row.id) %]">
+    <td>[% UNLESS NOTE_id && (NOTE_id == row.id) %]<input type="checkbox" name="NOTE_delete_[% loop.count %]" value="1">[% END %]</td>
+    <td><a href="ct.pl?action=edit&db=[% HTML.escape(db) %]&id=[% HTML.escape(id) %]&edit_note_id=[% HTML.escape(row.id) %]">[% HTML.escape(row.subject) %]</a></td>
+    <td>[% HTML.escape(row.created_on) %]</td>
+    <td>[% IF row.created_by_name %][% HTML.escape(row.created_by_name) %][% ELSE %][% HTML.escape(row.created_by_login) %][% END %]</td>
+    <td>[% HTML.escape(row.follow_up_date) %]</td>
+    <td>[% IF row.created_for_name %][% HTML.escape(row.created_for_name) %][% ELSE %][% HTML.escape(row.created_for_login) %][% END %]</td>
+    <td>[% IF row.follow_up_date %][% IF row.follow_up_done %]<translate>Yes</translate>[% ELSE %]<translate>No</translate>[% END %][% END %]</td>
+   </tr>
+   [%- END %]
+   <input type="hidden" name="NOTES_rowcount" value="[% NOTES.size %]">
+  </table>
+ </p>
+ [%- END %]
+
+ <div class="listtop">[% IF NOTE_id %]<translate>Edit note</translate>[% ELSE %]<translate>Add note</translate>[% END %]</div>
+
+ <input type="hidden" name="NOTE_id" value="[% HTML.escape(NOTE_id) %]">
+ <input type="hidden" name="FU_id" value="[% HTML.escape(FU_id) %]">
+
+ <p>
+  <table>
+   <tr>
+    <td valign="right"><translate>Subject</translate></td>
+    <td><input name="NOTE_subject" value="[% HTML.escape(NOTE_subject) %]" size="50"></td>
+   </tr>
+
+   <tr>
+    <td valign="right" align="top"><translate>Body</translate></td>
+    <td align="top"><textarea cols="50" rows="10" name="NOTE_body">[% HTML.escape(NOTE_body) %]</textarea></td>
+   </tr>
+
+   <tr>
+    <td valign="right"><translate>Follow-Up On</translate></td>
+    <td>
+     <input name="FU_date" id="FU_date" value="[% HTML.escape(FU_date) %]" size="12">
+     <input type="button" name="FU_date_button" id="FU_date_trigger" value="?">
+     <translate>for</translate>
+     <select name="FU_created_for_user">
+     [%- FOREACH row = ALL_EMPLOYEES %]
+     <option value="[% HTML.escape(row.id) %]"[% IF (NOTE_id && (row.id == FU_created_for_user)) || (row.login == login) %] selected[% END %]>
+      [%- IF row.name %][%- HTML.escape(row.name) %] ([% HTML.escape(row.login) %])[% ELSE %][% HTML.escape(row.login) %][% END %]
+     </option>
+     [%- END %]
+     </select>
+    </td>
+   </tr>
+
+   <tr>
+    <td></td>
+    <td>
+     <input type="checkbox" name="FU_done" id="FU_done" value="1"[% IF FU_done %] checked[% END %]>
+     <label for="FU_done"><translate>Follow-Up done</translate></label>
+    </td>
+   </tr>
+  </table>
+ </p>
+
+ <br style="clear: left" />
+</div>
+
+<script type="text/javascript">
+ <!--
+     Calendar.setup({ inputField : "FU_date", ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "FU_date_trigger" });
+   -->
+</script>
+
 [%- IF CUSTOM_VARIABLES.size %]
 <div id="custom_variables" class="tabcontent">
 
diff --git a/templates/webpages/fu/add_edit_de.html b/templates/webpages/fu/add_edit_de.html
new file mode 100644 (file)
index 0000000..63a8ead
--- /dev/null
@@ -0,0 +1,108 @@
+[% USE HTML %]<body onload="on_load();">
+
+ <script type="text/javascript">
+  <!--
+      function on_load() {
+        Calendar.setup({ inputField : "follow_up_date", ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "follow_up_date_trigger" });
+        document.Form.subject.focus();
+      }
+    -->
+ </script>
+
+ <form action="fu.pl" method="post" name="Form">
+
+  [%- IF SAVED_MESSAGE %]
+  <p>[% SAVED_MESSAGE %]</p>
+  [%- END %]
+
+  <div class="listtop">[% title %]</div>
+
+  <input type="hidden" name="id" value="[% HTML.escape(id) %]">
+  <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
+  <input type="hidden" name="POPUP_MODE" value="[% HTML.escape(POPUP_MODE) %]">
+
+  <p>
+   <table>
+    <tr>
+     <td valign="top">Wiedervorlage f&uuml;r Benutzer</td>
+     <td valign="top">
+      <select name="created_for_user">
+       [%- FOREACH row = EMPLOYEES %]
+       <option value="[% HTML.escape(row.id) %]"[% IF created_for_user == row.id %] selected[% END %]>
+        [%- IF row.name %][% HTML.escape(row.name) %] ([% HTML.escape(row.login) %])[% ELSE %][% HTML.escape(row.login) %][% END %]
+       </option>
+       [%- END %]
+      </select>
+     </td>
+    </tr>
+
+    <tr>
+     <td valign="right">Wiedervorlagedatum</td>
+     <td>
+      <input name="follow_up_date" id="follow_up_date" value="[% HTML.escape(follow_up_date) %]" size="12">
+      <input type="button" name="follow_up_date_button" id="follow_up_date_trigger" value="?">
+    </tr>
+
+    <tr>
+     <td valign="right">Betreff</td>
+     <td><input name="subject" value="[% HTML.escape(subject) %]" size="50"></td>
+    </tr>
+
+    <tr>
+     <td valign="right" align="top">Text</td>
+     <td align="top"><textarea cols="50" rows="10" name="body">[% HTML.escape(body) %]</textarea></td>
+    </tr>
+   </table>
+  </p>
+
+  <p>
+   <input type="hidden" name="action" value="dispatcher">
+   <input type="submit" class="submit" name="action_save" value="Speichern">
+   [%- IF id %]
+   <input type="submit" class="submit" name="action_finish" value="Abschlie&szlig;en">
+   <input type="submit" class="submit" name="action_delete" value="Löschen">
+   [%- END %]
+   [%- IF POPUP_MODE %]
+   <input type="submit" class="submit" onclick="window.close()" value="Abbrechen">
+   [%- END %]
+  </p>
+
+  [%- IF POPUP_MODE %]
+  [%- IF FOLLOW_UPS.size %]
+  <hr height="3" noshade>
+
+  <div class="listtop">Noch nicht erledigte Wiedervorlagen f&uuml;r dieses Dokument</div>
+
+  <p>
+   <table>
+    <tr>
+     <th class="listheading">Wiedervorlagedatum</th>
+     <th class="listheading">Betreff</th>
+     <th class="listheading">Erstellt von</th>
+     <th class="listheading">Wiedervorlage für</th>
+    </tr>
+
+    [%- FOREACH row = FOLLOW_UPS %]
+    <tr class="listrow[% loop.count % 2 %]">
+     <td valign="top">[% HTML.escape(row.follow_up_date) %]</td>
+     <td valign="top"><a href="fu.pl?action=edit&id=[% HTML.escape(row.id) %][% IF POPUP_MODE %]&POPUP_MODE=1[% END %]">[% HTML.escape(row.subject) %]</a></td>
+     <td valign="top">[% HTML.escape(row.created_by_name) %]</td>
+     <td valign="top">[% HTML.escape(row.created_for_user_name) %]</td>
+    </tr>
+    [%- END %]
+   </table>
+  </p>
+  [%- END %]
+  [%- END %]
+
+  [%- FOREACH row = LINKS %]
+  <input type="hidden" name="trans_id_[% loop.count %]"   value="[% HTML.escape(row.trans_id) %]">
+  <input type="hidden" name="trans_type_[% loop.count %]" value="[% HTML.escape(row.trans_type) %]">
+  <input type="hidden" name="trans_info_[% loop.count %]" value="[% HTML.escape(row.trans_info) %]">
+  [%- END %]
+
+  <input type="hidden" name="trans_rowcount" value="[% LINKS.size %]">
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/fu/add_edit_master.html b/templates/webpages/fu/add_edit_master.html
new file mode 100644 (file)
index 0000000..644bc3f
--- /dev/null
@@ -0,0 +1,108 @@
+[% USE HTML %]<body onload="on_load();">
+
+ <script type="text/javascript">
+  <!--
+      function on_load() {
+        Calendar.setup({ inputField : "follow_up_date", ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "follow_up_date_trigger" });
+        document.Form.subject.focus();
+      }
+    -->
+ </script>
+
+ <form action="fu.pl" method="post" name="Form">
+
+  [%- IF SAVED_MESSAGE %]
+  <p>[% SAVED_MESSAGE %]</p>
+  [%- END %]
+
+  <div class="listtop">[% title %]</div>
+
+  <input type="hidden" name="id" value="[% HTML.escape(id) %]">
+  <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
+  <input type="hidden" name="POPUP_MODE" value="[% HTML.escape(POPUP_MODE) %]">
+
+  <p>
+   <table>
+    <tr>
+     <td valign="top"><translate>Follow-Up for user</translate></td>
+     <td valign="top">
+      <select name="created_for_user">
+       [%- FOREACH row = EMPLOYEES %]
+       <option value="[% HTML.escape(row.id) %]"[% IF created_for_user == row.id %] selected[% END %]>
+        [%- IF row.name %][% HTML.escape(row.name) %] ([% HTML.escape(row.login) %])[% ELSE %][% HTML.escape(row.login) %][% END %]
+       </option>
+       [%- END %]
+      </select>
+     </td>
+    </tr>
+
+    <tr>
+     <td valign="right"><translate>Follow-Up Date</translate></td>
+     <td>
+      <input name="follow_up_date" id="follow_up_date" value="[% HTML.escape(follow_up_date) %]" size="12">
+      <input type="button" name="follow_up_date_button" id="follow_up_date_trigger" value="?">
+    </tr>
+
+    <tr>
+     <td valign="right"><translate>Subject</translate></td>
+     <td><input name="subject" value="[% HTML.escape(subject) %]" size="50"></td>
+    </tr>
+
+    <tr>
+     <td valign="right" align="top"><translate>Body</translate></td>
+     <td align="top"><textarea cols="50" rows="10" name="body">[% HTML.escape(body) %]</textarea></td>
+    </tr>
+   </table>
+  </p>
+
+  <p>
+   <input type="hidden" name="action" value="dispatcher">
+   <input type="submit" class="submit" name="action_save" value="<translate>Save</translate>">
+   [%- IF id %]
+   <input type="submit" class="submit" name="action_finish" value="<translate>Finish</translate>">
+   <input type="submit" class="submit" name="action_delete" value="<translate>Delete</translate>">
+   [%- END %]
+   [%- IF POPUP_MODE %]
+   <input type="submit" class="submit" onclick="window.close()" value="<translate>Cancel</translate>">
+   [%- END %]
+  </p>
+
+  [%- IF POPUP_MODE %]
+  [%- IF FOLLOW_UPS.size %]
+  <hr height="3" noshade>
+
+  <div class="listtop"><translate>Existing pending follow-ups for this item</translate></div>
+
+  <p>
+   <table>
+    <tr>
+     <th class="listheading"><translate>Follow-Up Date</translate></th>
+     <th class="listheading"><translate>Subject</translate></th>
+     <th class="listheading"><translate>Created by</translate></th>
+     <th class="listheading"><translate>Follow-up for</translate></th>
+    </tr>
+
+    [%- FOREACH row = FOLLOW_UPS %]
+    <tr class="listrow[% loop.count % 2 %]">
+     <td valign="top">[% HTML.escape(row.follow_up_date) %]</td>
+     <td valign="top"><a href="fu.pl?action=edit&id=[% HTML.escape(row.id) %][% IF POPUP_MODE %]&POPUP_MODE=1[% END %]">[% HTML.escape(row.subject) %]</a></td>
+     <td valign="top">[% HTML.escape(row.created_by_name) %]</td>
+     <td valign="top">[% HTML.escape(row.created_for_user_name) %]</td>
+    </tr>
+    [%- END %]
+   </table>
+  </p>
+  [%- END %]
+  [%- END %]
+
+  [%- FOREACH row = LINKS %]
+  <input type="hidden" name="trans_id_[% loop.count %]"   value="[% HTML.escape(row.trans_id) %]">
+  <input type="hidden" name="trans_type_[% loop.count %]" value="[% HTML.escape(row.trans_type) %]">
+  <input type="hidden" name="trans_info_[% loop.count %]" value="[% HTML.escape(row.trans_info) %]">
+  [%- END %]
+
+  <input type="hidden" name="trans_rowcount" value="[% LINKS.size %]">
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/fu/close_window_de.html b/templates/webpages/fu/close_window_de.html
new file mode 100644 (file)
index 0000000..d166865
--- /dev/null
@@ -0,0 +1 @@
+<body onload="window.close()"></body></html>
diff --git a/templates/webpages/fu/close_window_master.html b/templates/webpages/fu/close_window_master.html
new file mode 100644 (file)
index 0000000..d166865
--- /dev/null
@@ -0,0 +1 @@
+<body onload="window.close()"></body></html>
diff --git a/templates/webpages/fu/edit_access_rights_de.html b/templates/webpages/fu/edit_access_rights_de.html
new file mode 100644 (file)
index 0000000..3f1c28e
--- /dev/null
@@ -0,0 +1,47 @@
+[% USE HTML %]
+<body>
+
+ [%- IF SAVED_MESSAGE %]
+ <p>[% SAVED_MESSAGE %]</p>
+ [%- END %]
+
+ <div class="listtop">[% title %]</div>
+
+ <p>Erlaube den folgenden Benutzern Zugriff auf meine Wiedervorlagen:</p>
+
+ <form action="fu.pl" method="post" name="Form">
+  <p>
+   <table>
+    <tr>
+     <td class="listheading">Benutzer</td>
+     <td class="listheading">Zugriff erlauben</td>
+    </tr>
+
+    [%- FOREACH row = EMPLOYEES %]
+    [%- UNLESS row.login == login %]
+    <input type="hidden" name="employee_id_[% loop.count %]" value="[% HTML.escape(row.id) %]">
+
+    <tr class="listrow[% loop.count % 2 %]">
+     <td>[% IF row.name %][% HTML.escape(row.name) %] ([% HTML.escape(row.login) %])[% ELSE %][% HTML.escape(row.login) %][% END %]</td>
+     <td>
+      <input type="radio" id="access_[% HTML.escape(row.id) %]_yes" name="access_[% HTML.escape(row.id) %]" value="1"[% IF row.access %] checked[% END %]>
+      <label for="access_[% HTML.escape(row.id) %]_yes">Ja</label>
+      <input type="radio" id="access_[% HTML.escape(row.id) %]_no" name="access_[% HTML.escape(row.id) %]" value=""[% UNLESS row.access %] checked[% END %]>
+      <label for="access_[% HTML.escape(row.id) %]_no">Nein</label>
+     </td>
+    </tr>
+    [%- END %]
+    [%- END %]
+   </table>
+  </p>
+
+  <input type="hidden" name="rowcount" value="[% EMPLOYEES.size %]">
+  <input type="hidden" name="save_nextsub" value="save_access_rights">
+
+  <p>
+   <input type="submit" class="submit" name="action" value="Speichern">
+  </p>
+
+ </form>
+</body>
+</html>
diff --git a/templates/webpages/fu/edit_access_rights_master.html b/templates/webpages/fu/edit_access_rights_master.html
new file mode 100644 (file)
index 0000000..4f11a17
--- /dev/null
@@ -0,0 +1,47 @@
+[% USE HTML %]
+<body>
+
+ [%- IF SAVED_MESSAGE %]
+ <p>[% SAVED_MESSAGE %]</p>
+ [%- END %]
+
+ <div class="listtop">[% title %]</div>
+
+ <p><translate>Allow the following users access to my follow-ups:</translate></p>
+
+ <form action="fu.pl" method="post" name="Form">
+  <p>
+   <table>
+    <tr>
+     <td class="listheading"><translate>User</translate></td>
+     <td class="listheading"><translate>Allow access</translate></td>
+    </tr>
+
+    [%- FOREACH row = EMPLOYEES %]
+    [%- UNLESS row.login == login %]
+    <input type="hidden" name="employee_id_[% loop.count %]" value="[% HTML.escape(row.id) %]">
+
+    <tr class="listrow[% loop.count % 2 %]">
+     <td>[% IF row.name %][% HTML.escape(row.name) %] ([% HTML.escape(row.login) %])[% ELSE %][% HTML.escape(row.login) %][% END %]</td>
+     <td>
+      <input type="radio" id="access_[% HTML.escape(row.id) %]_yes" name="access_[% HTML.escape(row.id) %]" value="1"[% IF row.access %] checked[% END %]>
+      <label for="access_[% HTML.escape(row.id) %]_yes"><translate>Yes</translate></label>
+      <input type="radio" id="access_[% HTML.escape(row.id) %]_no" name="access_[% HTML.escape(row.id) %]" value=""[% UNLESS row.access %] checked[% END %]>
+      <label for="access_[% HTML.escape(row.id) %]_no"><translate>No</translate></label>
+     </td>
+    </tr>
+    [%- END %]
+    [%- END %]
+   </table>
+  </p>
+
+  <input type="hidden" name="rowcount" value="[% EMPLOYEES.size %]">
+  <input type="hidden" name="save_nextsub" value="save_access_rights">
+
+  <p>
+   <input type="submit" class="submit" name="action" value="<translate>Save</translate>">
+  </p>
+
+ </form>
+</body>
+</html>
diff --git a/templates/webpages/fu/report_bottom_de.html b/templates/webpages/fu/report_bottom_de.html
new file mode 100644 (file)
index 0000000..3cae2a8
--- /dev/null
@@ -0,0 +1,13 @@
+[% USE HTML%]
+ <input type="hidden" name="rowcount" value="[% HTML.escape(rowcount) %]">
+ [%- FOREACH item = HIDDEN %]
+ <input type="hidden" name="[% HTML.escape(item.key) %]" value="[% HTML.escape(item.value) %]">
+ [%- END %]
+
+ <p>
+  Wiedervorlagen<br>
+  <input type="hidden" name="action" value="dispatcher">
+  <input type="submit" name="action_finish" value="Abschlie&szlig;en">
+  <input type="submit" name="action_delete" value="Löschen">
+ </p>
+</form>
diff --git a/templates/webpages/fu/report_bottom_master.html b/templates/webpages/fu/report_bottom_master.html
new file mode 100644 (file)
index 0000000..5f2b844
--- /dev/null
@@ -0,0 +1,13 @@
+[% USE HTML%]
+ <input type="hidden" name="rowcount" value="[% HTML.escape(rowcount) %]">
+ [%- FOREACH item = HIDDEN %]
+ <input type="hidden" name="[% HTML.escape(item.key) %]" value="[% HTML.escape(item.value) %]">
+ [%- END %]
+
+ <p>
+  <translate>Follow-Ups</translate><br>
+  <input type="hidden" name="action" value="dispatcher">
+  <input type="submit" name="action_finish" value="<translate>Finish</translate>">
+  <input type="submit" name="action_delete" value="<translate>Delete</translate>">
+ </p>
+</form>
diff --git a/templates/webpages/fu/report_for_todo_list_de.html b/templates/webpages/fu/report_for_todo_list_de.html
new file mode 100644 (file)
index 0000000..1fe6531
--- /dev/null
@@ -0,0 +1,41 @@
+[% USE HTML %]
+
+<div class="listtop">Nicht erledigte Wiedervorlagen</div>
+
+<form action="fu.pl" method="post" name="TODOFollowUpsForm">
+ <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
+ <input type="hidden" name="rowcount" value="[% FOLLOW_UPS.size %]">
+
+ <p>
+  <table width="100%">
+   <tr>
+    <td class="listheading">&nbsp;</td>
+    <td class="listheading">Wiedervorlagedatum</td>
+    <td class="listheading">Erstellt am</td>
+    <td class="listheading">Betreff</td>
+    <td class="listheading">Referenz</td>
+    <td class="listheading">Erstellt von</td>
+   </tr>
+
+   [%- FOREACH row = FOLLOW_UPS %]
+   <tr class="listrow[% loop.count % 2 %]">
+    <td>
+     <input type="hidden" name="follow_up_id_[% loop.count %]" value="[% HTML.escape(row.id) %]">
+     <input type="checkbox" name="selected_[% loop.count %]" value="1">
+    </td>
+    <td>[% HTML.escape(row.follow_up_date) %]</td>
+    <td>[% HTML.escape(row.created_on) %]</td>
+    <td><a href="[% edit_url %][% HTML.escape(row.id) %]">[% HTML.escape(row.subject) %]</a></td>
+    <td>[% IF row.reference_link %]<a href="[% row.reference_link %]">[% END %][% HTML.escape(row.reference) %][% IF row.reference_link %]</a>[% END %]</td>
+    <td>[% HTML.escape(row.created_by_name) %]</td>
+   </tr>
+   [%- END %]
+  </table>
+ </p>
+
+ <p>
+  <input type="hidden" name="action" value="dispatcher">
+  <input type="submit" class="submit" name="action_finish" value="Abschlie&szlig;en">
+  <input type="submit" class="submit" name="action_delete" value="Löschen">
+ </p>
+</form>
diff --git a/templates/webpages/fu/report_for_todo_list_master.html b/templates/webpages/fu/report_for_todo_list_master.html
new file mode 100644 (file)
index 0000000..585556b
--- /dev/null
@@ -0,0 +1,41 @@
+[% USE HTML %]
+
+<div class="listtop"><translate>Unfinished follow-ups</translate></div>
+
+<form action="fu.pl" method="post" name="TODOFollowUpsForm">
+ <input type="hidden" name="callback" value="[% HTML.escape(callback) %]">
+ <input type="hidden" name="rowcount" value="[% FOLLOW_UPS.size %]">
+
+ <p>
+  <table width="100%">
+   <tr>
+    <td class="listheading">&nbsp;</td>
+    <td class="listheading"><translate>Follow-Up Date</translate></td>
+    <td class="listheading"><translate>Created on</translate></td>
+    <td class="listheading"><translate>Subject</translate></td>
+    <td class="listheading"><translate>Reference</translate></td>
+    <td class="listheading"><translate>Created by</translate></td>
+   </tr>
+
+   [%- FOREACH row = FOLLOW_UPS %]
+   <tr class="listrow[% loop.count % 2 %]">
+    <td>
+     <input type="hidden" name="follow_up_id_[% loop.count %]" value="[% HTML.escape(row.id) %]">
+     <input type="checkbox" name="selected_[% loop.count %]" value="1">
+    </td>
+    <td>[% HTML.escape(row.follow_up_date) %]</td>
+    <td>[% HTML.escape(row.created_on) %]</td>
+    <td><a href="[% edit_url %][% HTML.escape(row.id) %]">[% HTML.escape(row.subject) %]</a></td>
+    <td>[% IF row.reference_link %]<a href="[% row.reference_link %]">[% END %][% HTML.escape(row.reference) %][% IF row.reference_link %]</a>[% END %]</td>
+    <td>[% HTML.escape(row.created_by_name) %]</td>
+   </tr>
+   [%- END %]
+  </table>
+ </p>
+
+ <p>
+  <input type="hidden" name="action" value="dispatcher">
+  <input type="submit" class="submit" name="action_finish" value="<translate>Finish</translate>">
+  <input type="submit" class="submit" name="action_delete" value="<translate>Delete</translate>">
+ </p>
+</form>
diff --git a/templates/webpages/fu/report_top_de.html b/templates/webpages/fu/report_top_de.html
new file mode 100644 (file)
index 0000000..f6847d9
--- /dev/null
@@ -0,0 +1,10 @@
+[%- IF OPTIONS.size %]
+<p>
+ [%- FOREACH option = OPTIONS %]
+ [%- option %][% UNLESS loop.last %]<br>[% END %]
+ [%- END %]
+</p>
+[%- END %]
+
+<form action="fu.pl" method="post" name="Form">
+
diff --git a/templates/webpages/fu/report_top_master.html b/templates/webpages/fu/report_top_master.html
new file mode 100644 (file)
index 0000000..f6847d9
--- /dev/null
@@ -0,0 +1,10 @@
+[%- IF OPTIONS.size %]
+<p>
+ [%- FOREACH option = OPTIONS %]
+ [%- option %][% UNLESS loop.last %]<br>[% END %]
+ [%- END %]
+</p>
+[%- END %]
+
+<form action="fu.pl" method="post" name="Form">
+
diff --git a/templates/webpages/fu/search_de.html b/templates/webpages/fu/search_de.html
new file mode 100644 (file)
index 0000000..cff47ab
--- /dev/null
@@ -0,0 +1,122 @@
+[% USE HTML %]
+<body onload="on_load()">
+
+ <script type="text/javascript">
+  <!--
+      function on_load() {
+        Calendar.setup({ inputField : "follow_up_date_from", ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "follow_up_date_from_trigger" });
+        Calendar.setup({ inputField : "follow_up_date_to",   ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "follow_up_date_to_trigger" });
+        Calendar.setup({ inputField : "itime_from",          ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "itime_from_trigger" });
+        Calendar.setup({ inputField : "itime_to",            ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "itime_to_trigger" });
+        document.Form.subject.focus();
+      }
+    -->
+ </script>
+
+ <div class="listtop">[% title %]</div>
+
+ <form action="fu.pl" method="post" name="Form">
+  <input type="hidden" name="nextsub" value="report">
+
+  <p>
+   <table>
+    <tr>
+     <td align="right">Erstellt f&uuml;r</td>
+     <td>
+      <select name="created_for">
+       <option></option>
+       [%- FOREACH row = EMPLOYEES %]
+       <option value="[% HTML.escape(row.id) %]">
+        [%- IF row.name %]
+        [%- HTML.escape(row.name) %] ([% HTML.escape(row.login) %])
+        [%- ELSE %]
+        [%- HTML.escape(row.login) %]
+        [%- END %]
+       </option>
+       [%- END %]
+      </select>
+     </td>
+    </tr>
+
+    <tr>
+     <td align="right">Betreff</td>
+     <td><input name="subject" size="20"></td>
+    </tr>
+
+    <tr>
+     <td align="right">Text</td>
+     <td><input name="body" size="20"></td>
+    </tr>
+
+    <tr>
+     <td align="right">Referenz</td>
+     <td><input name="reference" size="20"></td>
+    </tr>
+
+    <tr>
+     <td align="right">Wiedervorlagedatum</td>
+     <td>
+      Von
+      <input name="follow_up_date_from" id="follow_up_date_from" size="12">
+      <input type="button" name="follow_up_date_from_button" id="follow_up_date_from_trigger" value="?">
+      Bis
+      <input name="follow_up_date_to" id="follow_up_date_to" size="12">
+      <input type="button" name="follow_up_date_to_button" id="follow_up_date_to_trigger" value="?">
+     </td>
+    </tr>
+
+    <tr>
+     <td align="right">Erstellt am</td>
+     <td>
+      Von
+      <input name="itime_from" id="itime_from" size="12">
+      <input type="button" name="itime_from_button" id="itime_from_trigger" value="?">
+      Bis
+      <input name="itime_to" id="itime_to" size="12">
+      <input type="button" name="itime_to_button" id="itime_to_trigger" value="?">
+     </td>
+    </tr>
+
+    <tr>
+     <td align="right">In Bericht aufnehmen</td>
+     <td>
+
+      <table>
+       <tr>
+        <td>
+         <input type="checkbox" name="due_only" id="due_only" value="1" checked>
+         <label for="due_only">Nur f&auml;llige Wiedervorlagen</label>
+        </td>
+
+        <td>
+         <input type="checkbox" name="all_users" id="all_users" value="1" checked>
+         <label for="all_users">Wiedervorlagen anderer Benutzer</label>
+        </td>
+       </tr>
+
+       <tr>
+        <td>
+         <input type="checkbox" name="not_done" id="not_done" value="1" checked>
+         <label for="not_done">Noch nicht fertig</label>
+        </td>
+
+        <td>
+         <input type="checkbox" name="done" id="done" value="1">
+         <label for="done">Fertig</label>
+        </td>
+       </tr>
+      </table>
+
+     </td>
+    </tr>
+
+   </table>
+  </p>
+
+  <p>
+   <input type="submit" name="action" value="Weiter">
+  </p>
+ </form>
+
+</body>
+</html>
diff --git a/templates/webpages/fu/search_master.html b/templates/webpages/fu/search_master.html
new file mode 100644 (file)
index 0000000..94309f1
--- /dev/null
@@ -0,0 +1,122 @@
+[% USE HTML %]
+<body onload="on_load()">
+
+ <script type="text/javascript">
+  <!--
+      function on_load() {
+        Calendar.setup({ inputField : "follow_up_date_from", ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "follow_up_date_from_trigger" });
+        Calendar.setup({ inputField : "follow_up_date_to",   ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "follow_up_date_to_trigger" });
+        Calendar.setup({ inputField : "itime_from",          ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "itime_from_trigger" });
+        Calendar.setup({ inputField : "itime_to",            ifFormat :"[% myconfig_jsc_dateformat %]", align : "BR", button : "itime_to_trigger" });
+        document.Form.subject.focus();
+      }
+    -->
+ </script>
+
+ <div class="listtop">[% title %]</div>
+
+ <form action="fu.pl" method="post" name="Form">
+  <input type="hidden" name="nextsub" value="report">
+
+  <p>
+   <table>
+    <tr>
+     <td align="right"><translate>Created for</translate></td>
+     <td>
+      <select name="created_for">
+       <option></option>
+       [%- FOREACH row = EMPLOYEES %]
+       <option value="[% HTML.escape(row.id) %]">
+        [%- IF row.name %]
+        [%- HTML.escape(row.name) %] ([% HTML.escape(row.login) %])
+        [%- ELSE %]
+        [%- HTML.escape(row.login) %]
+        [%- END %]
+       </option>
+       [%- END %]
+      </select>
+     </td>
+    </tr>
+
+    <tr>
+     <td align="right"><translate>Subject</translate></td>
+     <td><input name="subject" size="20"></td>
+    </tr>
+
+    <tr>
+     <td align="right"><translate>Body</translate></td>
+     <td><input name="body" size="20"></td>
+    </tr>
+
+    <tr>
+     <td align="right"><translate>Reference</translate></td>
+     <td><input name="reference" size="20"></td>
+    </tr>
+
+    <tr>
+     <td align="right"><translate>Follow-Up Date</translate></td>
+     <td>
+      <translate>From</translate>
+      <input name="follow_up_date_from" id="follow_up_date_from" size="12">
+      <input type="button" name="follow_up_date_from_button" id="follow_up_date_from_trigger" value="?">
+      <translate>To (time)</translate>
+      <input name="follow_up_date_to" id="follow_up_date_to" size="12">
+      <input type="button" name="follow_up_date_to_button" id="follow_up_date_to_trigger" value="?">
+     </td>
+    </tr>
+
+    <tr>
+     <td align="right"><translate>Created on</translate></td>
+     <td>
+      <translate>From</translate>
+      <input name="itime_from" id="itime_from" size="12">
+      <input type="button" name="itime_from_button" id="itime_from_trigger" value="?">
+      <translate>To (time)</translate>
+      <input name="itime_to" id="itime_to" size="12">
+      <input type="button" name="itime_to_button" id="itime_to_trigger" value="?">
+     </td>
+    </tr>
+
+    <tr>
+     <td align="right"><translate>Include in Report</translate></td>
+     <td>
+
+      <table>
+       <tr>
+        <td>
+         <input type="checkbox" name="due_only" id="due_only" value="1" checked>
+         <label for="due_only"><translate>Only due follow-ups</translate></label>
+        </td>
+
+        <td>
+         <input type="checkbox" name="all_users" id="all_users" value="1" checked>
+         <label for="all_users"><translate>Other users' follow-ups</translate></label>
+        </td>
+       </tr>
+
+       <tr>
+        <td>
+         <input type="checkbox" name="not_done" id="not_done" value="1" checked>
+         <label for="not_done"><translate>Not done yet</translate></label>
+        </td>
+
+        <td>
+         <input type="checkbox" name="done" id="done" value="1">
+         <label for="done"><translate>Done</translate></label>
+        </td>
+       </tr>
+      </table>
+
+     </td>
+    </tr>
+
+   </table>
+  </p>
+
+  <p>
+   <input type="submit" name="action" value="<translate>Continue</translate>">
+  </p>
+ </form>
+
+</body>
+</html>
index dd0abf8..71eebb1 100644 (file)
                            show_empty = 1 -%]
                 </td>
            </tr>
+      [%- IF id && num_follow_ups %]
+      <tr>
+       <td colspan="2">[% LxERP.format_string('Es gibt #1 Wiedervorlage(n), von denen #2 f&auml;llig ist/sind.', num_follow_ups, num_due_follow_ups) %]</td>
+      </tr>
+      [%- END %]
       </table>
          </td>
 [%- IF is_sales %]
 <input class=submit type=submit name=action value="Speichern und schließen">
 
 [%- IF id %]
+  <input type="button" class="submit" onclick="follow_up_window()" value="Wiedervorlage">
   <input type="button" class="submit" onclick="set_history_window([% HTML.escape(id) %])" name="history" id="history" value="Historie">
 
   <br>[% label_workflow %]<br>
index b96ed4f..92ac4b5 100644 (file)
                            show_empty = 1 -%]
                 </td>
            </tr>
+      [%- IF id && num_follow_ups %]
+      <tr>
+       <td colspan="2">[% LxERP.format_string('<translate>There are #1 unfinished follow-ups of which #2 are due.</translate>', num_follow_ups, num_due_follow_ups) %]</td>
+      </tr>
+      [%- END %]
       </table>
          </td>
 [%- IF is_sales %]
 <input class=submit type=submit name=action value="<translate>Save and Close</translate>">
 
 [%- IF id %]
+  <input type="button" class="submit" onclick="follow_up_window()" value="<translate>Follow-Up</translate>">
   <input type="button" class="submit" onclick="set_history_window([% HTML.escape(id) %])" name="history" id="history" value="<translate>history</translate>">
 
   <br>[% label_workflow %]<br>
index 32609a1..da7f79e 100644 (file)
@@ -9,11 +9,17 @@
     <script type="text/javascript" src="js/vendor_selection.js"></script>
     <script type="text/javascript" src="js/calculate_qty.js"></script>
     <script type="text/javascript" src="js/customer_or_vendor_selection.js"></script>
+    <script type="text/javascript" src="js/follow_up.js"></script>
 
 [%- FOREACH row = HIDDENS %]
    <input type="hidden" name="[% HTML.escape(row.name) %]" value="[% HTML.escape(row.value) %]" > 
 [%- END %]
 
+    <input type="hidden" name="follow_up_trans_id_1" value="[% HTML.escape(id) %]">
+    <input type="hidden" name="follow_up_trans_type_1" value="[% HTML.escape(type) %]">
+    <input type="hidden" name="follow_up_trans_info_1" value="[% HTML.escape(follow_up_trans_info) %]">
+    <input type="hidden" name="follow_up_rowcount" value="1">
+
     <table width=100%>
       <tr class=listtop>
         <th class=listtop>[% HTML.escape(title) %]</th>
index 22a78fc..c9a5bdc 100644 (file)
@@ -9,11 +9,17 @@
     <script type="text/javascript" src="js/vendor_selection.js"></script>
     <script type="text/javascript" src="js/calculate_qty.js"></script>
     <script type="text/javascript" src="js/customer_or_vendor_selection.js"></script>
+    <script type="text/javascript" src="js/follow_up.js"></script>
 
 [%- FOREACH row = HIDDENS %]
    <input type="hidden" name="[% HTML.escape(row.name) %]" value="[% HTML.escape(row.value) %]" > 
 [%- END %]
 
+    <input type="hidden" name="follow_up_trans_id_1" value="[% HTML.escape(id) %]">
+    <input type="hidden" name="follow_up_trans_type_1" value="[% HTML.escape(type) %]">
+    <input type="hidden" name="follow_up_trans_info_1" value="[% HTML.escape(follow_up_trans_info) %]">
+    <input type="hidden" name="follow_up_rowcount" value="1">
+
     <table width=100%>
       <tr class=listtop>
         <th class=listtop>[% HTML.escape(title) %]</th>
diff --git a/templates/webpages/oe/report_for_todo_list_de.html b/templates/webpages/oe/report_for_todo_list_de.html
new file mode 100644 (file)
index 0000000..21840f7
--- /dev/null
@@ -0,0 +1,29 @@
+[% USE HTML %][% USE LxERP %]
+
+<div class="listtop">&Uuml;berf&auml;llige Angebote</div>
+
+<p>
+ <table width="100%">
+  <tr>
+   <td class="listheading">Datum</td>
+   <td class="listheading">gültig bis</td>
+   <td class="listheading">Auftrag</td>
+   <td class="listheading">Kunde</td>
+   <td class="listheading">Vorgangsbezeichnung</td>
+   <td class="listheading">Betrag</td>
+   <td class="listheading">Bearbeiter</td>
+  </tr>
+
+  [%- FOREACH row = QUOTATIONS %]
+  <tr class="listrow[% loop.count % 2 %]">
+   <td>[% HTML.escape(row.transdate) %]</td>
+   <td>[% HTML.escape(row.reqdate) %]</td>
+   <td><a href="[% edit_url %]&id=[% HTML.url(row.id) %]">[% HTML.escape(row.quonumber) %]</a></td>
+   <td>[% HTML.escape(row.customer) %]</td>
+   <td>[% HTML.escape(row.transaction_description) %]</td>
+   <td>[% HTML.escape(LxERP.format_amount(row.amount, 2)) %]</td>
+   <td>[% HTML.escape(row.employee) %]</td>
+  </tr>
+  [%- END %]
+ </table>
+</p>
diff --git a/templates/webpages/oe/report_for_todo_list_master.html b/templates/webpages/oe/report_for_todo_list_master.html
new file mode 100644 (file)
index 0000000..67d6075
--- /dev/null
@@ -0,0 +1,29 @@
+[% USE HTML %][% USE LxERP %]
+
+<div class="listtop"><translate>Overdue sales quotations</translate></div>
+
+<p>
+ <table width="100%">
+  <tr>
+   <td class="listheading"><translate>Date</translate></td>
+   <td class="listheading"><translate>Valid until</translate></td>
+   <td class="listheading"><translate>Order</translate></td>
+   <td class="listheading"><translate>Customer</translate></td>
+   <td class="listheading"><translate>Transaction description</translate></td>
+   <td class="listheading"><translate>Amount</translate></td>
+   <td class="listheading"><translate>Employee</translate></td>
+  </tr>
+
+  [%- FOREACH row = QUOTATIONS %]
+  <tr class="listrow[% loop.count % 2 %]">
+   <td>[% HTML.escape(row.transdate) %]</td>
+   <td>[% HTML.escape(row.reqdate) %]</td>
+   <td><a href="[% edit_url %]&id=[% HTML.url(row.id) %]">[% HTML.escape(row.quonumber) %]</a></td>
+   <td>[% HTML.escape(row.customer) %]</td>
+   <td>[% HTML.escape(row.transaction_description) %]</td>
+   <td>[% HTML.escape(LxERP.format_amount(row.amount, 2)) %]</td>
+   <td>[% HTML.escape(row.employee) %]</td>
+  </tr>
+  [%- END %]
+ </table>
+</p>
diff --git a/templates/webpages/todo/show_todo_list_de.html b/templates/webpages/todo/show_todo_list_de.html
new file mode 100644 (file)
index 0000000..8768e91
--- /dev/null
@@ -0,0 +1,17 @@
+[% USE HTML %]<body>
+
+ <div class="listtop" style="margin-bottom: 10px">Ihre Aufgabenliste</div>
+
+ [%- IF !todo_list %]
+ <p>
+  Ihre Aufgabenliste enth&auml;lt momentan keine Eintr&auml;ge.
+ </p>
+
+ [%- ELSE %]
+
+ [%- todo_list %]
+
+ [%- END %]
+
+</body>
+</html>
diff --git a/templates/webpages/todo/show_todo_list_master.html b/templates/webpages/todo/show_todo_list_master.html
new file mode 100644 (file)
index 0000000..ebf0363
--- /dev/null
@@ -0,0 +1,17 @@
+[% USE HTML %]<body>
+
+ <div class="listtop" style="margin-bottom: 10px"><translate>Your TODO list</translate></div>
+
+ [%- IF !todo_list %]
+ <p>
+  <translate>There are no items on your TODO list at the moment.</translate>
+ </p>
+
+ [%- ELSE %]
+
+ [%- todo_list %]
+
+ [%- END %]
+
+</body>
+</html>
diff --git a/todo.pl b/todo.pl
new file mode 120000 (symlink)
index 0000000..385000d
--- /dev/null
+++ b/todo.pl
@@ -0,0 +1 @@
+am.pl
\ No newline at end of file