Files
kngil_home/kngil/bbs/sales_results.php
2026-02-02 18:52:20 +09:00

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