$errorMessage]; if ($debug && !empty($debugInfo)) { $response["debug"] = $debugInfo; } echo json_encode($response, JSON_UNESCAPED_UNICODE); exit; } // ================= Model 처리 ================= if ($mode == "modify") { $update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " 수정" . " "; try { $pdo->beginTransaction(); $sql = "UPDATE " . $DB . ".models SET model_name = ?, major_category = ?, finishing_type = ?, description = ?, update_log = ?, guiderail_type = ? WHERE model_id = ? LIMIT 1"; $stmh = $pdo->prepare($sql); $params = [$model_name, $major_category, $finishing_type, $description, $update_log, $guiderail_type, $model_id]; // 마지막에 model_id 적용 $stmh->execute($params); $pdo->commit(); } catch (PDOException $Exception) { $pdo->rollBack(); sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "params" => $params, "phase" => "model modify"]); } } elseif ($mode == "copy") { // 복사 모드: 기존 모델 정보를 그대로 복사하여 새 모델로 INSERT // (모델 수정 화면에서 읽어온 $row 값이 있다고 가정합니다) $update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " 복사" . " "; try { $pdo->beginTransaction(); $sql = "INSERT INTO " . $DB . ".models (model_name, major_category, finishing_type, description, update_log, guiderail_type ) VALUES (?, ?, ?, ?, ?, ? )"; $stmh = $pdo->prepare($sql); $params = [$model_name, $major_category, $finishing_type, $description, $update_log, $guiderail_type]; $stmh->execute($params); $pdo->commit(); } catch (PDOException $Exception) { $pdo->rollBack(); sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "params" => $params, "phase" => "model copy"]); } // 마지막 INSERT된 모델 ID 가져오기 (신규 모델 ID) $sql = "SELECT model_id FROM " . $DB . ".models ORDER BY model_id DESC LIMIT 1"; try { $stmh = $pdo->query($sql); $rowNew = $stmh->fetch(PDO::FETCH_ASSOC); $model_id = $rowNew["model_id"]; } catch (PDOException $Exception) { sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "phase" => "model id select"]); } } elseif ($mode == "insert") { $update_log = date("Y-m-d H:i:s") . " - " . $_SESSION["name"] . " 등록" . " "; try { $pdo->beginTransaction(); $sql = "INSERT INTO " . $DB . ".models (model_name, major_category, finishing_type, description, update_log, guiderail_type ) VALUES (?, ?, ?, ?, ?, ?)"; $stmh = $pdo->prepare($sql); $params = [$model_name, $major_category, $finishing_type, $description, $update_log, $guiderail_type]; $stmh->execute($params); $pdo->commit(); } catch (PDOException $Exception) { $pdo->rollBack(); sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "params" => $params, "phase" => "model insert"]); } // 마지막 INSERT된 모델 ID 가져오기 $sql = "SELECT model_id FROM " . $DB . ".models ORDER BY model_id DESC LIMIT 1"; try { $stmh = $pdo->query($sql); $rowNew = $stmh->fetch(PDO::FETCH_ASSOC); $model_id = $rowNew["model_id"]; } catch (PDOException $Exception) { sendDebugResponse($Exception->getMessage(), ["sql" => $sql, "phase" => "model id select"]); } } elseif ($mode == "delete") { try { $pdo->beginTransaction(); $sql = "UPDATE " . $DB . ".models SET is_deleted = 1 WHERE model_id = ?"; $stmh = $pdo->prepare($sql); $params = [$model_id]; $stmh->execute($params); $pdo->commit(); } catch (Exception $ex) { $pdo->rollBack(); sendDebugResponse($ex->getMessage(), ["sql" => $sql, "params" => $params, "phase" => "model delete"]); } } // ================= 2단계 부품(parts) 처리 ================= if(isset($_POST['part_name']) && is_array($_POST['part_name'])) { try { $pdo->beginTransaction(); if($mode == "copy") { $partCount = count($_POST['part_name']); $partMapping = []; for($i = 0; $i < $partCount; $i++) { $part_name = $_POST['part_name'][$i]; $spec = $_POST['spec'][$i]; $unit = $_POST['unit'][$i]; $quantity = $_POST['quantity'][$i]; $unitprice = $_POST['unitprice'][$i]; // 추가된 unitprice $memo = $_POST['memo'][$i]; $sqlIns = "INSERT INTO " . $DB . ".parts (model_id, part_name, spec, unit, quantity, unitprice, memo, is_deleted) VALUES (?, ?, ?, ?, ?, ?, ?, 0)"; $stmtIns = $pdo->prepare($sqlIns); $params = [$model_id, $part_name, $spec, $unit, $quantity, $unitprice, $memo]; $stmtIns->execute($params); $newPartId = $pdo->lastInsertId(); $oldPartId = (isset($_POST['part_id'][$i]) && trim($_POST['part_id'][$i]) !== '') ? trim($_POST['part_id'][$i]) : ''; if($oldPartId !== '') { $partMapping[$oldPartId] = $newPartId; } else { $partMapping[$i] = $newPartId; } } } else { $sql = "SELECT part_id FROM " . $DB . ".parts WHERE model_id = ? AND is_deleted = 0"; $stmt = $pdo->prepare($sql); $stmt->execute([$model_id]); $existingParts = $stmt->fetchAll(PDO::FETCH_COLUMN); $submittedParts = []; if (isset($_POST['part_id']) && is_array($_POST['part_id'])) { foreach ($_POST['part_id'] as $pid) { if (trim($pid) !== '') { $submittedParts[] = $pid; } } } foreach ($existingParts as $existingPartId) { if (!in_array($existingPartId, $submittedParts)) { $sqlDel = "UPDATE " . $DB . ".parts SET is_deleted = 1 WHERE part_id = ? LIMIT 1"; $stmtDel = $pdo->prepare($sqlDel); $stmtDel->execute([$existingPartId]); } } $partCount = count($_POST['part_name']); for($i = 0; $i < $partCount; $i++) { $part_id = isset($_POST['part_id'][$i]) ? trim($_POST['part_id'][$i]) : ''; $part_name = $_POST['part_name'][$i]; $spec = $_POST['spec'][$i]; $unit = $_POST['unit'][$i]; $quantity = $_POST['quantity'][$i]; $unitprice = $_POST['unitprice'][$i]; // 추가된 unitprice $memo = $_POST['memo'][$i]; if($part_id != '') { $sqlUpd = "UPDATE " . $DB . ".parts SET part_name = ?, spec = ?, unit = ?, quantity = ?, unitprice = ?, memo = ?, is_deleted = 0 WHERE part_id = ? LIMIT 1"; $stmtUpd = $pdo->prepare($sqlUpd); $params = [$part_name, $spec, $unit, $quantity, $unitprice, $memo, $part_id]; $stmtUpd->execute($params); } else { $sqlIns = "INSERT INTO " . $DB . ".parts (model_id, part_name, spec, unit, quantity, unitprice, memo, is_deleted) VALUES (?, ?, ?, ?, ?, ?, ?, 0)"; $stmtIns = $pdo->prepare($sqlIns); $params = [$model_id, $part_name, $spec, $unit, $quantity, $unitprice, $memo]; $stmtIns->execute($params); } } } $pdo->commit(); } catch (PDOException $e) { $pdo->rollBack(); sendDebugResponse($e->getMessage(), ["phase" => "parts processing"]); } } // ================= 3단계 하위 부품(parts_sub) 처리 ================= // 하위 부품 데이터는 각 부품별로 제출되며, 부모 부품 ID는 parent_part_id[] 배열로 전달됨 if(isset($_POST['subpart_name']) && is_array($_POST['subpart_name'])) { try { $pdo->beginTransaction(); if($mode == "copy") { $subCount = count($_POST['subpart_name']); for($i = 0; $i < $subCount; $i++) { $subpart_name = $_POST['subpart_name'][$i] ?? ''; $material = $_POST['material'][$i] ?? ''; $bendSum = $_POST['bendSum'][$i] ?? ''; $plateSum = $_POST['plateSum'][$i] ?? ''; $finalSum = $_POST['finalSum'][$i] ?? ''; $unitPrice = $_POST['unitPrice'][$i] ?? ''; $computedPrice = $_POST['computedPrice'][$i] ?? ''; $quantity = $_POST['quantity'][$i] ?? ''; $lineTotal = $_POST['lineTotal'][$i] ?? ''; $image_url = $_POST['image_url'][$i] ?? ''; $oldParentPartId = isset($_POST['parent_part_id'][$i]) ? $_POST['parent_part_id'][$i] : ''; if(empty($oldParentPartId) || !isset($partMapping[$oldParentPartId])) { continue; } $newParentPartId = $partMapping[$oldParentPartId]; $sqlIns = "INSERT INTO " . $DB . ".parts_sub (part_id, subpart_name, material, bendSum, plateSum, finalSum, unitPrice, computedPrice, quantity, lineTotal, image_url, is_deleted) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)"; $stmtIns = $pdo->prepare($sqlIns); $params = [$newParentPartId, $subpart_name, $material, $bendSum, $plateSum, $finalSum, $unitPrice, $computedPrice, $quantity, $lineTotal, $image_url]; $stmtIns->execute($params); } } else { $sql = "SELECT subpart_id FROM " . $DB . ".parts_sub WHERE part_id IN (SELECT part_id FROM " . $DB . ".parts WHERE model_id = ? AND is_deleted = 0) AND is_deleted = 0"; $stmt = $pdo->prepare($sql); $stmt->execute([$model_id]); $existingSubparts = $stmt->fetchAll(PDO::FETCH_COLUMN); $submittedSubparts = []; if(isset($_POST['subpart_id']) && is_array($_POST['subpart_id'])) { foreach ($_POST['subpart_id'] as $spid) { if(trim($spid) !== '') { $submittedSubparts[] = $spid; } } } foreach ($existingSubparts as $existingSubpartId) { if (!in_array($existingSubpartId, $submittedSubparts)) { $sqlDel = "UPDATE " . $DB . ".parts_sub SET is_deleted = 1 WHERE subpart_id = ? LIMIT 1"; $stmtDel = $pdo->prepare($sqlDel); $stmtDel->execute([$existingSubpartId]); } } $subCount = count($_POST['subpart_name']); for($i = 0; $i < $subCount; $i++) { $subpart_id = isset($_POST['subpart_id'][$i]) ? trim($_POST['subpart_id'][$i]) : ''; $subpart_name = $_POST['subpart_name'][$i] ?? ''; $material = $_POST['material'][$i] ?? ''; $bendSum = $_POST['bendSum'][$i] ?? ''; $plateSum = $_POST['plateSum'][$i] ?? ''; $finalSum = $_POST['finalSum'][$i] ?? ''; $unitPrice = $_POST['unitPrice'][$i] ?? ''; $computedPrice = $_POST['computedPrice'][$i] ?? ''; $quantity = $_POST['quantity'][$i] ?? ''; $lineTotal = $_POST['lineTotal'][$i] ?? ''; $image_url = $_POST['image_url'][$i] ?? '' ; $parent_part_id = isset($_POST['parent_part_id'][$i]) ? $_POST['parent_part_id'][$i] : ''; if(empty($parent_part_id)) { if($debug) { error_log("Skipping subpart at index $i: missing parent_part_id"); } continue; } if($subpart_id != '') { $sqlUpd = "UPDATE " . $DB . ".parts_sub SET subpart_name = ?, material = ?, bendSum = ?, plateSum = ?, finalSum = ?, unitPrice = ?, computedPrice = ?, quantity = ?, lineTotal = ?, image_url = ?, is_deleted = 0 WHERE subpart_id = ? LIMIT 1"; $stmtUpd = $pdo->prepare($sqlUpd); $params = [$subpart_name, $material, $bendSum, $plateSum, $finalSum, $unitPrice, $computedPrice, $quantity, $lineTotal, $image_url, $subpart_id]; $stmtUpd->execute($params); } else { $sqlIns = "INSERT INTO " . $DB . ".parts_sub (part_id, subpart_name, material, bendSum, plateSum, finalSum, unitPrice, computedPrice, quantity, lineTotal, image_url, is_deleted) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0)"; $stmtIns = $pdo->prepare($sqlIns); $params = [$parent_part_id, $subpart_name, $material, $bendSum, $plateSum, $finalSum, $unitPrice, $computedPrice, $quantity, $lineTotal, $image_url]; $stmtIns->execute($params); } } } $pdo->commit(); } catch (PDOException $e) { $pdo->rollBack(); sendDebugResponse($e->getMessage(), ["phase" => "parts_sub processing"]); } } $data = [ 'model_id' => $model_id, 'mode' => $mode, 'subpart_name' => $_POST['subpart_name'] ]; echo json_encode($data, JSON_UNESCAPED_UNICODE); ?>