]> git.ipfire.org Git - ipfire-2.x.git/blame - src/squid-accounting/accounting.cgi
ipsec-interfaces: Apply static routes (again) after creating IPsec interfaces
[ipfire-2.x.git] / src / squid-accounting / accounting.cgi
CommitLineData
db8a01e0
AM
1#!/usr/bin/perl
2###############################################################################
3# #
4# IPFire.org - A linux based firewall #
5# Copyright (C) 2014 IPFire Team <alexander.marx@ipfire.org> #
6# #
7# This program is free software: you can redistribute it and/or modify #
8# it under the terms of the GNU General Public License as published by #
9# the Free Software Foundation, either version 3 of the License, or #
10# (at your option) any later version. #
11# #
12# This program is distributed in the hope that it will be useful, #
13# but WITHOUT ANY WARRANTY; without even the implied warranty of #
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15# GNU General Public License for more details. #
16# #
17# You should have received a copy of the GNU General Public License #
18# along with this program. If not, see <http://www.gnu.org/licenses/>. #
19# #
20###############################################################################
21
22
23use Time::Local;
24use File::Find;
25use File::Path;
26use GD::Graph::area;
27use GD::Graph::bars;
28use LWP::UserAgent;
29use POSIX;
30use locale;
31
32# enable only the following on debugging purpose
33#use warnings;
34#use CGI::Carp 'fatalsToBrowser';
35
36require '/var/ipfire/general-functions.pl';
37require "${General::swroot}/lang.pl";
38require "${General::swroot}/header.pl";
39require "${General::swroot}/accounting/acct-lib.pl";
40
41unless (-e "${General::swroot}/accounting/settings.conf") { system("touch ${General::swroot}/accounting/settings.conf"); }
42
43my $settingsfile="${General::swroot}/accounting/settings.conf";
44my $proxyenabled="${General::swroot}/proxy/enable";
45my $logopath="/srv/web/ipfire/html/accounting/logo";
46my %settings=();
47my %mainsettings;
48my %color;
49my %cgiparams=();
50my ($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst)=localtime();
51my $dbh;
52my %checked=();
53my $errormessage='';
54my @ips;
55my $count=0;
56my $col;
57my $proxlog=$Lang::tr{'stopped'};
58my $proxsrv=$Lang::tr{'stopped'};
0f14446a 59my $mailfile="${General::swroot}/dma/mail.conf";
db8a01e0
AM
60
61&Header::getcgihash(\%cgiparams);
62&General::readhash("${General::swroot}/main/settings", \%mainsettings);
63&General::readhash("/srv/web/ipfire/html/themes/".$mainsettings{'THEME'}."/include/colors.txt", \%color);
64&General::readhash("$settingsfile", \%settings) if(-f $settingsfile);
65
0f14446a
AM
66if ( -f $mailfile){
67 &General::readhash($mailfile, \%mail);
68}
69
db8a01e0
AM
70#Find out which lang is set (used later to set decimal separator correctly)
71my $uplang=uc($mainsettings{'LANGUAGE'});
72setlocale LC_NUMERIC,"$mainsettings{'LANGUAGE'}_$uplang";
73
74if ($cgiparams{'BILLVIEW'} eq "show"){
75 my $file=$cgiparams{'file'};
76 my $name=$cgiparams{'name'};
77 open(DLFILE, "<$file") or die "Unable to open $file: $!";
78 my @fileholder = <DLFILE>;
79 print "Content-Type:application/pdf\n";
80 my @fileinfo = stat("$file");
81 print "Content-Length:$fileinfo[7]\n";
82 print "Content-Disposition:attachment;filename='$name';\n\n";
83 print @fileholder;
84 exit (0);
85}
86if ($cgiparams{'BILLACTION'} eq "open_preview"){
87 #Generate preview Bill
88 my $rggrp=$cgiparams{'txt_billgroup'};
89 my $address_cust = &ACCT::getTaAddress($rggrp,'CUST');
90 my $address_host = &ACCT::getTaAddress($rggrp,'HOST');
91 my $billpos = &ACCT::getextrabillpos($rggrp);
92 my $mwst=$settings{'MWST'};
93 my $cur = $settings{'CURRENCY'};
94 my @now = localtime(time);
95 $now[5] = $now[5] + 1900;
96 my $actmonth = $now[4]+1;
97 my $actyear = $now[5];
98 my ($from,$till)=&ACCT::getmonth($actmonth,$actyear);
99 my @billar = &ACCT::GetTaValues($from,$till,$rggrp);
a5f5ccfc 100 my $tempfile=&ACCT::pdf2(\@billar,$actmonth,$actyear,$mwst,$address_cust,$address_host,$billpos,$rggrp,$cur,"on");
db8a01e0 101 #Show PDF preview
a5f5ccfc 102 open(DLFILE, "<$tempfile") or die "Unable to open tmp.pdf: $!";
db8a01e0
AM
103 my @fileholder = <DLFILE>;
104 print "Content-Type:application/pdf\n";
a5f5ccfc 105 my @fileinfo = stat($tempfile);
db8a01e0
AM
106 print "Content-Length:$fileinfo[7]\n";
107 print "Content-Disposition:attachment;filename='tmp.pdf';\n\n";
108 print @fileholder;
a5f5ccfc 109 unlink ($tempfile);
db8a01e0
AM
110 exit (0);
111}
112
113&Header::showhttpheaders();
114
115if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct config'}"){ #ConfigButton from Menu
116 &configsite;
117}
118if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct addresses'}"){ #AddressmgmntButton from Menu
119 &addressmgmnt;
120}
121if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct billgroup'}"){ #BillgroupButton from Menu
122 &billgroupsite;
123}
124if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct maintenance'}"){ #MaintenanceButton from Menu
125 &expertsite;
126}
127if ($cgiparams{'ACTION'} eq "$Lang::tr{'save'}"){ #SaveButton on configsite
128 my @val=split('\r\n',$cgiparams{'txt_skipurls'});
129 my $skipurls;
130 foreach my $line (@val){
131 $skipurls.="|".$line;
132 }
133 $skipurls=$skipurls."|";
134 $skipurls=~ s/\|\|/\|/g;
135 my @txt=split('\r\n',$cgiparams{'txt_mailtxt'});
136 my $mailtxt;
137 foreach my $txt (@txt){
138 $mailtxt.="|".$txt;
139 }
140 #Check fields
141 if ($cgiparams{'USEMAIL'} eq 'on'){
142 $errormessage=&checkmailsettings;
143 }elsif($cgiparams{'USEMAIL'} ne 'on'){
db8a01e0
AM
144 $cgiparams{'txt_mailsender'}='';
145 $cgiparams{'txt_mailsubject'}='';
146 $mailtxt='';
147 }
148 if(!$errormessage){
149 open (TXT, ">$settingsfile") or die("Die Datei konnte nicht geƶffnet werden: $!\n");
150 close TXT;
151 $settings{'LOG'} = $cgiparams{'logging'};
152 $settings{'EXPERT'} = $cgiparams{'expert'};
153 $settings{'MULTIUSER'} = $cgiparams{'multiuser'};
154 $settings{'MWST'} = $cgiparams{'txt_mwst'};
155 $settings{'CURRENCY'} = $cgiparams{'txt_currency'};
156 $settings{'SKIPURLS'} = $skipurls;
157 $settings{'USEMAIL'} = $cgiparams{'USEMAIL'};
db8a01e0
AM
158 $settings{'MAILSENDER'} = $cgiparams{'txt_mailsender'};
159 $settings{'MAILSUB'} = $cgiparams{'txt_mailsubject'};
160 $settings{'MAILTXT'} = $mailtxt;
161 &General::writehash("$settingsfile", \%settings);
162 }else{
163 $cgiparams{'update'}='on';
164 &configsite;
165 }
166}
167if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct view'}"){ #If special month and year is given on mainsite
168 &mainsite($cgiparams{'month'},$cgiparams{'year'});
169 exit 0;
170}
171if ($cgiparams{'ACTION'} eq "$Lang::tr{'acct commit'}"){ #Maintenance function
172 &ACCT::logger($settings{'LOG'},"Clear DB (all data) committed).\n");
173 &ACCT::cleardbtraf;
174 &expertsite;
175}
176if ($cgiparams{'ACTION2'} eq "$Lang::tr{'acct commit'}"){ #Maintenance function
177 &ACCT::logger($settings{'LOG'},"Clear DB (only traffic data) committed).\n");
178 &ACCT::cleardb;
179 &expertsite;
180}
181if ($cgiparams{'ACTION1'} eq "$Lang::tr{'acct commit'}"){ #Maintenance Function
182 #Get Timestamp
183 my ($a,$b)=&ACCT::getmonth($cgiparams{'expmonth'},$cgiparams{'expyear'});
184 &ACCT::delbefore(($a-1));
185 &expertsite;
186}
187if ($cgiparams{'ACTION'} eq "viewgraph"){ #Graph icon on hosttable (viewhosttable)
188 &graphsite($cgiparams{'month'},$cgiparams{'year'},$cgiparams{'host'});
189}
190if ($cgiparams{'ACTION1'} eq "$Lang::tr{'save'}"){ #SaveButton when adding Address
191 $errormessage=&checkaddress;
192
193 if ($errormessage){
194 &addressmgmnt($errormessage);
195 }else{
196 &ACCT::writeaddr(
197 $cgiparams{'txt_company'},
198 $cgiparams{'rdo_companytype'},
199 $cgiparams{'txt_name1'},
200 $cgiparams{'txt_str'},
201 $cgiparams{'txt_str_nr'},
202 $cgiparams{'txt_plz'},
203 $cgiparams{'txt_city'},
204 $cgiparams{'txt_bank'},
205 $cgiparams{'txt_iban'},
206 $cgiparams{'txt_bic'},
207 $cgiparams{'txt_blz'},
208 $cgiparams{'txt_kto'},
209 $cgiparams{'txt_email'},
210 $cgiparams{'txt_inet'},
211 $cgiparams{'txt_hrb'},
212 $cgiparams{'txt_ustid'},
213 $cgiparams{'txt_tel'},
214 $cgiparams{'txt_fax'},
215 );
216 &ACCT::logger($settings{'LOG'},"Created new address $cgiparams{'txt_company'} as $cgiparams{'rdo_companytype'}.\n");
217 %cgiparams=();
218 }
219 &addressmgmnt;
220}
221if ($cgiparams{'ACTION'} eq "edit_addr"){ #Pencil icon in Address overwiev on Addressmgmnt site
222 $cgiparams{'update'} = 'on';
223 $cgiparams{'oldcompname'}=$cgiparams{'txt_company'};
224 &addressmgmnt;
225}
226if ($cgiparams{'ACTION'} eq "$Lang::tr{'update'}"){ #UpdateButton when editing Address
227 $cgiparams{'update'} = 'on';
228 $errormessage=&checkaddress;
229 if ($errormessage){
230 &addressmgmnt($errormessage);
231 }else{
232 &ACCT::updateaddr(
233 $cgiparams{'rdo_companytype'},
234 $cgiparams{'txt_company'},
235 $cgiparams{'txt_name1'},
236 $cgiparams{'txt_str'},
237 $cgiparams{'txt_str_nr'},
238 $cgiparams{'txt_plz'},
239 $cgiparams{'txt_city'},
240 $cgiparams{'txt_bank'},
241 $cgiparams{'txt_iban'},
242 $cgiparams{'txt_bic'},
243 $cgiparams{'txt_blz'},
244 $cgiparams{'txt_kto'},
245 $cgiparams{'txt_email'},
246 $cgiparams{'txt_inet'},
247 $cgiparams{'txt_hrb'},
248 $cgiparams{'txt_ustid'},
249 $cgiparams{'txt_tel'},
250 $cgiparams{'txt_fax'},
251 $cgiparams{'oldcompname'}
252 );
253 my $res=&ACCT::getbillgroups;
254 foreach my $line (@$res){
255 my($name,$host,$cust)=@$line;
256 if($host eq $cgiparams{'oldcompname'}){
257 &ACCT::updatebillgrouphost($cgiparams{'oldcompname'},$cgiparams{'txt_company'});
258 }elsif ($cust eq $cgiparams{'oldcompname'}){
259 &ACCT::updatebillgroupcust($cgiparams{'oldcompname'},$cgiparams{'txt_company'});
260 }
261 }
262
263 &ACCT::logger($settings{'LOG'},"Edited address $cgiparams{'oldcompname'}.\n");
264 %cgiparams=();
265 }
266 &addressmgmnt;
267}
268if ($cgiparams{'ACTION'} eq "del_addr"){ #Trash icon in Address overview on Addressmgmnt site
269 my $res=&ACCT::checkbillgrp;
270 foreach my $line (@$res){
271 my ($grp,$host,$cust) = @$line;
272 if ($cgiparams{'txt_company'} eq $host){
273 $errormessage="$Lang::tr{'acct err hostdel'} $grp";
274 }
275 if ($cgiparams{'txt_company'} eq $cust){
276 $errormessage="$Lang::tr{'acct err custdel'} $grp";
277 }
278 }
279 if (! $errormessage){
280 &ACCT::deladdr($cgiparams{'txt_company'});
281 &ACCT::logger($settings{'LOG'},"Deleted address $cgiparams{'txt_company'}.\n");
282 }
283 $cgiparams{'txt_company'}='';
284 &addressmgmnt;
285}
286if ($cgiparams{'BILLACTION'} eq "$Lang::tr{'save'}"){ #SaveButton when adding BillingGroups
287 #check if a group with the same name already exists in DB
288 my $res=&ACCT::getbillgroups;
289 foreach my $row (@$res) {
290 my ($group)=@$row;
291 if ($group eq $cgiparams{'txt_billgroup'}){
292 $errormessage.=$Lang::tr{'acct billgroupexists'};
293 }
294 }
295 #Check if a selected user is in another group already
296 if ($settings{'MULTIUSER'} ne 'on'){
297 #split hosts into array
298 my @user=split(/\|/,$cgiparams{'sel_hosts'});
299 my $res=&ACCT::checkusergrp;
300 foreach my $val (@$res){
301 my ($grp,$usr)=@$val;
302 foreach my $wanted (@user){
303 if($usr eq $wanted){
304 $errormessage.="$usr $Lang::tr{'acct usermulti'} $grp<br>";
305 }
306 }
307 }
308 }
309 #validate namefield
310 if(!&validtextfield($cgiparams{'txt_billgroup'})){
311 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'name'}<br>";
312 }
313 #FIXME: Validate CENT amount (num with .)
314 #if used colon, replace with .
315 $cgiparams{'txt_cent'} =~ tr/,/./;
316 if(!&validnumfield($cgiparams{'txt_cent'})){
317 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct cent'}<br>";
318 }
319 #fill array
320 my @ips=split (/\|/,$cgiparams{'sel_hosts'});
321
322 #Check if we use extra bill positions
323 if($cgiparams{'txt_amount'} || $cgiparams{'txt_name'}|| $cgiparams{'txt_price'}){
324 if (!$cgiparams{'txt_amount'} || !$cgiparams{'txt_name'} || !$cgiparams{'txt_price'}){
325 $errormessage.="$Lang::tr{'acct invalid billpos'}<br>";
326 }
327 #check all fields
328 if (!$errormessage){
329 if(! &validnumfield($cgiparams{'txt_amount'})){
330 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct amount'}<br>";
331 }elsif(! &validtextfield($cgiparams{'txt_name'})){
332 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct name'}<br>";
333 }elsif(! &validnumfield($cgiparams{'txt_price'})){
334 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct price pp'}<br>";
335 }
336 }
337 }
338
339 if ($errormessage){
340 &billgroupsite($errormessage);
341 }else{
342 #check if we use extra positions
343 if ($cgiparams{'txt_amount'}){
344 &ACCT::savebillpos(
345 $cgiparams{'txt_posbillgroup'},
346 $cgiparams{'txt_amount'},
347 $cgiparams{'txt_name'},
348 $cgiparams{'txt_price'});
349 &ACCT::logger($settings{'LOG'},"Saved new fixed billposition $cgiparams{'txt_name'} into billgroup $cgiparams{'txt_posbillgroup'} .\n");
350 }
351
352 #save new group
353 &ACCT::savebillgroup(
354 $cgiparams{'txt_billgroup'},
355 $cgiparams{'txt_billtext1'},
356 $cgiparams{'dd_host'},
357 $cgiparams{'dd_cust'},
358 $cgiparams{'txt_cent'},
359 \@ips);
360 &ACCT::logger($settings{'LOG'},"Saved new billgroup $cgiparams{'txt_billgroup'}.\n");
361 %cgiparams=();
362 }
363 &billgroupsite;
364}
365if ($cgiparams{'BILLACTION'} eq "$Lang::tr{'update'}"){ #UpdateButton when editing BillingGroups
366
367
368 my $filename=$cgiparams{'uploaded_file'};
369 if($filename){
370 #First check if logo dir exists
371 if (! -d "$logopath/$cgiparams{'logo_grp'}"){
372 mkpath("$logopath/$cgiparams{'logo_grp'}",0,01777);
373 }
374 #Save File
375 my ($filehandle) = CGI::upload('uploaded_file');
376 open (UPLOADFILE, ">$logopath/$cgiparams{'logo_grp'}/logo.png");
377 binmode $filehandle;
378 while ( <$filehandle> ) {
379 print UPLOADFILE;
380 }
381 close (UPLOADFILE);
382
383 #Check dimensions of uploaded file
384 open (PNG , "<$logopath/$cgiparams{'logo_grp'}/logo.png") ;
385 local $/;
386 my $PNG1=<PNG> ;
387 close(PNG) ;
388 my ($width,$height)=&ACCT::pngsize($PNG1) ;
389
390 if (! &validnumfield($width)){
391 $errormessage.="$Lang::tr{'acct invalid png'}<br>";
392 unlink("$logopath/$cgiparams{'logo_grp'}/logo.png");
393 }elsif($width > 400 || $height > 150){
394 $errormessage.="$Lang::tr{'acct invalid pngsize'} width: $width height: $height<br>";
395 unlink("$logopath/$cgiparams{'logo_grp'}/logo.png");
396 }
397
398 }
399 #Check if a group with the same name already exists in DB
400 my $res=&ACCT::getbillgroups;
401 foreach my $row (@$res) {
402 my ($group)=@$row;
403 if (($group eq $cgiparams{'txt_billgroup'}) && ($cgiparams{'oldname'} ne $cgiparams{'txt_billgroup'})){
404 $errormessage.=$Lang::tr{'acct billgroupexists'};
405 }
406 }
407 #Check if a selected user is in another group already
408 if ($settings{'MULTIUSER'} ne 'on'){
409 #split hosts into array
410 my @user=split(/\|/,$cgiparams{'sel_hosts'});
411 my $res=&ACCT::checkusergrp;
412 foreach my $val (@$res){
413 my ($grp,$usr)=@$val;
414 foreach my $wanted (@user){
415 if($usr eq $wanted && $grp ne $cgiparams{'txt_billgroup'}){
416 $errormessage.="$usr $Lang::tr{'acct usermulti'} $grp<br>";
417 }
418 }
419 }
420 }
421 #Validate namefield
422 if(!&validtextfield($cgiparams{'txt_billgroup'})){
423 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'name'}";
424 }
425 #Validate CENT amount (num with .)
426 #if used colon, replace with .
427 $cgiparams{'txt_cent'} =~ tr/,/./;
428 if(!&validnumfield($cgiparams{'txt_cent'})){
429 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct cent'}<br>";
430 }
431
432 #Fill array
433 my @ips=split ( /\|/,$cgiparams{'sel_hosts'});
434
435 #Check if we use extra bill positions
436 if($cgiparams{'txt_amount'} || $cgiparams{'txt_name'}|| $cgiparams{'txt_price'}){
437 if (!$cgiparams{'txt_amount'} || !$cgiparams{'txt_name'} || !$cgiparams{'txt_price'}){
438 $errormessage.="$Lang::tr{'acct invalid billpos'}<br>";
439 }
440 #Check all fields
441 if (!$errormessage){
442 if(! &validnumfield($cgiparams{'txt_amount'})){
443 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct amount'}<br>";
444 }elsif(! &validtextfield($cgiparams{'txt_name'})){
445 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct name'}<br>";
446 }elsif(! &validnumfield($cgiparams{'txt_price'})){
447 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct price pp'}<br>";
448 }
449 }
450 }
451 #Check if we added some CC mail recipients
452 if($cgiparams{'txt_ccmail'}){
453 $cgiparams{'txt_ccmail'}=~ s/ //g;
454 #Split line into single addresses and check each one
455 my @ccaddr = split(",",$cgiparams{'txt_ccmail'});
456 foreach my $cc (@ccaddr){
457 if (! &General::validemail($cc)){
458 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct ccmail'} $cc<br>";
459 }
460 }
461 }
462 if ($errormessage){
463 $cgiparams{'update'} = 'on';
464 &billgroupsite();
465 }else{
466 #update fixedbillpositions if defined
467 if ($cgiparams{'oldname'} ne $cgiparams{'txt_billgroup'}){
468 &ACCT::updatebillpos($cgiparams{'oldname'},$cgiparams{'txt_billgroup'});
469 }
470 #Check if we use extra positions
471 if ($cgiparams{'txt_amount'}){
472 &ACCT::savebillpos(
473 $cgiparams{'txt_billgroup'},
474 $cgiparams{'txt_amount'},
475 $cgiparams{'txt_name'},
476 $cgiparams{'txt_price'});
477 }
478 #Check if we have NEW cc Mails
479 if($cgiparams{'txt_ccmail'} ne $cgiparams{'oldccmail'}){
480 &ACCT::updateccaddr($cgiparams{'txt_ccmail'},$cgiparams{'dd_cust'});
481 }
482 &ACCT::deletebillgroup($cgiparams{'oldname'});
483 &ACCT::savebillgroup(
484 $cgiparams{'txt_billgroup'},
485 $cgiparams{'txt_billtext1'},
486 $cgiparams{'dd_host'},
487 $cgiparams{'dd_cust'},
488 $cgiparams{'txt_cent'},
489 \@ips);
490 %cgiparams=();
491 }
492 &billgroupsite;
493}
494if ($cgiparams{'BILLACTION'} eq "edit_billgroup"){ #Pencil icon in Billgroup table
495 $cgiparams{'update'} = 'on';
496 &billgroupsite;
497}
498if ($cgiparams{'BILLACTION'} eq "delete_billgroup"){ #Trash icon in Billgroup table
499 &deletefiles($cgiparams{'txt_billgroup'});
500 &ACCT::delbillpos($cgiparams{'txt_billgroup'});
501 &ACCT::deletebillgroup($cgiparams{'txt_billgroup'});
502 &ACCT::logger($settings{'LOG'},"Deleted billgroup $cgiparams{'txt_billgroup'}.\n");
503 &billgroupsite;
504}
505if ($cgiparams{'BILLACTION'} eq "open_billgroup"){ #Folder icon on billgrouptable (viewtablebillgroup)
506 &billoverview($cgiparams{'txt_billgroup'});
507}
508if ($cgiparams{'BILLPOS'} eq "delpos"){ #Trash icon in Billpos table
509 $cgiparams{'update'} = 'on';
510 &ACCT::delbillpos_single($cgiparams{'txt_billpos'},$cgiparams{'txt_billgroup'});
511 &ACCT::logger($settings{'LOG'},"Deleted fixed billposition $cgiparams{'txt_billpos'} from billgroup $cgiparams{'txt_billgroup'}.\n");
512 &billgroupsite;
513}
514if ($cgiparams{'BILLPOS'} eq "$Lang::tr{'save'}"){ #Savebutton in Billpos table
515 $cgiparams{'update'}='on';
516 #Check if we use extra bill positions
517 if($cgiparams{'txt_amount'} || $cgiparams{'txt_name'}|| $cgiparams{'txt_price'}){
518 if (!$cgiparams{'txt_amount'} || !$cgiparams{'txt_name'} || !$cgiparams{'txt_price'}){
519 $errormessage.="$Lang::tr{'acct invalid billpos'}<br>";
520 }
521 #check all fields
522 if (!$errormessage){
523 #if used colon, replace with .
524 $cgiparams{'txt_price'} =~ tr/,/./;
525 if(! &validnumfield($cgiparams{'txt_amount'})){
526 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct amount'}<br>";
527 }elsif(! &validtextfield($cgiparams{'txt_name'})){
528 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct name'}<br>";
529 }elsif(! &validnumfield($cgiparams{'txt_price'})){
530 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct price pp'}<br>";
531 }
532 }
533 }
534 if ($errormessage){
535 &billgroupsite($errormessage);
536 }else{
537 #check if we use extra positions
538 if ($cgiparams{'txt_amount'}){
539 &ACCT::savebillpos(
540 $cgiparams{'txt_billgroup'},
541 $cgiparams{'txt_amount'},
542 $cgiparams{'txt_name'},
543 $cgiparams{'txt_price'});
544 }
545 &ACCT::logger($settings{'LOG'},"Added fixed billposition $cgiparams{'txt_amount'} $cgiparams{'txt_name'} with price $cgiparams{'txt_price'} to billgroup $cgiparams{'txt_billgroup'}.\n");
546 }
547 %cgiparams=();
548 &billgroupsite;
549}
550
551
552#Check if we already have settings
553if ( -z $settingsfile){
554 &configsite;
555}else{
556 &mainsite(($mon+1),($year+1900));
557 exit 0;
558}
559
560sub configsite{
561 my $proxymessage='';
562 my $blockactivation='';
563 #If update set fieldvalues new
564 if($cgiparams{'update'} eq 'on'){
565 $settings{'USEMAIL'} = 'on';
db8a01e0
AM
566 $settings{'MAILSUB'} = $cgiparams{'txt_mailsubject'};
567 $settings{'MAILTXT'} = $cgiparams{'txt_mailtxt'};
568 }
569 #find preselections
570 $checked{'expert'}{$settings{'EXPERT'}} = 'CHECKED';
571 $checked{'logging'}{$settings{'LOG'}} = 'CHECKED';
572 $checked{'multiuser'}{$settings{'MULTIUSER'}} = 'CHECKED';
573 $checked{'usemail'}{$settings{'USEMAIL'}} = 'CHECKED';
0f14446a 574
db8a01e0
AM
575 #Open site
576 &Header::openpage($Lang::tr{'acct settings'}, 1, '');
577 &Header::openbigbox('100%', 'center');
578 &error;
579 &Header::openbox('100%', 'left', $Lang::tr{'acct config'});
0f14446a 580
db8a01e0
AM
581 #### JAVA SCRIPT ####
582 print<<END;
583<script>
584 \$(document).ready(function() {
585 // Show/Hide elements when NAT checkbox is checked.
586 if (\$("#MAIL").attr("checked")) {
587
588 } else {
589 \$(".MAILSRV").hide();
590 }
591
592 // Show NAT area when "use nat" checkbox is clicked
593 \$("#MAIL").change(function() {
594 \$(".MAILSRV").toggle();
595
596 });
597 });
598</script>
599END
600#######################
601 $settings{'SKIPURLS'} =~ tr/|/\r\n/;
602 $settings{'MAILTXT'} =~ tr/|/\r\n/;
603 my $col="style='background-color:$color{'color22'}'";
604 print<<END;
605 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
606 <table style='width:100%'>
607 <tr>
608 <th colspan='3'></th>
609 </tr>
610 <tr>
611 <td style='width:24em'>$Lang::tr{'acct logging'}</td>
612 <td><input type='checkbox' name='logging' $checked{'logging'}{'on'}></td>
613 <td></td>
614 </tr>
615 <tr>
616 <td>$Lang::tr{'acct expert'}</td>
617 <td><input type='checkbox' name='expert' $checked{'expert'}{'on'}></td>
618 <td></td>
619 </tr>
620 <tr>
621 <td>$Lang::tr{'acct multiuser'}</td>
622 <td><input type='checkbox' name='multiuser' $checked{'multiuser'}{'on'}></td>
623 <td></td>
0f14446a 624 </tr>
db8a01e0
AM
625 <tr>
626 <td>$Lang::tr{'acct mwst'}</td>
627 <td><input type='text' name='txt_mwst' value='$settings{'MWST'}' style='width:22em;'></td>
628 <td></td>
0f14446a 629 </tr>
db8a01e0
AM
630 <tr>
631 <td>$Lang::tr{'acct currency'}</td>
632 <td><input type='text' name='txt_currency' value='$settings{'CURRENCY'}' style='width:22em;'></td>
633 <td></td>
0f14446a 634 </tr>
db8a01e0
AM
635 <tr>
636 <td valign='top'>$Lang::tr{'acct skipurl'}</td>
637 <td style='padding-left:0.2em;'><textarea name="txt_skipurls" cols="20" rows="6" style='width:22em;'>$settings{'SKIPURLS'}</textarea></td>
638 <td></td>
639 </tr>
0f14446a
AM
640END
641
642if ($mail{'USEMAIL'} eq 'on'){
643 if (!$settings{'MAILSENDER'}){
644 $settings{'MAILSENDER'} = $mail{'SENDER'};
645 }
646print <<END;
db8a01e0
AM
647 <tr>
648 <td>$Lang::tr{'acct usemail'}</td>
649 <td><label><input type='checkbox' name='USEMAIL' id='MAIL' $checked{'usemail'}{'on'}></label></td>
650 <td></td>
651 </tr>
0f14446a
AM
652END
653}
db8a01e0 654
0f14446a
AM
655print <<END;
656 </table><br>
db8a01e0
AM
657 <div class="MAILSRV">
658 <table style='width:100%;'>
659 <tr>
0f14446a 660 <td style='width:24em'>$Lang::tr{'acct mailsender'}</td>
db8a01e0
AM
661 <td><input type='text' name='txt_mailsender' value='$settings{'MAILSENDER'}' style='width:22em;'></td>
662 </tr>
db8a01e0
AM
663 <tr>
664 <td>$Lang::tr{'acct subject'}</td>
665 <td><input type='text' name='txt_mailsubject' value='$settings{'MAILSUB'}' style='width:22em;'></td>
666 </tr>
667 <tr>
668 <td valign='top' >$Lang::tr{'acct mailtxt'}</td>
669 <td style='padding-left:0.2em;'><textarea name="txt_mailtxt" cols="34" rows="6" style='width: 22em;'>$settings{'MAILTXT'}</textarea></td>
670
671 </table>
672 </div>
673
db8a01e0
AM
674 <table style='width:100%;'>
675 <tr>
676 <td colspan='3' display:inline align='right'><input type='submit' name='ACTION' value='$Lang::tr{'save'}'></td>
677 </tr>
678 </table>
679 <br>
680 </form>
681END
682&Header::closebox();
683#BackButton
684 print<<END;
685 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
686 <table style='width:100%;'>
687 <tr>
688 <td></td>
689 <td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'back'}'></td>
690 </tr>
691 </table>
692 </form>
693END
694 &Header::closebigbox();
695 &Header::closepage();
696 exit 0;
697}
698
699sub deletefiles{
700 my $grp=shift;
701 rmtree ("$logopath/$grp");
702 rmtree ("${General::swroot}/accounting/bill/$grp");
703}
704
705sub mainsite{
706 my $mon=$_[0];
707 my $year=$_[1];
708 if ($_[0]){$mon=$_[0];}
709 &Header::openpage($Lang::tr{'acct title'}, 1, '');
710 &Header::openbigbox('100%', 'center');
711 &checkproxy;
712 &statusbox;
713 &menu;
714 &viewtablehosts(($mon),$year);
715 &Header::closebigbox();
716 &Header::closepage();
717}
718
719sub expertsite{
720 &Header::openpage($Lang::tr{'acct maintenance'}, 1, '');
721 &Header::openbigbox('100%', 'center');
722
723 #Get size of Databasefile
724 my $sizedb= -s "/var/ipfire/accounting/acct.db";
725 $sizedb = sprintf"%.2f", $sizedb/(1024*1024);
726 #Get size of Directory, where all bills are stored
727 my $sizerrd = 0;
728 find(sub { $sizerrd += -s if -f $_ }, "${General::swroot}/accounting/bill");
729 $sizerrd = sprintf"%.2f", $sizerrd/(1024*1024);
730
731 &ACCT::connectdb;
732 #Get latest and earliest entry of DB
733 my ($min,$max) = &ACCT::getminmax;
734 $min=&getdate($min);
735 $max=&getdate($max);
736 #Print status table
737 &Header::openbox('100%', 'left', $Lang::tr{'acct status'});
738 print<<END;
739 <table style='width:100%;' cellspacong='0' class='tbl'>
740 <tr>
741 <th align='left' width='30%'>$Lang::tr{'name'}</th>
742 <th align='left'>$Lang::tr{'acct value'}</th>
743 </tr>
744 <tr>
745 <td>$Lang::tr{'acct dbsize'}</td>
746 <td>$sizedb MB</td>
747 </tr>
748 <tr>
749 <td>$Lang::tr{'acct rrdsize'}</td>
750 <td>$sizerrd MB</td>
751 </tr>
752 <tr>
753 <td>$Lang::tr{'acct oldestdb'}</td>
754 <td>$min</td>
755 </tr>
756 <tr>
757 <td>$Lang::tr{'acct latestdb'}</td>
758 <td>$max</td>
759 </tr>
760 </table>
761 <br>
762END
763 &Header::closebox();
764 #print Database maintenance table
765 &Header::openbox('100%', 'left', $Lang::tr{'acct dbmaintenance'});
766 print<<END;
767 <br>
768 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
769 <table style='width:100%;' cellspacing='0' class='tbl'>
770 <tr>
771 <th>$Lang::tr{'acct task'}</th>
772 <th>$Lang::tr{'acct parameter'}</th>
773 <th>$Lang::tr{'acct action'}</th>
774 </tr>
775 <tr>
776 <td>$Lang::tr{'acct emptydb'}</td>
777 <td></td>
778 <td><input type='submit' name='ACTION2' value='$Lang::tr{'acct commit'}' style='width:10em'></td>
779 </tr>
780 <tr>
781 <td>$Lang::tr{'acct emptydbtraf'}</td>
782 <td></td>
783 <td><input type='submit' name='ACTION' value='$Lang::tr{'acct commit'}' style='width:10em'></td>
784 </tr>
785 <tr>
786 <td>$Lang::tr{'acct delbefore'} (ACCT,ACCT_HIST)</td>
787 <td><select name='expmonth'>
788END
789 for(my $i=1;$i<13;$i++){
790 print"<option>$i</option>";
791 }
792 print"</select><select name='expyear'>";
793 for(my $i=2014;$i<=($year+1900);$i++){
794 print"<option>$i</option>";
795 }
796 print<<END;
797 </select></td>
798 <td><input type='submit' name='ACTION1' value='$Lang::tr{'acct commit'}' style='width:10em'></td>
799 </tr>
800 </table>
801 </form>
802END
803 &Header::closebox();
804#BackButton
805 print<<END;
806 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
807 <table style='width:100%;'>
808 <tr>
809 <td></td>
810 <td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'back'}'></td>
811 </tr>
812 </table>
813 </form>
814END
815
816
817 &Header::closebigbox();
818 &Header::closepage();
819 &ACCT::closedb;
820 exit 0;
821}
822
823sub getdate{
824 #GET : Timestamp in seconds since 1.1.1970
825 #GIVES: Date in Format dd.mm.yyyy HH:MM:SS
826 my $val = $_[0];
827 my $y=sprintf("%02d",(localtime($val))[5]-100);
828 my $Y=sprintf("%04d",(localtime($val))[5]+1900);
829 my $m=sprintf("%02d",(localtime($val))[4]+1);
830 my $d=sprintf("%02d",(localtime($val))[3]);
831 my $H=sprintf("%02d",(localtime($val))[2]);
832 my $M=sprintf("%02d",(localtime($val))[1]);
833 my $S=sprintf("%02d",(localtime($val))[0]);
834
835 return "$d.$m.$Y $H:$M:$S";
836}
837
838sub menu{
839 &Header::openbox('100%', 'left', $Lang::tr{'menu'});
840 print<<END;
841 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
842 <table style='width: 100%;'>
843 <tr>
844 <td style='display:inline;'>
845 <input type='submit' name='ACTION' value='$Lang::tr{'acct config'}'>
846 <input type='submit' name='ACTION' value='$Lang::tr{'acct addresses'}'>
847 <input type='submit' name='ACTION' value='$Lang::tr{'acct billgroup'}'>
848END
849 if ($settings{'EXPERT'} eq 'on'){
850 print "<input type='submit' name='ACTION' value='$Lang::tr{'acct maintenance'}'>";
851 }
852 print<<END;
853 </td>
854 </tr>
855 </table>
856 </form>
857END
858 &Header::closebox();
859}
860
861sub graphsite{
862 my $grmon=$_[0];
863 my $gryear=$_[1];
864 my $grhost=$_[2];
865
866 &Header::openpage("$Lang::tr{'acct host detail'} $grhost", 1, '');
867 &Header::openbigbox('100%', 'center');
868 &Header::openbox('100%', 'left', );
869
870 &generatemonthgraph($grmon,$gryear,$grhost);
871
872 &Header::closebox();
873 &Header::closebigbox();
874 &Header::closepage();
875 exit 0;
876}
877
878sub generatemonthgraph{
879 my $grmon=$_[0];
880 my $gryear=$_[1];
881 my $grhost=$_[2];
882 my ($from,$till) = &ACCT::getmonth($grmon,$gryear);
883 my @values=();
884 my $sth;
885 my $cnt=0;
886 #If we want to show Data from within last 2 months, get DATA from ACCT
0fa8d28e 887 if ( $grmon == ($mon)+1 && $gryear == ($year+1900)){
db8a01e0
AM
888 $sth=&ACCT::getmonthgraphdata("ACCT",$from,$till,$grhost);
889 }else{
890 #If we want to show data from a date older than last two months, use ACCT_HIST
891 $sth=&ACCT::getmonthgraphdata("ACCT_HIST",$from,$till,$grhost);
892 }
893 foreach( @$sth ) {
894 $cnt++;
895 foreach my $i (0..$#$_) {
896 push (@{$values[$i]},($_->[$i]));
897 }
898 }
899
900 for my $graph (GD::Graph::area->new(600,200))
901 {
902 my $name = $cgiparams{'host'};
903 $graph->set(
904 bgclr => 'white',
905 fgclr => 'black',
906 boxclr => '#eeeeee',
907 accentclr => 'dblue',
908 valuesclr => '#ffff77',
909 labelclr => 'black',
910 axislabelcl =>'black',
911 legendclr =>'black',
912 valuesclr =>'black',
913 textclr =>'black',
914 dclrs => [qw(lgreen lred)],
915 x_label => $Lang::tr{'date'},
916 y_label => $Lang::tr{'acct mb'},
917 title => $name,
918 y_long_ticks => 1,
919 #x_label_skip => 3, #skip every 3 x-axis title
920 x_label_position => 0,
921 transparent => 0,
922 );
923
924 $graph->set_legend("$Lang::tr{'acct traffic'}");
925 $graph->set(x_labels_vertical => 1, values_vertical => 1);
926 my $gd=$graph->plot(\@values);
927 open(IMG, '>/srv/web/ipfire/html/accounting/tmpgraph.png') or die $!;
928 binmode IMG;
929 print IMG $gd->png;
930 }
931 #Show Box with monthly graph for this host
932 &Header::openbox('100%', 'left', $Lang::tr{'acct traffic monthly'});
933 print "<center><img src='/accounting/tmpgraph.png' alt='$grhost'></center>";
934 print "<b>$cgiparams{'traffic'}</b>";
935 &Header::closebox();
936 print<<END;
937 <table style='width:100%;'>
938 <tr>
939 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
940 <td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'back'}'></td>
941 </form>
942 </tr>
943 </table>
944END
945}
946
947sub generatehourgraph{
948 my $grmon=$_[0];
949 my $gryear=$_[1];
950 my $grhost=$_[2];
951 my ($from,$till) = &ACCT::getmonth($grmon,$gryear);
952 my @values=();
953 my $sth;
954 my $cnt=0;
955 #If we want to show Data from within last 2 months, get DATA from ACCT
956 if ( ! $grmon < ($mon+1) && $gryear == ($year+1900)){
957 $sth=&ACCT::getgraphdata("ACCT",$from,$till,$grhost);
958 }else{
959 #If we want to show data from a date older than last two months, use ACCT_HIST
960 $sth=&ACCT::getgraphdata("ACCT_HIST",$from,$till,$grhost);
961 }
962 foreach( @$sth ) {
963 $cnt++;
964 foreach my $i (0..$#$_) {
965 #print "$_->[$i] "
966 if ($i == 1){
967 push (@{$values[$i]},($_->[$i]/1024/1024));
968 }else{
969 push (@{$values[$i]},$_->[$i]);
970 }
971 }
972 }
973
974 print"<br><br><br>";
975
976 for my $graph (GD::Graph::area->new(600,200))
977 {
978 my $name = $cgiparams{'host'};
979 print STDERR "Processing $name mit sosse\n";
980
981 $graph->set(
982 x_label => 'X Label',
983 y_label => 'Y label',
984 title => 'An Area Graph',
985 #y_max_value => 40,
986 #y_tick_number => 8,
987 #y_label_skip => 2,
988 #accent_treshold => 41,
989 transparent => 0,
990 );
991
992 $graph->set_legend( 'one', 'two' );
993 my $gd=$graph->plot(\@values);
994 open(IMG, '>/srv/web/ipfire/html/test/file.png') or die $!;
995 binmode IMG;
996 print IMG $gd->png;
997 }
998 sleep 1;
999 print "<img src='/test/file.png' alt='Tanzmaus'>";
1000}
1001
1002sub statusbox{
1003 my $bgcolor1='';
1004 my $bgcolor2='';
1005 my $message;
1006 if ($proxsrv eq $Lang::tr{'stopped'}){
1007 $bgcolor1="bgcolor='${Header::colourred}' align='center'";
1008 $message="<br>$Lang::tr{'acct proxy_enable'}";
1009 }else{
1010 $bgcolor1="bgcolor='${Header::colourgreen}' align='center'";
1011 }
1012 if ($proxlog eq $Lang::tr{'stopped'}){
1013 $bgcolor2="bgcolor='${Header::colourred}' align='center'";
1014 $message=$message."<br>$Lang::tr{'acct proxylog_enable'}";
1015 }else{
1016 $bgcolor2="bgcolor='${Header::colourgreen}' align='center'";
1017 }
1018 &Header::openbox('100%', 'left', );
1019 print<<EOF;
1020 <center><table width='50%' class='tbl'>
1021 <tr>
1022 <th>$Lang::tr{'service'}</th>
1023 <th>$Lang::tr{'status'}</th>
1024 </tr>
1025 <tr>
1026 <td bgcolor='$color{'color22'}'>$Lang::tr{'proxy'}</td>
1027 <td $bgcolor1><font color='white'>$proxsrv</td>
1028 <tr>
1029 <tr>
1030 <td bgcolor='$color{'color20'}'>$Lang::tr{'logging'}</td>
1031 <td $bgcolor2><font color='white'>$proxlog</td>
1032 </tr>
1033EOF
1034 if ($message){
1035 print"<tr><td colspan='2'><font color='red'>$message<br>$Lang::tr{'acct nodata'}</td></tr>";
1036 }
1037 print"</table>";
1038 &Header::closebox();
1039}
1040
1041sub calcbytes{
1042 #GET: Value (bytes)
1043 #GIVES: Value (in MB,GB,TB) With Type ("MB","GB","TB")
1044 my $val=$_[0];
1045 my $type;
1046 if (($val/1024) < 1024){
1047 #Calc KB
1048 $val=sprintf "%.2f",$val/1024;
1049 $type=$Lang::tr{'acct kb'};
1050 }elsif (($val/(1024*1024)) < 1024){
1051 #Calc MB
1052 $val=sprintf "%.2f",$val/(1024*1024);
1053 $type=$Lang::tr{'acct mb'};
1054 }elsif(($val/(1024*1024*1024)) < 1024){
1055 #Calc GB
1056 $val=sprintf "%.2f",$val/(1024*1024*1024);
1057 $type=$Lang::tr{'acct gb'};
1058 }elsif(($val/(1024*1024*1024*1024)) < 1024){
1059 #Calc TB
1060 $val=sprintf "%.2f",$val/(1024*1024*1024*1024);
1061 $type=$Lang::tr{'acct tb'};
1062 }
1063 return ($val,$type);
1064}
1065
1066sub addressmgmnt{
1067 #This function shows the site "address management"
1068 &Header::openpage("$Lang::tr{'acct addresses'}", 1, '');
1069 &Header::openbigbox('100%', 'center');
1070 &error;
1071 my $col1;
1072 my $host=0;
1073 my $cust=0;
1074 #Get all Addresses from DB
1075 my $res = &ACCT::getaddresses;
1076
1077&Header::openbox('100%', 'left',$Lang::tr{'acct edit_addr'} );
1078
1079#When no address preselected, set COMPANYTYPE to "CUST"
1080if ($cgiparams{'rdo_companytype'} eq ''){
1081 $cgiparams{'rdo_companytype'} = 'CUST';
1082}
1083$checked{'rdo_companytype'}{$cgiparams{'rdo_companytype'}} = 'CHECKED';
1084
1085#NEW AddressBox
1086print<<END;
1087 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1088 <table style=width:100%;'>
1089 <tr>
1090 <td style='width:8em;'></td>
1091 <td></td>
1092 <td colspan='2'><font size="1">$Lang::tr{'acct hint_hoster'}:</font></td>
1093 </tr>
1094 <tr>
1095 <td>$Lang::tr{'acct companytype'}</td>
e3edceeb 1096<!-- TODO: when the value of this radio button changes, the layout needs to be reloaded so "blob.gif" gets displayed -->
db8a01e0
AM
1097 <td>
1098 <input type='radio' name='rdo_companytype' value='CUST' $checked{'rdo_companytype'}{'CUST'}>$Lang::tr{'acct customer'} &nbsp;
1099 <input type='radio' name='rdo_companytype' value='HOST' $checked{'rdo_companytype'}{'HOST'}>$Lang::tr{'acct hoster'}</td>
e3edceeb
LS
1100 <td style='width:8em;'>$Lang::tr{'acct bank'}
1101END
1102
1103if ($cgiparams{'rdo_companytype'} eq 'HOST'){
1104 print "&nbsp;<img src='/blob.gif' alt='*' />";
1105}
1106
1107print <<END;
1108 </td>
db8a01e0
AM
1109 <td>
1110 <input type='text' name='txt_bank' value='$cgiparams{'txt_bank'}' style='width:25em;'></td>
1111 </tr>
1112 <tr>
e3edceeb 1113 <td>$Lang::tr{'acct company'}&nbsp;<img src='/blob.gif' alt='*' /></td>
db8a01e0
AM
1114 <td>
1115 <input type='text' name='txt_company' value='$cgiparams{'txt_company'}' style='width:25em;'></td>
0f14446a 1116 <td>$Lang::tr{'acct iban'}</td>
db8a01e0
AM
1117 <td>
1118 <input type='text' name='txt_iban' value='$cgiparams{'txt_iban'}' style='width:25em;'></td>
1119 </tr>
1120 <tr>
0f14446a 1121 <td>$Lang::tr{'acct name1'}</td>
db8a01e0
AM
1122 <td>
1123 <input type='text' name='txt_name1' value='$cgiparams{'txt_name1'}' style='width:25em;'></td>
0f14446a 1124 <td>$Lang::tr{'acct bic'}</td>
db8a01e0
AM
1125 <td>
1126 <input type='text' name='txt_bic' maxlength='8' value='$cgiparams{'txt_bic'}' style='width:25em;'></td>
1127 </tr>
1128 <tr>
e3edceeb 1129 <td>$Lang::tr{'acct str'}&nbsp;<img src='/blob.gif' alt='*' /></td>
db8a01e0
AM
1130 <td align='left'>
1131 <input type='text' name='txt_str' value='$cgiparams{'txt_str'}' style='width:25em;'></td>
e3edceeb
LS
1132 <td>$Lang::tr{'acct blz'}
1133END
1134
1135if ($cgiparams{'rdo_companytype'} eq 'HOST'){
1136 print "&nbsp;<img src='/blob.gif' alt='*' />";
1137}
1138
1139print <<END;
1140 </td>
db8a01e0
AM
1141 <td>
1142 <input type='text' name='txt_blz' maxlength='8' value='$cgiparams{'txt_blz'}' style='width:25em;'></td>
1143 </tr>
1144 <tr>
e3edceeb 1145 <td>$Lang::tr{'acct str_nr'}&nbsp;<img src='/blob.gif' alt='*' /></td>
db8a01e0 1146 <td><input type='text' name='txt_str_nr' value='$cgiparams{'txt_str_nr'}' style='width:25em;'></td>
e3edceeb
LS
1147 <td>$Lang::tr{'acct kto'}
1148END
1149
1150if ($cgiparams{'rdo_companytype'} eq 'HOST'){
1151 print "&nbsp;<img src='/blob.gif' alt='*' />";
1152}
1153
1154print <<END;
1155 </td>
db8a01e0
AM
1156 <td>
1157 <input type='text' name='txt_kto' value='$cgiparams{'txt_kto'}' style='width:25em;'></td>
1158 </tr>
1159
1160
1161 <tr>
e3edceeb 1162 <td>$Lang::tr{'acct plz'}&nbsp;<img src='/blob.gif' alt='*' /></td>
db8a01e0
AM
1163 <td>
1164 <input type='text' name='txt_plz' value='$cgiparams{'txt_plz'}' style='width:25em;'></td>
e3edceeb 1165 <td>$Lang::tr{'acct email'}&nbsp;<img src='/blob.gif' alt='*' /></td>
db8a01e0
AM
1166 <td><input type='text' name='txt_email' value='$cgiparams{'txt_email'}' style='width:25em;'></td>
1167 </tr>
1168 <tr>
e3edceeb 1169 <td>$Lang::tr{'acct city'}&nbsp;<img src='/blob.gif' alt='*' /></td>
db8a01e0 1170 <td><input type='text' name='txt_city' value='$cgiparams{'txt_city'}' style='width:25em;'></td>
0f14446a 1171 <td>$Lang::tr{'acct inet'}</td>
db8a01e0
AM
1172 <td>
1173 <input type='text' name='txt_inet' value='$cgiparams{'txt_inet'}' style='width:25em;'></td>
1174 </tr>
1175 <tr>
1176 <td></td>
1177 <td></td>
e3edceeb 1178 <td>$Lang::tr{'acct hrb'}</td>
db8a01e0
AM
1179 <td>
1180 <input type='text' name='txt_hrb' value='$cgiparams{'txt_hrb'}' style='width:25em;'></td>
1181 </tr>
1182 <tr>
1183 <td></td>
1184 <td></td>
e3edceeb 1185 <td>$Lang::tr{'acct ustid'}</td>
db8a01e0
AM
1186 <td><input type='text' name='txt_ustid' value='$cgiparams{'txt_ustid'}' style='width:25em;'></td>
1187 </tr>
1188 <tr>
1189 <td></td>
1190 <td></td>
0f14446a 1191 <td>$Lang::tr{'acct tel'}</td>
db8a01e0
AM
1192 <td>
1193 <input type='text' name='txt_tel' value='$cgiparams{'txt_tel'}' style='width:25em;'></td>
1194 </tr>
1195 <tr>
1196 <td></td>
1197 <td></td>
0f14446a 1198 <td>$Lang::tr{'acct fax'}</td>
db8a01e0
AM
1199 <td>
1200 <input type='text' name='txt_fax' value='$cgiparams{'txt_fax'}' style='width:25em;'></td>
1201 </tr>
1202 <tr>
e3edceeb 1203 <td colspan='6'><img src='/blob.gif' alt='*' /><font size="1">&nbsp;$Lang::tr{'acct not optional'}</font></td>
db8a01e0
AM
1204 </tr>
1205 <tr>
1206END
1207 if($cgiparams{'update'} eq 'on'){
1208 print"<input type='hidden' name='oldcompname' value='$cgiparams{'oldcompname'}'>";
1209 print "<td colspan='6' align='right' display:inline><input type='submit' name='ACTION' value='$Lang::tr{'update'}'></td>";
1210 }else{
1211 print "<td colspan='6' align='right' display:inline><input type='submit' name='ACTION1' value='$Lang::tr{'save'}'></td>";
1212 }
1213 print"</tr></table></form>";
1214&Header::closebox();
1215#Upper BackButton
1216print<<END;
1217 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1218 <table style='width:100%;'>
1219 <tr>
1220 <td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'back'}'></td>
1221 </tr>
1222 </table>
1223 </form>
1224END
1225#Check if we need to show HOSTBOX and/or CUSTBOX
1226foreach my $row (@$res) {
1227 my ($gr,$comp,$type,$name1,$str,$nr,$plz,$city,$bank,$iban,$bic,$blz,$kto,$email,$inet,$hrb,$ustid,$tel,$fax) = @$row;
1228 if ($type eq 'HOST'){
1229 $host=1;
1230 }
1231 if ($type eq 'CUST'){
1232 $cust=1;
1233 }
1234}
1235#Show HOSTER Addresses if any
1236 if ($host){
1237 $count=0;
1238 #EXISTING HOST BOX
1239 &Header::openbox('100%', 'left',$Lang::tr{'acct exst_host_addr'} );
1240 my $float;
1241 print "<table style='width:100%'>";
1242 foreach my $row (@$res) {
1243 #SET colors for tablerows
1244 $col="style='background-color:$color{'color22'}'";
1245 $col1="style='background-color:#e2d8d8'";
1246 my ($gr,$comp,$type,$name1,$str,$nr,$plz,$city,$bank,$iban,$bic,$blz,$kto,$email,$inet,$hrb,$ustid,$tel,$fax) = @$row;
1247 if ($cgiparams{'oldcompname'} eq $comp){
1248 $col="style='background-color:yellow'";
1249 $col1="style='background-color:yellow'";
1250 }
1251 if ($type eq 'HOST'){
1252 $count++;
1253 if($count % 2){
1254 print"<tr><td width='50%' valign='top' align='center'>";
1255 }else{
1256 print"</td><td width='50%' valign='top' align='center'>";
1257 }
1258 print<<END;
1259 <table style='width:90%;' cellspacing='0' class='tbl'>
1260 <tr>
1261 <th align='left' width='50%'>$Lang::tr{'acct company'}</th>
1262 <th align='left' width='10%' >$Lang::tr{'acct bank'}</th>
1263 <th width='38%' ></th>
1264 <th align='right' width='1%' style="PADDING: 0px">
1265 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1266 <input type='image' src='/images/edit.gif' alt=$Lang::tr{'acct edit'} title='$Lang::tr{'acct edit'}' />
1267 <input type='hidden' name='ACTION' value='edit_addr'>
1268 <input type='hidden' name='rdo_companytype' value='$type'>
1269 <input type='hidden' name='txt_company' value='$comp'>
1270 <input type='hidden' name='txt_name1' value='$name1'>
1271 <input type='hidden' name='txt_str' value='$str'>
1272 <input type='hidden' name='txt_str_nr' value='$nr'>
1273 <input type='hidden' name='txt_plz' value='$plz'>
1274 <input type='hidden' name='txt_city' value='$city'>
1275 <input type='hidden' name='txt_bank' value='$bank'>
1276 <input type='hidden' name='txt_iban' value='$iban'>
1277 <input type='hidden' name='txt_bic' value='$bic'>
1278 <input type='hidden' name='txt_blz' value='$blz'>
1279 <input type='hidden' name='txt_kto' value='$kto'>
1280 <input type='hidden' name='txt_email' value='$email'>
1281 <input type='hidden' name='txt_inet' value='$inet'>
1282 <input type='hidden' name='txt_hrb' value='$hrb'>
1283 <input type='hidden' name='txt_ustid' value='$ustid'>
1284 <input type='hidden' name='txt_tel' value='$tel'>
1285 <input type='hidden' name='txt_fax' value='$fax'>
1286 </form></th>
1287 <th width='1%' style="PADDING: 0px">
1288 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1289 <input type='image' src='/images/delete.gif' alt=$Lang::tr{'acct deladr'} title=$Lang::tr{'acct deladr'} />
1290 <input type='hidden' name='txt_company' value='$comp'>
1291 <input type='hidden' name='ACTION' value='del_addr'>
1292 </form>
1293 </th>
1294 </tr>
1295 <tr>
1296 <td $col><b>$comp</b></td>
1297 <td $col1></td>
1298 <td colspan='3' $col1></td>
1299 </tr>
1300 <tr>
1301 <td $col>$name1</td>
1302 <td $col1 width='35%'>$Lang::tr{'acct bank'}</td>
1303 <td colspan='3' $col1>$bank</td>
1304 </tr>
1305 <tr>
1306 <td $col></td>
1307 <td $col1>$Lang::tr{'acct iban'}</td>
1308 <td colspan='3' $col1>$iban</td>
1309 </tr>
1310 <tr>
1311 <td $col>$str $nr</td>
1312 <td $col1>$Lang::tr{'acct bic'}</td>
1313 <td colspan='3' $col1>$bic</td>
1314 </tr>
1315 <tr>
1316 <td $col>$plz $city</td>
1317 <td $col1>$Lang::tr{'acct blz'}</td>
1318 <td colspan='3' $col1>$blz</td>
1319 </tr>
1320 <tr>
1321 <td $col></td>
1322 <td $col1>$Lang::tr{'acct kto'}</td>
1323 <td colspan='3' $col1>$kto</td>
1324 </tr>
1325 </table>
1326 <br>
1327 </td>
1328END
1329 if (! $count % 2){
1330 print"</tr>";
1331 }
1332 }
1333 }
1334 if ( ($count % 2)){
1335 print"<td width='50%' valign='top' align='center'></td></tr>";
1336 }
1337 print "</table>";
1338 &Header::closebox();
1339 }else{
1340 &Header::openbox('100%', 'left',$Lang::tr{'acct exst_host_addr'} );
1341 print $Lang::tr{'acct host empty'};
1342 &Header::closebox();
1343 }
1344#Show CUSTOMER Addresses if any
1345 if($cust){
1346 $count=0;
1347 #EXISTING CUSTOMER BOX
1348 &Header::openbox('100%', 'left',$Lang::tr{'acct exst_cust_addr'} );
1349 print "<table style='width:100%;'><tr>";
1350 foreach my $row (@$res) {
1351 #SET colors for tablerows
1352 $col="style='background-color:$color{'color22'}'";
1353 my ($gr,$comp,$type,$name1,$str,$nr,$plz,$city,$bank,$iban,$bic,$blz,$kto,$email,$inet,$hrb,$ustid,$tel,$fax) = @$row;
1354 if ($cgiparams{'oldcompname'} eq $comp){
1355 $col="style='background-color:yellow'";
1356 }
1357 if ($type eq 'CUST'){
1358 $count++;
1359 print"<td width='15%' valign='top' align='center'>";
1360
1361 print<<END;
1362 <table style='width:90%;' cellspacing='0' class='tbl'>
1363 <tr>
1364 <th align='left'>
1365 $Lang::tr{'acct company'}
1366 </th>
1367 <th width='1%' style="PADDING: 0px">
1368 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1369 <input type='image' src='/images/edit.gif' alt='$Lang::tr{'acct edit'}' title='$Lang::tr{'acct edit'}' />
1370 <input type='hidden' name='ACTION' value='edit_addr'>
1371 <input type='hidden' name='rdo_companytype' value='$type'>
1372 <input type='hidden' name='txt_company' value='$comp'>
1373 <input type='hidden' name='txt_name1' value='$name1'>
1374 <input type='hidden' name='txt_str' value='$str'>
1375 <input type='hidden' name='txt_str_nr' value='$nr'>
1376 <input type='hidden' name='txt_plz' value='$plz'>
1377 <input type='hidden' name='txt_city' value='$city'>
1378 <input type='hidden' name='txt_bank' value='$bank'>
1379 <input type='hidden' name='txt_iban' value='$iban'>
1380 <input type='hidden' name='txt_bic' value='$bic'>
1381 <input type='hidden' name='txt_blz' value='$blz'>
1382 <input type='hidden' name='txt_kto' value='$kto'>
1383 <input type='hidden' name='txt_email' value='$email'>
1384 <input type='hidden' name='txt_inet' value='$inet'>
1385 <input type='hidden' name='txt_hrb' value='$hrb'>
1386 <input type='hidden' name='txt_ustid' value='$ustid'>
1387 <input type='hidden' name='txt_tel' value='$tel'>
1388 <input type='hidden' name='txt_fax' value='$fax'>
1389 </form>
1390 </th>
1391 <th width='1%' style="padding: 0px">
1392 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1393 <input type='image' src='/images/delete.gif' alt=$Lang::tr{'acct deladr'} title=$Lang::tr{'acct deladr'} />
1394 <input type='hidden' name='ACTION' value='del_addr' />
1395 <input type='hidden' name='txt_company' value='$comp' />
1396 </form>
1397 </th>
1398 </tr>
1399 <tr>
1400 <td colspan='3' $col><b>$comp</b></td>
1401 </tr>
1402 <tr>
1403 <td colspan='3' $col>$name1</td>
1404 </tr>
1405 <tr>
1406 <td colspan='3' $col>$str $nr</td>
1407 </tr>
1408 <tr>
1409 <td colspan='3' $col>$plz $city</td>
1410 </tr>
1411 </table><br>
1412 </td>
1413
1414END
1415 if(! ($count % 3)) {
1416 print"</tr><tr>";
1417 }
1418 }
1419
1420 }
1421 if ($count %2){
1422 print"<td width='15%' valign='top' align='center'></td></tr>";
1423 }
1424 print"</table>";
1425 &Header::closebox();
1426 }else{
1427 &Header::openbox('100%', 'left',$Lang::tr{'acct exst_cust_addr'} );
1428 print $Lang::tr{'acct cust empty'};
1429 &Header::closebox();
1430 }
1431 &Header::closebigbox();
1432 &Header::closepage();
1433 exit 0;
1434}
1435
1436sub checkfield{
1437 my $field=$_[0];
1438 my $fieldvalue=$_[1];
1439 my $errormessage=$_[2];
1440
1441 if (!&validtextfield($fieldvalue)){
1442 if(!$fieldvalue){
1443 $errormessage.="$Lang::tr{'acct empty field'} $field<br>";
1444 }else{
1445 $errormessage.="$Lang::tr{'acct invalid'} $field<br>";
1446 }
1447 }
1448 return $errormessage;
1449}
1450
1451sub checkaddress{
1452 #Check if an address with the same name alread exists
1453 if ($cgiparams{'update'} ne 'on'){
1454 my $res=&ACCT::getaddresses;
1455 foreach my $row (@$res) {
1456 my ($anz,$name)=@$row;
1457 if ($name eq $cgiparams{'txt_company'}){
1458 $errormessage.=$Lang::tr{'acct companyexists'};
1459 }
1460 }
1461 }
1462 #Check Companyfield
1463 $errormessage=&checkfield($Lang::tr{'acct company'},$cgiparams{'txt_company'},$errormessage);
1464
1465 #Check Name1
1466 if($cgiparams{'txt_name1'}){
1467 $errormessage=&checkfield($Lang::tr{'acct name1'},$cgiparams{'txt_name1'},$errormessage);
1468 }
1469
1470 #Check Name2
1471 if($cgiparams{'txt_name2'}){
1472 $errormessage=&checkfield($Lang::tr{'acct name2'},$cgiparams{'txt_name2'},$errormessage);
1473 }
1474
1475 #Check STREET
1476 $errormessage=&checkfield($Lang::tr{'acct str'},$cgiparams{'txt_str'},$errormessage);
1477
1478 #Check STREET-NR
1479 if (! $cgiparams{'txt_str_nr'}){
1480 $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct str_nr'}<br>";
1481 }else{
1482 if(! &validalphanumfield($cgiparams{'txt_str_nr'})){
1483 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct str_nr'}<br>";
1484 }
1485 }
1486
1487 #Check POSTAL-CODE
1488 if (! $cgiparams{'txt_plz'}){
1489 $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct plz'}<br>";
1490 }else{
1491 if(! &validnumfield($cgiparams{'txt_plz'})){
1492 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct plz'}<br>";
1493 }
1494 }
1495
1496 #Check CITY
1497 $errormessage=&checkfield($Lang::tr{'acct city'},$cgiparams{'txt_city'},$errormessage);
1498
1499 #Check E-MAIL
1500 if(! $cgiparams{'txt_email'}){
1501 $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct email'}<br>";
1502 }else{
1503 if (! &General::validemail($cgiparams{'txt_email'})){
1504 $errormessage.="<br>$Lang::tr{'acct invalid'} $Lang::tr{'acct email'}";
1505 }
1506 }
1507
1508 #Check all fields required for companytype "HOST"
1509 if ($cgiparams{'rdo_companytype'} eq 'HOST'){
1510 #Check BANK
1511 $errormessage=&checkfield($Lang::tr{'acct bank'},$cgiparams{'txt_bank'},$errormessage);
1512
1513 #Check IBAN - optional
1514 if($cgiparams{'txt_iban'}){
1515 if(!&validalphanumfield($cgiparams{'txt_iban'})){
1516 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct iban'}<br>";
1517 }
1518 }
1519 if($cgiparams{'txt_bic'}){
1520 if(!&validalphanumfield($cgiparams{'txt_bic'})){
1521 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct bic'}<br>";
1522 }
1523 }
1524 if(($cgiparams{'txt_iban'} && $cgiparams{'txt_blz'})||(!$cgiparams{'txt_iban'} && $cgiparams{'txt_blz'})){
1525 #Check BLZ
1526 if(! &validnumfield($cgiparams{'txt_blz'})){
1527 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct blz'}<br>";
1528 }
1529 #Check BANKACCOUNT
1530 if($cgiparams{'txt_kto'}){
1531 if(! &validnumfield($cgiparams{'txt_kto'})){
1532 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct kto'}<br>";
1533 }
1534 }elsif(!$cgiparams{'txt_kto'}){
1535 $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct kto'}<br>";
1536 }
1537 }elsif(!$cgiparams{'txt_iban'} && !$cgiparams{'txt_blz'}){
1538 $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct blz'}<br>";
1539 #Check BANKACCOUNT
1540 if($cgiparams{'txt_kto'}){
1541 if(! &validnumfield($cgiparams{'txt_kto'})){
1542 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct kto'}<br>";
1543 }
1544 }elsif(!$cgiparams{'txt_kto'}){
1545 $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct kto'}<br>";
1546 }
1547 }
1548
1549 #Check Internet
1550 if($cgiparams{'txt_inet'}){
1551 if ($cgiparams{'txt_inet'} =~ m/([a-z]+:\/\/)??([a-z0-9\-]+\.){1}(([a-z0-9\-]+\.){0,})([a-z0-9\-]+){1}/o) {
1552 $cgiparams{'txt_inet'}=$2.$3.$5;
1553 } else {
1554 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct inet'}<br>";
1555 }
1556 }
1557 #Check Hrb
1558 if($cgiparams{'txt_hrb'}){
1559 $errormessage=&checkfield($Lang::tr{'acct hrb'},$cgiparams{'txt_hrb'},$errormessage);
1560 }
1561
1562 }
1563
1564 #Check Phone
1565 if($cgiparams{'txt_tel'}){
1566 if (!&validphonefield($cgiparams{'txt_tel'})){
1567 $errormessage.="$Lang::tr{'acct invalid'} $Lang::tr{'acct tel'}<br>";
1568 }
1569 }
1570
1571 return $errormessage;
1572}
1573
1574sub checkproxy{
1575 if(-f "${General::swroot}/proxy/enable"){
1576 $proxsrv=$Lang::tr{'running'};
1577 }else{
1578 $proxsrv=$Lang::tr{'stopped'};
1579 }
1580 my $srce = "${General::swroot}/proxy/squid.conf";
1581 my $string1 = 'access\.log';
1582 open(FH, $srce);
1583 while(my $line = <FH>) {
1584 if($line =~ m/$string1/) {
1585 $proxlog=$Lang::tr{'running'};
1586 }
1587 }
1588 close FH;
1589 return;
1590}
1591
1592sub validtextfield{
1593 #GET: Input from a Textfield
1594 #GIVES: True if valid, false if not valid
1595 my $remark = $_[0];
1596
1597 # Each part should be at least two characters in length
1598 # but no more than 63 characters
1599 if (length ($remark) < 1 || length ($remark) > 255) {
1600 return 0;}
1601 # Only valid characters are a-z, A-Z, 0-9 and -
1602 if ($remark !~ /^[a-zĆ¤Ć¶Ć¼A-ZƖƄƜ0-9-.:;\&\|\Ɵ_()\/\s]*$/) {
1603 return 0;}
1604 # First character can only be a letter or a digit
1605 if (substr ($remark, 0, 1) !~ /^[a-zĆ¤Ć¶Ć¼A-ZƖƄƜ0-9(]*$/) {
1606 return 0;}
1607 # Last character can only be a letter or a digit
1608 if (substr ($remark, -1, 1) !~ /^[a-zĆ¶Ć¤Ć¼A-ZƖƄƜ0-9.:;_)]*$/) {
1609 return 0;}
1610 return 1;
1611}
1612
1613sub validnumfield{
1614 #GET: Input from a numeric field
1615 #GIVES: True if valid, false if not valid
1616 my $num = $_[0];
1617
1618 # Each part should be at least two characters in length
1619 # but no more than 63 characters
1620 if (length ($num) < 1 || length ($num) > 255) {
1621 return 0;}
1622 # Only valid characters are a-z, A-Z, 0-9 and -
1623 if ($num !~ /^[0-9.]*$/) {
1624 return 0;}
1625 # First character can only be a letter or a digit
1626 if (substr ($num, 0, 1) !~ /^[0-9]*$/) {
1627 return 0;}
1628 # Last character can only be a letter or a digit
1629 if (substr ($num, -1, 1) !~ /^[0-9]*$/) {
1630 return 0;}
1631 return 1;
1632}
1633
1634sub validphonefield{
1635 #GET: Input from a numeric field
1636 #GIVES: True if valid, false if not valid
1637 my $num = $_[0];
1638
1639 # Each part should be at least two characters in length
1640 # but no more than 63 characters
1641 if (length ($num) < 1 || length ($num) > 255) {
1642 return 0;}
1643 # Only valid characters are a-z, A-Z, 0-9 and -
1644 if ($num !~ /^[0-9-()\+ ]*$/) {
1645 return 0;}
1646 # First character can only be a letter or a digit
1647 if (substr ($num, 0, 1) !~ /^[0-9(\+]*$/) {
1648 return 0;}
1649 # Last character can only be a digit
1650 if (substr ($num, -1, 1) !~ /^[0-9]*$/) {
1651 return 0;}
1652 return 1;
1653}
1654
1655sub validalphanumfield{
1656 #GET: Input from a numeric field
1657 #GIVES: True if valid, false if not valid
1658 my $remark = $_[0];
1659
1660 # Each part should be at least two characters in length
1661 # but no more than 63 characters
1662 if (length ($remark) < 1 || length ($remark) > 255) {
1663 return 0;}
1664 # Only valid characters are a-z, A-Z, 0-9 and -
1665 if ($remark !~ /^[0-9a-zA-Z]*$/) {
1666 return 0;}
1667 # First character can only be a letter or a digit
1668 if (substr ($remark, 0, 1) !~ /^[0-9A-Za-z]*$/) {
1669 return 0;}
1670 # Last character can only be a letter or a digit
1671 if (substr ($remark, -1, 1) !~ /^[0-9a-zA-Z]*$/) {
1672 return 0;}
1673 return 1;
1674}
1675
1676sub error{
1677 if ($errormessage) {
1678 &Header::openbox('100%', 'left', $Lang::tr{'error messages'});
1679 print "<class name='base'>$errormessage\n";
1680 print "&nbsp;</class>\n";
1681 &Header::closebox();
1682 }
1683}
1684
1685sub billgroupsite{
1686 &Header::openpage("$Lang::tr{'acct billgroup'}", 1, '');
1687 &Header::openbigbox('100%', 'center');
1688 &error;
1689 my $host;
1690 my $cust;
1691 my @oldhosts;
1692 my $grp;
1693 my $mailrcpt;
1694 my $ccmailrcpt;
1695 #Get addresses from DB
1696 my $res = &ACCT::getaddresses;
1697 #Check if we need to show NEW-BillGROUP-BOX or Hint
1698 foreach my $row (@$res) {
1699 my ($gr,$comp,$type,$name1,$str,$nr,$plz,$city,$bank,$iban,$bic,$blz,$kto,$email,$inet,$hrb,$ust,$tel,$fax,$ccmail) = @$row;
1700 $grp=$gr;
1701 $mailrcpt=$email;
1702 $ccmailrcpt=$ccmail;
1703 if ($type eq 'HOST'){
1704 $host=1;
1705 }
1706 if ($type eq 'CUST'){
1707 $cust=1;
1708 }
1709 }
1710if ($host && $cust){
1711 #Fill CCMAIL
1712 if (!$cgiparams{'txt_ccmail'}){
1713 $cgiparams{'txt_ccmail'}=$ccmailrcpt;
1714 }
1715 &Header::openbox('100%', 'left',"$Lang::tr{'acct edit_addr'}" );
1716 print<<END;
1717 <form method='post' action='$ENV{'SCRIPT_NAME'}' ENCTYPE='multipart/form-data'>
1718 <table style='width:100%;'>
1719 <tr>
e3edceeb 1720 <td style='width: 22em;'>$Lang::tr{'name'}&nbsp;<img src='/blob.gif' alt='*' /></td>
db8a01e0
AM
1721 <td><input type='text' name='txt_billgroup' value='$cgiparams{'txt_billgroup'}' style='width: 24em;'></td>
1722 </tr>
1723 <tr>
1724 <td><br></td>
1725 </tr>
1726 <tr>
e3edceeb 1727 <td valign='top'>$Lang::tr{'acct billtext1'}</td>
db8a01e0
AM
1728 <td><textarea name='txt_billtext1' cols='40' rows='5' style='width: 24em;' maxlength='300'>$cgiparams{'txt_billtext1'}</textarea></td>
1729 </tr>
1730 <tr><td><br></td></tr>
1731END
1732 #Print Dropdown Menu for HOSTER and CUSTOMER
1733 print "<tr><td>$Lang::tr{'acct hoster'}</td><td><select name='dd_host' style='width: 24.3em;'>";
1734 foreach my $row (@$res) {
1735 my ($gr,$comp,$type) = @$row;
1736 if ($type eq 'HOST'){
1737 if($cgiparams{'dd_host'} eq $comp){
1738 print"<option selected>$comp</option>";
1739 }else{
1740 print"<option>$comp</option>";
1741 }
1742 }
1743 }
1744 print "</select></td></tr><tr><td><br></td></tr>";
1745 print "<tr><td>$Lang::tr{'acct customer'}</td><td><select name='dd_cust' style='width: 24.3em;'>";
1746 foreach my $row (@$res) {
1747 my ($gr,$comp,$type) = @$row;
1748 if ($type eq 'CUST'){
1749 if($cgiparams{'dd_cust'} eq $comp){
1750 print"<option selected>$comp</option>";
1751 }else{
1752 print"<option>$comp</option>";
1753 }
1754 }
1755 }
1756 print "</select></td></tr>";
1757 print "<tr><td><br></td></tr>";
1758 #Print multiselectbox for hosts/users which should be part of this group
1759 my $hosts=&ACCT::gethosts;
1760 print"<tr><td valign='top'>$Lang::tr{'acct members'}</td><td><select name='sel_hosts' multiple size='8' style='width: 24em;' >";
1761 #If update, split $cgiparams{'sel_hosts'} and preselect values from selectbox
1762 if($cgiparams{'update'} eq 'on'){
1763 $cgiparams{'oldname'}=$cgiparams{'txt_billgroup'};
1764 @oldhosts=split(/\|/,$cgiparams{'sel_hosts'});
1765 }
1766 foreach my $row (@$hosts) {
1767 my ($val)=@$row;
1768 my $sel=0;
1769 foreach my $old (@oldhosts){
1770 if ($old eq $val){
1771 $sel=1;
1772 }
1773 }
1774 if ($sel){
1775 print"<option selected>$val</option>";
1776 }else{
1777 print"<option>$val</option>";
1778 }
1779 }
1780 print"</select></td></tr>";
1781 print "<tr><td><br></td></tr>";
1782 #set right decimal seperator for cent value
1783 setlocale(LC_NUMERIC,"$mainsettings{'LANGUAGE'}_$uplang");
1784 my $val=sprintf"%.3f",$cgiparams{'txt_cent'};
1785 print"<tr><td>$Lang::tr{'acct cent'}</td><td><input type='text' name='txt_cent' value='$val' size='3'>$settings{'CURRENCY'} </td></tr>";
1786 #Optional note
e3edceeb 1787 print"<tr><td colspan='2' align='left'><img src='/blob.gif' alt='*' /><font size='1'>$Lang::tr{'required field'}</font></td></tr>";
db8a01e0
AM
1788 print"<tr><td colspan='2' align='right'><br><br>";
1789 print"</td></tr></table>";
1790
1791 #LOGO Upload if update eq 'on'
1792 if ($cgiparams{'update'} eq 'on'){
1793 print<<END;
1794 <table style='width:100%;'>
1795 <tr>
1796 <td style='width: 22em;'>$Lang::tr{'acct logo upload'}</td>
1797 <td><INPUT TYPE="file" NAME="uploaded_file" SIZE=30 MAXLENGTH=80></td>
1798 <input type='hidden' name='logo_grp' value='$cgiparams{'txt_billgroup'}' />
1799 </tr>
1800 <tr>
1801 <td><br>$Lang::tr{'acct logo'}</td>
1802END
1803 #Show Logo in webinterface with 1/2 size if set
1804 if (-f "$logopath/$cgiparams{'txt_billgroup'}/logo.png"){
1805 print"<td><img src='/accounting/logo/$cgiparams{'txt_billgroup'}/logo.png' alt='$logopath/$cgiparams{'txt_billgroup'}/logo.png' width='25%' height='25%' /></td></tr>";
1806 }else{
1807 print"<td><br>$Lang::tr{'no'}</td></tr>";
1808 }
1809 #Show optional CC Mailadresses
1810 print<<END;
1811 <tr>
1812 <td><br>$Lang::tr{'acct mailrcpt'}</td>
1813 <td><br>$mailrcpt</td>
1814 </tr>
1815 <tr>
1816 <td><br>$Lang::tr{'acct ccmail'}</td>
1817 <td><br><input type='text' name='txt_ccmail' value='$cgiparams{'txt_ccmail'}' style='width: 24.3em;'></td>
1818 </tr>
1819
1820
1821
1822END
1823 print"</table>";
1824 }
1825 print"<table style='width:100%;'><tr><td align='right'>";
1826 #Print SAVE or EDIT Button
1827 if($cgiparams{'update'} eq 'on'){
1828 print "<input type='submit' name='BILLACTION' value='$Lang::tr{'update'}'>";
1829 print "<input type='hidden' name='oldname' value='$cgiparams{'oldname'}'>";
1830 print "<input type='hidden' name='oldccmail' value='$ccmailrcpt'>";
1831 }else{
1832 print "<input type='submit' name='BILLACTION' value='$Lang::tr{'save'}'>";
1833 }
1834 print"</td></tr></table><br></form><br>";
1835 &Header::closebox();
1836#BackButton
1837 print<<END;
1838 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1839 <table style='width:100%;'>
1840 <tr>
1841 <td align='right'>
1842 <input type='submit' name='ACTION' value='$Lang::tr{'back'}'>
1843 </td>
1844 </tr>
1845 </table>
1846 </form>
1847END
1848 #Show Box for fixed positions if update
1849 if ($cgiparams{'update'} eq 'on'){
1850 &viewtablebillpos($cgiparams{'txt_billgroup'});
1851 }
1852 if($grp >0){
1853 &viewtablebillgroups;
1854 }
1855
1856}else{
1857 &Header::openbox('100%', 'left',"$Lang::tr{'hint'}" );
1858 print "$Lang::tr{'acct hint billgrp'}";
1859 &Header::closebox();
1860 #BackButton
1861print<<END;
1862 <table style='width:100%;'>
1863 <tr>
1864 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1865 <td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'back'}'></td>
1866 </form>
1867 </tr>
1868 </table>
1869END
1870}
1871 &Header::closebigbox();
1872 &Header::closepage();
1873 exit 0;
1874}
1875
1876sub viewtablebillgroups{
1877 $count=0;
1878 &Header::openbox('100%', 'left',"$Lang::tr{'acct billgroup'}" );
1879 #Get DATA from table BILLINGGRP
1880 my $res = &ACCT::getbillgroups;
1881
1882 #Print table billinggroup
1883 print<<END;
1884 <table style='width:100%;' cellspacing='0' class='tbl'>
1885 <tr>
1886 <th align='left'>$Lang::tr{'name'}</th>
1887 <th align='left'>$Lang::tr{'acct hoster'}</th>
1888 <th align='left'>$Lang::tr{'acct customer'}</th>
1889 <th align='left'>$Lang::tr{'acct members'}</th>
1890 <th align='left' colspan='5'></th>
1891 </tr>
1892END
1893 foreach my $line (@$res){
1894 $count++;
1895 if($count % 2){
1896 $col="style='background-color:$color{'color22'}'";
1897 }else{
1898 $col="style='background-color:$color{'color20'}'";
1899 }
1900 my ($name,$host,$cust,$txt,$amount,$cent) = @$line;
1901 print<<END;
1902 <tr>
1903 <td $col>$name</td>
1904 <td $col>$host</td>
1905 <td $col>$cust</td>
1906 <td $col>$amount</td>
1907 <td width='1%' $col>
1908END
1909 my $members=&ACCT::listhosts($name);
1910 my @mem=split(/\|/,$members);
1911 my $msg;
1912 foreach my $m (@mem){
1913 $msg.=$m."\n";
1914 }
1915 print"<img src='/images/computer.png' alt=$Lang::tr{'acct members'} title='".$msg."' /></td>";
1916 print<<END;
1917
1918 <td width='1%' $col>
1919 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1920 <input type='image' src='/images/edit.gif' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' />
1921 <input type='hidden' name='BILLACTION' value='edit_billgroup'>
1922 <input type='hidden' name='txt_billgroup' value='$name'>
1923 <input type='hidden' name='txt_billtext1' value='$txt'>
1924 <input type='hidden' name='dd_host' value='$host'>
1925 <input type='hidden' name='dd_cust' value='$cust'>
1926 <input type='hidden' name='sel_hosts' value='$members'>
1927 <input type='hidden' name='txt_cent' value='$cent'>
1928 </form>
1929 </td>
1930
1931 <td width='1%' $col>
1932 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1933 <input type='image' src='/images/folder-open.png' alt='$Lang::tr{'edit'}' title='$Lang::tr{'acct billarchive'}' />
1934 <input type='hidden' name='BILLACTION' value='open_billgroup'>
1935 <input type='hidden' name='txt_billgroup' value='$name'>
1936 </form>
1937 </td>
1938
1939 <td width='1%' $col>
1940 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1941 <input type='image' src='/images/document-new.png' alt='$Lang::tr{'acct preview'}' title='$Lang::tr{'acct preview'}' />
1942 <input type='hidden' name='BILLACTION' value='open_preview'>
1943 <input type='hidden' name='txt_billgroup' value='$name'>
1944 </form>
1945 </td>
1946 <td width='1%' $col>
1947 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1948 <input type='image' src='/images/delete.gif' alt=$Lang::tr{'delete'} title="$Lang::tr{'delete'}" />
1949 <input type='hidden' name='BILLACTION' value='delete_billgroup'>
1950 <input type='hidden' name='txt_billgroup' value='$name'>
1951 </form>
1952 </td>
1953 </tr>
1954END
1955 }
1956 print "</table>";
1957 &ACCT::closedb;
1958 &Header::closebox();
1959}
1960
1961sub viewtablehosts{
1962 $dbh=&ACCT::connectdb;
1963 &Header::openbox('100%', 'left', $Lang::tr{'acct hosts'});
0fa8d28e
AM
1964 my $mon1=$_[0];
1965 my $year1=$_[1];
1966 my ($from,$till)=&ACCT::getmonth($mon1,$year1);
db8a01e0
AM
1967 $count=0;
1968 #Menu to display another month
1969 print<<END;
1970 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
1971 <table style='width:100%;'>
1972 <tr>
1973 <td style='width:5%; text-align:center;'>$Lang::tr{'acct month'}</td>
1974 <td style='width:10%; text-align: center;'>$Lang::tr{'acct year'}</td>
1975 <td></td>
1976 </tr>
1977 <tr>
1978 <td><select name='month'>
1979END
1980 for (my $i=1;$i<13;$i++){
1981 if(($_[0]) eq $i){
1982 print"<option selected>$i</option>";
1983 }else{
1984 print"<option>$i</option>";
1985 }
1986 }
1987 print<<END;
1988 </select></td>
1989 <td style='text-align: center;'><select name='year'>
1990END
0fa8d28e 1991 for (my $j=2014;$j<=($year1);$j++){
db8a01e0
AM
1992 if(($_[1]) eq $j){
1993 print"<option selected>$j</option>";
1994 }else{
1995 print"<option>$j</option>";
1996 }
1997 }
1998 print<<END;
1999 </select></td>
2000 <td><input type='submit' name='ACTION' value='$Lang::tr{'acct view'}'></td>
2001 </tr>
2002 </table></form>
2003 <br>
2004END
2005 #View table with all hosts
2006 print<<END;
2007 <table style='width:100%;' class='tbl'>
2008 <tr>
2009 <th>$Lang::tr{'name'}</th>
2010 <th>$Lang::tr{'acct traffic'}</th>
2011 <th>$Lang::tr{'from'}</th>
2012 <th>$Lang::tr{'to'}</th>
2013 <th></th>
2014 </tr>
2015END
0fa8d28e
AM
2016 my $res;
2017 if (($mon)+1 == $mon1 && ($year)+1900 == $year1){
2018 $res = $dbh->selectall_arrayref("SELECT SUM(BYTES),min(TIME_RUN),max(TIME_RUN),NAME from ACCT where TIME_RUN between ".$from." and ".$till." group by NAME;");
2019 }else{
2020 $res = $dbh->selectall_arrayref("SELECT SUM(BYTES),min(strftime('%s',TIME_RUN)),max(strftime('%s',TIME_RUN)),NAME from ACCT_HIST where date(TIME_RUN) > date($from,'unixepoch') and date(TIME_RUN) < date($till,'unixepoch') group by NAME;");
2021 }
db8a01e0
AM
2022 my $sumbytes;
2023 my $type;
2024 my $lineval;
2025 if (@$res){
2026 foreach my $row (@$res) {
2027 $count++;
2028 $lineval='';
2029 $type='';
2030 if($count % 2){
2031 $col="background-color:$color{'color22'};";
2032 }else{
2033 $col="background-color:$color{'color20'};";
2034 }
2035 my ($bytes, $mintime, $maxtime, $name) = @$row;
2036 $sumbytes +=$bytes;
2037 ($lineval,$type) = &calcbytes($bytes);
2038 #Print Line
2039 print"<tr><td style='$col'>$name</td><td style='$col text-align: right;'>$lineval $type</td><td style='$col text-align: center;'>".&getdate($mintime)."</td><td style='$col text-align: center;'>".&getdate($maxtime)."</td>";
2040 print<<END;
2041 <td style='$col'>
2042 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
2043 <input type='image' src='/images/utilities-system-monitor.png' alt="$Lang::tr{'status'}" title="$Lang::tr{'status'}" />
2044 <input type='hidden' name='ACTION' value='viewgraph'>
2045 <input type='hidden' name='host' value='$name'>
0fa8d28e
AM
2046 <input type='hidden' name='month' value='$mon1'>
2047 <input type='hidden' name='year' value='$year1'>
db8a01e0
AM
2048 <input type='hidden' name='traffic' value="$Lang::tr{'acct sum'} $Lang::tr{'acct traffic'} $lineval $type">
2049 </form>
2050
2051 </td>
2052 </tr>
2053END
2054 }
2055 }else{
2056 print "<tr><td colspan='5'><center>$Lang::tr{'acct no data'}</td></tr>";
2057 }
2058 print "</table>";
2059 &Header::closebox();
2060 &ACCT::closedb;
2061}
2062
2063sub viewtablebillpos{
2064 my $grp=$_[0];
2065 #BOX for extra billpositions
2066 &Header::openbox('100%', 'left',"$Lang::tr{'acct fix billpos'} $grp" );
2067 #Table for optional billpositions
2068 print<<END;
2069 <center><table style='width:65%' cellspacing='0' class='tbl' border='0'>
2070 <tr>
2071 <th align='left'>$Lang::tr{'acct amount'}</th>
2072 <th align='left' style='padding-left:1.2em'>$Lang::tr{'acct name'}</th>
2073 <th align='left'>$Lang::tr{'acct price pp'}</th>
2074 <th></th>
2075 </tr>
2076END
2077 #Fill Table for extra billpositions if any
2078 if ($cgiparams{'update'} eq 'on'){
2079 my $res = &ACCT::getextrabillpos($cgiparams{'txt_billgroup'});
2080 $count=0;
2081 foreach my $line (@$res){
2082 $count++;
2083 if($count % 2){
2084 $col="style='background-color:$color{'color22'}'";
2085 }else{
2086 $col="style='background-color:$color{'color20'}'";
2087 }
2088 my ($grp,$amnt,$pos,$price) = @$line;
2089 setlocale(LC_NUMERIC,"$mainsettings{'LANGUAGE'}_$uplang");
2090 my $locale_price=sprintf"%.2f",$price;
2091 print "<tr><form method='post' action='$ENV{'SCRIPT_NAME'}'><td $col style='padding-right:1.2em' align='right'>$amnt</td><td $col style='padding-left:1.2em'>$pos</td><td $col style='padding-right:1.2em' align='right'>$locale_price $settings{'CURRENCY'}</td>";
2092 print "<td $col><input type='image' src='/images/delete.gif' alt=$Lang::tr{'delete'} title=$Lang::tr{'delete'} >";
2093 print "<input type='hidden' name='BILLPOS' value='delpos'>";
2094 print "<input type='hidden' name='txt_billgroup' value='$grp'>";
2095 print "<input type='hidden' name='txt_billpos' value='$pos'></form></tr>";
2096 }
2097 }
2098 print<<END;
2099 <tr>
2100
2101 <td ><form method='post' action='$ENV{'SCRIPT_NAME'}'><input type='text' name='txt_amount' value='$cgiparams{'txt_amount'}' size='3'></td>
2102 <td><input type='text' name='txt_name' value='$cgiparams{'txt_name'}' size='40'></td>
2103 <td ><input type='text' name='txt_price' value='$cgiparams{'txt_price'}' size='6'></td>
2104 <td></td>
2105 </tr>
2106 </table><br>
2107 <table style='width:100%'>
2108 <tr>
2109 <td align='right'><input type='submit' name='BILLPOS' value='$Lang::tr{'save'}'></td>
2110 <input type='hidden' name='txt_billgroup' value='$grp'>
2111 </form>
2112 </tr>
2113 </table></form>
2114END
2115
2116 &Header::closebox();
2117}
2118
2119sub billoverview{
2120 my $grp=shift;
2121 my $col;
2122 my $count=0;
2123 #Open site
2124 &Header::openpage($Lang::tr{'acct billoverview'}, 1, '');
2125 &Header::openbigbox('100%', 'center');
2126 &Header::openbox('100%', 'left', $grp);
2127 my $res=&ACCT::getbills($grp);
2128
2129 if (@$res > 0){
2130 print<<END;
2131 <table style='width:100%' cellspacing='0' class='tbl' border='0'>
2132 <tr>
2133 <th>$Lang::tr{'acct nr'}</th>
2134 <th>$Lang::tr{'acct path'}</th>
2135 <th>$Lang::tr{'name'}</th>
2136 <th>$Lang::tr{'acct generated'}</th>
2137 <th></th>
2138 </tr>
2139
2140END
2141 foreach my $row (@$res){
2142 $count++;
2143 if($count % 2){
2144 $col="style='background-color:$color{'color22'}'";
2145 }else{
2146 $col="style='background-color:$color{'color20'}'";
2147 }
2148 my ($no,$path,$name,$date,$dbgrp) = @$row;
2149
2150 print "<tr><td $col>$no</td><td $col>$path</td><td $col>$name</td><td $col>$date</td><td $col>";
2151 print "<form method='post' action='$ENV{'SCRIPT_NAME'}'><input type='image' src='/images/updbooster/updxl-src-adobe.gif' alt='$Lang::tr{'edit'}' title='$Lang::tr{'edit'}' />";
2152 print "<input type='hidden' name='BILLVIEW' value='show'>";
2153 my $file="$path/$name";
2154 print "<input type='hidden' name='file' value='$file'>";
2155 print "<input type='hidden' name='name' value='$name'>";
2156 print"</form></td></tr>";
2157 }
2158 print "</table><br>";
2159 }else{
2160 print "<center>$Lang::tr{'acct no data'}";
2161 }
2162 &Header::closebox();
2163
2164 #BackButton
2165print<<END;
2166 <table style='width:100%'>
2167 <tr>
2168 <form method='post' action='$ENV{'SCRIPT_NAME'}'>
2169 <td align='right'><input type='submit' name='ACTION' value='$Lang::tr{'back'}'></td>
2170 </form>
2171 </tr>
2172 </table>
2173END
2174 &Header::closebigbox();
2175 &Header::closepage();
2176 exit 0;
2177}
2178
2179sub checkmailsettings{
db8a01e0
AM
2180 #Check valid sender
2181 if(! $cgiparams{'txt_mailsender'}){
2182 $errormessage.="$Lang::tr{'acct empty field'} $Lang::tr{'acct mailsender'}<br>";
2183 }else{
2184 if (! &General::validemail($cgiparams{'txt_mailsender'})){
2185 $errormessage.="<br>$Lang::tr{'acct invalid'} $Lang::tr{'acct mailsender'}<br>";
2186 }
2187 }
2188 return $errormessage;
2189}