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