diff --git a/public_html/assets/api/v1/.htaccess b/public_html/assets/api/v1/.htaccess new file mode 100644 index 0000000..c816ef3 --- /dev/null +++ b/public_html/assets/api/v1/.htaccess @@ -0,0 +1,6 @@ +Options -Indexes + + + Order Allow,Deny + Deny from all + diff --git a/public_html/assets/api/v1/config.php b/public_html/assets/api/v1/config.php new file mode 100644 index 0000000..bc890df --- /dev/null +++ b/public_html/assets/api/v1/config.php @@ -0,0 +1,36 @@ + false, 'error' => 'Unauthorized']); + exit; + } +} + +function getDB() { + // 효진님이 서버 배포 시 아래 정보를 실제 서버 DB 정보로 교체 + $host = 'mis-mysql'; // 서버 배포 시 교체 + $dbname = 'goiintra_db'; // 서버 배포 시 교체 + $user = 'goiintra_root'; // 서버 배포 시 교체 + $pass = 'L0C2CKN5GHHY'; // 서버 배포 시 교체 + + return new PDO( + "mysql:host=$host;dbname=$dbname;charset=utf8", + $user, $pass, + [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] + ); +} + +function jsonResponse($data) { + header('Content-Type: application/json; charset=utf-8'); + header('Access-Control-Allow-Origin: *'); + echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_NUMERIC_CHECK); + exit; +} diff --git a/public_html/assets/api/v1/drivers.php b/public_html/assets/api/v1/drivers.php new file mode 100644 index 0000000..352e87e --- /dev/null +++ b/public_html/assets/api/v1/drivers.php @@ -0,0 +1,33 @@ +query(" + SELECT + dr_uid AS uid, + dr_firstname AS firstname, + dr_lastname AS lastname, + dr_initial AS initial, + dr_type AS type + FROM tbl_driver + WHERE dr_status = 'A' + ORDER BY dr_initial ASC +"); +$drivers = $stmt->fetchAll(PDO::FETCH_ASSOC); + +jsonResponse([ + 'success' => true, + 'count' => count($drivers), + 'drivers' => $drivers +]); diff --git a/public_html/assets/api/v1/orders.php b/public_html/assets/api/v1/orders.php new file mode 100644 index 0000000..864e1de --- /dev/null +++ b/public_html/assets/api/v1/orders.php @@ -0,0 +1,156 @@ + false, 'error' => 'Invalid date format. Use YYYYMMDD (e.g. 20260521)']); +} + +// ============================================= +// 메인 쿼리 +// tbl_daily → 수거 데이터 (Forecast, Actual, Stops) +// tbl_member → 드라이버 조인 조건 +// tbl_memberhis → 출퇴근/Cash 데이터 (LEFT JOIN: 없어도 수거 데이터는 나옴) +// ============================================= +$sql = " + SELECT + d.d_orderdate AS order_date, + d.d_druid AS driver_uid, + d.d_drinitial AS driver, + + -- 수거 데이터 + COUNT(*) AS total_stops, + COUNT(CASE WHEN d.d_status = 'F' THEN 1 END) AS completed_stops, + COALESCE(SUM(d.d_estquantity), 0) AS forecast, + COALESCE(SUM(d.d_quantity), 0) AS actual, + + -- 출퇴근 시간 (tbl_memberhis) + h.h_departuretime AS departure, + h.h_arrivaltime AS arrival, + + -- 마일리지 (tbl_memberhis) + h.h_mileage_s AS mileage_start, + h.h_mileage_f AS mileage_finish, + + -- Cash 데이터 (tbl_memberhis) + COALESCE(h.h_balance_o, 0) AS opening_balance, + COALESCE(h.h_balance_in, 0) AS cash_in, + COALESCE(h.h_balance_out, 0) AS cash_out, + COALESCE(h.h_balance_r, 0) AS cash_return, + COALESCE(h.h_balance_g, 0) AS gas, + COALESCE(h.h_balance_e, 0) AS extra, + COALESCE(h.h_balance_t, 0) AS balance_total, + + -- 드라이버 코멘트 + h.h_comment AS comment + + FROM tbl_daily d + INNER JOIN tbl_member m + ON (d.d_druid = m.m_currentdriver) + LEFT JOIN tbl_memberhis h + ON (d.d_druid = h.h_druid AND d.d_orderdate = h.h_date) + WHERE d.d_orderdate BETWEEN :date_from AND :date_to +"; + +if ($driver) { + $sql .= " AND d.d_drinitial = :driver "; +} + +$sql .= " + GROUP BY + d.d_orderdate, + d.d_drinitial, + d.d_druid, + h.h_departuretime, + h.h_arrivaltime, + h.h_mileage_s, + h.h_mileage_f, + h.h_balance_o, + h.h_balance_in, + h.h_balance_out, + h.h_balance_r, + h.h_balance_g, + h.h_balance_e, + h.h_balance_t, + h.h_comment + ORDER BY d.d_orderdate DESC, d.d_drinitial ASC +"; + +$stmt = $pdo->prepare($sql); +$stmt->bindParam(':date_from', $dateFrom); +$stmt->bindParam(':date_to', $dateTo); +if ($driver) { + $stmt->bindParam(':driver', $driver); +} +$stmt->execute(); +$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); + +// ============================================= +// 계산 컬럼 추가 +// ============================================= +foreach ($rows as &$row) { + + // 날짜 포맷 변환 YYYYMMDD → YYYY-MM-DD + $d = $row['order_date']; + if (strlen($d) === 8) { + $row['order_date_formatted'] = substr($d,0,4).'-'.substr($d,4,2).'-'.substr($d,6,2); + } + + // 달성률 (%) + $fc = floatval($row['forecast']); + $ac = floatval($row['actual']); + $row['achievement_pct'] = $fc > 0 ? round($ac / $fc * 100, 1) : 0; + + // 잔여 수거량 + $row['remaining'] = max($fc - $ac, 0); + + // 진행 상태 + if ($ac <= 0) $row['status'] = 'Pending'; + elseif ($ac >= $fc) $row['status'] = 'Done'; + else $row['status'] = 'In Progress'; + + // 마일리지 주행거리 + $ms = intval($row['mileage_start']); + $mf = intval($row['mileage_finish']); + $row['mileage_driven'] = ($ms > 0 && $mf > 0) ? max($mf - $ms, 0) : null; +} +unset($row); + +jsonResponse([ + 'success' => true, + 'date_from' => $dateFrom, + 'date_to' => $dateTo, + 'count' => count($rows), + 'data' => $rows +]);