From 4632dbe0b148ad63efab7ea57852140dadfdf76e Mon Sep 17 00:00:00 2001 From: LebedevVM <64705489+LebedevVM@users.noreply.github.com> Date: Wed, 22 May 2024 17:02:04 +0300 Subject: [PATCH 1/4] Add files via upload --- Main.java | 7 +++++++ Manager.java | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ Worker.java | 39 +++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 Main.java create mode 100644 Manager.java create mode 100644 Worker.java diff --git a/Main.java b/Main.java new file mode 100644 index 0000000..623c384 --- /dev/null +++ b/Main.java @@ -0,0 +1,7 @@ +public class Main { + public static void main(String[] args) { + Manager manager = new Manager(); + manager.readTroughFile(); + manager.checkImbalance(); + } +} \ No newline at end of file diff --git a/Manager.java b/Manager.java new file mode 100644 index 0000000..4055523 --- /dev/null +++ b/Manager.java @@ -0,0 +1,57 @@ +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 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(); + System.out.println(line); + plannedHours = Float.parseFloat(line); + + line = input.readLine(); + + System.out.println(line); + + 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(); + System.out.println(line); + } + } 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) {} + } +} \ No newline at end of file diff --git a/Worker.java b/Worker.java new file mode 100644 index 0000000..20f21df --- /dev/null +++ b/Worker.java @@ -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; + } +} From 9f78c54dcab03da38ebe185feb9992fc0537d68f Mon Sep 17 00:00:00 2001 From: LebedevVM <64705489+LebedevVM@users.noreply.github.com> Date: Wed, 22 May 2024 17:07:11 +0300 Subject: [PATCH 2/4] Update README.md --- README.md | 48 ++---------------------------------------------- 1 file changed, 2 insertions(+), 46 deletions(-) diff --git a/README.md b/README.md index 55fc8e7..e2f103f 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,4 @@ -# Тестовое задание для отбора на Летнюю ИТ-школу КРОК по разработке +Лебедев Вячеслав Михайлович -## Условие задания -Будучи сотрудником департамента внутренней автоматизации одной IT компании, вы занимаетесь разработкой и интеграцией различных решений с целью автоматизации различных внутренних бизнес процессов компании. Так, например, в свое время в вашем департаменте была разработана система учета проектных трудозатрат. +Программа написана на Java и состоит из трёх классов: Worker - класс, где хранится и обрабатывается информация о сотрудниках, Manager - класс, где происходит чтение и запись в файлы и класс Main - класс, необходимый для запуска программы. -Идеологически такая система содержит функциональность по вводу и работе со сведениями о проектах и, самое главное, управление фактическими трудозатратами – списаниями времени. Это значит, что при выполнении той или иной проектной задачи сотрудник фиксирует затраченное на решение задачи время в данной системе. В результате менеджмент проектов может оценивать потраченное время и, как следствие, деньги на реализацию проекта: по задачам, этапам и любому другому уровню детализации. - -Что еще важно знать о списаниях времени. У каждого сотрудника компании есть норма списания - количество времени, которое необходимо списывать за рабочий день. В общем случае (и в рамках задачи делаем допущение, что во всех случаях) такая норма составляет 8 часов в день. Однако сотрудники по тем или иным причинам могут списывать как больше 8 часов, так и меньше, в результате чего образуется дизбаланс. - -В первом случае можно говорить о том, что сотрудник перегружен или тратит на задачи больше времени, чем планируется, но, желая успеть в срок, задерживается на работе. Во втором случае причиной может быть как простой (отсутствие задач), так и недоработки со стороны самого сотрудника. - -Дизбаланс списаний стал серьезно волновать руководителей производственных департаментов, поэтому было принято решение на регулярной основе мониторить дизбаланс и принимать соответствующие меры. Однако за неимением такого отчета в системе, руководство департамента обратилось к вам с просьбой реализовать MVP подобного отчета. - -На текущий момент система управления содержит функцию выгрузки списаний “TSR-3” (присвоенный отчету код) за указанный период в следующем формате: - -"_ <Фамилия> <Имя> <Отчество> <Дата списания в формате 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. Ручной ввод пути к файлу через интерактивный режим (посредством клавиатурного ввода) недопустим. Также эксплуатация программы не должна подразумевать какие-либо изменения программного кода с целью указания пути к файлам. - -Примеры входного и выходного файлов приложены к настоящему техническому заданию. - -## Автор решения - -## Описание реализации - -## Инструкция по сборке и запуску решения From add2c6811df3da7b68fed29fb9bd452f007b7f24 Mon Sep 17 00:00:00 2001 From: LebedevVM <64705489+LebedevVM@users.noreply.github.com> Date: Wed, 22 May 2024 17:14:20 +0300 Subject: [PATCH 3/4] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index e2f103f..4e9f095 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,8 @@ Лебедев Вячеслав Михайлович Программа написана на Java и состоит из трёх классов: Worker - класс, где хранится и обрабатывается информация о сотрудниках, Manager - класс, где происходит чтение и запись в файлы и класс Main - класс, необходимый для запуска программы. +Сначала создаётся объект класса Manager, где получается доступ к текстовым файлам. +Затем работает метод readThroughFile, который считывает данные из файла report.txt и создаёт или обновляет объекты класса Worker. +В конце работает метод checImbalance, который проверяет объекты класса Worker на условие дизбаланса и записывает информацию в файл result.txt +Для запуска программы требуется откомпилировать файл Main.java и запустить его, в папке, где содержится файл report.txt From 9183caf32cca2d0cc9db4cd89a7ff7b3ddb60fe1 Mon Sep 17 00:00:00 2001 From: LebedevVM <64705489+LebedevVM@users.noreply.github.com> Date: Wed, 22 May 2024 17:14:49 +0300 Subject: [PATCH 4/4] Update Manager.java --- Manager.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Manager.java b/Manager.java index 4055523..781c71d 100644 --- a/Manager.java +++ b/Manager.java @@ -22,13 +22,10 @@ public Manager() { public void readTroughFile () { try { String line = input.readLine(); - System.out.println(line); plannedHours = Float.parseFloat(line); line = input.readLine(); - System.out.println(line); - while (line != null) { String[] args = line.split(" "); if (workerMap.containsKey(args[0])) { @@ -38,7 +35,6 @@ public void readTroughFile () { workerMap.put(args[0], new Worker(args[1], args[2], args[3], Float.parseFloat(args[5]))); } line = input.readLine(); - System.out.println(line); } } catch (Exception ignored) {} } @@ -54,4 +50,4 @@ public void checkImbalance () { output.close(); } catch (Exception ignored) {} } -} \ No newline at end of file +}