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

Лебедев Вячеслав Решение на Java #28

Open
wants to merge 4 commits 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
7 changes: 7 additions & 0 deletions Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
public class Main {
public static void main(String[] args) {
Manager manager = new Manager();
manager.readTroughFile();
manager.checkImbalance();
}
}
53 changes: 53 additions & 0 deletions Manager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;

public class Manager {
private BufferedReader input;
private BufferedWriter output;

private float plannedHours;

private final Map<String, Worker> workerMap = new HashMap<>();

public Manager() {
try {
input = Files.newBufferedReader(Paths.get("report.txt"));
output = Files.newBufferedWriter(Paths.get("result.txt"));
} catch (Exception ignored) {}
}

public void readTroughFile () {
try {
String line = input.readLine();
plannedHours = Float.parseFloat(line);

line = input.readLine();

while (line != null) {
String[] args = line.split(" ");
if (workerMap.containsKey(args[0])) {
workerMap.get(args[0]).addHours(Float.parseFloat(args[5]));
}
else {
workerMap.put(args[0], new Worker(args[1], args[2], args[3], Float.parseFloat(args[5])));
}
line = input.readLine();
}
} catch (Exception ignored) {}
}

public void checkImbalance () {
try {
for (Worker worker : workerMap.values()) {
if (worker.checkImbalance(plannedHours)) {
output.write(worker.toString());
output.newLine();
}
}
output.close();
} catch (Exception ignored) {}
}
}
52 changes: 6 additions & 46 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,48 +1,8 @@
# Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке
Лебедев Вячеслав Михайлович

## Условие задания
Будучи сотрудником департамента внутренней автоматизации одной IT компании, вы занимаетесь разработкой и интеграцией различных решений с целью автоматизации различных внутренних бизнес процессов компании. Так, например, в свое время в вашем департаменте была разработана система учета проектных трудозатрат.
Программа написана на Java и состоит из трёх классов: Worker - класс, где хранится и обрабатывается информация о сотрудниках, Manager - класс, где происходит чтение и запись в файлы и класс Main - класс, необходимый для запуска программы.
Сначала создаётся объект класса Manager, где получается доступ к текстовым файлам.
Затем работает метод readThroughFile, который считывает данные из файла report.txt и создаёт или обновляет объекты класса Worker.
В конце работает метод checImbalance, который проверяет объекты класса Worker на условие дизбаланса и записывает информацию в файл result.txt

Идеологически такая система содержит функциональность по вводу и работе со сведениями о проектах и, самое главное, управление фактическими трудозатратами – списаниями времени. Это значит, что при выполнении той или иной проектной задачи сотрудник фиксирует затраченное на решение задачи время в данной системе. В результате менеджмент проектов может оценивать потраченное время и, как следствие, деньги на реализацию проекта: по задачам, этапам и любому другому уровню детализации.

Что еще важно знать о списаниях времени. У каждого сотрудника компании есть норма списания - количество времени, которое необходимо списывать за рабочий день. В общем случае (и в рамках задачи делаем допущение, что во всех случаях) такая норма составляет 8 часов в день. Однако сотрудники по тем или иным причинам могут списывать как больше 8 часов, так и меньше, в результате чего образуется дизбаланс.

В первом случае можно говорить о том, что сотрудник перегружен или тратит на задачи больше времени, чем планируется, но, желая успеть в срок, задерживается на работе. Во втором случае причиной может быть как простой (отсутствие задач), так и недоработки со стороны самого сотрудника.

Дизбаланс списаний стал серьезно волновать руководителей производственных департаментов, поэтому было принято решение на регулярной основе мониторить дизбаланс и принимать соответствующие меры. Однако за неимением такого отчета в системе, руководство департамента обратилось к вам с просьбой реализовать MVP подобного отчета.

На текущий момент система управления содержит функцию выгрузки списаний “TSR-3” (присвоенный отчету код) за указанный период в следующем формате:

"_<id сотрудника в формате UUID> <Фамилия> <Имя> <Отчество> <Дата списания в формате dd.MM.YYYY> <количество часов>_"

При этом стоит учесть, что количество списаний сотрудником не ограничивается. Так, например, файл может выглядеть следующим образом:
```
a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.05.2024 4
0f0ccd5e-cd46-462a-b92d-69a6ff147465 Петров Алексей Сергеевич 16.05.2024 6
a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.05.2024 2.5
0f0ccd5e-cd46-462a-b92d-69a6ff147465 Петров Алексей Сергеевич 16.05.2024 2
a30b4d51-11b4-49b2-b356-466e92a66df7 Иванов Иван Иванович 16.05.2024 1.5
```

По данному примеру видно, что оба сотрудника (Петров А.С. и Иванов И.И.) списали за 16 мая каждый по 8 часов, но, скорее всего, в разные задачи.

Вам же необходимо разработать программу для анализа дизбаланса, технические требования к разработке которой содержат следующее:
1. На вход программа для анализа получает файл со списаниями report.txt за конкретную рабочую неделю. О формате файла известно следующее:
- в первой строке файла указывается недельная норма списания на одного сотрудника (из расчета дневной нормы списания, равной 8 часам; например, 40 для пятидневной рабочей недели);
- во всех последующих строках файла указывается перечень списаний сотрудников в формате отчета “TSR-3”.
2. Программа определяет сотрудников, у которых дизбаланс списаний времени за неделю составляет более 10% в обе стороны;
3. Найденные сотрудники с дизбалансом по итогам работы программы записываются в текстовый файл result.txt в следующем виде:
"_<Фамилия И.О.> <количество часов, составляющих дизбаланс, с указанием знака>_".
Количество часов дизбаланса сопровождается знаками “+” и “–” в соответствии со следующими условиями:
- для часов, которые идут сверх нормы, ставится знак “+”;
- для часов, недостающих до нормы, ставится знак “–”.
4. В выходном файле сначала перечисляются сотрудники с отрицательным дизбалансом в алфавитном порядке, затем - сотрудники с положительным дизбалансом в алфавитном порядке.
5. Ручной ввод пути к файлу через интерактивный режим (посредством клавиатурного ввода) недопустим. Также эксплуатация программы не должна подразумевать какие-либо изменения программного кода с целью указания пути к файлам.

Примеры входного и выходного файлов приложены к настоящему техническому заданию.

## Автор решения

## Описание реализации

## Инструкция по сборке и запуску решения
Для запуска программы требуется откомпилировать файл Main.java и запустить его, в папке, где содержится файл report.txt
39 changes: 39 additions & 0 deletions Worker.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
public class Worker {
private final String fistName;
private final String lastName;
private final String surname;

private float hours;

public Worker(String fistName, String lastName, String surname, float hours) {
this.fistName = fistName;
this.lastName = lastName;
this.surname = surname;
this.hours = hours;
}

public void addHours (float hours) {
this.hours += hours;
}

public boolean checkImbalance (float plannedHours) {
hours -= plannedHours;

return Math.abs(hours) >= plannedHours * 0.1f;
}

public String toString () {
String answer = lastName + " " + fistName.charAt(0) + "." + surname.charAt(0) + ". ";

if (hours > 0) {
answer += "+";
}
else {
answer += "-";
}

answer += Math.abs(hours);

return answer;
}
}