1798 lines
74 KiB
PHP
1798 lines
74 KiB
PHP
<?php
|
|
//require_once('conf.inc.php');
|
|
//require_once("dbCon.php");
|
|
|
|
|
|
require_once getenv("DOCUMENT_ROOT")."/assets/conf.inc.php";
|
|
require_once getenv("DOCUMENT_ROOT")."/assets/dbCon.php";
|
|
include getenv("DOCUMENT_ROOT")."/include/session_include.php";
|
|
include_once getenv("DOCUMENT_ROOT")."/lib/erp_api.php";
|
|
include_once getenv("DOCUMENT_ROOT")."/assets/api/install.php";
|
|
include_once getenv("DOCUMENT_ROOT")."/assets/api/daily.php";
|
|
include_once getenv("DOCUMENT_ROOT")."/assets/api/customer.php";
|
|
|
|
error_reporting(E_ALL);
|
|
ini_set('display_errors', '1');
|
|
|
|
date_default_timezone_set('America/Toronto');
|
|
|
|
class API extends CONF {
|
|
use InstallAPI;
|
|
|
|
protected $dailyService;
|
|
public function __construct() {
|
|
$this->dailyService = new DailyService();
|
|
}
|
|
|
|
public function processApi() {
|
|
$func = $_GET['func'];
|
|
|
|
if(isset($_POST['search_date'])) {
|
|
$_POST['search_date'] = str_replace("-","",$_POST['search_date']);
|
|
}
|
|
if(isset($_POST['orderdate'])) {
|
|
$_POST['orderdate'] = str_replace("-","",$_POST['orderdate']);
|
|
}
|
|
|
|
if(empty($func))
|
|
$this->response('',404);
|
|
|
|
if((int)method_exists($this,$func) > 0)
|
|
$this->$func();
|
|
else
|
|
$this->response('',404);
|
|
}
|
|
|
|
private function json($data){
|
|
if(is_array($data)){
|
|
return json_encode($data);
|
|
}
|
|
}
|
|
|
|
public function inqPoint(){
|
|
try {
|
|
|
|
$optionCondition = " AND";
|
|
if($_POST['option']['ordered'] === "true") {
|
|
$optionCondition .= " td.d_orderdate != ''";
|
|
}else{
|
|
$optionCondition .= " td.d_orderdate = ''";
|
|
}
|
|
|
|
$searchCondition = "";
|
|
|
|
if(strlen($_POST['search']) > 0){
|
|
$searchCondition .= " AND (tc.c_accountno LIKE '%".$_POST['search']."%'
|
|
OR tc.c_name LIKE '%".$_POST['search']."%'
|
|
OR tc.c_name LIKE '%".strtoupper($_POST['search'])."%'
|
|
OR tc.c_name LIKE '%".strtolower($_POST['search'])."%'
|
|
OR tc.c_phone LIKE '%".$_POST['search']."%')";
|
|
}
|
|
|
|
$result = array();
|
|
$uidList = "";
|
|
$customerUidArr = [];
|
|
|
|
$sqOptionPoint = qry("SELECT
|
|
'flag' AS type,
|
|
tc.c_uid,
|
|
tc.c_accountno,
|
|
tc.c_paymentcycle,
|
|
tc.c_maincontainer,
|
|
tc.c_rate,
|
|
tc.c_name,
|
|
IF(tc.c_phoneext IS NULL OR LENGTH(tc.c_phoneext) < 1, tc.c_phone, CONCAT(tc.c_phone,' (ext.',tc.c_phoneext,')')) AS phone,
|
|
CONCAT(tc.c_address, ', ', tc.c_city, ', ', tc.c_postal) AS addr,
|
|
tc.c_paymenttype,
|
|
td.d_uid,
|
|
td.d_orderdate,
|
|
IFNULL(td.d_quantity,0) as d_quantity,
|
|
IFNULL(td.d_estquantity,0) as d_estquantity,
|
|
td.d_ordertype,
|
|
td.d_driveruid,
|
|
td.d_createruid,
|
|
td.d_status,
|
|
tc.c_comment_ri,
|
|
tc.c_location,
|
|
IFNULL(DATE_FORMAT(tc.c_lastpickupdate,'%Y-%m-%d'),'') as c_lastpickupdate,
|
|
IFNULL(DATE_FORMAT(tc.c_lastpaiddate,'%Y-%m-%d'),'') as c_lastpaiddate,
|
|
IFNULL(tc.c_geolat,'') as lat,
|
|
IFNULL(tc.c_geolon,'') as lon,
|
|
td.d_ruid,
|
|
td.d_druid,
|
|
td.r_note
|
|
FROM
|
|
(SELECT
|
|
c_uid,
|
|
c_accountno,
|
|
c_paymentcycle,
|
|
c_maincontainer,
|
|
c_rate,
|
|
c_driveruid,
|
|
c_name,
|
|
c_phoneext,
|
|
c_phone,
|
|
c_address,
|
|
c_city,
|
|
c_province,
|
|
c_postal,
|
|
c_paymenttype,
|
|
c_lastpickupdate,
|
|
c_lastpaiddate,
|
|
c_comment_ri,
|
|
c_location,
|
|
c_geolat,
|
|
c_geolon
|
|
FROM
|
|
tbl_customer) tc,
|
|
(SELECT
|
|
td.d_uid,
|
|
td.d_ruid,
|
|
tr.r_note,
|
|
td.d_customeruid,
|
|
td.d_orderdate,
|
|
td.d_quantity,
|
|
td.d_estquantity,
|
|
td.d_ordertype,
|
|
td.d_driveruid,
|
|
td.d_druid,
|
|
td.d_createruid,
|
|
td.d_status
|
|
FROM
|
|
tbl_daily td
|
|
LEFT OUTER JOIN tbl_request tr
|
|
ON td.d_ruid = tr.r_uid) td
|
|
WHERE
|
|
tc.c_uid = td.d_customeruid
|
|
AND td.d_druid = ".(int)$_POST['driver']."
|
|
AND td.d_orderdate = '".$_POST['search_date']."'
|
|
".$optionCondition.$searchCondition."
|
|
GROUP BY tc.c_uid
|
|
ORDER BY td.d_orderdate DESC");
|
|
|
|
$loc_comp = array();
|
|
while($rstOptionPoint = fetch_array($sqOptionPoint)) {
|
|
$color = '#FF80FF';
|
|
$orderFlag = 'DISABLED';
|
|
if ($rstOptionPoint['d_driveruid'] == $rstOptionPoint['d_createruid']) {
|
|
$color = '#FFFDD5'; // Driver 가 직접 Add Order 시
|
|
if ($rstOptionPoint['d_orderdate'] >= date('Ymd')) $orderFlag = ''; // Driver 가 직접 Add Order 한 경우 해당일 이후것 삭제 가능함
|
|
}
|
|
if($rstOptionPoint['d_status'] === 'F') {
|
|
$color = '#7B7A7A';
|
|
}else{
|
|
switch($rstOptionPoint['d_ordertype']) {
|
|
case 'R':
|
|
$color = '#FF0000';
|
|
break;
|
|
case 'S':
|
|
$color = '#800080';
|
|
break;
|
|
}
|
|
}
|
|
|
|
$crntLoc = array($rstOptionPoint['lat'],$rstOptionPoint['lon']);
|
|
|
|
for($i=0;$i < 99;$i++) {
|
|
if(in_array($crntLoc,$loc_comp)){
|
|
$crntLoc = array($rstOptionPoint['lat'],((float)$rstOptionPoint['lon']+0.0001000));
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
|
|
$loc_comp[] = $crntLoc;
|
|
$customerUidArr[] = (int)$rstOptionPoint['c_uid'];
|
|
|
|
$d_ordertype = $rstOptionPoint['d_ordertype'];
|
|
if ($d_ordertype == 'S') $d_ordertype = '📅';
|
|
else if ($d_ordertype == 'R') $d_ordertype = '🏃';
|
|
else $d_ordertype = '';
|
|
|
|
$result[] = array(
|
|
"type" => $rstOptionPoint['type'],
|
|
"id" => $rstOptionPoint['c_uid'],
|
|
"accountno" => $rstOptionPoint['c_accountno'],
|
|
"paymentcycle" => $rstOptionPoint['c_paymentcycle'],
|
|
"maincontainer" => $rstOptionPoint['c_maincontainer'],
|
|
"rate" => $rstOptionPoint['c_rate'],
|
|
"name" => $rstOptionPoint['c_name'],
|
|
"phone" => $rstOptionPoint['phone'],
|
|
"address" => $rstOptionPoint['addr'],
|
|
"payment_type" => $rstOptionPoint['c_paymenttype'],
|
|
"order_date" => $rstOptionPoint['d_orderdate'],
|
|
"ordertype" => $d_ordertype,
|
|
"lat" => (string)$crntLoc[0],
|
|
"lon" => (string)$crntLoc[1],
|
|
"qty" => $rstOptionPoint['d_quantity'],
|
|
"estqty" => $rstOptionPoint['d_estquantity'],
|
|
"color" => $color,
|
|
"d_status" => $rstOptionPoint['d_status'],
|
|
"comment" => $rstOptionPoint['c_comment_ri'],
|
|
"container_location" => stripslashes($rstOptionPoint['c_location']),
|
|
"last_pickup_date" => $rstOptionPoint['c_lastpickupdate'],
|
|
"last_paid_date" => $rstOptionPoint['c_lastpaiddate'],
|
|
"duid" => $rstOptionPoint['d_uid'],
|
|
"druid" => $rstOptionPoint['d_ruid'],
|
|
"ddruid" => $rstOptionPoint['d_druid'],
|
|
"rnote" => $rstOptionPoint['r_note'],
|
|
"orderFlag" => $orderFlag
|
|
);
|
|
if(strlen($uidList) > 0){
|
|
$uidList .= ",".$rstOptionPoint['c_uid'];
|
|
}else{
|
|
$uidList .= $rstOptionPoint['c_uid'];
|
|
}
|
|
}
|
|
|
|
|
|
// 오늘 날짜
|
|
$today = new DateTime(date("Y-m-d"));
|
|
//$today = new DateTime('20240425');
|
|
// 지정한 날짜
|
|
$searchDate = new DateTime($_POST['search_date']);
|
|
// 두 날짜 간 차이 계산
|
|
$interval = $today->diff($searchDate);
|
|
|
|
|
|
$qtyCondition = "";
|
|
|
|
foreach($_POST['quantity'] as $quantity) {
|
|
if($quantity['checked'] === "true") {
|
|
if(strlen($qtyCondition) > 0){
|
|
$qtyCondition .= " OR";
|
|
}else{
|
|
$qtyCondition .= " AND (";
|
|
}
|
|
if($quantity['max'] === 'MAX') {
|
|
$qtyCondition .= " (tc.realQty > ".$quantity['min'].")";
|
|
}else{
|
|
$qtyCondition .= " (tc.realQty BETWEEN ".$quantity['min']." AND ".$quantity['max'].")";
|
|
}
|
|
}
|
|
}
|
|
|
|
$sqDriverRegion = qry("SELECT
|
|
m_uid
|
|
FROM
|
|
tbl_member
|
|
WHERE
|
|
m_currentdriver = ".(int)$_POST['driver']);
|
|
$rstDriverRegion = fetch_array($sqDriverRegion);
|
|
$driverid = $rstDriverRegion['m_uid'];
|
|
|
|
|
|
|
|
if(strlen($qtyCondition) > 0){
|
|
$qtyCondition .= ")";
|
|
|
|
if(strlen($uidList) > 0){
|
|
$uidList = "AND tc.c_uid NOT IN (".$uidList.")";
|
|
}
|
|
|
|
$sqQtyPoint = qry("SELECT
|
|
'map-marker' AS type,
|
|
tc.c_uid,
|
|
tc.c_accountno,
|
|
tc.c_paymentcycle,
|
|
tc.c_maincontainer,
|
|
tc.c_rate,
|
|
tc.c_name,
|
|
IF(tc.c_phoneext IS NULL OR LENGTH(tc.c_phoneext) < 1, tc.c_phone, CONCAT(tc.c_phone,' (ext.',tc.c_phoneext,')')) AS phone,
|
|
CONCAT(tc.c_address, ', ', tc.c_city, ', ', tc.c_postal) AS addr,
|
|
tc.c_paymenttype,
|
|
IFNULL(tc.c_fullquantity,0),
|
|
IFNULL(tc.c_fullquantitydaily,0),
|
|
tc.realQty,
|
|
tc.c_schedule,
|
|
tc.c_comment_ri,
|
|
tc.c_location,
|
|
IFNULL(DATE_FORMAT(tc.c_lastpickupdate,'%Y-%m-%d'),'') as c_lastpickupdate,
|
|
IFNULL(DATE_FORMAT(tc.c_lastpaiddate,'%Y-%m-%d'),'') as c_lastpaiddate,
|
|
IFNULL(tc.c_geolat,'') as lat,
|
|
IFNULL(tc.c_geolon,'') as lon
|
|
FROM
|
|
(SELECT
|
|
c_uid,
|
|
c_accountno,
|
|
c_paymentcycle,
|
|
c_maincontainer,
|
|
c_rate,
|
|
c_driveruid,
|
|
c_name,
|
|
c_phoneext,
|
|
c_phone,
|
|
c_address,
|
|
c_city,
|
|
c_province,
|
|
c_postal,
|
|
c_paymenttype,
|
|
c_lastpickupdate,
|
|
c_lastpaiddate,
|
|
c_fullquantitydaily,
|
|
c_fullquantity,
|
|
IFNULL((c_fullquantity - c_fullquantitydaily + (".(int)$interval->days." * c_fullquantitydaily)),0) as realQty,
|
|
c_location,
|
|
c_schedule,
|
|
c_comment_ri,
|
|
c_geolat,
|
|
c_geolon
|
|
FROM
|
|
tbl_customer
|
|
WHERE
|
|
c_status = 'A') tc
|
|
WHERE
|
|
tc.c_driveruid = ".(int)$driverid."
|
|
".$uidList."
|
|
".$qtyCondition.$searchCondition."
|
|
GROUP BY tc.c_uid");
|
|
|
|
$loc_comp = array();
|
|
while($rstQtyPoint = fetch_array($sqQtyPoint)) {
|
|
$realQty = $rstQtyPoint['realQty'];
|
|
//$colorArr = array('#000000','#D32F2F','#1ABC9C','#FBC02D','#2979FF','#CDDC39'); //Something wrong on black
|
|
$colorArr = array('#000000','#FFFF00','#FBC02D','#1ABC9C','#2979FF','#000000'); //Something wrong on black
|
|
$color = $colorArr[0];
|
|
$qtyNum = 1;
|
|
foreach($_POST['quantity'] as $quantity) {
|
|
if($quantity['max'] === 'MAX') {
|
|
if((int)$realQty >= (int)$quantity['min']) {
|
|
$color = $colorArr[$qtyNum];
|
|
break;
|
|
}
|
|
}else{
|
|
if((int)$realQty >= (int)$quantity['min'] && (int)$realQty <= (int)$quantity['max']) {
|
|
$color = $colorArr[$qtyNum];
|
|
break;
|
|
}
|
|
}
|
|
$qtyNum += 1;
|
|
}
|
|
|
|
$crntLoc = array($rstQtyPoint['lat'],$rstQtyPoint['lon']);
|
|
|
|
for($i=0;$i < 99;$i++) {
|
|
if(in_array($crntLoc,$loc_comp)){
|
|
$crntLoc = array($rstQtyPoint['lat'],((float)$rstQtyPoint['lon']+0.0001000));
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
|
|
$loc_comp[] = $crntLoc;
|
|
$customerUidArr[] = (int)$rstQtyPoint['c_uid'];
|
|
|
|
$c_schedule = $rstQtyPoint['c_schedule'];
|
|
if ($c_schedule == 'Will Call') $c_schedule = '📞';
|
|
else if ($c_schedule != 'None') $c_schedule = '📅';
|
|
else $c_schedule = '';
|
|
|
|
$result[] = array(
|
|
"type" => $rstQtyPoint['type'],
|
|
"id" => $rstQtyPoint['c_uid'],
|
|
"accountno" => $rstQtyPoint['c_accountno'],
|
|
"paymentcycle" => $rstQtyPoint['c_paymentcycle'],
|
|
"maincontainer" => $rstQtyPoint['c_maincontainer'],
|
|
"rate" => $rstQtyPoint['c_rate'],
|
|
"name" => $rstQtyPoint['c_name'],
|
|
"phone" => $rstQtyPoint['phone'],
|
|
"address" => $rstQtyPoint['addr'],
|
|
"payment_type" => $rstQtyPoint['c_paymenttype'],
|
|
"order_date" => null,
|
|
"ordertype" => $c_schedule,
|
|
"lat" => (string)$crntLoc[0],
|
|
"lon" => (string)$crntLoc[1],
|
|
"estqty" => $realQty,
|
|
"color" => $color,
|
|
"comment" => $rstQtyPoint['c_comment_ri'],
|
|
"container_location" => stripslashes($rstQtyPoint['c_location']),
|
|
"last_pickup_date" => $rstQtyPoint['c_lastpickupdate'],
|
|
"last_paid_date" => $rstQtyPoint['c_lastpaiddate']
|
|
);
|
|
}
|
|
}
|
|
$customerUidArr = array_values(array_unique($customerUidArr));
|
|
$containerMap = [];
|
|
|
|
if (!empty($customerUidArr)) {
|
|
$in = implode(',', array_map('intval', $customerUidArr));
|
|
|
|
$sqCC = qry("
|
|
SELECT
|
|
cc_customer_uid,
|
|
cc_type,
|
|
cc_owner_type,
|
|
cc_has_lock,
|
|
cc_has_wheel,
|
|
cc_has_woodframe
|
|
FROM tbl_customer_container
|
|
WHERE cc_status = 'A'
|
|
AND cc_customer_uid IN ($in)
|
|
ORDER BY cc_customer_uid, cc_type, cc_uid
|
|
");
|
|
|
|
while ($cc = fetch_array($sqCC)) {
|
|
$cu = (int)$cc['cc_customer_uid'];
|
|
if (!isset($containerMap[$cu])) $containerMap[$cu] = [];
|
|
$containerMap[$cu][] = [
|
|
'cc_type' => $cc['cc_type'],
|
|
'cc_owner_type' => $cc['cc_owner_type'],
|
|
'cc_has_lock' => $cc['cc_has_lock'],
|
|
'cc_has_wheel' => $cc['cc_has_wheel'],
|
|
'cc_has_woodframe' => $cc['cc_has_woodframe'],
|
|
];
|
|
}
|
|
}
|
|
|
|
for ($i = 0; $i < count($result); $i++) {
|
|
$cid = (int)$result[$i]['id']; // JSON에서 customer id로 쓰는 필드
|
|
$result[$i]['containers'] = $containerMap[$cid] ?? [];
|
|
}
|
|
|
|
|
|
$this->response($this->json(array("result"=>$result)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
public function updtPoint()
|
|
{
|
|
try {
|
|
$svc = new CustomerService();
|
|
$svc->patchCustomer(
|
|
(int)$_POST['id'],
|
|
[
|
|
'c_geolat' => $_POST['lat'],
|
|
'c_geolon' => $_POST['lon'],
|
|
'c_updatedby' => $_SESSION['ss_UID']
|
|
]
|
|
);
|
|
|
|
$this->response(
|
|
$this->json([
|
|
"markerIndex" => $_POST['marker_index'],
|
|
"lat" => $_POST['lat'],
|
|
"lon" => $_POST['lon'],
|
|
"name" => $_POST['name'],
|
|
"qty" => $_POST['qty'],
|
|
"property" => $_POST['property']
|
|
]),
|
|
200
|
|
);
|
|
|
|
} catch (Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response(
|
|
$this->json($error),
|
|
417
|
|
);
|
|
}
|
|
}
|
|
|
|
public function updtShortInfo()
|
|
{
|
|
try {
|
|
$svc = new CustomerService();
|
|
$svc->patchCustomer(
|
|
(int)$_POST['id'],
|
|
[
|
|
'c_location' => trim($_POST['location']),
|
|
'c_comment_ri' => trim($_POST['comment']),
|
|
'c_updatedby' => $_SESSION['ss_UID']
|
|
]
|
|
);
|
|
|
|
$this->response(
|
|
$this->json([
|
|
"result" => "success"
|
|
]),
|
|
200
|
|
);
|
|
|
|
} catch (Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response(
|
|
$this->json($error),
|
|
417
|
|
);
|
|
}
|
|
}
|
|
|
|
public function inqDriverGeo(){
|
|
try {
|
|
$sqDriverGeo = qry("SELECT
|
|
m_geolat,
|
|
m_geolon
|
|
FROM
|
|
tbl_member
|
|
WHERE
|
|
m_uid = ".(int)$_POST['driver']);
|
|
$rstDriverGeo = fetch_array($sqDriverGeo);
|
|
$result = array(
|
|
"geolat" => $rstDriverGeo['m_geolat'],
|
|
"geolon" => $rstDriverGeo['m_geolon']
|
|
);
|
|
|
|
$this->response($this->json(array("result"=>$result)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
|
|
private function getGeoCoordinates($address) {
|
|
// Google API 키를 여기에 입력하세요.
|
|
$apiKey = 'AIzaSyDg9u03mGrBhyOisp7VGc27CTPI9QXp8sY';
|
|
|
|
// 주소를 URL 인코딩
|
|
$address = urlencode($address);
|
|
|
|
// Google Maps Geocoding API URL
|
|
$url = "https://maps.googleapis.com/maps/api/geocode/json?address={$address}&key={$apiKey}";
|
|
|
|
// cURL 세션 초기화
|
|
$ch = curl_init();
|
|
|
|
// cURL 옵션 설정
|
|
curl_setopt($ch, CURLOPT_URL, $url);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
|
|
|
// URL의 내용을 가져옴
|
|
$responseJson = curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
// JSON 응답을 PHP 배열로 변환
|
|
$response = json_decode($responseJson, true);
|
|
|
|
// 위도와 경도를 추출
|
|
if ($response['status'] == 'OK') {
|
|
$latitude = $response['results'][0]['geometry']['location']['lat'];
|
|
$longitude = $response['results'][0]['geometry']['location']['lng'];
|
|
|
|
return array('latitude' => $latitude, 'longitude' => $longitude);
|
|
} else {
|
|
// 에러 처리
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public function inqNearby(){
|
|
try {
|
|
|
|
$result = array();
|
|
$uidList = "";
|
|
$customerUidArr = [];
|
|
|
|
$sqOptionPoint = qry("SELECT
|
|
'flag' AS type,
|
|
tc.c_uid,
|
|
tc.c_accountno,
|
|
tc.c_paymentcycle,
|
|
tc.c_maincontainer,
|
|
tc.c_rate,
|
|
tc.c_name,
|
|
IF(tc.c_phoneext IS NULL OR LENGTH(tc.c_phoneext) < 1, tc.c_phone, CONCAT(tc.c_phone,' (ext.',tc.c_phoneext,')')) AS phone,
|
|
CONCAT(tc.c_address, ', ', tc.c_city, ', ', tc.c_postal) AS addr,
|
|
tc.c_paymenttype,
|
|
td.d_orderdate,
|
|
IFNULL(td.d_quantity,0) as d_quantity,
|
|
IFNULL(td.d_estquantity,0) as d_estquantity,
|
|
td.d_ordertype,
|
|
td.d_uid,
|
|
td.d_druid,
|
|
td.d_driveruid,
|
|
td.d_createruid,
|
|
td.d_status,
|
|
tc.c_comment_ri,
|
|
tc.c_location,
|
|
IFNULL(DATE_FORMAT(tc.c_lastpickupdate,'%Y-%m-%d'),'') as c_lastpickupdate,
|
|
IFNULL(DATE_FORMAT(tc.c_lastpaiddate,'%Y-%m-%d'),'') as c_lastpaiddate,
|
|
IFNULL(tc.c_geolat,'') as lat,
|
|
IFNULL(tc.c_geolon,'') as lon,
|
|
(
|
|
ST_Distance_Sphere(
|
|
point(".(float)$_POST['center_lon'].", ".(float)$_POST['center_lat']."),
|
|
point(tc.c_geolon, tc.c_geolat)
|
|
)
|
|
) / 1000 AS distance_km,
|
|
td.r_note
|
|
FROM
|
|
(SELECT
|
|
c_uid,
|
|
c_accountno,
|
|
c_paymentcycle,
|
|
c_maincontainer,
|
|
c_rate,
|
|
c_driveruid,
|
|
c_name,
|
|
c_phoneext,
|
|
c_phone,
|
|
c_address,
|
|
c_city,
|
|
c_province,
|
|
c_postal,
|
|
c_paymenttype,
|
|
c_lastpickupdate,
|
|
c_lastpaiddate,
|
|
c_location,
|
|
c_comment_ri,
|
|
c_geolat,
|
|
c_geolon
|
|
FROM
|
|
tbl_customer) tc,
|
|
(SELECT
|
|
td.d_uid,
|
|
td.d_customeruid,
|
|
td.d_orderdate,
|
|
td.d_quantity,
|
|
td.d_estquantity,
|
|
td.d_ordertype,
|
|
td.d_driveruid,
|
|
td.d_ruid,
|
|
td.d_druid,
|
|
td.d_createruid,
|
|
td.d_status,
|
|
tr.r_note
|
|
FROM
|
|
tbl_daily td
|
|
LEFT OUTER JOIN tbl_request tr ON td.d_ruid = tr.r_uid) td
|
|
WHERE
|
|
tc.c_uid = td.d_customeruid
|
|
|
|
AND td.d_druid = ".(int)$_POST['driver']."
|
|
AND td.d_orderdate = '".$_POST['search_date']."'
|
|
|
|
GROUP BY tc.c_uid
|
|
/* HAVING distance_km <= 1 */
|
|
ORDER BY td.d_orderdate DESC");
|
|
|
|
$loc_comp = array();
|
|
while($rstOptionPoint = fetch_array($sqOptionPoint)) {
|
|
$color = '#FF80FF';
|
|
$orderFlag = 'DISABLED';
|
|
$d_ordertype = '';
|
|
if ($rstOptionPoint['d_driveruid'] == $rstOptionPoint['d_createruid']) {
|
|
$color = '#FFFDD5'; // Driver 가 직접 Add Order 시
|
|
if ($rstOptionPoint['d_orderdate'] >= date('Ymd')) $orderFlag = ''; // Driver 가 직접 Add Order 한 경우 해당일 이후것 삭제 가능함
|
|
}
|
|
if($rstOptionPoint['d_status'] === 'F') {
|
|
$color = '#7B7A7A';
|
|
$d_ordertype = '';
|
|
}else{
|
|
switch($rstOptionPoint['d_ordertype']) {
|
|
case 'R':
|
|
$color = '#FF0000';
|
|
$d_ordertype = '🏃';
|
|
break;
|
|
case 'S':
|
|
$color = '#800080';
|
|
$d_ordertype = '📅';
|
|
break;
|
|
}
|
|
}
|
|
|
|
$crntLoc = array($rstOptionPoint['lat'],$rstOptionPoint['lon']);
|
|
$customerUidArr[] = (int)$rstOptionPoint['c_uid'];
|
|
|
|
for($i=0;$i < 99;$i++) {
|
|
if(in_array($crntLoc,$loc_comp)){
|
|
$crntLoc = array($rstOptionPoint['lat'],((float)$rstOptionPoint['lon']+0.0001000));
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
|
|
$loc_comp[] = $crntLoc;
|
|
|
|
$result[] = array(
|
|
"type" => $rstOptionPoint['type'],
|
|
"id" => $rstOptionPoint['c_uid'],
|
|
"accountno" => $rstOptionPoint['c_accountno'],
|
|
"paymentcycle" => $rstOptionPoint['c_paymentcycle'],
|
|
"maincontainer" => $rstOptionPoint['c_maincontainer'],
|
|
"rate" => $rstOptionPoint['c_rate'],
|
|
"name" => $rstOptionPoint['c_name'],
|
|
"phone" => $rstOptionPoint['phone'],
|
|
"address" => $rstOptionPoint['addr'],
|
|
"payment_type" => $rstOptionPoint['c_paymenttype'],
|
|
"order_date" => $rstOptionPoint['d_orderdate'],
|
|
"ordertype" => $d_ordertype,
|
|
"lat" => (string)$crntLoc[0],
|
|
"lon" => (string)$crntLoc[1],
|
|
"qty" => $rstOptionPoint['d_quantity'],
|
|
"estqty" => $rstOptionPoint['d_estquantity'],
|
|
"color" => $color,
|
|
"d_status" => $rstOptionPoint['d_status'],
|
|
"comment" => $rstOptionPoint['c_comment_ri'],
|
|
"container_location" => stripslashes($rstOptionPoint['c_location']),
|
|
"last_pickup_date" => $rstOptionPoint['c_lastpickupdate'],
|
|
"last_paid_date" => $rstOptionPoint['c_lastpaiddate'],
|
|
"duid" => $rstOptionPoint['d_uid'],
|
|
"druid" => $rstOptionPoint['d_druid'],
|
|
"rnote" => $rstOptionPoint['r_note'],
|
|
"orderFlag" => $orderFlag
|
|
);
|
|
if(strlen($uidList) > 0){
|
|
$uidList .= ",".$rstOptionPoint['c_uid'];
|
|
}else{
|
|
$uidList .= $rstOptionPoint['c_uid'];
|
|
}
|
|
}
|
|
|
|
|
|
// 오늘 날짜
|
|
$today = new DateTime(date("Y-m-d"));
|
|
//$today = new DateTime('20240425');
|
|
// 지정한 날짜
|
|
$searchDate = new DateTime($_POST['search_date']);
|
|
// 두 날짜 간 차이 계산
|
|
$interval = $today->diff($searchDate);
|
|
|
|
$qtyCondition = "";
|
|
|
|
foreach($_POST['quantity'] as $quantity) {
|
|
if($quantity['checked'] === "true") {
|
|
if(strlen($qtyCondition) > 0){
|
|
$qtyCondition .= " OR";
|
|
}else{
|
|
$qtyCondition .= " AND (";
|
|
}
|
|
if($quantity['max'] === 'MAX') {
|
|
$qtyCondition .= " (tc.realQty > ".$quantity['min'].")";
|
|
}else{
|
|
$qtyCondition .= " (tc.realQty BETWEEN ".$quantity['min']." AND ".$quantity['max'].")";
|
|
}
|
|
}
|
|
}
|
|
|
|
$sqDriverRegion = qry("SELECT
|
|
m_uid
|
|
FROM
|
|
tbl_member
|
|
WHERE
|
|
m_currentdriver = ".(int)$_POST['driver']);
|
|
$rstDriverRegion = fetch_array($sqDriverRegion);
|
|
$driverid = $rstDriverRegion['m_uid'];
|
|
|
|
|
|
if(strlen($qtyCondition) > 0){
|
|
$qtyCondition .= ")";
|
|
|
|
if(strlen($uidList) > 0){
|
|
$uidList = "AND tc.c_uid NOT IN (".$uidList.")";
|
|
}
|
|
|
|
$sqQtyPoint = qry("SELECT
|
|
'map-marker' AS type,
|
|
tc.c_uid,
|
|
tc.c_accountno,
|
|
tc.c_paymentcycle,
|
|
tc.c_maincontainer,
|
|
tc.c_rate,
|
|
tc.c_name,
|
|
IF(tc.c_phoneext IS NULL OR LENGTH(tc.c_phoneext) < 1, tc.c_phone, CONCAT(tc.c_phone,' (ext.',tc.c_phoneext,')')) AS phone,
|
|
CONCAT(tc.c_address, ', ', tc.c_city, ', ', tc.c_postal) AS addr,
|
|
tc.c_paymenttype,
|
|
IFNULL(tc.c_fullquantity,0),
|
|
IFNULL(tc.c_fullquantitydaily,0),
|
|
tc.realQty,
|
|
tc.c_comment_ri,
|
|
tc.c_location,
|
|
tc.c_schedule,
|
|
IFNULL(DATE_FORMAT(tc.c_lastpickupdate,'%Y-%m-%d'),'') as c_lastpickupdate,
|
|
IFNULL(DATE_FORMAT(tc.c_lastpaiddate,'%Y-%m-%d'),'') as c_lastpaiddate,
|
|
IFNULL(tc.c_geolat,'') as lat,
|
|
IFNULL(tc.c_geolon,'') as lon,
|
|
(
|
|
ST_Distance_Sphere(
|
|
point(".(float)$_POST['center_lon'].", ".(float)$_POST['center_lat']."),
|
|
point(tc.c_geolon, tc.c_geolat)
|
|
)
|
|
) / 1000 AS distance_km
|
|
FROM
|
|
(SELECT
|
|
c_uid,
|
|
c_accountno,
|
|
c_paymentcycle,
|
|
c_maincontainer,
|
|
c_rate,
|
|
c_driveruid,
|
|
c_name,
|
|
c_phoneext,
|
|
c_phone,
|
|
c_address,
|
|
c_city,
|
|
c_province,
|
|
c_postal,
|
|
c_paymenttype,
|
|
c_lastpickupdate,
|
|
c_lastpaiddate,
|
|
c_fullquantitydaily,
|
|
c_fullquantity,
|
|
IFNULL((c_fullquantity - c_fullquantitydaily + (".(int)$interval->days." * c_fullquantitydaily)),0) as realQty,
|
|
c_location,
|
|
c_schedule,
|
|
c_comment_ri,
|
|
c_geolat,
|
|
c_geolon
|
|
FROM
|
|
tbl_customer
|
|
WHERE
|
|
c_status = 'A') tc
|
|
WHERE
|
|
tc.c_driveruid = ".(int)$driverid."
|
|
".$uidList."
|
|
".$qtyCondition."
|
|
GROUP BY tc.c_uid
|
|
HAVING distance_km <= 1");
|
|
|
|
$loc_comp = array();
|
|
while($rstQtyPoint = fetch_array($sqQtyPoint)) {
|
|
//$realQty = $rstQtyPoint['c_fullquantity'] - $rstQtyPoint['c_fullquantitydaily'] + ((int)$interval->days * $rstQtyPoint['c_fullquantitydaily']);
|
|
$realQty = $rstQtyPoint['realQty'];
|
|
//$colorArr = array('#000000','#D32F2F','#1ABC9C','#FBC02D','#2979FF','#CDDC39'); //Something wrong on black
|
|
$colorArr = array('#000000','#FFFF00','#FBC02D','#1ABC9C','#2979FF','#000000'); //Something wrong on black
|
|
$color = $colorArr[0];
|
|
$qtyNum = 1;
|
|
foreach($_POST['quantity'] as $quantity) {
|
|
if($quantity['max'] === 'MAX') {
|
|
if((int)$realQty >= (int)$quantity['min']) {
|
|
$color = $colorArr[$qtyNum];
|
|
break;
|
|
}
|
|
}else{
|
|
if((int)$realQty >= (int)$quantity['min'] && (int)$realQty <= (int)$quantity['max']) {
|
|
$color = $colorArr[$qtyNum];
|
|
break;
|
|
}
|
|
}
|
|
$qtyNum += 1;
|
|
}
|
|
|
|
$crntLoc = array($rstQtyPoint['lat'],$rstQtyPoint['lon']);
|
|
$customerUidArr[] = (int)$rstQtyPoint['c_uid'];
|
|
|
|
for($i=0;$i < 99;$i++) {
|
|
if(in_array($crntLoc,$loc_comp)){
|
|
$crntLoc = array($rstQtyPoint['lat'],((float)$rstQtyPoint['lon']+0.0001000));
|
|
}else{
|
|
break;
|
|
}
|
|
}
|
|
|
|
$loc_comp[] = $crntLoc;
|
|
|
|
$c_schedule = $rstQtyPoint['c_schedule'];
|
|
if ($c_schedule == 'Will Call') $c_schedule = '📞';
|
|
else if ($c_schedule != 'None') $c_schedule = '📅';
|
|
else $c_schedule = '';
|
|
|
|
$result[] = array(
|
|
"type" => $rstQtyPoint['type'],
|
|
"id" => $rstQtyPoint['c_uid'],
|
|
"accountno" => $rstQtyPoint['c_accountno'],
|
|
"paymentcycle" => $rstQtyPoint['c_paymentcycle'],
|
|
"maincontainer" => $rstQtyPoint['c_maincontainer'],
|
|
"rate" => $rstQtyPoint['c_rate'],
|
|
"name" => $rstQtyPoint['c_name'],
|
|
"phone" => $rstQtyPoint['phone'],
|
|
"address" => $rstQtyPoint['addr'],
|
|
"payment_type" => $rstQtyPoint['c_paymenttype'],
|
|
"order_date" => null,
|
|
"ordertype" => $c_schedule,
|
|
"lat" => (string)$crntLoc[0],
|
|
"lon" => (string)$crntLoc[1],
|
|
"estqty" => $realQty,
|
|
"color" => $color,
|
|
"comment" => $rstQtyPoint['c_comment_ri'],
|
|
"container_location" => stripslashes($rstQtyPoint['c_location']),
|
|
"last_pickup_date" => $rstQtyPoint['c_lastpickupdate'],
|
|
"last_paid_date" => $rstQtyPoint['c_lastpaiddate']
|
|
);
|
|
}
|
|
}
|
|
|
|
$customerUidArr = array_values(array_unique($customerUidArr));
|
|
$containerMap = [];
|
|
|
|
if (!empty($customerUidArr)) {
|
|
$in = implode(',', array_map('intval', $customerUidArr));
|
|
|
|
$sqCC = qry("
|
|
SELECT
|
|
cc_customer_uid,
|
|
cc_type,
|
|
cc_owner_type,
|
|
cc_has_lock,
|
|
cc_has_wheel,
|
|
cc_has_woodframe
|
|
FROM tbl_customer_container
|
|
WHERE cc_status = 'A'
|
|
AND cc_customer_uid IN ($in)
|
|
ORDER BY cc_customer_uid, cc_type, cc_uid
|
|
");
|
|
|
|
while ($cc = fetch_array($sqCC)) {
|
|
$cu = (int)$cc['cc_customer_uid'];
|
|
if (!isset($containerMap[$cu])) $containerMap[$cu] = [];
|
|
$containerMap[$cu][] = [
|
|
'cc_type' => $cc['cc_type'],
|
|
'cc_owner_type' => $cc['cc_owner_type'],
|
|
'cc_has_lock' => $cc['cc_has_lock'],
|
|
'cc_has_wheel' => $cc['cc_has_wheel'],
|
|
'cc_has_woodframe' => $cc['cc_has_woodframe'],
|
|
];
|
|
}
|
|
}
|
|
|
|
for ($i = 0; $i < count($result); $i++) {
|
|
$cid = (int)$result[$i]['id']; // JSON에서 customer id로 쓰는 필드
|
|
$result[$i]['containers'] = $containerMap[$cid] ?? [];
|
|
}
|
|
$this->response($this->json(array("result"=>$result)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
|
|
public function inqHistory(){
|
|
try {
|
|
$sqHistory = qry("SELECT
|
|
IFNULL(DATE_FORMAT(td.d_orderdate,'%Y-%m-%d'),'') as d_orderdate,
|
|
td.d_quantity,
|
|
td.d_driveruid,
|
|
td.d_paystatus,
|
|
IFNULL(td.d_drinitial,'-') as d_drinitial,
|
|
IFNULL(td.d_payamount,'') as d_payamount,
|
|
tm.m_initial
|
|
FROM
|
|
tbl_daily td,tbl_member tm
|
|
WHERE
|
|
td.d_customeruid = '".$_POST['id']."'
|
|
AND td.d_status = 'F'
|
|
AND td.d_driveruid = tm.m_uid
|
|
ORDER BY td.d_orderdate DESC");
|
|
$result = array();
|
|
while($rstHistory = fetch_array($sqHistory)) {
|
|
|
|
if($rstHistory['d_paystatus'] === 'P') {
|
|
//$d_paystatusSTR = $arrPaidStatus['P'];
|
|
$d_paystatusSTR = "Paid". " ($".$rstHistory['d_payamount'] . ")";
|
|
}
|
|
else if ($rstHistory['d_paystatus'] === 'N') {
|
|
$d_paystatusSTR = "Unpaid";
|
|
}
|
|
else if ($rstHistory['d_paystatus'] === 'G') {
|
|
$d_paystatusSTR = "Paid (Grease Trap)";
|
|
}
|
|
else $d_paystatusSTR = "";
|
|
|
|
|
|
$result[] = array(
|
|
"date" => $rstHistory['d_orderdate'],
|
|
"quantity" => $rstHistory['d_quantity'],
|
|
"driver" => $rstHistory['d_drinitial'],
|
|
"paid" => $d_paystatusSTR
|
|
);
|
|
}
|
|
|
|
$this->response($this->json(array("result"=>$result)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
|
|
public function inqShortNotice(){
|
|
try {
|
|
$sqNotice = qry("SELECT
|
|
IFNULL(DATE_FORMAT(td.d_orderdate,'%Y-%m-%d'),'') as d_orderdate,
|
|
tr.r_note
|
|
FROM
|
|
tbl_daily td,tbl_request tr
|
|
WHERE
|
|
td.d_uid = '".$_POST['id']."'
|
|
AND td.d_ruid = tr.r_uid
|
|
ORDER BY td.d_uid DESC LIMIT 1 ");
|
|
|
|
$rstNotice = fetch_array($sqNotice);
|
|
|
|
$result = array(
|
|
"orderdate" => $rstNotice['d_orderdate'],
|
|
"rnote" => $rstNotice['r_note']
|
|
);
|
|
|
|
$this->response($this->json(array("result"=>$result)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
|
|
public function inqRouteAddress(){
|
|
try {
|
|
|
|
$myLocation = ["lat" => (float)$_POST['m_lat'], "lon" => (float)$_POST['m_lon']];
|
|
$apiKey = "AIzaSyDg9u03mGrBhyOisp7VGc27CTPI9QXp8sY"; // Google Maps API 키
|
|
|
|
$getThisYear = date("Y");
|
|
$getLastYear = date("Y", strtotime('last year'));
|
|
|
|
$_POST['route_date'] = str_replace("-","",$_POST['route_date']);
|
|
|
|
$sqAddress = qry("SELECT
|
|
tc.c_uid,
|
|
tc.c_name,
|
|
tc.c_address,
|
|
tc.c_city,
|
|
tc.c_postal,
|
|
td.d_accountno,
|
|
td.d_maincontainer,
|
|
td.d_paymenttype,
|
|
td.d_rate,
|
|
td.d_lastpickupquantity,
|
|
td.d_estquantity,
|
|
IFNULL(td.d_quantity, '') as d_quantity,
|
|
td.d_lastpaiddate,
|
|
s.THIS_YEAR,
|
|
s.LAST_YEAR,
|
|
td.d_fullcycle,
|
|
td.d_lastpickupdate,
|
|
IFNULL(tc.c_geolat,'') as lat,
|
|
IFNULL(tc.c_geolon,'') as lon
|
|
FROM
|
|
tbl_customer tc,
|
|
tbl_daily td
|
|
LEFT JOIN (SELECT
|
|
d_customeruid,
|
|
SUM(CASE WHEN d_visitdate like '".$getThisYear."%' THEN d_quantity ELSE 0 END) AS THIS_YEAR,
|
|
SUM(CASE WHEN d_visitdate like '".$getLastYear."%' THEN d_quantity ELSE 0 END) AS LAST_YEAR
|
|
FROM tbl_daily
|
|
WHERE d_status = 'F'
|
|
GROUP BY d_customeruid) s ON s.d_customeruid = td.d_customeruid
|
|
WHERE
|
|
tc.c_uid = td.d_customeruid
|
|
AND td.d_druid = '".$_POST['driver']."'
|
|
AND td.d_orderdate = '".$_POST['route_date']."'");
|
|
$results = array();
|
|
while($rstAddress = fetch_array($sqAddress)) {
|
|
if (strlen($rstAddress['lat']) < 1 || strlen($rstAddress['lon']) < 1) {
|
|
// 주소로부터 위도와 경도 찾기 (예제에서는 이름 필드를 주소로 가정)
|
|
$address = urlencode($rstAddress['address']);
|
|
$url = "https://maps.googleapis.com/maps/api/geocode/json?address=$address&key=$apiKey";
|
|
|
|
$response = file_get_contents($url);
|
|
$json = json_decode($response, true);
|
|
|
|
if (!empty($json['results'])) {
|
|
$rstAddress["lat"] = $json['results'][0]['geometry']['location']['lat'];
|
|
$rstAddress["lon"] = $json['results'][0]['geometry']['location']['lng'];
|
|
}
|
|
}
|
|
|
|
$results[] = array(
|
|
"id" => $rstAddress['c_uid'],
|
|
"name" => $rstAddress['c_name'],
|
|
"address" => str_replace("/", "/", $rstAddress['c_address']),
|
|
"city" => $rstAddress['c_city'],
|
|
"postal" => $rstAddress['c_postal'],
|
|
"accountno" => $rstAddress['d_accountno'],
|
|
"maincontainer" => $rstAddress['d_maincontainer'],
|
|
"paymenttype" => $rstAddress['d_paymenttype'],
|
|
"rate" => $rstAddress['d_rate'],
|
|
"lastpickupquantity" => $rstAddress['d_lastpickupquantity'],
|
|
"estquantity" => $rstAddress['d_estquantity'],
|
|
"quantity" => $rstAddress['d_quantity'],
|
|
"lastpaiddate" => $rstAddress['d_lastpaiddate'],
|
|
"THIS_YEAR" => (float)$rstAddress['THIS_YEAR'],
|
|
"LAST_YEAR" => (float)$rstAddress['LAST_YEAR'],
|
|
"fullcycle" => $rstAddress['d_fullcycle'],
|
|
"lastpickupdate" => $rstAddress['d_lastpickupdate'],
|
|
"lat" => (float)$rstAddress['lat'],
|
|
"lon" => (float)$rstAddress['lon']
|
|
);
|
|
}
|
|
|
|
usort($results, function($a, $b) use ($myLocation) {
|
|
$distA = sqrt(pow($a["lat"] - $myLocation["lat"], 2) + pow($a["lon"] - $myLocation["lon"], 2));
|
|
$distB = sqrt(pow($b["lat"] - $myLocation["lat"], 2) + pow($b["lon"] - $myLocation["lon"], 2));
|
|
return $distA <=> $distB;
|
|
});
|
|
|
|
$this->response($this->json(array("result"=>$results)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
public function inqShortInfo(){
|
|
|
|
try {
|
|
$sqShortInfo = qry("SELECT
|
|
c_uid,
|
|
c_accountno,
|
|
c_name,
|
|
c_paymenttype,
|
|
c_comment_ri,
|
|
c_location
|
|
FROM
|
|
tbl_customer
|
|
WHERE
|
|
c_uid = ".(int)$_POST['id']);
|
|
$rstShortInfo = fetch_array($sqShortInfo);
|
|
|
|
// 설치 이미지 조회 추가
|
|
$query_img = "
|
|
SELECT i_filepath, i_filename
|
|
FROM tbl_customer_image
|
|
WHERE i_customeruid = '".(int)$_POST['id']."'
|
|
AND i_type = 'install'
|
|
AND i_status = 'A'
|
|
ORDER BY i_createddate DESC
|
|
LIMIT 1
|
|
";
|
|
$imgRow = qry($query_img);
|
|
$installImgUrl = "";
|
|
|
|
if ($row = fetch_array($imgRow)) {
|
|
$installImgUrl = $row['i_filepath'] . $row['i_filename'];
|
|
}
|
|
|
|
if ($rstShortInfo['c_paymenttype'] == "CA") {
|
|
|
|
$sqShortDaily = qry("SELECT
|
|
IFNULL(DATE_FORMAT(td.d_orderdate,'%Y-%m-%d'),'') as d_orderdate,
|
|
td.d_paystatus,
|
|
td.d_payamount
|
|
FROM tbl_daily td
|
|
WHERE
|
|
td.d_customeruid = '".$_POST['id']."'
|
|
AND td.d_status = 'F'
|
|
AND td.d_quantity > 1
|
|
ORDER BY td.d_visitdate DESC LIMIT 1 ");
|
|
if(db_num_rows($sqShortDaily) > 0) {
|
|
$rstShortDaily = fetch_array($sqShortDaily);
|
|
|
|
if($rstShortDaily['d_paystatus'] === 'P') {
|
|
//$d_paystatusSTR = $arrPaidStatus['P'];
|
|
$d_paystatusSTR = "Paid". " (".$rstShortDaily['d_orderdate']." / $".$rstShortDaily['d_payamount'] . ")";
|
|
}
|
|
else if ($rstShortDaily['d_paystatus'] === 'N') {
|
|
$d_paystatusSTR = "Unpaid" ." (".$rstShortDaily['d_orderdate'].")";
|
|
}
|
|
|
|
} else {
|
|
$d_paystatusSTR = "";
|
|
}
|
|
|
|
}
|
|
else $d_paystatusSTR = "";
|
|
|
|
$result = array(
|
|
"id" => $_POST['id'],
|
|
"accountno" => $rstShortInfo['c_accountno'],
|
|
"name" => $rstShortInfo['c_name'],
|
|
"payment_type" => $rstShortInfo['c_paymenttype'],
|
|
"paymentstring" => $d_paystatusSTR,
|
|
"comment" => $rstShortInfo['c_comment_ri'],
|
|
"location" => $rstShortInfo['c_location'],
|
|
"install_img" => $installImgUrl
|
|
);
|
|
|
|
$this->response($this->json(array("result"=>$result)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
public function addOrder()
|
|
{
|
|
try {
|
|
|
|
$customer_uid = (int)$_POST['customer_uid'];
|
|
$orderdate = preg_replace('/[^0-9]/', '', $_POST['orderdate'] ?? '');
|
|
$ordertype = trim($_POST['ordertype'] ?? 'N');
|
|
$ruid = trim($_POST['ruid'] ?? '');
|
|
$driveruid = (int)$_POST['driveruid'];
|
|
|
|
if ($customer_uid <= 0) {
|
|
throw new Exception("invalid customer_uid");
|
|
}
|
|
|
|
if (strlen($orderdate) !== 8) {
|
|
throw new Exception("invalid orderdate");
|
|
}
|
|
|
|
// =========================
|
|
// customer 조회
|
|
// =========================
|
|
$sqCus = qry("
|
|
SELECT c_accountno, c_driveruid
|
|
FROM tbl_customer
|
|
WHERE c_uid = {$customer_uid}
|
|
LIMIT 1
|
|
");
|
|
|
|
$customer = fetch_array($sqCus);
|
|
|
|
if (!$customer) {
|
|
throw new Exception("Customer not found");
|
|
}
|
|
|
|
$now14 = date("YmdHis");
|
|
|
|
// =========================
|
|
// payload 구성
|
|
// =========================
|
|
$payload = [
|
|
'd_customeruid' => $customer_uid,
|
|
'd_accountno' => $customer['c_accountno'],
|
|
'd_orderdate' => $orderdate,
|
|
'd_ordertype' => $ordertype,
|
|
'd_ruid' => $ruid,
|
|
'd_driveruid' => $customer['c_driveruid'], // legacy
|
|
'd_druid' => $driveruid, // 실제 driver
|
|
'd_status' => 'A',
|
|
'd_createruid' => $_SESSION['ss_UID'] ?? '',
|
|
'd_updateruid' => $_SESSION['ss_UID'] ?? '',
|
|
'd_createddate' => $now14,
|
|
'n_level' => $_SESSION['ss_LEVEL'],
|
|
];
|
|
|
|
// =========================
|
|
// saveDaily 호출
|
|
// =========================
|
|
$afterData = $this->dailyService->saveDaily($payload);
|
|
|
|
// =========================
|
|
// response
|
|
// =========================
|
|
$this->response($this->json([
|
|
"msg" => "Order has been successfully added.",
|
|
"c_index" => $_POST['c_index'],
|
|
"d_uid" => $afterData['d_uid'] ?? null
|
|
]), 200);
|
|
|
|
} catch (Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
public function addOrderDirect()
|
|
{
|
|
try {
|
|
|
|
$customer_uid = (int)$_POST['customer_uid'];
|
|
$orderdate = preg_replace('/[^0-9]/', '', $_POST['orderdate'] ?? '');
|
|
$driveruid = (int)$_POST['driveruid'];
|
|
$creatoruid = trim($_POST['d_createruid'] ?? '');
|
|
$jobtype = $_POST['jobtype'] ?? 'UCO';
|
|
|
|
if ($customer_uid <= 0) {
|
|
throw new Exception("invalid customer_uid");
|
|
}
|
|
|
|
if (strlen($orderdate) !== 8) {
|
|
throw new Exception("invalid orderdate");
|
|
}
|
|
|
|
// =========================
|
|
// 중복 체크
|
|
// =========================
|
|
$sqCheckOrder = qry("
|
|
SELECT count(d_uid) as rowcnt
|
|
FROM tbl_daily
|
|
WHERE d_orderdate='{$orderdate}'
|
|
AND d_customeruid={$customer_uid}
|
|
AND d_jobtype = 'UCO'
|
|
");
|
|
$rstCheckOrder = fetch_array($sqCheckOrder);
|
|
|
|
if ($rstCheckOrder['rowcnt'] > 0) {
|
|
$this->response($this->json([
|
|
"msg"=>"This order already exists.",
|
|
"c_index"=>$_POST['c_index'],
|
|
"c_return"=>"0"
|
|
]), 200);
|
|
return;
|
|
}
|
|
|
|
// =========================
|
|
// 최소 customer 정보만 조회
|
|
// =========================
|
|
$sqCus = qry("
|
|
SELECT c_accountno, c_driveruid
|
|
FROM tbl_customer
|
|
WHERE c_uid = {$customer_uid}
|
|
LIMIT 1
|
|
");
|
|
if (db_num_rows($sqCus) === 0) {
|
|
throw new Exception("Customer not found");
|
|
}
|
|
$customer = fetch_array($sqCus);
|
|
|
|
$now14 = date("YmdHis");
|
|
|
|
// =========================
|
|
// PAYLOAD
|
|
// =========================
|
|
$payload = [
|
|
'd_customeruid' => $customer_uid,
|
|
'd_accountno' => $customer['c_accountno'],
|
|
'd_orderdate' => $orderdate,
|
|
'd_driveruid' => $customer['c_driveruid'], // legacy 유지
|
|
'd_druid' => $driveruid, // 실제 driver
|
|
'd_status' => 'A',
|
|
'd_ordertype' => 'N',
|
|
'd_jobtype' => 'UCO',
|
|
'd_createruid' => $creatoruid,
|
|
'd_updateruid' => $_SESSION['ss_UID'] ?? '',
|
|
'd_createddate' => $now14,
|
|
'n_level' => $_SESSION['ss_LEVEL'],
|
|
];
|
|
|
|
// =========================
|
|
// SAVE (모든 로직은 daily.php)
|
|
// =========================
|
|
$afterData = $this->dailyService->saveDaily($payload);
|
|
|
|
// =========================
|
|
// RESPONSE
|
|
// =========================
|
|
$this->response($this->json([
|
|
"msg"=>"Order has been successfully added.",
|
|
"c_index"=>$_POST['c_index'],
|
|
"c_return"=>1,
|
|
"d_uid"=>$afterData['d_uid'] ?? null
|
|
]), 200);
|
|
|
|
return;
|
|
|
|
} catch(Exception $e) {
|
|
$error = [$e->getMessage()];
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
public function removeOrder()
|
|
{
|
|
try {
|
|
|
|
$duid = (int)($_POST['duid'] ?? 0);
|
|
$customerId = (int)($_POST['id'] ?? 0);
|
|
|
|
if ($duid <= 0) {
|
|
throw new Exception("invalid duid");
|
|
}
|
|
|
|
// =========================
|
|
// 기존 daily 조회 (삭제용 key 확보)
|
|
// =========================
|
|
$sqDaily = qry("
|
|
SELECT d_orderdate, d_accountno, d_jobtype
|
|
FROM tbl_daily
|
|
WHERE d_uid = '{$duid}'
|
|
LIMIT 1
|
|
");
|
|
|
|
$daily = fetch_array($sqDaily);
|
|
|
|
if (!$daily) {
|
|
throw new Exception("Daily record not found");
|
|
}
|
|
|
|
// =========================
|
|
// DELETE (중앙화)
|
|
// =========================
|
|
$this->dailyService->deleteDaily(
|
|
$daily['d_orderdate'],
|
|
$daily['d_accountno'],
|
|
$daily['d_jobtype']
|
|
);
|
|
|
|
// =========================
|
|
// RESPONSE
|
|
// =========================
|
|
$this->response($this->json([
|
|
"msg" => "Order has been successfully removed.",
|
|
"c_index" => $_POST['c_index']
|
|
]), 200);
|
|
|
|
} catch(Exception $e) {
|
|
$error = [$e->getMessage()];
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
public function initInput(){
|
|
try {
|
|
$sqInput = qry("SELECT
|
|
td.d_uid,
|
|
td.d_customeruid,
|
|
td.d_orderdate,
|
|
td.d_ordertype,
|
|
td.d_jobtype,
|
|
td.d_driveruid,
|
|
td.d_druid,
|
|
td.d_ruid,
|
|
td.d_visitdate,
|
|
td.d_quantity,
|
|
td.d_payamount,
|
|
td.d_paystatus,
|
|
td.d_payeename,
|
|
td.d_payeesign,
|
|
td.d_sludge,
|
|
td.d_rate,
|
|
tc.c_sludge,
|
|
tc.c_paymenttype,
|
|
tc.c_name
|
|
FROM
|
|
tbl_daily td,
|
|
tbl_customer tc
|
|
WHERE
|
|
td.d_customeruid = tc.c_uid
|
|
AND td.d_customeruid='".$_POST['c_uid']."'
|
|
AND td.d_orderdate='".$_POST['orderdate']."'"
|
|
);
|
|
|
|
$result = array();
|
|
if(db_num_rows($sqInput) > 0) {
|
|
$rstInput = fetch_array($sqInput);
|
|
|
|
// 이미 존재하는 오더장을 수정한다면 Note 정보도 가져와야 함
|
|
$sqNoteInput = qry("SELECT n_note FROM tbl_note WHERE n_dailyuid = '".$rstInput['d_uid']."' ");
|
|
if(db_num_rows($sqNoteInput) > 0) {
|
|
$rstNoteInput = fetch_array($sqNoteInput);
|
|
$noteSTR = $rstNoteInput['n_note'];
|
|
} else
|
|
$noteSTR = "";
|
|
|
|
$result = array(
|
|
"d_uid" => $rstInput['d_uid'],
|
|
"d_customeruid" => $rstInput['d_customeruid'],
|
|
"d_orderdate" => $rstInput['d_orderdate'],
|
|
"d_jobtype" => $rstInput['d_jobtype'],
|
|
"d_driveruid" => $rstInput['d_driveruid'],
|
|
"d_druid" => $rstInput['d_druid'],
|
|
"d_visitdate" => $rstInput['d_visitdate'],
|
|
"d_quantity" => $rstInput['d_quantity'],
|
|
"d_payamount" => $rstInput['d_payamount'],
|
|
"d_paystatus" => $rstInput['d_paystatus'],
|
|
"d_payeename" => $rstInput['d_payeename'],
|
|
"d_payeesign" => $rstInput['d_payeesign'],
|
|
"d_sludge" => ($rstInput['d_sludge'] === null || $rstInput['d_sludge'] === '') ? $rstInput['c_sludge'] : $rstInput['d_sludge'],
|
|
"d_paymenttype" => $rstInput['c_paymenttype'],
|
|
"d_name" => $rstInput['c_name'],
|
|
"d_rate" => $rstInput['d_rate'],
|
|
"d_note" => $noteSTR
|
|
);
|
|
}
|
|
else { // tbl_daily data 없는 경우 처리
|
|
$sqInput = qry("SELECT
|
|
c_driveruid,
|
|
c_sludge,
|
|
c_paymenttype,
|
|
c_rate,
|
|
c_name
|
|
FROM
|
|
tbl_customer
|
|
WHERE
|
|
c_uid='".$_POST['c_uid']."'");
|
|
|
|
$rstInput = fetch_array($sqInput);
|
|
|
|
$sqDriverInfo = qry("SELECT
|
|
m_currentdriver
|
|
FROM
|
|
tbl_member
|
|
WHERE
|
|
m_uid = ".$rstInput['c_driveruid']);
|
|
$rstDriverInfo = fetch_array($sqDriverInfo);
|
|
|
|
|
|
$result = array(
|
|
"d_uid" => '',
|
|
"d_customeruid" => $_POST['c_uid'],
|
|
"d_orderdate" => $_POST['orderdate'],
|
|
"d_driveruid" => $rstInput['c_driveruid'],
|
|
"d_druid" => $rstDriverInfo['m_currentdriver'],
|
|
"d_visitdate" => $_POST['orderdate'],
|
|
"d_sludge" => $rstInput['c_sludge'],
|
|
"d_paymenttype" => $rstInput['c_paymenttype'],
|
|
"d_name" => $rstInput['c_name'],
|
|
"d_rate" => $rstInput['c_rate']
|
|
);
|
|
}
|
|
|
|
$this->response($this->json(array("result"=>$result)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
public function saveInput()
|
|
{
|
|
try {
|
|
|
|
$connect = $GLOBALS['conn'] ?? null;
|
|
if (!$connect) {
|
|
throw new Exception("DB connection not found");
|
|
}
|
|
|
|
// =========================
|
|
// INPUT
|
|
// =========================
|
|
$uid = (int)($_POST['uid'] ?? 0);
|
|
$customerUid = (int)($_POST['customeruid'] ?? 0);
|
|
$driverUid = (int)($_POST['driveruid'] ?? 0); // member uid (legacy)
|
|
$druid = (int)($_POST['druid'] ?? 0); // driver uid (new)
|
|
$creatorUid = trim($_POST['createruid'] ?? '');
|
|
|
|
$orderdate = preg_replace('/[^0-9]/', '', $_POST['orderdate'] ?? '');
|
|
$visitdate = preg_replace('/[^0-9]/', '', $_POST['visitdate'] ?? '');
|
|
$jobtype = $_POST['jobtype'] ?? 'UCO';
|
|
|
|
$quantity = (int)($_POST['quantity'] ?? 0);
|
|
$sludge = trim($_POST['sludge'] ?? '');
|
|
$paymenttype = trim($_POST['paymenttype'] ?? '');
|
|
$payamount = trim($_POST['payamount'] ?? '');
|
|
$payeename = trim($_POST['payeename'] ?? '');
|
|
$paystatus = trim($_POST['paystatus'] ?? '');
|
|
$note = trim($_POST['note'] ?? '');
|
|
|
|
// =========================
|
|
// VALIDATION
|
|
// =========================
|
|
if ($customerUid <= 0) {
|
|
throw new Exception("invalid customeruid");
|
|
}
|
|
|
|
if ($visitdate === '' || strlen($visitdate) !== 8) {
|
|
throw new Exception("invalid visitdate");
|
|
}
|
|
|
|
if ($orderdate === '' || strlen($orderdate) !== 8) {
|
|
throw new Exception("invalid orderdate");
|
|
}
|
|
|
|
$paystatusSTR = ($paymenttype === 'CA') ? $paystatus : '';
|
|
|
|
// =========================
|
|
// CUSTOMER LOAD (최소 정보만)
|
|
// =========================
|
|
$sqCus = qry("
|
|
SELECT
|
|
c_uid,
|
|
c_accountno
|
|
FROM tbl_customer
|
|
WHERE c_uid = '{$customerUid}'
|
|
LIMIT 1
|
|
");
|
|
$customer = fetch_array($sqCus);
|
|
|
|
if (!$customer || empty($customer['c_accountno'])) {
|
|
throw new Exception("Customer not found");
|
|
}
|
|
|
|
// =========================
|
|
// EXISTING DAILY (for update)
|
|
// =========================
|
|
$existing = null;
|
|
|
|
if ($uid > 0) {
|
|
$sqDaily = qry("
|
|
SELECT *
|
|
FROM tbl_daily
|
|
WHERE d_uid = '{$uid}'
|
|
LIMIT 1
|
|
");
|
|
$existing = fetch_array($sqDaily);
|
|
|
|
if (!$existing) {
|
|
throw new Exception("Daily record not found");
|
|
}
|
|
}
|
|
|
|
// =========================
|
|
// SAFETY CHECK
|
|
// =========================
|
|
if ($existing) {
|
|
// row 와 넘어온 customer 가 다르면 중단
|
|
if (
|
|
(int)$existing['d_customeruid'] !== $customerUid
|
|
|| $existing['d_accountno'] !== $customer['c_accountno']
|
|
) {
|
|
|
|
throw new Exception(
|
|
"Daily key mismatch. "
|
|
. "UID={$uid}, "
|
|
. "Existing Customer={$existing['d_customeruid']}, "
|
|
. "Input Customer={$customerUid}, "
|
|
. "Existing Account={$existing['d_accountno']}, "
|
|
. "Input Account={$customer['c_accountno']}"
|
|
);
|
|
}
|
|
}
|
|
|
|
$now14 = date('YmdHis');
|
|
|
|
// =========================
|
|
// PAYLOAD (최소값만)
|
|
// =========================
|
|
$payload = [
|
|
'd_uid' => $uid ?: null,
|
|
'd_customeruid' => $customerUid,
|
|
'd_accountno' => $customer['c_accountno'],
|
|
'd_orderdate' => $visitdate, // 완료 기준
|
|
'd_driveruid' => $driverUid,
|
|
'd_druid' => $druid,
|
|
|
|
'd_visit' => 'Y',
|
|
'd_visitdate' => $visitdate . '000000',
|
|
'd_status' => 'F',
|
|
'd_jobtype' => 'UCO',
|
|
|
|
'd_quantity' => $quantity,
|
|
'd_sludge' => $sludge,
|
|
|
|
'd_paymenttype' => $paymenttype,
|
|
'd_payamount' => $payamount,
|
|
'd_payeename' => $payeename,
|
|
'd_paystatus' => $paystatusSTR,
|
|
|
|
'd_inputdate' => $now14,
|
|
'd_updateruid' => $_SESSION['ss_UID'] ?? '',
|
|
'd_level' => $_SESSION['ss_LEVEL'],
|
|
];
|
|
|
|
// note → daily.php에서 처리됨
|
|
if ($note !== '') {
|
|
$payload['d_pickupnote'] = $note;
|
|
}
|
|
|
|
// 신규 생성 시만
|
|
if ($uid <= 0) {
|
|
$payload['d_ordertype'] = 'N';
|
|
$payload['d_createruid'] = $creatorUid;
|
|
$payload['d_createddate'] = $now14;
|
|
}
|
|
|
|
// =========================
|
|
// SIGN FILE 처리
|
|
// =========================
|
|
$folderPath = getenv("DOCUMENT_ROOT") . "/upload_sign/" . $customerUid;
|
|
|
|
if (is_dir($folderPath)) {
|
|
$files = scandir($folderPath);
|
|
$tmpFilename = "T_" . $visitdate;
|
|
|
|
foreach ($files as $file) {
|
|
if (strstr($file, $tmpFilename)) {
|
|
|
|
$newName = str_replace("T_", "", $file);
|
|
|
|
if ($file !== $newName) {
|
|
@rename($folderPath . "/" . $file, $folderPath . "/" . $newName);
|
|
}
|
|
|
|
$payload['d_payeesign'] = $newName;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// =========================
|
|
// SAVE
|
|
// =========================
|
|
$opt = [];
|
|
|
|
if ($existing) {
|
|
$opt['match_uid'] = $uid;
|
|
$opt['old_key'] = [
|
|
'd_orderdate' => $existing['d_orderdate'],
|
|
'd_accountno' => $existing['d_accountno'],
|
|
'd_jobtype' => $existing['d_jobtype'],
|
|
];
|
|
$opt['allow_update'] = true;
|
|
}
|
|
|
|
$afterData = $this->dailyService->saveDaily($payload, $opt);
|
|
|
|
// =========================
|
|
// RESPONSE
|
|
// =========================
|
|
$this->response($this->json([
|
|
"msg" => "Input has been successfully saved.",
|
|
"d_uid" => $afterData['d_uid'] ?? $uid
|
|
]), 200);
|
|
|
|
return;
|
|
|
|
} catch (Exception $e) {
|
|
|
|
$error = [$e->getMessage()];
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
|
|
public function inqMapCenter(){
|
|
try {
|
|
$geo = array(
|
|
"lat" => '43.732188',
|
|
"lon" => '-79.571618'
|
|
);
|
|
$sqCenter = qry("SELECT
|
|
m_geolat,
|
|
m_geolon
|
|
FROM
|
|
tbl_member
|
|
WHERE
|
|
m_currentdriver=".(int)$_POST['driver']);
|
|
if(db_num_rows($sqCenter) > 0) {
|
|
$rstCenter = fetch_array($sqCenter);
|
|
if($rstCenter['m_geolat'] !== null && $rstCenter['m_geolon'] !== null) {
|
|
$geo = array(
|
|
"lat" => $rstCenter['m_geolat'],
|
|
"lon" => $rstCenter['m_geolon']
|
|
);
|
|
}
|
|
}
|
|
|
|
$this->response($this->json(array("geo"=>$geo)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
|
|
///////////////////////
|
|
// Get Pickup Quantity
|
|
///////////////////////
|
|
|
|
public function inqPickupQty(){
|
|
try {
|
|
|
|
$_POST['route_date'] = str_replace("-","",$_POST['route_date']);
|
|
|
|
$sqQuantity = qry("SELECT
|
|
SUM(d_quantity) as pickupquantity
|
|
FROM
|
|
tbl_daily
|
|
WHERE
|
|
d_status = 'F' AND d_orderdate = '".$_POST['route_date']."'
|
|
AND d_druid = '".$_POST['driver']."' ");
|
|
|
|
$rstQuantity = fetch_array($sqQuantity);
|
|
|
|
$curPickupQty = number_format((int)$rstQuantity['pickupquantity']);
|
|
|
|
|
|
$this->response($this->json(array("curPickupQty"=>$curPickupQty)), 200);
|
|
} catch(Exception $e) {
|
|
$error = array($e->getMessage());
|
|
$this->response($this->json($error), 417);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
$api = new API;
|
|
$api->processApi();
|
|
|
|
|
|
|
|
?>
|