diff --git a/README.md b/README.md index 55fc8e7..5fcd002 100644 --- a/README.md +++ b/README.md @@ -41,8 +41,17 @@ a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.0 Примеры входного и выходного файлов приложены к настоящему техническому заданию. -## Автор решения - -## Описание реализации +## Автор - Сморчков Павел Максимович + +## Описание реализации: + Файл organization.py содержит класс employee с атрибутами для сотрудника + Файл main.py содержит несколько функций: + 1. import_file - открывает файл с данными для всех сотрудников и возвращает + недельную норму и всех сотрудников + 2. calc - подсчитывает всех кто выбивается из нормы на 10% и возвращает их + 3. output - сортирует всех кто выбивается из нормы согласно требованиям и + выводит всех в result.txt + 4. main - главная часть программы ## Инструкция по сборке и запуску решения + Положите файлы в необходимую папку и запустите main.py \ No newline at end of file diff --git a/__pycache__/organization.cpython-310.pyc b/__pycache__/organization.cpython-310.pyc new file mode 100644 index 0000000..2b53151 Binary files /dev/null and b/__pycache__/organization.cpython-310.pyc differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..a48b7a0 --- /dev/null +++ b/main.py @@ -0,0 +1,70 @@ +from organization import Employee + +def import_file(file_path): + try: + with open(file_path, 'r', encoding='utf-8') as file: + lines = file.readlines() + except FileNotFoundError: + print(f"Файл {filename} не найден.") + try: + week_norm = int(lines[0]) + except ValueError: + raise ValueError("Первая строка файла должна содержать числовое значение недельной нормы списания.") + + record = lines[1:] + employees = {} + + for str in record: + emp = str.strip().split() + if len(emp) != 6: + continue + id, s_name, f_name, m_name, date, hours_str = emp + hours = float(hours_str) + + if id not in employees: + employees[id] = Employee(id, s_name, f_name, m_name) + + employees[id].add_hours(date, hours) + return week_norm, employees + + +def calc(week_norm, employees): + + disbalance = week_norm * 0.1 + wrong = {} + + for emp in employees.values(): + total = emp.sum_hours() + if abs(total - week_norm) > disbalance: + wrong[emp.get_full_name()] = total - week_norm + return wrong + + +def output(wrong, file_path): + negative = {} + positive = {} + + for name, hours in wrong.items(): + if hours < 0: + negative[name] = hours + elif hours > 0: + positive[name] = hours + + with open(file_path, 'w', encoding='utf-8') as file: + for name in sorted(negative): + file.write(f"{name} {negative[name]}\n") + for name in sorted(positive): + file.write(f"{name} {positive[name]}\n") + + +def main(): + report = 'report.txt' + result = 'result.txt' + + week_norm, employees = import_file(report) + disbalance = calc(week_norm, employees) + output(disbalance, result) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/organization.py b/organization.py new file mode 100644 index 0000000..f64d2ed --- /dev/null +++ b/organization.py @@ -0,0 +1,33 @@ + + +class Employee: + def __init__(self, id, s_name, f_name, m_name): + self.id = id + self.f_name = f_name + self.m_name = m_name + self.s_name = s_name + self.hours = {} + """Инициализирует сотрудника: + id - айди сотрудника в компании + s_name - фамилия сотрудника + m_name - отчество сотрудника + f_name - имя сотрудника + hours - количество отработанных часов в неделю""" + + + + + def add_hours(self, date, hours): + """Добавялет количество часов в определенную дату""" + if date in self.hours: + self.hours[date] += hours + else: + self.hours[date] = hours + + def sum_hours(self): + """Возвращает количество отработанных часов в неделю""" + return sum(self.hours.values()) + + def get_full_name(self): + """Возвращает ФИО сотрудника в формате Фамилия И.О.""" + return f"{self.s_name} {self.f_name[0]}.{self.m_name[0]}." diff --git a/report.txt b/report.txt index da9c5ec..3cb291d 100644 --- a/report.txt +++ b/report.txt @@ -1,6 +1,6 @@ 24 a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 06.05.2024 8 -0f0ccd5e-cd46-462a-b92d-69a6ff147465 Петров Алексей Сергеевич 06.05.2024 6 +0f0ccd5e-cd46-462a-b92d-69a6ff147465 пупкин Алексей Сергеевич 06.05.2024 6 75cd02d8-6b1f-42fb-9c59-7db675b28a2d Сорокина Анна Павловна 06.05.2024 8.5 e5dbc47c-52f6-480a-876d-f97b17cb7cab Журавлева Елена Анатольевна 06.05.2024 9 e5dbc47c-52f6-480a-876d-f97b17cb7cab Журавлева Елена Анатольевна 07.05.2024 9 diff --git a/result.txt b/result.txt index a89365a..a7a202b 100644 --- a/result.txt +++ b/result.txt @@ -1,2 +1,2 @@ -Петров А.С. -3 -Журавлева Е.А. +4 +пупкин А.С. -3.0 +Журавлева Е.А. 4.0