bill_history.bill_allowed) OR (bill_history.bill_type = 'quota' AND bill_history.traf_total > bill_allowed))"; } else { $wheres[] = "((bill_type = 'cdr' AND rate_95th > bill_cdr) OR (bill_type = 'quota' AND total_data > bill_quota))"; } } } if ($prev) { $select = 'SELECT bills.bill_name, bills.bill_notes, bill_history.*, bill_history.traf_total as total_data, bill_history.traf_in as total_data_in, bill_history.traf_out as total_data_out '; $query = 'FROM `bills` INNER JOIN (SELECT bill_id, MAX(bill_hist_id) AS bill_hist_id FROM bill_history WHERE bill_dateto < NOW() AND bill_dateto > subdate(NOW(), 40) GROUP BY bill_id) qLastBills ON bills.bill_id = qLastBills.bill_id INNER JOIN bill_history ON qLastBills.bill_hist_id = bill_history.bill_hist_id '; } else { $select = "SELECT bills.*, IF(bills.bill_type = 'CDR', bill_cdr, bill_quota) AS bill_allowed "; $query = "FROM `bills`\n"; } // Permissions check if (! Auth::user()->hasGlobalRead()) { $query .= ' INNER JOIN `bill_perms` AS `BP` ON `bills`.`bill_id` = `BP`.`bill_id` '; $wheres[] = '`BP`.`user_id`=?'; $param[] = Auth::id(); } if (sizeof($wheres) > 0) { $query .= 'WHERE ' . implode(' AND ', $wheres) . "\n"; } $orderby = 'ORDER BY bills.bill_name'; $total = dbFetchCell("SELECT COUNT(bills.bill_id) $query", $param); $sql = "$select $query"; if (! isset($sort) || empty($sort)) { $sort = 'bills.bill_name'; } $sql .= "\nORDER BY $sort"; if (isset($current)) { $limit_low = (($current * $rowCount) - $rowCount); $limit_high = $rowCount; } if ($rowCount != -1) { $sql .= " LIMIT $limit_low,$limit_high"; } foreach (dbFetchRows($sql, $param) as $bill) { if ($prev) { $datefrom = $bill['bill_datefrom']; $dateto = $bill['bill_dateto']; } else { $day_data = Billing::getDates($bill['bill_day'], 0); $datefrom = $day_data['0']; $dateto = $day_data['1']; } $rate_95th = Number::formatSi($bill['rate_95th'], 2, 3, '') . 'bps'; $dir_95th = $bill['dir_95th']; $total_data = Billing::formatBytes($bill['total_data']); $rate_average = $bill['rate_average']; $url = \LibreNMS\Util\Url::generate(['page' => 'bill', 'bill_id' => $bill['bill_id']]); $used95th = Number::formatSi($bill['rate_95th'], 2, 3, '') . 'bps'; $notes = htmlentities($bill['bill_notes']); if ($prev) { $percent = $bill['bill_percent']; $overuse = $bill['bill_overuse']; } else { } if (strtolower($bill['bill_type']) == 'cdr') { $type = 'CDR'; $allowed = Number::formatSi($bill['bill_allowed'], 2, 3, '') . 'bps'; $in = Number::formatSi($bill['rate_95th_in'], 2, 3, '') . 'bps'; $out = Number::formatSi($bill['rate_95th_out'], 2, 3, '') . 'bps'; if (! $prev) { $percent = Number::calculatePercent($bill['rate_95th'], $bill['bill_allowed']); $overuse = ($bill['rate_95th'] - $bill['bill_allowed']); } $overuse_formatted = Number::formatSi($overuse, 2, 3, '') . 'bps'; $used = $rate_95th; $tmp_used = $bill['rate_95th']; $rate_95th = "$rate_95th"; } elseif (strtolower($bill['bill_type']) == 'quota') { $type = 'Quota'; $allowed = Billing::formatBytes($bill['bill_allowed']); if (! empty($prev)) { $in = Billing::formatBytes($bill['traf_in']); $out = Billing::formatBytes($bill['traf_out']); } else { $in = Billing::formatBytes($bill['total_data_in']); $out = Billing::formatBytes($bill['total_data_out']); } if (! $prev) { $percent = Number::calculatePercent($bill['total_data'], $bill['bill_allowed']); $overuse = ($bill['total_data'] - $bill['bill_allowed']); } $overuse_formatted = Billing::formatBytes($overuse); $used = $total_data; $tmp_used = $bill['total_data']; $total_data = "$total_data"; } $background = \LibreNMS\Util\Color::percentage($percent, null); $right_background = $background['right']; $left_background = $background['left']; $overuse_formatted = (($overuse <= 0) ? '-' : "$overuse_formatted"); $bill_name = "" . htmlentities($bill['bill_name']) . '
' . date('Y-m-d', strtotime($datefrom)) . ' to ' . date('Y-m-d', strtotime($dateto)); $bar = print_percentage_bar(250, 20, $percent, null, 'ffffff', $background['left'], $percent . '%', 'ffffff', $background['right']); $actions = ''; if (! $prev && Auth::user()->hasGlobalAdmin()) { $actions .= " 'bill', 'bill_id' => $bill['bill_id'], 'view' => 'edit']) . "'> Edit "; } if (strtolower($bill['bill_type']) == 'cdr') { $predicted = Number::formatSi(Billing::getPredictedUsage($bill['bill_day'], $tmp_used), 2, 3, '') . 'bps'; } elseif (strtolower($bill['bill_type']) == 'quota') { $predicted = Billing::formatBytes(Billing::getPredictedUsage($bill['bill_day'], $tmp_used)); } $response[] = [ 'bill_name' => $bill_name, 'notes' => $notes, 'bill_type' => $type, 'bill_allowed' => $allowed, 'total_data_in' => $in, 'total_data_out'=> $out, 'total_data' => $total_data, 'rate_95th' => $rate_95th, 'used' => $used, 'overusage' => $overuse_formatted, 'predicted' => $predicted, 'graph' => $bar, 'actions' => $actions, ]; } $output = ['current' => $current, 'rowCount' => $rowCount, 'rows' => $response, 'total' => $total]; echo json_encode($output, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);