Merge branch 'master' of vc.linet-services.de:public/lx-office-erp
[kivitendo-erp.git] / 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;