From 3e1cd3adab6c62c9c899f81748d15bbee32c5107 Mon Sep 17 00:00:00 2001 From: NAS-Admin Date: Mon, 9 Feb 2026 01:04:41 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A7=88=EA=B0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api.php | 100 +++++++++++++++++++++++- assets.db | Bin 172032 -> 196608 bytes fix_missing_column.php | 9 +++ laptops.php | 62 +++++++++++++-- users.php | 168 +++++++++++++++++++++++++++++++++++++++-- 5 files changed, 321 insertions(+), 18 deletions(-) create mode 100644 fix_missing_column.php diff --git a/api.php b/api.php index 6a89418..c2063f2 100644 --- a/api.php +++ b/api.php @@ -488,6 +488,15 @@ last_confirmed_date $old_stmt->execute([$data['id']]); $old_asset = $old_stmt->fetch(); + // Auto-relocate based on status if needed (optional) + + // If assigned_user_name is missing but current_user_id exists, try to fill it for logging + if (empty($data['assigned_user_name']) && !empty($data['current_user_id'])) { + $u_stmt = $db->prepare("SELECT name FROM users WHERE id = ?"); + $u_stmt->execute([$data['current_user_id']]); + $data['assigned_user_name'] = $u_stmt->fetchColumn() ?: ''; + } + $stmt = $db->prepare("UPDATE laptop_assets SET asset_tag = ?, model_id = ?, current_user_id = ?, status = ?, serial_number = ?, purchase_date = ?, ip_address = ?, cpu = ?, npu = ?, hdd0_model = ?, hdd0_capacity = ?, hdd1_model = ?, hdd1_capacity = ?, ram = ?, @@ -523,10 +532,11 @@ WHERE id = ?"); ]); // Auto-log assignment change - if ($data['assigned_user_name'] && $data['assigned_user_name'] !== ($old_asset['assigned_user_name'] ?? '')) { - $log_stmt = $db->prepare("INSERT INTO asset_history (asset_id, log_type, user_name, action_date) VALUES (?, -'assignment', ?, ?)"); - $log_stmt->execute([$data['id'], $data['assigned_user_name'], date('Y-m-d')]); + $new_name = $data['assigned_user_name'] ?: ''; + $old_name = $old_asset['assigned_user_name'] ?? ''; + if ($new_name !== $old_name) { + $log_stmt = $db->prepare("INSERT INTO asset_history (asset_id, log_type, user_name, action_date) VALUES (?, 'assignment', ?, ?)"); + $log_stmt->execute([$data['id'], $new_name ?: '재고(반납)', date('Y-m-d')]); } echo json_encode(['success' => true]); @@ -632,6 +642,11 @@ LIMIT 1")->fetchColumn(); if ($newStatus) { $updates[] = "status = ?"; $params[] = $newStatus; + // 만약 상태를 'stock'(재고)으로 변경하는 경우 배정 정보도 초기화 + if ($newStatus === 'stock') { + $updates[] = "current_user_id = NULL"; + $updates[] = "assigned_user_name = NULL"; + } } if ($newModelId) { $updates[] = "model_id = ?"; @@ -799,6 +814,83 @@ LIMIT 1")->fetchColumn(); echo json_encode(['success' => true]); break; + case 'archive_users': + $data = json_decode(file_get_contents('php://input'), true); + $userIds = $data['user_ids']; + if (empty($userIds)) { + echo json_encode(['success' => false, 'error' => 'No users selected']); + break; + } + + $db->beginTransaction(); + try { + $placeholders = implode(',', array_fill(0, count($userIds), '?')); + // Copy to archive + $db->prepare("INSERT INTO users_archive (id, emp_id, name, department_id, position, email, phone, mobile, accounting_type, status) + SELECT id, emp_id, name, department_id, position, email, phone, mobile, accounting_type, status FROM users WHERE id IN ($placeholders)") + ->execute($userIds); + // Delete from original + $db->prepare("DELETE FROM users WHERE id IN ($placeholders)")->execute($userIds); + $db->commit(); + echo json_encode(['success' => true]); + } catch (Exception $e) { + $db->rollBack(); + echo json_encode(['success' => false, 'error' => $e->getMessage()]); + } + break; + + case 'get_archived_users': + $query = "SELECT u.*, dp.path as dept_name + FROM users_archive u + LEFT JOIN ( + WITH RECURSIVE dept_path(id, path) AS ( + SELECT id, name FROM departments WHERE parent_id IS NULL + UNION ALL + SELECT d.id, dp.path || ' > ' || d.name + FROM departments d JOIN dept_path dp ON d.parent_id = dp.id + ) SELECT * FROM dept_path + ) dp ON u.department_id = dp.id + ORDER BY u.archived_at DESC"; + echo json_encode($db->query($query)->fetchAll()); + break; + + case 'restore_users': + $data = json_decode(file_get_contents('php://input'), true); + $userIds = $data['user_ids']; + if (empty($userIds)) { + echo json_encode(['success' => false, 'error' => 'No users selected']); + break; + } + + $db->beginTransaction(); + try { + $placeholders = implode(',', array_fill(0, count($userIds), '?')); + // Restore to users + $db->prepare("INSERT INTO users (id, emp_id, name, department_id, position, email, phone, mobile, accounting_type, status) + SELECT id, emp_id, name, department_id, position, email, phone, mobile, accounting_type, status FROM users_archive WHERE id IN ($placeholders)") + ->execute($userIds); + // Delete from archive + $db->prepare("DELETE FROM users_archive WHERE id IN ($placeholders)")->execute($userIds); + $db->commit(); + echo json_encode(['success' => true]); + } catch (Exception $e) { + $db->rollBack(); + echo json_encode(['success' => false, 'error' => $e->getMessage()]); + } + break; + + case 'bulk_delete_users': + $data = json_decode(file_get_contents('php://input'), true); + $userIds = $data['user_ids']; + if (empty($userIds)) { + echo json_encode(['success' => false, 'error' => 'No users selected']); + break; + } + $placeholders = implode(',', array_fill(0, count($userIds), '?')); + $db->prepare("DELETE FROM users WHERE id IN ($placeholders)")->execute($userIds); + echo json_encode(['success' => true]); + break; + case 'get_general_rentals': $query = "SELECT r.*, GROUP_CONCAT(i.item_name, ', ') as items FROM general_rentals r diff --git a/assets.db b/assets.db index 5a61581d5d9911d1b39ed3943f06d9ae788a6424..cbf3bc47d6c7219108b37c95b0d2b6297ccc065e 100644 GIT binary patch delta 17997 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 H!DjyjR@CWW delta 10807 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õKOsGHBE!JqayG`PIuHj^@!@0hb$0ab4sjt zE+YX0&XAAp-re}1*7)qEE~ynPiOrflFImv1UGjw`UY>df4Kr5T##~8`{?99LfQ-a$ zoUPC3hJOH0_2BhM-EkNF%mIQnJ%v96Pt|wF*9%j%ZmG!@mRO!Lk6{Y@Hg0~d@v+rS zn|Bm7ty|Z0_wL3mkLooa5`D53XvNl>V|U9n`koJo0^>!Fm|LSqX5nnT=|iGO|DgwN zfFBg-`>w!ql!aQS)F{WHus-8Uh1jIuWvp+@jxLQ4J=eH(_0iq6jVpIpyH(LZlx5A+ z3e9;I76lg$y+eUgIN;1hG}SA$Q? zU^;$~kc7Efj=8j)^rabZQ*z^`t&LkBXxz593z%(Oz1bKAZk+NFgiB2+o=;BG+VT3K zQaqJhpta@ozP)kJ@j9InCRGw4ZsW8HTswWG!x z>n;J~PQzVAs0*$n=%?_@o>BB*-*~FC`$6BY{6pcGe(dc;F7WQcm7bmaMlyrz&3AXb z!oJK-blt@qWmYj6+%8vdVjnTrzr*)Q{fG+uEha&AlAH8Y^~##lU(oHi9&+2inanKLJv>&eL}wH@@xHX^V7;c+;Q z@ydEU0T)8Dm;i~Y>qI;oY*xa^4U@2fm+Eg#g1k7f0y>H(G9 z1y69TKm+UP>#zqNs^g#{dn(Q)$ckyul&0hV#tR_j%4m&?Px2+)UTzfo30uuF%wL$b z%uxRY|119Gei@3A*XY}6nL0)NiCRj9eE;&*`)=`tygz!M^)B*Cp5vaUJ-2wm@GFrz z_swpVyhy%7t|f<(tZS!hg3Cp0M{5WfzkyET=!Svq^ffc_Cvc|c@cO_$aLk_Ug-7ad zL~v5?R)R;7Q?)p+Khy(X2kEBD+|jgjGxY1Ubdxnzi`fFj*0cJSuZb@DvR;_czwCnx zv&L)S`czQZ68IY{D9UdugkXwX8cZ|4fnXY-&4m6wI4uJ{@eLtBKWt#j{&PmZs7;6d zHtF)Cj}Tq56b(FGl%L*z{}G~l)|DD;e^K}J{=-LzUi#ARxPR6VZ3-~2OlMy4EurXF z7vnO0Vi7LOk~N4KBhMQDQn!QlEm54+UxP3yDoG#t*0)4&UGIXg0_M0&nH~O4^oIVi zm-g2f{ev|Kw4zYDvfY0tdOvp*uA}}M#9>S0(~g?@$6VU~RH}dUrTynq z{nuRDf6Xz_Q?8AIelgwd=3|5ib|KhX+C6E=%i0L&&q0in9pG7Z?Uc$kHdWWYVfhCs5o8z&&P=pnCC#~Z!yp86EM#KS~>K$h}r8;Ky3Ec z20(v{pm^zo=}-9d)za>7-y_7*iCTZ?H!csm^e`{fxDb$)P~*-`$9An~)St625AS~1 z`o&s5>zFw?e8T?JG4sS1&z*g}s9*ak+-vvkhts*b7+4qN5bPwBW=|F2!RTL0~0{9^sddfc{0d%O;D_p*8Z z$LWyo4exmOU&$MY3wT}KLYQ>@g|G0_KHOEm;dNY027=x){nT5K9`}8TEA_1;(b2v2 zfn(3D)!%EvWAxD+L5YLpVl`Ym1eT%}4>Fb#4uvBk{1!%0!*N*(Dp9FA77D@7YpUS) z7qNI$$8Te${)uCFVzyCgGq?ldp593l+c|RO=v5*8z0**1f4~tndPW`2)c5g(PbWv? z5y_Wk``zHIu&OUTjdQb<>ZlwKS4YEPRfQi~1glKV`Fi2MFtsa#AUkDwxzUJ!kAIk- z&-=IrZUr~Gu5-D{)sHSC>N4B7uR|WZ2JugGkHEb;iB|EN`s@lK=&2j-d6ud_JA5j`sF!@td#imngR@3>>#J`e9_sNwRBHj` diff --git a/fix_missing_column.php b/fix_missing_column.php new file mode 100644 index 0000000..a790fc5 --- /dev/null +++ b/fix_missing_column.php @@ -0,0 +1,9 @@ +exec("ALTER TABLE laptop_assets ADD COLUMN last_confirmed_date TEXT"); + echo "Column 'last_confirmed_date' added successfully to laptop_assets table.\n"; +} catch (Exception $e) { + echo "Error or column already exists: " . $e->getMessage() . "\n"; +} +?> \ No newline at end of file diff --git a/laptops.php b/laptops.php index 28704f8..f76a915 100644 --- a/laptops.php +++ b/laptops.php @@ -38,6 +38,18 @@
+
+
+ + + +
+ +