]>
git.ipfire.org Git - people/jschlag/ipfire-2.x.git/blob - src/squid-accounting/accounting.cgi
2 ###############################################################################
4 # IPFire.org - A linux based firewall #
5 # Copyright (C) 2014 IPFire Team <alexander.marx@ipfire.org> #
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. #
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. #
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/>. #
20 ###############################################################################
32 # enable only the following on debugging purpose
34 #use CGI::Carp 'fatalsToBrowser';
36 require '/var/ipfire/general-functions.pl' ;
37 require "${General::swroot}/lang.pl" ;
38 require "${General::swroot}/header.pl" ;
39 require "${General::swroot}/accounting/acct-lib.pl" ;
41 unless (- e
"${General::swroot}/accounting/settings.conf" ) { system ( "touch ${General::swroot}/accounting/settings.conf" ); }
43 my $settingsfile = "${General::swroot}/accounting/settings.conf" ;
44 my $proxyenabled = "${General::swroot}/proxy/enable" ;
45 my $logopath = "/srv/web/ipfire/html/accounting/logo" ;
50 my ( $sec , $min , $hour , $mday , $mon , $year , $wday , $ydat , $isdst )= localtime ();
57 my $proxlog = $Lang :: tr
{ 'stopped' };
58 my $proxsrv = $Lang :: tr
{ 'stopped' };
59 my $mailfile = "${General::swroot}/dma/mail.conf" ;
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 );
67 & General
:: readhash
( $mailfile , \
%mail );
70 #Find out which lang is set (used later to set decimal separator correctly)
71 my $uplang = uc ( $mainsettings { 'LANGUAGE' });
72 setlocale LC_NUMERIC
, " $mainsettings {'LANGUAGE'}_ $uplang " ;
74 if ( $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 " ;
86 if ( $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 );
100 my $tempfile =& ACCT
:: pdf2
( \
@billar , $actmonth , $actyear , $mwst , $address_cust , $address_host , $billpos , $rggrp , $cur , "on" );
102 open ( DLFILE
, "< $tempfile " ) or die "Unable to open tmp.pdf: $!" ;
103 my @fileholder = < DLFILE
>;
104 print "Content-Type:application/pdf \n " ;
105 my @fileinfo = stat ( $tempfile );
106 print "Content-Length: $fileinfo [7] \n " ;
107 print "Content-Disposition:attachment;filename='tmp.pdf'; \n\n " ;
113 & Header
:: showhttpheaders
();
115 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'acct config'}" ){ #ConfigButton from Menu
118 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'acct addresses'}" ){ #AddressmgmntButton from Menu
121 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'acct billgroup'}" ){ #BillgroupButton from Menu
124 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'acct maintenance'}" ){ #MaintenanceButton from Menu
127 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'save'}" ){ #SaveButton on configsite
128 my @val = split ( ' \r\n ' , $cgiparams { 'txt_skipurls' });
130 foreach my $line ( @val ){
131 $skipurls .= "|" . $line ;
133 $skipurls = $skipurls . "|" ;
134 $skipurls =~ s/\|\|/\|/g ;
135 my @txt = split ( ' \r\n ' , $cgiparams { 'txt_mailtxt' });
137 foreach my $txt ( @txt ){
141 if ( $cgiparams { 'USEMAIL' } eq 'on' ){
142 $errormessage =& checkmailsettings
;
143 } elsif ( $cgiparams { 'USEMAIL' } ne 'on' ){
144 $cgiparams { 'txt_mailsender' }= '' ;
145 $cgiparams { 'txt_mailsubject' }= '' ;
149 open ( TXT
, "> $settingsfile " ) or die ( "Die Datei konnte nicht geöffnet werden: $! \n " );
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' };
158 $settings { 'MAILSENDER' } = $cgiparams { 'txt_mailsender' };
159 $settings { 'MAILSUB' } = $cgiparams { 'txt_mailsubject' };
160 $settings { 'MAILTXT' } = $mailtxt ;
161 & General
:: writehash
( " $settingsfile " , \
%settings );
163 $cgiparams { 'update' }= 'on' ;
167 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'acct view'}" ){ #If special month and year is given on mainsite
168 & mainsite
( $cgiparams { 'month' }, $cgiparams { 'year' });
171 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'acct commit'}" ){ #Maintenance function
172 & ACCT
:: logger
( $settings { 'LOG' }, "Clear DB (all data) committed). \n " );
176 if ( $cgiparams { 'ACTION2' } eq " $Lang ::tr{'acct commit'}" ){ #Maintenance function
177 & ACCT
:: logger
( $settings { 'LOG' }, "Clear DB (only traffic data) committed). \n " );
181 if ( $cgiparams { 'ACTION1' } eq " $Lang ::tr{'acct commit'}" ){ #Maintenance Function
183 my ( $a , $b )=& ACCT
:: getmonth
( $cgiparams { 'expmonth' }, $cgiparams { 'expyear' });
184 & ACCT
:: delbefore
(( $a - 1 ));
187 if ( $cgiparams { 'ACTION' } eq "viewgraph" ){ #Graph icon on hosttable (viewhosttable)
188 & graphsite
( $cgiparams { 'month' }, $cgiparams { 'year' }, $cgiparams { 'host' });
190 if ( $cgiparams { 'ACTION1' } eq " $Lang ::tr{'save'}" ){ #SaveButton when adding Address
191 $errormessage =& checkaddress
;
194 & addressmgmnt
( $errormessage );
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' },
216 & ACCT
:: logger
( $settings { 'LOG' }, "Created new address $cgiparams {'txt_company'} as $cgiparams {'rdo_companytype'}. \n " );
221 if ( $cgiparams { 'ACTION' } eq "edit_addr" ){ #Pencil icon in Address overwiev on Addressmgmnt site
222 $cgiparams { 'update' } = 'on' ;
223 $cgiparams { 'oldcompname' }= $cgiparams { 'txt_company' };
226 if ( $cgiparams { 'ACTION' } eq " $Lang ::tr{'update'}" ){ #UpdateButton when editing Address
227 $cgiparams { 'update' } = 'on' ;
228 $errormessage =& checkaddress
;
230 & addressmgmnt
( $errormessage );
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' }
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' });
263 & ACCT
:: logger
( $settings { 'LOG' }, "Edited address $cgiparams {'oldcompname'}. \n " );
268 if ( $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 " ;
275 if ( $cgiparams { 'txt_company' } eq $cust ){
276 $errormessage = " $Lang ::tr{'acct err custdel'} $grp " ;
279 if (! $errormessage ){
280 & ACCT
:: deladdr
( $cgiparams { 'txt_company' });
281 & ACCT
:: logger
( $settings { 'LOG' }, "Deleted address $cgiparams {'txt_company'}. \n " );
283 $cgiparams { 'txt_company' }= '' ;
286 if ( $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 ) {
291 if ( $group eq $cgiparams { 'txt_billgroup' }){
292 $errormessage .= $Lang :: tr
{ 'acct billgroupexists' };
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 ){
304 $errormessage .= " $usr $Lang ::tr{'acct usermulti'} $grp <br>" ;
310 if (!& validtextfield
( $cgiparams { 'txt_billgroup' })){
311 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'name'}<br>" ;
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>" ;
320 my @ips = split ( /\|/ , $cgiparams { 'sel_hosts' });
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>" ;
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>" ;
340 & billgroupsite
( $errormessage );
342 #check if we use extra positions
343 if ( $cgiparams { 'txt_amount' }){
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 " );
353 & ACCT
:: savebillgroup
(
354 $cgiparams { 'txt_billgroup' },
355 $cgiparams { 'txt_billtext1' },
356 $cgiparams { 'dd_host' },
357 $cgiparams { 'dd_cust' },
358 $cgiparams { 'txt_cent' },
360 & ACCT
:: logger
( $settings { 'LOG' }, "Saved new billgroup $cgiparams {'txt_billgroup'}. \n " );
365 if ( $cgiparams { 'BILLACTION' } eq " $Lang ::tr{'update'}" ){ #UpdateButton when editing BillingGroups
368 my $filename = $cgiparams { 'uploaded_file' };
370 #First check if logo dir exists
371 if (! - d
" $logopath / $cgiparams {'logo_grp'}" ){
372 mkpath
( " $logopath / $cgiparams {'logo_grp'}" , 0 , 01777 );
375 my ( $filehandle ) = CGI
:: upload
( 'uploaded_file' );
376 open ( UPLOADFILE
, "> $logopath / $cgiparams {'logo_grp'}/logo.png" );
378 while ( < $filehandle > ) {
383 #Check dimensions of uploaded file
384 open ( PNG
, "< $logopath / $cgiparams {'logo_grp'}/logo.png" ) ;
388 my ( $width , $height )=& ACCT
:: pngsize
( $PNG1 ) ;
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" );
399 #Check if a group with the same name already exists in DB
400 my $res =& ACCT
:: getbillgroups
;
401 foreach my $row ( @
$res ) {
403 if (( $group eq $cgiparams { 'txt_billgroup' }) && ( $cgiparams { 'oldname' } ne $cgiparams { 'txt_billgroup' })){
404 $errormessage .= $Lang :: tr
{ 'acct billgroupexists' };
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>" ;
422 if (!& validtextfield
( $cgiparams { 'txt_billgroup' })){
423 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'name'}" ;
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>" ;
433 my @ips = split ( /\|/ , $cgiparams { 'sel_hosts' });
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>" ;
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>" ;
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>" ;
463 $cgiparams { 'update' } = 'on' ;
466 #update fixedbillpositions if defined
467 if ( $cgiparams { 'oldname' } ne $cgiparams { 'txt_billgroup' }){
468 & ACCT
:: updatebillpos
( $cgiparams { 'oldname' }, $cgiparams { 'txt_billgroup' });
470 #Check if we use extra positions
471 if ( $cgiparams { 'txt_amount' }){
473 $cgiparams { 'txt_billgroup' },
474 $cgiparams { 'txt_amount' },
475 $cgiparams { 'txt_name' },
476 $cgiparams { 'txt_price' });
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' });
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' },
494 if ( $cgiparams { 'BILLACTION' } eq "edit_billgroup" ){ #Pencil icon in Billgroup table
495 $cgiparams { 'update' } = 'on' ;
498 if ( $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 " );
505 if ( $cgiparams { 'BILLACTION' } eq "open_billgroup" ){ #Folder icon on billgrouptable (viewtablebillgroup)
506 & billoverview
( $cgiparams { 'txt_billgroup' });
508 if ( $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 " );
514 if ( $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>" ;
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>" ;
535 & billgroupsite
( $errormessage );
537 #check if we use extra positions
538 if ( $cgiparams { 'txt_amount' }){
540 $cgiparams { 'txt_billgroup' },
541 $cgiparams { 'txt_amount' },
542 $cgiparams { 'txt_name' },
543 $cgiparams { 'txt_price' });
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 " );
552 #Check if we already have settings
553 if ( - z
$settingsfile ){
556 & mainsite
(( $mon + 1 ),( $year + 1900 ));
562 my $blockactivation = '' ;
563 #If update set fieldvalues new
564 if ( $cgiparams { 'update' } eq 'on' ){
565 $settings { 'USEMAIL' } = 'on' ;
566 $settings { 'MAILSUB' } = $cgiparams { 'txt_mailsubject' };
567 $settings { 'MAILTXT' } = $cgiparams { 'txt_mailtxt' };
570 $checked { 'expert' }{ $settings { 'EXPERT' }} = 'CHECKED' ;
571 $checked { 'logging' }{ $settings { 'LOG' }} = 'CHECKED' ;
572 $checked { 'multiuser' }{ $settings { 'MULTIUSER' }} = 'CHECKED' ;
573 $checked { 'usemail' }{ $settings { 'USEMAIL' }} = 'CHECKED' ;
576 & Header
:: openpage
( $Lang :: tr
{ 'acct settings' }, 1 , '' );
577 & Header
:: openbigbox
( '100%' , 'center' );
579 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'acct config' });
581 #### JAVA SCRIPT ####
584 \$(document).ready(function() {
585 // Show/Hide elements when NAT checkbox is checked.
586 if (\$("#MAIL").attr("checked")) {
589 \$(".MAILSRV").hide();
592 // Show NAT area when "use nat" checkbox is clicked
593 \$("#MAIL").change(function() {
594 \$(".MAILSRV").toggle();
600 #######################
601 $settings { 'SKIPURLS' } =~ tr/|/\r\n/ ;
602 $settings { 'MAILTXT' } =~ tr/|/\r\n/ ;
603 my $col = "style='background-color: $color {'color22'}'" ;
605 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
606 <table style='width:100%'>
608 <th colspan='3'></th>
611 <td style='width:24em'> $Lang ::tr{'acct logging'}</td>
612 <td><input type='checkbox' name='logging' $checked {'logging'}{'on'}></td>
616 <td> $Lang ::tr{'acct expert'}</td>
617 <td><input type='checkbox' name='expert' $checked {'expert'}{'on'}></td>
621 <td> $Lang ::tr{'acct multiuser'}</td>
622 <td><input type='checkbox' name='multiuser' $checked {'multiuser'}{'on'}></td>
626 <td> $Lang ::tr{'acct mwst'}</td>
627 <td><input type='text' name='txt_mwst' value=' $settings {'MWST'}' style='width:22em;'></td>
631 <td> $Lang ::tr{'acct currency'}</td>
632 <td><input type='text' name='txt_currency' value=' $settings {'CURRENCY'}' style='width:22em;'></td>
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>
642 if ( $mail { 'USEMAIL' } eq 'on' ){
643 if (! $settings { 'MAILSENDER' }){
644 $settings { 'MAILSENDER' } = $mail { 'SENDER' };
648 <td> $Lang ::tr{'acct usemail'}</td>
649 <td><label><input type='checkbox' name='USEMAIL' id='MAIL' $checked {'usemail'}{'on'}></label></td>
657 <div class="MAILSRV">
658 <table style='width:100%;'>
660 <td style='width:24em'> $Lang ::tr{'acct mailsender'}</td>
661 <td><input type='text' name='txt_mailsender' value=' $settings {'MAILSENDER'}' style='width:22em;'></td>
664 <td> $Lang ::tr{'acct subject'}</td>
665 <td><input type='text' name='txt_mailsubject' value=' $settings {'MAILSUB'}' style='width:22em;'></td>
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>
674 <table style='width:100%;'>
676 <td colspan='3' display:inline align='right'><input type='submit' name='ACTION' value=' $Lang ::tr{'save'}'></td>
685 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
686 <table style='width:100%;'>
689 <td align='right'><input type='submit' name='ACTION' value=' $Lang ::tr{'back'}'></td>
694 & Header
:: closebigbox
();
695 & Header
:: closepage
();
701 rmtree
( " $logopath / $grp " );
702 rmtree
( "${General::swroot}/accounting/bill/ $grp " );
708 if ( $_ [ 0 ]){ $mon = $_ [ 0 ];}
709 & Header
:: openpage
( $Lang :: tr
{ 'acct title' }, 1 , '' );
710 & Header
:: openbigbox
( '100%' , 'center' );
714 & viewtablehosts
(( $mon ), $year );
715 & Header
:: closebigbox
();
716 & Header
:: closepage
();
720 & Header
:: openpage
( $Lang :: tr
{ 'acct maintenance' }, 1 , '' );
721 & Header
:: openbigbox
( '100%' , 'center' );
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
728 find
( sub { $sizerrd += - s
if - f
$_ }, "${General::swroot}/accounting/bill" );
729 $sizerrd = sprintf "%.2f" , $sizerrd /( 1024 * 1024 );
732 #Get latest and earliest entry of DB
733 my ( $min , $max ) = & ACCT
:: getminmax
;
737 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'acct status' });
739 <table style='width:100%;' cellspacong='0' class='tbl'>
741 <th align='left' width='30%'> $Lang ::tr{'name'}</th>
742 <th align='left'> $Lang ::tr{'acct value'}</th>
745 <td> $Lang ::tr{'acct dbsize'}</td>
749 <td> $Lang ::tr{'acct rrdsize'}</td>
753 <td> $Lang ::tr{'acct oldestdb'}</td>
757 <td> $Lang ::tr{'acct latestdb'}</td>
764 #print Database maintenance table
765 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'acct dbmaintenance' });
768 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
769 <table style='width:100%;' cellspacing='0' class='tbl'>
771 <th> $Lang ::tr{'acct task'}</th>
772 <th> $Lang ::tr{'acct parameter'}</th>
773 <th> $Lang ::tr{'acct action'}</th>
776 <td> $Lang ::tr{'acct emptydb'}</td>
778 <td><input type='submit' name='ACTION2' value=' $Lang ::tr{'acct commit'}' style='width:10em'></td>
781 <td> $Lang ::tr{'acct emptydbtraf'}</td>
783 <td><input type='submit' name='ACTION' value=' $Lang ::tr{'acct commit'}' style='width:10em'></td>
786 <td> $Lang ::tr{'acct delbefore'} (ACCT,ACCT_HIST)</td>
787 <td><select name='expmonth'>
789 for ( my $i = 1 ; $i < 13 ; $i ++){
790 print "<option> $i </option>" ;
792 print "</select><select name='expyear'>" ;
793 for ( my $i = 2014 ; $i <=( $year + 1900 ); $i ++){
794 print "<option> $i </option>" ;
798 <td><input type='submit' name='ACTION1' value=' $Lang ::tr{'acct commit'}' style='width:10em'></td>
806 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
807 <table style='width:100%;'>
810 <td align='right'><input type='submit' name='ACTION' value=' $Lang ::tr{'back'}'></td>
817 & Header
:: closebigbox
();
818 & Header
:: closepage
();
824 #GET : Timestamp in seconds since 1.1.1970
825 #GIVES: Date in Format dd.mm.yyyy HH:MM:SS
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 ]);
835 return " $d . $m . $Y $H : $M : $S " ;
839 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'menu' });
841 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
842 <table style='width: 100%;'>
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'}'>
849 if ( $settings { 'EXPERT' } eq 'on' ){
850 print "<input type='submit' name='ACTION' value=' $Lang ::tr{'acct maintenance'}'>" ;
866 & Header
:: openpage
( " $Lang ::tr{'acct host detail'} $grhost " , 1 , '' );
867 & Header
:: openbigbox
( '100%' , 'center' );
868 & Header
:: openbox
( '100%' , 'left' , );
870 & generatemonthgraph
( $grmon , $gryear , $grhost );
873 & Header
:: closebigbox
();
874 & Header
:: closepage
();
878 sub generatemonthgraph
{
882 my ( $from , $till ) = & ACCT
:: getmonth
( $grmon , $gryear );
886 #If we want to show Data from within last 2 months, get DATA from ACCT
887 if ( $grmon == ( $mon )+ 1 && $gryear == ( $year + 1900 )){
888 $sth =& ACCT
:: getmonthgraphdata
( "ACCT" , $from , $till , $grhost );
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 );
895 foreach my $i ( 0 ..$ #$_) {
896 push ( @
{ $values [ $i ]},( $_ ->[ $i ]));
900 for my $graph ( GD
:: Graph
:: area
-> new ( 600 , 200 ))
902 my $name = $cgiparams { 'host' };
907 accentclr
=> 'dblue' ,
908 valuesclr
=> '#ffff77' ,
910 axislabelcl
=> 'black' ,
914 dclrs
=> [ qw(lgreen lred) ],
915 x_label
=> $Lang :: tr
{ 'date' },
916 y_label
=> $Lang :: tr
{ 'acct mb' },
919 #x_label_skip => 3, #skip every 3 x-axis title
920 x_label_position
=> 0 ,
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 $!;
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>" ;
937 <table style='width:100%;'>
939 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
940 <td align='right'><input type='submit' name='ACTION' value=' $Lang ::tr{'back'}'></td>
947 sub generatehourgraph
{
951 my ( $from , $till ) = & ACCT
:: getmonth
( $grmon , $gryear );
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 );
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 );
964 foreach my $i ( 0 ..$ #$_) {
967 push ( @
{ $values [ $i ]},( $_ ->[ $i ] /1024/ 1024 ));
969 push ( @
{ $values [ $i ]}, $_ ->[ $i ]);
976 for my $graph ( GD
:: Graph
:: area
-> new ( 600 , 200 ))
978 my $name = $cgiparams { 'host' };
979 print STDERR
"Processing $name mit sosse \n " ;
982 x_label
=> 'X Label' ,
983 y_label
=> 'Y label' ,
984 title
=> 'An Area Graph' ,
988 #accent_treshold => 41,
992 $graph -> set_legend ( 'one' , 'two' );
993 my $gd = $graph -> plot ( \
@values );
994 open ( IMG
, '>/srv/web/ipfire/html/test/file.png' ) or die $!;
999 print "<img src='/test/file.png' alt='Tanzmaus'>" ;
1006 if ( $proxsrv eq $Lang :: tr
{ 'stopped' }){
1007 $bgcolor1 = "bgcolor='${Header::colourred}' align='center'" ;
1008 $message = "<br> $Lang ::tr{'acct proxy_enable'}" ;
1010 $bgcolor1 = "bgcolor='${Header::colourgreen}' align='center'" ;
1012 if ( $proxlog eq $Lang :: tr
{ 'stopped' }){
1013 $bgcolor2 = "bgcolor='${Header::colourred}' align='center'" ;
1014 $message = $message . "<br> $Lang ::tr{'acct proxylog_enable'}" ;
1016 $bgcolor2 = "bgcolor='${Header::colourgreen}' align='center'" ;
1018 & Header
:: openbox
( '100%' , 'left' , );
1020 <center><table width='50%' class='tbl'>
1022 <th> $Lang ::tr{'service'}</th>
1023 <th> $Lang ::tr{'status'}</th>
1026 <td bgcolor=' $color {'color22'}'> $Lang ::tr{'proxy'}</td>
1027 <td $bgcolor1 ><font color='white'> $proxsrv </td>
1030 <td bgcolor=' $color {'color20'}'> $Lang ::tr{'logging'}</td>
1031 <td $bgcolor2 ><font color='white'> $proxlog </td>
1035 print "<tr><td colspan='2'><font color='red'> $message <br> $Lang ::tr{'acct nodata'}</td></tr>" ;
1038 & Header
:: closebox
();
1043 #GIVES: Value (in MB,GB,TB) With Type ("MB","GB","TB")
1046 if (( $val / 1024 ) < 1024 ){
1048 $val = sprintf "%.2f" , $val / 1024 ;
1049 $type = $Lang :: tr
{ 'acct kb' };
1050 } elsif (( $val /( 1024 * 1024 )) < 1024 ){
1052 $val = sprintf "%.2f" , $val /( 1024 * 1024 );
1053 $type = $Lang :: tr
{ 'acct mb' };
1054 } elsif (( $val /( 1024 * 1024 * 1024 )) < 1024 ){
1056 $val = sprintf "%.2f" , $val /( 1024 * 1024 * 1024 );
1057 $type = $Lang :: tr
{ 'acct gb' };
1058 } elsif (( $val /( 1024 * 1024 * 1024 * 1024 )) < 1024 ){
1060 $val = sprintf "%.2f" , $val /( 1024 * 1024 * 1024 * 1024 );
1061 $type = $Lang :: tr
{ 'acct tb' };
1063 return ( $val , $type );
1067 #This function shows the site "address management"
1068 & Header
:: openpage
( " $Lang ::tr{'acct addresses'}" , 1 , '' );
1069 & Header
:: openbigbox
( '100%' , 'center' );
1074 #Get all Addresses from DB
1075 my $res = & ACCT
:: getaddresses
;
1077 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'acct edit_addr' } );
1079 #When no address preselected, set COMPANYTYPE to "CUST"
1080 if ( $cgiparams { 'rdo_companytype' } eq '' ){
1081 $cgiparams { 'rdo_companytype' } = 'CUST' ;
1083 $checked { 'rdo_companytype' }{ $cgiparams { 'rdo_companytype' }} = 'CHECKED' ;
1087 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
1088 <table style=width:100%;'>
1090 <td style='width:8em;'></td>
1092 <td colspan='2'><font size="1"> $Lang ::tr{'acct hint_hoster'}:</font></td>
1095 <td> $Lang ::tr{'acct companytype'}</td>
1096 <!-- TODO: when the value of this radio button changes, the layout needs to be reloaded so "blob.gif" gets displayed -->
1098 <input type='radio' name='rdo_companytype' value='CUST' $checked {'rdo_companytype'}{'CUST'}> $Lang ::tr{'acct customer'}
1099 <input type='radio' name='rdo_companytype' value='HOST' $checked {'rdo_companytype'}{'HOST'}> $Lang ::tr{'acct hoster'}</td>
1100 <td style='width:8em;'> $Lang ::tr{'acct bank'}
1103 if ( $cgiparams { 'rdo_companytype' } eq 'HOST' ){
1104 print " <img src='/blob.gif' alt='*' />" ;
1110 <input type='text' name='txt_bank' value=' $cgiparams {'txt_bank'}' style='width:25em;'></td>
1113 <td> $Lang ::tr{'acct company'} <img src='/blob.gif' alt='*' /></td>
1115 <input type='text' name='txt_company' value=' $cgiparams {'txt_company'}' style='width:25em;'></td>
1116 <td> $Lang ::tr{'acct iban'}</td>
1118 <input type='text' name='txt_iban' value=' $cgiparams {'txt_iban'}' style='width:25em;'></td>
1121 <td> $Lang ::tr{'acct name1'}</td>
1123 <input type='text' name='txt_name1' value=' $cgiparams {'txt_name1'}' style='width:25em;'></td>
1124 <td> $Lang ::tr{'acct bic'}</td>
1126 <input type='text' name='txt_bic' maxlength='8' value=' $cgiparams {'txt_bic'}' style='width:25em;'></td>
1129 <td> $Lang ::tr{'acct str'} <img src='/blob.gif' alt='*' /></td>
1131 <input type='text' name='txt_str' value=' $cgiparams {'txt_str'}' style='width:25em;'></td>
1132 <td> $Lang ::tr{'acct blz'}
1135 if ( $cgiparams { 'rdo_companytype' } eq 'HOST' ){
1136 print " <img src='/blob.gif' alt='*' />" ;
1142 <input type='text' name='txt_blz' maxlength='8' value=' $cgiparams {'txt_blz'}' style='width:25em;'></td>
1145 <td> $Lang ::tr{'acct str_nr'} <img src='/blob.gif' alt='*' /></td>
1146 <td><input type='text' name='txt_str_nr' value=' $cgiparams {'txt_str_nr'}' style='width:25em;'></td>
1147 <td> $Lang ::tr{'acct kto'}
1150 if ( $cgiparams { 'rdo_companytype' } eq 'HOST' ){
1151 print " <img src='/blob.gif' alt='*' />" ;
1157 <input type='text' name='txt_kto' value=' $cgiparams {'txt_kto'}' style='width:25em;'></td>
1162 <td> $Lang ::tr{'acct plz'} <img src='/blob.gif' alt='*' /></td>
1164 <input type='text' name='txt_plz' value=' $cgiparams {'txt_plz'}' style='width:25em;'></td>
1165 <td> $Lang ::tr{'acct email'} <img src='/blob.gif' alt='*' /></td>
1166 <td><input type='text' name='txt_email' value=' $cgiparams {'txt_email'}' style='width:25em;'></td>
1169 <td> $Lang ::tr{'acct city'} <img src='/blob.gif' alt='*' /></td>
1170 <td><input type='text' name='txt_city' value=' $cgiparams {'txt_city'}' style='width:25em;'></td>
1171 <td> $Lang ::tr{'acct inet'}</td>
1173 <input type='text' name='txt_inet' value=' $cgiparams {'txt_inet'}' style='width:25em;'></td>
1178 <td> $Lang ::tr{'acct hrb'}</td>
1180 <input type='text' name='txt_hrb' value=' $cgiparams {'txt_hrb'}' style='width:25em;'></td>
1185 <td> $Lang ::tr{'acct ustid'}</td>
1186 <td><input type='text' name='txt_ustid' value=' $cgiparams {'txt_ustid'}' style='width:25em;'></td>
1191 <td> $Lang ::tr{'acct tel'}</td>
1193 <input type='text' name='txt_tel' value=' $cgiparams {'txt_tel'}' style='width:25em;'></td>
1198 <td> $Lang ::tr{'acct fax'}</td>
1200 <input type='text' name='txt_fax' value=' $cgiparams {'txt_fax'}' style='width:25em;'></td>
1203 <td colspan='6'><img src='/blob.gif' alt='*' /><font size="1"> $Lang ::tr{'acct not optional'}</font></td>
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>" ;
1211 print "<td colspan='6' align='right' display:inline><input type='submit' name='ACTION1' value=' $Lang ::tr{'save'}'></td>" ;
1213 print "</tr></table></form>" ;
1214 & Header
:: closebox
();
1217 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
1218 <table style='width:100%;'>
1220 <td align='right'><input type='submit' name='ACTION' value=' $Lang ::tr{'back'}'></td>
1225 #Check if we need to show HOSTBOX and/or CUSTBOX
1226 foreach 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' ){
1231 if ( $type eq 'CUST' ){
1235 #Show HOSTER Addresses if any
1239 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'acct exst_host_addr' } );
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'" ;
1251 if ( $type eq 'HOST' ){
1254 print "<tr><td width='50%' valign='top' align='center'>" ;
1256 print "</td><td width='50%' valign='top' align='center'>" ;
1259 <table style='width:90%;' cellspacing='0' class='tbl'>
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 '>
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'>
1296 <td $col ><b> $comp </b></td>
1298 <td colspan='3' $col1 ></td>
1301 <td $col > $name1 </td>
1302 <td $col1 width='35%'> $Lang ::tr{'acct bank'}</td>
1303 <td colspan='3' $col1 > $bank </td>
1307 <td $col1 > $Lang ::tr{'acct iban'}</td>
1308 <td colspan='3' $col1 > $iban </td>
1311 <td $col > $str $nr </td>
1312 <td $col1 > $Lang ::tr{'acct bic'}</td>
1313 <td colspan='3' $col1 > $bic </td>
1316 <td $col > $plz $city </td>
1317 <td $col1 > $Lang ::tr{'acct blz'}</td>
1318 <td colspan='3' $col1 > $blz </td>
1322 <td $col1 > $Lang ::tr{'acct kto'}</td>
1323 <td colspan='3' $col1 > $kto </td>
1335 print "<td width='50%' valign='top' align='center'></td></tr>" ;
1338 & Header
:: closebox
();
1340 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'acct exst_host_addr' } );
1341 print $Lang :: tr
{ 'acct host empty' };
1342 & Header
:: closebox
();
1344 #Show CUSTOMER Addresses if any
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'" ;
1357 if ( $type eq 'CUST' ){
1359 print "<td width='15%' valign='top' align='center'>" ;
1362 <table style='width:90%;' cellspacing='0' class='tbl'>
1365 $Lang ::tr{'acct company'}
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 '>
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 ' />
1400 <td colspan='3' $col ><b> $comp </b></td>
1403 <td colspan='3' $col > $name1 </td>
1406 <td colspan='3' $col > $str $nr </td>
1409 <td colspan='3' $col > $plz $city </td>
1415 if (! ( $count % 3 )) {
1422 print "<td width='15%' valign='top' align='center'></td></tr>" ;
1425 & Header
:: closebox
();
1427 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'acct exst_cust_addr' } );
1428 print $Lang :: tr
{ 'acct cust empty' };
1429 & Header
:: closebox
();
1431 & Header
:: closebigbox
();
1432 & Header
:: closepage
();
1438 my $fieldvalue = $_ [ 1 ];
1439 my $errormessage = $_ [ 2 ];
1441 if (!& validtextfield
( $fieldvalue )){
1443 $errormessage .= " $Lang ::tr{'acct empty field'} $field <br>" ;
1445 $errormessage .= " $Lang ::tr{'acct invalid'} $field <br>" ;
1448 return $errormessage ;
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' };
1463 $errormessage =& checkfield
( $Lang :: tr
{ 'acct company' }, $cgiparams { 'txt_company' }, $errormessage );
1466 if ( $cgiparams { 'txt_name1' }){
1467 $errormessage =& checkfield
( $Lang :: tr
{ 'acct name1' }, $cgiparams { 'txt_name1' }, $errormessage );
1471 if ( $cgiparams { 'txt_name2' }){
1472 $errormessage =& checkfield
( $Lang :: tr
{ 'acct name2' }, $cgiparams { 'txt_name2' }, $errormessage );
1476 $errormessage =& checkfield
( $Lang :: tr
{ 'acct str' }, $cgiparams { 'txt_str' }, $errormessage );
1479 if (! $cgiparams { 'txt_str_nr' }){
1480 $errormessage .= " $Lang ::tr{'acct empty field'} $Lang ::tr{'acct str_nr'}<br>" ;
1482 if (! & validalphanumfield
( $cgiparams { 'txt_str_nr' })){
1483 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'acct str_nr'}<br>" ;
1488 if (! $cgiparams { 'txt_plz' }){
1489 $errormessage .= " $Lang ::tr{'acct empty field'} $Lang ::tr{'acct plz'}<br>" ;
1491 if (! & validnumfield
( $cgiparams { 'txt_plz' })){
1492 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'acct plz'}<br>" ;
1497 $errormessage =& checkfield
( $Lang :: tr
{ 'acct city' }, $cgiparams { 'txt_city' }, $errormessage );
1500 if (! $cgiparams { 'txt_email' }){
1501 $errormessage .= " $Lang ::tr{'acct empty field'} $Lang ::tr{'acct email'}<br>" ;
1503 if (! & General
:: validemail
( $cgiparams { 'txt_email' })){
1504 $errormessage .= "<br> $Lang ::tr{'acct invalid'} $Lang ::tr{'acct email'}" ;
1508 #Check all fields required for companytype "HOST"
1509 if ( $cgiparams { 'rdo_companytype' } eq 'HOST' ){
1511 $errormessage =& checkfield
( $Lang :: tr
{ 'acct bank' }, $cgiparams { 'txt_bank' }, $errormessage );
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>" ;
1519 if ( $cgiparams { 'txt_bic' }){
1520 if (!& validalphanumfield
( $cgiparams { 'txt_bic' })){
1521 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'acct bic'}<br>" ;
1524 if (( $cgiparams { 'txt_iban' } && $cgiparams { 'txt_blz' })||(! $cgiparams { 'txt_iban' } && $cgiparams { 'txt_blz' })){
1526 if (! & validnumfield
( $cgiparams { 'txt_blz' })){
1527 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'acct blz'}<br>" ;
1530 if ( $cgiparams { 'txt_kto' }){
1531 if (! & validnumfield
( $cgiparams { 'txt_kto' })){
1532 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'acct kto'}<br>" ;
1534 } elsif (! $cgiparams { 'txt_kto' }){
1535 $errormessage .= " $Lang ::tr{'acct empty field'} $Lang ::tr{'acct kto'}<br>" ;
1537 } elsif (! $cgiparams { 'txt_iban' } && ! $cgiparams { 'txt_blz' }){
1538 $errormessage .= " $Lang ::tr{'acct empty field'} $Lang ::tr{'acct blz'}<br>" ;
1540 if ( $cgiparams { 'txt_kto' }){
1541 if (! & validnumfield
( $cgiparams { 'txt_kto' })){
1542 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'acct kto'}<br>" ;
1544 } elsif (! $cgiparams { 'txt_kto' }){
1545 $errormessage .= " $Lang ::tr{'acct empty field'} $Lang ::tr{'acct kto'}<br>" ;
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 ;
1554 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'acct inet'}<br>" ;
1558 if ( $cgiparams { 'txt_hrb' }){
1559 $errormessage =& checkfield
( $Lang :: tr
{ 'acct hrb' }, $cgiparams { 'txt_hrb' }, $errormessage );
1565 if ( $cgiparams { 'txt_tel' }){
1566 if (!& validphonefield
( $cgiparams { 'txt_tel' })){
1567 $errormessage .= " $Lang ::tr{'acct invalid'} $Lang ::tr{'acct tel'}<br>" ;
1571 return $errormessage ;
1575 if (- f
"${General::swroot}/proxy/enable" ){
1576 $proxsrv = $Lang :: tr
{ 'running' };
1578 $proxsrv = $Lang :: tr
{ 'stopped' };
1580 my $srce = "${General::swroot}/proxy/squid.conf" ;
1581 my $string1 = 'access\.log' ;
1583 while ( my $line = < FH
>) {
1584 if ( $line =~ m/$string1/ ) {
1585 $proxlog = $Lang :: tr
{ 'running' };
1593 #GET: Input from a Textfield
1594 #GIVES: True if valid, false if not valid
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 ) {
1601 # Only valid characters are a-z, A-Z, 0-9 and -
1602 if ( $remark !~ /^[a-zäöüA-ZÖÄÜ0-9-.:;\&\|\ß_()\/ \s
]*$/) {
1604 # First character can only be a letter or a digit
1605 if ( substr ( $remark , 0 , 1 ) !~ /^[a-zäöüA-ZÖÄÜ0-9(]*$/ ) {
1607 # Last character can only be a letter or a digit
1608 if ( substr ( $remark , - 1 , 1 ) !~ /^[a-zöäüA-ZÖÄÜ0-9.:;_)]*$/ ) {
1614 #GET: Input from a numeric field
1615 #GIVES: True if valid, false if not valid
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 ) {
1622 # Only valid characters are a-z, A-Z, 0-9 and -
1623 if ( $num !~ /^[0-9.]*$/ ) {
1625 # First character can only be a letter or a digit
1626 if ( substr ( $num , 0 , 1 ) !~ /^[0-9]*$/ ) {
1628 # Last character can only be a letter or a digit
1629 if ( substr ( $num , - 1 , 1 ) !~ /^[0-9]*$/ ) {
1634 sub validphonefield
{
1635 #GET: Input from a numeric field
1636 #GIVES: True if valid, false if not valid
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 ) {
1643 # Only valid characters are a-z, A-Z, 0-9 and -
1644 if ( $num !~ /^[0-9-()\+ ]*$/ ) {
1646 # First character can only be a letter or a digit
1647 if ( substr ( $num , 0 , 1 ) !~ /^[0-9(\+]*$/ ) {
1649 # Last character can only be a digit
1650 if ( substr ( $num , - 1 , 1 ) !~ /^[0-9]*$/ ) {
1655 sub validalphanumfield
{
1656 #GET: Input from a numeric field
1657 #GIVES: True if valid, false if not valid
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 ) {
1664 # Only valid characters are a-z, A-Z, 0-9 and -
1665 if ( $remark !~ /^[0-9a-zA-Z]*$/ ) {
1667 # First character can only be a letter or a digit
1668 if ( substr ( $remark , 0 , 1 ) !~ /^[0-9A-Za-z]*$/ ) {
1670 # Last character can only be a letter or a digit
1671 if ( substr ( $remark , - 1 , 1 ) !~ /^[0-9a-zA-Z]*$/ ) {
1677 if ( $errormessage ) {
1678 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'error messages' });
1679 print "<class name='base'> $errormessage \n " ;
1680 print " </class> \n " ;
1681 & Header
:: closebox
();
1686 & Header
:: openpage
( " $Lang ::tr{'acct billgroup'}" , 1 , '' );
1687 & Header
:: openbigbox
( '100%' , 'center' );
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 ;
1702 $ccmailrcpt = $ccmail ;
1703 if ( $type eq 'HOST' ){
1706 if ( $type eq 'CUST' ){
1710 if ( $host && $cust ){
1712 if (! $cgiparams { 'txt_ccmail' }){
1713 $cgiparams { 'txt_ccmail' }= $ccmailrcpt ;
1715 & Header
:: openbox
( '100%' , 'left' , " $Lang ::tr{'acct edit_addr'}" );
1717 <form method='post' action=' $ENV {'SCRIPT_NAME'}' ENCTYPE='multipart/form-data'>
1718 <table style='width:100%;'>
1720 <td style='width: 22em;'> $Lang ::tr{'name'} <img src='/blob.gif' alt='*' /></td>
1721 <td><input type='text' name='txt_billgroup' value=' $cgiparams {'txt_billgroup'}' style='width: 24em;'></td>
1727 <td valign='top'> $Lang ::tr{'acct billtext1'}</td>
1728 <td><textarea name='txt_billtext1' cols='40' rows='5' style='width: 24em;' maxlength='300'> $cgiparams {'txt_billtext1'}</textarea></td>
1730 <tr><td><br></td></tr>
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>" ;
1740 print "<option> $comp </option>" ;
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>" ;
1752 print "<option> $comp </option>" ;
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' });
1766 foreach my $row ( @
$hosts ) {
1769 foreach my $old ( @oldhosts ){
1775 print "<option selected> $val </option>" ;
1777 print "<option> $val </option>" ;
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>" ;
1787 print "<tr><td colspan='2' align='left'><img src='/blob.gif' alt='*' /><font size='1'> $Lang ::tr{'required field'}</font></td></tr>" ;
1788 print "<tr><td colspan='2' align='right'><br><br>" ;
1789 print "</td></tr></table>" ;
1791 #LOGO Upload if update eq 'on'
1792 if ( $cgiparams { 'update' } eq 'on' ){
1794 <table style='width:100%;'>
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'}' />
1801 <td><br> $Lang ::tr{'acct logo'}</td>
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>" ;
1807 print "<td><br> $Lang ::tr{'no'}</td></tr>" ;
1809 #Show optional CC Mailadresses
1812 <td><br> $Lang ::tr{'acct mailrcpt'}</td>
1813 <td><br> $mailrcpt </td>
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>
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 '>" ;
1832 print "<input type='submit' name='BILLACTION' value=' $Lang ::tr{'save'}'>" ;
1834 print "</td></tr></table><br></form><br>" ;
1835 & Header
:: closebox
();
1838 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
1839 <table style='width:100%;'>
1842 <input type='submit' name='ACTION' value=' $Lang ::tr{'back'}'>
1848 #Show Box for fixed positions if update
1849 if ( $cgiparams { 'update' } eq 'on' ){
1850 & viewtablebillpos
( $cgiparams { 'txt_billgroup' });
1853 & viewtablebillgroups
;
1857 & Header
:: openbox
( '100%' , 'left' , " $Lang ::tr{'hint'}" );
1858 print " $Lang ::tr{'acct hint billgrp'}" ;
1859 & Header
:: closebox
();
1862 <table style='width:100%;'>
1864 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
1865 <td align='right'><input type='submit' name='ACTION' value=' $Lang ::tr{'back'}'></td>
1871 & Header
:: closebigbox
();
1872 & Header
:: closepage
();
1876 sub viewtablebillgroups
{
1878 & Header
:: openbox
( '100%' , 'left' , " $Lang ::tr{'acct billgroup'}" );
1879 #Get DATA from table BILLINGGRP
1880 my $res = & ACCT
:: getbillgroups
;
1882 #Print table billinggroup
1884 <table style='width:100%;' cellspacing='0' class='tbl'>
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>
1893 foreach my $line ( @
$res ){
1896 $col = "style='background-color: $color {'color22'}'" ;
1898 $col = "style='background-color: $color {'color20'}'" ;
1900 my ( $name , $host , $cust , $txt , $amount , $cent ) = @
$line ;
1906 <td $col > $amount </td>
1907 <td width='1%' $col >
1909 my $members =& ACCT
:: listhosts
( $name );
1910 my @mem = split ( /\|/ , $members );
1912 foreach my $m ( @mem ){
1915 print "<img src='/images/computer.png' alt= $Lang ::tr{'acct members'} title='" . $msg . "' /></td>" ;
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 '>
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 '>
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 '>
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 '>
1958 & Header
:: closebox
();
1962 $dbh =& ACCT
:: connectdb
;
1963 & Header
:: openbox
( '100%' , 'left' , $Lang :: tr
{ 'acct hosts' });
1966 my ( $from , $till )=& ACCT
:: getmonth
( $mon1 , $year1 );
1968 #Menu to display another month
1970 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
1971 <table style='width:100%;'>
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>
1978 <td><select name='month'>
1980 for ( my $i = 1 ; $i < 13 ; $i ++){
1982 print "<option selected> $i </option>" ;
1984 print "<option> $i </option>" ;
1989 <td style='text-align: center;'><select name='year'>
1991 for ( my $j = 2014 ; $j <=( $year1 ); $j ++){
1993 print "<option selected> $j </option>" ;
1995 print "<option> $j </option>" ;
2000 <td><input type='submit' name='ACTION' value=' $Lang ::tr{'acct view'}'></td>
2005 #View table with all hosts
2007 <table style='width:100%;' class='tbl'>
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>
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;" );
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;" );
2026 foreach my $row ( @
$res ) {
2031 $col = "background-color: $color {'color22'};" ;
2033 $col = "background-color: $color {'color20'};" ;
2035 my ( $bytes , $mintime , $maxtime , $name ) = @
$row ;
2037 ( $lineval , $type ) = & calcbytes
( $bytes );
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>" ;
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 '>
2046 <input type='hidden' name='month' value=' $mon1 '>
2047 <input type='hidden' name='year' value=' $year1 '>
2048 <input type='hidden' name='traffic' value=" $Lang ::tr{'acct sum'} $Lang ::tr{'acct traffic'} $lineval $type ">
2056 print "<tr><td colspan='5'><center> $Lang ::tr{'acct no data'}</td></tr>" ;
2059 & Header
:: closebox
();
2063 sub viewtablebillpos
{
2065 #BOX for extra billpositions
2066 & Header
:: openbox
( '100%' , 'left' , " $Lang ::tr{'acct fix billpos'} $grp " );
2067 #Table for optional billpositions
2069 <center><table style='width:65%' cellspacing='0' class='tbl' border='0'>
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>
2077 #Fill Table for extra billpositions if any
2078 if ( $cgiparams { 'update' } eq 'on' ){
2079 my $res = & ACCT
:: getextrabillpos
( $cgiparams { 'txt_billgroup' });
2081 foreach my $line ( @
$res ){
2084 $col = "style='background-color: $color {'color22'}'" ;
2086 $col = "style='background-color: $color {'color20'}'" ;
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>" ;
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>
2107 <table style='width:100%'>
2109 <td align='right'><input type='submit' name='BILLPOS' value=' $Lang ::tr{'save'}'></td>
2110 <input type='hidden' name='txt_billgroup' value=' $grp '>
2116 & Header
:: closebox
();
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 );
2131 <table style='width:100%' cellspacing='0' class='tbl' border='0'>
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>
2141 foreach my $row ( @
$res ){
2144 $col = "style='background-color: $color {'color22'}'" ;
2146 $col = "style='background-color: $color {'color20'}'" ;
2148 my ( $no , $path , $name , $date , $dbgrp ) = @
$row ;
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>" ;
2158 print "</table><br>" ;
2160 print "<center> $Lang ::tr{'acct no data'}" ;
2162 & Header
:: closebox
();
2166 <table style='width:100%'>
2168 <form method='post' action=' $ENV {'SCRIPT_NAME'}'>
2169 <td align='right'><input type='submit' name='ACTION' value=' $Lang ::tr{'back'}'></td>
2174 & Header
:: closebigbox
();
2175 & Header
:: closepage
();
2179 sub checkmailsettings
{
2181 if (! $cgiparams { 'txt_mailsender' }){
2182 $errormessage .= " $Lang ::tr{'acct empty field'} $Lang ::tr{'acct mailsender'}<br>" ;
2184 if (! & General
:: validemail
( $cgiparams { 'txt_mailsender' })){
2185 $errormessage .= "<br> $Lang ::tr{'acct invalid'} $Lang ::tr{'acct mailsender'}<br>" ;
2188 return $errormessage ;