-[EXPENSE] 날짜 선택 및 빠른 기간 버튼 추가, 요약 테이블 카드형으로 변경
This commit is contained in:
Kang Lee 2026-07-02 10:39:20 -04:00
parent 195feeb1d8
commit 2352624821
2 changed files with 762 additions and 396 deletions

View File

@ -17,331 +17,275 @@ else {
$APPLYDATE = "20260316000000"; $APPLYDATE = "20260316000000";
$applyDay = substr($APPLYDATE, 0, 8);
$add_srchquery = ""; $fromRaw = isset($_REQUEST['fromDate']) ? preg_replace('/[^0-9]/', '', $_REQUEST['fromDate']) : '';
$add_query = ""; $toRaw = isset($_REQUEST['toDate']) ? preg_replace('/[^0-9]/', '', $_REQUEST['toDate']) : '';
$add_subqry = "";
$add_hsubqry = "";
$add_dsubqry = "";
// searching if ($fromRaw === '' && isset($_REQUEST['fromYear'])) {
if($key_word) { $fromRaw = preg_replace('/[^0-9]/','',$_REQUEST['fromYear'])
. sprintf("%02d",(int)preg_replace('/[^0-9]/','',$_REQUEST['fromMonth']))
$key_wordStr = urldecode(trim($key_word)); . sprintf("%02d",(int)preg_replace('/[^0-9]/','',$_REQUEST['fromDay']));
//$add_srchquery .= " AND ((m_userid LIKE '%$key_wordStr%') OR (m_firstname LIKE '%$key_wordStr%') OR (m_cell LIKE '%$key_wordStr%'))"; }
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']));
} }
// sorting if (strlen($fromRaw) !== 8) $fromRaw = date('Ym') . '01';
if($switch) { if (strlen($toRaw) !== 8) $toRaw = date('Ymd');
$switched = $func -> switchOrder($switch, $switched);
$add_query .= " ORDER BY $switch $switched "; $periodStart = $fromRaw;
$switched = $switch . "^" . $switched; $periodEnd = $toRaw;
}else if($switched) {
$switched1 = explode("^", $switched); $fromDateVal = substr($fromRaw,0,4) . '-' . substr($fromRaw,4,2) . '-' . substr($fromRaw,6,2);
$add_query .= " ORDER BY $switched1[0] $switched1[1] "; $toDateVal = substr($toRaw,0,4) . '-' . substr($toRaw,4,2) . '-' . substr($toRaw,6,2);
} else {
$add_query .= " ORDER BY d_orderdate DESC, m_initial ASC "; 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;
} }
$getSWHStr = $switched; $selectStr = ($searchDriver == "ALL") ? "selected" : "";
$c_driveruidSTR = "<option value='ALL' $selectStr>ALL</option>";
/* foreach ($drivers as $d) {
SELECT COUNT(*) FROM ( $sel = ($d['dr_uid'] == $searchDriver) ? "selected" : "";
select d_orderdate, m_initial from tbl_daily $c_driveruidSTR .= "<option value='" . $d['dr_uid'] . "' $sel>" . htmlspecialchars($d['dr_lastname'] . $d['dr_firstname'] . " (" . $d['dr_initial'] . ")") . "</option>";
INNER JOIN tbl_member ON (d_driveruid = m_uid)
group by d_orderdate,d_driveruid
order by d_orderdate DESC, m_initial ASC
) as ORDERLIST
*/
//SELECT d_orderdate,m_initial,d_driveruid, COUNT(*) FROM tbl_daily
//INNER JOIN tbl_member ON (d_driveruid = m_uid)
//GROUP BY d_orderdate,d_driveruid
//ORDER BY d_orderdate DESC, m_initial ASC
if ($startYear == "" || $startMonth == "") {
$startYear = date('Y');
$startMonth = date('m');
} }
$getDriverInitial = ($searchDriver == "ALL") ? "ALL" : "";
if ($searchDriver == "") $searchDriver = "ALL"; $drFilter_d = ($searchDriver == "ALL") ? "" : " AND d_druid = '" . (int)$searchDriver . "' ";
$drFilter_h = ($searchDriver == "ALL") ? "" : " AND h_druid = '" . (int)$searchDriver . "' ";
if ($startYear != "" && $startMonth != "") $add_subqry = " AND (d_orderdate LIKE '$startYear$startMonth%') "; function calcDriverBalance($jdb, $APPLYDATE, $druid, $asOf)
else $add_subqry = "AND (d_orderdate LIKE '".date('Y').date('m')."%') ";
if ($searchDriver != "") {
if ($searchDriver == "ALL") {
$add_subqry .= "";
$add_hsubqry .= "";
$add_dsubqry .= "";
}
else {
$add_subqry .= " AND m_currentdriver = '".$searchDriver."' ";
$add_hsubqry .= " AND h_druid = '".$searchDriver."' ";
$add_dsubqry .= " AND d_druid = '".$searchDriver."' ";
}
}
else {
$add_subqry .= "";
$add_hsubqry .= "";
$add_dsubqry .= "";
}
// For Test
//$add_subqry = " AND m_uid = '17' ";
//total record
$query = "SELECT COUNT(*) FROM (
SELECT d_orderdate, m_initial from tbl_daily
INNER JOIN tbl_member ON (d_druid = m_currentdriver)
WHERE d_orderdate >= '".substr($APPLYDATE,0,8)."' AND d_orderdate <= '".date('Ymd')."' ". $add_subqry . "
GROUP BY d_orderdate,d_druid
ORDER BY d_orderdate DESC, m_initial ASC
) AS ORDERLIST ";
$total_count=$jdb->rQuery($query, "record query error");
//echo "<br><br><br><br><br>[$total_count][$query]<br>";
//페이징변수설정
if(!$page) $page = 1;
if(!$list_count) $list_count = $INIT_PAGECNT; //출력리스트 갯수
if(!$page_count) $page_count = $INIT_PAGEVIEWCNT; //출력페이지 갯수
$list_number = $total_count - (($page-1)*$list_count);
$start_number = $list_count * ($page-1);
$add_query .= " LIMIT $start_number, $INIT_PAGECNT";
$query = "SELECT d_orderdate, d_druid, m_initial, m_lastname, m_firstname
FROM tbl_daily
INNER JOIN tbl_member ON (d_druid = m_currentdriver)
WHERE d_orderdate >= '".substr($APPLYDATE,0,8)."' AND d_orderdate <= '".date('Ymd')."' ". $add_subqry . "
GROUP BY d_orderdate,d_druid " . $add_allquery . $add_srchquery . $add_query;
//echo "[$query]";
$result=$jdb->nQuery($query, "list error");
while($list=mysqli_fetch_array($result, MYSQLI_ASSOC)) {
for($i=0; $i<sizeof($list); $i++) {
//list($key, $value) = each($list);
foreach ( (Array) $list as $key => $value )
$$key = $value;
}
//$signupdateStr = $func -> convertFormat ($MSIGNUPDATE, 1);
//$qry = "SELECT CNAME FROM tbl_company WHERE CUID = '$MCOMPANY' ";
//$rtd=$jdb->fQuery($qry, "fetch query error");
//if ($MCOMPANY == "0" || $MCOMPANY == "") $companyStr = "-";
//else $companyStr = $rtd[CNAME];
$d_orderdateSTR = $func -> convertFormat ($d_orderdate, 3);
$todayqtySTR = number_format(floatval($todayqty));
$todayestqtySTR = number_format(floatval($todayestqty));
//$qry_driver = "SELECT m_firstname, m_lastname FROM tbl_member WHERE m_uid = '$c_driveruid' ";
//$rt_driver = $jdb->fQuery($qry_driver, "fetch query error");
// tbl_memberhis 에 해당일,해당드라이버가 있는지 확인해서 있으면 update, 없으면 create
$qry_day = "SELECT COUNT(h_uid) FROM tbl_memberhis WHERE h_date = '".$d_orderdate."' AND h_druid = '".$d_druid."' ";
$rt_cnt_day = $jdb->rQuery($qry_day, "fetch query error");
$h_departuretime = "-";
$h_arrivaltime = "-";
$h_balance_o = "-";
$h_balance_in = "-";
$h_balance_out = "-";
$h_balance_t = "-";
$h_balance_g = "-";
if ($rt_cnt_day > 0) {
$dailymode = "update";
// Get Information
$qry = "SELECT * FROM tbl_memberhis
WHERE h_druid = '".$d_druid."' AND h_date = '".$d_orderdate."'
ORDER BY h_uid DESC LIMIT 1 ";
$rt=$jdb->fQuery($qry, "fetch query error");
//echo"$query";
for($i=0; $i<sizeof($rt); $i++)
{ {
//list($key, $value) = each($result); static $cache = array();
foreach ( (Array) $rt as $key => $value )
$$key = $value; $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'];
} }
$h_commentSTR = str_replace("\\", "", $h_comment); $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'];
} }
else $dailymode = "create";
// Get Cash Out Today $cache[$druid] = $c;
$qry_cashouttoday = "SELECT SUM(d_payamount) FROM tbl_daily
WHERE d_druid = '".$d_druid."'
AND (d_visitdate LIKE '".$d_orderdate."%')
AND d_paystatus = 'P' AND d_status = 'F' ";
$cashoutTODAY = $jdb->rQuery($qry_cashouttoday, "fetch query error");
//echo"<br>[$qry_cashouttoday]<br>";
// Get Cash In Today
$qry_cashintoday = "SELECT h_balance_in FROM tbl_memberhis
WHERE h_druid = '".$d_druid."' AND (h_date = $d_orderdate) ORDER BY h_uid DESC LIMIT 1 ";
$cashinTODAY = $jdb->rQuery($qry_cashintoday, "fetch query error");
//echo"[$qry_cashintoday]<br>";
// Get Cash Retrun Today
$qry_cashrttoday = "SELECT h_balance_r FROM tbl_memberhis
WHERE h_druid = '".$d_druid."' AND (h_date = $d_orderdate) ORDER BY h_uid DESC LIMIT 1 ";
$cashrtTODAY = $jdb->rQuery($qry_cashrttoday, "fetch query error");
//echo"[$qry_cashintoday]<br>";
// Get Cash Out Total SUM (해당월)
$qry_cashout = "SELECT SUM(d_payamount) FROM tbl_daily
WHERE d_druid = '".$d_druid."'
AND (d_visitdate >= '".$APPLYDATE."' AND d_visitdate < ".$d_orderdate."000000)
AND d_paystatus = 'P' AND d_status = 'F' ";
$cashoutSUM = $jdb->rQuery($qry_cashout, "fetch query error");
//echo"[$qry_cashout]<br>";
// Get Cash Return Total SUM (해당월)
$qry_cashrt = "SELECT SUM(h_balance_r) FROM tbl_memberhis
WHERE h_druid = '".$d_druid."'
AND (h_date >= '".substr($APPLYDATE,0,8)."' AND h_date < $d_orderdate) ";
$cashrtSUM = $jdb->rQuery($qry_cashrt, "fetch query error");
//echo"[$qry_cashrt]<br>";
// Get Cash In Total SUM (해당월 ,해당일 포함)
$qry_cashin = "SELECT SUM(h_balance_in) FROM tbl_memberhis
WHERE h_druid = '".$d_druid."'
AND (h_date >= '".substr($APPLYDATE,0,8)."' AND h_date < $d_orderdate) ";
$cashinSUM = $jdb->rQuery($qry_cashin, "fetch query error");
//echo"[$qry_cashin]<br>";
$balance = floatval($cashinSUM) + floatval($cashinTODAY) - floatval($cashrtTODAY) - floatval($cashoutTODAY) - floatval($cashrtSUM) - floatval($cashoutSUM);
$openingbalance = floatval($cashinSUM) - floatval($cashrtSUM) - floatval($cashoutSUM);
$cashoutTODAY = number_format(floatval($cashoutTODAY), 2, '.', ',');
$cashrtTODAY = number_format(floatval($cashrtTODAY), 2, '.', ',');
$balance = number_format(floatval($balance), 2, '.', ',');
$openingbalance = number_format(floatval($openingbalance), 2, '.', ',');
$h_balance_in = number_format(floatval($h_balance_in), 2, '.', ',');
$cashoutSUM = number_format(floatval($cashoutSUM), 2, '.', ',');
$cashinSUM = number_format(floatval($cashinSUM), 2, '.', ',');
if ($d_orderdate < substr($APPLYDATE,0,8)) {
$openingbalance = "0.00";
$balance = "0.00";
} }
$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 .= " $strList .= "
<tr> <tr>
<td>$list_number</td> <td>$list_number</td>
<td>$d_orderdateSTR</td> <td>$dateLabel</td>
<td>$m_lastname$m_firstname ($m_initial)</td> <td>$driverShow</td>
<td style=\"text-align:right; padding-right:20px;\">$openingbalance</td> <td style=\"text-align:right; padding-right:20px;\">" . number_format($b['opening'], 2) . "</td>
<td style=\"text-align:right; padding-right:20px;\">$h_balance_in</td> <td style=\"text-align:right; padding-right:20px;\">" . number_format($b['cashin'], 2) . "</td>
<td style=\"text-align:right; padding-right:20px;\">$cashoutTODAY</td> <td style=\"text-align:right; padding-right:20px;\">" . number_format($b['cashout'], 2) . "</td>
<td style=\"text-align:right; padding-right:20px;\">$cashrtTODAY</td> <td style=\"text-align:right; padding-right:20px;\">" . number_format($b['cashrt'], 2) . "</td>
<td style=\"text-align:right; padding-right:20px;\">$balance</td> <td style=\"text-align:right; padding-right:20px;\">" . number_format($b['balance'], 2) . "</td>
<td style=\"text-align:right; padding-right:20px;\">$h_balance_g</td> <td style=\"text-align:right; padding-right:20px;\">" . number_format($b['gas'], 2) . "</td>
</tr> </tr>";
";
$list_number--; $list_number--;
} }
if ($total_count == 0) {
if( $total_count < 1 ) { $strList = "<tr><td colspan='9' align='center' height='30'><b>No Data</b></td></tr>";
$strList = "
<tr><td colspan='9' align=center height='30'><B>No Data</B></td></tr>
";
} }
// Get Cash In, Return, Gas SUM $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 $qry_sum = "SELECT
SUM(h_balance_in) AS CASHINSUM, SUM(h_balance_in) AS CASHINSUM,
SUM(h_balance_r) AS CASHRETURNSUM, SUM(h_balance_r) AS CASHRETURNSUM,
SUM(h_balance_g) AS GASSUM SUM(h_balance_g) AS GASSUM
FROM tbl_memberhis FROM tbl_memberhis
WHERE h_date >= '".substr($APPLYDATE,0,8)."' AND h_date LIKE '".$startYear.$startMonth."%' ". $add_hsubqry WHERE h_date >= '$periodStart' AND h_date <= '$periodEnd'
; $drFilter_h ";
//echo "LIST_TOT[$qry_sum]<br>"; $rt_sum = $jdb->fQuery($qry_sum, "sum error");
$rt_sum = $jdb->fQuery($qry_sum, "fetch query error");
$getCASHINSUM = number_format(floatval($rt_sum['CASHINSUM']), 2, '.', ','); $sumIn = (float)$rt_sum['CASHINSUM'];
$getCASHRETURNSUM = number_format(floatval($rt_sum['CASHRETURNSUM']), 2, '.', ','); $sumRt = (float)$rt_sum['CASHRETURNSUM'];
$getGASSUM = number_format(floatval($rt_sum['GASSUM']), 2, '.', ','); $sumGas = (float)$rt_sum['GASSUM'];
// Get Cash Out SUM $qry_cashout = "SELECT SUM(d_payamount) FROM tbl_daily
$qry_cashouttoday = "SELECT SUM(d_payamount) FROM tbl_daily WHERE (d_visitdate >= '" . $periodStart . "000000'
WHERE d_orderdate >= '".substr($APPLYDATE,0,8)."' AND (d_visitdate LIKE '".$startYear.$startMonth."%' ) AND d_visitdate <= '" . $periodEnd . "235959')
" . $add_dsubqry . " $drFilter_d
AND d_paystatus = 'P' AND d_status = 'F' "; AND d_paystatus = 'P' AND d_status = 'F' ";
$sumOut = (float)$jdb->rQuery($qry_cashout, "cashout sum error");
$getCASHOUTSUM = $jdb->rQuery($qry_cashouttoday, "fetch query error"); $sumBal = $sumIn - $sumRt - $sumOut;
$getCASHOUTSUM = number_format(floatval($getCASHOUTSUM), 2, '.', ',');
$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
// Get Driver Info $ob = calcDriverBalance($jdb, $APPLYDATE, $ed['druid'], $periodStart);
$qry_dr = "SELECT * FROM tbl_driver WHERE dr_status = 'A' ORDER by dr_initial ASC "; $sumOpenBal += $ob['opening'];
$rt_dr = $jdb->nQuery($qry_dr, "list error");
$c_driveruidSTR = "
<option value='ALL' $selectStr>ALL</option>";
while($lt_dr=mysqli_fetch_array($rt_dr, MYSQLI_ASSOC)) {
if ($lt_dr['dr_uid'] == $searchDriver) $selectStr = "selected";
else $selectStr = "";
$c_driveruidSTR .= "
<option value='".$lt_dr['dr_uid']."' $selectStr>".$lt_dr['dr_lastname'].$lt_dr['dr_firstname']." (".$lt_dr['dr_initial'].")</option>";
} }
//echo "<br><br><br><br><br>###[$searchDriver]###"; $_SESSION['exp_sumkey'] = $sumKey;
$_SESSION['exp_sum'] = array('in'=>$sumIn,'rt'=>$sumRt,'gas'=>$sumGas,'out'=>$sumOut,'endbal'=>$sumEndBal,'openbal'=>$sumOpenBal);
if ($searchDriver == "ALL") $getDriverInitial = "ALL";
// 년, 월 표시 로직
for($i='2026'; $i<=date('Y'); $i++) {
if ($i == $startYear) $setTmp = "selected";
else if ($startYear == "" && $i == date('Y')) {
$setTmp = "selected";
//$startYear = date(Y);
}
else $setTmp = "";
$strYear .= " <option value='$i' $setTmp>$i</option>";
} }
$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);
for($i=1; $i<=12; $i++) { addLog("add", "EXPENSE LIST", "VIEW", $lguserid, "report_expense", $lgno);
$j = sprintf("%02d", $i);
if ($i == $startMonth) $setTmp = "selected";
else if ($startMonth == "" && $i == date('m')) {
$setTmp = "selected";
//$startMonth = date(m);
}
else $setTmp = "";
$strMonth .= " <option value='$j' $setTmp>$j</option>";
}
addLog ("add", "EXPENSE LIST", "VIEW", $lguserid, $query, $lgno);
?> ?>
<main id="main" class="main"> <main id="main" class="main">
@ -370,64 +314,245 @@ addLog ("add", "EXPENSE LIST", "VIEW", $lguserid, $query, $lgno);
<div class="wrap-border"> <div class="wrap-border">
<FORM METHOD=POST NAME=form2 action='<?=$_SERVER["PHP_SELF"]?>'> <style>
<INPUT TYPE=HIDDEN NAME=view VALUE='report_expense'>
<table class="table-search-customer-2"> .qbtn{
display:inline-block;
padding:5px 10px;
margin:0;
border:1px solid #f5821f;
background:#fff;
color:#f5821f;
border-radius:4px;
font-size:14px;
cursor:pointer;
vertical-align:middle;
white-space:nowrap;
box-sizing:border-box;
}
.qbtn:hover{ background:#fde6d2; }
.qbtn.active{ background:#f5821f; color:#fff; }
.sumcard{ transition:background 0.15s, box-shadow 0.15s; cursor:default; }
.sumcard:hover{ background:#f3f7f4 !important; box-shadow:0 2px 10px rgba(16,24,40,0.10); }
.sumcard-strong:hover{ background:#e4efe7 !important; box-shadow:0 2px 10px rgba(46,83,64,0.16); }
.sumcard-gas:hover{ background:#fdecd9 !important; box-shadow:0 2px 10px rgba(245,130,31,0.20); }
</style>
<?php /* 검색 폼은 아래 요약 영역 오른쪽으로 이동됨 */ ?>
<script>
document.addEventListener('DOMContentLoaded', function(){
(function(){
var fromEl = document.getElementById('fromDate');
var toEl = document.getElementById('toDate');
var ref = document.getElementById('searchBtn');
var qbtns = document.querySelectorAll('.qbtn');
if (ref) {
var h = ref.offsetHeight;
if (h > 0) {
for (var x=0; x<qbtns.length; x++){ qbtns[x].style.height = h + 'px'; qbtns[x].style.boxSizing = 'border-box'; }
var drv = document.getElementById('searchDriver');
if (drv) { drv.style.height = h + 'px'; drv.style.boxSizing = 'border-box'; }
if (fromEl) { fromEl.style.height = h + 'px'; fromEl.style.boxSizing = 'border-box'; }
if (toEl) { toEl.style.height = h + 'px'; toEl.style.boxSizing = 'border-box'; }
}
}
function fmt(d){
var y=d.getFullYear(), m=('0'+(d.getMonth()+1)).slice(-2), dd=('0'+d.getDate()).slice(-2);
return y+'-'+m+'-'+dd;
}
var btns = document.querySelectorAll('.qbtn');
for (var i=0;i<btns.length;i++){
btns[i].addEventListener('click', function(){
var n=new Date(), s, e, r=this.getAttribute('data-range');
if(r==='today'){ s=new Date(n); e=new Date(n); }
else if(r==='yesterday'){ s=new Date(n); s.setDate(n.getDate()-1); e=new Date(s); }
else if(r==='thismonth'){ s=new Date(n.getFullYear(),n.getMonth(),1); e=new Date(n); }
else if(r==='lastmonth'){ s=new Date(n.getFullYear(),n.getMonth()-1,1); e=new Date(n.getFullYear(),n.getMonth(),0); }
else if(r==='twomonths'){ s=new Date(n.getFullYear(),n.getMonth()-2,1); e=new Date(n.getFullYear(),n.getMonth()-1,0); }
else if(r==='last7'){ s=new Date(n); s.setDate(n.getDate()-6); e=new Date(n); }
else if(r==='thisyear'){ s=new Date(n.getFullYear(),0,1); e=new Date(n); }
if(fromEl) fromEl.value=fmt(s);
if(toEl) toEl.value=fmt(e);
for(var k=0;k<btns.length;k++){ btns[k].classList.remove('active'); }
this.classList.add('active');
document.getElementById('form2').submit();
});
}
(function(){
if(!fromEl || !toEl) return;
var n=new Date();
function fmt2(d){ var y=d.getFullYear(),m=('0'+(d.getMonth()+1)).slice(-2),dd=('0'+d.getDate()).slice(-2); return y+'-'+m+'-'+dd; }
var y1=new Date(); y1.setDate(n.getDate()-1);
var l7=new Date(); l7.setDate(n.getDate()-6);
var ranges = {
today: [fmt2(n), fmt2(n)],
yesterday: [fmt2(y1), fmt2(y1)],
last7: [fmt2(l7), fmt2(n)],
thismonth: [fmt2(new Date(n.getFullYear(),n.getMonth(),1)), fmt2(n)],
lastmonth: [fmt2(new Date(n.getFullYear(),n.getMonth()-1,1)), fmt2(new Date(n.getFullYear(),n.getMonth(),0))],
twomonths: [fmt2(new Date(n.getFullYear(),n.getMonth()-2,1)), fmt2(new Date(n.getFullYear(),n.getMonth()-1,0))],
thisyear: [fmt2(new Date(n.getFullYear(),0,1)), fmt2(n)]
};
var cur = fromEl.value + '|' + toEl.value;
for(var key in ranges){
if(ranges[key][0] + '|' + ranges[key][1] === cur){
for(var k=0;k<btns.length;k++){
if(btns[k].getAttribute('data-range') === key){ btns[k].classList.add('active'); }
}
break;
}
}
})();
})();
});
</script>
</div>
<div class="container section-oil-history-details" data-aos="fade-up" style="margin-top:-32px;">
<?php $diffNum = (float)str_replace(',', '', $getINOUTDIFF); $diffNeg = ($diffNum < 0); ?>
<?php
function sumCard($label, $value, $variant='') {
$strong = ($variant === 'strong');
$gas = ($variant === 'gas');
if ($gas) {
$border = '#fbd9b6'; $bg = '#fff7ef'; $valColor = '#f5821f';
$cls = 'sumcard sumcard-gas';
} elseif ($strong) {
$border = '#cfe0d4'; $bg = '#f7faf8'; $valColor = '#2e5340';
$cls = 'sumcard sumcard-strong';
} else {
$border = '#ebeeec'; $bg = '#fff'; $valColor = '#2f3a33';
$cls = 'sumcard';
}
$labelColor = $gas ? '#f5821f' : '#9aa4a0';
$valWeight = '500';
echo '<div class="'.$cls.'" style="flex:0 0 auto; width:172px; height:132px; box-sizing:border-box; display:flex; flex-direction:column; align-items:center; background:'.$bg.'; border:1px solid '.$border.'; border-radius:14px; padding:24px 12px; text-align:center; box-shadow:0 1px 3px rgba(16,24,40,0.04);">';
echo '<div style="height:32px; display:flex; align-items:center; justify-content:center; font-size:10.5px; font-weight:500; letter-spacing:0.09em; text-transform:uppercase; line-height:1.4; color:'.$labelColor.';">'.$label.'</div>';
echo '<div style="flex:1 1 auto; display:flex; align-items:center; color:'.$valColor.'; font-size:21px; font-weight:'.$valWeight.'; letter-spacing:0.01em; font-variant-numeric:tabular-nums;">'.$value.'</div>';
echo '</div>';
}
function opSign($s) {
$color = '#b4bbb6';
if ($s === '+') $color = '#7fae8c';
if ($s === '') $color = '#d4a5ad';
$size = ($s === ',') ? '40px' : '26px';
$w = ($s === ',') ? '44px' : '36px';
if ($s === ',') {
$inner = '<span style="display:inline-block; transform:translateY(-0.35em);">,</span>';
} else {
$inner = $s;
}
echo '<div style="flex:0 0 auto; width:'.$w.'; align-self:center; display:flex; align-items:center; justify-content:center; height:132px; font-size:'.$size.'; color:'.$color.'; font-weight:600;">'.$inner.'</div>';
}
?>
<!-- 검색 (원본 형태) -->
<form method="post" name="form2" id="form2" action="<?=$_SERVER["PHP_SELF"]?>">
<input type="hidden" name="view" value="report_expense">
<table class="table-search-customer-2" style="width:100%; margin-left:0;">
<tr> <tr>
<td class="td-title"> <td class="td-title" style="width:1%; white-space:nowrap;">
<select name="searchDriver" id="searchDriver" class="custom-select"> <button type="button" class="qbtn" data-range="today">Today</button>
<button type="button" class="qbtn" data-range="yesterday">Yesterday</button>
<button type="button" class="qbtn" data-range="last7">Last 7 Days</button>
<button type="button" class="qbtn" data-range="thismonth">This Month</button>
<button type="button" class="qbtn" data-range="lastmonth">Last Month</button>
<button type="button" class="qbtn" data-range="twomonths">2 Months Ago</button>
<button type="button" class="qbtn" data-range="thisyear">This Year</button>
</td>
<td class="td-title" style="width:1%; white-space:nowrap; padding-left:14px;">
<select name="searchDriver" id="searchDriver" class="custom-select" style="width:200px; font-size:15px;">
<?=$c_driveruidSTR?> <?=$c_driveruidSTR?>
</select> </select>
</td> </td>
<td class="td-title"> <td class="td-title" style="width:1%; white-space:nowrap; padding-left:14px;">
<select name="startYear" id="startYear" class="custom-select"> <input type="date" name="fromDate" id="fromDate" class="custom-select"
<?=$strYear?> value="<?=$fromDateVal?>" style="width:150px; font-size:15px;">
</select> <span style="margin:0 4px;">~</span>
</td> <input type="date" name="toDate" id="toDate" class="custom-select"
value="<?=$toDateVal?>" style="width:150px; font-size:15px;">
<td class="td-title">
<select name="startMonth" id="startMonth" class="custom-select">
<?=$strMonth?>
</select>
</td> </td>
<td align="right"> <td align="right">
<button type="submit" class="btn-add">SEARCH</button> <button type="submit" class="btn-add" id="searchBtn">SEARCH</button>
</td> </td>
</tr>
</table>
</FORM>
</div><!--wrap-border-->
<div class="container section-oil-history-details" data-aos="fade-up">
<table class="tb-info-box oil-qty-tb">
<tr>
<td class="td-title-info">PERIOD</td>
<td class="td-title-info">DRIVER</td>
<td class="td-title-info">CASH IN</td>
<td class="td-title-info">CASH OUT</td>
<td class="td-title-info">CASH RETURN</td>
<td class="td-title-info">GAS</td>
</tr>
<tr>
<td class="td-text-info"><?=$startYear?>-<?=$startMonth?></td>
<td class="td-text-info"><?=$getDriverInitial?></td>
<td class="td-text-info"><span class="sp-oil"><?=$getCASHINSUM?></span></td>
<td class="td-text-info"><span class="sp-oil"><?=$getCASHOUTSUM?></span></td>
<td class="td-text-info"><span class="sp-oil"><?=$getCASHRETURNSUM?></span></td>
<td class="td-text-info"><span class="sp-oil"><?=$getGASSUM?></span></td>
</tr> </tr>
</table> </table>
</form>
<div style="height:28px;"></div>
<!-- 요약 패널 -->
<div style="background:#fafbfa; border:1px solid #eef0ee; border-radius:16px; padding:22px 24px 26px;">
<!-- 패널 헤더: SUMMARY () + PERIOD () -->
<div style="display:flex; align-items:baseline; justify-content:space-between; margin-bottom:20px; padding:0 2px;">
<span style="display:inline-flex; align-items:baseline; gap:10px;">
<span style="font-size:12px; font-weight:400; letter-spacing:0.12em; text-transform:uppercase; color:#6b7770;">Summary</span>
<span style="font-size:11px; font-weight:400; letter-spacing:0.03em; color:#adb4af;">/ From the driver's perspective</span>
</span>
<span style="font-size:12px; letter-spacing:0.04em; color:#9aa0a6;">PERIOD &nbsp;·&nbsp; <?=$periodLabel?></span>
</div>
<!-- 카드 섹션 전체를 가운데 정렬: 안쪽은 고정폭 기준으로 정렬 일치 -->
<div style="display:flex; justify-content:center;">
<div style="display:inline-block;">
<!-- 가로 카드 (연산자 포함) -->
<div style="display:flex; gap:14px; align-items:center; justify-content:flex-start; flex-wrap:nowrap;">
<?php sumCard('OPENING BALANCE', $getOPENINGSUM); ?>
<?php opSign('+'); ?>
<?php sumCard('CASH IN', $getCASHINSUM); ?>
<?php opSign(''); ?>
<?php sumCard('CASH OUT', $getCASHOUTSUM); ?>
<?php opSign(''); ?>
<?php sumCard('CASH RETURN', $getCASHRETURNSUM); ?>
<?php opSign('='); ?>
<?php sumCard('CASH ON HAND', $getENDBALANCESUM, 'strong'); ?>
<div style="flex:0 0 auto; width:16px;"></div>
<?php opSign(','); ?>
<div style="flex:0 0 auto; width:4px;"></div>
<?php sumCard('GAS', $getGASSUM, 'gas'); ?>
</div>
<!-- CASH IN CASH OUT: 왼쪽 기준 정렬이라 카드줄과 x좌표 일치 -->
<div style="display:flex; align-items:flex-start;">
<!-- OPENING(172) + gap(14) + '+'(36) + gap(14) = 236 CASH IN 시작 -->
<div style="flex:0 0 auto; width:236px;"></div>
<div style="flex:0 0 auto; width:408px; position:relative;">
<svg width="408" height="46" viewBox="0 0 408 46" style="display:block;">
<path d="M86 2 L86 20 Q86 32 98 32 L306 32 Q318 32 318 20 L318 2"
fill="none" stroke="#c4c9c5" stroke-width="2" stroke-dasharray="0.1 7" stroke-linecap="round"/>
</svg>
<div style="position:absolute; left:50%; top:24px; transform:translateX(-50%); background:#fafbfa; padding:0 12px; white-space:nowrap;">
<span style="font-size:11px; letter-spacing:0.05em; color:#8a9095;">CASH IN CASH OUT</span>
</div>
<div style="text-align:center; margin-top:2px;">
<span style="font-size:18px; font-weight:500; font-variant-numeric:tabular-nums; color:<?=($diffNeg?'#c0392b':'#2e5340')?>;"><?=$getINOUTDIFF?></span>
</div>
</div>
</div>
</div>
</div>
<div style="height:8px;"></div>
</div>
<!-- /요약 패널 -->
</div> </div>
@ -447,56 +572,23 @@ addLog ("add", "EXPENSE LIST", "VIEW", $lguserid, $query, $lgno);
<?=$strList?> <?=$strList?>
<!--
<tr>
<td>1</td>
<td>2023-09-20</td>
<td>D.S</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
</tr>
<tr>
<td>1</td>
<td>2023-09-20</td>
<td>D.S</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
<td style="text-align:right; padding-right:20px;">$ 200.00</td>
</tr>
-->
</table> </table>
</div> </div>
<div class="container-inner"> <div class="container-inner">
<div class="pagination"> <div class="pagination">
<!--a href="#" ><i class="bi bi-arrow-left"></i></a> <?php
<a href="#"class="active">1</a> $page_string = "view=report_expense"
<a href="#">2</a> . "&searchDriver=" . $searchDriver
<a href="#">3</a> . "&fromDate=" . $fromDateVal
<a href="#">4</a> . "&toDate=" . $toDateVal
<a href="#">5</a> . "&s_in=" . $sumIn . "&s_rt=" . $sumRt
<a href="#">6</a> . "&s_gas=" . $sumGas . "&s_out=" . $sumOut;
<a href="#"><i class="bi bi-arrow-right"></i></a-->
<? if ($total_count > $list_count && class_exists('PAGE')) {
$page_string = "view=$view&key_word=$key_word&key_CTGSEQ=$key_CTGSEQ&column=$column&mode=$mode&switched=$getSWHStr&startYear=$startYear&startMonth=$startMonth&searchDriver=$searchDriver";
$paging = new PAGE('page', $total_count, $list_count, $page_count, $page, $page_string, '#c71930', '', '', '#c71930', ''); $paging = new PAGE('page', $total_count, $list_count, $page_count, $page, $page_string, '#c71930', '', '', '#c71930', '');
}
?> ?>
</div> </div>
</div> </div>

View File

@ -0,0 +1,274 @@
<?php
///////////////////////////////////////////////////
// CRON - 매일 새벽 실행
//
// dr_status='A' + dr_type='UCO' 드라이버 중, 대상일에 tbl_memberhis
// 기록이 없는 사람에게 "무거래" 레코드를 만들어 잔액을 이어준다.
//
// 실행:
// CLI : /usr/local/bin/php -q /var/www/html/lib/runDailyMemberhis.php
// 웹 : https://goi.ifreshy.com/lib/runDailyMemberhis.php?PUTDAY=20250612
//
// 테스트(저장 안 함):
// 웹 : ...?PUTDAY=20250612&TEST=1
// CLI : ...runDailyMemberhis.php "0" "2000" "20250612" "TEST"
///////////////////////////////////////////////////
date_default_timezone_set('America/Toronto');
$time_start = microtime(true);
$mode = (PHP_SAPI === 'cli') ? "SHELL" : "WEB";
if ($mode == "SHELL") {
$GETDIR = "/var/www/html";
$ROWCNT = $argv[1] ?? "";
$LIMITCNT = $argv[2] ?? "";
$getYesterday = $argv[3] ?? date('Ymd', strtotime('-1 days'));
$ENT = "\n";
} else {
$GETDIR = getenv("DOCUMENT_ROOT");
$ROWCNT = $_GET['ROWCNT'] ?? "";
$LIMITCNT = $_GET['LIMITCNT'] ?? "";
if (!empty($_GET['PUTDAY'])) {
$getYesterday = $_GET['PUTDAY'];
} else {
$getYesterday = date('Ymd', strtotime('-1 days'));
}
$ENT = "<br>";
}
// TEST=1 이면 실제 INSERT 없이 화면 출력만
$TESTMODE = false;
if ($mode == "WEB" && !empty($_GET['TEST'])) $TESTMODE = true;
if ($mode == "SHELL" && (($argv[4] ?? "") == "TEST")) $TESTMODE = true;
if ($ROWCNT != "" && $LIMITCNT != "") $add_qry = " LIMIT $ROWCNT, $LIMITCNT";
else $add_qry = "";
echo "####[START][$getYesterday]" . ($TESTMODE ? "[TEST MODE - 저장 안 함]" : "[실제 저장]") . "####$ENT";
if (file_exists($GETDIR . "/include/function_class.php")) {
include_once $GETDIR . "/include/function_class.php";
}
if (file_exists($GETDIR . "/include/arrayinfo.php")) {
include_once $GETDIR . "/include/arrayinfo.php";
}
$hasFunc = class_exists('Func');
$func = $hasFunc ? new Func() : null;
$jdb = new JDB();
$logName = $GETDIR . "/lib/access.log";
function writeLogSafe($func, $logName, $msg) {
if ($func !== null && method_exists($func, 'PwriteLog')) {
$func->PwriteLog($logName, $msg);
}
}
writeLogSafe($func, $logName, "ACTION[Cron - Start - Daily Memberhis Fill]");
$qry = "SELECT dr_uid
FROM tbl_driver
WHERE dr_status = 'A' AND dr_type = 'UCO'
ORDER BY dr_uid ASC
$add_qry ";
$result = $jdb->nQuery($qry, "driver list error");
echo "[$qry]$ENT";
$insertCnt = 0;
$skipCnt = 0;
while ($list = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$druid = $list['dr_uid'];
$qry_chk = "SELECT h_uid FROM tbl_memberhis
WHERE h_druid = '" . $druid . "' AND h_date = '" . $getYesterday . "'
LIMIT 1 ";
$rt_chk = $jdb->fQuery($qry_chk, "check error");
if (!empty($rt_chk['h_uid'])) {
echo "[SKIP][druid=$druid] already exists (h_uid=" . $rt_chk['h_uid'] . ")$ENT";
$skipCnt++;
continue;
}
// opening = 대상일 이전 가장 최근 레코드의 h_balance_t (없으면 0)
$qry_prev = "SELECT h_balance_t FROM tbl_memberhis
WHERE h_druid = '" . $druid . "' AND h_date < '" . $getYesterday . "'
ORDER BY h_date DESC, h_uid DESC
LIMIT 1 ";
$rt_prev = $jdb->fQuery($qry_prev, "prev balance error");
$opening = (!empty($rt_prev['h_balance_t'])) ? $rt_prev['h_balance_t'] : 0;
unset($columns);
unset($values);
$columns = array();
$values = array();
$columns[] = "h_druid"; $values[] = $druid;
$columns[] = "h_driveruid"; $values[] = "";
$columns[] = "h_date"; $values[] = $getYesterday;
$columns[] = "h_balance_o"; $values[] = $opening;
$columns[] = "h_balance_in"; $values[] = "0";
$columns[] = "h_balance_out"; $values[] = "0";
$columns[] = "h_balance_r"; $values[] = "0";
$columns[] = "h_balance_g"; $values[] = "0";
$columns[] = "h_balance_e"; $values[] = "0";
$columns[] = "h_balance_t"; $values[] = $opening;
$columns[] = "h_createddate"; $values[] = date("YmdHis");
$columns[] = "h_comment"; $values[] = "";
if ($TESTMODE) {
echo "[TEST/dry-run][druid=$druid][date=$getYesterday][opening=$opening]$ENT";
} else {
$jdb->iQuery("tbl_memberhis", $columns, $values);
echo "[INSERT][druid=$druid][date=$getYesterday][opening=$opening]$ENT";
}
$insertCnt++;
}
$funcMsg = "ACTION[Cron - Finished - Daily Memberhis Fill] insert=$insertCnt, skip=$skipCnt\n";
writeLogSafe($func, $logName, $funcMsg);
$time_end = microtime(true);
$timeStr = "Running Time: " . ($time_end - $time_start)
. " / INSERT: $insertCnt / SKIP: $skipCnt";
echo "####[END][$timeStr]####$ENT";
?>
<?php
class JDB {
VAR $HostName = "";
VAR $UserName = "";
VAR $UserPass = "";
VAR $DBName = "";
VAR $DBConn = "";
function __construct() {
$DB_HOST = "mis-mysql";
$DB_NAME = "goiintra_db";
$DB_USER = "goiintra_root";
$DB_PASSWORD = "==";
$this->HostName = $DB_HOST;
$this->UserName = $DB_USER;
$this->UserPass = $DB_PASSWORD;
$this->DBName = $DB_NAME;
$this->CONNECT();
}
function CONNECT() {
$this->DBConn = mysqli_connect($this->HostName, $this->UserName, $this->UserPass, $this->DBName);
if (!$this->DBConn)
$this->errMsg("Database Connection Error !!!", "");
else
if (!(mysqli_select_db($this->DBConn, $this->DBName)))
$this->errMsg("Database Select Error !!!", "");
mysqli_query($this->DBConn, "SET NAMES UTF8");
}
function nQuery($query, $msg) {
if (!($rlt = mysqli_query($this->DBConn, $query)))
$this->errMsg($msg, $query);
return $rlt;
}
function mysqli_result($res, $row = 0, $col = 0) {
$numrows = mysqli_num_rows($res);
if ($numrows && $row <= ($numrows - 1) && $row >= 0) {
mysqli_data_seek($res, $row);
$resrow = (is_numeric($col)) ? mysqli_fetch_row($res) : mysqli_fetch_assoc($res);
if (isset($resrow[$col])) {
return $resrow[$col];
}
}
return false;
}
function rQuery($query, $msg) {
if (!($rlt = mysqli_query($this->DBConn, $query)))
$this->errMsg($msg, $query);
return $this->mysqli_result($rlt, 0, 0);
}
function fQuery($query, $msg) {
if (!($rlt = mysqli_query($this->DBConn, $query))) $this->errMsg($msg, $query);
return mysqli_fetch_array($rlt);
}
function numQuery($query, $msg) {
if (!($rlt = mysqli_query($this->DBConn, $query))) $this->errMsg($msg, $query);
return mysqli_num_rows($rlt);
}
function iQuery($table, $fields, $values) {
$fields_count = count($fields);
$values_count = count($values);
if ($fields_count != $values_count)
$this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count");
$fields_que = "";
$values_que = "";
for ($i = 0; $i < $fields_count; $i++) {
if (0 < $i) {
$fields_que .= ",";
$values_que .= ",";
}
$fields_que .= $fields[$i];
$values_que .= "'" . addslashes($values[$i]) . "'";
}
$this->nQuery("insert into $table ($fields_que) values ($values_que)", "[ <i>$table</i> ] Table Input Error");
}
function uQuery($table, $fields, $values, $where = "") {
if (is_array($fields) & is_array($values)) {
$fields_count = count($fields);
$values_count = count($values);
if ($fields_count != $values_count)
$this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count");
$sub_que = "";
for ($i = 0; $i < $fields_count; $i++) {
if (0 < $i)
$sub_que .= ",";
$sub_que .= $fields[$i] . "='" . addslashes($values[$i]) . "'";
}
}
else if (!is_array($fields) & !is_array($values))
$sub_que = " " . $fields . "='" . addslashes($values) . "' ";
else
$this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count");
if ($where) $sub_que .= " " . $where;
$this->nQuery("update $table set $sub_que", "[ <i>$table</i> ] Table Input Error");
}
function CLOSE() {
mysqli_close($this->DBConn);
$this->DELETE();
}
function DELETE() {
unset($this->DBConn); unset($this->UserName);
unset($this->UserPass); unset($this->HostName);
unset($this->DBName);
}
function errMsg($msg, $query) {
echo("<b>JDB Error Message !!</b><p>");
$msg = mysqli_errno($this->DBConn) . " : " . mysqli_error($this->DBConn) . "<p><b>User Message</b> :<br> " . $msg . "<p><b>Query String</b> :<br> " . $query;
echo("$msg");
exit;
}
}
?>