코딩연습

근태시간계산

철인31호 2024. 8. 28. 08:13
반응형

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()

반응형