import { state } from '../../core/state'; import { SoftwareAsset } from '../../core/excelHandler'; import { openModal } from './BaseModal'; import { createIcons, Save, X, Edit2, RotateCcw, History, Plus } from 'lucide'; const CLOUD_MODAL_HTML = ` `; export let currentCloudAsset: SoftwareAsset | null = null; export let isCloudEditMode = false; export function setCloudEditMode(edit: boolean) { isCloudEditMode = edit; const form = document.getElementById('cloud-asset-form') as HTMLFormElement; const btnSave = document.getElementById('btn-save-cloud-asset') as HTMLButtonElement; const btnRevert = document.getElementById('btn-revert-cloud-edit') as HTMLButtonElement; const btnClose = document.getElementById('btn-close-cloud-footer') as HTMLButtonElement; if (edit) { form.classList.add('is-edit-mode'); form.classList.remove('is-view-mode'); btnSave.textContent = '저장'; btnRevert.classList.remove('hidden'); btnClose.classList.add('hidden'); Array.from(form.elements).forEach((el: any) => el.disabled = false); } else { form.classList.add('is-view-mode'); form.classList.remove('is-edit-mode'); btnSave.textContent = '수정'; btnRevert.classList.add('hidden'); btnClose.classList.remove('hidden'); Array.from(form.elements).forEach((el: any) => el.disabled = true); if (currentCloudAsset) fillCloudFormData(currentCloudAsset); } } export function fillCloudFormData(asset: SoftwareAsset) { (document.getElementById('cloud-asset-id') as HTMLInputElement).value = asset.id; (document.getElementById('cloud-플랫폼명') as HTMLInputElement).value = asset.플랫폼명 || ''; (document.getElementById('cloud-법인') as HTMLSelectElement).value = asset.법인 || '한맥'; (document.getElementById('cloud-제품명') as HTMLInputElement).value = asset.제품명 || ''; (document.getElementById('cloud-부서') as HTMLInputElement).value = asset.부서 || ''; (document.getElementById('cloud-계정명') as HTMLInputElement).value = asset.계정명 || ''; (document.getElementById('cloud-결제수단') as HTMLSelectElement).value = asset.결제수단 || ''; (document.getElementById('cloud-연결카드번호') as HTMLInputElement).value = asset.연결카드번호 || ''; (document.getElementById('cloud-결제일') as HTMLInputElement).value = asset.결제일 || ''; const billing = asset.당월청구액 ? asset.당월청구액.replace(/[^0-9]/g, '') : ''; (document.getElementById('cloud-당월청구액') as HTMLInputElement).value = billing ? Number(billing).toLocaleString() : ''; (document.getElementById('cloud-비고') as HTMLInputElement).value = asset.비고 || ''; document.getElementById('btn-open-cloud-update')!.style.display = 'flex'; renderCloudHistory(asset.id); } function renderCloudHistory(assetId: string) { const historyList = document.getElementById('cloud-history-list'); if (!historyList) return; if (!state.masterData.logs) state.masterData.logs = []; const logs = state.masterData.logs .filter(l => l.assetId === assetId) .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()); if (logs.length === 0) { historyList.innerHTML = '
업데이트 내역이 없습니다.
'; return; } historyList.innerHTML = logs.map(log => `
${log.date}
작업자: ${log.user}
${log.details.replace(/\n/g, '
')}
`).join(''); createIcons({ icons: { X, History, Plus } }); } export function initCloudModal(renderContent: () => void, closeModals: () => void) { if (!document.getElementById('cloud-asset-modal')) { document.body.insertAdjacentHTML('beforeend', CLOUD_MODAL_HTML); } const form = document.getElementById('cloud-asset-form') as HTMLFormElement; const btnRevert = document.getElementById('btn-revert-cloud-edit'); const btnSave = document.getElementById('btn-save-cloud-asset'); const btnDelete = document.getElementById('btn-delete-cloud-asset'); document.getElementById('btn-close-cloud-modal')?.addEventListener('click', closeModals); document.getElementById('btn-close-cloud-footer')?.addEventListener('click', closeModals); btnRevert?.addEventListener('click', (e) => { e.preventDefault(); setCloudEditMode(false); }); btnSave?.addEventListener('click', (e) => { e.preventDefault(); if (!isCloudEditMode) { setCloudEditMode(true); return; } if (!form.checkValidity()) { form.reportValidity(); return; } const id = (document.getElementById('cloud-asset-id') as HTMLInputElement).value; const billingRaw = (document.getElementById('cloud-당월청구액') as HTMLInputElement).value.replace(/[^0-9]/g, ''); const newAsset: SoftwareAsset = { id: id || Math.random().toString(36).substring(2, 9), type: '클라우드', 플랫폼명: (document.getElementById('cloud-플랫폼명') as HTMLInputElement).value, 법인: (document.getElementById('cloud-법인') as HTMLSelectElement).value, 제품명: (document.getElementById('cloud-제품명') as HTMLInputElement).value, 부서: (document.getElementById('cloud-부서') as HTMLInputElement).value, 계정명: (document.getElementById('cloud-계정명') as HTMLInputElement).value, 결제수단: (document.getElementById('cloud-결제수단') as HTMLSelectElement).value, 연결카드번호: (document.getElementById('cloud-연결카드번호') as HTMLInputElement).value, 결제일: (document.getElementById('cloud-결제일') as HTMLInputElement).value, 당월청구액: billingRaw, 비고: (document.getElementById('cloud-비고') as HTMLInputElement).value, 구매일: '', 금액: '', 수량: 1, 납품업체: '' }; if (id) { const idx = state.masterData.sw.findIndex(a => a.id === id); if (idx !== -1) state.masterData.sw[idx] = newAsset; } else { state.masterData.sw.push(newAsset); const now = new Date(); state.masterData.logs = state.masterData.logs || []; state.masterData.logs.push({ id: Math.random().toString(36).substring(2, 9), assetId: newAsset.id, date: `${now.getFullYear()}-${String(now.getMonth()+1).padStart(2,'0')}-${String(now.getDate()).padStart(2,'0')}`, user: '관리자', details: '신규 등록' }); } closeModals(); renderContent(); }); btnDelete?.addEventListener('click', (e) => { e.preventDefault(); const id = (document.getElementById('cloud-asset-id') as HTMLInputElement).value; if (confirm('클라우드 자산을 삭제하시겠습니까?')) { state.masterData.sw = state.masterData.sw.filter(a => a.id !== id); closeModals(); renderContent(); } }); // 클라우드 업데이트 (이력) 모달 로직 const updateModal = document.getElementById('cloud-update-modal')!; document.getElementById('btn-open-cloud-update')?.addEventListener('click', () => { updateModal.classList.remove('hidden'); (document.getElementById('cloud-update-date') as HTMLInputElement).value = new Date().toISOString().split('T')[0]; (document.getElementById('cloud-update-cost') as HTMLInputElement).value = ''; (document.getElementById('cloud-update-note') as HTMLInputElement).value = ''; }); const closeUpdateModal = () => updateModal.classList.add('hidden'); document.getElementById('btn-close-cloud-update')?.addEventListener('click', closeUpdateModal); document.getElementById('btn-cancel-cloud-update')?.addEventListener('click', closeUpdateModal); document.getElementById('btn-save-cloud-update')?.addEventListener('click', () => { const id = (document.getElementById('cloud-asset-id') as HTMLInputElement).value; if (!id) return; const date = (document.getElementById('cloud-update-date') as HTMLInputElement).value; const costRaw = (document.getElementById('cloud-update-cost') as HTMLInputElement).value.replace(/[^0-9]/g, ''); const note = (document.getElementById('cloud-update-note') as HTMLInputElement).value; if (!date) return alert('업데이트 일자를 입력하세요.'); let details = '결제/상태 업데이트'; if (costRaw) details += ` (비용: ₩ ${Number(costRaw).toLocaleString()})`; if (note) details += `\n메모: ${note}`; state.masterData.logs = state.masterData.logs || []; state.masterData.logs.push({ id: Math.random().toString(36).substring(2, 9), assetId: id, date, user: '관리자', details }); // 금액 업데이트 반영 if (costRaw) { const idx = state.masterData.sw.findIndex(a => a.id === id); if (idx !== -1) { state.masterData.sw[idx].당월청구액 = costRaw; (document.getElementById('cloud-당월청구액') as HTMLInputElement).value = Number(costRaw).toLocaleString(); } } closeUpdateModal(); renderCloudHistory(id); renderContent(); }); createIcons({ icons: { Save, X, Edit2, RotateCcw, History, Plus } }); } export function openCloudModal(asset?: SoftwareAsset) { currentCloudAsset = asset || null; const form = document.getElementById('cloud-asset-form') as HTMLFormElement; const deleteBtn = document.getElementById('btn-delete-cloud-asset')!; openModal('cloud-asset-modal'); form.reset(); if (asset) { document.getElementById('cloud-modal-title')!.textContent = '클라우드 서비스 상세'; deleteBtn.style.display = 'block'; fillCloudFormData(asset); setCloudEditMode(false); } else { document.getElementById('cloud-modal-title')!.textContent = '신규 클라우드 서비스 등록'; deleteBtn.style.display = 'none'; (document.getElementById('cloud-asset-id') as HTMLInputElement).value = ''; document.getElementById('btn-open-cloud-update')!.style.display = 'none'; renderCloudHistory(''); setCloudEditMode(true); } createIcons({ icons: { History, Plus } }); }