Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Правки #18

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Binary file added __pycache__/organization.cpython-310.pyc
Binary file not shown.
70 changes: 70 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -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()
33 changes: 33 additions & 0 deletions organization.py
Original file line number Diff line number Diff line change
@@ -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]}."
2 changes: 1 addition & 1 deletion report.txt
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 2 additions & 2 deletions result.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
Петров А.С. -3
Журавлева Е.А. +4
пупкин А.С. -3.0
Журавлева Е.А. 4.0