// Level 9 이하만 사용 가능
$func->checkLevelModal(9);
// 기능 제한 (Admin : 1, Staff : 5, Accounting : 6, Driver : 9 만 가능)
$permit = array("1", "3", "5", "6", "7", "9");
if (in_array($_SESSION['ss_LEVEL'], $permit)) {
$setTag = "ENABLED";
}
else {
$setTag = "DISABLED";
$msg = "Sorry, You don't have permission. Please contact Administrator.";
$func -> modalMsg ($msg, "/index_intranet.php");
exit();
}
$APPLYDATE = "20260316000000";
$applyDay = substr($APPLYDATE, 0, 8);
$fromRaw = isset($_REQUEST['fromDate']) ? preg_replace('/[^0-9]/', '', $_REQUEST['fromDate']) : '';
$toRaw = isset($_REQUEST['toDate']) ? preg_replace('/[^0-9]/', '', $_REQUEST['toDate']) : '';
if ($fromRaw === '' && isset($_REQUEST['fromYear'])) {
$fromRaw = preg_replace('/[^0-9]/','',$_REQUEST['fromYear'])
. sprintf("%02d",(int)preg_replace('/[^0-9]/','',$_REQUEST['fromMonth']))
. sprintf("%02d",(int)preg_replace('/[^0-9]/','',$_REQUEST['fromDay']));
}
if ($toRaw === '' && isset($_REQUEST['toYear'])) {
$toRaw = preg_replace('/[^0-9]/','',$_REQUEST['toYear'])
. sprintf("%02d",(int)preg_replace('/[^0-9]/','',$_REQUEST['toMonth']))
. sprintf("%02d",(int)preg_replace('/[^0-9]/','',$_REQUEST['toDay']));
}
if (strlen($fromRaw) !== 8) $fromRaw = date('Ym') . '01';
if (strlen($toRaw) !== 8) $toRaw = date('Ymd');
$periodStart = $fromRaw;
$periodEnd = $toRaw;
$fromDateVal = substr($fromRaw,0,4) . '-' . substr($fromRaw,4,2) . '-' . substr($fromRaw,6,2);
$toDateVal = substr($toRaw,0,4) . '-' . substr($toRaw,4,2) . '-' . substr($toRaw,6,2);
if ($periodStart > $periodEnd) {
$tmp = $periodStart; $periodStart = $periodEnd; $periodEnd = $tmp;
}
$periodLabel = $periodStart . " ~ " . $periodEnd;
$searchDriver = isset($_REQUEST['searchDriver']) ? $_REQUEST['searchDriver'] : 'ALL';
if ($searchDriver !== 'ALL') $searchDriver = preg_replace('/[^0-9]/', '', $searchDriver);
if ($searchDriver === '') $searchDriver = 'ALL';
$drivers = array();
$qry_dr = "SELECT dr_uid, dr_initial, dr_lastname, dr_firstname
FROM tbl_driver
WHERE dr_status = 'A' AND dr_type = 'UCO'
AND dr_initial <> 'I.N'
ORDER BY dr_initial ASC ";
$rt_dr = $jdb->nQuery($qry_dr, "driver list error");
while ($lt_dr = mysqli_fetch_array($rt_dr, MYSQLI_ASSOC)) {
$drivers[] = $lt_dr;
}
$selectStr = ($searchDriver == "ALL") ? "selected" : "";
$c_driveruidSTR = "";
foreach ($drivers as $d) {
$sel = ($d['dr_uid'] == $searchDriver) ? "selected" : "";
$c_driveruidSTR .= "";
}
$getDriverInitial = ($searchDriver == "ALL") ? "ALL" : "";
$drFilter_d = ($searchDriver == "ALL") ? "" : " AND d_druid = '" . (int)$searchDriver . "' ";
$drFilter_h = ($searchDriver == "ALL") ? "" : " AND h_druid = '" . (int)$searchDriver . "' ";
function calcDriverBalance($jdb, $APPLYDATE, $druid, $asOf)
{
static $cache = array();
$druid = (int)$druid;
$asOf = preg_replace('/[^0-9]/', '', $asOf);
$applyDay = substr($APPLYDATE, 0, 8);
if (!isset($cache[$druid])) {
$c = array(
'out' => array(),
'in' => array(),
'r' => array(),
'g' => array(),
'days_out' => array(),
);
$q1 = "SELECT SUBSTRING(d_visitdate,1,8) AS dd, SUM(d_payamount) AS amt
FROM tbl_daily
WHERE d_druid = '$druid'
AND d_visitdate >= '$APPLYDATE'
AND d_paystatus = 'P' AND d_status = 'F'
GROUP BY SUBSTRING(d_visitdate,1,8) ";
$r1 = $jdb->nQuery($q1, "calc out err");
while ($row = mysqli_fetch_array($r1, MYSQLI_ASSOC)) {
$c['out'][$row['dd']] = (float)$row['amt'];
}
$q2 = "SELECT h_date, h_balance_in, h_balance_r, h_balance_g
FROM tbl_memberhis
WHERE h_druid = '$druid' AND h_date >= '$applyDay'
ORDER BY h_uid ASC ";
$r2 = $jdb->nQuery($q2, "calc his err");
while ($row = mysqli_fetch_array($r2, MYSQLI_ASSOC)) {
$d = $row['h_date'];
$c['in'][$d] = (float)$row['h_balance_in'];
$c['r'][$d] = (float)$row['h_balance_r'];
$c['g'][$d] = (float)$row['h_balance_g'];
}
$cache[$druid] = $c;
}
$c = $cache[$druid];
$cashoutTODAY = isset($c['out'][$asOf]) ? $c['out'][$asOf] : 0;
$cashinTODAY = isset($c['in'][$asOf]) ? $c['in'][$asOf] : 0;
$cashrtTODAY = isset($c['r'][$asOf]) ? $c['r'][$asOf] : 0;
$gasTODAY = isset($c['g'][$asOf]) ? $c['g'][$asOf] : 0;
$cashoutSUM = 0;
foreach ($c['out'] as $d => $v) { if ($d < $asOf) $cashoutSUM += $v; }
$cashinSUM = 0;
foreach ($c['in'] as $d => $v) { if ($d < $asOf) $cashinSUM += $v; }
$cashrtSUM = 0;
foreach ($c['r'] as $d => $v) { if ($d < $asOf) $cashrtSUM += $v; }
$balance = $cashinSUM + $cashinTODAY - $cashrtTODAY - $cashoutTODAY - $cashrtSUM - $cashoutSUM;
$openingbalance = $cashinSUM - $cashrtSUM - $cashoutSUM;
if ($asOf < $applyDay) {
$balance = 0;
$openingbalance = 0;
}
return array(
'opening' => $openingbalance,
'cashin' => $cashinTODAY,
'cashout' => $cashoutTODAY,
'cashrt' => $cashrtTODAY,
'balance' => $balance,
'gas' => $gasTODAY,
);
}
if (!isset($page) || !$page) $page = isset($_REQUEST['page']) ? (int)$_REQUEST['page'] : 1;
if ($page < 1) $page = 1;
$list_count = 20;
if (!isset($page_count) || !$page_count) $page_count = isset($INIT_PAGEVIEWCNT) ? $INIT_PAGEVIEWCNT : 10;
$rowStart = ($page - 1) * $list_count;
$drFilter_u = ($searchDriver == "ALL") ? "" : " AND druid = '" . (int)$searchDriver . "' ";
$qry_union = "SELECT orderdate, druid FROM (
SELECT d_orderdate AS orderdate, d_druid AS druid
FROM tbl_daily
WHERE d_orderdate >= '$periodStart' AND d_orderdate <= '$periodEnd'
UNION
SELECT h_date AS orderdate, h_druid AS druid
FROM tbl_memberhis
WHERE h_date >= '$periodStart' AND h_date <= '$periodEnd'
) AS U
INNER JOIN tbl_driver ON (U.druid = dr_uid AND dr_type = 'UCO')
WHERE 1=1 AND dr_initial <> 'I.N' $drFilter_u
GROUP BY orderdate, druid ";
$qry_count = "SELECT COUNT(*) FROM ( $qry_union ) AS CNT ";
$total_count = (int)$jdb->rQuery($qry_count, "count error");
$qry_rows = "SELECT U2.orderdate AS d_orderdate, U2.druid AS d_druid,
dr_initial AS m_initial, dr_lastname AS m_lastname, dr_firstname AS m_firstname
FROM ( $qry_union ) AS U2
INNER JOIN tbl_driver ON (U2.druid = dr_uid AND dr_type = 'UCO')
ORDER BY U2.orderdate DESC, dr_initial ASC
LIMIT $rowStart, $list_count ";
$rt_rows = $jdb->nQuery($qry_rows, "rows error");
$pageRows = array();
while ($r = mysqli_fetch_array($rt_rows, MYSQLI_ASSOC)) {
$pageRows[] = $r;
}
$strList = "";
$list_number = $total_count - $rowStart;
foreach ($pageRows as $row) {
$asOf = $row['d_orderdate'];
$dateLabel = $func->convertFormat($asOf, 3);
$b = calcDriverBalance($jdb, $APPLYDATE, $row['d_druid'], $asOf);
$driverShow = htmlspecialchars($row['m_lastname'] . $row['m_firstname'] . " (" . $row['m_initial'] . ")");
$strList .= "
| $list_number |
$dateLabel |
$driverShow |
" . number_format($b['opening'], 2) . " |
" . number_format($b['cashin'], 2) . " |
" . number_format($b['cashout'], 2) . " |
" . number_format($b['cashrt'], 2) . " |
" . number_format($b['balance'], 2) . " |
" . number_format($b['gas'], 2) . " |
";
$list_number--;
}
if ($total_count == 0) {
$strList = "| No Data |
";
}
$sumKey = $periodStart . '_' . $periodEnd . '_' . $searchDriver;
$needCalc = true;
if (isset($_SESSION['exp_sumkey']) && $_SESSION['exp_sumkey'] === $sumKey
&& isset($_SESSION['exp_sum'])) {
$s = $_SESSION['exp_sum'];
$sumIn = $s['in']; $sumRt = $s['rt']; $sumGas = $s['gas']; $sumOut = $s['out'];
$sumBal = $sumIn - $sumRt - $sumOut;
$sumEndBal = isset($s['endbal']) ? $s['endbal'] : 0;
$sumOpenBal = isset($s['openbal']) ? $s['openbal'] : 0;
$needCalc = false;
}
if ($needCalc) {
$qry_sum = "SELECT
SUM(h_balance_in) AS CASHINSUM,
SUM(h_balance_r) AS CASHRETURNSUM,
SUM(h_balance_g) AS GASSUM
FROM tbl_memberhis
WHERE h_date >= '$periodStart' AND h_date <= '$periodEnd'
$drFilter_h ";
$rt_sum = $jdb->fQuery($qry_sum, "sum error");
$sumIn = (float)$rt_sum['CASHINSUM'];
$sumRt = (float)$rt_sum['CASHRETURNSUM'];
$sumGas = (float)$rt_sum['GASSUM'];
$qry_cashout = "SELECT SUM(d_payamount) FROM tbl_daily
WHERE (d_visitdate >= '" . $periodStart . "000000'
AND d_visitdate <= '" . $periodEnd . "235959')
$drFilter_d
AND d_paystatus = 'P' AND d_status = 'F' ";
$sumOut = (float)$jdb->rQuery($qry_cashout, "cashout sum error");
$sumBal = $sumIn - $sumRt - $sumOut;
$sumEndBal = 0;
$sumOpenBal = 0;
$qry_enddr = "SELECT DISTINCT druid FROM (
SELECT d_druid AS druid FROM tbl_daily
WHERE d_orderdate >= '$periodStart' AND d_orderdate <= '$periodEnd'
UNION
SELECT h_druid AS druid FROM tbl_memberhis
WHERE h_date >= '$periodStart' AND h_date <= '$periodEnd'
) AS UD
INNER JOIN tbl_driver ON (UD.druid = dr_uid AND dr_type = 'UCO')
WHERE 1=1 AND dr_initial <> 'I.N' $drFilter_u ";
$rt_enddr = $jdb->nQuery($qry_enddr, "end-balance drivers error");
while ($ed = mysqli_fetch_array($rt_enddr, MYSQLI_ASSOC)) {
$eb = calcDriverBalance($jdb, $APPLYDATE, $ed['druid'], $periodEnd);
$sumEndBal += $eb['balance'];
// 기간초(periodStart) 시점 잔액 = 그날의 opening
$ob = calcDriverBalance($jdb, $APPLYDATE, $ed['druid'], $periodStart);
$sumOpenBal += $ob['opening'];
}
$_SESSION['exp_sumkey'] = $sumKey;
$_SESSION['exp_sum'] = array('in'=>$sumIn,'rt'=>$sumRt,'gas'=>$sumGas,'out'=>$sumOut,'endbal'=>$sumEndBal,'openbal'=>$sumOpenBal);
}
$getCASHINSUM = number_format($sumIn, 2);
$getCASHRETURNSUM = number_format($sumRt, 2);
$getGASSUM = number_format($sumGas, 2);
$getCASHOUTSUM = number_format($sumOut, 2);
$getBALANCESUM = number_format($sumBal, 2);
$getENDBALANCESUM = number_format($sumEndBal, 2);
$getOPENINGSUM = number_format($sumOpenBal, 2);
$getINOUTDIFF = number_format($sumIn - $sumOut, 2);
addLog("add", "EXPENSE LIST", "VIEW", $lguserid, "report_expense", $lgno);
?>
';
echo '
'.$label.'
';
echo '
'.$value.'
';
echo '
';
}
function opSign($s) {
$color = '#b4bbb6';
if ($s === '+') $color = '#7fae8c';
if ($s === '−') $color = '#d4a5ad';
$size = ($s === ',') ? '40px' : '26px';
$w = ($s === ',') ? '44px' : '36px';
if ($s === ',') {
$inner = '
,';
} else {
$inner = $s;
}
echo '
'.$inner.'
';
}
?>
Summary
/ From the driver's perspective
PERIOD · =$periodLabel?>
CASH IN − CASH OUT
=$getINOUTDIFF?>
| No |
Date |
Driver |
Opening Balance |
Cash In |
Cash Out |
Cash Return |
Balance |
Gas |
=$strList?>