import datetime
from datetime import timedelta
import calendar
import holidays
# 한국의 공휴일 정보
kr_holidays = holidays.KR()
def calculate_work_hours(date, hours_worked):
# 기본 근무시간
standard_hours = 8
# 주말 체크
if date.weekday() >= 5 or date in kr_holidays:
return 0, 0
# 초과 근무시간 계산
overtime = max(0, hours_worked - standard_hours)
return min(hours_worked, standard_hours), overtime
def save_work_hours(year, month, work_hours_data=None):
filename = f"work_hours_{year}_{month}.txt"
total_overtime = 0
today = datetime.date.today()
if work_hours_data is None:
work_hours_data = {}
# 해당 월의 모든 날짜에 대해 반복
for day in range(1, calendar.monthrange(year, month)[1] + 1):
date = datetime.date(year, month, day)
if date > today:
break
# 사용자로부터 근무시간 입력 받기
while True:
try:
hours_worked = float(input(f"{date} 근무시간을 입력하세요 (주말/공휴일은 0): "))
if hours_worked < 0:
raise ValueError
break
except ValueError:
print("올바른 숫자를 입력해주세요.")
regular, overtime = calculate_work_hours(date, hours_worked)
work_hours_data[date] = (regular, overtime)
with open(filename, 'w', encoding='utf-8') as f:
f.write("날짜,정규근무시간,초과근무시간\n")
for date, (regular, overtime) in work_hours_data.items():
f.write(f"{date},{regular},{overtime}\n")
total_overtime += overtime
print(f"{filename}에 저장되었습니다.")
return total_overtime
def load_work_hours(year, month):
filename = f"work_hours_{year}_{month}.txt"
work_hours_data = {}
try:
with open(filename, 'r', encoding='utf-8') as f:
next(f) # 헤더 줄 건너뛰기
for line in f:
date_str, regular_str, overtime_str = line.strip().split(',')
date = datetime.datetime.strptime(date_str, '%Y-%m-%d').date()
work_hours_data[date] = (float(regular_str), float(overtime_str))
return work_hours_data
except FileNotFoundError:
print("파일을 찾을 수 없습니다.")
return None
def modify_work_hours(year, month):
work_hours_data = load_work_hours(year, month)
if work_hours_data is None:
return
while True:
print("\n수정할 날짜를 입력하세요 (예: 2024-08-15)")
print("종료하려면 'q'를 입력하세요.")
date_input = input("날짜: ")
if date_input.lower() == 'q':
break
try:
date = datetime.datetime.strptime(date_input, '%Y-%m-%d').date()
if date not in work_hours_data:
print("해당 날짜의 근무 기록이 없습니다.")
continue
print(f"현재 근무시간: {sum(work_hours_data[date]):.2f}시간")
new_hours = float(input("새로운 근무시간을 입력하세요: "))
regular, overtime = calculate_work_hours(date, new_hours)
work_hours_data[date] = (regular, overtime)
print("근무시간이 수정되었습니다.")
except ValueError:
print("올바른 날짜 형식 또는 숫자를 입력해주세요.")
total_overtime = save_work_hours(year, month, work_hours_data)
print(f"총 초과근무시간: {total_overtime:.2f}시간")
def calculate_total_overtime(year, month):
work_hours_data = load_work_hours(year, month)
if work_hours_data is None:
return 0
total_overtime = sum(overtime for _, overtime in work_hours_data.values())
return total_overtime
def main():
while True:
print("\n1. 이번 달 근무시간 입력")
print("2. 저장된 근무시간 불러오기")
print("3. 근무시간 수정하기")
print("4. 이번 달 총 초과근무시간 계산")
print("5. 종료")
choice = input("선택하세요: ")
if choice == '1':
today = datetime.date.today()
total_overtime = save_work_hours(today.year, today.month)
print(f"현재까지의 총 초과근무시간: {total_overtime:.2f}시간")
elif choice == '2':
year = int(input("년도를 입력하세요: "))
month = int(input("월을 입력하세요: "))
work_hours_data = load_work_hours(year, month)
if work_hours_data:
for date, (regular, overtime) in work_hours_data.items():
print(f"{date}: 정규근무 {regular:.2f}시간, 초과근무 {overtime:.2f}시간")
elif choice == '3':
year = int(input("년도를 입력하세요: "))
month = int(input("월을 입력하세요: "))
modify_work_hours(year, month)
elif choice == '4':
today = datetime.date.today()
total_overtime = calculate_total_overtime(today.year, today.month)
print(f"이번 달 총 초과근무시간: {total_overtime:.2f}시간")
elif choice == '5':
break
else:
print("올바른 선택지를 입력해주세요.")
if __name__ == "__main__":
main()
'코딩연습' 카테고리의 다른 글
Visual Studio Code에서 Terminal 창 복사 copy 하는 방법 (0) | 2024.09.22 |
---|---|
[실습1] Python으로 간단한 계산기 프로그램 만들기 (0) | 2024.09.19 |
[실습준비][Part2] Visual Studio Code 설치 (1) | 2024.09.18 |
[실습준비][Part1] miniconda 설치 및 환경설정 (2) | 2024.09.18 |
[Python] PyInstaller 사용법 정리! (0) | 2024.07.27 |