goiintra/public_html/lib/runDailyMemberhis.php

274 lines
8.9 KiB
PHP

<?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;
}
}
?>