File name
Commit message
Commit date
File name
Commit message
Commit date
import json
import os
import csv
from typing import Dict, List
from datetime import datetime
class EmployeeManager:
"""직원 정보 관리 클래스"""
def __init__(self, data_file="employees.json"):
self.data_file = data_file
self.employees = self.load_employees()
def load_employees(self) -> Dict[str, str]:
"""직원 데이터 로드 (JSON 파일에서)"""
if os.path.exists(self.data_file):
try:
with open(self.data_file, 'r', encoding='utf-8') as f:
return json.load(f)
except Exception as e:
print(f"직원 데이터 로드 실패: {e}")
return {}
# 기본 직원 데이터
default_employees = {
"김혜리": "khr2205@iten.co.kr",
"이준호": "tolag3@iten.co.kr",
"이호영": "hylee@iten.co.kr",
"유인식": "smartyu@iten.co.kr",
"원영현": "dudgusw@iten.co.kr",
"유찬희": "ych@iten.co.kr",
"조현희": "hc3874@iten.co.kr",
"강영묵": "ymkang@iten.co.kr",
"조용준": "antelope@iten.co.kr",
"우영두": "rosehips@iten.co.kr",
"김상훈": "aricowiz@iten.co.kr",
"장영익": "yeongik@iten.co.kr",
"정다은": "jungde@iten.co.kr",
"이지우": "dlwldn1024@iten.co.kr",
"박진순": "jsp@iten.co.kr",
"정수빈": "dhgksk99@iten.co.kr",
"강민경": "kmk0522@iten.co.kr"
}
# 기본 데이터 저장
self.save_employees_data(default_employees)
return default_employees
def save_employees(self):
"""직원 데이터 저장"""
self.save_employees_data(self.employees)
def save_employees_data(self, data: Dict[str, str]):
"""직원 데이터를 파일에 저장"""
try:
with open(self.data_file, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# 백업 CSV 파일도 생성
self.backup_to_csv(data)
except Exception as e:
print(f"직원 데이터 저장 실패: {e}")
def backup_to_csv(self, data: Dict[str, str]):
"""CSV 백업 파일 생성"""
try:
backup_file = "employees_backup.csv"
with open(backup_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['이름', '이메일', '백업일시'])
current_time = datetime.now().strftime('%Y-%m-%d %H:%M')
for name, email in data.items():
writer.writerow([name, email, current_time])
except Exception as e:
print(f"CSV 백업 실패: {e}")
def add_employee(self, name: str, email: str) -> bool:
"""직원 추가"""
if name.strip() in self.employees:
return False # 이미 존재
self.employees[name.strip()] = email.strip()
self.save_employees()
return True
def update_employee(self, old_name: str, new_name: str, email: str) -> bool:
"""직원 정보 수정"""
if old_name not in self.employees:
return False
old_name = old_name.strip()
new_name = new_name.strip()
email = email.strip()
# 이름이 변경되는 경우
if old_name != new_name:
if new_name in self.employees:
return False # 새 이름이 이미 존재
del self.employees[old_name]
self.employees[new_name] = email
self.save_employees()
return True
def delete_employee(self, name: str) -> bool:
"""직원 삭제"""
if name in self.employees:
del self.employees[name]
self.save_employees()
return True
return False
def get_employee_email(self, name: str) -> str:
"""직원 이메일 조회"""
return self.employees.get(name.strip(), "")
def get_all_employees(self) -> Dict[str, str]:
"""전체 직원 목록 반환"""
return self.employees.copy()
def search_employees(self, query: str) -> Dict[str, str]:
"""직원 검색"""
query = query.lower().strip()
if not query:
return self.get_all_employees()
result = {}
for name, email in self.employees.items():
if query in name.lower() or query in email.lower():
result[name] = email
return result
def import_from_csv(self, file_path: str) -> tuple:
"""CSV 파일에서 직원 정보 가져오기"""
success_count = 0
error_list = []
try:
encodings = ['utf-8', 'cp949', 'euc-kr']
for encoding in encodings:
try:
with open(file_path, 'r', encoding=encoding) as f:
reader = csv.reader(f)
header = next(reader, None) # 헤더 스킵
for row_num, row in enumerate(reader, 2):
if len(row) >= 2:
name = row[0].strip()
email = row[1].strip()
if name and email and '@' in email:
if self.add_employee_silent(name, email):
success_count += 1
else:
error_list.append(f"행 {row_num}: '{name}' 이미 존재")
else:
error_list.append(f"행 {row_num}: 유효하지 않은 데이터")
break
except UnicodeDecodeError:
continue
except Exception as e:
error_list.append(f"파일 읽기 오류: {str(e)}")
if success_count > 0:
self.save_employees()
return success_count, error_list
def add_employee_silent(self, name: str, email: str) -> bool:
"""직원 추가 (저장하지 않음, 배치 처리용)"""
if name.strip() in self.employees:
return False
self.employees[name.strip()] = email.strip()
return True
def export_to_csv(self, file_path: str) -> bool:
"""CSV 파일로 내보내기"""
try:
with open(file_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['이름', '이메일']) # 헤더
for name, email in sorted(self.employees.items()):
writer.writerow([name, email])
return True
except Exception as e:
print(f"CSV 내보내기 실패: {e}")
return False
def get_employee_count(self) -> int:
"""직원 수 반환"""
return len(self.employees)
def clear_all_employees(self):
"""모든 직원 정보 삭제"""
self.employees.clear()
self.save_employees()