mirror of
https://github.com/librenms/librenms.git
synced 2024-10-07 16:52:45 +00:00
392 lines
15 KiB
PHP
392 lines
15 KiB
PHP
<?php
|
|
|
|
$bill_id = ((is_numeric($_GET['bill_id'])) ? $_GET['bill_id'] : 0);
|
|
$history_id = ((is_numeric($_GET['history_id'])) ? $_GET['history_id'] : 0);
|
|
|
|
$filename = 'billing-report_'.$history_id.'.pdf';
|
|
$i = 0;
|
|
$config['billing']['base'] = $config['billing']['base'];
|
|
$html = '';
|
|
$history = array();
|
|
$customer = array();
|
|
$device = array();
|
|
|
|
// Page Layout
|
|
$portret = $pdf->serializeTCPDFtagParameters(array('P'));
|
|
$landscape = $pdf->serializeTCPDFtagParameters(array('L'));
|
|
|
|
// History Database content
|
|
foreach (dbFetchRows('SELECT * FROM `bill_hist` WHERE `bill_id`= ? AND `id` = ? ORDER BY `bill_datefrom` DESC LIMIT 1', array($bill_id, $history_id)) as $row) {
|
|
if (bill_permitted($row['bill_id'])) {
|
|
$history['datefrom'] = strftime('%A, %e %B %Y @ %T', strtotime($row['bill_datefrom']));
|
|
$history['dateto'] = strftime('%A, %e %B %Y @ %T', strtotime($row['bill_dateto']));
|
|
$history['timestampfrom'] = strtotime($row['bill_datefrom']);
|
|
$history['timestampto'] = strtotime($row['bill_dateto']);
|
|
$history['type'] = $row['bill_type'];
|
|
$history['percent'] = $row['bill_percent'];
|
|
$history['dir_95th'] = $row['dir_95th'];
|
|
$history['rate_95th'] = formatRates($row['rate_95th']);
|
|
$history['total_data'] = formatStorage(($row['traf_total'] * $config['billing']['base'] * $config['billing']['base']));
|
|
;
|
|
$history['background'] = get_percentage_colours($row['bill_percent']);
|
|
if ($row['bill_type'] == 'CDR') {
|
|
$history['allowed'] = format_number($row['bill_allowed'], $config['billing']['base']).'B';
|
|
$history['used'] = format_number($row['rate_95th'], $config['billing']['base']).'B';
|
|
$history['in'] = format_number($row['rate_95th_in'], $config['billing']['base']).'B';
|
|
$history['out'] = format_number($row['rate_95th_out'], $config['billing']['base']).'B';
|
|
$history['overusage'] = (($row['bill_overuse'] <= 0) ? '-' : '<span style="color: #'.$history['background']['left'].'; ">'.format_number(($row['bill_overuse'] * 1000)).'</span>' );
|
|
}
|
|
else {
|
|
$history['allowed'] = formatStorage(($row['bill_allowed'] * $config['billing']['base'] * $config['billing']['base']));
|
|
$history['used'] = formatStorage(($row['traf_total'] * $config['billing']['base'] * $config['billing']['base']));
|
|
$history['in'] = formatStorage(($row['traf_in'] * $config['billing']['base'] * $config['billing']['base']));
|
|
$history['out'] = formatStorage(($row['traf_out'] * $config['billing']['base'] * $config['billing']['base']));
|
|
$history['overusage'] = (($row['bill_overuse'] <= 0) ? '-' : '<span style="color: #'.$history['background']['left'].'; ">'.formatStorage(($row['bill_overuse'] * $config['billing']['base'] * $config['billing']['base'])).'</span>' );
|
|
}
|
|
}//end if
|
|
}//end foreach
|
|
|
|
// Customer Database content
|
|
foreach (dbFetchRows('SELECT bill_name, bill_custid, bill_ref, bill_notes FROM `bills` WHERE `bill_id` = ? ORDER BY `bill_id` LIMIT 1', array($bill_id)) as $row) {
|
|
if (bill_permitted($bill_id)) {
|
|
$customer['id'] = $row['bill_custid'];
|
|
$customer['name'] = $row['bill_name'];
|
|
$customer['ref'] = $row['bill_ref'];
|
|
$customer['notes'] = $row['bill_notes'];
|
|
}
|
|
}
|
|
|
|
// Billing types
|
|
$bill_type['95per'] = (($history['type'] != 'CDR') ? '[ ] 95 Percentile' : '<b>[X] 95 Percentile</b>');
|
|
$bill_type['quota'] = (($history['type'] != 'Quota') ? '[ ] Quota' : '<b>[X] Quota</b>');
|
|
$bill_type['average'] = (($history['type'] != 'Ave') ? '[ ] Average' : '<b>[X] Average</b>');
|
|
|
|
// QR Tag
|
|
$http = ((empty($_SERVER['HTTPS'])) ? 'http' : 'https' );
|
|
$url['his'] = $http.'://'.$_SERVER['HTTP_HOST'].'/bill/bill_id='.$bill_id.'/view=history/detail='.$history_id.'/';
|
|
$url['pdf'] = $http.'://'.$_SERVER['HTTP_HOST'].'/pdf.php?type=billing&report=history&bill_id='.$bill_id.'&history_id='.$history_id;
|
|
$created = strftime('%A, %e %B %Y @ %T', strtotime('now'));
|
|
// $qrInfo = "More Info : ".$url['his']."\nPDF Report : ".$url['pdf']."\nPDF Created: ".$created."\n";
|
|
$qrInfo = 'More Info : '.$url['his']."\nPDF Created: ".$created."\n";
|
|
$qrStyle = array(
|
|
'border' => false,
|
|
'vpadding' => auto,
|
|
'hpadding' => auto,
|
|
'fgcolor' => array(
|
|
0,
|
|
0,
|
|
0,
|
|
),
|
|
'bgcolor' => false,
|
|
'module_width' => 1,
|
|
'module_height' => 1,
|
|
);
|
|
$qrTag = $pdf->serializeTCPDFtagParameters(array($qrInfo, 'QRCODE,H', 162, 68, 50, 50, $qrStyle, 'N'));
|
|
|
|
// Include css
|
|
require_once 'pdf_css.inc.php';
|
|
|
|
$html .= $css;
|
|
|
|
// GB Convert (1000 vs 1024)
|
|
|
|
|
|
function gbConvert($data) {
|
|
global $config;
|
|
|
|
$count = strlen($data);
|
|
$div = floor($count / 4);
|
|
$res = round(($data / pow(1000, $div) * pow($config['billing']['base'], $div)));
|
|
return $res;
|
|
|
|
}//end gbConvert()
|
|
|
|
|
|
// Generate graphs
|
|
|
|
|
|
function genGraphs($bill_id, $imgtype, $from, $to, $bittype='Quota') {
|
|
$http = ((empty($_SERVER['HTTPS'])) ? 'http' : 'https' );
|
|
$res = $http.'://'.$_SERVER['HTTP_HOST'].'/';
|
|
if ($imgtype == 'bitrate') {
|
|
$res .= 'billing-graph.php?bill_id='.$bill_id;
|
|
if ($bittype == 'Quota') {
|
|
$res .= '&ave=yes';
|
|
}
|
|
else if ($bittype == 'CDR') {
|
|
$res .= '&95th=yes';
|
|
}
|
|
}
|
|
else {
|
|
$res .= 'bandwidth-graph.php?bill_id='.$bill_id;
|
|
}
|
|
|
|
$res .= '&type='.$imgtype;
|
|
$res .= '&x=1190&y=250';
|
|
$res .= '&from='.$from.'&to='.$to;
|
|
if (!bill_permitted($bill_id)) {
|
|
$res = 'images/observium-logo.png';
|
|
}
|
|
|
|
return $res;
|
|
|
|
}//end genGraphs()
|
|
|
|
|
|
// Device Information
|
|
|
|
|
|
function listBillPorts($bill_id) {
|
|
$device = array();
|
|
$res = '';
|
|
$res .= '<table>';
|
|
$res .= ' <tr>';
|
|
$res .= ' <th>Device</th>';
|
|
$res .= ' <th>Hardeware</th>';
|
|
$res .= ' <th>Interface/Port</th>';
|
|
$res .= ' <th>Speed</th>';
|
|
// $res .= " <th>Description</th>";
|
|
// $res .= " <th>Notes</th>";
|
|
$res .= ' </tr>';
|
|
foreach (dbFetchRows('SELECT * FROM `bill_ports` as b, `ports` as p, `devices` as d WHERE b.bill_id = ? AND p.port_id = b.port_id AND d.device_id = p.device_id', array($bill_id)) as $row) {
|
|
if (bill_permitted($bill_id)) {
|
|
$device['name'] = $row['sysName'];
|
|
// $device['port'] = $row['ifName']." (".$row['ifDescr'].")";
|
|
$device['port'] = $row['ifName'];
|
|
$device['speed'] = formatRates($row['ifSpeed']);
|
|
$device['hw'] = $row['hardware'];
|
|
$device['descr'] = $row['port_descr_descr'];
|
|
$device['notes'] = $row['port_descr_notres'];
|
|
$res .= ' <tr>';
|
|
$res .= ' <td>'.$device['name'].'</td>';
|
|
$res .= ' <td>'.$device['hw'].'</td>';
|
|
$res .= ' <td>'.$device['port'].'</td>';
|
|
$res .= ' <td>'.$device['speed'].'</td>';
|
|
// $res .= " <td>".$device['descr']."</td>";
|
|
// $res .= " <td>".$device['notes']."</td>";
|
|
$res .= ' </tr>';
|
|
}
|
|
}
|
|
|
|
$res .= '</table>';
|
|
return $res;
|
|
|
|
}//end listBillPorts()
|
|
|
|
|
|
// Bitrate Graph overview
|
|
|
|
|
|
function graphOverviewBitrate($bill_id, $history) {
|
|
global $pdf;
|
|
$img = array();
|
|
|
|
$img['bitrate'] = genGraphs($bill_id, 'bitrate', $history['timestampfrom'], $history['timestampto'], $history['type']);
|
|
$bitrate = $pdf->serializeTCPDFtagParameters(array($img['bitrate'], 10, 44, 280, '', 'PNG', '', 'T'));
|
|
$res = '';
|
|
$res .= '<tcpdf method="Image" params="'.$bitrate.'" />';
|
|
return $res;
|
|
|
|
}//end graphOverviewBitrate()
|
|
|
|
|
|
// Transfer Graph overview
|
|
|
|
|
|
function graphOverviewTransfer($bill_id, $history) {
|
|
global $pdf;
|
|
$img = array();
|
|
|
|
$img['bw_day'] = genGraphs($bill_id, 'day', $history['timestampfrom'], $history['timestampto']);
|
|
$img['bw_hour'] = genGraphs($bill_id, 'hour', $history['timestampfrom'], $history['timestampto']);
|
|
$bw_day = $pdf->serializeTCPDFtagParameters(array($img['bw_day'], 10, 44, 280, '', 'PNG', '', 'T'));
|
|
$bw_hour = $pdf->serializeTCPDFtagParameters(array($img['bw_hour'], 10, 117, 280, '', 'PNG', '', 'T'));
|
|
$res = '';
|
|
$res .= '<tcpdf method="Image" params="'.$bw_day.'" />';
|
|
$res .= '<tcpdf method="Image" params="'.$bw_hour.'" />';
|
|
return $res;
|
|
|
|
}//end graphOverviewTransfer()
|
|
|
|
|
|
// Transfer overview
|
|
|
|
|
|
function transferOverview($bill_id, $history) {
|
|
global $list_colour_a, $list_colour_b, $config;
|
|
|
|
$i = 0;
|
|
$tot = array();
|
|
$traf = array();
|
|
$start = $history['timestampfrom'];
|
|
$end = $history['timestampto'];
|
|
// $background= $history['background'];
|
|
$res = '';
|
|
$res .= '<table class="transferOverview">';
|
|
$res .= ' <tr bgcolor="#000">';
|
|
$res .= ' <th class="period">Date</th>';
|
|
$res .= ' <th class="inbound">Inbound</th>';
|
|
$res .= ' <th class="outbound">Outbound</th>';
|
|
$res .= ' <th class="total">Total</th>';
|
|
$res .= ' </tr>';
|
|
foreach (dbFetch('SELECT DISTINCT UNIX_TIMESTAMP(timestamp) as timestamp, SUM(delta) as traf_total, SUM(in_delta) as traf_in, SUM(out_delta) as traf_out FROM bill_data WHERE `bill_id`= ? AND `timestamp` >= FROM_UNIXTIME(?) AND `timestamp` <= FROM_UNIXTIME(?) GROUP BY DATE(timestamp) ORDER BY timestamp ASC', array($bill_id, $start, $end)) as $data) {
|
|
$date = strftime('%A, %e %B %Y', $data['timestamp']);
|
|
$tot['in'] += gbConvert($data['traf_in']);
|
|
$tot['out'] += gbConvert($data['traf_out']);
|
|
$tot['tot'] += gbConvert($data['traf_total']);
|
|
$traf['in'] = formatStorage(gbConvert($data['traf_in']), '3');
|
|
$traf['out'] = formatStorage(gbConvert($data['traf_out']), '3');
|
|
$traf['tot'] = formatStorage(gbConvert($data['traf_total']), '3');
|
|
$row_colour = ((!is_integer($i / 2)) ? $list_colour_a : $list_colour_b );
|
|
$res .= ' <tr bgcolor="'.$row_colour.'">';
|
|
$res .= ' <td>'.$date.'</td>';
|
|
$res .= ' <td class="right">'.$traf['in'].'</td>';
|
|
$res .= ' <td class="right">'.$traf['out'].'</td>';
|
|
$res .= ' <td class="right">'.$traf['tot'].'</td>';
|
|
$res .= ' </tr>';
|
|
$i++;
|
|
}
|
|
|
|
$tot['in'] = formatStorage($tot['in']);
|
|
$tot['out'] = formatStorage($tot['out']);
|
|
$tot['tot'] = formatStorage($tot['tot']);
|
|
$res .= ' <tr bgcolor="#ccc" style="border-top: 1px solid #000;">';
|
|
$res .= ' <td></td>';
|
|
$res .= ' <td class="right"><b>'.$tot['in'].'</b></td>';
|
|
$res .= ' <td class="right"><b>'.$tot['out'].'</b></td>';
|
|
$res .= ' <td class="right"><b>'.$tot['tot'].'</b></td>';
|
|
$res .= ' </tr>';
|
|
$res .= '</table>';
|
|
return $res;
|
|
|
|
}//end transferOverview()
|
|
|
|
|
|
// Html template
|
|
$logo = $pdf->serializeTCPDFtagParameters(array('images/dummy-logo.png', 15, 18, 100, '', '', 'www.example.com', 'T'));
|
|
$html .= '<tcpdf method="Image" params="'.$logo.'" />';
|
|
$html .= '<h1 class="right">Billing Report</h1>';
|
|
$html .= '<p></p>';
|
|
$html .= '<p></p>';
|
|
$html .= '<p></p>';
|
|
|
|
$html .= '<h2>Billing information</h2>';
|
|
$html .= '<p></p>';
|
|
$html .= '<table>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th class="title">Customer</th>';
|
|
$html .= ' <td class="divider">:</td>';
|
|
$html .= ' <td class="content">'.$customer['name'].'</td>';
|
|
$html .= ' <td class="qtag" rowspan="6"><tcpdf method="write2DBarcode" params="'.$qrTag.'" /></td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Customer ID</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$customer['id'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Customer Info</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$customer['ref'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Customer Notes</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$customer['notes'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Billing ID</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$bill_id.'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>History ID</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$history_id.'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= '</table>';
|
|
$html .= '<p></p>';
|
|
|
|
$html .= '<h2>Billing period</h2>';
|
|
$html .= '<p></p>';
|
|
$html .= '<table>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th class="title">From</th>';
|
|
$html .= ' <td class="divider">:</td>';
|
|
$html .= ' <td class="content">'.$history['datefrom'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>To</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$history['dateto'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= '</table>';
|
|
$html .= '<p></p>';
|
|
$html .= '<p></p>';
|
|
|
|
$html .= '<h2>Device interface/port information</h2>';
|
|
$html .= '<p></p>';
|
|
$html .= listBillPorts($bill_id);
|
|
$html .= '<p></p>';
|
|
$html .= '<p></p>';
|
|
|
|
$html .= '<h2>Usage information</h2>';
|
|
$html .= '<p></p>';
|
|
$html .= '<table>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th class="title">Type</th>';
|
|
$html .= ' <td class="divider">:</td>';
|
|
$html .= ' <td class="content">'.$bill_type['95per'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <td></td>';
|
|
$html .= ' <td></td>';
|
|
$html .= ' <td>'.$bill_type['quota'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <td></td>';
|
|
$html .= ' <td></td>';
|
|
$html .= ' <td>'.$bill_type['average'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Transferred</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$history['used'].' (<span style="color: #'.$history['background']['left'].'; ">'.$history['percent'].'%</span>) </td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Inbound</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$history['in'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Outbound</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$history['out'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Allowed</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$history['allowed'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= ' <tr>';
|
|
$html .= ' <th>Overusage</th>';
|
|
$html .= ' <td>:</td>';
|
|
$html .= ' <td>'.$history['overusage'].'</td>';
|
|
$html .= ' </tr>';
|
|
$html .= '</table>';
|
|
|
|
$html .= '<tcpdf method="AddPage" params="'.$landscape.'" />';
|
|
$html .= '<h2>Bitrate Graph overview</h2>';
|
|
$html .= '<p></p>';
|
|
$html .= graphOverviewBitrate($bill_id, $history);
|
|
|
|
$html .= '<tcpdf method="AddPage" params="'.$landscape.'" />';
|
|
$html .= '<h2>Transfer Graph overview</h2>';
|
|
$html .= '<p></p>';
|
|
$html .= graphOverviewTransfer($bill_id, $history);
|
|
|
|
$html .= '<tcpdf method="AddPage" params="'.$portret.'" />';
|
|
$html .= '<h2>Detailed transfer overview</h2>';
|
|
$html .= '<p></p>';
|
|
$html .= transferOverview($bill_id, $history);
|