Optik in den Einkaufs- und Verkaufsformularen etwas verbessert:
[kivitendo-erp.git] / bin / mozilla / admin.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: Dieter Simader
12 #   Email: dsimader@sql-ledger.org
13 #     Web: http://www.sql-ledger.org
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 # setup module
31 # add/edit/delete users
32 #
33 #======================================================================
34
35 $menufile = "menu.ini";
36
37 use DBI;
38 use CGI;
39
40 use SL::Form;
41 use SL::User;
42 use SL::Common;
43
44 require "bin/mozilla/common.pl";
45
46 our $cgi = new CGI('');
47
48 $form = new Form;
49 $form->{"root"} = "root login";
50
51 $locale = new Locale $language, "admin";
52
53 # customization
54 if (-f "bin/mozilla/custom_$form->{script}") {
55   eval { require "bin/mozilla/custom_$form->{script}"; };
56   $form->error($@) if ($@);
57 }
58
59 $form->{stylesheet} = "lx-office-erp.css";
60 $form->{favicon}    = "favicon.ico";
61
62 if ($form->{action}) {
63
64
65   $subroutine = $locale->findsub($form->{action});
66
67   if ($subroutine eq 'login') {
68     if ($form->{rpw}) {
69       $form->{rpw} = crypt $form->{rpw}, "ro";
70     }
71   }
72
73   &check_password;
74
75   call_sub($subroutine);
76
77 } else {
78
79   # if there are no drivers bail out
80   $form->error($locale->text('No Database Drivers available!'))
81     unless (User->dbdrivers);
82
83   # create memberfile
84   if (!-f $memberfile) {
85     open(FH, ">$memberfile") or $form->error("$memberfile : $!");
86     print FH qq|# SQL-Ledger Accounting members
87
88 [root login]
89 password=
90
91 |;
92     close FH;
93   }
94
95   &adminlogin;
96
97 }
98
99 1;
100
101 # end
102
103 sub adminlogin {
104
105   $form->{title} =
106     qq|Lx-Office ERP $form->{version} | . $locale->text('Administration');
107
108   $form->header;
109
110   print qq|
111 <body class=admin>
112
113
114 <div align=center>
115
116 <a href="http://www.lx-office.org"><img src="image/lx-office-erp.png" border=0></a>
117 <h1 class=login>|
118     . $locale->text('Version')
119     . qq| $form->{version}<p>|
120     . $locale->text('Administration')
121     . qq|</h1>
122
123 <form method=post action="$form->{script}">
124
125 <table>
126   <tr>
127     <th>| . $locale->text('Password') . qq|</th>
128     <td><input type=password name=rpw></td>
129     <td><input type=submit class=submit name=action value="|
130     . $locale->text('Login') . qq|"></td>
131   </tr>
132 <input type=hidden name=action value=login>
133 </table>
134
135
136 </form>
137
138 <a href=http://www.lx-office.org>Lx-Office |
139     . $locale->text('website') . qq|</a>
140
141 </div>
142
143 </body>
144 </html>
145 |;
146
147 }
148
149 sub login {
150
151   &list_users;
152
153 }
154
155 sub add_user {
156
157   $form->{title} =
158       "Lx-Office ERP "
159     . $locale->text('Administration') . " / "
160     . $locale->text('Add User');
161
162   $form->{Oracle_sid}    = $sid;
163   $form->{Oracle_dbport} = '1521';
164   $form->{Oracle_dbhost} = `hostname`;
165
166   if (-f "css/lx-office-erp.css") {
167     $myconfig->{stylesheet} = "lx-office-erp.css";
168   }
169   $myconfig->{vclimit} = 200;
170
171   $myconfig->{"countrycode"} = "de";
172   $myconfig->{"numberformat"} = "1000,00";
173   $myconfig->{"dateformat"} = "dd.mm.yy";
174
175   &form_header;
176   &form_footer;
177
178 }
179
180 sub edit {
181
182   $form->{title} =
183       "Lx-Office ERP "
184     . $locale->text('Administration') . " / "
185     . $locale->text('Edit User');
186   $form->{edit} = 1;
187
188   &form_header;
189   &form_footer;
190
191 }
192
193 sub form_footer {
194
195   if ($form->{edit}) {
196     $delete =
197       qq|<input type=submit class=submit name=action value="|
198       . $locale->text('Delete') . qq|">
199 <input type=hidden name=edit value=1>|;
200   }
201
202   print qq|
203
204 <input name=callback type=hidden value="$form->{script}?action=list_users&rpw=$form->{rpw}">
205 <input type=hidden name=rpw value=$form->{rpw}>
206
207 <input type=submit class=submit name=action value="|
208     . $locale->text('Save') . qq|">
209 $delete
210
211 </form>
212
213 </body>
214 </html>
215 |;
216
217 }
218
219 sub list_users {
220
221   $form->error($locale->text('File locked!')) if (-f "${memberfile}.LCK");
222
223   open(FH, "$memberfile") or $form->error("$memberfile : $!");
224
225   $nologin = qq|
226 <input type=submit class=submit name=action value="|
227     . $locale->text('Lock System') . qq|">|;
228
229   if (-e "$userspath/nologin") {
230     $nologin = qq|
231 <input type=submit class=submit name=action value="|
232       . $locale->text('Unlock System') . qq|">|;
233   }
234
235   while (<FH>) {
236     chop;
237
238     if (/^\[.*\]/) {
239       $login = $_;
240       $login =~ s/(\[|\])//g;
241     }
242
243     if (/^(name=|company=|templates=|dbuser=|dbdriver=|dbname=|dbhost=)/) {
244       chop($var = $&);
245       ($null, $member{$login}{$var}) = split(/=/, $_, 2);
246     }
247   }
248
249   close(FH);
250
251   # type=submit $locale->text('Pg Database Administration')
252   # type=submit $locale->text('Oracle Database Administration')
253
254   foreach $item (User->dbdrivers) {
255     $dbdrivers .=
256       qq|<input name=action type=submit class=submit value="|
257       . $locale->text("$item Database Administration") . qq|">|;
258   }
259
260   $column_header{login}     = qq|<th>| . $locale->text('Login') . qq|</th>|;
261   $column_header{name}      = qq|<th>| . $locale->text('Name') . qq|</th>|;
262   $column_header{company}   = qq|<th>| . $locale->text('Company') . qq|</th>|;
263   $column_header{dbdriver}  = qq|<th>| . $locale->text('Driver') . qq|</th>|;
264   $column_header{dbhost}    = qq|<th>| . $locale->text('Host') . qq|</th>|;
265   $column_header{dataset}   = qq|<th>| . $locale->text('Dataset') . qq|</th>|;
266   $column_header{templates} =
267     qq|<th>| . $locale->text('Templates') . qq|</th>|;
268
269   @column_index = qw(login name company dbdriver dbhost dataset templates);
270
271   $form->{title} = "Lx-Office ERP " . $locale->text('Administration');
272
273   $form->header;
274
275   print qq|
276 <body class=admin>
277
278 <form method=post action=$form->{script}>
279
280 <table width=100%>
281   <tr>
282   <tr class=listheading>
283     <th>$form->{title}</th>
284   </tr>
285   <tr size=5></tr>
286   <tr>
287     <td>
288       <table width=100%>
289         <tr class=listheading>|;
290
291   map { print "$column_header{$_}\n" } @column_index;
292
293   print qq|
294         </tr>
295 |;
296
297   foreach $key (sort keys %member) {
298     $href =
299       "$script?action=edit&login=$key&rpw=$form->{rpw}";
300     $href =~ s/ /%20/g;
301
302     $member{$key}{templates} =~ s/^$templates\///;
303     $member{$key}{dbhost} = $locale->text('localhost')
304       unless $member{$key}{dbhost};
305     $member{$key}{dbname} = $member{$key}{dbuser}
306       if ($member{$key}{dbdriver} eq 'Oracle');
307
308     $column_data{login}     = qq|<td><a id="$key" href="$href">$key</a></td>|;
309     $column_data{name}      = qq|<td>$member{$key}{name}</td>|;
310     $column_data{company}   = qq|<td>$member{$key}{company}</td>|;
311     $column_data{dbdriver}  = qq|<td>$member{$key}{dbdriver}</td>|;
312     $column_data{dbhost}    = qq|<td>$member{$key}{dbhost}</td>|;
313     $column_data{dataset}   = qq|<td>$member{$key}{dbname}</td>|;
314     $column_data{templates} = qq|<td>$member{$key}{templates}</td>|;
315
316     $i++;
317     $i %= 2;
318     print qq|
319         <tr class="listrow$i">|;
320
321     map { print "$column_data{$_}\n" } @column_index;
322
323     print qq|
324         </tr>|;
325   }
326
327   print qq|
328       </table>
329     </td>
330   </tr>
331   <tr>
332     <td><hr size=3 noshade></td>
333   </tr>
334 </table>
335
336 <input type=hidden name=rpw value=$form->{rpw}>
337
338 <br><input type=submit class=submit name=action value="|
339     . $locale->text('Add User') . qq|">
340 <input type=submit class=submit name=action value="|
341     . $locale->text('Change Admin Password') . qq|">
342
343 $dbdrivers
344 $nologin
345
346 </form>
347
348 | . $locale->text('Click on login name to edit!') . qq|
349 <br>
350 |
351     . $locale->text(
352     'To add a user to a group edit a name, change the login name and save.  A new user with the same variables will then be saved under the new login name.'
353     )
354     . qq|
355
356 <p>
357
358 <form method=post action=login.pl>
359
360 <table border=0 width=100%>
361   <tr class=listheading>
362     <th>Lx-Office ERP | . $locale->text('Login') . qq|</th>
363   </tr>
364   <tr>
365     <td>
366       <table>
367         <tr>
368           <th align=right>| . $locale->text('Name') . qq|</th>
369           <td><input class=login name=login></td>
370           <td>&nbsp;</td>
371         </tr>
372         <tr>
373           <th align=right>| . $locale->text('Password') . qq|</th>
374           <td><input class=login type=password name=password></td>
375           <td><input type=submit name=action value="|
376     . $locale->text('Login') . qq|"></td>
377         </tr>
378       </table>
379     </td>
380   </tr>
381 </table>
382
383 </form>
384
385 <hr size=3 noshade>
386
387 </body>
388 </html>
389 |;
390
391 }
392
393 sub form_header {
394
395   # if there is a login, get user
396   if ($form->{login}) {
397
398     # get user
399     $myconfig = new User "$memberfile", "$form->{login}";
400
401     $myconfig->{signature} =~ s/\\n/\r\n/g;
402     $myconfig->{address}   =~ s/\\n/\r\n/g;
403
404     # strip basedir from templates directory
405     $myconfig->{templates} =~ s/^$templates\///;
406
407     # $myconfig->{dbpasswd} = unpack 'u', $myconfig->{dbpasswd};
408   }
409
410   foreach $item (qw(mm-dd-yy mm/dd/yy dd-mm-yy dd/mm/yy dd.mm.yy yyyy-mm-dd)) {
411     $dateformat .=
412       ($item eq $myconfig->{dateformat})
413       ? "<option selected>$item\n"
414       : "<option>$item\n";
415   }
416
417   foreach $item (qw(1,000.00 1000.00 1.000,00 1000,00)) {
418     $numberformat .=
419       ($item eq $myconfig->{numberformat})
420       ? "<option selected>$item\n"
421       : "<option>$item\n";
422   }
423
424   %countrycodes = User->country_codes;
425   $countrycodes = "";
426   foreach $key (sort { $countrycodes{$a} cmp $countrycodes{$b} }
427                 keys %countrycodes
428     ) {
429     $countrycodes .=
430       ($myconfig->{countrycode} eq $key)
431       ? "<option selected value=$key>$countrycodes{$key}"
432       : "<option value=$key>$countrycodes{$key}";
433   }
434   $countrycodes = qq|<option value="">American English\n$countrycodes|;
435
436   # is there a templates basedir
437   if (!-d "$templates") {
438     $form->error(  $locale->text('Directory')
439                  . ": $templates "
440                  . $locale->text('does not exist'));
441   }
442
443   opendir TEMPLATEDIR, "$templates/." or $form->error("$templates : $!");
444   my @all = readdir(TEMPLATEDIR);
445   my @alldir = sort(grep({ -d "$templates/$_" && !/^\.\.?$/ } @all));
446   my @allhtml = sort(grep({ -f "$templates/$_" && /\.html$/ } @all));
447   closedir TEMPLATEDIR;
448
449   @alldir = grep !/\.(html|tex|sty|odt|xml|txb)$/, @alldir;
450   @alldir = grep !/^(webpages|\.svn)$/, @alldir;
451
452   @allhtml = reverse grep !/Default/, @allhtml;
453   push @allhtml, 'Default';
454   @allhtml = reverse @allhtml;
455
456   foreach $item (@alldir) {
457     if ($item eq $myconfig->{templates}) {
458       $usetemplates .= qq|<option selected>$item\n|;
459     } else {
460       $usetemplates .= qq|<option>$item\n|;
461     }
462   }
463
464   $lastitem = $allhtml[0];
465   $lastitem =~ s/-.*//g;
466   $mastertemplates = qq|<option>$lastitem\n|;
467   foreach $item (@allhtml) {
468     $item =~ s/-.*//g;
469
470     if ($item ne $lastitem) {
471       my $selected = $item eq "German" ? " selected" : "";
472       $mastertemplates .= qq|<option$selected>$item\n|;
473       $lastitem = $item;
474     }
475   }
476
477 #  opendir CSS, "css/.";
478 #  @all = grep /.*\.css$/, readdir CSS;
479 #  closedir CSS;
480
481 # css dir has styles that are not intended as general layouts.
482 # reverting to hardcoded list
483   @all = qw(lx-office-erp.css Win2000.css);
484
485   foreach $item (@all) {
486     if ($item eq $myconfig->{stylesheet}) {
487       $selectstylesheet .= qq|<option selected>$item\n|;
488     } else {
489       $selectstylesheet .= qq|<option>$item\n|;
490     }
491   }
492
493   $form->header;
494
495   if ($myconfig->{menustyle} eq "v3") {
496     $menustyle_v3 = "checked";
497   } elsif ($myconfig->{menustyle} eq "neu") {
498     $menustyle_neu = "checked";
499   } else {
500     $menustyle_old = "checked";
501   }
502
503   print qq|
504 <body class=admin>
505
506 <form method=post action=$form->{script}>
507
508 <table width=100%>
509   <tr class=listheading><th colspan=2>$form->{title}</th></tr>
510   <tr size=5></tr>
511   <tr valign=top>
512     <td>
513       <table>
514         <tr>
515           <th align=right>| . $locale->text('Login') . qq|</th>
516           <td><input name="login" value="$myconfig->{login}"></td>
517         </tr>
518         <tr>
519           <th align=right>| . $locale->text('Password') . qq|</th>
520           <td><input type="password" name="password" size="8" value="$myconfig->{password}"></td>
521           <input type="hidden" name="old_password" value="$myconfig->{password}">
522         </tr>
523         <tr>
524           <th align=right>| . $locale->text('Name') . qq|</th>
525           <td><input name="name" size="15" value="$myconfig->{name}"></td>
526         </tr>
527         <tr>
528           <th align=right>| . $locale->text('E-mail') . qq|</th>
529           <td><input name=email size=30 value="$myconfig->{email}"></td>
530         </tr>
531         <tr valign=top>
532           <th align=right>| . $locale->text('Signature') . qq|</th>
533           <td><textarea name=signature rows=3 cols=35>$myconfig->{signature}</textarea></td>
534         </tr>
535         <tr>
536           <th align=right>| . $locale->text('Phone') . qq|</th>
537           <td><input name=tel size=14 value="$myconfig->{tel}"></td>
538         </tr>
539         <tr>
540           <th align=right>| . $locale->text('Fax') . qq|</th>
541           <td><input name=fax size=14 value="$myconfig->{fax}"></td>
542         </tr>
543         <tr>
544           <th align=right>| . $locale->text('Company') . qq|</th>
545           <td><input name=company size=35 value="$myconfig->{company}"></td>
546         </tr>
547         <tr valign=top>
548           <th align=right>| . $locale->text('Address') . qq|</th>
549           <td><textarea name=address rows=4 cols=35>$myconfig->{address}</textarea></td>
550         </tr>
551         <tr valign=top>
552           <th align=right>| . $locale->text('Tax number') . qq|</th>
553           <td><input name=taxnumber size=14 value="$myconfig->{taxnumber}"></td>
554         </tr>
555         <tr valign=top>
556           <th align=right>| . $locale->text('Ust-IDNr') . qq|</th>
557           <td><input name=co_ustid size=14 value="$myconfig->{co_ustid}"></td>
558         </tr>
559         <tr valign=top>
560           <th align=right>| . $locale->text('DUNS-Nr') . qq|</th>
561           <td><input name=duns size=14 value="$myconfig->{duns}"></td>
562         </tr>
563       </table>
564     </td>
565     <td>
566       <table>
567         <tr>
568           <th align=right>| . $locale->text('Date Format') . qq|</th>
569           <td><select name=dateformat>$dateformat</select></td>
570         </tr>
571         <tr>
572           <th align=right>| . $locale->text('Number Format') . qq|</th>
573           <td><select name=numberformat>$numberformat</select></td>
574         </tr>
575         <tr>
576           <th align=right>| . $locale->text('Dropdown Limit') . qq|</th>
577           <td><input name=vclimit value="$myconfig->{vclimit}"></td>
578         </tr>
579         <tr>
580           <th align=right>| . $locale->text('Language') . qq|</th>
581           <td><select name=countrycode>$countrycodes</select></td>
582         </tr>
583         <tr>
584           <th align=right>| . $locale->text('Stylesheet') . qq|</th>
585           <td><select name=userstylesheet>$selectstylesheet</select></td>
586         </tr>
587         <tr>
588           <th align=right>| . $locale->text('Printer') . qq|</th>
589           <td><input name=printer size=20 value="$myconfig->{printer}"></td>
590         </tr>
591         <tr>
592           <th align=right>| . $locale->text('Use Templates') . qq|</th>
593           <td><select name=usetemplates>$usetemplates</select></td>
594         </tr>
595         <tr>
596           <th align=right>| . $locale->text('New Templates') . qq|</th>
597           <td><input name=newtemplates></td>
598         </tr>
599         <tr>
600           <th align=right>| . $locale->text('Setup Templates') . qq|</th>
601           <td><select name=mastertemplates>$mastertemplates</select></td>
602         </tr>
603        <tr>
604            <th align=right>| . $locale->text('Setup Menu') . qq|</th>
605            <td><input name=menustyle type=radio class=radio value=v3 $menustyle_v3>&nbsp;| .
606            $locale->text("Top (CSS)") . qq|
607            <input name=menustyle type=radio class=radio value=neu $menustyle_neu>&nbsp;| .
608            $locale->text("Top (Javascript)") . qq|
609            <input name=menustyle type=radio class=radio value=old $menustyle_old>&nbsp;| .
610            $locale->text("Old (on the side)") . qq|
611            </td>
612          </tr>
613         <input type=hidden name=templates value=$myconfig->{templates}>
614       </table>
615     </td>
616   </tr>
617   <tr class=listheading>
618     <th colspan=2>| . $locale->text('Database') . qq|</th>
619   </tr>|;
620
621   # list section for database drivers
622   foreach $item (User->dbdrivers) {
623
624     print qq|
625   <tr>
626     <td colspan=2>
627       <table>
628         <tr>|;
629
630     $checked = "";
631     if ($myconfig->{dbdriver} eq $item) {
632       map { $form->{"${item}_$_"} = $myconfig->{$_} }
633         qw(dbhost dbport dbuser dbpasswd dbname sid);
634       $checked = "checked";
635     }
636
637     print qq|
638           <th align=right>| . $locale->text('Driver') . qq|</th>
639           <td><input name="dbdriver" type="radio" class="radio" value="$item" $checked>&nbsp;$item</td>
640           <th align=right>| . $locale->text('Host') . qq|</th>
641           <td><input name="${item}_dbhost" size=30 value="$form->{"${item}_dbhost"}"></td>
642         </tr>
643         <tr>|;
644
645     if ($item eq 'Pg') {
646     
647       print qq|
648           <th align=right>| . $locale->text('Dataset') . qq|</th>
649           <td><input name="Pg_dbname" size="15" value="$form->{Pg_dbname}"></td>
650           <th align=right>| . $locale->text('Port') . qq|</th>
651           <td><input name="Pg_dbport" size="4" value="$form->{Pg_dbport}"></td>
652         </tr>
653         <tr>
654           <th align=right>| . $locale->text('User') . qq|</th>
655           <td><input name="${item}_dbuser" size=15 value="$form->{"${item}_dbuser"}"></td>
656           <th align=right>| . $locale->text('Password') . qq|</th>
657           <td><input name="${item}_dbpasswd" type=password size=10 value="$form->{"${item}_dbpasswd"}"></td>
658         </tr>|;
659
660     }
661
662     if ($item eq 'Oracle') {
663       print qq|
664           <th align=right>SID</th>
665           <td><input name=Oracle_sid value=$form->{Oracle_sid}></td>
666           <th align=right>| . $locale->text('Port') . qq|</th>
667           <td><input name=Oracle_dbport size=4 value=$form->{Oracle_dbport}></td>
668         </tr>
669         <tr>
670           <th align=right>| . $locale->text('Dataset') . qq|</th>
671           <td><input name="${item}_dbuser" size=15 value=$form->{"${item}_dbuser"}></td>
672           <th align=right>| . $locale->text('Password') . qq|</th>
673           <td><input name="${item}_dbpasswd" type=password size=10 value="$form->{"${item}_dbpasswd"}"></td>
674
675         </tr>|;
676     }
677
678     print qq|
679         <input type="hidden" name="old_dbpasswd" value="$myconfig->{dbpasswd}">
680       </table>
681     </td>
682   </tr>
683   <tr>
684     <td colspan=2><hr size=2 noshade></td>
685   </tr>
686 |;
687
688   }
689
690   # access control
691   open(FH, $menufile) or $form->error("$menufile : $!");
692
693   # scan for first menu level
694   @a = <FH>;
695   close(FH);
696
697   foreach $item (@a) {
698     next unless $item =~ /\[/;
699     next if $item =~ /\#/;
700
701     $item =~ s/(\[|\])//g;
702     chop $item;
703
704     if ($item =~ /--/) {
705       ($level, $menuitem) = split /--/, $item, 2;
706     } else {
707       $level    = $item;
708       $menuitem = $item;
709       push @acsorder, $item;
710     }
711
712     push @{ $acs{$level} }, $menuitem;
713
714   }
715
716   %role = ('admin'      => $locale->text('Administrator'),
717            'user'       => $locale->text('User'),
718            'manager'    => $locale->text('Manager'),
719            'supervisor' => $locale->text('Supervisor'));
720
721   $selectrole = "";
722   foreach $item (qw(user supervisor manager admin)) {
723     $selectrole .=
724       ($myconfig->{role} eq $item)
725       ? "<option selected value=$item>$role{$item}\n"
726       : "<option value=$item>$role{$item}\n";
727   }
728
729   print qq|
730   <tr class=listheading>
731     <th colspan=2>| . $locale->text('Access Control') . qq|</th>
732   </tr>
733   <tr>
734     <td><select name=role>$selectrole</select></td>
735   </tr>
736 |;
737
738   foreach $item (split(/;/, $myconfig->{acs})) {
739     ($key, $value) = split /--/, $item, 2;
740     $excl{$key}{$value} = 1;
741   }
742
743   foreach $key (@acsorder) {
744
745     $checked = "checked";
746     if ($form->{login}) {
747       $checked = ($excl{$key}{$key}) ? "" : "checked";
748     }
749
750     # can't have variable names with spaces
751     # the 1 is for apache 2
752     $item = $form->escape("${key}--$key", 1);
753
754     $acsheading = $key;
755     $acsheading =~ s/ /&nbsp;/g;
756
757     $acsheading = qq|
758     <th align=left><input name="$item" class=checkbox type=checkbox value=1 $checked>&nbsp;$acsheading</th>\n|;
759     $menuitems .= "$item;";
760     $acsdata = "
761     <td>";
762
763     foreach $item (@{ $acs{$key} }) {
764       next if ($key eq $item);
765
766       $checked = "checked";
767       if ($form->{login}) {
768         $checked = ($excl{$key}{$item}) ? "" : "checked";
769       }
770
771       $acsitem = $form->escape("${key}--$item", 1);
772
773       $acsdata .= qq|
774     <br><input name="$acsitem" class=checkbox type=checkbox value=1 $checked>&nbsp;$item|;
775       $menuitems .= "$acsitem;";
776     }
777
778     $acsdata .= "
779     </td>";
780
781     print qq|
782   <tr valign=top>$acsheading $acsdata
783   </tr>
784 |;
785   }
786
787   print qq|<input type=hidden name=acs value="$menuitems">
788 |;
789   if ($webdav) {
790     @webdavdirs =
791       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
792     foreach $directory (@webdavdirs) {
793       if ($myconfig->{$directory}) {
794         $webdav{"${directory}c"} = "checked";
795       } else {
796         $webdav{"${directory}c"} = "";
797       }
798     }
799     print qq|
800    <tr>
801     <td colspan=2><hr size=3 noshade></td>
802   </tr>
803   <tr class=listheading>
804     <th colspan=2>| . $locale->text('WEBDAV-Zugriff') . qq|</th>
805   </tr>
806   <table width=100%>
807         <tr>
808         <td><input name=angebote class=checkbox type=checkbox value=1 $webdav{angebotec}>&nbsp;Angebot</td>
809         <td><input name=bestellungen class=checkbox type=checkbox value=1 $webdav{bestellungenc}>&nbsp;Bestellung</td>
810         <td><input name=rechnungen class=checkbox type=checkbox value=1 $webdav{rechnungenc}>&nbsp;Rechnung</td>
811         </tr>
812         <tr>
813         <td><input name=anfragen class=checkbox type=checkbox value=1 $webdav{anfragenc}>&nbsp;Angebot</td>
814         <td><input name=lieferantenbestellungen class=checkbox type=checkbox value=1 $webdav{lieferantenbestellungenc}>&nbsp;Lieferantenbestellung</td>
815         <td><input name=einkaufsrechnungen class=checkbox type=checkbox value=1 $webdav{einkaufsrechnungenc}>&nbsp;Einkaufsrechnung</td>
816         </tr>
817   </table>
818   <tr>
819     <td colspan=2><hr size=3 noshade></td>
820   </tr>
821 |;
822   }
823   print qq|
824 </table>
825 </div>
826 |;
827
828 }
829
830 sub save {
831
832   # no driver checked
833   $form->error($locale->text('Database Driver not checked!'))
834     unless $form->{dbdriver};
835
836   # no spaces allowed in login name
837   ($form->{login}) = split / /, $form->{login};
838
839   $form->isblank("login", $locale->text('Login name missing!'));
840
841   # check for duplicates
842   if (!$form->{edit}) {
843     $temp = new User "$memberfile", "$form->{login}";
844
845     if ($temp->{login}) {
846       $form->error("$form->{login} " . $locale->text('is already a member!'));
847     }
848   }
849
850   # no spaces allowed in directories
851   ($form->{newtemplates}) = split / /, $form->{newtemplates};
852
853   if ($form->{newtemplates}) {
854     $form->{templates} = $form->{newtemplates};
855   } else {
856     $form->{templates} =
857       ($form->{usetemplates}) ? $form->{usetemplates} : $form->{login};
858   }
859
860   # is there a basedir
861   if (!-d "$templates") {
862     $form->error(  $locale->text('Directory')
863                  . ": $templates "
864                  . $locale->text('does not exist'));
865   }
866
867   # add base directory to $form->{templates}
868   $form->{templates} = "$templates/$form->{templates}";
869
870   $myconfig = new User "$memberfile", "$form->{login}";
871
872   # redo acs variable and delete all the acs codes
873   @acs = split(/;/, $form->{acs});
874
875   $form->{acs} = "";
876   foreach $item (@acs) {
877     $item = $form->escape($item, 1);
878
879     if (!$form->{$item}) {
880       $form->{acs} .= $form->unescape($form->unescape($item)) . ";";
881     }
882     delete $form->{$item};
883   }
884
885   # check which database was filled in
886   if ($form->{dbdriver} eq 'Oracle') {
887     $form->{sid}      = $form->{Oracle_sid},;
888     $form->{dbhost}   = $form->{Oracle_dbhost},;
889     $form->{dbport}   = $form->{Oracle_dbport};
890     $form->{dbpasswd} = $form->{Oracle_dbpasswd};
891     $form->{dbuser}   = $form->{Oracle_dbuser};
892     $form->{dbname}   = $form->{Oracle_dbuser};
893
894     $form->isblank("dbhost", $locale->text('Hostname missing!'));
895     $form->isblank("dbport", $locale->text('Port missing!'));
896     $form->isblank("dbuser", $locale->text('Dataset missing!'));
897   }
898   if ($form->{dbdriver} eq 'Pg') {
899     $form->{dbhost}   = $form->{Pg_dbhost};
900     $form->{dbport}   = $form->{Pg_dbport};
901     $form->{dbpasswd} = $form->{Pg_dbpasswd};
902     $form->{dbuser}   = $form->{Pg_dbuser};
903     $form->{dbname}   = $form->{Pg_dbname};
904
905     $form->isblank("dbname", $locale->text('Dataset missing!'));
906     $form->isblank("dbuser", $locale->text('Database User missing!'));
907   }
908
909   if ($webdav) {
910     @webdavdirs =
911       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
912     foreach $directory (@webdavdirs) {
913       if ($form->{$directory}) {
914         $form->{$directory} = $form->{$directory};
915       } else {
916         $form->{$directory} = 0;
917       }
918     }
919   }
920
921   foreach $item (keys %{$form}) {
922     $myconfig->{$item} = $form->{$item};
923   }
924
925   delete $myconfig->{stylesheet};
926   if ($form->{userstylesheet}) {
927     $myconfig->{stylesheet} = $form->{userstylesheet};
928   }
929
930   $myconfig->save_member($memberfile, $userspath);
931
932   if ($webdav) {
933     @webdavdirs =
934       qw(angebote bestellungen rechnungen anfragen lieferantenbestellungen einkaufsrechnungen);
935     foreach $directory (@webdavdirs) {
936       $file = "webdav/" . $directory . "/webdav-user";
937       if ($form->{$directory}) {
938         if (open(HTACCESS, "$file")) {
939           while (<HTACCESS>) {
940             ($login, $password) = split(/:/, $_);
941             if ($login ne $form->{login}) {
942               $newfile .= $_;
943             }
944           }
945           close(HTACCESS);
946         }
947         open(HTACCESS, "> $file") or die "cannot open $file $!\n";
948         $newfile .= $myconfig->{login} . ":" . $myconfig->{password} . "\n";
949         print(HTACCESS $newfile);
950         close(HTACCESS);
951       } else {
952         $form->{$directory} = 0;
953         if (open(HTACCESS, "$file")) {
954           while (<HTACCESS>) {
955             ($login, $password) = split(/:/, $_);
956             if ($login ne $form->{login}) {
957               $newfile .= $_;
958             }
959           }
960           close(HTACCESS);
961         }
962         open(HTACCESS, "> $file") or die "cannot open $file $!\n";
963         print(HTACCESS $newfile);
964         close(HTACCESS);
965       }
966     }
967   }
968
969   $form->{templates}       =~ s|.*/||;
970   $form->{mastertemplates} =~ s|.*/||;
971
972   # create user template directory and copy master files
973   if (!-d "$form->{templates}") {
974     umask(002);
975
976     if (mkdir "$form->{templates}", oct("771")) {
977
978       umask(007);
979
980       # copy templates to the directory
981       opendir TEMPLATEDIR, "$templates/." or $form - error("$templates : $!");
982       @templates = grep /$form->{mastertemplates}.*?\.(html|tex|sty|xml|txb)$/,
983         readdir TEMPLATEDIR;
984       closedir TEMPLATEDIR;
985
986       foreach $file (@templates) {
987         open(TEMP, "$templates/$file")
988           or $form->error("$templates/$file : $!");
989
990         $file =~ s/$form->{mastertemplates}-//;
991         open(NEW, ">$form->{templates}/$file")
992           or $form->error("$form->{templates}/$file : $!");
993
994         while ($line = <TEMP>) {
995           print NEW $line;
996         }
997         close(TEMP);
998         close(NEW);
999       }
1000     } else {
1001       $form->error("$!: $form->{templates}");
1002     }
1003   }
1004
1005   $form->redirect($locale->text('User saved!'));
1006
1007 }
1008
1009 sub delete {
1010
1011   $form->{templates} =
1012     ($form->{templates})
1013     ? "$templates/$form->{templates}"
1014     : "$templates/$form->{login}";
1015
1016   $form->error($locale->text('File locked!')) if (-f ${memberfile} . LCK);
1017   open(FH, ">${memberfile}.LCK") or $form->error("${memberfile}.LCK : $!");
1018   close(FH);
1019
1020   open(CONF, "+<$memberfile") or $form->error("$memberfile : $!");
1021
1022   @config = <CONF>;
1023
1024   seek(CONF, 0, 0);
1025   truncate(CONF, 0);
1026
1027   while ($line = shift @config) {
1028
1029     if ($line =~ /^\[/) {
1030       last if ($line =~ /\[$form->{login}\]/);
1031       $login = &login_name($line);
1032     }
1033
1034     if ($line =~ /^templates=/) {
1035       $user{$login} = &get_value($line);
1036     }
1037
1038     print CONF $line;
1039   }
1040
1041   # remove everything up to next login or EOF
1042   # and save template variable
1043   while ($line = shift @config) {
1044     if ($line =~ /^templates=/) {
1045       $templatedir = &get_value($line);
1046     }
1047     last if ($line =~ /^\[/);
1048   }
1049
1050   # this one is either the next login or EOF
1051   print CONF $line;
1052
1053   $login = &login_name($line);
1054
1055   while ($line = shift @config) {
1056     if ($line =~ /^\[/) {
1057       $login = &login_name($line);
1058     }
1059
1060     if ($line =~ /^templates=/) {
1061       $user{$login} = &get_value($line);
1062     }
1063
1064     print CONF $line;
1065   }
1066
1067   close(CONF);
1068   unlink "${memberfile}.LCK";
1069
1070   # scan %user for $templatedir
1071   foreach $login (keys %user) {
1072     last if ($found = ($templatedir eq $user{$login}));
1073   }
1074
1075   # if found keep directory otherwise delete
1076   if (!$found) {
1077
1078     # delete it if there is a template directory
1079     $dir = "$form->{templates}";
1080     if (-d "$dir") {
1081       unlink <$dir/*.html>;
1082       unlink <$dir/*.tex>;
1083       unlink <$dir/*.sty>;
1084       rmdir "$dir";
1085     }
1086   }
1087
1088   # delete config file for user
1089   unlink "$userspath/$form->{login}.conf";
1090
1091   $form->redirect($locale->text('User deleted!'));
1092
1093 }
1094
1095 sub login_name {
1096   my $login = shift;
1097
1098   $login =~ s/\[\]//g;
1099   return ($login) ? $login : undef;
1100
1101 }
1102
1103 sub get_value {
1104   my $line = shift;
1105
1106   my ($null, $value) = split(/=/, $line, 2);
1107
1108   # remove comments
1109   $value =~ s/\s#.*//g;
1110
1111   # remove any trailing whitespace
1112   $value =~ s/^\s*(.*?)\s*$/$1/;
1113
1114   $value;
1115 }
1116
1117 sub change_admin_password {
1118
1119   $form->{title} =
1120       qq|Lx-Office ERP |
1121     . $locale->text('Administration') . " / "
1122     . $locale->text('Change Admin Password');
1123
1124   $form->header;
1125
1126   print qq|
1127 <body class=admin>
1128
1129
1130 <h2>| . $locale->text('Change Admin Password') . qq|</h2>
1131
1132 <form method=post action=$form->{script}>
1133
1134 <table>
1135   <tr>
1136     <td><b>| . $locale->text('Password') . qq|</b></td>
1137     <td><input type=password name=password size=8></td>
1138   </tr>
1139   <tr>
1140     <td><b>| . $locale->text('Repeat the password') . qq|</b></td>
1141     <td><input type=password name=password_again size=8></b></td>
1142   </tr>
1143 </table>
1144
1145 <input type=hidden name=rpw value=$form->{rpw}>
1146
1147 <p>
1148 <input type=submit class=submit name=action value="|
1149     . $locale->text('Change Password') . qq|">
1150
1151 </form>
1152
1153 </body>
1154 </html>
1155 |;
1156
1157 }
1158
1159 sub change_password {
1160   if ($form->{"password"} ne $form->{"password_again"}) {
1161     $form->{title} =
1162       qq|Lx-Office ERP |
1163       . $locale->text('Administration') . " / "
1164       . $locale->text('Change Admin Password');
1165
1166     $form->header;
1167
1168     print qq|
1169 <body class=admin>
1170
1171
1172 <h2>| . $locale->text('Change Admin Password') . qq|</h2>
1173
1174 <p>| . $locale->text("The passwords do not match.") . qq|<br>
1175 <input type="button" onclick="history.back()" value="| . $locale->text("Back") . qq|">|;
1176     return;
1177   }
1178
1179   $root->{password} = $form->{password};
1180
1181   $root->{'root login'} = 1;
1182   $root->save_member($memberfile);
1183
1184   $form->{callback} =
1185     "$form->{script}?action=list_users&rpw=$root->{password}";
1186
1187   $form->redirect($locale->text('Password changed!'));
1188
1189 }
1190
1191 sub check_password {
1192   $root = new User "$memberfile", $form->{root};
1193
1194   if (!defined($root->{password}) || ($root->{password} ne $form->{rpw})) {
1195     $form->error($locale->text('Incorrect Password!'));
1196   }
1197
1198 }
1199
1200 sub pg_database_administration {
1201
1202   $form->{dbdriver} = 'Pg';
1203   &dbselect_source;
1204
1205 }
1206
1207 sub oracle_database_administration {
1208
1209   $form->{dbdriver} = 'Oracle';
1210   &dbselect_source;
1211
1212 }
1213
1214 sub dbdriver_defaults {
1215
1216   # load some defaults for the selected driver
1217   %driverdefaults = (
1218                      'Pg' => { dbport        => '5432',
1219                                dbuser        => 'postgres',
1220                                dbdefault     => 'template1',
1221                                dbhost        => 'localhost',
1222                                connectstring => $locale->text('Connect to')
1223                      },
1224                      'Oracle' => { dbport        => '1521',
1225                                    dbuser        => 'oralin',
1226                                    dbdefault     => $sid,
1227                                    dbhost        => `hostname`,
1228                                    connectstring => 'SID'
1229                      });
1230
1231   map { $form->{$_} = $driverdefaults{ $form->{dbdriver} }{$_} }
1232     keys %{ $driverdefaults{Pg} };
1233
1234 }
1235
1236 sub dbselect_source {
1237
1238   &dbdriver_defaults;
1239
1240   $msg{Pg} =
1241     $locale->text(
1242     'Leave host and port field empty unless you want to make a remote connection.'
1243     );
1244   $msg{Oracle} =
1245     $locale->text(
1246            'You must enter a host and port for local and remote connections!');
1247
1248   $form->{title} =
1249     "Lx-Office ERP / " . $locale->text('Database Administration');
1250
1251   $form->header;
1252
1253   print qq|
1254 <body class=admin>
1255
1256
1257 <center>
1258 <h2>$form->{title}</h2>
1259
1260 <form method=post action=$form->{script}>
1261
1262 <table>
1263 <tr><td>
1264
1265 <table>
1266
1267   <tr class=listheading>
1268     <th colspan=4>| . $locale->text('Database') . qq|</th>
1269   </tr>
1270
1271 <input type=hidden name=dbdriver value=$form->{dbdriver}>
1272
1273   <tr><td>
1274    <table>
1275
1276   <tr>
1277
1278     <th align=right>| . $locale->text('Host') . qq|</th>
1279     <td><input name=dbhost size=25 value=$form->{dbhost}></td>
1280     <th align=right>| . $locale->text('Port') . qq|</th>
1281     <td><input name=dbport size=5 value=$form->{dbport}></td>
1282
1283   </tr>
1284
1285   <tr>
1286
1287     <th align=right>| . $locale->text('User') . qq|</th>
1288     <td><input name="dbuser" size="10" value="$form->{dbuser}"></td>
1289     <th align=right>| . $locale->text('Password') . qq|</th>
1290     <td><input type="password" name="dbpasswd" size="10"></td>
1291
1292   </tr>
1293
1294   <tr>
1295
1296     <th align=right>$form->{connectstring}</th>
1297     <td colspan=3><input name=dbdefault size=10 value=$form->{dbdefault}></td>
1298
1299   </tr>
1300
1301 </table>
1302
1303 </td></tr>
1304 </table>
1305
1306 <input name=callback type=hidden value="$form->{script}?action=list_users&rpw=$form->{rpw}">
1307 <input type=hidden name=rpw value=$form->{rpw}>
1308
1309 <br>
1310
1311 <input type=submit class=submit name=action value="|
1312     . $locale->text('Create Dataset') . qq|">|;
1313 # Vorübergehend Deaktiviert
1314 # <input type=submit class=submit name=action value="|
1315 #     . $locale->text('Update Dataset') . qq|">
1316 print qq| <input type=submit class=submit name=action value="|
1317     . $locale->text('Delete Dataset') . qq|">
1318
1319 </form>
1320
1321 </td></tr>
1322 </table>
1323
1324 <p>|
1325     . $locale->text(
1326     'This is a preliminary check for existing sources. Nothing will be created or deleted at this stage!'
1327     )
1328
1329     . qq|
1330 <br>$msg{$form->{dbdriver}}
1331
1332
1333 </body>
1334 </html>
1335 |;
1336
1337 }
1338
1339 sub continue {
1340   call_sub($form->{"nextsub"});
1341 }
1342
1343 sub update_dataset {
1344
1345   %needsupdate = User->dbneedsupdate(\%$form);
1346
1347   $form->{title} =
1348       "Lx-Office ERP "
1349     . $locale->text('Database Administration') . " / "
1350     . $locale->text('Update Dataset');
1351
1352   $form->header;
1353
1354   print qq|
1355 <body class=admin>
1356
1357
1358 <center>
1359 <h2>$form->{title}</h2>
1360 |;
1361   my $field_id = 0;
1362   foreach $key (sort keys %needsupdate) {
1363     if ($needsupdate{$key} ne $form->{dbversion}) {
1364       $upd .= qq|<input id="$field_id" name="db$key" type="checkbox" value="1" checked> $key\n|;
1365       $form->{dbupdate} .= "db$key ";
1366       $field_id++;
1367     }
1368   }
1369
1370   chop $form->{dbupdate};
1371
1372   if ($form->{dbupdate}) {
1373
1374     print qq|
1375 <table width=100%>
1376 <form method=post action=$form->{script}>
1377
1378 <input type=hidden name="dbdriver"  value="$form->{dbdriver}">
1379 <input type=hidden name="dbhost"    value="$form->{dbhost}">
1380 <input type=hidden name="dbport"    value="$form->{dbport}">
1381 <input type=hidden name="dbuser"    value="$form->{dbuser}">
1382 <input type=hidden name="dbpasswd"  value="$form->{dbpasswd}">
1383 <input type=hidden name="dbdefault" value="$form->{dbdefault}">
1384
1385 <tr class=listheading>
1386   <th>| . $locale->text('The following Datasets need to be updated') . qq|</th>
1387 </tr>
1388 <tr>
1389 <td>
1390
1391 $upd
1392
1393 </td>
1394 </tr>
1395 <tr>
1396 <td>
1397
1398 <input name=dbupdate type=hidden value="$form->{dbupdate}">
1399
1400 <input name=callback type=hidden value="$form->{script}?action=list_users&rpw=$form->{rpw}">
1401
1402 <input type=hidden name=rpw value=$form->{rpw}>
1403
1404 <input type=hidden name=nextsub value=dbupdate>
1405
1406 <hr size=3 noshade>
1407
1408 <br>
1409 <input type=submit class=submit name=action value="|
1410       . $locale->text('Continue') . qq|">
1411
1412 </td></tr>
1413 </table>
1414 </form>
1415 |;
1416
1417   } else {
1418
1419     print $locale->text('All Datasets up to date!');
1420
1421   }
1422
1423   print qq|
1424
1425 </body>
1426 </html>
1427 |;
1428
1429 }
1430
1431 sub dbupdate {
1432   $form->{"stylesheet"} = "lx-office-erp.css";
1433   $form->{"title"} = $main::locale->text("Dataset upgrade");
1434   $form->header();
1435   my $dbname =
1436     join(" ",
1437          map({ s/\s//g; s/^db//; $_; }
1438              grep({ $form->{$_} }
1439                   split(/\s+/, $form->{"dbupdate"}))));
1440   print($form->parse_html_template("dbupgrade/header",
1441                                    { "dbname" => $dbname }));
1442
1443   User->dbupdate(\%$form);
1444
1445   print qq|
1446 <hr>
1447
1448 | . $locale->text('Dataset updated!') . qq|
1449
1450 <br>
1451
1452 <a id="enddatasetupdate" href="admin.pl?action=login&| .
1453 join("&", map({ "$_=" . $form->escape($form->{$_}); } qw(rpw))) .
1454 qq|">| . $locale->text("Continue") . qq|</a>|;
1455
1456 }
1457
1458 sub create_dataset {
1459
1460   foreach $item (sort User->dbsources(\%$form)) {
1461     $dbsources .= "[$item] ";
1462   }
1463
1464   opendir SQLDIR, "sql/." or $form - error($!);
1465   foreach $item (sort grep /-chart\.sql\z/, readdir SQLDIR) {
1466     next if ($item eq 'Default-chart.sql');
1467     $item =~ s/-chart\.sql//;
1468     push @charts,
1469       qq| <input name=chart class=radio type=radio value="$item">&nbsp;$item|;
1470   }
1471   closedir SQLDIR;
1472
1473   my (@values, %labels);
1474
1475   my $default_charset = $dbcharset;
1476   $default_charset ||= Common::DEFAULT_CHARSET;
1477   my $default_encoding;
1478
1479   foreach my $encoding (@Common::db_encodings) {
1480     push @values, $encoding->{dbencoding};
1481     $labels{$encoding->{dbencoding}} = $encoding->{label};
1482
1483     $default_encoding = $encoding->{dbencoding} if $encoding->{charset} eq $default_charset;
1484   }
1485
1486   $selectencoding =
1487     NTI($cgi->popup_menu('-name' => 'encoding',
1488                          '-values' => \@values,
1489                          '-labels' => \%labels,
1490                          '-default' => $default_encoding));
1491
1492   $form->{title} =
1493       "Lx-Office ERP "
1494     . $locale->text('Database Administration') . " / "
1495     . $locale->text('Create Dataset');
1496
1497   $form->header;
1498
1499   print qq|
1500 <body class=admin>
1501
1502
1503 <center>
1504 <h2>$form->{title}</h2>
1505
1506 <form method=post action=$form->{script}>
1507
1508 <table width=100%>
1509   <tr class=listheading>
1510     <th colspan=2>&nbsp;</th>
1511   </tr>
1512
1513   <tr>
1514
1515     <th align=right nowrap>| . $locale->text('Existing Datasets') . qq|</th>
1516     <td>$dbsources</td>
1517
1518   </tr>
1519
1520   <tr>
1521
1522     <th align=right nowrap>| . $locale->text('Create Dataset') . qq|</th>
1523     <td><input name=db></td>
1524
1525   </tr>
1526
1527   <tr>
1528
1529     <th align=right nowrap>| . $locale->text('Multibyte Encoding') . qq|</th>
1530     <td>$selectencoding</td>
1531
1532   </tr>
1533
1534   <tr>
1535
1536     <th align=right nowrap>|
1537     . $locale->text('Create Chart of Accounts') . qq|</th>
1538     <td>@charts</td>
1539
1540   </tr>
1541
1542   <tr><td colspan=2>
1543 <p>
1544 <input type=hidden name="dbdriver"  value="$form->{dbdriver}">
1545 <input type=hidden name="dbuser"    value="$form->{dbuser}">
1546 <input type=hidden name="dbhost"    value="$form->{dbhost}">
1547 <input type=hidden name="dbport"    value="$form->{dbport}">
1548 <input type=hidden name="dbpasswd"  value="$form->{dbpasswd}">
1549 <input type=hidden name="dbdefault" value="$form->{dbdefault}">
1550
1551 <input name=callback type=hidden value="$form->{script}?action=list_users&rpw=$form->{rpw}">
1552
1553 <input type=hidden name=rpw value=$form->{rpw}>
1554
1555 <input type=hidden name=nextsub value=dbcreate>
1556
1557 <hr size=3 noshade>
1558
1559 <br>
1560 <input type=submit class=submit name=action value="|
1561     . $locale->text('Continue') . qq|">
1562
1563   </td></tr>
1564 </table>
1565
1566 </form>
1567
1568
1569 </body>
1570 </html>
1571 |;
1572
1573 }
1574
1575 sub dbcreate {
1576
1577   $form->isblank("db", $locale->text('Dataset missing!'));
1578
1579   User->dbcreate(\%$form);
1580
1581   $form->{title} =
1582       "Lx-Office ERP "
1583     . $locale->text('Database Administration') . " / "
1584     . $locale->text('Create Dataset');
1585
1586   $form->header;
1587
1588   print qq|
1589 <body class=admin>
1590
1591
1592 <center>
1593 <h2>$form->{title}</h2>
1594
1595 <form method=post action=$form->{script}>|
1596
1597     . $locale->text('Dataset')
1598     . " $form->{db} "
1599     . $locale->text('successfully created!')
1600
1601     . qq|
1602
1603 <input type=hidden name=rpw value="$form->{rpw}">
1604
1605 <input type=hidden name=nextsub value=list_users>
1606
1607 <p><input type=submit class=submit name=action value="|
1608     . $locale->text('Continue') . qq|">
1609 </form>
1610
1611
1612 </body>
1613 </html>
1614 |;
1615
1616 }
1617
1618 sub delete_dataset {
1619
1620   if (@dbsources = User->dbsources_unused(\%$form, $memberfile)) {
1621     foreach $item (sort @dbsources) {
1622       $dbsources .=
1623         qq|<input name=db class=radio type=radio value=$item>&nbsp;$item |;
1624     }
1625   } else {
1626     $form->error($locale->text('Nothing to delete!'));
1627   }
1628
1629   $form->{title} =
1630       "Lx-Office ERP "
1631     . $locale->text('Database Administration') . " / "
1632     . $locale->text('Delete Dataset');
1633
1634   $form->header;
1635
1636   print qq|
1637 <body class=admin>
1638
1639 <h2>$form->{title}</h2>
1640
1641 <form method=post action=$form->{script}>
1642
1643 <table width=100%>
1644   <tr class=listheading>
1645     <th>|
1646     . $locale->text('The following Datasets are not in use and can be deleted')
1647     . qq|</th>
1648   </tr>
1649
1650   <tr>
1651     <td>
1652     $dbsources
1653     </td>
1654   </tr>
1655
1656   <tr><td>
1657 <p>
1658 <input type=hidden name="dbdriver"  value="$form->{dbdriver}">
1659 <input type=hidden name="dbuser"    value="$form->{dbuser}">
1660 <input type=hidden name="dbhost"    value="$form->{dbhost}">
1661 <input type=hidden name="dbport"    value="$form->{dbport}">
1662 <input type=hidden name="dbpasswd"  value="$form->{dbpasswd}">
1663 <input type=hidden name="dbdefault" value="$form->{dbdefault}">
1664
1665 <input name=callback type=hidden value="$form->{script}?action=list_users&rpw=$form->{rpw}">
1666
1667 <input type=hidden name=rpw value="$form->{rpw}">
1668
1669 <input type=hidden name=nextsub value=dbdelete>
1670
1671 <hr size=3 noshade>
1672
1673 <br>
1674 <input type=submit class=submit name=action value="|
1675     . $locale->text('Continue') . qq|">
1676
1677   </td></tr>
1678 </table>
1679
1680 </form>
1681
1682 </body>
1683 </html>
1684 |;
1685
1686 }
1687
1688 sub dbdelete {
1689
1690   if (!$form->{db}) {
1691     $form->error($locale->text('No Dataset selected!'));
1692   }
1693
1694   User->dbdelete(\%$form);
1695
1696   $form->{title} =
1697       "Lx-Office ERP "
1698     . $locale->text('Database Administration') . " / "
1699     . $locale->text('Delete Dataset');
1700
1701   $form->header;
1702
1703   print qq|
1704 <body class=admin>
1705
1706
1707 <center>
1708 <h2>$form->{title}</h2>
1709
1710 <form method=post action=$form->{script}>
1711
1712 $form->{db} | . $locale->text('successfully deleted!')
1713
1714     . qq|
1715
1716 <input type=hidden name=rpw value="$form->{rpw}">
1717
1718 <input type=hidden name=nextsub value=list_users>
1719
1720 <p><input type=submit class=submit name=action value="|
1721     . $locale->text('Continue') . qq|">
1722 </form>
1723
1724
1725 </body>
1726 </html>
1727 |;
1728
1729 }
1730
1731 sub unlock_system {
1732
1733   unlink "$userspath/nologin";
1734
1735   $form->{callback} =
1736     "$form->{script}?action=list_users&rpw=$root->{password}";
1737
1738   $form->redirect($locale->text('Lockfile removed!'));
1739
1740 }
1741
1742 sub lock_system {
1743
1744   open(FH, ">$userspath/nologin")
1745     or $form->error($locale->text('Cannot create Lock!'));
1746   close(FH);
1747
1748   $form->{callback} =
1749     "$form->{script}?action=list_users&rpw=$root->{password}";
1750
1751   $form->redirect($locale->text('Lockfile created!'));
1752
1753 }