diff --git a/MIGRATE_V2_FIN.php b/MIGRATE_V2_FIN.php new file mode 100644 index 0000000..336512b --- /dev/null +++ b/MIGRATE_V2_FIN.php @@ -0,0 +1,92 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + echo "--- [마이그레이션 시작] 노트북 자산 관리 시스템 v2 ---\n\n"; + + // 2. 백업 생성 (안전을 위한 rsync 성격의 파일 복사) + $backupPath = $dbPath . '.bak_' . date('Ymd_His'); + if (!copy($dbPath, $backupPath)) { + throw new Exception("데이터베이스 백업 생성 실패"); + } + echo "🛡️ 데이터 안전: 원본 백업이 생성되었습니다. ($backupPath)\n"; + + // 3. 스키마 확장 (컬럼 추가) + $newColumns = [ + 'real_user' => 'TEXT', + 'disposal_user_id' => 'INTEGER' + ]; + + foreach ($newColumns as $col => $type) { + try { + $db->exec("ALTER TABLE laptop_assets ADD COLUMN $col $type"); + echo "✅ 컬럼 추가 성공: $col\n"; + } catch (PDOException $e) { + if (strpos($e->getMessage(), 'duplicate column name') !== false) { + echo "ℹ️ 이미 존재함: $col (스키마 유지)\n"; + } else { + throw $e; + } + } + } + + // 4. 데이터 정합성 마이그레이션 - STOCK 상태 자산 명칭 동기화 + // 기존에 STOCK 상태인 모든 자산의 배정사용자를 '업무용(TEMP_44666b)'으로 통합 + $stmtStock = $db->prepare(" + UPDATE laptop_assets + SET assigned_user_name = '업무용(TEMP_44666b)', + current_user_id = NULL + WHERE status = 'stock' + AND (assigned_user_name != '업무용(TEMP_44666b)' OR assigned_user_name IS NULL) + "); + $stmtStock->execute(); + $affectedStock = $stmtStock->rowCount(); + echo "✅ 데이터 동기화: STOCK 자산 $affectedStock 건의 입력을 '업무용(TEMP_44666b)'으로 통일했습니다.\n"; + + // 5. 데이터 정합성 마이그레이션 - 매각 대상자 ID 복구 + // 기존 매각 대상자 이름(disposal_recipient)이 직원 리스트에 있다면 ID를 찾아 매핑 + $allDisposed = $db->query(" + SELECT id, disposal_recipient + FROM laptop_assets + WHERE status = 'disposed' + AND disposal_recipient IS NOT NULL + AND disposal_user_id IS NULL + ")->fetchAll(PDO::FETCH_ASSOC); + + $idRestored = 0; + $userFinder = $db->prepare("SELECT id FROM users WHERE name = ? LIMIT 1"); + $idUpdater = $db->prepare("UPDATE laptop_assets SET disposal_user_id = ? WHERE id = ?"); + + foreach ($allDisposed as $row) { + $userFinder->execute([$row['disposal_recipient']]); + $uid = $userFinder->fetchColumn(); + if ($uid) { + $idUpdater->execute([$uid, $row['id']]); + $idRestored++; + } + } + echo "✅ 데이터 정합성: DISPOSED 자산 $idRestored 건의 사번 ID를 자동 매핑했습니다.\n\n"; + + echo "--- [마이그레이션 완료] 시스템이 정상적으로 업데이트되었습니다. ---\n"; + +} catch (Exception $e) { + echo "\n❌ [마이그레이션 실패] 오류 내용: " . $e->getMessage() . "\n"; + if (isset($backupPath) && file_exists($backupPath)) { + echo "⚠️ 주의: 원본 데이터가 손상되었을 수 있으므로 백업 파일($backupPath)을 확인하십시오.\n"; + } +} diff --git a/assets.db b/assets.db index ed6a68c..7d42aaf 100644 Binary files a/assets.db and b/assets.db differ diff --git a/migrate_data_v2.php b/migrate_data_v2.php new file mode 100644 index 0000000..731fa98 --- /dev/null +++ b/migrate_data_v2.php @@ -0,0 +1,38 @@ +setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + + echo "--- 🛠 데이터 일관성 점검 및 마이그레이션 중... ---\n"; + + // 1. 재고(STOCK) 상태인 자산의 배정사용자를 '업무용(TEMP_44666b)'으로 통합 + // 기존에 비어있거나 다른 이름이었던 경우 업데이트 + $stmt1 = $db->prepare("UPDATE laptop_assets + SET assigned_user_name = '업무용(TEMP_44666b)', current_user_id = NULL + WHERE status = 'stock' AND (assigned_user_name != '업무용(TEMP_44666b)' OR assigned_user_name IS NULL)"); + $stmt1->execute(); + echo "✅ 재고(STOCK) 자산의 배정사용자명을 '업무용(TEMP_44666b)'으로 동기화함. (수정건수: " . $stmt1->rowCount() . "건)\n"; + + // 2. 매각 대상자 ID 복구 시도 (문자열 이름 -> 정수 ID) + // 기존 disposal_recipient에 이름이 있는 경우 users 테이블과 대조하여 disposal_user_id 채우기 + $allDisposed = $db->query("SELECT id, disposal_recipient FROM laptop_assets WHERE status = 'disposed' AND disposal_recipient IS NOT NULL AND disposal_user_id IS NULL")->fetchAll(PDO::FETCH_ASSOC); + + $restoredCount = 0; + $userFinder = $db->prepare("SELECT id FROM users WHERE name = ? LIMIT 1"); + $idUpdater = $db->prepare("UPDATE laptop_assets SET disposal_user_id = ? WHERE id = ?"); + + foreach ($allDisposed as $row) { + $userFinder->execute([$row['disposal_recipient']]); + $uid = $userFinder->fetchColumn(); + if ($uid) { + $idUpdater->execute([$uid, $row['id']]); + $restoredCount++; + } + } + echo "✅ 매각 자산의 대상자 ID(disposal_user_id)를 사내 직원 데이터와 대조하여 복구함. (복구건수: $restoredCount 건)\n"; + + echo "--- 🎉 완료되었습니다. ---"; + +} catch (Exception $e) { + echo "❌ 오류: " . $e->getMessage() . "\n"; +}