<?php

///////////////////////////////////////////////////
// CRON
///////////////////////////////////////////////////
//
// Service 서버로 옮기기 전에 25 라인과 648 라인 $DB_HOST DB Login 정보 수정할것
//
// /usr/local/bin/php -q /home/goiintra/public_html/lib/runForecast.php "0" "2000"
// /usr/local/bin/php -q /home2/ifreshy/public_html/goi/lib/runForecast.php "0" "2000"
// /usr/local/bin/php -q /home2/ifreshy/public_html/goi/lib/runForecast.php >> /home2/ifreshy/public_html/goi/lib/cronlog/`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1
// ifreshy 는 cron 22시면 실제 23시에 동작
//
///////////////////////////////////////////////////


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] ?? "";

    $ENT = "\n";
} else {
    $GETDIR = getenv("DOCUMENT_ROOT");

    $ROWCNT = $_GET['ROWCNT'] ?? "";
    $LIMITCNT = $_GET['LIMITCNT'] ?? "";

    $ENT = "<br>";
}

if ($ROWCNT != "" && $LIMITCNT != "") $add_qry = " LIMIT $ROWCNT, $LIMITCNT";
else $add_qry = "";


// For Web (/home2/ifreshy/public_html/goi)

include_once $GETDIR . "/include/function_class.php";
include_once $GETDIR . "/include/arrayinfo.php";

$func = new Func();
$jdb = new JDB();


$getForecastDay = date('Ymd', strtotime('-180 days')); // 포케스트 기간
$getForecastYear = date('Ymd', strtotime('-1 years')); // 데이터 없는 경우 1개 데이터 가져오는 기간
$getToday = date('Ymd');


//echo "[$getForecastDay][".$_SERVER["REMOTE_ADDR"]."]";exit;

// For Monitoring
$ToMail = 'iamchoi@gmail.com';


// For service monitoring
$logName =  $GETDIR."/lib/access.log";
$funcMsg = "ACTION[Cron - Start]";
$func -> PwriteLog($logName, $funcMsg);


// Cron Result Log
$setDIRNAME = $GETDIR."/lib/forecastlog/".date('Ym');
$setFILENAME = $setDIRNAME."/".date("YmdHis").".log";

if (!is_dir($setDIRNAME)) {
    mkdir($setDIRNAME, 0755, true);
}

touch($setFILENAME);

$addCronLog = file_get_contents($setFILENAME);





////////////////////
// Duplication Check
////////////////////

/*
$query = "select UID,CNT_NUMBER from tbl_cron where CNT_DATE = '$getToday' ";
$result = $jdb->fQuery($query, "fetched query error");

if($result['UID'] == "") {
	$columns[] = "CNT_DATE";
	$columns[] = "CNT_NUMBER";
	
	$values[] = $getToday;
	$values[] = 1;		
	$jdb->iQuery("tbl_cron", $columns, $values);
	//echo "[IN]";
}
else {
		$currentDate = date("Y-m-d H:i:s");	
		$err_subject = "[NALOX-IT] Someone tried to run cron.";
		$err_mailCont = "
					<br>Hi<br><br>
					Someone [".$_SERVER["HTTP_CLIENT_IP"]."] tried to run cron at ".$currentDate.".<br><br>";

		$func -> DsendMail("iamchoi@gmail.com", $FromMail, $err_subject, $err_mailCont, $attachments); // For Test
		
		//echo "[$err_mailCont]";
		exit;
}
*/		



	
//////////////////////////////////////////
// Customer ID 별로 tbl_daily 의 6개월치 데이터를 조회 후
// 제일 오래된것의 일자를, 그이전것의 일자와 양... 최근것의 일자와 양을 찾아서
// 최근것의 일자 - 오래된것의 일자 = 기간
// 그이전것의 양부터 최근것의 양의 합 = 총량
// 총량 / 기간 = 일일 예상량
// 2023.10.24 : 200L 대신 c_mainvolume 으로 변경. 없는 경우 기본 200L
// xxxx 200L 기준으로 해서 200 / 일일 예상량 = Cycle 산출 
// strtotime (+cycle days) 예상 픽업일자 산출
// 업데이트 후 c_crontime 에 업데이트시간 저장
//
// Batch 작업후 account No, R name, history data, 기간, 총량, 일일 예상량, cycle, 예상픽업일자 파일로그 저장
//
//////////////////////////////////////////

// Customer ID 별로 tbl_daily 의 6개월치 데이터를 조회

$qry = "SELECT * FROM tbl_customer
				WHERE c_uid <> '' AND c_status = 'A'
				ORDER BY c_uid DESC ". $add_qry;
$result = $jdb->nQuery($qry, "list error");
//echo "[$qry]$ENT";

$runcnt = 1;
$emptyFlag = 0;

while($list=mysqli_fetch_array($result, MYSQLI_ASSOC)) {
	
			$emptyFlag = 0;
			$nodataFLAG = 0;
			
			for($i=0; $i<sizeof($list); $i++) {
				//list($key, $value) = each($list);
				foreach ( (Array) $list as $key => $value )
				$$key = $value;
			}

			$oilData = array();

			$qry_d_cnt = "SELECT COUNT(d_uid) FROM tbl_daily
							WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastDay."' AND d_quantity > 9
							ORDER BY d_orderdate DESC";
			$tot_d_cnt=$jdb->rQuery($qry_d_cnt, "record query error");


			// 6개월동안 2개이상의 데이터가 존재하는 경우
			// 6개월동안의 모든 데이터와 일자 계산
			if ($tot_d_cnt > 1) {
						
						$qry_d = "SELECT d_customeruid, d_accountno, d_name, d_orderdate, d_quantity FROM tbl_daily
										WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastDay."' AND d_quantity > 1
										ORDER BY d_orderdate DESC";
						$rt_d = $jdb->nQuery($qry_d, "list error");
						//echo "[$qry_d]$ENT";
						$addCronLog .= "6M-DM[$qry_d]\n";

						while($lt_d=mysqli_fetch_array($rt_d, MYSQLI_ASSOC)) {
							echo "6M-DM[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT";
							$addCronLog .= "6M-DM[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n";

							$oilDataAdd = array($lt_d['d_orderdate'] => $lt_d['d_quantity']);
							$oilData += $oilDataAdd;
							//var_dump($oilData);
						}
				
			}

			else if ($tot_d_cnt == 1) { // 6개월동안 1개의 데이터가 존재하는 경우
				
						// Data 가 1개이고 install date 이 Forecasting day (6개월) 안에 존재하는 경우
						// Install date 를 시작일자로 지정
						if ($c_installdate != "" &&  $c_installdate != "N/A" && $c_installdate >= $getForecastDay) {
								/*
								$qry_d = "SELECT d_customeruid, d_accountno, d_name, d_orderdate, d_quantity FROM tbl_daily
												WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastDay."' AND d_quantity > 1
												ORDER BY d_orderdate DESC";
								$rt_d = $jdb->nQuery($qry_d, "list error");
								//echo "[$qry_d]$ENT";
								$addCronLog .= "6M-D1[$qry_d]\n";

								while($lt_d=mysqli_fetch_array($rt_d, MYSQLI_ASSOC)) {
									echo "6M-IN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT";
									$addCronLog .= "6M-IN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n";

									$oilDataAdd = array($lt_d['d_orderdate'] => $lt_d['d_quantity']);
									$oilData += $oilDataAdd;
									//var_dump($oilData);
													
								}

								$oilData = array($c_installdate => 0);
								$oilData += $oilDataAdd;
								*/				

									echo "6M-IN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT";
									$addCronLog .= "6M-IN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n";
										
						}
						// Data 가 1개이고 install date 이 없는 경우 Contract date 를 시작일자로 지정
						// Contract date 이 Forecasting day (6개월) 안에 존재하는 경우
						else if ($c_installdate == "" && $c_contractdate >= $getForecastDay) {
								/*
								$qry_d = "SELECT d_customeruid, d_accountno, d_name, d_orderdate, d_quantity FROM tbl_daily
												WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastDay."' AND d_quantity > 1
												ORDER BY d_orderdate DESC";
								$rt_d = $jdb->nQuery($qry_d, "list error");
								//echo "[$qry_d]$ENT";
								$addCronLog .= "6M-CN[$qry_d]\n";
								
								while($lt_d=mysqli_fetch_array($rt_d, MYSQLI_ASSOC)) {
									echo "6M-CN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT";
									$addCronLog .= "6M-CN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n";

									$oilDataAdd = array($lt_d['d_orderdate'] => $lt_d['d_quantity']);
									$oilData += $oilDataAdd;
																		
								}

								$oilData = array($c_contractdate => 0);
								$oilData += $oilDataAdd;
								*/

									echo "6M-CN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT";
									$addCronLog .= "6M-CN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n";
								
						}			
						else {

									// 6개월동안 데이터가 1개만 존재해서 최근 1년치로 데이터를 조회하고 최근 1개를 가져옴
									$qry_y_cnt = "SELECT COUNT(d_uid) FROM tbl_daily
													WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastYear."' AND d_quantity > 1
													ORDER BY d_orderdate DESC LIMIT 2";
									$tot_y_cnt=$jdb->rQuery($qry_y_cnt, "record query error");
									//echo "1Y[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."]".$ENT;

									// 최근 1년간 데이터가 1개만 존재한다면 Forecasting 에는 보이지 않음
									if ($tot_y_cnt <= 1) {
											echo "1Y-D0[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."]$ENT";
											$addCronLog .= "1Y-D0[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."]\n";
									}
									// 데이터가 2인 경우만 Forecasting 에 보여줌
									else {
											$qry_d = "SELECT d_customeruid, d_accountno, d_orderdate, d_quantity FROM tbl_daily
															WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastYear."' AND d_quantity > 1
															ORDER BY d_orderdate DESC LIMIT 2";
											$rt_d = $jdb->nQuery($qry_d, "list error");
											//echo "[$qry_d]$ENT";
											$addCronLog .= "1Y-D2[$qry_d]\n";


											while($lt_d=mysqli_fetch_array($rt_d, MYSQLI_ASSOC)) {
													echo "1Y-D2[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]".$ENT;
													$addCronLog .= "1Y-D2[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n";
													
													$oilDataAdd = array($lt_d['d_orderdate'] => $lt_d['d_quantity']);
													$oilData += $oilDataAdd;
																				
											}
									
									}
									
						}

			} else {	// // 6개월동안 데이터가 없는 경우

					echo "NO-D0[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."]$ENT";
					$addCronLog .= "NO-D0[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."]\n";
					$nodataFLAG = 1;
			}


			/////////////////////////////////////////////////////////
			//
			// 배열에 데이터가 2개 이상 저장된 경우 & Cycle 을 강제로 수정하지 않은 경우
			// Forecasting 시작
			//
			/////////////////////////////////////////////////////////

			if (count($oilData) >= 2 && $c_fullcycleflag == 0) {
				
					$oilDataCnt = 1;
					$oilSum = 0;
					
					krsort($oilData); // descending sort
					
					foreach ($oilData as $key => $value) {
							echo "\t OIL DATA[$key][$value]$ENT";
							$addCronLog .= "OIL DATA[$key][$value]\n";
							
							//$getPeriodEnd = ;
							//$getPeriodStart = ;
							if ($oilDataCnt == 1) $getPeriodEnd = $key;
							else if ($oilDataCnt == count($oilData)) $getPeriodStart = $key;
							
							if ($oilDataCnt != count($oilData)) $oilSum += $value;
							
							$oilDataCnt++;
					}

					// 날짜간 일수 계산
					$getPeriodStartTmp = new DateTime($getPeriodStart);
					$getPeriodEndTmp  = new DateTime($getPeriodEnd);
					$getPeriodNowTmp  = new DateTime('now');
					
					$dDiffTmp = $getPeriodStartTmp->diff($getPeriodEndTmp);
					$dDiff = $dDiffTmp->format('%r%a');
					$nowDiffTmp = $getPeriodEndTmp->diff($getPeriodNowTmp);
					$nowDiff = $nowDiffTmp->format('%r%a');


					// 버림 계산
					//$dailyOil = floor($oilSum/$dDiff);
					// 올림 계산
					//$dailyOil = ceil($oilSum/$dDiff);
					// 소숫점 1자리까지 보여줌. 반올림 계산
					$dailyOil = round($oilSum/$dDiff, 1);
   				
   				
   				if ($dailyOil > 0) {

							// 맨 최근것 중에 9보다 작은것이 있는지 확인.
							// 있다면 d_orderdate 가져와서 현재일과 차이를 계산하고 c_fullquantity 를 계산해줌 
							$qry_n = "SELECT d_orderdate FROM tbl_daily
											WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' 
											AND d_orderdate >= '".$getPeriodEnd."' AND d_quantity <= 9
											ORDER BY d_orderdate DESC LIMIT 1";
							$rt_n = $jdb->fQuery($qry_n, "list error");
							
							$getPeriodEmpty = $rt_n['d_orderdate'];
							
							if ($getPeriodEmpty != "") {
									$emptyFlag = 1;
									$getPeriodEmptyTmp  = new DateTime($getPeriodEmpty);
									$emptyDiffTmp = $getPeriodEmptyTmp->diff($getPeriodNowTmp);
									$emptyDiff = $emptyDiffTmp->format('%r%a');
									
		   						// 내일 일자의 Forecast 이 필요하므로 d_quantity <= 9 인 일자부터 현재까지의 일수+1 함
		   						$forecastOil = round($dailyOil * ($emptyDiff+1));
		   						
		   						echo "\t EMPTY DATA[".$getPeriodEmpty."][EMPTYDIFF=$emptyDiff]$ENT";
		   						$addCronLog .= "EMPTY DATA[".$getPeriodEmpty."][EMPTYDIFF=$emptyDiff]\n";
							}
							else {

		   						// 내일 일자의 Forecast 이 필요하므로 일수+1 함
		   						$forecastOil = round($dailyOil * ($nowDiff+1));
   						
							}
						

		   				// xx 200L Full Cycle 처리, 버림 계산 
		   				// 2023.10.22 200L 대신 $c_mainvolume 사용. 소숫점 아래 계산하도록 수정
		   				// $c_mainvolume 없는 경우 기본 200 으로 처리
		   				//$getCycle = floor(200/$dailyOil);
		   				
		   				if ($c_mainvolume != "" && (float)$c_mainvolume != 0) $c_mainvolumeTmp = $c_mainvolume;
		   				else $c_mainvolumeTmp = 200;
		   				$getCycle = ($c_mainvolumeTmp/$dailyOil);

							//$getCycleTmp = "+".$getCycle." days";
							$getCycleTmp = "+".round($getCycle)." days";
							
							if ($emptyFlag == 1)	$getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($getPeriodEmpty)));
							else $getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($getPeriodEnd)));
   				}
   				else {
	   					$forecastOil = 0;
	   					$getCycle = 0;
	   					$getFullCycleDate = "";
   				}
   				
   				
					$qry_up = "UPDATE tbl_customer 
											SET c_fullcycle='".$getCycle."',c_fullquantity='".$forecastOil."', c_fullquantitydaily='".$dailyOil."', 
											c_fullquantitydate='".$getFullCycleDate."', c_crondate='".date("YmdHis")."'  
											WHERE c_uid = '$c_uid' ";
					
					$jdb->nQuery($qry_up, "update error");
					//$jdb->CLOSE();
			   				
					echo "\t [ENDDAY=$getPeriodEnd][STARTDAY=$getPeriodStart][EMPTYDIFF=$emptyDiff][SUM=$oilSum][[DAILYOIL=$dailyOil][DAYDIFF=$dDiff][NOWDIFF=$nowDiff][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$getCycle][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]$ENT";
					$addCronLog .= "[ENDDAY=$getPeriodEnd][STARTDAY=$getPeriodStart][EMPTYDIFF=$emptyDiff][SUM=$oilSum][[DAILYOIL=$dailyOil][DAYDIFF=$dDiff][NOWDIFF=$nowDiff][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$getCycle][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]\n";
					$addCronLog .= "[UPDATE=$qry_up]\n";

					//$new_key = min(array_keys($oilData));
					//$new_val = $oilData[$new_key];

					//$mnew_key = max(array_keys($oilData));
					//$mnew_val = $oilData[$mnew_key];
					//echo"[KEY=$new_key][VAL=$new_val][MAXKEY=$mnew_key][MAXVAL=$mnew_val]<br>";
					
					$emptyDiff ="";
			}
			
			
			/////////////////////////////////////////////////////////////////////////
			//
			// cycle 강제 조정시 처리 로직
			// xx 6개월동안 데이터가 존재하는 경우
			// 제일 마지막 오일 픽업일자부터 계산. dailyOil = c_mainvolume / forced cycle
			// 없는 경우 계약일
			//
			/////////////////////////////////////////////////////////////////////////
			
			if ($c_fullcycleflag == 1) {


					// 일일 오일량 계산
   				// customer or forecast 에서 cycle 강제 조정시 dailyOil = c_mainvolume / forced cycle
   				if ($c_mainvolume != "" && (float)$c_mainvolume != 0) $c_mainvolumeTmp = $c_mainvolume;
   				else $c_mainvolumeTmp = 200;
   				$dailyOil = ($c_mainvolumeTmp/$c_fullcycleforced);
   				
   				
					// 맨 최근 Oil Pickup Data 가져옴. 없다면 Contract Date 가져옴
					$qry_n = "SELECT d_orderdate FROM tbl_daily
									WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' 
									ORDER BY d_orderdate DESC LIMIT 1";
					$rt_n = $jdb->fQuery($qry_n, "list error");
					
					if ($rt_n['d_orderdate'] == "")	{
							$getPeriodPickup = $c_contractdate;
							$contractFLAG = "CONTRACTDATE";	
					}
					else	{
							$getPeriodPickup = $rt_n['d_orderdate'];
							$contractFLAG = "LASTPICKUPDATE";	
					}
							
					// 날짜간 일수 계산
					//$getPeriodPickup = new DateTime($getPeriodPickup);
					//$getPeriodNowTmp  = new DateTime('now');

					//$nowDiffTmp = $getPeriodPickup->diff($getPeriodNowTmp);
					//$nowDiff = $nowDiffTmp->format('%r%a');

					if ($getPeriodPickup != "") {
									
									// 날짜간 일수 계산
									$getPeriodPickupTmp  = new DateTime($getPeriodPickup);
									$getPeriodNowTmp  = new DateTime('now');
									$pickupDiffTmp = $getPeriodPickupTmp->diff($getPeriodNowTmp);
									$pickupDiff = $pickupDiffTmp->format('%r%a');
									
		   						// 내일 일자의 Forecast 이 필요하므로 현재까지의 일수+1 함
		   						$forecastOil = round($dailyOil * ($pickupDiff+1));

									$getCycleTmp = "+".round($c_fullcycleforced)." days";
				   				$getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($getPeriodPickup)));
   				
		   						echo "\t FORCED : [".$contractFLAG."=".$getPeriodPickup."][PICKUPDIFF=$pickupDiff]$ENT";
		   						$addCronLog .= "FORCED : [".$contractFLAG."=".$getPeriodPickup."][PICKUPDIFF=$pickupDiff]\n";
		   		
		   		} else {

									// 내일 일자의 Forecast 이 필요하므로 일수+1 함
									//$forecastOil = round($dailyOil * ($nowDiff+1));

									//$getCycleTmp = "+".round($c_fullcycleforced)." days";
				   				//$getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($c_forceddate)));
						
		   		}

					// c_fullcycle 은 업데이트 하지 않음
					$qry_up = "UPDATE tbl_customer 
											SET c_fullquantity='".$forecastOil."', c_fullquantitydaily='".$dailyOil."', 
											c_fullquantitydate='".$getFullCycleDate."', c_crondate='".date("YmdHis")."'  
											WHERE c_uid = '$c_uid' ";
					
					$jdb->nQuery($qry_up, "update error");
					//$jdb->CLOSE();
			   				
					echo "\t [[DAILYOIL=$dailyOil][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycleforced][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]$ENT";
					$addCronLog .= "[[DAILYOIL=$dailyOil][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycleforced][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]\n";
					$addCronLog .= "[UPDATE=$qry_up]\n";


			}



			/////////////////////////////////////////////////////////////////////////
			//
			// 6개월안에 실데이터가 없고 마지막 오일픽업이 9이하인 경우
			// 9이하인 일자부터 오일량 새로 계산
			// 존재하는 dailyquantity 를 가져와서 누적 계산
			// 없으면 forecast하지 않음
			//
			/////////////////////////////////////////////////////////////////////////
			
			if ($nodataFLAG == 1 && $c_fullcycleflag == 0) {
					
					if ((float)$c_fullquantitydaily != 0) {
						
							// 맨 최근것 중에 9보다 작은것이 있는지 확인.
							// 있다면 d_orderdate 가져와서 현재일과 차이를 계산하고 c_fullquantity 를 계산해줌 
							$qry_n = "SELECT d_orderdate, d_quantity FROM tbl_daily
											WHERE d_customeruid = '".$c_uid."' AND d_status = 'F'
											ORDER BY d_orderdate DESC LIMIT 1";
							$rt_n = $jdb->fQuery($qry_n, "list error");
							
							$getPeriodPickup = $rt_n['d_orderdate'];
							$d_quantityTmp = $rt_n['d_quantity'];
							
							$getPeriodNowTmp  = new DateTime('now');
							
							$dailyOil = $c_fullquantitydaily;
							
							
							if ($getPeriodPickup != "") {
								if ($d_quantityTmp <= 9) {  // 픽업오일량이 9이하인 경우 픽업다음일부터 누적
										$emptyFlag = 1;
										$getPeriodPickupTmp  = new DateTime($getPeriodPickup);
										$emptyDiffTmp = $getPeriodPickupTmp->diff($getPeriodNowTmp);
										$emptyDiff = $emptyDiffTmp->format('%r%a');
										
			   						// 내일 일자의 Forecast 이 필요하므로 d_quantity <= 9 인 일자부터 현재까지의 일수+1 함
			   						$forecastOil = round($dailyOil * ($emptyDiff+1));
			   						
			   						echo "\t NO/EMPTY DATA[".$getPeriodPickup."][EMPTYDIFF=$emptyDiff]$ENT";
			   						$addCronLog .= "NO/EMPTY DATA[".$getPeriodPickup."][EMPTYDIFF=$emptyDiff]\n";
									
								}
								else {  // 픽업오일량이 9이상인 경우 픽업다음일부터 누적
										$emptyFlag = 1;
										$getPeriodPickupTmp  = new DateTime($getPeriodPickup);
										$emptyDiffTmp = $getPeriodPickupTmp->diff($getPeriodNowTmp);
										$emptyDiff = $emptyDiffTmp->format('%r%a');
										
			   						// 내일 일자의 Forecast 이 필요하므로 d_quantity <= 9 인 일자부터 현재까지의 일수+1 함
			   						$forecastOil = round($dailyOil * ($emptyDiff+1));
			   						
			   						echo "\t NO/LAST DATA[".$getPeriodPickup."][LASTDIFF=$emptyDiff]$ENT";
			   						$addCronLog .= "NO/LAST DATA[".$getPeriodPickup."][LASTDIFF=$emptyDiff]\n";
									
								}

								$getCycleTmp = "+".round($c_fullcycle)." days";
			   				$getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($getPeriodPickup)));


								// c_fullcycle 은 업데이트 하지 않음
								$qry_up = "UPDATE tbl_customer 
														SET c_fullquantity='".$forecastOil."', c_fullquantitydaily='".$dailyOil."', 
														c_fullquantitydate='".$getFullCycleDate."', c_crondate='".date("YmdHis")."'  
														WHERE c_uid = '$c_uid' ";
								
								$jdb->nQuery($qry_up, "update error");
								//$jdb->CLOSE();
						   				
								echo "\t [[DAILYOIL=$dailyOil][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycle][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]$ENT";
								$addCronLog .= "[[DAILYOIL=$dailyOil][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycle][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]\n";
								$addCronLog .= "[UPDATE=$qry_up]\n";



							}
							else {
										// 픽업이 한번도 없었으면 forecasting 하지 않음
							}
												
						
						
					} else {
								// dailyquantity 없으면 forecasting 하지 않음
					}
				
			}
			
			
			unset($oilData);
			unset($oilDataAdd);
			
			//if ($runcnt ==500) break;
			$runcnt++;
			
			$addCronLog .= "=============================================================\n";			
	}


// 오더장 생성후 픽업하지 않은 경우 리셋처리
// c_orderdate이 Cron 동작일보다 작고 c_orderflag = 1 이면 픽업하지 않은것이므로 
// c_orderdate = "", c_orderflag = 0 으로 셋팅
// c_orderflag = 0 이 되어야 forecast 검색 가능함

$qry_customer = "UPDATE tbl_customer SET c_orderdate='', c_orderflag = 0 WHERE c_orderdate < '".date("Ymd")."'";
$jdb->nQuery($qry_customer, "update error");

$addCronLog .= $qry_customer."\n";
		
file_put_contents($setFILENAME, $addCronLog, FILE_APPEND);



// For service monitoring
$logName =  $GETDIR."/lib/access.log";
$funcMsg = "ACTION[Cron - Finished]\n";
$func -> PwriteLog($logName, $funcMsg);

$time_end = microtime(true);
$timeStr = "Running Time: ".($time_end - $time_start);

echo "####[END][$timeStr]####";

?>




<?php

class JDB { 
    VAR $HostName = "";                //server
    VAR $UserName = "";                //User ID
    VAR $UserPass = "";                //User Password
    VAR $DBName = "";                //Database Name
    VAR $DBConn="";                    //Database Handler

/*
** Function  : Constructor
** Input     : Database Connection Information
** Output    : None
*/
    function __construct() {

		$DB_HOST = "mis-mysql";
		$DB_NAME = "goiintra_db";
		$DB_USER = "goiintra_root";
		$DB_PASSWORD = "L0C2CKN5GHHY";
	
		$this->HostName=$DB_HOST;
		$this->UserName=$DB_USER;
		$this->UserPass=$DB_PASSWORD;
		$this->DBName=$DB_NAME;
		
		
		$this->CONNECT();

    }

/*
** Function : Connect
** Input    : None
** Output   : None
*/
    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)))    //Database 선택 실패
                $this->errMsg("Database Select Error !!!", "");
                
        mysqli_query($this->DBConn, "SET NAMES UTF8");
        //mysqli_query($this->DBConn, "SET NAMES latin1");
        //mysqli_query($this->DBConn, "SET NAMES EUC-KR");
    }

/*
** Function  : nQuery
** Input     : Query String, Error Message
** Output    : Recordset
** Descript  : mysql_query()
*/
    function nQuery($query, $msg) {
        if (!($rlt=mysqli_query($this->DBConn, $query))) 
            $this->errMsg($msg, $query);
        return $rlt;
    }

/*
** Function : rQuery
** Input    : Query string, Error message
** Output   : Record
** Descript : mysql_result()
** 이부분은 mysql_fetch_arrary와 비슷하지만 가끔씩 쓰일때가 많아서요..넣었습니다.
*/
		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
** Input    : Query string, Error message
** Output   : Fetched array 
** Descript : mysql_fetch_array()
** 레코드셋에서 맨 첫번째 레코드를 array로 리턴해줍니다.
** 하나의 레코드셋에서 이함수를 여러번 적용한다면..
** 자동으로 다음 레코드로 넘어가겠죠 ???
*/
    function fQuery($query, $msg) {
        if (!($rlt=mysqli_query($this->DBConn, $query))) $this->errMsg($msg, $query);
        return mysqli_fetch_array($rlt);
    }

/*
** Function : numQuery
** Input    : Query string, Error message
** Output   : The number of rows 
** Descript : mysql_num_rows()
*/
	function numQuery($query, $msg) {
		if(!($rlt=mysqli_query($this->DBConn, $query))) $this->errMsg($msg, $query);
		return mysqli_num_rows($rlt);
	}



/*
** Function : iQuery
** Input    : Table name, arrayed fields, arrayed values
** Output   : None
** Descript : Input arrayed data
*/
    function iQuery($table, $fields, $values) {
        $fields_count=count($fields);    // fileds 배열의 갯수 추출
        $values_count=count($values);    // values 배열의 갯수 추출

        // fields와 values 갯수가 맞지않을 경우 0을 return
        // 혹 프로그래밍 상에서 실수가 발생했을 경우 사용하기 위해
        if($fields_count != $values_count) 
            $this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count");

        for ($i=0; $i < $fields_count; $i++) {    // 입력된 fields와 values를 이용 퀴리 생성
            if (0 < $i) {                        // fields와 values가 2개 이상일 경우 , 자동 입력
                $fields_que.=",";
                $values_que.=",";
            }

            $fields_que.=$fields[$i];                        // fields에 해당하는 쿼리
            $values_que.="'".addslashes($values[$i])."'";    // values에 해당하는 쿼리
        }
        $this->nQuery("insert into $table ($fields_que) values ($values_que)", "[ <i>$table</i> ] Table Input Error");
    } 

/*
** Function : uQuery
** Input    : Table name, arrayed fields, arrayed values, where
** Output   : None
** Descript : update arrayed data
*/
    function uQuery($table, $fields, $values, $where="")    {
        if(is_array($fields) & is_array($values)) {                // fields와 values가 배열일 경우
            $fields_count=count($fields);                        // fileds 배열의 갯수 추출
            $values_count=count($values);                        // values 배열의 갯수 추출

            // fields와 values 갯수가 맞지않을 경우 0을 return
            // 혹 프로그래밍 상에서 실수가 발생했을 경우 사용하기 위해
            if ($fields_count != $values_count) 
                $this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count");

            for ($i=0; $i < $fields_count; $i++) {
                // insert와 달리 sub쿼리를 이용
                if (0 < $i)
                    $sub_que.=",";
                $sub_que.=$fields[$i]."='".addslashes($values[$i])."'";    // 서브 쿼리 생성
            }
        } 
        else if (!is_array($fields) & !is_array($values))     // fields와 values가 배열이 아닐 경우
            $sub_que=" ".$fields."='".addslashes($values)."' ";
        else 
            $this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count");
            
        if($where) $sub_que.=" ".$where;    // where 쿼리가 존재할 경우 입력
        $this->nQuery("update $table set $sub_que", "[ <i>$table</i> ] Table Input Error");
    }

/*
** Function : CLOSE
** Input    : None
** Output   : None
** Descript : mysql_close()
*/
    function CLOSE() {    
        mysqli_close($this->DBConn);    
        $this->DELETE();    
    }

/*
** Function : DELETE
** Input    : None
** Output   : None
** Descript : Member variable unset
*/
    function DELETE() {
        unset($this->DBConn);         unset($this->UserName); 
        unset($this->UserPass);     unset($this->HostName); 
        unset($this->DBName); 
    }

    //Print Error Message and Exit
    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;    
    }
    

}

?>
