Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 69df38d3

Von Moritz Bunkus vor mehr als 11 Jahren hinzugefügt

  • ID 69df38d39da1a1fcbf59ebc8f3ddd29a1f82ec29
  • Vorgänger 91d2ef32
  • Nachfolger c2692077

Gruppenverwaltung auf Controllermodel umgestellt

Dabei auch Verknüpfung Gruppen <-> Mandanten implementiert.

Unterschiede anzeigen:

SL/Controller/Admin.pm
14 14

  
15 15
use Rose::Object::MakeMethods::Generic
16 16
(
17
  'scalar --get_set_init' => [ qw(client user nologin_file_name db_cfg all_dateformats all_numberformats all_countrycodes all_stylesheets all_menustyles all_clients all_groups all_users) ],
17
  'scalar --get_set_init' => [ qw(client user group nologin_file_name db_cfg all_dateformats all_numberformats all_countrycodes all_stylesheets all_menustyles all_clients all_groups all_users all_rights is_locked) ],
18 18
);
19 19

  
20 20
__PACKAGE__->run_before(\&setup_layout);
......
95 95

  
96 96
  $self->render(
97 97
    "admin/show",
98
    CLIENTS => SL::DB::Manager::AuthClient->get_all_sorted,
99
    USERS   => SL::DB::Manager::AuthUser->get_all_sorted,
100
    LOCKED  => (-e $self->nologin_file_name),
101
    title   => "kivitendo " . t8('Administration'),
98
    title => "kivitendo " . t8('Administration'),
102 99
  );
103 100
}
104 101

  
......
242 239
                error => $error);
243 240
}
244 241

  
242
#
243
# actions: groups
244
#
245

  
246
sub action_new_group {
247
  my ($self) = @_;
248

  
249
  $self->group(SL::DB::AuthGroup->new);
250
  $self->edit_group_form(title => t8('Create a new group'));
251
}
252

  
253
sub action_edit_group {
254
  my ($self) = @_;
255
  $self->edit_group_form(title => t8('Edit User Group'));
256
}
257

  
258
sub action_save_group {
259
  my ($self) = @_;
260

  
261
  my $params = delete($::form->{group}) || { };
262
  my $is_new = !$params->{id};
263

  
264
  $self->group($is_new ? SL::DB::AuthGroup->new : SL::DB::AuthGroup->new(id => $params->{id})->load)->assign_attributes(%{ $params });
265

  
266
  my @errors = $self->group->validate;
267

  
268
  if (@errors) {
269
    flash('error', @errors);
270
    $self->edit_group_form(title => $is_new ? t8('Create a new user group') : t8('Edit User Group'));
271
    return;
272
  }
273

  
274
  $self->group->save;
275

  
276
  flash_later('info', $is_new ? t8('The user group has been created.') : t8('The user group has been saved.'));
277
  $self->redirect_to(action => 'show');
278
}
279

  
280
sub action_delete_group {
281
  my ($self) = @_;
282

  
283
  if (!$self->group->delete) {
284
    flash('error', t8('The user group could not be deleted.'));
285
    $self->edit_group_form(title => t8('Edit User Group'));
286
    return;
287
  }
288

  
289
  flash_later('info', t8('The user group has been deleted.'));
290
  $self->redirect_to(action => 'show');
291
}
292

  
245 293
#
246 294
# actions: locking, unlocking
247 295
#
......
273 321

  
274 322
sub init_db_cfg            { $::lx_office_conf{'authentication/database'}                                            }
275 323
sub init_nologin_file_name { $::lx_office_conf{paths}->{userspath} . '/nologin';                                     }
324
sub init_is_locked         { -e $_[0]->nologin_file_name                                                             }
276 325
sub init_client            { SL::DB::AuthClient->new(id => ($::form->{id} || ($::form->{client} || {})->{id}))->load }
277 326
sub init_user              { SL::DB::AuthUser  ->new(id => ($::form->{id} || ($::form->{user}   || {})->{id}))->load }
327
sub init_group             { SL::DB::AuthGroup ->new(id => ($::form->{id} || ($::form->{group}  || {})->{id}))->load }
278 328
sub init_all_clients       { SL::DB::Manager::AuthClient->get_all_sorted                                             }
279 329
sub init_all_users         { SL::DB::Manager::AuthUser->get_all_sorted                                               }
280 330
sub init_all_groups        { SL::DB::Manager::AuthGroup->get_all_sorted                                              }
......
289 339
  ];
290 340
}
291 341

  
342
sub init_all_rights {
343
  my (@sections, $current_section);
344

  
345
  foreach my $entry ($::auth->all_rights_full) {
346
    if ($entry->[0] =~ m/^--/) {
347
      push @sections, { description => $entry->[1], rights => [] };
348

  
349
    } elsif (@sections) {
350
      push @{ $sections[-1]->{rights} }, {
351
        name        => $entry->[0],
352
        description => $entry->[1],
353
      };
354

  
355
    } else {
356
      die "Right without sections: " . join('::', @{ $entry });
357
    }
358
  }
359

  
360
  return \@sections;
361
}
362

  
292 363
sub init_all_countrycodes {
293 364
  my %cc = User->country_codes;
294 365
  return [ map { id => $_, title => $cc{$_} }, sort { $cc{$a} cmp $cc{$b} } keys %cc ];
......
310 381
# displaying forms
311 382
#
312 383

  
384
sub use_multiselect_js {
385
  my ($self) = @_;
386

  
387
  $::request->layout->use_javascript("${_}.js") for qw(jquery.selectboxes jquery.multiselect2side);
388
  return $self;
389
}
390

  
313 391
sub login_form {
314 392
  my ($self, %params) = @_;
315 393
  $::request->layout->focus('#admin_password');
......
318 396

  
319 397
sub edit_user_form {
320 398
  my ($self, %params) = @_;
321

  
322
  $::request->layout->use_javascript("${_}.js") for qw(jquery.selectboxes jquery.multiselect2side);
323
  $self->render('admin/edit_user', %params);
399
  $self->use_multiselect_js->render('admin/edit_user', %params);
324 400
}
325 401

  
326 402
sub edit_client_form {
327 403
  my ($self, %params) = @_;
404
  $self->use_multiselect_js->render('admin/edit_client', %params);
405
}
328 406

  
329
  $::request->layout->use_javascript("${_}.js") for qw(jquery.selectboxes jquery.multiselect2side);
330
  $self->render('admin/edit_client', %params);
407
sub edit_group_form {
408
  my ($self, %params) = @_;
409
  $self->use_multiselect_js->render('admin/edit_group', %params);
331 410
}
332 411

  
333 412
#
SL/DB/AuthGroup.pm
4 4

  
5 5
use SL::DB::MetaSetup::AuthGroup;
6 6
use SL::DB::Manager::AuthGroup;
7
use SL::DB::AuthGroupRight;
7
use SL::DB::Helper::Util;
8 8

  
9 9
__PACKAGE__->meta->add_relationship(
10 10
  users => {
......
28 28

  
29 29
__PACKAGE__->meta->initialize;
30 30

  
31
sub validate {
32
  my ($self) = @_;
33

  
34
  my @errors;
35
  push @errors, $::locale->text('The name is missing.')    if !$self->name;
36
  push @errors, $::locale->text('The name is not unique.') if !SL::DB::Helper::Util::is_unique($self, 'name');
37

  
38
  return @errors;
39
}
40

  
31 41
sub get_employees {
32 42
  my @logins = map { $_->login } $_[0]->users;
33 43
  return @logins ? @{ SL::DB::Manager::Employee->get_all(query => [ login => \@logins ]) } : ();
34 44
}
35 45

  
46
sub rights_map {
47
  my $self = shift;
48

  
49
  if (@_) {
50
    my %new_rights = ref($_[0]) eq 'HASH' ? %{ $_[0] } : @_;
51
    $self->rights([ map { SL::DB::AuthGroupRight->new(right => $_, granted => $new_rights{$_} ? 1 : 0) } SL::Auth::all_rights() ]);
52
  }
53

  
54
  return {
55
    map({ ($_        => 0)           } SL::Auth::all_rights()),
56
    map({ ($_->right => $_->granted) } @{ $self->rights || [] })
57
  };
58
}
59

  
36 60
1;
61
__END__
62

  
63
=pod
64

  
65
=encoding utf8
66

  
67
=head1 NAME
68

  
69
SL::DB::AuthGroup - RDBO model for auth.group
70

  
71
=head1 SYNOPSIS
72

  
73
  # Outputting all rights granted to this group:
74
  my $group  = SL::DB::Manager::AuthGroup->get_first;
75
  my %rights = %{ $group->rights_map };
76
  print "Granted rights:\n";
77
  print "  $_\n" for sort grep { $rights{$_} } keys %rights;
78

  
79
  # Set a right to 'yes':
80
  $group->rights_map(%{ $group->rights_map }, invoice_edit => 1);
81
  $group->save;
82

  
83
=head1 FUNCTIONS
84

  
85
=over 4
86

  
87
=item C<get_employees>
88

  
89
Returns all employees (as instances of L<SL::DB::Employee>) whose
90
corresponding logins are members in this group.
91

  
92
=item C<rights_map [$new_rights]>
93

  
94
Gets/sets the rights for this group as hashes. Returns a hash
95
references containing the right names as the keys and trueish/falsish
96
values for 'granted'/'not granted'.
97

  
98
If C<$new_rights> is given as a hash reference or a plain hash then it
99
will also set all rights from this hash.
100

  
101
=item C<validate>
102

  
103
Validates the object before saving (checks uniqueness, attribute
104
presence etc). Returns a list of human-readable errors and an empty
105
list on success.
106

  
107
=back
108

  
109
=head1 BUGS
110

  
111
Nothing here yet.
112

  
113
=head1 AUTHOR
114

  
115
Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>
116

  
117
=cut
bin/mozilla/admin.pl
60 60
use SL::Template;
61 61

  
62 62
require "bin/mozilla/common.pl";
63
require "bin/mozilla/admin_groups.pl";
64 63
require "bin/mozilla/admin_printer.pl";
65 64

  
66 65
use strict;
bin/mozilla/admin_groups.pl
1
#=====================================================================
2
# LX-Office ERP
3
# Copyright (C) 2004
4
# Based on SQL-Ledger Version 2.1.9
5
# Web http://www.lx-office.org
6
#
7
#=====================================================================
8
# SQL-Ledger Accounting
9
# Copyright (c) 2002
10
#
11
#  Author: Moritz Bunkus
12
#   Email: mbunkus@linet-services.de
13
#     Web: www.linet-services.de
14
#
15
#
16
# This program is free software; you can redistribute it and/or modify
17
# it under the terms of the GNU General Public License as published by
18
# the Free Software Foundation; either version 2 of the License, or
19
# (at your option) any later version.
20
#
21
# This program is distributed in the hope that it will be useful,
22
# but WITHOUT ANY WARRANTY; without even the implied warranty of
23
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24
# GNU General Public License for more details.
25
# You should have received a copy of the GNU General Public License
26
# along with this program; if not, write to the Free Software
27
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28
#======================================================================
29
#
30
# group administration module
31
# add/edit/delete user groups
32
#
33
#======================================================================
34

  
35
use List::MoreUtils qw(uniq);
36

  
37
use strict;
38

  
39
sub edit_groups {
40
  $main::lxdebug->enter_sub();
41

  
42
  my $form     = $main::form;
43

  
44
  my @groups = sort { lc $a->{name} cmp lc $b->{name} } values %{ $main::auth->read_groups() };
45

  
46
  $form->header();
47
  print $form->parse_html_template("admin/edit_groups", { 'GROUPS'     => \@groups,
48
                                                          'num_groups' => scalar @groups });
49

  
50
  $main::lxdebug->leave_sub();
51
}
52

  
53
sub add_group {
54
  $main::lxdebug->enter_sub();
55

  
56
  my $form     = $main::form;
57
  my $locale   = $main::locale;
58

  
59
  delete $form->{group_id};
60
  $form->{message} = $locale->text("The group has been added.");
61

  
62
  save_group();
63

  
64
  $main::lxdebug->leave_sub();
65
}
66

  
67
sub save_group {
68
  $main::lxdebug->enter_sub();
69

  
70
  my $form     = $main::form;
71
  my $locale   = $main::locale;
72

  
73
  $form->isblank('name', $locale->text('The group name is missing.'));
74

  
75
  my $groups = $main::auth->read_groups();
76
  my %users  = map { ( $_->{id} => 1 ) } values %{ { $::auth->read_all_users() } };
77

  
78
  foreach my $group (values %{$groups}) {
79
    if (($form->{group_id} != $group->{id})
80
        && ($form->{name} eq $group->{name})) {
81
      $form->show_generic_error($locale->text("A group with that name does already exist."));
82
    }
83
  }
84

  
85
  my $group;
86

  
87
  if ($form->{group_id} && $groups->{$form->{group_id}}) {
88
    $group = $groups->{$form->{group_id}};
89

  
90
  } else {
91
    $group = { };
92
  }
93

  
94
  $group->{name}        = $form->{name};
95
  $group->{description} = $form->{description};
96
  $group->{rights}      = { map { ( $_ => $form->{"${_}_granted"} ? 1 : 0 ) } SL::Auth::all_rights() };
97
  $group->{members}     = [ grep { $users{$_} } @{ $form->{user_ids} || [] } ];
98

  
99
  my $is_new = !$form->{group_id};
100

  
101
  $main::auth->save_group($group);
102

  
103
  $form->{message} ||= $locale->text('The group has been saved.');
104

  
105
  if ($is_new) {
106
    edit_groups();
107

  
108
  } else {
109
    edit_group();
110
  }
111

  
112
  $main::lxdebug->leave_sub();
113
}
114

  
115
sub edit_group {
116
  $main::lxdebug->enter_sub();
117

  
118
  my $form     = $main::form;
119
  my $locale   = $main::locale;
120

  
121
  my $groups = $main::auth->read_groups();
122

  
123
  if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
124
    $form->show_generic_error($locale->text("No group has been selected, or the group does not exist anymore."));
125
  }
126

  
127
  my $group     = $groups->{$form->{group_id}};
128
  my %all_users = $main::auth->read_all_users();
129
  my @rights    = map {
130
    { "right"       => $_->[0],
131
      "description" => $_->[1],
132
      "is_section"  => '--' eq substr($_->[0], 0, 2),
133
      "granted"     => defined $group->{rights}->{$_->[0]} ? $group->{rights}->{$_->[0]} : 0,
134
    }
135
  } SL::Auth::all_rights_full();
136

  
137
  $form->header();
138
  print $form->parse_html_template("admin/edit_group", { ALL_USERS            => [ values %all_users ],
139
                                                         USER_IDS_IN_GROUP    => $group->{members},
140
                                                         "RIGHTS"             => \@rights,
141
                                                         "name"               => $group->{name},
142
                                                         "description"        => $group->{description} });
143

  
144
  $main::lxdebug->leave_sub();
145
}
146

  
147
sub delete_group {
148
  $main::lxdebug->enter_sub();
149

  
150
  my $form     = $main::form;
151
  my $locale   = $main::locale;
152

  
153
  my $groups = $main::auth->read_groups();
154

  
155
  if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
156
    $form->show_generic_error($locale->text("No group has been selected, or the group does not exist anymore."));
157
  }
158

  
159
  if ($form->{confirmed}) {
160
    $main::auth->delete_group($form->{"group_id"});
161

  
162
    $form->{message} = $locale->text("The group has been deleted.");
163
    edit_groups();
164

  
165
  } else {
166

  
167
    $form->header();
168
    print $form->parse_html_template("admin/delete_group_confirm", $groups->{$form->{group_id}});
169
  }
170

  
171
  $main::lxdebug->leave_sub();
172
}
173

  
174
sub edit_group_membership {
175
  $main::lxdebug->enter_sub();
176

  
177
  my $form     = $main::form;
178
  my $locale   = $main::locale;
179

  
180
  my %users  = $main::auth->read_all_users();
181
  my $groups = $main::auth->read_groups();
182
  $groups    = [ sort { lc $a->{name} cmp lc $b->{name} } values %{ $groups } ];
183

  
184
  my @headings = map { { 'title' => $_ } } map { $_->{name} } @{ $groups };
185

  
186
  foreach my $group (@{ $groups }) {
187
    $group->{members_h} = { map { $_ => 1 } @{ $group->{members} } };
188
  }
189

  
190
  my @rows;
191

  
192
  foreach my $user (sort { lc $a->{login} cmp lc $b->{login} } values %users) {
193
    my $row = {
194
      'id'              => $user->{id},
195
      'login'           => $user->{login},
196
      'name'            => $user->{name},
197
      'repeat_headings' => (scalar(@rows) % 20) == 0,
198
      'GROUPS'          => [],
199
    };
200

  
201
    foreach my $group (@{ $groups }) {
202
      push @{ $row->{GROUPS} }, {
203
        'id'        => $group->{id},
204
        'is_member' => $group->{members_h}->{$user->{id}},
205
      };
206
    }
207

  
208
    push @rows, $row;
209
  }
210

  
211
  $form->{title} = $locale->text('Edit group membership');
212
  $form->header();
213
  print $form->parse_html_template('admin/edit_group_membership', { 'HEADINGS' => \@headings, 'USERS' => \@rows });
214

  
215
  $main::lxdebug->leave_sub();
216
}
217

  
218
sub save_group_membership {
219
  $main::lxdebug->enter_sub();
220

  
221
  my $form     = $main::form;
222
  my $locale   = $main::locale;
223

  
224
  my %users  = $main::auth->read_all_users();
225
  my $groups = $main::auth->read_groups();
226

  
227
  foreach my $group (values %{ $groups }) {
228
    $group->{members} = [ ];
229

  
230
    foreach my $user (values %users) {
231
      push @{ $group->{members} }, $user->{id} if ($form->{"u_$user->{id}_g_$group->{id}"});
232
    }
233

  
234
    $main::auth->save_group($group);
235
  }
236

  
237
  $form->{message} = $locale->text('The group memberships have been saved.');
238

  
239
  edit_groups();
240

  
241
  $main::lxdebug->leave_sub();
242
}
243

  
244
1;
locale/de/all
42 42
  '<b>What</b> do you want to look for?' => '<b>Wonach</b> wollen Sie suchen?',
43 43
  'A Buchungsgruppe consists of a descriptive name and the account numbers for the income and expense accounts for those four tax zones as well as the inventory account number.' => 'Eine Buchungsgruppe besteht aus einem deskriptiven Namen, den Erl&ouml;s- und Aufwandskonten f&uuml;r diese vier Steuerzonen sowie aus einem Inventarkonto.',
44 44
  'A digit is required.'        => 'Eine Ziffer ist vorgeschrieben.',
45
  'A group with that name does already exist.' => 'Eine Gruppe mit diesem Namen gibt es bereits.',
46 45
  'A lot of the usability of kivitendo has been enhanced with javascript. Although it is currently possible to use every aspect of kivitendo without javascript, we strongly recommend it. In a future version this may change and javascript may be necessary to access advanced features.' => 'Die Bedienung von kivitendo wurde an vielen Stellen mit Javascript verbessert. Obwohl es derzeit möglich ist, jeden Aspekt von kivitendo auch ohne Javascript zu benutzen, empfehlen wir es. In einer zukünftigen Version wird Javascript eventuell notwendig sein um weitergehende Features zu benutzen.',
47 46
  'A lower-case character is required.' => 'Ein Kleinbuchstabe ist vorgeschrieben.',
48 47
  'A special character is required (valid characters: #1).' => 'Ein Sonderzeichen ist vorgeschrieben (gültige Zeichen: #1).',
......
75 74
  'Abort'                       => 'Abbrechen',
76 75
  'Abrechnungsnummer'           => 'Abrechnungsnummer',
77 76
  'Abteilung'                   => 'Abteilung',
77
  'Access rights'               => 'Zugriffsrechte',
78 78
  'Access to clients'           => 'Zugriff auf Mandanten',
79 79
  'Account'                     => 'Konto',
80 80
  'Account Category A'          => 'Aktiva/Mittelverwendung',
......
159 159
  'Add Storno Credit Note'      => 'Gutschrift Storno hinzufügen',
160 160
  'Add Transaction'             => 'Dialogbuchen',
161 161
  'Add User'                    => 'Neuer Benutzer',
162
  'Add User Group'              => 'Neue Benutzergruppe',
162 163
  'Add Vendor'                  => 'Lieferant erfassen',
163 164
  'Add Vendor Invoice'          => 'Einkaufsrechnung erfassen',
164 165
  'Add Warehouse'               => 'Lager erfassen',
165
  'Add a new group'             => 'Neue Gruppe erfassen',
166 166
  'Add and edit units'          => 'Einheiten erfassen und bearbeiten',
167 167
  'Add bank account'            => 'Bankkonto erfassen',
168 168
  'Add custom variable'         => 'Benutzerdefinierte Variable erfassen',
......
443 443
  'Client Configuration saved!' => 'Mandantenkonfiguration gespeichert!',
444 444
  'Client list'                 => 'Mandantenliste',
445 445
  'Client name'                 => 'Mandantenname',
446
  'Clients this Group is valid for' => 'Mandanten, für die diese Gruppe gültig ist',
446 447
  'Clients this user has access to' => 'Mandaten, auf die Benutzer Zugriff hat',
447 448
  'Close'                       => 'Übernehmen',
448 449
  'Close Books up to'           => 'Die Bücher abschließen bis zum',
......
497 498
  'Create a new business'       => 'Einen neuen Kunden-/Lieferantentyp erfassen',
498 499
  'Create a new client'         => 'Einen neuen Mandanten anlegen',
499 500
  'Create a new department'     => 'Eine neue Abteilung erfassen',
501
  'Create a new group'          => 'Neue Benutzergruppe erfassen',
500 502
  'Create a new payment term'   => 'Neue Zahlungsbedingungen anlegen',
501 503
  'Create a new project'        => 'Neues Projekt anlegen',
502 504
  'Create a new user'           => 'Einen neuen Benutzer anlegen',
505
  'Create a new user group'     => 'Eine neue Benutzergruppe erfassen',
503 506
  'Create and edit RFQs'        => 'Lieferantenanfragen erfassen und bearbeiten',
504 507
  'Create and edit dunnings'    => 'Mahnungen erfassen und bearbeiten',
505 508
  'Create and edit invoices and credit notes' => 'Rechnungen und Gutschriften erfassen und bearbeiten',
......
652 655
  'Delete Shipto'               => 'Lieferadresse löschen',
653 656
  'Delete delivery order'       => 'Lieferschein l&ouml;schen',
654 657
  'Delete drafts'               => 'Entwürfe löschen',
655
  'Delete group'                => 'Gruppe l&ouml;schen',
656 658
  'Delete links'                => 'Verknüpfungen löschen',
657 659
  'Delete profile'              => 'Profil löschen',
658 660
  'Delete transaction'          => 'Buchung löschen',
......
704 706
  'Do you really want to delete AR transaction #1?' => 'Wollen Sie wirklich die Debitorenbuchung #1 löschen?',
705 707
  'Do you really want to delete GL transaction #1?' => 'Wollen Sie wirklich die Dialogbuchung #1 löschen?',
706 708
  'Do you really want to delete the selected links?' => 'Wollen Sie wirklich die ausgewählten Verknüpfungen löschen?',
707
  'Do you really want to delete this group?' => 'Gruppe wirklich l&ouml;schen?',
708 709
  'Do you really want to delete this object?' => 'Wollen Sie dieses Objekt wirklich löschen?',
709 710
  'Do you really want to delete this warehouse?' => 'Wollen Sie dieses Lager wirklich l&ouml;schen?',
710 711
  'Do you want to <b>limit</b> your search?' => 'Wollen Sie Ihre Suche <b>spezialisieren</b>?',
......
802 803
  'Edit Storno Credit Note'     => 'Storno Gutschrift bearbeiten',
803 804
  'Edit Storno Invoice'         => 'Stornorechnung bearbeiten',
804 805
  'Edit User'                   => 'Benutzerdaten bearbeiten',
806
  'Edit User Group'             => 'Benutzergruppe bearbeiten',
805 807
  'Edit Vendor'                 => 'Lieferant editieren',
806 808
  'Edit Vendor Invoice'         => 'Einkaufsrechnung bearbeiten',
807 809
  'Edit Warehouse'              => 'Lager bearbeiten',
808
  'Edit and delete a group'     => 'Gruppen bearbeiten und l&ouml;schen',
809 810
  'Edit background job'         => 'Hintergrund-Job bearbeiten',
810 811
  'Edit bank account'           => 'Bankkonto bearbeiten',
811 812
  'Edit business'               => 'Kunden-/Lieferantentyp bearbeiten',
......
813 814
  'Edit department'             => 'Abteilung bearbeiten',
814 815
  'Edit file'                   => 'Datei bearbeiten',
815 816
  'Edit greetings'              => 'Anreden bearbeiten',
816
  'Edit group '                 => 'Gruppe bearbeiten',
817
  'Edit group membership'       => 'Gruppenmitgliedschaften bearbeiten',
818
  'Edit groups'                 => 'Gruppen bearbeiten',
819
  'Edit membership'             => 'Mitgliedschaft bearbeiten',
820 817
  'Edit note'                   => 'Notiz bearbeiten',
821 818
  'Edit payment term'           => 'Zahlungsbedingungen bearbeiten',
822 819
  'Edit prices and discount (if not used, textfield is ONLY set readonly)' => 'Preise und Rabatt in Formularen frei anpassen (falls deaktiviert, wird allerdings NUR das textfield auf READONLY gesetzt / kann je nach Browserversion und technischen Fähigkeiten des Anwenders noch umgangen werden)',
823 820
  'Edit project'                => 'Projekt bearbeiten',
824 821
  'Edit project #1'             => 'Projekt #1 bearbeiten',
825
  'Edit rights'                 => 'Rechte bearbeiten',
826 822
  'Edit templates'              => 'Vorlagen bearbeiten',
827 823
  'Edit the Delivery Order'     => 'Lieferschein bearbeiten',
828 824
  'Edit the configuration for periodic invoices' => 'Konfiguration für wiederkehrende Rechnungen bearbeiten',
829
  'Edit the membership of all users in all groups:' => 'Bearbeiten der Mitgliedschaft aller Benutzer in allen Gruppen:',
830 825
  'Edit the purchase_order'     => 'Bearbeiten des Lieferantenauftrags',
831 826
  'Edit the request_quotation'  => 'Bearbeiten der Preisanfrage',
832 827
  'Edit the sales_order'        => 'Bearbeiten des Auftrags',
......
995 990
  'Group Items'                 => 'Waren gruppieren',
996 991
  'Group assignment'            => 'Gruppenzuordnung',
997 992
  'Group deleted!'              => 'Warengruppe gelöscht!',
993
  'Group list'                  => 'Gruppenliste',
998 994
  'Group membership'            => 'Gruppenzugehörigkeit',
999 995
  'Group missing!'              => 'Warengruppe fehlt!',
1000 996
  'Group saved!'                => 'Warengruppe gespeichert!',
......
1055 1051
  'Import result'               => 'Import-Ergebnis',
1056 1052
  'Import summary'              => 'Import-Zusammenfassung',
1057 1053
  'In order to do that hit the button "Delete transaction".' => 'Drücken Sie dafür auf den Button "Buchung löschen".',
1058
  'In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.' => 'Um kivitendo zu nutzen, müssen Sie mindestens einen Mandanten und einen Benutzer anlegen sowie dem Benutzer den Zugriff auf diesen Mandanten gewähren.',
1054
  'In order to use kivitendo you have to create at least a client, a user and a group.' => 'Um kivitendo zu nutzen, müssen Sie mindestens einen Mandanten, einen Benutzer und eine Gruppe anlegen.',
1059 1055
  'In the latter case the tables needed by kivitendo will be created in that database.' => 'In letzterem Fall werden die von kivitendo benötigten Tabellen in dieser existierenden Datenbank angelegt.',
1060 1056
  'In version 2.4.0 the administrator has to enter a list of units in the administrative section.' => 'Vor Version 2.4.0 musste der Benutzer die Konten bei jeder Ware und jeder Dienstleistung einzeln ausw&auml;hlen.',
1061 1057
  'In-line'                     => 'im Text',
......
1337 1333
  'No dunnings have been selected for printing.' => 'Es wurden keine Mahnungen zum Drucken ausgew&auml;hlt.',
1338 1334
  'No entries were found which had no unit assigned to them.' => 'Es wurden keine Eintr&auml;ge gefunden, denen keine Einheit zugeordnet war.',
1339 1335
  'No file has been uploaded yet.' => 'Es wurde noch keine Datei hochgeladen.',
1340
  'No group has been selected, or the group does not exist anymore.' => 'Es wurde keine Gruppe ausgew&auml;hlt, oder die Gruppe wurde in der Zwischenzeit gel&ouml;scht.',
1341
  'No groups have been added yet.' => 'Es wurden noch keine Gruppen angelegt.',
1342 1336
  'No groups have been created yet.' => 'Es wurden noch keine Gruppen angelegt.',
1343 1337
  'No or an unknown authenticantion module specified in "config/kivitendo.conf".' => 'Es wurde kein oder ein unbekanntes Authentifizierungsmodul in "config/kivitendo.conf" angegeben.',
1344 1338
  'No part was found matching the search parameters.' => 'Es wurde kein Artikel gefunden, auf den die Suchparameter zutreffen.',
......
1510 1504
  'Please enter the currency you are working with.' => 'Bitte geben Sie die Währung an, mit der Sie arbeiten.',
1511 1505
  'Please enter the login for the new user.' => 'Bitte geben Sie das Login für den neuen Benutzer ein.',
1512 1506
  'Please enter the name for the new client.' => 'Bitte geben Sie einen Namen für den neuen Mandanten ein.',
1507
  'Please enter the name for the new group.' => 'Bitte geben Sie den Namen für die neue Gruppe ein.',
1513 1508
  'Please enter the name of the database that will be used as the template for the new database:' => 'Bitte geben Sie den Namen der Datenbank an, die als Vorlage f&uuml;r die neue Datenbank benutzt wird:',
1514 1509
  'Please enter the name of the dataset you want to restore the backup in.' => 'Bitte geben Sie den Namen der Datenbank ein, in der Sie die Sicherung wiederherstellen wollen.',
1515 1510
  'Please enter the sales tax identification number.' => 'Bitte geben Sie die Umsatzsteueridentifikationsnummer an.',
......
1671 1666
  'Remove draft when posting'   => 'Entwurf beim Buchen l&ouml;schen',
1672 1667
  'Removed spoolfiles!'         => 'Druckdateien entfernt!',
1673 1668
  'Removing marked entries from queue ...' => 'Markierte Einträge werden von der Warteschlange entfernt ...',
1674
  'Rename the group'            => 'Gruppe umbenennen',
1675 1669
  'Replace the orphaned currencies by other not orphaned currencies. To do so, please delete the currency in the textfields above and replace it by another currency. You could loose or change unintentionally exchangerates. Go on very carefully since you could destroy transactions.' => 'Ersetze die Währungen durch andere gültige Währungen. Wenn Sie sich hierfür entscheiden, ersetzen Sie bitte alle Währungen, die oben angegeben sind, durch Währungen, die in Ihrem System ordnungsgemäß eingetragen sind. Alle eingetragenen Wechselkurse für die verwaiste Währung werden dabei gelöscht. Bitte gehen Sie sehr vorsichtig vor, denn die betroffenen Buchungen können unter Umständen kaputt gehen.',
1676 1670
  'Report Positions'            => 'Berichte',
1677 1671
  'Report about warehouse contents' => 'Lagerbestand anzeigen',
......
1768 1762
  'Search term'                 => 'Suchbegriff',
1769 1763
  'Searchable'                  => 'Durchsuchbar',
1770 1764
  'Secondary sorting'           => 'Untersortierung',
1765
  'Section "#1"'                => 'Abschnitt "#1"',
1771 1766
  'Select'                      => 'auswählen',
1772 1767
  'Select a Customer'           => 'Endkunde auswählen',
1773 1768
  'Select a customer'           => 'Einen Kunden ausw&auml;hlen',
......
1783 1778
  'Select postscript or PDF!'   => 'Postscript oder PDF auswählen!',
1784 1779
  'Select tax office...'        => 'Finanzamt auswählen...',
1785 1780
  'Select the chart of accounts in use' => 'Benutzten Kontenrahmen ausw&auml;hlen',
1786
  'Select the checkboxes that match users to the groups they should belong to.' => 'W&auml;hlen Sie diejenigen Checkboxen aus, die die Benutzer zu den gew&uuml;schten Gruppen zuordnen.',
1787 1781
  'Select type of removal'      => 'Grund der Entnahme ausw&auml;hlen',
1788 1782
  'Select type of transfer'     => 'Grund der Umlagerung ausw&auml;hlen',
1789 1783
  'Selected'                    => 'Ausgewählt',
......
2029 2023
  'The column "make_X" can contain either a vendor\'s database ID, a vendor number or a vendor\'s name.' => 'Die Spalte "make_X" can entweder die Datenbank-ID des Lieferanten, eine Lieferantennummer oder einen Lieferantennamen enthalten.',
2030 2024
  'The column triplets can occur multiple times with different numbers "X" each time (e.g. "make_1", "model_1", "lastcost_1", "make_2", "model_2", "lastcost_2", "make_3", "model_3", "lastcost_3" etc).' => 'Die Spalten-Dreiergruppen können mehrfach auftreten, sofern sie unterschiedliche Nummern "X" verwenden (z.B. "make_1", "model_1", "lastcost_1", "make_2", "model_2", "lastcost_2", "make_3", "model_3", "lastcost_3" etc).',
2031 2025
  'The columns &quot;Dunning Duedate&quot;, &quot;Total Fees&quot; and &quot;Interest&quot; show data for the previous dunning created for this invoice.' => 'Die Spalten &quot;Zahlbar bis&quot;, &quot;Kumulierte Geb&uuml;hren&quot; und &quot;Zinsen&quot; zeigen Daten der letzten f&uuml;r diese Rechnung erzeugten Mahnung.',
2032
  'The combination of database host, port and name is not unique.' => '',
2026
  'The combination of database host, port and name is not unique.' => 'Die Kombination aus Datenbankhost, -port und -name ist nicht eindeutig.',
2033 2027
  'The connection to the LDAP server cannot be encrypted (SSL/TLS startup failure). Please check config/kivitendo.conf.' => '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/kivitendo.conf.',
2034 2028
  'The connection to the authentication database failed:' => 'Die Verbindung zur Authentifizierungsdatenbank schlug fehl:',
2035 2029
  'The connection to the configured client database "#1" on host "#2:#3" failed.' => 'Die Verbindung zur konfigurierten Datenbank "#1" auf Host "#2:#3" schlug fehl.',
......
2089 2083
  'The following transactions are concerned:' => 'Die folgenden Buchungen sind betroffen:',
2090 2084
  'The following units are unknown.' => 'Die folgenden Einheiten sind unbekannt.',
2091 2085
  'The following units exist already:' => 'Die folgenden Einheiten existieren bereits:',
2086
  'The following users are a member of this group' => 'Die folgenden Benutzer sind Mitglieder dieser Gruppe',
2092 2087
  'The following users will have access to this client' => 'Die folgenden Benutzer werden auf diesen Mandanten Zugriff haben',
2093 2088
  'The following warnings occured during an upgrade to the document templates:' => 'Die folgenden Warnungen traten w&auml;hrend einer Aktualisierung der Dokumentenvorlagen auf:',
2094 2089
  'The formula needs the following syntax:<br>For regular article:<br>Variablename= Variable Unit;<br>Variablename2= Variable2 Unit2;<br>...<br>###<br>Variable + ( Variable2 / Variable )<br><b>Please be beware of the spaces in the formula</b><br>' => 'Die Formeln m&uuml;ssen in der folgenden Syntax eingegeben werden:<br>Bei normalen Artikeln:<br>Variablenname = Variable Einheit;<br>Variablenname2 = Variable2 Einheit2;<br>...<br>###<br>Variable + Variable2 * ( Variable - Variable2 )<br>Variablennamen und Einheiten dürfen nur aus alphanumerischen Zeichen bestehen.<br>Es muss jeweils die Gesamte Zeile eingegeben werden',
2095 2090
  'The greetings have been saved.' => 'Die Anreden wurden gespeichert',
2096
  'The group has been added.'   => 'Die Gruppe wurde erfasst.',
2097
  'The group has been deleted.' => 'Die Gruppe wurde gel&ouml;scht.',
2098
  'The group has been saved.'   => 'Die Gruppe wurde gespeichert.',
2099
  'The group memberships have been saved.' => 'Die Gruppenmitgliedschaften wurden gespeichert.',
2100
  'The group name is missing.'  => 'Der Gruppenname fehlt.',
2101 2091
  'The items are imported accoring do their number "X" regardless of the column order inside the file.' => 'Die Einträge werden in der Reihenfolge ihrer Indizes "X" unabhängig von der Spaltenreihenfolge in der Datei importiert.',
2102 2092
  'The link target to add has been created from the existing record.' => 'Das auszuwählende Verknüpfungsziel wurde aus dem bestehenden Beleg erstellt.',
2103 2093
  'The list has been printed.'  => 'Die Liste wurde ausgedruckt.',
......
2170 2160
  'The units have been saved.'  => 'Die Einheiten wurden gespeichert.',
2171 2161
  'The user can chose which client to connect to during login.' => 'Bei der Anmeldung kann der Benutzer auswählen, welchen Mandanten er benutzen möchte.',
2172 2162
  'The user could not be deleted.' => 'Der Benutzer konnte nicht gelöscht werden.',
2163
  'The user group could not be deleted.' => 'Die Benutzergurppe konnte nicht gelöscht werden.',
2164
  'The user group has been created.' => 'Die Benutzergruppe wurde erstellt.',
2165
  'The user group has been deleted.' => 'Die Benutzergruppe wurde gelöscht.',
2166
  'The user group has been saved.' => 'Die Benutzergruppe wurde gespeichert.',
2173 2167
  'The user has been created.'  => 'Der Benutzer wurde angelegt.',
2174 2168
  'The user has been deleted.'  => 'Der Benutzer wurde gelöscht.',
2175 2169
  'The user has been saved.'    => 'Der Benutzer wurde gespeichert.',
......
2218 2212
  'This could have happened for two reasons:' => 'Dies kann aus zwei Gründen geschehen sein:',
2219 2213
  'This customer number is already in use.' => 'Diese Kundennummer wird bereits verwendet.',
2220 2214
  'This feature especially prevents mistakes by mixing up prior tax and sales tax.' => 'Dieses Feature vermeidet insbesondere Verwechslungen von Umsatz- und Vorsteuer.',
2215
  'This group is valid for the following clients' => 'Diese Gruppe ist für die folgenden Mandanten gültig',
2221 2216
  'This has been changed in this version, therefore please change the "old" bins to some real warehouse bins.' => 'Das wurde in dieser Version umgestellt, bitte ändern Sie die Freitext-Lagerplätze auf vorhandene Lagerplätze.',
2222 2217
  'This has been changed in this version.' => 'Ab dieser Version ist dies nicht mehr so.',
2223 2218
  'This installation uses an unknown chart of accounts (&quot;#1&quot;). This database upgrade cannot create standard buchungsgruppen automatically.' => 'Diese Installation benutzt einen unbekannten Kontenrahmen (&quot;#1&quot;). Dieses Datenbankupgrade kann die Standardbuchungsgruppen nicht automatisch anlegen.',
......
2351 2346
  'User login'                  => 'Benutzeranmeldung',
2352 2347
  'User name'                   => 'Benutzername',
2353 2348
  'Username'                    => 'Benutzername',
2354
  'Users in this group'         => 'BenutzerInnen in dieser Gruppe',
2349
  'Users that are a member in this group' => 'Gruppenmitglieder',
2355 2350
  'Users that have access to this client' => 'Benutzer mit Zugriff auf diesen Mandaten',
2356 2351
  'Users with access'           => 'Benutzer mit Zugriff',
2357 2352
  'Users with access to this client' => 'Benutzer mit Zugriff auf diesen Mandanten',
templates/webpages/admin/delete_group_confirm.html
1
[%- USE T8 %]
2
[%- USE HTML %]
3
  <h1>[% 'Delete group' | $T8 %]: [% name %]</h1>
4
  <p class="message_hint">[ [% name %] ] - [% 'Do you really want to delete this group?' | $T8 %]</p>
5

  
6
   <form name="Form" method="post" action="admin.pl">
7
    <a href="admin.pl?action=edit_groups">[% 'Back' | $T8 %]</a>
8

  
9
    <input type="hidden" name="group_id" value="[% HTML.escape(id) %]">
10
    <input type="hidden" name="confirmed" value="1">
11
    <input type="hidden" name="delete_nextsub" value="delete_group">
12
    <input type="submit" class="submit" name="action" value="[% 'Delete' | $T8 %]">
13
   </form>
templates/webpages/admin/edit_group.html
1
[% USE T8 %][% USE HTML %][% USE L %][% USE LxERP -%]
2
 [% L.javascript_tag('jquery.selectboxes', 'jquery.multiselect2side') %]
1
[%- USE HTML %]
2
[%- USE L %][%- USE LxERP -%]
3 3

  
4
<h1>[% 'Edit group ' | $T8 %]:  [% HTML.escape(name) %]</h1>
4
[%- INCLUDE 'common/flash.html' %]
5 5

  
6
 <form name="Form" method="post" action="admin.pl">
7
  [% IF message %]
8
  <p class="message_ok">[% message %]</p>
9
  [% END %]
6
<h1>[% HTML.escape(title) %]</h1>
10 7

  
11
  <p><a href="admin.pl?action=edit_groups">[% 'Back' | $T8 %]</a></p>
8
<p>[% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]</p>
12 9

  
13
   <hr>
10
<form method="post" action="controller.pl" id="form">
11
 [% L.hidden_tag("group.id", SELF.group.id) %]
12
 [% L.hidden_tag("action", "") %]
14 13

  
15
  <h3 class="listheading">[%- LxERP.t8('Edit membership') %]</h3>
14
 <h2>[%- LxERP.t8("Settings") %]</h2>
15

  
16
 <table>
17
  <tr>
18
   <th align="right">[% LxERP.t8('Name') %]</th>
19
   <td>[% L.input_tag("group.name", SELF.group.name) %]</td>
20
  </tr>
21

  
22
  <tr>
23
   <th align="right">[% LxERP.t8('Description') %]</th>
24
   <td>[% L.input_tag("group.description", SELF.group.description) %]</td>
25
  </tr>
26
 </table>
27

  
28
 <h2>[% LxERP.t8("Access rights") %]</h2>
29

  
30
 [% SET granted_rights = SELF.group.rights_map %]
31

  
32
 [%- FOREACH section = SELF.all_rights %]
33
  [% SET section_number = loop.count %]
34
  [% SET num_checked = 0 %]
35
  [% FOREACH right = section.rights %][% SET name = right.name %][% IF granted_rights.$name %][% SET num_checked = num_checked + 1 %][% END %][% END %]
36
  <h3>[% L.checkbox_tag('dummy' _ section_number, label=LxERP.t8('Section "#1"', section.description), checkall='[data-checkallgroup=' _ section_number _ ']', checked=(num_checked == section.rights.size)) %]</h3>
16 37

  
17 38
  <div class="clearfix">
18
   [% L.select_tag('user_ids[]', ALL_USERS, id='user_ids', value_key = 'id', title_key = 'login', default = USER_IDS_IN_GROUP, multiple = 1) %]
39
   [% FOREACH right = section.rights %]
40
    [% SET name = right.name %]
41
    [% L.checkbox_tag("group.rights_map." _ name, label=right.description, checked=granted_rights.$name, 'data-checkallgroup'=section_number) %]
42
    <br>
43
   [%- END %]
19 44
  </div>
45
 [%- END %]
46

  
47
 <h2>[%- LxERP.t8("Group membership") %]</h2>
48

  
49
[% IF SELF.all_users.size %]
50
 <p>
51
  [%- LxERP.t8("The following users are a member of this group") %]:
52
 </p>
53

  
54
 <div class="clearfix">
55
  [% L.select_tag("group.users[]", SELF.all_users, id="group_users", title_key="login", default=SELF.group.users, default_key='id', multiple=1) %]
56
  [% L.multiselect2side("group_users", labelsx => LxERP.t8("All users"), labeldx => LxERP.t8("Users that are a member in this group")) %]
57
 </div>
58

  
59
[%- ELSE %]
60
 <p>
61
  [% LxERP.t8("No users have been created yet.") %]
62
 </p>
63
[%- END %]
64

  
65
 <h2>[%- LxERP.t8("Group assignment") %]</h2>
66

  
67
[% IF SELF.all_clients.size %]
68
 <p>
69
  [%- LxERP.t8("This group is valid for the following clients") %]:
70
 </p>
71

  
72
 <div class="clearfix">
73
  [% L.select_tag("group.clients[]", SELF.all_clients, id="group_clients", title_key="name", default=SELF.group.clients, default_key='id', multiple=1) %]
74
  [% L.multiselect2side("group_clients", labelsx => LxERP.t8("All clients"), labeldx => LxERP.t8("Clients this Group is valid for")) %]
75
 </div>
76

  
77
[%- ELSE %]
78
 <p>
79
  [% LxERP.t8("No clients have been created yet.") %]
80
 </p>
81
[%- END %]
82

  
83
<hr size="3" noshade>
84

  
85
<p>
86
 [% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]
87

  
88
 [% L.button_tag("submit_with_action('save_group')", LxERP.t8("Save")) %]
89
 [% IF SELF.group.id %]
90
  [% L.button_tag("save_as_new()", LxERP.t8("Save as new")) %]
91
  [% L.button_tag("submit_with_action('delete_group')", LxERP.t8("Delete"), confirm=LxERP.t8("Are you sure?")) %]
92
 [%- END %]
93
</p>
94

  
95
</form>
96

  
97
<script type="text/javascript">
98
 <!--
99
  function submit_with_action(action) {
100
    $("#action").val("Admin/" + action);
101
    $("#form").submit();
102
  }
103

  
104
  function save_as_new() {
105
    var new_group_name = prompt("[% LxERP.t8("Please enter the name for the new group.") %]", "");
106
    if (!new_group_name)
107
      return;
20 108

  
21
  <h3 class="listheading">[% 'Edit rights' | $T8 %]</h3>
22

  
23
  <p>
24
   [% FOREACH right = RIGHTS %]
25
    [% IF right.is_section %]
26
     <i>[% right.description %]</i><br>
27
    [% ELSE %]
28
     <input type="checkbox" name="[% HTML.escape(right.right) %]_granted" id="[% HTML.escape(right.right) %]_granted" [% IF right.granted %]checked[% END %]>
29
     <label for="[% HTML.escape(right.right) %]_granted">[% IF right.description %][% right.description %][% ELSE %]<i>[% HTML.escape(right.right) %]</i>[% END %]</label>
30
     <br>
31
    [% END %]
32
   [% END %]
33
  </p>
34

  
35
  <h3 class="listheading">[% LxERP.t8('Rename the group') %]</h3>
36

  
37
  <table>
38
   <tr>
39
    <td>[% 'Name' | $T8 %]:</td>
40
    <td><input name="name" maxlength="50" value="[% HTML.escape(name) %]"></td>
41
   </tr>
42

  
43
   <tr>
44
    <td>[% 'Description' | $T8 %]:</td>
45
    <td><input name="description" value="[% HTML.escape(description) %]"></td>
46
   </tr>
47
  </table>
48

  
49
  <p>
50
   <input type="hidden" name="group_id" value="[% HTML.escape(group_id) %]">
51
   <input type="hidden" name="action" value="save_group">
52
   <input type="submit" class="submit" value="[% 'Save' | $T8 %]">
53
   &nbsp;
54
   <a href="admin.pl?action=edit_groups">[% 'Back' | $T8 %]</a>
55
  </p>
56
 </form>
57

  
58
 [% L.multiselect2side('user_ids', labelsx => LxERP.t8('All users'), labeldx => LxERP.t8('Users in this group')) %]
109
    $("#group_name").val(new_group_name);
110
    $("#group_id").val("");
111
    submit_with_action("save_group");
112
  }
113
   -->
114
</script>
templates/webpages/admin/edit_group_membership.html
1
[%- USE T8 %]
2
[%- USE HTML %][%- USE LxERP %]
3

  
4
 <h1>[% 'Edit group membership' | $T8 %]</h1>
5

  
6
 <p><a href="admin.pl?action=edit_groups">[% 'Back' | $T8 %]</a></p>
7
 <p>[% 'Select the checkboxes that match users to the groups they should belong to.' | $T8 %]</p>
8

  
9
 <form action="admin.pl">
10

  
11
  <p>
12
   <table border="0">
13
    [% FOREACH user = USERS %]
14

  
15
    [% IF user.repeat_headings %]
16
    <tr>
17
     <th class="listheading" valign="bottom">[% 'Login Name' | $T8 %]</th>
18
     <th class="listheading" valign="bottom">[% 'Name' | $T8 %]</th>
19
     [% FOREACH column = HEADINGS %]<th class="listheading" valign="bottom" align="center">[% LxERP.turn90(column.title) %]</th>
20
     [% END %]
21
    </tr>
22
    [% END %]
23

  
24
    <tr class="listrow[% loop.count % 2 %]">
25
     <td valign="center">[% HTML.escape(user.login) %]</td>
26
     <td valign="center">[% HTML.escape(user.name) %]</td>
27
     [% FOREACH group = user.GROUPS %]
28
     <td valign="center" align="center">
29
      <input type="checkbox" name="u_[% HTML.escape(user.id) %]_g_[% HTML.escape(group.id) %]" [% IF group.is_member %]checked[% END %]>
30
     </td>
31
     [% END %]
32
    </tr>
33
    [% END %]
34
   </table>
35
  </p>
36

  
37
  <input type="hidden" name="save_nextsub" value="save_group_membership">
38
  <input type="hidden" name="back_nextsub" value="edit_groups">
39

  
40
  <p>
41
   <input type="submit" class="submit" name="action" value="[% 'Save' | $T8 %]">
42
  </p>
43

  
44
 </form>
templates/webpages/admin/edit_groups.html
1
[%- USE T8 %]
2
[%- USE HTML %]
3

  
4
  <h1>[% 'Edit groups' | $T8 %]</h1>
5
  [% IF message %]
6
  <p class="message_ok">[% message %]</p>
7
  [% END %]
8

  
9
  <p><a href="admin.pl?action=login">[% 'Back' | $T8 %]</a></p>
10

  
11
 <h2>[% 'Add a new group' | $T8 %]</h2>
12

  
13
 <form method="post" action="admin.pl">
14
 <br>
15
  <table border="0">
16
   <tr><td>[% 'Name' | $T8 %] </td><td><input name="name" maxlength="50"></td></tr>
17
   <tr><td>[% 'Description' | $T8 %] </td><td><input name="description"></td></tr>
18
  </table>
19
   <input type="hidden" name="add_nextsub" value="add_group">
20
   <p><input type="submit" class="submit" name="action" value="[% 'Add' | $T8 %]"></p>
21
 </form>
22

  
23
 <h2>[% 'Edit and delete a group' | $T8 %]</h2>
24

  
25
 <form name="Form" method="post" action="admin.pl">
26
  [% IF num_groups %]
27
  <p>
28
   <select name="group_id" size="10">
29
    [% FOREACH row = GROUPS %]
30
    <option value="[% HTML.escape(row.id) %]"[% ' selected' IF loop.first %]>[% HTML.escape(row.name) %][% IF row.description %] ([% HTML.escape(row.description) %])[% END %]</option>
31
    [% END %]
32
   </select>
33
  </p>
34
  [% ELSE %]
35
  <p>[% 'No groups have been added yet.' | $T8 %]</p>
36
  [% END %]
37

  
38
  <p>
39
   [% IF num_groups %]
40
   <input type="hidden" name="edit_nextsub" value="edit_group">
41
   <input type="hidden" name="delete_nextsub" value="delete_group">
42
   <input type="submit" class="submit" name="action" value="[% 'Edit' | $T8 %]">
43
   <input type="submit" class="submit" name="action" value="[% 'Delete' | $T8 %]">
44
   [% END %]
45
  </p>
46
 </form>
47

  
48
 <h2>[% 'Group membership' | $T8 %]</h2>
49

  
50
 <p>[% 'Edit the membership of all users in all groups:' | $T8 %]</p>
51

  
52
 <form method="post" action="admin.pl">
53
  <p>
54
   <input type="hidden" name="edit_nextsub" value="edit_group_membership">
55
   <input type="submit" class="submit" name="action" value="[% 'Edit' | $T8 %]">
56
  </p>
57

  
58
 </form>
59

  
60
 <hr size="2" noshade>
templates/webpages/admin/edit_user.html
3 3

  
4 4
[%- INCLUDE 'common/flash.html' %]
5 5

  
6
<h1>[% title %]</h1>
6
<h1>[% HTML.escape(title) %]</h1>
7 7

  
8 8
<p>[% L.link(SELF.url_for(action="show"), LxERP.t8("Back")) %]</p>
9 9

  
templates/webpages/admin/show.html
11 11
 <span class="link_separator">|</span>
12 12
 [% L.link(SELF.url_for(action="new_client"), LxERP.t8("Add Client")) %]
13 13
 <span class="link_separator">|</span>
14
 [% L.link(SELF.url_for(action="edit_groups"), LxERP.t8("Edit groups")) %]
14
 [% L.link(SELF.url_for(action="new_group"), LxERP.t8("Add User Group")) %]
15 15
 <span class="link_separator">|</span>
16 16
 [% L.link(SELF.url_for(action="pg_database_administration", controller="admin.pl"), LxERP.t8("Pg Database Administration")) %]
17 17
 <span class="link_separator">|</span>
18 18
 [% L.link(SELF.url_for(action="printer_management", controller="admin.pl"), LxERP.t8("Printer Management")) %]
19 19
 <span class="link_separator">|</span>
20
 [% IF LOCKED %]
20
 [% IF SELF.is_locked %]
21 21
  [% L.link(SELF.url_for(action="unlock_system"), LxERP.t8("Unlock System")) %]
22 22
 [% ELSE %]
23 23
  [% L.link(SELF.url_for(action="lock_system"), LxERP.t8("Lock System")) %]
......
34 34
 <ul>
35 35
  <li><a href="#user_list">[%- LxERP.t8("User list") %]</a></li>
36 36
  <li><a href="#client_list">[%- LxERP.t8("Client list") %]</a></li>
37
  <li><a href="#group_list">[%- LxERP.t8("Group list") %]</a></li>
37 38
 </ul>
38 39

  
39 40
 <div id="user_list">
40
[%- IF !USERS.size %]
41
[%- IF !SELF.all_users.size %]
41 42
  <p>
42 43
   [% LxERP.t8("No users have been created yet.") %]
43
   [% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %]
44
   [% LxERP.t8("In order to use kivitendo you have to create at least a client, a user and a group.") %]
44 45
  </p>
45 46

  
46 47
[%- ELSE %]
......
51 52
    <th>[% LxERP.t8('Language') %]</th>
52 53
   </tr>
53 54

  
54
[% FOREACH user = USERS %]
55
[% FOREACH user = SELF.all_users %]
55 56
[%- SET config = user.config_values %]
56 57
   <tr class="listrow">
57 58
    <td>[% L.link(SELF.url_for(action="edit_user", id=user.id), HTML.escape(user.login)) %]</td>
......
64 65
 </div>
65 66

  
66 67
 <div id="client_list">
67
[%- IF !CLIENTS.size %]
68
[%- IF !SELF.all_clients.size %]
68 69
  <p>
69 70
   [% LxERP.t8("No clients have been created yet.") %]
70
   [% LxERP.t8("In order to use kivitendo you have to create at least one client, one user, and grant that user access to the client.") %]
71
   [% LxERP.t8("In order to use kivitendo you have to create at least a client, a user and a group.") %]
71 72
  </p>
72 73

  
73 74
[%- ELSE %]
......
81 82
    <th>[% LxERP.t8('Default client') %]</th>
82 83
   </tr>
83 84

  
84
[%- FOREACH client = CLIENTS %]
85
[%- FOREACH client = SELF.all_clients %]
85 86
   <tr class="listrow">
86 87
    <td>[% L.link(SELF.url_for(action="edit_client", id=client.id), HTML.escape(client.name)) %]</td>
87 88
    <td>[% HTML.escape(client.id) %]</td>
......
92 93
   </tr>
93 94
[%- END %]
94 95
  </table>
96
[%- END %]
97
 </div>
98

  
99
 <div id="group_list">
100
[%- IF !SELF.all_groups.size %]
101
  <p>
102
   [% LxERP.t8("No groups have been created yet.") %]
103
   [% LxERP.t8("In order to use kivitendo you have to create at least a client, a user and a group.") %]
104
  </p>
105

  
106
[%- ELSE %]
107
  <table width="100%">
108
   <tr class="listheading">
109
    <th>[% LxERP.t8('Name') %]</th>
110
    <th>[% LxERP.t8('Description') %]</th>
111
   </tr>
112

  
113
[%- FOREACH group = SELF.all_groups %]
114
   <tr class="listrow">
115
    <td>[% L.link(SELF.url_for(action="edit_group", id=group.id), HTML.escape(group.name)) %]</td>
116
    <td>[% HTML.escape(group.description) %]</td>
117
   </tr>
118
[%- END %]
119
  </table>
95 120
[%- END %]
96 121
 </div>
97 122
</div>

Auch abrufbar als: Unified diff