jasan/db_init.php
2026-02-08 15:54:29 +09:00

187 lines
No EOL
7.1 KiB
PHP

<?php
/**
* db_init.php
* FKI 자산 관리 시스템 데이터베이스 초기화 및 레거시 데이터 이관
*/
require_once 'config.php';
// 실행 시간 제한 해제 (대량의 INSERT 처리 대비)
set_time_limit(300);
echo "<!DOCTYPE html><html lang='ko'><head><meta charset='utf-8'><title>System Init</title><style>body{font-family:sans-serif;background:#f4f4f5;padding:2rem;} .log{background:#fff;padding:1rem;border-radius:8px;box-shadow:0 1px 3px rgba(0,0,0,0.1);}</style></head><body>";
echo "<h1>🛠 FKI Asset System Migration</h1>";
echo "<div class='log'>";
try {
$db->beginTransaction();
// --- 1. 테이블 스키마 정의 (spare_1~5 컬럼 포함) ---
// [A] 조직도 (departments)
$db->exec("DROP TABLE IF EXISTS departments");
$db->exec("CREATE TABLE departments (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
parent_id INTEGER DEFAULT NULL,
level INTEGER DEFAULT 1,
spare_1 TEXT, spare_2 TEXT, spare_3 TEXT, spare_4 TEXT, spare_5 TEXT,
FOREIGN KEY(parent_id) REFERENCES departments(id)
)");
// [B] 직원 마스터 (users)
$db->exec("DROP TABLE IF EXISTS users");
$db->exec("CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
emp_id TEXT UNIQUE,
name TEXT NOT NULL,
department_id INTEGER,
position TEXT,
email TEXT,
phone TEXT,
mobile TEXT,
status TEXT DEFAULT 'active',
accounting_type TEXT DEFAULT '일반회계',
spare_1 TEXT, spare_2 TEXT, spare_3 TEXT, spare_4 TEXT, spare_5 TEXT,
FOREIGN KEY(department_id) REFERENCES departments(id)
)");
// [C] 모델 마스터 (laptop_models)
$db->exec("DROP TABLE IF EXISTS laptop_models");
$db->exec("CREATE TABLE laptop_models (
id INTEGER PRIMARY KEY AUTOINCREMENT,
model_name TEXT NOT NULL,
manufacturer TEXT,
spare_1 TEXT, spare_2 TEXT, spare_3 TEXT, spare_4 TEXT, spare_5 TEXT
)");
// [D] 노트북 실물 (laptop_assets)
$db->exec("DROP TABLE IF EXISTS laptop_assets");
$db->exec("CREATE TABLE laptop_assets (
asset_tag TEXT PRIMARY KEY,
model_id INTEGER,
current_user_id INTEGER,
status TEXT DEFAULT 'stock',
serial_number TEXT,
purchase_date DATE,
spare_1 TEXT, spare_2 TEXT, spare_3 TEXT, spare_4 TEXT, spare_5 TEXT,
FOREIGN KEY(model_id) REFERENCES laptop_models(id),
FOREIGN KEY(current_user_id) REFERENCES users(id)
)");
// [E] 임시 출입증 (access_cards)
$db->exec("DROP TABLE IF EXISTS access_cards");
$db->exec("CREATE TABLE access_cards (
card_number TEXT PRIMARY KEY,
card_type TEXT,
nfc_id TEXT,
status TEXT DEFAULT 'available',
spare_1 TEXT, spare_2 TEXT, spare_3 TEXT, spare_4 TEXT, spare_5 TEXT
)");
// [F] 복합기 계정 (mfp_accounts)
$db->exec("DROP TABLE IF EXISTS mfp_accounts");
$db->exec("CREATE TABLE mfp_accounts (
account_id TEXT PRIMARY KEY,
account_pw TEXT,
purpose TEXT,
status TEXT DEFAULT 'active',
spare_1 TEXT, spare_2 TEXT, spare_3 TEXT, spare_4 TEXT, spare_5 TEXT
)");
echo "<p>✔ Tables created successfully with spare columns.</p>";
// --- 2. 레거시 데이터 주입 (CSV 기반 데이터) ---
// 2.1 부서 데이터 (ID, 이름, 레벨)
$depts = [
[1, '경제조사팀', 1],
[3, '연구총괄대표', 1],
[4, '기획혁신본부', 1],
[5, '미구주협력팀', 1],
[6, '기획혁신팀', 1],
[7, '글로벌리스크팀', 1],
[8, '아태협력팀', 1],
[10, '기업제도팀', 1],
[11, '자산운영팀', 1],
[12, '미래전략TF', 1],
[13, '인사·지원팀', 1],
[14, '미래전략팀', 1],
[16, '국제본부', 1],
[17, '회원서비스팀', 1],
[18, '대외협력팀', 1],
[21, '커뮤니케이션본부', 1],
[23, '경제산업본부', 1],
[24, '경영지원본부', 1],
[25, '산업정책팀', 1],
[26, '국제협력팀', 1],
[28, '총무팀', 1],
[30, 'ESG팀', 1],
[31, '홍보팀', 1],
[32, '전략기획실', 1],
[36, '회원팀', 1],
[39, '기업정책팀', 1],
[40, '인재경영팀', 1]
];
$stmt = $db->prepare("INSERT INTO departments (id, name, level) VALUES (?, ?, ?)");
foreach ($depts as $d)
$stmt->execute($d);
// 2.2 직원 데이터 (FKI_TEMP 발급 로직 포함)
$users_data = [
['FKI20426', '한호', 1, '책임', 'hanpodosa@fki.or.kr', '02-3771-0426', '010-8563-9285'],
['FKI24208', '정철', 3, '원장', 'cchung@fki.or.kr', NULL, NULL],
['FKI04454', '김주태', 36, '수석', 'equilia@fki.or.kr', '02-3771-0454', '010-8539-8217'],
['FKI00377', '이소원', 40, '수석', 'swlee@fki.or.kr', '02-3771-0377', '010-8720-8106'],
['FKI13517', '전종대', 21, '책임', 'jdjun@fki.or.kr', '02-3771-0443', '010-9016-2668'],
['FKI02001', '이태규', 18, '선임연구위원', 'tklee@fki.or.kr', '02-3771-0041', '010-3787-8269'],
['FKI11638', '김다미', 17, '연구원', 'sdamis@fki.or.kr', '02-3771-0389', '010-9006-7600']
];
$user_stmt = $db->prepare("INSERT INTO users (emp_id, name, department_id, position, email, phone, mobile) VALUES (?, ?, ?, ?, ?, ?, ?)");
foreach ($users_data as $u) {
$emp_id = $u[0];
if (!$emp_id) {
// 이후 시퀀스로 대체하거나 임시 발급
$emp_id = 'FKI_TEMP_' . bin2hex(random_bytes(4));
}
$user_stmt->execute([$emp_id, $u[1], $u[2], $u[3], $u[4], $u[5], $u[6]]);
}
// 2.3 노트북 모델
$models = [
['NT750XEV-G51AG', 'SAMSUNG'],
['DELL VOSTRO 3500', 'DELL'],
['NT950XGQ-A71AS', 'SAMSUNG'],
['15S-FQ1005TU', 'HP'],
['PROBOOK 450 G10', 'HP']
];
$model_stmt = $db->prepare("INSERT INTO laptop_models (model_name, manufacturer) VALUES (?, ?)");
foreach ($models as $m)
$model_stmt->execute($m);
// 2.4 노트북 자산
$assets = [
['160003779', 1, 1, 'assigned', 'KVGY99YTC001Q4', '2024-01-23'],
['160003774', 1, 2, 'assigned', 'KVGY99YTC001P1', '2024-01-23'],
['160003823', 3, 3, 'assigned', '593491HXC00078', '2024-05-19']
];
$asset_stmt = $db->prepare("INSERT INTO laptop_assets (asset_tag, model_id, current_user_id, status, serial_number, purchase_date) VALUES (?, ?, ?, ?, ?, ?)");
foreach ($assets as $a)
$asset_stmt->execute($a);
// 2.5 출입증 & 복합기
$db->exec("INSERT INTO access_cards (card_number, card_type, nfc_id) VALUES ('FKI_244', 'Research 01', 'A3D9D7CD')");
$db->exec("INSERT INTO mfp_accounts (account_id, account_pw, purpose) VALUES ('Audit03', 'Audit03', 'Audit Team')");
$db->commit();
echo "<p>✔ Migration completed successfully!</p>";
echo "<p><a href='index.php'>Go to Dashboard</a></p>";
} catch (Exception $e) {
if ($db->inTransaction())
$db->rollBack();
echo "<p style='color:red;'>❌ Error: " . $e->getMessage() . "</p>";
}
echo "</div></body></html>";