2017-03-11 02:51:06 +07:00
|
|
|
<?php
|
2023-10-20 14:31:56 +07:00
|
|
|
|
2017-03-11 02:51:06 +07:00
|
|
|
/**
|
2023-10-12 15:55:42 +07:00
|
|
|
* PHP Mikrotik Billing (https://github.com/hotspotbilling/phpnuxbill/)
|
|
|
|
* by https://t.me/ibnux
|
|
|
|
**/
|
|
|
|
|
2017-03-11 02:51:06 +07:00
|
|
|
_admin();
|
2024-02-13 13:54:01 +07:00
|
|
|
$ui->assign('_title', Lang::T('Reports'));
|
2017-03-11 02:51:06 +07:00
|
|
|
$ui->assign('_system_menu', 'reports');
|
|
|
|
|
|
|
|
$action = $routes['1'];
|
|
|
|
$ui->assign('_admin', $admin);
|
|
|
|
|
|
|
|
$mdate = date('Y-m-d');
|
|
|
|
$mtime = date('H:i:s');
|
|
|
|
$tdate = date('Y-m-d', strtotime('today - 30 days'));
|
|
|
|
$firs_day_month = date('Y-m-01');
|
|
|
|
$this_week_start = date('Y-m-d', strtotime('previous sunday'));
|
|
|
|
$before_30_days = date('Y-m-d', strtotime('today - 30 days'));
|
|
|
|
$month_n = date('n');
|
|
|
|
|
|
|
|
switch ($action) {
|
2024-08-12 16:53:40 +07:00
|
|
|
case 'ajax':
|
|
|
|
$data = $routes['2'];
|
|
|
|
$reset_day = $config['reset_day'];
|
|
|
|
if (empty($reset_day)) {
|
|
|
|
$reset_day = 1;
|
|
|
|
}
|
|
|
|
//first day of month
|
|
|
|
if (date("d") >= $reset_day) {
|
|
|
|
$start_date = date('Y-m-' . $reset_day);
|
|
|
|
} else {
|
|
|
|
$start_date = date('Y-m-' . $reset_day, strtotime("-1 MONTH"));
|
|
|
|
}
|
|
|
|
$sd = _req('sd', $start_date);
|
|
|
|
$ed = _req('ed', $mdate);
|
|
|
|
$ts = _req('ts', '00:00:00');
|
|
|
|
$te = _req('te', '23:59:59');
|
|
|
|
$types = ORM::for_table('tbl_transactions')->getEnum('type');
|
|
|
|
$tps = ($_GET['tps']) ? $_GET['tps'] : $types;
|
|
|
|
$plans = array_column(ORM::for_table('tbl_transactions')->select('plan_name')->distinct('plan_name')->find_array(), 'plan_name');
|
|
|
|
$plns = ($_GET['plns']) ? $_GET['plns'] : $plans;
|
|
|
|
$methods = array_column(ORM::for_table('tbl_transactions')->rawQuery("SELECT DISTINCT SUBSTRING_INDEX(`method`, ' - ', 1) as method FROM tbl_transactions;")->findArray(), 'method');
|
|
|
|
$mts = ($_GET['mts']) ? $_GET['mts'] : $methods;
|
|
|
|
$routers = array_column(ORM::for_table('tbl_transactions')->select('routers')->distinct('routers')->find_array(), 'routers');
|
|
|
|
$rts = ($_GET['rts']) ? $_GET['rts'] : $routers;
|
|
|
|
$result = [];
|
|
|
|
switch ($data) {
|
|
|
|
case 'type':
|
|
|
|
foreach ($tps as $tp) {
|
|
|
|
$query = ORM::for_table('tbl_transactions')
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) >= " . strtotime("$sd $ts"))
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) <= " . strtotime("$ed $te"))
|
|
|
|
->where('type', $tp);
|
|
|
|
if (count($mts) > 0) {
|
|
|
|
if (count($mts) != count($methods)) {
|
2025-03-04 15:16:48 +07:00
|
|
|
$w = [];
|
|
|
|
$v = [];
|
2024-08-12 16:53:40 +07:00
|
|
|
foreach ($mts as $mt) {
|
2025-03-22 16:15:16 +01:00
|
|
|
$w[] = 'method';
|
2025-03-04 15:16:48 +07:00
|
|
|
$v[] = "$mt - %";
|
2024-08-12 16:53:40 +07:00
|
|
|
}
|
2025-03-04 15:16:48 +07:00
|
|
|
$query->where_likes($w, $v);
|
2024-08-12 16:53:40 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (count($rts) > 0) {
|
|
|
|
$query->where_in('routers', $rts);
|
|
|
|
}
|
|
|
|
if (count($plns) > 0) {
|
|
|
|
$query->where_in('plan_name', $plns);
|
|
|
|
}
|
|
|
|
$count = $query->count();
|
|
|
|
if ($count > 0) {
|
|
|
|
$result['datas'][] = $count;
|
|
|
|
$result['labels'][] = "$tp ($count)";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'plan':
|
|
|
|
foreach ($plns as $pln) {
|
|
|
|
$query = ORM::for_table('tbl_transactions')
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) >= " . strtotime("$sd $ts"))
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) <= " . strtotime("$ed $te"))
|
|
|
|
->where('plan_name', $pln);
|
|
|
|
if (count($tps) > 0) {
|
|
|
|
$query->where_in('type', $tps);
|
|
|
|
}
|
|
|
|
if (count($mts) > 0) {
|
|
|
|
if (count($mts) != count($methods)) {
|
2025-03-04 15:16:48 +07:00
|
|
|
$w = [];
|
|
|
|
$v = [];
|
2024-08-12 16:53:40 +07:00
|
|
|
foreach ($mts as $mt) {
|
2025-03-22 16:15:16 +01:00
|
|
|
$w[] = 'method';
|
2025-03-04 15:16:48 +07:00
|
|
|
$v[] = "$mt - %";
|
2024-08-12 16:53:40 +07:00
|
|
|
}
|
2025-03-04 15:16:48 +07:00
|
|
|
$query->where_likes($w, $v);
|
2024-08-12 16:53:40 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (count($rts) > 0) {
|
|
|
|
$query->where_in('routers', $rts);
|
|
|
|
}
|
|
|
|
$count = $query->count();
|
|
|
|
if ($count > 0) {
|
|
|
|
$result['datas'][] = $count;
|
|
|
|
$result['labels'][] = "$pln ($count)";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'method':
|
|
|
|
foreach ($mts as $mt) {
|
|
|
|
$query = ORM::for_table('tbl_transactions')
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) >= " . strtotime("$sd $ts"))
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) <= " . strtotime("$ed $te"))
|
|
|
|
->where_like('method', "$mt - %");
|
|
|
|
if (count($tps) > 0) {
|
|
|
|
$query->where_in('type', $tps);
|
|
|
|
}
|
|
|
|
if (count($rts) > 0) {
|
|
|
|
$query->where_in('routers', $rts);
|
|
|
|
}
|
|
|
|
if (count($plns) > 0) {
|
|
|
|
$query->where_in('plan_name', $plns);
|
|
|
|
}
|
|
|
|
$count = $query->count();
|
|
|
|
if ($count > 0) {
|
|
|
|
$result['datas'][] = $count;
|
|
|
|
$result['labels'][] = "$mt ($count)";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 'router':
|
|
|
|
foreach ($rts as $rt) {
|
|
|
|
$query = ORM::for_table('tbl_transactions')
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) >= " . strtotime("$sd $ts"))
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) <= " . strtotime("$ed $te"))
|
|
|
|
->where('routers', $rt);
|
|
|
|
if (count($tps) > 0) {
|
|
|
|
$query->where_in('type', $tps);
|
|
|
|
}
|
|
|
|
if (count($plns) > 0) {
|
|
|
|
$query->where_in('plan_name', $plns);
|
|
|
|
}
|
|
|
|
$count = $query->count();
|
|
|
|
if ($count > 0) {
|
|
|
|
$result['datas'][] = $count;
|
|
|
|
$result['labels'][] = "$rt ($count)";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2024-08-13 11:42:22 +07:00
|
|
|
case 'line':
|
|
|
|
$query = ORM::for_table('tbl_transactions')
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) >= " . strtotime("$sd $ts"))
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) <= " . strtotime("$ed $te"))
|
|
|
|
->order_by_desc('id');
|
|
|
|
if (count($tps) > 0) {
|
|
|
|
$query->where_in('type', $tps);
|
|
|
|
}
|
|
|
|
if (count($mts) > 0) {
|
|
|
|
if (count($mts) != count($methods)) {
|
2025-03-04 15:16:48 +07:00
|
|
|
$w = [];
|
|
|
|
$v = [];
|
2024-08-13 11:42:22 +07:00
|
|
|
foreach ($mts as $mt) {
|
2025-03-22 16:15:16 +01:00
|
|
|
$w[] = 'method';
|
2025-03-04 15:16:48 +07:00
|
|
|
$v[] = "$mt - %";
|
2024-08-13 11:42:22 +07:00
|
|
|
}
|
2025-03-04 15:16:48 +07:00
|
|
|
$query->where_likes($w, $v);
|
2024-08-13 11:42:22 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (count($rts) > 0) {
|
|
|
|
$query->where_in('routers', $rts);
|
|
|
|
}
|
|
|
|
if (count($plns) > 0) {
|
|
|
|
$query->where_in('plan_name', $plns);
|
|
|
|
}
|
|
|
|
$datas = $query->find_array();
|
|
|
|
$period = new DatePeriod(
|
|
|
|
new DateTime($sd),
|
|
|
|
new DateInterval('P1D'),
|
|
|
|
new DateTime($ed)
|
|
|
|
);
|
|
|
|
$pos = 0;
|
|
|
|
$dates = [];
|
|
|
|
foreach ($period as $key => $value) {
|
|
|
|
$dates[] = $value->format('Y-m-d');
|
|
|
|
}
|
|
|
|
$dates = array_reverse($dates);
|
|
|
|
$result = [];
|
|
|
|
$temp;
|
|
|
|
foreach ($dates as $date) {
|
|
|
|
$result['labels'][] = $date;
|
|
|
|
// type
|
|
|
|
foreach ($tps as $key) {
|
|
|
|
if (!isset($temp[$key][$date])) {
|
|
|
|
$temp[$key][$date] = 0;
|
|
|
|
}
|
|
|
|
foreach ($datas as $data) {
|
|
|
|
if ($data['recharged_on'] == date('Y-m-d', strtotime($date)) && $data['type'] == $key) {
|
|
|
|
$temp[$key][$date] += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//plan
|
|
|
|
foreach ($plns as $key) {
|
|
|
|
if (!isset($temp[$key][$date])) {
|
|
|
|
$temp[$key][$date] = 0;
|
|
|
|
}
|
|
|
|
foreach ($datas as $data) {
|
|
|
|
if ($data['recharged_on'] == date('Y-m-d', strtotime($date)) && $data['plan_name'] == $key) {
|
|
|
|
$temp[$key][$date] += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//method
|
|
|
|
foreach ($mts as $key) {
|
|
|
|
if (!isset($temp[$key][$date])) {
|
|
|
|
$temp[$key][$date] = 0;
|
|
|
|
}
|
|
|
|
foreach ($datas as $data) {
|
|
|
|
if ($data['recharged_on'] == date('Y-m-d', strtotime($date)) && strpos($data['method'], $key) !== false) {
|
|
|
|
$temp[$key][$date] += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($rts as $key) {
|
|
|
|
if (!isset($temp[$key][$date])) {
|
|
|
|
$temp[$key][$date] = 0;
|
|
|
|
}
|
|
|
|
foreach ($datas as $data) {
|
|
|
|
if ($data['recharged_on'] == date('Y-m-d', strtotime($date)) && $data['routers'] == $key) {
|
|
|
|
$temp[$key][$date] += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$pos++;
|
|
|
|
if ($pos > 29) {
|
|
|
|
// only 30days
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
foreach ($temp as $key => $value) {
|
|
|
|
$array = ['label' => $key];
|
|
|
|
$total = 0;
|
|
|
|
foreach ($value as $k => $v) {
|
|
|
|
$total += $v;
|
|
|
|
$array['data'][] = $v;
|
|
|
|
}
|
2025-03-22 16:15:16 +01:00
|
|
|
if ($total > 0) {
|
2024-08-13 11:42:22 +07:00
|
|
|
$result['datas'][] = $array;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2024-08-12 16:53:40 +07:00
|
|
|
default:
|
|
|
|
$result = ['labels' => [], 'datas' => []];
|
|
|
|
}
|
|
|
|
echo json_encode($result);
|
|
|
|
die();
|
2022-10-16 14:48:21 +07:00
|
|
|
case 'by-date':
|
2023-10-20 14:31:56 +07:00
|
|
|
case 'activation':
|
2025-03-22 16:15:16 +01:00
|
|
|
$q = trim(_post('q') ?: _get('q'));
|
2023-10-20 14:31:56 +07:00
|
|
|
$keep = _post('keep');
|
2025-03-22 16:15:16 +01:00
|
|
|
|
2023-10-20 14:31:56 +07:00
|
|
|
if (!empty($keep)) {
|
2025-03-22 16:15:16 +01:00
|
|
|
ORM::raw_execute("DELETE FROM tbl_transactions WHERE date < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL ? DAY))", [$keep]);
|
|
|
|
r2(getUrl('reports/activation/'), 's', "Deleted logs older than $keep days");
|
2023-10-20 14:31:56 +07:00
|
|
|
}
|
2025-03-22 16:15:16 +01:00
|
|
|
|
|
|
|
$query = ORM::for_table('tbl_transactions')
|
|
|
|
->left_outer_join('tbl_customers', 'tbl_transactions.username = tbl_customers.username')
|
|
|
|
->select('tbl_transactions.*')
|
|
|
|
->select('tbl_customers.fullname', 'fullname')
|
|
|
|
->order_by_desc('tbl_transactions.id');
|
|
|
|
|
|
|
|
if ($q !== '') {
|
|
|
|
$query->where_like('invoice', "%$q%");
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2024-03-27 09:44:48 +07:00
|
|
|
$d = Paginator::findMany($query, ['q' => $q]);
|
2025-03-22 16:15:16 +01:00
|
|
|
} catch (Exception $e) {
|
|
|
|
r2(getUrl('reports/activation/'), 'e','Database query failed: ' . $e->getMessage());
|
|
|
|
$d = [];
|
2023-10-20 14:31:56 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
$ui->assign('activation', $d);
|
|
|
|
$ui->assign('q', $q);
|
2025-02-04 10:56:02 +07:00
|
|
|
$ui->display('admin/reports/activation.tpl');
|
2023-10-20 14:31:56 +07:00
|
|
|
break;
|
2022-09-18 00:00:40 +07:00
|
|
|
|
2017-03-11 02:51:06 +07:00
|
|
|
case 'by-period':
|
2023-10-20 14:31:56 +07:00
|
|
|
$ui->assign('mdate', $mdate);
|
|
|
|
$ui->assign('mtime', $mtime);
|
|
|
|
$ui->assign('tdate', $tdate);
|
2022-09-18 00:00:40 +07:00
|
|
|
run_hook('view_reports_by_period'); #HOOK
|
2025-02-04 10:56:02 +07:00
|
|
|
$ui->display('admin/reports/period.tpl');
|
2017-03-11 02:51:06 +07:00
|
|
|
break;
|
2022-09-18 00:00:40 +07:00
|
|
|
|
2017-03-11 02:51:06 +07:00
|
|
|
case 'period-view':
|
|
|
|
$fdate = _post('fdate');
|
|
|
|
$tdate = _post('tdate');
|
|
|
|
$stype = _post('stype');
|
2022-09-18 00:00:40 +07:00
|
|
|
|
2017-03-11 02:51:06 +07:00
|
|
|
$d = ORM::for_table('tbl_transactions');
|
2023-10-20 14:31:56 +07:00
|
|
|
if ($stype != '') {
|
|
|
|
$d->where('type', $stype);
|
|
|
|
}
|
2022-09-18 00:00:40 +07:00
|
|
|
|
2017-03-11 02:51:06 +07:00
|
|
|
$d->where_gte('recharged_on', $fdate);
|
|
|
|
$d->where_lte('recharged_on', $tdate);
|
|
|
|
$d->order_by_desc('id');
|
2025-03-22 16:15:16 +01:00
|
|
|
$x = $d->find_many();
|
2022-09-18 00:00:40 +07:00
|
|
|
|
2023-10-20 14:31:56 +07:00
|
|
|
$dr = ORM::for_table('tbl_transactions');
|
|
|
|
if ($stype != '') {
|
|
|
|
$dr->where('type', $stype);
|
|
|
|
}
|
2022-09-18 00:00:40 +07:00
|
|
|
|
2017-03-11 02:51:06 +07:00
|
|
|
$dr->where_gte('recharged_on', $fdate);
|
|
|
|
$dr->where_lte('recharged_on', $tdate);
|
2023-10-20 14:31:56 +07:00
|
|
|
$xy = $dr->sum('price');
|
2022-09-18 00:00:40 +07:00
|
|
|
|
2023-10-20 14:31:56 +07:00
|
|
|
$ui->assign('d', $x);
|
|
|
|
$ui->assign('dr', $xy);
|
|
|
|
$ui->assign('fdate', $fdate);
|
|
|
|
$ui->assign('tdate', $tdate);
|
|
|
|
$ui->assign('stype', $stype);
|
2022-09-18 00:00:40 +07:00
|
|
|
run_hook('view_reports_period'); #HOOK
|
2025-02-04 10:56:02 +07:00
|
|
|
$ui->display('admin/reports/period-view.tpl');
|
2017-03-11 02:51:06 +07:00
|
|
|
break;
|
2022-09-18 00:00:40 +07:00
|
|
|
|
2024-07-24 15:56:02 +07:00
|
|
|
case 'daily-report':
|
2017-03-11 02:51:06 +07:00
|
|
|
default:
|
2024-07-24 15:56:02 +07:00
|
|
|
$types = ORM::for_table('tbl_transactions')->getEnum('type');
|
|
|
|
$methods = array_column(ORM::for_table('tbl_transactions')->rawQuery("SELECT DISTINCT SUBSTRING_INDEX(`method`, ' - ', 1) as method FROM tbl_transactions;")->findArray(), 'method');
|
|
|
|
$routers = array_column(ORM::for_table('tbl_transactions')->select('routers')->distinct('routers')->find_array(), 'routers');
|
|
|
|
$plans = array_column(ORM::for_table('tbl_transactions')->select('plan_name')->distinct('plan_name')->find_array(), 'plan_name');
|
|
|
|
$reset_day = $config['reset_day'];
|
|
|
|
if (empty($reset_day)) {
|
|
|
|
$reset_day = 1;
|
|
|
|
}
|
|
|
|
//first day of month
|
|
|
|
if (date("d") >= $reset_day) {
|
|
|
|
$start_date = date('Y-m-' . $reset_day);
|
|
|
|
} else {
|
|
|
|
$start_date = date('Y-m-' . $reset_day, strtotime("-1 MONTH"));
|
|
|
|
}
|
|
|
|
$tps = ($_GET['tps']) ? $_GET['tps'] : $types;
|
|
|
|
$mts = ($_GET['mts']) ? $_GET['mts'] : $methods;
|
|
|
|
$rts = ($_GET['rts']) ? $_GET['rts'] : $routers;
|
|
|
|
$plns = ($_GET['plns']) ? $_GET['plns'] : $plans;
|
|
|
|
$sd = _req('sd', $start_date);
|
|
|
|
$ed = _req('ed', $mdate);
|
|
|
|
$ts = _req('ts', '00:00:00');
|
|
|
|
$te = _req('te', '23:59:59');
|
2024-08-09 17:24:43 +07:00
|
|
|
$urlquery = str_replace('_route=reports', '', $_SERVER['QUERY_STRING']);
|
2024-07-24 15:56:02 +07:00
|
|
|
|
|
|
|
|
|
|
|
$query = ORM::for_table('tbl_transactions')
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) >= " . strtotime("$sd $ts"))
|
|
|
|
->whereRaw("UNIX_TIMESTAMP(CONCAT(`recharged_on`,' ',`recharged_time`)) <= " . strtotime("$ed $te"))
|
|
|
|
->order_by_desc('id');
|
|
|
|
if (count($tps) > 0) {
|
|
|
|
$query->where_in('type', $tps);
|
|
|
|
}
|
|
|
|
if (count($mts) > 0) {
|
2025-03-04 13:37:52 +07:00
|
|
|
$w = [];
|
|
|
|
$v = [];
|
|
|
|
foreach ($mts as $mt) {
|
2025-03-22 16:15:16 +01:00
|
|
|
$w[] = 'method';
|
2025-03-04 13:37:52 +07:00
|
|
|
$v[] = "$mt - %";
|
2024-07-24 15:56:02 +07:00
|
|
|
}
|
2025-03-04 13:37:52 +07:00
|
|
|
$query->where_likes($w, $v);
|
2024-07-24 15:56:02 +07:00
|
|
|
}
|
|
|
|
if (count($rts) > 0) {
|
|
|
|
$query->where_in('routers', $rts);
|
|
|
|
}
|
|
|
|
if (count($plns) > 0) {
|
|
|
|
$query->where_in('plan_name', $plns);
|
|
|
|
}
|
|
|
|
$d = Paginator::findMany($query, [], 100, $urlquery);
|
|
|
|
$dr = $query->sum('price');
|
|
|
|
|
|
|
|
$ui->assign('methods', $methods);
|
|
|
|
$ui->assign('types', $types);
|
|
|
|
$ui->assign('routers', $routers);
|
|
|
|
$ui->assign('plans', $plans);
|
|
|
|
$ui->assign('filter', $urlquery);
|
|
|
|
|
|
|
|
// time
|
|
|
|
$ui->assign('sd', $sd);
|
|
|
|
$ui->assign('ed', $ed);
|
|
|
|
$ui->assign('ts', $ts);
|
|
|
|
$ui->assign('te', $te);
|
|
|
|
|
|
|
|
$ui->assign('mts', $mts);
|
|
|
|
$ui->assign('tps', $tps);
|
|
|
|
$ui->assign('rts', $rts);
|
|
|
|
$ui->assign('plns', $plns);
|
|
|
|
|
|
|
|
$ui->assign('d', $d);
|
|
|
|
$ui->assign('dr', $dr);
|
|
|
|
$ui->assign('mdate', $mdate);
|
|
|
|
run_hook('view_daily_reports'); #HOOK
|
2025-02-04 10:56:02 +07:00
|
|
|
$ui->display('admin/reports/list.tpl');
|
2024-07-24 15:56:02 +07:00
|
|
|
break;
|
2023-10-20 14:31:56 +07:00
|
|
|
}
|