232 lines
6.9 KiB
PHP
232 lines
6.9 KiB
PHP
<?php
|
|
ini_set('display_errors', 1);
|
|
error_reporting(E_ALL);
|
|
header("Content-Type: application/json; charset=utf-8");
|
|
|
|
// 기능 비활성화 (PostgreSQL만 사용)
|
|
http_response_code(410);
|
|
echo json_encode([
|
|
"status" => "disabled",
|
|
"message" => "해당 기능은 현재 비활성화되어 있습니다."
|
|
]);
|
|
exit;
|
|
|
|
/* -----------------------------------------------------
|
|
🔵 DB 연결
|
|
----------------------------------------------------- */
|
|
try {
|
|
$pdo = new PDO(
|
|
"mysql:host=localhost;dbname=egbim;charset=utf8mb4",
|
|
"egbim",
|
|
"baron3840!!",
|
|
[
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
|
|
]
|
|
);
|
|
} catch (Exception $e) {
|
|
echo json_encode(["status" => "fail", "message" => "DB 연결 실패"]);
|
|
exit;
|
|
}
|
|
|
|
/* -----------------------------------------------------
|
|
🔵 공통 날짜 변환 함수 (MM/DD/YYYY → YYYY-MM-DD)
|
|
----------------------------------------------------- */
|
|
function normalize_date($dateStr) {
|
|
if (!$dateStr) return null;
|
|
|
|
// 이미 YYYY-MM-DD라면 그대로 반환
|
|
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $dateStr)) {
|
|
return $dateStr;
|
|
}
|
|
|
|
// MM/DD/YYYY → YYYY-MM-DD (한자리/두자리 모두 허용)
|
|
if (preg_match('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $dateStr, $m)) {
|
|
$month = str_pad($m[1], 2, '0', STR_PAD_LEFT);
|
|
$day = str_pad($m[2], 2, '0', STR_PAD_LEFT);
|
|
return "{$m[3]}-$month-$day";
|
|
}
|
|
|
|
// 형식 이상하면 null 리턴
|
|
return null;
|
|
}
|
|
|
|
/* -----------------------------------------------------
|
|
🔵 요청 액션
|
|
----------------------------------------------------- */
|
|
$action = $_POST['action'] ?? $_GET['action'] ?? "";
|
|
|
|
/* =====================================================
|
|
1) LIST
|
|
===================================================== */
|
|
if ($action === "list") {
|
|
$stmt = $pdo->query("
|
|
SELECT r.*, m.emp_name
|
|
FROM sales_results r
|
|
LEFT JOIN sales_members m ON r.emp_no = m.emp_no
|
|
ORDER BY r.seq_no DESC
|
|
");
|
|
|
|
echo json_encode([
|
|
"status" => "ok",
|
|
"records" => $stmt->fetchAll()
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
/* =====================================================
|
|
2) INSERT (seq_no 자동 증가)
|
|
===================================================== */
|
|
if ($action === "insert") {
|
|
|
|
$sales_date = normalize_date($_POST['sales_date']);
|
|
|
|
if (!$sales_date) {
|
|
echo json_encode([
|
|
"status" => "error",
|
|
"message" => "실적일(sales_date) 형식 오류. YYYY-MM-DD 또는 MM/DD/YYYY 로 입력하세요."
|
|
]);
|
|
exit;
|
|
}
|
|
|
|
$next_seq = $pdo->query("SELECT IFNULL(MAX(seq_no), 0) + 1 FROM sales_results")->fetchColumn();
|
|
|
|
// 🔥 서버에서 총금액 계산
|
|
$qty = (int)($_POST['quantity'] ?? 0);
|
|
$unit = (int)($_POST['unit_price'] ?? 0);
|
|
$discount = (int)($_POST['discount'] ?? 0);
|
|
|
|
$total_amount = ($qty * $unit) - $discount;
|
|
if ($total_amount < 0) $total_amount = 0;
|
|
|
|
$stmt = $pdo->prepare("
|
|
INSERT INTO sales_results
|
|
(seq_no, sales_date, emp_no, client_code, product_code, quantity, unit_price, discount, total_amount, remarks)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
");
|
|
|
|
$stmt->execute([
|
|
$next_seq,
|
|
$sales_date,
|
|
$_POST['emp_no'],
|
|
$_POST['client_code'],
|
|
$_POST['product_code'],
|
|
$qty,
|
|
$unit,
|
|
$discount,
|
|
$total_amount, // 🔥 클라이언트 값 무시, 서버 계산값 넣기
|
|
$_POST['remarks']
|
|
]);
|
|
|
|
echo json_encode(["status" => "ok"]);
|
|
exit;
|
|
}
|
|
|
|
/* =====================================================
|
|
3) UPDATE
|
|
===================================================== */
|
|
if ($action === "update") {
|
|
|
|
$seq_no = $_POST['seq_no'] ?? '';
|
|
if (!$seq_no) {
|
|
echo json_encode(["status" => "error", "message" => "seq_no 누락"]);
|
|
exit;
|
|
}
|
|
|
|
unset($_POST['action'], $_POST['seq_no']);
|
|
|
|
/* -----------------------------
|
|
🔵 날짜 변환 (MM/DD/YYYY → YYYY-MM-DD)
|
|
----------------------------- */
|
|
if (!empty($_POST['sales_date'])) {
|
|
$date = normalize_date($_POST['sales_date']);
|
|
if (!$date) {
|
|
echo json_encode(["status" => "error", "message" => "실적일(sales_date) 형식 오류"]);
|
|
exit;
|
|
}
|
|
$_POST['sales_date'] = $date;
|
|
}
|
|
|
|
/* --------------------------------------------------
|
|
🔥 quantity / unit_price / discount 변경 여부 확인
|
|
----------------------------------------------------- */
|
|
$qtyChanged = array_key_exists('quantity', $_POST);
|
|
$unitChanged = array_key_exists('unit_price', $_POST);
|
|
$discountChanged = array_key_exists('discount', $_POST);
|
|
|
|
if ($qtyChanged || $unitChanged || $discountChanged) {
|
|
|
|
// 기존 값 가져오기
|
|
$old = $pdo->prepare("
|
|
SELECT quantity, unit_price, discount
|
|
FROM sales_results
|
|
WHERE seq_no = ?
|
|
");
|
|
$old->execute([$seq_no]);
|
|
$oldData = $old->fetch();
|
|
|
|
// 새 값이 있으면 새 값 사용, 없으면 기존 값 사용
|
|
$qty = isset($_POST['quantity']) ? (int)$_POST['quantity'] : (int)$oldData['quantity'];
|
|
$unit = isset($_POST['unit_price']) ? (int)$_POST['unit_price'] : (int)$oldData['unit_price'];
|
|
$discount = isset($_POST['discount']) ? (int)$_POST['discount'] : (int)$oldData['discount'];
|
|
|
|
// 서버에서 총금액 재계산
|
|
$total_amount = ($qty * $unit) - $discount;
|
|
if ($total_amount < 0) $total_amount = 0;
|
|
|
|
$_POST['total_amount'] = $total_amount; // 🔥 강제 반영
|
|
}
|
|
|
|
/* -----------------------------
|
|
🔵 Partial Update (빈값은 무시)
|
|
----------------------------- */
|
|
$fields = [];
|
|
$params = [];
|
|
|
|
foreach ($_POST as $key => $val) {
|
|
|
|
// NULL, 빈문자, undefined는 UPDATE 안함
|
|
if ($val === '' || $val === null || $val === 'undefined') {
|
|
continue;
|
|
}
|
|
|
|
$fields[] = "$key = ?";
|
|
$params[] = $val;
|
|
}
|
|
|
|
if (!empty($fields)) {
|
|
$sql = "UPDATE sales_results SET "
|
|
. implode(", ", $fields)
|
|
. ", updated_at = NOW()
|
|
WHERE seq_no = ?";
|
|
$params[] = $seq_no;
|
|
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute($params);
|
|
}
|
|
|
|
echo json_encode(["status" => "ok"]);
|
|
exit;
|
|
}
|
|
|
|
|
|
/* =====================================================
|
|
4) DELETE
|
|
===================================================== */
|
|
if ($action === "delete") {
|
|
|
|
$stmt = $pdo->prepare("DELETE FROM sales_results WHERE seq_no = ?");
|
|
$stmt->execute([$_POST['seq_no']]);
|
|
|
|
echo json_encode(["status" => "ok"]);
|
|
exit;
|
|
}
|
|
|
|
|
|
/* =====================================================
|
|
요청 없음
|
|
===================================================== */
|
|
echo json_encode(["status" => "fail", "message" => "잘못된 요청"]);
|
|
exit;
|
|
?>
|